From 0a47002a65c6932359e29e2d09144a3273e275a2 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Fri, 16 Sep 2022 16:13:31 +0200 Subject: [PATCH] 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: --- src/freedreno/vulkan/tu_cmd_buffer.c | 12 ++++++------ src/freedreno/vulkan/tu_pipeline.c | 16 ++++++++-------- src/freedreno/vulkan/tu_pipeline.h | 4 ++-- src/freedreno/vulkan/tu_shader.c | 26 ++++++++++++++++---------- src/freedreno/vulkan/tu_shader.h | 8 +++++++- 5 files changed, 39 insertions(+), 27 deletions(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index e979b3681a3..ef83d5d42ca 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -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) { diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c index ca7d35ac963..08659a45cfb 100644 --- a/src/freedreno/vulkan/tu_pipeline.c +++ b/src/freedreno/vulkan/tu_pipeline.c @@ -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) diff --git a/src/freedreno/vulkan/tu_pipeline.h b/src/freedreno/vulkan/tu_pipeline.h index 4ed04da0421..a06599fadf5 100644 --- a/src/freedreno/vulkan/tu_pipeline.h +++ b/src/freedreno/vulkan/tu_pipeline.h @@ -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 { diff --git a/src/freedreno/vulkan/tu_shader.c b/src/freedreno/vulkan/tu_shader.c index 9436496b68f..b8e0f28c81a 100644 --- a/src/freedreno/vulkan/tu_shader.c +++ b/src/freedreno/vulkan/tu_shader.c @@ -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, diff --git a/src/freedreno/vulkan/tu_shader.h b/src/freedreno/vulkan/tu_shader.h index 05fc3338af1..6f529cde058 100644 --- a/src/freedreno/vulkan/tu_shader.h +++ b/src/freedreno/vulkan/tu_shader.h @@ -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; };