OSDN Git Service

radv: Don't set dynamic state for pipelines with rasterizer dicard.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Tue, 2 May 2017 21:39:29 +0000 (23:39 +0200)
committerEmil Velikov <emil.l.velikov@gmail.com>
Mon, 8 May 2017 10:24:05 +0000 (11:24 +0100)
All of the dynamic states apply to rasterization & fragment processing,
so we don't need to set them if we don't rasterize.

We don't clear the dirty flags for them though, so we don't miss any
updates for the next pipeline with rasterization.

Signed-off-by: Bas Nieuwenhuizen <basni@google.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Fixes: 76603aa90b8 "radv: Drop the default viewport when 0 viewports are given."
(cherry picked from commit 9e847eedd5e71fa102003326a3e04e485884fe24)

src/amd/vulkan/radv_cmd_buffer.c

index 31d04e5..2609adc 100644 (file)
@@ -1186,6 +1186,15 @@ radv_cmd_buffer_flush_dynamic_state(struct radv_cmd_buffer *cmd_buffer)
 {
        struct radv_dynamic_state *d = &cmd_buffer->state.dynamic;
 
+       if (G_028810_DX_RASTERIZATION_KILL(cmd_buffer->state.pipeline->graphics.raster.pa_cl_clip_cntl))
+               return;
+
+       if (cmd_buffer->state.dirty & (RADV_CMD_DIRTY_DYNAMIC_VIEWPORT))
+               radv_emit_viewport(cmd_buffer);
+
+       if (cmd_buffer->state.dirty & (RADV_CMD_DIRTY_DYNAMIC_SCISSOR | RADV_CMD_DIRTY_DYNAMIC_VIEWPORT))
+               radv_emit_scissor(cmd_buffer);
+
        if (cmd_buffer->state.dirty & RADV_CMD_DIRTY_DYNAMIC_LINE_WIDTH) {
                unsigned width = cmd_buffer->state.dynamic.line_width * 8;
                radeon_set_context_reg(cmd_buffer->cs, R_028A08_PA_SU_LINE_CNTL,
@@ -1474,12 +1483,6 @@ radv_cmd_buffer_flush_state(struct radv_cmd_buffer *cmd_buffer,
        if (cmd_buffer->state.dirty & RADV_CMD_DIRTY_RENDER_TARGETS)
                radv_emit_framebuffer_state(cmd_buffer);
 
-       if (cmd_buffer->state.dirty & (RADV_CMD_DIRTY_DYNAMIC_VIEWPORT))
-               radv_emit_viewport(cmd_buffer);
-
-       if (cmd_buffer->state.dirty & (RADV_CMD_DIRTY_DYNAMIC_SCISSOR | RADV_CMD_DIRTY_DYNAMIC_VIEWPORT))
-               radv_emit_scissor(cmd_buffer);
-
        ia_multi_vgt_param = si_get_ia_multi_vgt_param(cmd_buffer, instanced_draw, indirect_draw, draw_vertex_count);
        if (cmd_buffer->state.last_ia_multi_vgt_param != ia_multi_vgt_param) {
                if (cmd_buffer->device->physical_device->rad_info.chip_class >= CIK)