radv: Set the window scissor to the render area, not framebuffer

With dynamic rendering, the concept of framebuffer dimensions goes away
so this won't make sense.  Even with render passes, the render area is
guaranteed to be inside the framebuffer so we may as well clip to the
potentially smaller render area.  This commit also moves window scissor
setup to CmdBeginRenderPass2() time.  This should be fine, even for meta
ops, as the only meta ops which happen inside a render pass need the
same render area as the render pass itself.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15587>
This commit is contained in:
Jason Ekstrand 2022-08-22 22:36:49 -05:00 committed by Marge Bot
parent bbb3749077
commit c7d0d328d5
1 changed files with 9 additions and 3 deletions

View File

@ -2642,7 +2642,6 @@ static void
radv_emit_framebuffer_state(struct radv_cmd_buffer *cmd_buffer)
{
int i;
struct vk_framebuffer *framebuffer = cmd_buffer->state.framebuffer;
const struct radv_subpass *subpass = cmd_buffer->state.subpass;
bool disable_constant_encode_ac01 = false;
unsigned color_invalid = cmd_buffer->device->physical_device->rad_info.gfx_level >= GFX11
@ -2762,8 +2761,6 @@ radv_emit_framebuffer_state(struct radv_cmd_buffer *cmd_buffer)
S_028040_NUM_SAMPLES(num_samples));
radeon_emit(cmd_buffer->cs, S_028044_FORMAT(V_028044_STENCIL_INVALID)); /* DB_STENCIL_INFO */
}
radeon_set_context_reg(cmd_buffer->cs, R_028208_PA_SC_WINDOW_SCISSOR_BR,
S_028208_BR_X(framebuffer->width) | S_028208_BR_Y(framebuffer->height));
if (cmd_buffer->device->physical_device->rad_info.gfx_level >= GFX8) {
bool disable_constant_encode =
@ -6232,6 +6229,15 @@ radv_CmdBeginRenderPass2(VkCommandBuffer commandBuffer,
if (result != VK_SUCCESS)
return;
radeon_set_context_reg(cmd_buffer->cs, R_028204_PA_SC_WINDOW_SCISSOR_TL,
S_028204_TL_X(cmd_buffer->state.render_area.offset.x) |
S_028204_TL_Y(cmd_buffer->state.render_area.offset.y));
radeon_set_context_reg(cmd_buffer->cs, R_028208_PA_SC_WINDOW_SCISSOR_BR,
S_028208_BR_X(cmd_buffer->state.render_area.offset.x +
cmd_buffer->state.render_area.extent.width) |
S_028208_BR_Y(cmd_buffer->state.render_area.offset.y +
cmd_buffer->state.render_area.extent.height));
radv_cmd_buffer_begin_subpass(cmd_buffer, 0);
}