[vulkan] Clean out old pipeline and layout refs

It's not perfect as some subsystems still create resources from the old
system (necessarily), but this cleans up a lot of the mess.
This commit is contained in:
Bill Currie 2023-06-24 11:47:01 +09:00
parent 5140346c22
commit 92368eafb2
18 changed files with 43 additions and 157 deletions

View file

@ -70,21 +70,10 @@ typedef enum {
QFV_aliasNumPasses
} QFV_AliasSubpass;
typedef struct aliasframe_s {
qfv_cmdbufferset_t cmdSet;
} aliasframe_t;
typedef struct aliasframeset_s
DARRAY_TYPE (aliasframe_t) aliasframeset_t;
typedef struct aliasindset_s
DARRAY_TYPE (unsigned) aliasindset_t;
typedef struct aliasctx_s {
aliasframeset_t frames;
VkPipeline depth;
VkPipeline gbuf;
VkPipelineLayout layout;
VkSampler sampler;
} aliasctx_t;

View file

@ -366,7 +366,6 @@ typedef struct bspctx_s {
bsp_pass_t main_pass; ///< camera view depth, gbuffer, etc
VkSampler sampler;
VkPipelineLayout layout;
VkDeviceMemory texture_memory;
VkPipeline depth;

View file

@ -39,7 +39,6 @@
#define COMPOSE_IMAGE_INFOS 1
typedef struct composeframe_s {
VkCommandBuffer cmd;
VkDescriptorImageInfo imageInfo[COMPOSE_IMAGE_INFOS];
VkWriteDescriptorSet descriptors[COMPOSE_IMAGE_INFOS];
} composeframe_t;
@ -49,8 +48,6 @@ typedef struct composeframeset_s
typedef struct composectx_s {
composeframeset_t frames;
VkPipeline pipeline;
VkPipelineLayout layout;
} composectx_t;
struct vulkan_ctx_s;

View file

@ -89,9 +89,6 @@ typedef struct iqmindset_s
typedef struct iqmctx_s {
iqm_frameset_t frames;
VkPipeline depth;
VkPipeline gbuf;
VkPipelineLayout layout;
VkSampler sampler;
VkDescriptorPool bones_pool;
VkDescriptorSetLayout bones_setLayout;

View file

@ -61,7 +61,6 @@ typedef struct qfv_light_buffer_s {
#define LIGHTING_DESCRIPTORS (LIGHTING_BUFFER_INFOS + LIGHTING_ATTACH_INFOS + 1)
typedef struct lightingframe_s {
VkCommandBuffer cmd;
VkBuffer light_buffer;
VkDescriptorBufferInfo bufferInfo[LIGHTING_BUFFER_INFOS];
VkDescriptorImageInfo attachInfo[LIGHTING_ATTACH_INFOS];
@ -108,8 +107,6 @@ typedef struct lightingctx_s {
VkRenderPass renderpass_4;
VkRenderPass renderpass_1;
VkCommandPool cmdpool;
struct lightingdata_s *ldata;
struct scene_s *scene;
} lightingctx_t;

View file

@ -48,7 +48,6 @@ typedef struct qfv_matrix_buffer_s {
} qfv_matrix_buffer_t;
typedef struct matrixframe_s {
//VkCommandBuffer cmd;
VkBuffer buffer;
VkDescriptorSet descriptors;
} matrixframe_t;
@ -58,8 +57,6 @@ typedef struct matrixframeset_s
typedef struct matrixctx_s {
matrixframeset_t frames;
VkPipeline pipeline;
VkPipelineLayout layout;
VkDeviceMemory memory;
qfv_matrix_buffer_t matrices;
int dirty;

View file

@ -35,7 +35,6 @@
#include "QF/Vulkan/command.h"
typedef struct outputframe_s {
VkCommandBuffer cmd;
VkImageView input;
VkDescriptorSet set;
} outputframe_t;
@ -45,12 +44,6 @@ typedef struct outputframeset_s
typedef struct outputctx_s {
outputframeset_t frames;
VkPipeline output;
VkPipeline waterwarp;
VkPipeline fisheye;
VkPipelineLayout output_layout;
VkPipelineLayout warp_layout;
VkPipelineLayout fish_layout;
VkSampler sampler;
VkImageView input;
VkFramebuffer *framebuffers; // one per swapchain image

View file

@ -37,7 +37,6 @@ typedef enum {
} QFV_ParticleSubpass;
typedef struct particleframe_s {
VkCommandBuffer compute;
VkEvent physicsEvent;
VkEvent updateEvent;
VkBuffer states;
@ -47,8 +46,6 @@ typedef struct particleframe_s {
VkDescriptorSet curDescriptors;
VkDescriptorSet inDescriptors;
VkDescriptorSet newDescriptors;
qfv_cmdbufferset_t cmdSet;
} particleframe_t;
typedef struct particleframeset_s
@ -56,18 +53,12 @@ typedef struct particleframeset_s
typedef struct particlectx_s {
particleframeset_t frames;
VkPipeline physics;
VkPipeline update;
VkPipeline draw;
struct qfv_resource_s *resources;
struct qfv_stagebuf_s *stage;
VkDescriptorPool pool;
VkDescriptorSetLayout setLayout;
VkPipelineLayout physics_layout;
VkPipelineLayout update_layout;
VkPipelineLayout draw_layout;
psystem_t *psystem;
} particlectx_t;

View file

@ -58,20 +58,9 @@ typedef enum {
QFV_spriteNumPasses
} QFV_SpriteSubpass;
typedef struct spriteframe_s {
qfv_cmdbufferset_t cmdSet;
} spriteframe_t;
typedef struct spriteframeset_s
DARRAY_TYPE (spriteframe_t) spriteframeset_t;
typedef struct spritectx_s {
spriteframeset_t frames;
VkPipeline depth;
VkPipeline gbuf;
VkDescriptorPool pool;
VkDescriptorSetLayout setLayout;
VkPipelineLayout layout;
unsigned maxImages;
VkSampler sampler;
} spritectx_t;

View file

@ -254,7 +254,7 @@ setLayouts = {
binding = 0;
descriptorType = uniform_buffer;
descriptorCount = 1;
stageFlags = vertex|geometry;
stageFlags = vertex|geometry|fragment;
},
);
};

View file

@ -64,11 +64,12 @@ static void
emit_commands (VkCommandBuffer cmd, int pose1, int pose2,
qfv_alias_skin_t *skin,
uint32_t numPC, qfv_push_constants_t *constants,
aliashdr_t *hdr, vulkan_ctx_t *ctx, entity_t ent)
aliashdr_t *hdr, qfv_taskctx_t *taskctx, entity_t ent)
{
qfv_device_t *device = ctx->device;
qfv_devfuncs_t *dfunc = device->funcs;
aliasctx_t *actx = ctx->alias_context;
auto ctx = taskctx->ctx;
auto device = ctx->device;
auto dfunc = device->funcs;
auto layout = taskctx->pipeline->layout;
__auto_type mesh = (qfv_alias_mesh_t *) ((byte *) hdr + hdr->commands);
@ -89,13 +90,13 @@ emit_commands (VkCommandBuffer cmd, int pose1, int pose2,
dfunc->vkCmdBindVertexBuffers (cmd, 0, bindingCount, buffers, offsets);
dfunc->vkCmdBindIndexBuffer (cmd, mesh->index_buffer, 0,
VK_INDEX_TYPE_UINT32);
QFV_PushConstants (device, cmd, actx->layout, numPC, constants);
QFV_PushConstants (device, cmd, layout, numPC, constants);
if (skin) {
VkDescriptorSet sets[] = {
skin->descriptor,
};
dfunc->vkCmdBindDescriptorSets (cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
actx->layout, 2, 1, sets, 0, 0);
layout, 2, 1, sets, 0, 0);
}
dfunc->vkCmdDrawIndexed (cmd, 3 * hdr->mdl.numtris, 1, 0, 0, 0);
@ -134,7 +135,6 @@ Vulkan_AliasRemoveSkin (vulkan_ctx_t *ctx, qfv_alias_skin_t *skin)
static void
alias_draw_ent (qfv_taskctx_t *taskctx, entity_t ent, bool pass)
{
auto ctx = taskctx->ctx;
renderer_t *renderer = Ent_GetComponent (ent.id, scene_renderer, ent.reg);
auto model = renderer->model;
aliashdr_t *hdr;
@ -187,7 +187,7 @@ alias_draw_ent (qfv_taskctx_t *taskctx, entity_t ent, bool pass)
emit_commands (taskctx->cmd, animation->pose1, animation->pose2,
pass ? skin : 0,
pass ? 5 : 2, push_constants,
hdr, ctx, ent);
hdr, taskctx, ent);
}
static void
@ -200,14 +200,14 @@ alias_draw (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
auto ctx = taskctx->ctx;
auto device = ctx->device;
auto dfunc = device->funcs;
auto actx = ctx->alias_context;
auto layout = taskctx->pipeline->layout;
auto cmd = taskctx->cmd;
VkDescriptorSet sets[] = {
Vulkan_Matrix_Descriptors (ctx, ctx->curFrame),
Vulkan_Palette_Descriptor (ctx),
};
dfunc->vkCmdBindDescriptorSets (cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
actx->layout, 0, 2, sets, 0, 0);
layout, 0, 2, sets, 0, 0);
auto queue = r_ent_queue; //FIXME fetch from scene
for (size_t i = 0; i < queue->ent_queues[mod_alias].size; i++) {
@ -246,13 +246,6 @@ Vulkan_Alias_Init (vulkan_ctx_t *ctx)
aliasctx_t *actx = calloc (1, sizeof (aliasctx_t));
ctx->alias_context = actx;
auto rctx = ctx->render_context;
size_t frames = rctx->frames.size;
DARRAY_INIT (&actx->frames, frames);
DARRAY_RESIZE (&actx->frames, frames);
actx->frames.grow = 0;
actx->layout = Vulkan_CreatePipelineLayout (ctx, "alias_layout");
actx->sampler = Vulkan_CreateSampler (ctx, "alias_sampler");
qfvPopDebug (ctx);
}
@ -260,12 +253,9 @@ Vulkan_Alias_Init (vulkan_ctx_t *ctx)
void
Vulkan_Alias_Shutdown (vulkan_ctx_t *ctx)
{
qfv_device_t *device = ctx->device;
qfv_devfuncs_t *dfunc = device->funcs;
//qfv_device_t *device = ctx->device;
//qfv_devfuncs_t *dfunc = device->funcs;
aliasctx_t *actx = ctx->alias_context;
dfunc->vkDestroyPipeline (device->dev, actx->depth, 0);
dfunc->vkDestroyPipeline (device->dev, actx->gbuf, 0);
free (actx->frames.a);
free (actx);
}

View file

@ -1472,7 +1472,6 @@ Vulkan_Bsp_Init (vulkan_ctx_t *ctx)
DARRAY_RESIZE (&bctx->frames, frames);
bctx->frames.grow = 0;
bctx->layout = Vulkan_CreatePipelineLayout (ctx, "quakebsp_layout");
bctx->sampler = Vulkan_CreateSampler (ctx, "quakebsp_sampler");
size_t entid_count = Vulkan_Scene_MaxEntities (ctx);

View file

@ -76,6 +76,7 @@ compose_draw (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
auto cctx = ctx->compose_context;
auto cframe = &cctx->frames.a[ctx->curFrame];
auto layout = taskctx->pipeline->layout;
auto cmd = taskctx->cmd;
auto fb = &taskctx->renderpass->framebuffer;
@ -88,7 +89,7 @@ compose_draw (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
Vulkan_Translucent_Descriptors (ctx, ctx->curFrame),
};
dfunc->vkCmdBindDescriptorSets (cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
cctx->layout, 0, 2, sets, 0, 0);
layout, 0, 2, sets, 0, 0);
dfunc->vkCmdDraw (cmd, 3, 1, 0, 0);
}
@ -119,10 +120,6 @@ Vulkan_Compose_Init (vulkan_ctx_t *ctx)
DARRAY_RESIZE (&cctx->frames, frames);
cctx->frames.grow = 0;
cctx->layout = Vulkan_CreatePipelineLayout (ctx, "compose_layout");
__auto_type cmdSet = QFV_AllocCommandBufferSet (1, alloca);
__auto_type attach = QFV_AllocDescriptorSetLayoutSet (frames, alloca);
for (size_t i = 0; i < frames; i++) {
attach->a[i] = Vulkan_CreateDescriptorSetLayout (ctx,
@ -136,11 +133,6 @@ Vulkan_Compose_Init (vulkan_ctx_t *ctx)
for (size_t i = 0; i < frames; i++) {
__auto_type cframe = &cctx->frames.a[i];
QFV_AllocateCommandBuffers (device, ctx->cmdpool, 1, cmdSet);
cframe->cmd = cmdSet->a[0];
QFV_duSetObjectName (device, VK_OBJECT_TYPE_COMMAND_BUFFER,
cframe->cmd, "cmd:compose");
for (int j = 0; j < COMPOSE_IMAGE_INFOS; j++) {
cframe->imageInfo[j] = base_image_info;
cframe->imageInfo[j].sampler = 0;
@ -157,11 +149,8 @@ Vulkan_Compose_Init (vulkan_ctx_t *ctx)
void
Vulkan_Compose_Shutdown (vulkan_ctx_t *ctx)
{
qfv_device_t *device = ctx->device;
qfv_devfuncs_t *dfunc = device->funcs;
composectx_t *cctx = ctx->compose_context;
dfunc->vkDestroyPipeline (device->dev, cctx->pipeline, 0);
free (cctx->frames.a);
free (cctx);
}

View file

@ -65,11 +65,12 @@ static void
emit_commands (VkCommandBuffer cmd, int pose1, int pose2,
qfv_iqm_skin_t *skins,
uint32_t numPC, qfv_push_constants_t *constants,
iqm_t *iqm, vulkan_ctx_t *ctx, entity_t ent)
iqm_t *iqm, qfv_taskctx_t *taskctx, entity_t ent)
{
auto ctx = taskctx->ctx;
auto device = ctx->device;
auto dfunc = device->funcs;
auto ictx = ctx->iqm_context;
auto layout = taskctx->pipeline->layout;
auto mesh = (qfv_iqm_t *) iqm->extra_data;
@ -85,7 +86,7 @@ emit_commands (VkCommandBuffer cmd, int pose1, int pose2,
dfunc->vkCmdBindVertexBuffers (cmd, 0, bindingCount, buffers, offsets);
dfunc->vkCmdBindIndexBuffer (cmd, mesh->index_buffer, 0,
VK_INDEX_TYPE_UINT16);
QFV_PushConstants (device, cmd, ictx->layout, numPC, constants);
QFV_PushConstants (device, cmd, layout, numPC, constants);
for (int i = 0; i < iqm->num_meshes; i++) {
if (skins) {
VkDescriptorSet sets[] = {
@ -94,14 +95,14 @@ emit_commands (VkCommandBuffer cmd, int pose1, int pose2,
};
dfunc->vkCmdBindDescriptorSets (cmd,
VK_PIPELINE_BIND_POINT_GRAPHICS,
ictx->layout, 1, 2, sets, 0, 0);
layout, 1, 2, sets, 0, 0);
} else {
VkDescriptorSet sets[] = {
mesh->bones_descriptors[ctx->curFrame],
};
dfunc->vkCmdBindDescriptorSets (cmd,
VK_PIPELINE_BIND_POINT_GRAPHICS,
ictx->layout, 2, 1, sets, 0, 0);
layout, 2, 1, sets, 0, 0);
}
dfunc->vkCmdDrawIndexed (cmd, 3 * iqm->meshes[i].num_triangles, 1,
3 * iqm->meshes[i].first_triangle, 0, 0);
@ -260,7 +261,7 @@ iqm_draw_ent (qfv_taskctx_t *taskctx, entity_t ent, bool pass)
emit_commands (taskctx->cmd, animation->pose1, animation->pose2,
pass ? skins : 0,
pass ? 6 : 2, push_constants,
iqm, ctx, ent);
iqm, taskctx, ent);
}
static void
@ -272,14 +273,14 @@ iqm_draw (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
auto ctx = taskctx->ctx;
auto device = ctx->device;
auto dfunc = device->funcs;
auto ictx = ctx->iqm_context;
auto layout = taskctx->pipeline->layout;
auto cmd = taskctx->cmd;
VkDescriptorSet sets[] = {
Vulkan_Matrix_Descriptors (ctx, ctx->curFrame),
};
dfunc->vkCmdBindDescriptorSets (cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
ictx->layout, 0, 1, sets, 0, 0);
layout, 0, 1, sets, 0, 0);
auto queue = r_ent_queue; //FIXME fetch from scene
for (size_t i = 0; i < queue->ent_queues[mod_iqm].size; i++) {
@ -315,7 +316,6 @@ Vulkan_IQM_Init (vulkan_ctx_t *ctx)
DARRAY_RESIZE (&ictx->frames, frames);
ictx->frames.grow = 0;
ictx->layout = Vulkan_CreatePipelineLayout (ctx, "iqm_layout");
ictx->sampler = Vulkan_CreateSampler (ctx, "alias_sampler");
ictx->bones_pool = Vulkan_CreateDescriptorPool (ctx, "bone_pool");
@ -327,12 +327,8 @@ Vulkan_IQM_Init (vulkan_ctx_t *ctx)
void
Vulkan_IQM_Shutdown (vulkan_ctx_t *ctx)
{
qfv_device_t *device = ctx->device;
qfv_devfuncs_t *dfunc = device->funcs;
iqmctx_t *ictx = ctx->iqm_context;
dfunc->vkDestroyPipeline (device->dev, ictx->depth, 0);
dfunc->vkDestroyPipeline (device->dev, ictx->gbuf, 0);
free (ictx->frames.a);
free (ictx);
}

View file

@ -318,8 +318,6 @@ Vulkan_Lighting_Init (vulkan_ctx_t *ctx)
rp_cfg = PL_ObjectForKey (rp_def, "renderpass_1");
lctx->renderpass_1 = QFV_ParseRenderPass (ctx, rp_cfg, rp_def);
#endif
lctx->cmdpool = QFV_CreateCommandPool (device, device->queue.queueFamily,
1, 1);
DARRAY_INIT (&lctx->light_mats, 16);
DARRAY_INIT (&lctx->light_images, 16);
@ -354,8 +352,6 @@ Vulkan_Lighting_Init (vulkan_ctx_t *ctx)
lctx->light_memory, "memory:lighting");
__auto_type cmdSet = QFV_AllocCommandBufferSet (1, alloca);
__auto_type attach = QFV_AllocDescriptorSetLayoutSet (frames, alloca);
__auto_type lights = QFV_AllocDescriptorSetLayoutSet (frames, alloca);
__auto_type shadow = QFV_AllocDescriptorSetLayoutSet (frames, alloca);
@ -394,16 +390,11 @@ Vulkan_Lighting_Init (vulkan_ctx_t *ctx)
shadow_set->a[i],
va (ctx->va_ctx, "lighting:shadow_set:%zd", i));
QFV_AllocateCommandBuffers (device, ctx->cmdpool, 1, cmdSet);
lframe->cmd = cmdSet->a[0];
lframe->light_buffer = lbuffers->a[i];
QFV_BindBufferMemory (device, lbuffers->a[i], lctx->light_memory,
light_offset);
light_offset += light_size;
QFV_duSetObjectName (device, VK_OBJECT_TYPE_COMMAND_BUFFER,
lframe->cmd, "cmd:lighting");
for (int j = 0; j < LIGHTING_BUFFER_INFOS; j++) {
lframe->bufferInfo[j] = base_buffer_info;
lframe->bufferWrite[j] = base_buffer_write;
@ -466,7 +457,6 @@ Vulkan_Lighting_Shutdown (vulkan_ctx_t *ctx)
clear_shadows (ctx);
dfunc->vkDestroyCommandPool (device->dev, lctx->cmdpool, 0);
dfunc->vkDestroyRenderPass (device->dev, lctx->renderpass_6, 0);
dfunc->vkDestroyRenderPass (device->dev, lctx->renderpass_4, 0);
dfunc->vkDestroyRenderPass (device->dev, lctx->renderpass_1, 0);

View file

@ -171,9 +171,9 @@ output_draw (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
auto dfunc = device->funcs;
auto octx = ctx->output_context;
auto oframe = &octx->frames.a[ctx->curFrame];
auto layout = taskctx->pipeline->layout;
auto cmd = taskctx->cmd;
auto layout = octx->output_layout;
//__auto_type pipeline = octx->output;
//if (scr_fisheye) {
// pipeline = octx->fisheye;
@ -255,9 +255,6 @@ Vulkan_Output_Init (vulkan_ctx_t *ctx)
__auto_type pld = ctx->script_context->pipelineDef;//FIXME
ctx->script_context->pipelineDef = Vulkan_GetConfig (ctx, "qf_output");
octx->output_layout = Vulkan_CreatePipelineLayout (ctx, "output_layout");
octx->warp_layout = Vulkan_CreatePipelineLayout (ctx, "waterwarp_layout");
octx->fish_layout = Vulkan_CreatePipelineLayout (ctx, "fisheye_layout");
octx->sampler = Vulkan_CreateSampler (ctx, "linear");
__auto_type layouts = QFV_AllocDescriptorSetLayoutSet (frames, alloca);
@ -276,9 +273,6 @@ Vulkan_Output_Init (vulkan_ctx_t *ctx)
oframe->set = sets->a[i];
QFV_AllocateCommandBuffers (device, ctx->cmdpool, 1, cmdSet);
oframe->cmd = cmdSet->a[0];
QFV_duSetObjectName (device, VK_OBJECT_TYPE_COMMAND_BUFFER,
oframe->cmd, "cmd:output");
}
ctx->script_context->pipelineDef = pld;
@ -303,9 +297,6 @@ Vulkan_Output_Shutdown (vulkan_ctx_t *ctx)
auto rp = &render->renderpasses[0];
rp->beginInfo.framebuffer = 0;
dfunc->vkDestroyPipeline (device->dev, octx->output, 0);
dfunc->vkDestroyPipeline (device->dev, octx->waterwarp, 0);
dfunc->vkDestroyPipeline (device->dev, octx->fisheye, 0);
free (octx->frames.a);
free (octx);
}

View file

@ -168,6 +168,7 @@ particles_draw (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
auto dfunc = device->funcs;
auto pctx = ctx->particle_context;
auto pframe = &pctx->frames.a[ctx->curFrame];
auto layout = taskctx->pipeline->layout;
auto cmd = taskctx->cmd;
VkDescriptorSet sets[] = {
@ -176,14 +177,14 @@ particles_draw (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
Vulkan_Translucent_Descriptors (ctx, ctx->curFrame),
};
dfunc->vkCmdBindDescriptorSets (cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
pctx->draw_layout, 0, 3, sets, 0, 0);
layout, 0, 3, sets, 0, 0);
mat4f_t mat;
mat4fidentity (mat);
qfv_push_constants_t push_constants[] = {
{ VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof (mat4f_t), &mat },
};
QFV_PushConstants (device, cmd, pctx->draw_layout, 1, push_constants);
QFV_PushConstants (device, cmd, layout, 1, push_constants);
VkDeviceSize offsets[] = { 0 };
VkBuffer buffers[] = {
pframe->states,
@ -202,6 +203,7 @@ update_particles (const exprval_t **p, exprval_t *result, exprctx_t *ectx)
auto dfunc = device->funcs;
auto pctx = ctx->particle_context;
auto pframe = &pctx->frames.a[ctx->curFrame];
auto layout = taskctx->pipeline->layout;
qfv_packet_t *packet = QFV_PacketAcquire (pctx->stage);
@ -281,7 +283,7 @@ update_particles (const exprval_t **p, exprval_t *result, exprctx_t *ectx)
pframe->newDescriptors,
};
dfunc->vkCmdBindDescriptorSets (packet->cmd, VK_PIPELINE_BIND_POINT_COMPUTE,
pctx->update_layout, 0, 3, set, 0, 0);
layout, 0, 3, set, 0, 0);
dfunc->vkCmdDispatch (packet->cmd, 1, 1, 1);
dfunc->vkCmdSetEvent (packet->cmd, pframe->updateEvent,
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT);
@ -335,6 +337,7 @@ particle_physics (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
auto dfunc = device->funcs;
auto pctx = ctx->particle_context;
auto pframe = &pctx->frames.a[ctx->curFrame];
auto layout = taskctx->pipeline->layout;
auto cmd = taskctx->cmd;
dfunc->vkResetEvent (device->dev, pframe->physicsEvent);
@ -345,7 +348,7 @@ particle_physics (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
pframe->curDescriptors,
};
dfunc->vkCmdBindDescriptorSets (cmd, VK_PIPELINE_BIND_POINT_COMPUTE,
pctx->physics_layout, 0, 1, set, 0, 0);
layout, 0, 1, set, 0, 0);
particle_push_constants_t constants = {
.gravity = pctx->psystem->gravity,
@ -359,7 +362,7 @@ particle_physics (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
field_offset (particle_push_constants_t, dT),
sizeof (float), &constants.dT },
};
QFV_PushConstants (device, cmd, pctx->physics_layout, 2, push_constants);
QFV_PushConstants (device, cmd, layout, 2, push_constants);
dfunc->vkCmdDispatch (cmd, MaxParticles, 1, 1);
dfunc->vkCmdSetEvent (cmd, pframe->physicsEvent,
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT);
@ -435,12 +438,6 @@ Vulkan_Particles_Init (vulkan_ctx_t *ctx)
DARRAY_RESIZE (&pctx->frames, frames);
pctx->frames.grow = 0;
pctx->physics_layout = Vulkan_CreatePipelineLayout (ctx,
"partphysics_layout");
pctx->update_layout = Vulkan_CreatePipelineLayout (ctx,
"partupdate_layout");
pctx->draw_layout = Vulkan_CreatePipelineLayout (ctx, "partdraw_layout");
pctx->pool = Vulkan_CreateDescriptorPool (ctx, "particle_pool");
pctx->setLayout = Vulkan_CreateDescriptorSetLayout (ctx, "particle_set");
@ -490,9 +487,6 @@ Vulkan_Particles_Shutdown (vulkan_ctx_t *ctx)
QFV_DestroyResource (device, pctx->resources);
free (pctx->resources);
dfunc->vkDestroyPipeline (device->dev, pctx->physics, 0);
dfunc->vkDestroyPipeline (device->dev, pctx->update, 0);
dfunc->vkDestroyPipeline (device->dev, pctx->draw, 0);
free (pctx->frames.a);
free (pctx);
}

View file

@ -70,20 +70,21 @@
static void
emit_commands (VkCommandBuffer cmd, qfv_sprite_t *sprite,
int numPC, qfv_push_constants_t *constants,
vulkan_ctx_t *ctx, entity_t ent)
qfv_taskctx_t *taskctx, entity_t ent)
{
qfv_device_t *device = ctx->device;
qfv_devfuncs_t *dfunc = device->funcs;
spritectx_t *sctx = ctx->sprite_context;
auto ctx = taskctx->ctx;
auto device = ctx->device;
auto dfunc = device->funcs;
auto layout = taskctx->pipeline->layout;
Vulkan_BeginEntityLabel (ctx, cmd, ent);
QFV_PushConstants (device, cmd, sctx->layout, numPC, constants);
QFV_PushConstants (device, cmd, layout, numPC, constants);
VkDescriptorSet sets[] = {
sprite->descriptors,
};
dfunc->vkCmdBindDescriptorSets (cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
sctx->layout, 1, 1, sets, 0, 0);
layout, 1, 1, sets, 0, 0);
dfunc->vkCmdDraw (cmd, 4, 1, 0, 0);
QFV_CmdEndLabel (device, cmd);
@ -157,7 +158,6 @@ Vulkan_Sprint_FreeDescriptors (vulkan_ctx_t *ctx, qfv_sprite_t *sprite)
static void
sprite_draw_ent (qfv_taskctx_t *taskctx, entity_t ent)
{
auto ctx = taskctx->ctx;
renderer_t *renderer = Ent_GetComponent (ent.id, scene_renderer, ent.reg);
auto model = renderer->model;
msprite_t *sprite = model->cache.data;
@ -183,7 +183,7 @@ sprite_draw_ent (qfv_taskctx_t *taskctx, entity_t ent)
emit_commands (taskctx->cmd,
(qfv_sprite_t *) ((byte *) sprite + sprite->data),
2, push_constants, ctx, ent);
2, push_constants, taskctx, ent);
}
static void
@ -193,14 +193,14 @@ sprite_draw (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
auto ctx = taskctx->ctx;
auto device = ctx->device;
auto dfunc = device->funcs;
auto sctx = ctx->sprite_context;
auto layout = taskctx->pipeline->layout;
auto cmd = taskctx->cmd;
VkDescriptorSet sets[] = {
Vulkan_Matrix_Descriptors (ctx, ctx->curFrame),
};
dfunc->vkCmdBindDescriptorSets (cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
sctx->layout, 0, 1, sets, 0, 0);
layout, 0, 1, sets, 0, 0);
auto queue = r_ent_queue; //FIXME fetch from scene
for (size_t i = 0; i < queue->ent_queues[mod_sprite].size; i++) {
@ -227,13 +227,6 @@ Vulkan_Sprite_Init (vulkan_ctx_t *ctx)
spritectx_t *sctx = calloc (1, sizeof (spritectx_t));
ctx->sprite_context = sctx;
auto rctx = ctx->render_context;
size_t frames = rctx->frames.size;
DARRAY_INIT (&sctx->frames, frames);
DARRAY_RESIZE (&sctx->frames, frames);
sctx->frames.grow = 0;
sctx->layout = Vulkan_CreatePipelineLayout (ctx, "sprite_layout");
sctx->sampler = Vulkan_CreateSampler (ctx, "sprite_sampler");
sctx->pool = Vulkan_CreateDescriptorPool (ctx, "sprite_pool");
@ -245,12 +238,7 @@ Vulkan_Sprite_Init (vulkan_ctx_t *ctx)
void
Vulkan_Sprite_Shutdown (vulkan_ctx_t *ctx)
{
qfv_device_t *device = ctx->device;
qfv_devfuncs_t *dfunc = device->funcs;
spritectx_t *sctx = ctx->sprite_context;
dfunc->vkDestroyPipeline (device->dev, sctx->depth, 0);
dfunc->vkDestroyPipeline (device->dev, sctx->gbuf, 0);
free (sctx->frames.a);
free (sctx);
}