radv: prefetch VBO descriptors at the right place
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 8 Nov 2017 11:12:31 +0000 (12:12 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 13 Nov 2017 10:03:16 +0000 (11:03 +0100)
Just after the vertex shader.

This seems to give a minor boost for, at least, Serious Sam
Fusion 2017 and Dawn of War 3. I don't see any real impacts
with The Talos Principle.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_cmd_buffer.c
src/amd/vulkan/radv_private.h

index 1d552e265aebad5ca8c853adbd11bd3002af303e..a2ad9fa460e8fd8ea76984ef150e43c9df95ccad 100644 (file)
@@ -668,6 +668,17 @@ radv_emit_prefetch_TC_L2_async(struct radv_cmd_buffer *cmd_buffer, uint64_t va,
                si_cp_dma_prefetch(cmd_buffer, va, size);
 }
 
+static void
+radv_emit_VBO_descriptors_prefetch(struct radv_cmd_buffer *cmd_buffer)
+{
+       if (cmd_buffer->state.vb_prefetch_dirty) {
+               radv_emit_prefetch_TC_L2_async(cmd_buffer,
+                                              cmd_buffer->state.vb_va,
+                                              cmd_buffer->state.vb_size);
+               cmd_buffer->state.vb_prefetch_dirty = false;
+       }
+}
+
 static void
 radv_emit_shader_prefetch(struct radv_cmd_buffer *cmd_buffer,
                          struct radv_shader_variant *shader)
@@ -691,6 +702,7 @@ radv_emit_prefetch(struct radv_cmd_buffer *cmd_buffer,
 {
        radv_emit_shader_prefetch(cmd_buffer,
                                  pipeline->shaders[MESA_SHADER_VERTEX]);
+       radv_emit_VBO_descriptors_prefetch(cmd_buffer);
        radv_emit_shader_prefetch(cmd_buffer,
                                  pipeline->shaders[MESA_SHADER_TESS_CTRL]);
        radv_emit_shader_prefetch(cmd_buffer,
@@ -1814,6 +1826,10 @@ radv_cmd_buffer_update_vertex_descriptors(struct radv_cmd_buffer *cmd_buffer, bo
 
                radv_emit_userdata_address(cmd_buffer, cmd_buffer->state.pipeline, MESA_SHADER_VERTEX,
                                           AC_UD_VS_VERTEX_BUFFERS, va);
+
+               cmd_buffer->state.vb_va = va;
+               cmd_buffer->state.vb_size = count * 16;
+               cmd_buffer->state.vb_prefetch_dirty = true;
        }
        cmd_buffer->state.vb_dirty = false;
 
index 58b9f469048855beb0846ced1fd6616d7a91cded..79f52c61e0b033f7068e6a67d575c010aeaf3aac 100644 (file)
@@ -809,7 +809,12 @@ struct radv_attachment_state {
 };
 
 struct radv_cmd_state {
+       /* Vertex descriptors */
        bool                                          vb_dirty;
+       bool                                          vb_prefetch_dirty;
+       uint64_t                                      vb_va;
+       unsigned                                      vb_size;
+
        bool                                          push_descriptors_dirty;
        bool predicating;
        radv_cmd_dirty_mask_t                         dirty;