turnip: shared_consts and push_consts are mutually exclusive
Skip gather_push_constants when shared consts are enabled. This makes
sure push_consts is only zero-initialized, and reserved_user_consts is
0. This saves some space in the const file.
This change also adds a few asserts and a comment to
lower_load_push_constant. Because shared consts share the same range
for all stages, we should not apply per-stage offsets in
lower_load_push_constant. It worked because nir_lower_explicit_io
always sets base to 0 for nir_var_mem_push_const and
shader->push_consts.lo was always 0 for all stages.
Fixes: 0c787d57e6
("tu: increase maxPushConstantsSize to 256.")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17777>
This commit is contained in:
parent
562e5ba286
commit
6929ccedff
|
@ -4213,6 +4213,12 @@ tu6_emit_consts(struct tu_cmd_buffer *cmd,
|
||||||
|
|
||||||
if (pipeline->shared_consts.dwords > 0) {
|
if (pipeline->shared_consts.dwords > 0) {
|
||||||
tu6_emit_shared_consts(&cs, pipeline, cmd->push_constants, compute);
|
tu6_emit_shared_consts(&cs, pipeline, cmd->push_constants, compute);
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (compute) {
|
if (compute) {
|
||||||
tu6_emit_user_consts(&cs, pipeline, MESA_SHADER_COMPUTE, cmd->push_constants);
|
tu6_emit_user_consts(&cs, pipeline, MESA_SHADER_COMPUTE, cmd->push_constants);
|
||||||
|
|
|
@ -146,11 +146,17 @@ lower_load_push_constant(struct tu_device *dev,
|
||||||
{
|
{
|
||||||
uint32_t base = nir_intrinsic_base(instr);
|
uint32_t base = nir_intrinsic_base(instr);
|
||||||
assert(base % 4 == 0);
|
assert(base % 4 == 0);
|
||||||
assert(base >= shader->push_consts.lo * 4);
|
|
||||||
base -= shader->push_consts.lo * 4;
|
|
||||||
|
|
||||||
if (tu6_shared_constants_enable(layout, dev->compiler))
|
if (tu6_shared_constants_enable(layout, dev->compiler)) {
|
||||||
|
/* All stages share the same range. We could potentially add
|
||||||
|
* push_constant_offset to layout and apply it, but this is good for
|
||||||
|
* now.
|
||||||
|
*/
|
||||||
base += dev->compiler->shared_consts_base_offset * 4;
|
base += dev->compiler->shared_consts_base_offset * 4;
|
||||||
|
} else {
|
||||||
|
assert(base >= shader->push_consts.lo * 4);
|
||||||
|
base -= shader->push_consts.lo * 4;
|
||||||
|
}
|
||||||
|
|
||||||
nir_ssa_def *load =
|
nir_ssa_def *load =
|
||||||
nir_load_uniform(b, instr->num_components,
|
nir_load_uniform(b, instr->num_components,
|
||||||
|
@ -641,7 +647,8 @@ tu_lower_io(nir_shader *shader, struct tu_device *dev,
|
||||||
struct tu_shader *tu_shader,
|
struct tu_shader *tu_shader,
|
||||||
const struct tu_pipeline_layout *layout)
|
const struct tu_pipeline_layout *layout)
|
||||||
{
|
{
|
||||||
gather_push_constants(shader, tu_shader);
|
if (!tu6_shared_constants_enable(layout, dev->compiler))
|
||||||
|
gather_push_constants(shader, tu_shader);
|
||||||
|
|
||||||
struct lower_instr_params params = {
|
struct lower_instr_params params = {
|
||||||
.dev = dev,
|
.dev = dev,
|
||||||
|
@ -835,6 +842,8 @@ tu_shader_create(struct tu_device *dev,
|
||||||
|
|
||||||
uint32_t reserved_consts_vec4 = align(shader->push_consts.dwords, 16) / 4;
|
uint32_t reserved_consts_vec4 = align(shader->push_consts.dwords, 16) / 4;
|
||||||
bool shared_consts_enable = tu6_shared_constants_enable(layout, dev->compiler);
|
bool shared_consts_enable = tu6_shared_constants_enable(layout, dev->compiler);
|
||||||
|
if (shared_consts_enable)
|
||||||
|
assert(!shader->push_consts.dwords);
|
||||||
|
|
||||||
shader->ir3_shader =
|
shader->ir3_shader =
|
||||||
ir3_shader_from_nir(dev->compiler, nir, &(struct ir3_shader_options) {
|
ir3_shader_from_nir(dev->compiler, nir, &(struct ir3_shader_options) {
|
||||||
|
|
Loading…
Reference in New Issue