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:
Connor Abbott 2022-09-16 16:13:31 +02:00 committed by Marge Bot
parent 29262f3337
commit 0a47002a65
5 changed files with 39 additions and 27 deletions

View file

@ -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) {

View file

@ -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)

View file

@ -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 {

View file

@ -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,

View file

@ -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;
};