From 70b06e775b58f9e44ba8c347a6b62c04ff8e7c31 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Wed, 20 Apr 2022 01:36:10 -0700 Subject: [PATCH] dzn: Move all render-related states to a substruct Reviewed-by: Jesse Natalie Part-of: --- src/microsoft/vulkan/dzn_cmd_buffer.c | 65 +++++++++++++++------------ src/microsoft/vulkan/dzn_private.h | 10 +++-- 2 files changed, 42 insertions(+), 33 deletions(-) diff --git a/src/microsoft/vulkan/dzn_cmd_buffer.c b/src/microsoft/vulkan/dzn_cmd_buffer.c index 3519e6a28b2..c7883da1c27 100644 --- a/src/microsoft/vulkan/dzn_cmd_buffer.c +++ b/src/microsoft/vulkan/dzn_cmd_buffer.c @@ -2107,8 +2107,9 @@ dzn_cmd_buffer_clear_attachments(struct dzn_cmd_buffer *cmdbuf, uint32_t rect_count, const VkClearRect *rects) { - struct dzn_render_pass *pass = cmdbuf->state.pass; - const struct dzn_subpass *subpass = &pass->subpasses[cmdbuf->state.subpass]; + struct dzn_render_pass *pass = cmdbuf->state.render.pass; + const struct dzn_subpass *subpass = + &pass->subpasses[cmdbuf->state.render.subpass]; for (unsigned i = 0; i < attachment_count; i++) { uint32_t idx; @@ -2120,7 +2121,8 @@ dzn_cmd_buffer_clear_attachments(struct dzn_cmd_buffer *cmdbuf, if (idx == VK_ATTACHMENT_UNUSED) continue; - struct dzn_image_view *view = cmdbuf->state.framebuffer->attachments[idx]; + struct dzn_image_view *view = + cmdbuf->state.render.framebuffer->attachments[idx]; for (uint32_t j = 0; j < rect_count; j++) { D3D12_RECT rect; @@ -2140,7 +2142,8 @@ static void dzn_cmd_buffer_attachment_ref_transition(struct dzn_cmd_buffer *cmdbuf, const struct dzn_attachment_ref *att) { - const struct dzn_image_view *iview = cmdbuf->state.framebuffer->attachments[att->idx]; + const struct dzn_image_view *iview = + cmdbuf->state.render.framebuffer->attachments[att->idx]; const struct dzn_image *image = container_of(iview->vk.image, struct dzn_image, vk); if (att->before == att->during) @@ -2180,7 +2183,8 @@ static void dzn_cmd_buffer_attachment_transition(struct dzn_cmd_buffer *cmdbuf, const struct dzn_attachment *att) { - const struct dzn_image_view *iview = cmdbuf->state.framebuffer->attachments[att->idx]; + const struct dzn_image_view *iview = + cmdbuf->state.render.framebuffer->attachments[att->idx]; const struct dzn_image *image = container_of(iview->vk.image, struct dzn_image, vk); if (att->last == att->after) @@ -2220,12 +2224,12 @@ static void dzn_cmd_buffer_resolve_attachment(struct dzn_cmd_buffer *cmdbuf, uint32_t i) { const struct dzn_subpass *subpass = - &cmdbuf->state.pass->subpasses[cmdbuf->state.subpass]; + &cmdbuf->state.render.pass->subpasses[cmdbuf->state.render.subpass]; if (subpass->resolve[i].idx == VK_ATTACHMENT_UNUSED) return; - const struct dzn_framebuffer *framebuffer = cmdbuf->state.framebuffer; + const struct dzn_framebuffer *framebuffer = cmdbuf->state.render.framebuffer; struct dzn_image_view *src = framebuffer->attachments[subpass->colors[i].idx]; struct dzn_image *src_img = container_of(src->vk.image, struct dzn_image, vk); struct dzn_image_view *dst = framebuffer->attachments[subpass->resolve[i].idx]; @@ -2277,9 +2281,10 @@ dzn_cmd_buffer_resolve_attachment(struct dzn_cmd_buffer *cmdbuf, uint32_t i) static void dzn_cmd_buffer_begin_subpass(struct dzn_cmd_buffer *cmdbuf) { - struct dzn_framebuffer *framebuffer = cmdbuf->state.framebuffer; - struct dzn_render_pass *pass = cmdbuf->state.pass; - const struct dzn_subpass *subpass = &pass->subpasses[cmdbuf->state.subpass]; + struct dzn_framebuffer *framebuffer = cmdbuf->state.render.framebuffer; + struct dzn_render_pass *pass = cmdbuf->state.render.pass; + const struct dzn_subpass *subpass = + &pass->subpasses[cmdbuf->state.render.subpass]; D3D12_CPU_DESCRIPTOR_HANDLE rt_handles[MAX_RTS] = { 0 }; D3D12_CPU_DESCRIPTOR_HANDLE zs_handle = { 0 }; @@ -2316,7 +2321,8 @@ dzn_cmd_buffer_begin_subpass(struct dzn_cmd_buffer *cmdbuf) static void dzn_cmd_buffer_end_subpass(struct dzn_cmd_buffer *cmdbuf) { - const struct dzn_subpass *subpass = &cmdbuf->state.pass->subpasses[cmdbuf->state.subpass]; + const struct dzn_subpass *subpass = + &cmdbuf->state.render.pass->subpasses[cmdbuf->state.render.subpass]; for (uint32_t i = 0; i < subpass->color_count; i++) dzn_cmd_buffer_resolve_attachment(cmdbuf, i); @@ -2496,7 +2502,7 @@ dzn_cmd_buffer_update_scissors(struct dzn_cmd_buffer *cmdbuf) if (!pipeline->scissor.count) { /* Apply a scissor delimiting the render area. */ - ID3D12GraphicsCommandList1_RSSetScissorRects(cmdbuf->cmdlist, 1, &cmdbuf->state.render_area); + ID3D12GraphicsCommandList1_RSSetScissorRects(cmdbuf->cmdlist, 1, &cmdbuf->state.render.area); return; } @@ -2505,10 +2511,10 @@ dzn_cmd_buffer_update_scissors(struct dzn_cmd_buffer *cmdbuf) memcpy(scissors, cmdbuf->state.scissors, sizeof(D3D12_RECT) * pipeline->scissor.count); for (uint32_t i = 0; i < pipeline->scissor.count; i++) { - scissors[i].left = MAX2(scissors[i].left, cmdbuf->state.render_area.left); - scissors[i].top = MAX2(scissors[i].top, cmdbuf->state.render_area.top); - scissors[i].right = MIN2(scissors[i].right, cmdbuf->state.render_area.right); - scissors[i].bottom = MIN2(scissors[i].bottom, cmdbuf->state.render_area.bottom); + scissors[i].left = MAX2(scissors[i].left, cmdbuf->state.render.area.left); + scissors[i].top = MAX2(scissors[i].top, cmdbuf->state.render.area.top); + scissors[i].right = MIN2(scissors[i].right, cmdbuf->state.render.area.right); + scissors[i].bottom = MIN2(scissors[i].bottom, cmdbuf->state.render.area.bottom); } ID3D12GraphicsCommandList1_RSSetScissorRects(cmdbuf->cmdlist, pipeline->scissor.count, scissors); @@ -3427,8 +3433,8 @@ dzn_CmdBeginRenderPass2(VkCommandBuffer commandBuffer, assert(pass->attachment_count == framebuffer->attachment_count); - cmdbuf->state.framebuffer = framebuffer; - cmdbuf->state.render_area = (D3D12_RECT) { + cmdbuf->state.render.framebuffer = framebuffer; + cmdbuf->state.render.area = (D3D12_RECT) { .left = pRenderPassBeginInfo->renderArea.offset.x, .top = pRenderPassBeginInfo->renderArea.offset.y, .right = (LONG)(pRenderPassBeginInfo->renderArea.offset.x + pRenderPassBeginInfo->renderArea.extent.width), @@ -3437,8 +3443,8 @@ dzn_CmdBeginRenderPass2(VkCommandBuffer commandBuffer, // The render area has an impact on the scissor state. cmdbuf->state.dirty |= DZN_CMD_DIRTY_SCISSORS; - cmdbuf->state.pass = pass; - cmdbuf->state.subpass = 0; + cmdbuf->state.render.pass = pass; + cmdbuf->state.render.subpass = 0; dzn_cmd_buffer_begin_subpass(cmdbuf); uint32_t clear_count = @@ -3455,10 +3461,11 @@ dzn_CmdBeginRenderPass2(VkCommandBuffer commandBuffer, aspectMask |= VK_IMAGE_ASPECT_COLOR_BIT; } - struct dzn_image_view *view = cmdbuf->state.framebuffer->attachments[i]; + struct dzn_image_view *view = + cmdbuf->state.render.framebuffer->attachments[i]; dzn_cmd_buffer_clear_attachment(cmdbuf, view, &pRenderPassBeginInfo->pClearValues[i], - aspectMask, 0, ~0, 1, &cmdbuf->state.render_area); + aspectMask, 0, ~0, 1, &cmdbuf->state.render.area); } } @@ -3470,12 +3477,12 @@ dzn_CmdEndRenderPass2(VkCommandBuffer commandBuffer, dzn_cmd_buffer_end_subpass(cmdbuf); - for (uint32_t i = 0; i < cmdbuf->state.pass->attachment_count; i++) - dzn_cmd_buffer_attachment_transition(cmdbuf, &cmdbuf->state.pass->attachments[i]); + for (uint32_t i = 0; i < cmdbuf->state.render.pass->attachment_count; i++) + dzn_cmd_buffer_attachment_transition(cmdbuf, &cmdbuf->state.render.pass->attachments[i]); - cmdbuf->state.framebuffer = NULL; - cmdbuf->state.pass = NULL; - cmdbuf->state.subpass = 0; + cmdbuf->state.render.framebuffer = NULL; + cmdbuf->state.render.pass = NULL; + cmdbuf->state.render.subpass = 0; } VKAPI_ATTR void VKAPI_CALL @@ -3486,8 +3493,8 @@ dzn_CmdNextSubpass2(VkCommandBuffer commandBuffer, VK_FROM_HANDLE(dzn_cmd_buffer, cmdbuf, commandBuffer); dzn_cmd_buffer_end_subpass(cmdbuf); - assert(cmdbuf->state.subpass + 1 < cmdbuf->state.pass->subpass_count); - cmdbuf->state.subpass++; + assert(cmdbuf->state.render.subpass + 1 < cmdbuf->state.render.pass->subpass_count); + cmdbuf->state.render.subpass++; dzn_cmd_buffer_begin_subpass(cmdbuf); } diff --git a/src/microsoft/vulkan/dzn_private.h b/src/microsoft/vulkan/dzn_private.h index 4437c282a5a..2ed97056639 100644 --- a/src/microsoft/vulkan/dzn_private.h +++ b/src/microsoft/vulkan/dzn_private.h @@ -459,11 +459,14 @@ struct dzn_cmd_buffer_push_constant_state { }; struct dzn_cmd_buffer_state { - struct dzn_framebuffer *framebuffer; - D3D12_RECT render_area; const struct dzn_pipeline *pipeline; struct dzn_descriptor_heap *heaps[NUM_POOL_TYPES]; - struct dzn_render_pass *pass; + struct { + D3D12_RECT area; + struct dzn_render_pass *pass; + uint32_t subpass; + struct dzn_framebuffer *framebuffer; + } render; struct { BITSET_DECLARE(dirty, MAX_VBS); D3D12_VERTEX_BUFFER_VIEW views[MAX_VBS]; @@ -487,7 +490,6 @@ struct dzn_cmd_buffer_state { struct dzn_cmd_buffer_push_constant_state gfx, compute; } push_constant; uint32_t dirty; - uint32_t subpass; struct { struct dzn_pipeline *pipeline; struct dzn_descriptor_state desc_state;