tu: Abstract driver-specific const state
Right now, we pass around the push constant state in a lot of places, but we'll want to add other driver-managed constants. Add a struct which we can add to, and separate out the total driver-reserved constants from the size of push constants. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18554>
This commit is contained in:
parent
29262f3337
commit
0a47002a65
5 changed files with 39 additions and 27 deletions
|
|
@ -4089,8 +4089,8 @@ tu6_user_consts_size(const struct tu_pipeline *pipeline,
|
|||
&pipeline->program.link[type];
|
||||
uint32_t dwords = 0;
|
||||
|
||||
if (link->push_consts.dwords > 0) {
|
||||
unsigned num_units = link->push_consts.dwords;
|
||||
if (link->tu_const_state.push_consts.dwords > 0) {
|
||||
unsigned num_units = link->tu_const_state.push_consts.dwords;
|
||||
dwords += 4 + num_units;
|
||||
}
|
||||
|
||||
|
|
@ -4106,9 +4106,9 @@ tu6_emit_user_consts(struct tu_cs *cs,
|
|||
const struct tu_program_descriptor_linkage *link =
|
||||
&pipeline->program.link[type];
|
||||
|
||||
if (link->push_consts.dwords > 0) {
|
||||
unsigned num_units = link->push_consts.dwords;
|
||||
unsigned offset = link->push_consts.lo;
|
||||
if (link->tu_const_state.push_consts.dwords > 0) {
|
||||
unsigned num_units = link->tu_const_state.push_consts.dwords;
|
||||
unsigned offset = link->tu_const_state.push_consts.lo;
|
||||
|
||||
/* DST_OFF and NUM_UNIT requires vec4 units */
|
||||
tu_cs_emit_pkt7(cs, tu6_stage2opcode(type), 3 + num_units);
|
||||
|
|
@ -4194,7 +4194,7 @@ tu6_emit_consts(struct tu_cmd_buffer *cmd,
|
|||
for (uint32_t i = 0; i < ARRAY_SIZE(pipeline->program.link); i++) {
|
||||
const struct tu_program_descriptor_linkage *link =
|
||||
&pipeline->program.link[i];
|
||||
assert(!link->push_consts.dwords);
|
||||
assert(!link->tu_const_state.push_consts.dwords);
|
||||
}
|
||||
} else {
|
||||
if (compute) {
|
||||
|
|
|
|||
|
|
@ -2743,7 +2743,7 @@ tu_shaders_serialize(struct vk_pipeline_cache_object *object,
|
|||
struct tu_compiled_shaders *shaders =
|
||||
container_of(object, struct tu_compiled_shaders, base);
|
||||
|
||||
blob_write_bytes(blob, shaders->push_consts, sizeof(shaders->push_consts));
|
||||
blob_write_bytes(blob, shaders->const_state, sizeof(shaders->const_state));
|
||||
blob_write_uint8(blob, shaders->active_desc_sets);
|
||||
|
||||
for (unsigned i = 0; i < ARRAY_SIZE(shaders->variants); i++) {
|
||||
|
|
@ -2770,7 +2770,7 @@ tu_shaders_deserialize(struct vk_device *_device,
|
|||
if (!shaders)
|
||||
return NULL;
|
||||
|
||||
blob_copy_bytes(blob, shaders->push_consts, sizeof(shaders->push_consts));
|
||||
blob_copy_bytes(blob, shaders->const_state, sizeof(shaders->const_state));
|
||||
shaders->active_desc_sets = blob_read_uint8(blob);
|
||||
|
||||
for (unsigned i = 0; i < ARRAY_SIZE(shaders->variants); i++) {
|
||||
|
|
@ -3001,7 +3001,7 @@ tu_pipeline_builder_compile_shaders(struct tu_pipeline_builder *builder,
|
|||
if (!compiled_shaders->variants[stage])
|
||||
return VK_ERROR_OUT_OF_HOST_MEMORY;
|
||||
|
||||
compiled_shaders->push_consts[stage] = shaders[stage]->push_consts;
|
||||
compiled_shaders->const_state[stage] = shaders[stage]->const_state;
|
||||
|
||||
stage_feedbacks[stage].duration += os_time_get_nano() - stage_start;
|
||||
}
|
||||
|
|
@ -3229,12 +3229,12 @@ tu_pipeline_builder_parse_dynamic(struct tu_pipeline_builder *builder,
|
|||
|
||||
static void
|
||||
tu_pipeline_set_linkage(struct tu_program_descriptor_linkage *link,
|
||||
struct tu_push_constant_range *push_consts,
|
||||
struct tu_const_state *const_state,
|
||||
struct ir3_shader_variant *v)
|
||||
{
|
||||
link->const_state = *ir3_const_state(v);
|
||||
link->tu_const_state = *const_state;
|
||||
link->constlen = v->constlen;
|
||||
link->push_consts = *push_consts;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -3271,7 +3271,7 @@ tu_pipeline_builder_parse_shader_stages(struct tu_pipeline_builder *builder,
|
|||
continue;
|
||||
|
||||
tu_pipeline_set_linkage(&pipeline->program.link[i],
|
||||
&builder->shaders->push_consts[i],
|
||||
&builder->shaders->const_state[i],
|
||||
builder->shaders->variants[i]);
|
||||
}
|
||||
}
|
||||
|
|
@ -4215,7 +4215,7 @@ tu_compute_pipeline_create(VkDevice device,
|
|||
}
|
||||
|
||||
compiled->active_desc_sets = shader->active_desc_sets;
|
||||
compiled->push_consts[MESA_SHADER_COMPUTE] = shader->push_consts;
|
||||
compiled->const_state[MESA_SHADER_COMPUTE] = shader->const_state;
|
||||
|
||||
struct ir3_shader_variant *v =
|
||||
ir3_shader_create_variant(shader->ir3_shader, &ir3_key, executable_info);
|
||||
|
|
@ -4245,7 +4245,7 @@ tu_compute_pipeline_create(VkDevice device,
|
|||
struct ir3_shader_variant *v = compiled->variants[MESA_SHADER_COMPUTE];
|
||||
|
||||
tu_pipeline_set_linkage(&pipeline->program.link[MESA_SHADER_COMPUTE],
|
||||
&compiled->push_consts[MESA_SHADER_COMPUTE], v);
|
||||
&compiled->const_state[MESA_SHADER_COMPUTE], v);
|
||||
|
||||
result = tu_pipeline_allocate_cs(dev, pipeline, layout, NULL, v);
|
||||
if (result != VK_SUCCESS)
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ struct tu_compiled_shaders
|
|||
{
|
||||
struct vk_pipeline_cache_object base;
|
||||
|
||||
struct tu_push_constant_range push_consts[MESA_SHADER_STAGES];
|
||||
struct tu_const_state const_state[MESA_SHADER_STAGES];
|
||||
uint8_t active_desc_sets;
|
||||
|
||||
struct ir3_shader_variant *variants[MESA_SHADER_STAGES];
|
||||
|
|
@ -78,7 +78,7 @@ struct tu_program_descriptor_linkage
|
|||
|
||||
uint32_t constlen;
|
||||
|
||||
struct tu_push_constant_range push_consts;
|
||||
struct tu_const_state tu_const_state;
|
||||
};
|
||||
|
||||
struct tu_pipeline_executable {
|
||||
|
|
|
|||
|
|
@ -149,8 +149,8 @@ lower_load_push_constant(struct tu_device *dev,
|
|||
*/
|
||||
base += dev->compiler->shared_consts_base_offset * 4;
|
||||
} else {
|
||||
assert(base >= shader->push_consts.lo * 4);
|
||||
base -= shader->push_consts.lo * 4;
|
||||
assert(base >= shader->const_state.push_consts.lo * 4);
|
||||
base -= shader->const_state.push_consts.lo * 4;
|
||||
}
|
||||
|
||||
nir_ssa_def *load =
|
||||
|
|
@ -627,8 +627,8 @@ gather_push_constants(nir_shader *shader, struct tu_shader *tu_shader)
|
|||
}
|
||||
|
||||
if (min >= max) {
|
||||
tu_shader->push_consts.lo = 0;
|
||||
tu_shader->push_consts.dwords = 0;
|
||||
tu_shader->const_state.push_consts.lo = 0;
|
||||
tu_shader->const_state.push_consts.dwords = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -640,9 +640,9 @@ gather_push_constants(nir_shader *shader, struct tu_shader *tu_shader)
|
|||
* Note there's an alignment requirement of 16 dwords on OFFSET. Expand
|
||||
* the range and change units accordingly.
|
||||
*/
|
||||
tu_shader->push_consts.lo = (min / 4) / 4 * 4;
|
||||
tu_shader->push_consts.dwords =
|
||||
align(max, 16) / 4 - tu_shader->push_consts.lo;
|
||||
tu_shader->const_state.push_consts.lo = (min / 4) / 4 * 4;
|
||||
tu_shader->const_state.push_consts.dwords =
|
||||
align(max, 16) / 4 - tu_shader->const_state.push_consts.lo;
|
||||
}
|
||||
|
||||
static bool
|
||||
|
|
@ -653,6 +653,13 @@ tu_lower_io(nir_shader *shader, struct tu_device *dev,
|
|||
if (!tu6_shared_constants_enable(layout, dev->compiler))
|
||||
gather_push_constants(shader, tu_shader);
|
||||
|
||||
struct tu_const_state *const_state = &tu_shader->const_state;
|
||||
unsigned reserved_consts_vec4 =
|
||||
align(DIV_ROUND_UP(const_state->push_consts.dwords, 4),
|
||||
dev->compiler->const_upload_unit);
|
||||
|
||||
tu_shader->reserved_user_consts_vec4 = reserved_consts_vec4;
|
||||
|
||||
struct lower_instr_params params = {
|
||||
.dev = dev,
|
||||
.shader = tu_shader,
|
||||
|
|
@ -842,14 +849,13 @@ tu_shader_create(struct tu_device *dev,
|
|||
|
||||
ir3_finalize_nir(dev->compiler, nir);
|
||||
|
||||
uint32_t reserved_consts_vec4 = align(shader->push_consts.dwords, 16) / 4;
|
||||
bool shared_consts_enable = tu6_shared_constants_enable(layout, dev->compiler);
|
||||
if (shared_consts_enable)
|
||||
assert(!shader->push_consts.dwords);
|
||||
assert(!shader->const_state.push_consts.dwords);
|
||||
|
||||
shader->ir3_shader =
|
||||
ir3_shader_from_nir(dev->compiler, nir, &(struct ir3_shader_options) {
|
||||
.reserved_user_consts = reserved_consts_vec4,
|
||||
.reserved_user_consts = shader->reserved_user_consts_vec4,
|
||||
.shared_consts_enable = shared_consts_enable,
|
||||
.api_wavesize = key->api_wavesize,
|
||||
.real_wavesize = key->real_wavesize,
|
||||
|
|
|
|||
|
|
@ -18,11 +18,17 @@ struct tu_push_constant_range
|
|||
uint32_t dwords;
|
||||
};
|
||||
|
||||
struct tu_const_state
|
||||
{
|
||||
struct tu_push_constant_range push_consts;
|
||||
};
|
||||
|
||||
struct tu_shader
|
||||
{
|
||||
struct ir3_shader *ir3_shader;
|
||||
|
||||
struct tu_push_constant_range push_consts;
|
||||
struct tu_const_state const_state;
|
||||
unsigned reserved_user_consts_vec4;
|
||||
uint8_t active_desc_sets;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue