anv/gen7: Add push constant support
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 10 Nov 2015 23:14:11 +0000 (15:14 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 10 Nov 2015 23:14:11 +0000 (15:14 -0800)
src/vulkan/gen7_cmd_buffer.c

index af76126c3a90f44370a30d703c0d862ac88d462d..b3619df2c2e8bf1583051ff0990965cd9c2d67e3 100644 (file)
 
 #include "anv_private.h"
 
+static void
+gen7_cmd_buffer_flush_push_constants(struct anv_cmd_buffer *cmd_buffer)
+{
+   static const uint32_t push_constant_opcodes[] = {
+      [VK_SHADER_STAGE_VERTEX]                  = 21,
+      [VK_SHADER_STAGE_TESS_CONTROL]            = 25, /* HS */
+      [VK_SHADER_STAGE_TESS_EVALUATION]         = 26, /* DS */
+      [VK_SHADER_STAGE_GEOMETRY]                = 22,
+      [VK_SHADER_STAGE_FRAGMENT]                = 23,
+      [VK_SHADER_STAGE_COMPUTE]                 = 0,
+   };
+
+   VkShaderStage stage;
+   VkShaderStageFlags flushed = 0;
+
+   for_each_bit(stage, cmd_buffer->state.push_constants_dirty) {
+      struct anv_state state = anv_cmd_buffer_push_constants(cmd_buffer, stage);
+
+      if (state.offset == 0)
+         continue;
+
+      anv_batch_emit(&cmd_buffer->batch, GEN7_3DSTATE_CONSTANT_VS,
+                     ._3DCommandSubOpcode = push_constant_opcodes[stage],
+                     .ConstantBody = {
+                        .PointerToConstantBuffer0 = { .offset = state.offset },
+                        .ConstantBuffer0ReadLength = DIV_ROUND_UP(state.alloc_size, 32),
+                     });
+
+      flushed |= 1 << stage;
+   }
+
+   cmd_buffer->state.push_constants_dirty &= ~flushed;
+}
+
 
 void
 gen7_cmd_buffer_emit_state_base_address(struct anv_cmd_buffer *cmd_buffer)
@@ -256,6 +290,9 @@ gen7_cmd_buffer_flush_state(struct anv_cmd_buffer *cmd_buffer)
    if (cmd_buffer->state.descriptors_dirty)
       anv_flush_descriptor_sets(cmd_buffer);
 
+   if (cmd_buffer->state.push_constants_dirty)
+      gen7_cmd_buffer_flush_push_constants(cmd_buffer);
+
    if (cmd_buffer->state.dirty & ANV_CMD_DIRTY_DYNAMIC_VIEWPORT)
       anv_cmd_buffer_emit_viewport(cmd_buffer);