vk: Add initial API support for setting push constants
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 26 Aug 2015 22:01:38 +0000 (15:01 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 27 Aug 2015 00:59:15 +0000 (17:59 -0700)
This doesn't add support for actually uploading them, it just ensures that
we have and update the shadow copy.

src/vulkan/anv_cmd_buffer.c
src/vulkan/anv_device.c
src/vulkan/anv_private.h

index 033c7872aafecff9ff13bd400f4c90efa1077451..a2a2833b62e6cc162cddfe969c103b30cf0d838d 100644 (file)
@@ -47,10 +47,12 @@ anv_cmd_state_init(struct anv_cmd_state *state)
    state->ds_state = NULL;
    memset(&state->state_vf, 0, sizeof(state->state_vf));
    memset(&state->descriptors, 0, sizeof(state->descriptors));
+   memset(&state->push_constants, 0, sizeof(state->push_constants));
 
    state->dirty = 0;
    state->vb_dirty = 0;
    state->descriptors_dirty = 0;
+   state->push_constants_dirty = 0;
    state->pipeline = NULL;
    state->vp_state = NULL;
    state->rs_state = NULL;
@@ -210,12 +212,14 @@ void anv_CmdBindPipeline(
    case VK_PIPELINE_BIND_POINT_COMPUTE:
       cmd_buffer->state.compute_pipeline = pipeline;
       cmd_buffer->state.compute_dirty |= ANV_CMD_BUFFER_PIPELINE_DIRTY;
+      cmd_buffer->state.push_constants_dirty |= VK_SHADER_STAGE_COMPUTE_BIT;
       break;
 
    case VK_PIPELINE_BIND_POINT_GRAPHICS:
       cmd_buffer->state.pipeline = pipeline;
       cmd_buffer->state.vb_dirty |= pipeline->vb_used;
       cmd_buffer->state.dirty |= ANV_CMD_BUFFER_PIPELINE_DIRTY;
+      cmd_buffer->state.push_constants_dirty |= pipeline->active_stages;
       break;
 
    default:
@@ -665,7 +669,22 @@ void anv_CmdPushConstants(
     uint32_t                                    length,
     const void*                                 values)
 {
-   stub();
+   ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, cmdBuffer);
+   uint32_t stage;
+
+   for_each_bit(stage, stageFlags) {
+      if (cmd_buffer->state.push_constants[stage].data == NULL) {
+         cmd_buffer->state.push_constants[stage].data =
+            anv_device_alloc(cmd_buffer->device,
+                             sizeof(struct anv_push_constant_data), 8,
+                             VK_SYSTEM_ALLOC_TYPE_INTERNAL);
+      }
+
+      memcpy(cmd_buffer->state.push_constants[stage].data->client_data + start,
+             values, length);
+   }
+
+   cmd_buffer->state.push_constants_dirty |= stageFlags;
 }
 
 void anv_CmdExecuteCommands(
index 6d2f58603b3734718982e765cb9ea025b9f40769..57b2681a2d1426b31b42df1fafba215bfafc40bb 100644 (file)
@@ -289,7 +289,7 @@ VkResult anv_GetPhysicalDeviceLimits(
       .maxTexelBufferSize                       = (1 << 14),
       .maxUniformBufferSize                     = UINT32_MAX,
       .maxStorageBufferSize                     = UINT32_MAX,
-      .maxPushConstantsSize                     = 128,
+      .maxPushConstantsSize                     = MAX_PUSH_CONSTANTS_SIZE,
       .maxMemoryAllocationCount                 = UINT32_MAX,
       .bufferImageGranularity                   = 64, /* A cache line */
       .maxBoundDescriptorSets                   = MAX_SETS,
index f0d4233b046e2beadc325f51ff057a203b4a5dd1..cb8defd23b6ca5ebcb0d4f2061178b3bb0a21b68 100644 (file)
@@ -642,6 +642,7 @@ anv_descriptor_set_destroy(struct anv_device *device,
 #define MAX_VBS   32
 #define MAX_SETS   8
 #define MAX_RTS    8
+#define MAX_PUSH_CONSTANTS_SIZE 128
 
 struct anv_pipeline_layout {
    struct {
@@ -684,6 +685,16 @@ struct anv_descriptor_set_binding {
    uint32_t                                     dynamic_offsets[128];
 };
 
+struct anv_push_constant_data {
+    uint8_t client_data[MAX_PUSH_CONSTANTS_SIZE];
+    uint8_t driver_data[0];
+};
+
+struct anv_push_constants {
+    uint32_t driver_data_size;
+    struct anv_push_constant_data *data;
+};
+
 /** State required while building cmd buffer */
 struct anv_cmd_state {
    uint32_t                                     current_pipeline;
@@ -691,6 +702,7 @@ struct anv_cmd_state {
    uint32_t                                     dirty;
    uint32_t                                     compute_dirty;
    uint32_t                                     descriptors_dirty;
+   uint32_t                                     push_constants_dirty;
    uint32_t                                     scratch_size;
    struct anv_pipeline *                        pipeline;
    struct anv_pipeline *                        compute_pipeline;
@@ -704,6 +716,7 @@ struct anv_cmd_state {
    uint32_t                                     state_vf[GEN8_3DSTATE_VF_length];
    struct anv_vertex_binding                    vertex_bindings[MAX_VBS];
    struct anv_descriptor_set_binding            descriptors[MAX_SETS];
+   struct anv_push_constants                    push_constants[VK_SHADER_STAGE_NUM];
 
    struct {
       struct anv_buffer *                       index_buffer;