diff --git a/hw/xbox/nv2a/pgraph/vk/draw.c b/hw/xbox/nv2a/pgraph/vk/draw.c index 8ba1acfbca..0816835113 100644 --- a/hw/xbox/nv2a/pgraph/vk/draw.c +++ b/hw/xbox/nv2a/pgraph/vk/draw.c @@ -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, }; diff --git a/hw/xbox/nv2a/pgraph/vk/renderer.h b/hw/xbox/nv2a/pgraph/vk/renderer.h index b053909b81..c0a566c779 100644 --- a/hw/xbox/nv2a/pgraph/vk/renderer.h +++ b/hw/xbox/nv2a/pgraph/vk/renderer.h @@ -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;