radv: Use less conservative approximation for context rolls.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sun, 17 Jun 2018 01:37:49 +0000 (03:37 +0200)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Mon, 18 Jun 2018 14:21:10 +0000 (16:21 +0200)
Drops the number of time we set the scissor by 4x for F1 2017,
which results in a consistent performance improvement of about 4%.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
src/amd/vulkan/radv_cmd_buffer.c

index a07717c71963c6340dbbbb6b003bfe04ecf5ef2c..ccaab63b84b3c98c23d6e2c35f8cae7058e85a9b 100644 (file)
@@ -3299,10 +3299,13 @@ static bool radv_need_late_scissor_emission(struct radv_cmd_buffer *cmd_buffer,
        if (!cmd_buffer->device->physical_device->has_scissor_bug)
                return false;
 
+       uint32_t used_states = cmd_buffer->state.pipeline->graphics.needed_dynamic_state | ~RADV_CMD_DIRTY_DYNAMIC_ALL;
+
+       /* Index & Vertex buffer don't change context regs, and pipeline is handled later. */
+       used_states &= ~(RADV_CMD_DIRTY_INDEX_BUFFER | RADV_CMD_DIRTY_VERTEX_BUFFER | RADV_CMD_DIRTY_PIPELINE);
+
        /* Assume all state changes except  these two can imply context rolls. */
-       if (cmd_buffer->state.dirty & ~(RADV_CMD_DIRTY_INDEX_BUFFER |
-                                       RADV_CMD_DIRTY_VERTEX_BUFFER |
-                                       RADV_CMD_DIRTY_PIPELINE))
+       if (cmd_buffer->state.dirty & used_states)
                return true;
 
        if (cmd_buffer->state.emitted_pipeline != cmd_buffer->state.pipeline)