mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 15:20:10 +01:00
ir3: fix calling ir3_const_state_mut in the binning VS
lower_driver_param_to_ubo would call ir3_const_state_mut unconditionally. However, since850f2aab03("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:
parent
0311159bed
commit
e80c6d0f00
1 changed files with 36 additions and 19 deletions
|
|
@ -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, ¶m_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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue