ir3: fix calling ir3_const_state_mut in the binning VS

lower_driver_param_to_ubo would call ir3_const_state_mut
unconditionally. However, since 850f2aab03 ("ir3, tu: Use a UBO for VS
primitive params on a750+"), it can be called for the binning VS,
causing an assert. This commit makes sure to only call
ir3_const_state_mut when it's really necessary to have mutable access to
the const state.

Fixes: 2c47ad7774 ("ir3: make ir3_const_state less error-prone to use")
Signed-off-by: Job Noorman <jnoorman@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30718>
This commit is contained in:
Job Noorman 2024-08-19 09:54:45 +02:00
parent 0311159bed
commit e80c6d0f00

View file

@ -9,11 +9,37 @@
#include "ir3_compiler.h"
#include "ir3_nir.h"
static nir_def *
load_primitive_map_ubo(nir_builder *b, struct ir3_shader_variant *v,
unsigned components, unsigned offset)
{
struct ir3_const_state *const_state = ir3_const_state_mut(v);
return ir3_load_driver_ubo(b, components, &const_state->primitive_map_ubo,
offset);
}
static nir_def *
load_primitive_param_ubo(nir_builder *b, struct ir3_shader_variant *v,
unsigned components, unsigned offset)
{
struct ir3_const_state *const_state = ir3_const_state_mut(v);
return ir3_load_driver_ubo(b, components, &const_state->primitive_param_ubo,
offset);
}
static nir_def *
load_driver_params_ubo(nir_builder *b, struct ir3_shader_variant *v,
unsigned components, unsigned offset)
{
struct ir3_const_state *const_state = ir3_const_state_mut(v);
return ir3_load_driver_ubo(b, components, &const_state->driver_params_ubo,
offset);
}
static bool
lower_driver_param_to_ubo(nir_builder *b, nir_intrinsic_instr *intr, void *in)
{
struct ir3_shader_variant *v = in;
struct ir3_const_state *const_state = ir3_const_state_mut(v);
unsigned components = nir_intrinsic_dest_components(intr);
@ -22,33 +48,26 @@ lower_driver_param_to_ubo(nir_builder *b, nir_intrinsic_instr *intr, void *in)
nir_def *result;
switch (intr->intrinsic) {
case nir_intrinsic_load_primitive_location_ir3:
result = ir3_load_driver_ubo(b, components,
&const_state->primitive_map_ubo,
nir_intrinsic_driver_location(intr));
result = load_primitive_map_ubo(b, v, components,
nir_intrinsic_driver_location(intr));
break;
case nir_intrinsic_load_vs_primitive_stride_ir3:
result = ir3_load_driver_ubo(b, components,
&const_state->primitive_param_ubo, 0);
result = load_primitive_param_ubo(b, v, components, 0);
break;
case nir_intrinsic_load_vs_vertex_stride_ir3:
result = ir3_load_driver_ubo(b, components,
&const_state->primitive_param_ubo, 1);
result = load_primitive_param_ubo(b, v, components, 1);
break;
case nir_intrinsic_load_hs_patch_stride_ir3:
result = ir3_load_driver_ubo(b, components,
&const_state->primitive_param_ubo, 2);
result = load_primitive_param_ubo(b, v, components, 2);
break;
case nir_intrinsic_load_patch_vertices_in:
result = ir3_load_driver_ubo(b, components,
&const_state->primitive_param_ubo, 3);
result = load_primitive_param_ubo(b, v, components, 3);
break;
case nir_intrinsic_load_tess_param_base_ir3:
result = ir3_load_driver_ubo(b, components,
&const_state->primitive_param_ubo, 4);
result = load_primitive_param_ubo(b, v, components, 4);
break;
case nir_intrinsic_load_tess_factor_base_ir3:
result = ir3_load_driver_ubo(b, components,
&const_state->primitive_param_ubo, 6);
result = load_primitive_param_ubo(b, v, components, 6);
break;
/* These are still loaded using CP_LOAD_STATE for compatibility with indirect
* draws where the CP does a CP_LOAD_STATE for us internally:
@ -63,9 +82,7 @@ lower_driver_param_to_ubo(nir_builder *b, nir_intrinsic_instr *intr, void *in)
if (!ir3_get_driver_param_info(b->shader, intr, &param_info))
return false;
result = ir3_load_driver_ubo(b, components,
&const_state->driver_params_ubo,
param_info.offset);
result = load_driver_params_ubo(b, v, components, param_info.offset);
}
}