mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-27 04:00:10 +01:00
dzn: Move all render-related states to a substruct
Reviewed-by: Jesse Natalie <jenatali@microsoft.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15913>
This commit is contained in:
parent
d3836df8d4
commit
70b06e775b
2 changed files with 42 additions and 33 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue