gen8/compute: Setup push constants and local ids
authorJordan Justen <jordan.l.justen@intel.com>
Wed, 9 Dec 2015 01:00:39 +0000 (17:00 -0800)
committerJordan Justen <jordan.l.justen@intel.com>
Wed, 9 Dec 2015 19:04:30 +0000 (11:04 -0800)
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
src/vulkan/gen8_cmd_buffer.c

index 2366f4c244ccfb8adad597f83a0e2ac4d21f30fa..fccc2f4d084d241ec87295735f9641778eb1c900 100644 (file)
@@ -47,6 +47,9 @@ cmd_buffer_flush_push_constants(struct anv_cmd_buffer *cmd_buffer)
    VkShaderStageFlags flushed = 0;
 
    anv_foreach_stage(stage, cmd_buffer->state.push_constants_dirty) {
+      if (stage == MESA_SHADER_COMPUTE)
+         continue;
+
       struct anv_state state = anv_cmd_buffer_push_constants(cmd_buffer, stage);
 
       if (state.offset == 0)
@@ -511,6 +514,21 @@ flush_compute_descriptor_set(struct anv_cmd_buffer *cmd_buffer)
    if (result != VK_SUCCESS)
       return result;
 
+   struct anv_state push_state = anv_cmd_buffer_cs_push_constants(cmd_buffer);
+
+   const struct brw_cs_prog_data *cs_prog_data = &pipeline->cs_prog_data;
+   const struct brw_stage_prog_data *prog_data = &cs_prog_data->base;
+
+   unsigned local_id_dwords = cs_prog_data->local_invocation_id_regs * 8;
+   unsigned push_constant_data_size =
+      (prog_data->nr_params + local_id_dwords) * sizeof(gl_constant_value);
+   unsigned reg_aligned_constant_size = ALIGN(push_constant_data_size, 32);
+   unsigned push_constant_regs = reg_aligned_constant_size / 32;
+
+   anv_batch_emit(&cmd_buffer->batch, GENX(MEDIA_CURBE_LOAD),
+                  .CURBETotalDataLength = push_state.alloc_size,
+                  .CURBEDataStartAddress = push_state.offset);
+
    struct anv_state state =
       anv_state_pool_emit(&device->dynamic_state_pool,
                           GENX(INTERFACE_DESCRIPTOR_DATA), 64,
@@ -520,6 +538,8 @@ flush_compute_descriptor_set(struct anv_cmd_buffer *cmd_buffer)
                           .BindingTableEntryCount = 0,
                           .SamplerStatePointer = samplers.offset,
                           .SamplerCount = 0,
+                          .ConstantIndirectURBEntryReadLength = push_constant_regs,
+                          .ConstantURBEntryReadOffset = 0,
                           .NumberofThreadsinGPGPUThreadGroup = 0);
 
    uint32_t size = GENX(INTERFACE_DESCRIPTOR_DATA_length) * sizeof(uint32_t);