nv2a/vk: Finalize, simplify render passes

This commit is contained in:
Matt Borgerson 2024-07-26 17:21:01 -07:00 committed by mborgerson
parent e8a39d6f45
commit 7b37a94438
2 changed files with 32 additions and 32 deletions
hw/xbox/nv2a/pgraph/vk

View File

@ -196,12 +196,27 @@ static void finalize_clear_shaders(PGRAPHState *pg)
pgraph_vk_destroy_shader_module(r, r->solid_frag_module);
}
static void init_render_passes(PGRAPHVkState *r)
{
r->render_passes = g_array_new(false, false, sizeof(RenderPass));
}
static void finalize_render_passes(PGRAPHVkState *r)
{
for (int i = 0; i < r->render_passes->len; i++) {
RenderPass *p = &g_array_index(r->render_passes, RenderPass, i);
vkDestroyRenderPass(r->device, p->render_pass, NULL);
}
g_array_free(r->render_passes, true);
}
void pgraph_vk_init_pipelines(PGRAPHState *pg)
{
PGRAPHVkState *r = pg->vk_renderer_state;
init_pipeline_cache(pg);
init_clear_shaders(pg);
init_render_passes(r);
VkSemaphoreCreateInfo semaphore_info = {
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO
@ -222,6 +237,7 @@ void pgraph_vk_finalize_pipelines(PGRAPHState *pg)
finalize_clear_shaders(pg);
finalize_pipeline_cache(pg);
finalize_render_passes(r);
vkDestroyFence(r->device, r->command_buffer_fence, NULL);
vkDestroySemaphore(r->device, r->command_buffer_semaphore, NULL);
@ -238,12 +254,10 @@ static void init_render_pass_state(PGRAPHState *pg, RenderPassState *state)
VK_FORMAT_UNDEFINED;
}
static VkRenderPass create_render_pass(PGRAPHState *pg, RenderPassState *state)
static VkRenderPass create_render_pass(PGRAPHVkState *r, RenderPassState *state)
{
NV2A_VK_DPRINTF("Creating render pass");
PGRAPHVkState *r = pg->vk_renderer_state;
VkAttachmentDescription attachments[2];
int num_attachments = 0;
@ -328,36 +342,24 @@ static VkRenderPass create_render_pass(PGRAPHState *pg, RenderPassState *state)
return render_pass;
}
static VkRenderPass add_new_render_pass(PGRAPHState *pg, RenderPassState *state)
static VkRenderPass add_new_render_pass(PGRAPHVkState *r, RenderPassState *state)
{
PGRAPHVkState *r = pg->vk_renderer_state;
if (r->render_passes_index == r->render_passes_capacity) {
int n_blocks = r->render_passes_capacity;
r->render_passes_capacity = n_blocks ? (n_blocks * 2) : 256;
r->render_passes =
g_realloc_n(r->render_passes, r->render_passes_capacity,
sizeof(*r->render_passes));
}
RenderPass *rp = &r->render_passes[r->render_passes_index++];
memcpy(&rp->state, state, sizeof(*state));
rp->render_pass = create_render_pass(pg, state);
return rp->render_pass;
RenderPass new_pass;
memcpy(&new_pass.state, state, sizeof(*state));
new_pass.render_pass = create_render_pass(r, state);
g_array_append_vals(r->render_passes, &new_pass, 1);
return new_pass.render_pass;
}
static VkRenderPass get_render_pass(PGRAPHState *pg, RenderPassState *state)
static VkRenderPass get_render_pass(PGRAPHVkState *r, RenderPassState *state)
{
PGRAPHVkState *r = pg->vk_renderer_state;
for (int i = 0; i < r->render_passes_index; i++) {
if (!memcmp(&r->render_passes[i].state, state, sizeof(*state))) {
return r->render_passes[i].render_pass;
for (int i = 0; i < r->render_passes->len; i++) {
RenderPass *p = &g_array_index(r->render_passes, RenderPass, i);
if (!memcmp(&p->state, state, sizeof(*state))) {
return p->render_pass;
}
}
return add_new_render_pass(pg, state);
return add_new_render_pass(r, state);
}
static void create_frame_buffer(PGRAPHState *pg)
@ -580,7 +582,7 @@ static void create_clear_pipeline(PGRAPHState *pg)
.pColorBlendState = &color_blending,
.pDynamicState = &dynamic_state,
.layout = layout,
.renderPass = get_render_pass(pg, &key.render_pass_state),
.renderPass = get_render_pass(r, &key.render_pass_state),
.subpass = 0,
.basePipelineHandle = VK_NULL_HANDLE,
};
@ -1035,7 +1037,7 @@ static void create_pipeline(PGRAPHState *pg)
.pColorBlendState = &color_blending,
.pDynamicState = &dynamic_state,
.layout = layout,
.renderPass = get_render_pass(pg, &key.render_pass_state),
.renderPass = get_render_pass(r, &key.render_pass_state),
.subpass = 0,
.basePipelineHandle = VK_NULL_HANDLE,
};

View File

@ -303,9 +303,7 @@ typedef struct PGRAPHVkState {
bool framebuffer_dirty;
VkRenderPass render_pass;
RenderPass *render_passes;
int render_passes_index;
int render_passes_capacity;
GArray *render_passes; // RenderPass
bool in_render_pass;
bool in_draw;