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;
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:
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(
.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,
#define MAX_VBS 32
#define MAX_SETS 8
#define MAX_RTS 8
+#define MAX_PUSH_CONSTANTS_SIZE 128
struct anv_pipeline_layout {
struct {
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;
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;
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;