summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2021-05-05 13:13:14 +1000
committerMarge Bot <emma+marge@anholt.net>2022-08-05 06:18:44 +0000
commita17635e98812029f16a53c57460f252716c64870 (patch)
tree90e437aa3c2740437f3312d790b6a3ce500389a4
parent060936fe0de668127310a65e607fa4b7b48d6f0a (diff)
gallivm/nir/st: lower image derefs in advance.
This improves clover from crashing to just failing, but I mainly want it this to cleanup the nir code first It's also important the shaders coming from the state tracker for feedback get images lowered when they are draw shaders now. Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10641>
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_nir.c144
-rw-r--r--src/gallium/auxiliary/nir/nir_to_tgsi_info.c11
-rw-r--r--src/gallium/drivers/llvmpipe/lp_screen.c2
-rw-r--r--src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt3
-rw-r--r--src/intel/ci/iris-kbl-fails.txt4
-rw-r--r--src/mesa/state_tracker/st_program.c4
6 files changed, 77 insertions, 91 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_nir.c b/src/gallium/auxiliary/gallivm/lp_bld_nir.c
index 260c796d26d..b3a913ef59e 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_nir.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_nir.c
@@ -1596,20 +1596,13 @@ visit_load_image(struct lp_build_nir_context *bld_base,
{
struct gallivm_state *gallivm = bld_base->base.gallivm;
LLVMBuilderRef builder = gallivm->builder;
- nir_deref_instr *deref = nir_instr_as_deref(instr->src[0].ssa->parent_instr);
- nir_variable *var = nir_deref_instr_get_variable(deref);
LLVMValueRef coord_val = get_src(bld_base, instr->src[1]);
LLVMValueRef coords[5];
struct lp_img_params params;
- const struct glsl_type *type = glsl_without_array(var->type);
- unsigned const_index;
- LLVMValueRef indir_index;
- get_deref_offset(bld_base, deref, false, NULL, NULL,
- &const_index, &indir_index);
memset(&params, 0, sizeof(params));
- params.target = glsl_sampler_to_pipe(glsl_get_sampler_dim(type),
- glsl_sampler_type_is_array(type));
+ params.target = glsl_sampler_to_pipe(nir_intrinsic_image_dim(instr),
+ nir_intrinsic_image_array(instr));
for (unsigned i = 0; i < 4; i++)
coords[i] = LLVMBuildExtractValue(builder, coord_val, i, "");
if (params.target == PIPE_TEXTURE_1D_ARRAY)
@@ -1618,13 +1611,14 @@ visit_load_image(struct lp_build_nir_context *bld_base,
params.coords = coords;
params.outdata = result;
params.img_op = LP_IMG_LOAD;
- if (glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_MS ||
- glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_SUBPASS_MS) {
+ if (nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_MS ||
+ nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_SUBPASS_MS)
params.ms_index = cast_type(bld_base, get_src(bld_base, instr->src[2]),
nir_type_uint, 32);
- }
- params.image_index = var->data.binding + (indir_index ? 0 : const_index);
- params.image_index_offset = indir_index;
+ if (nir_src_is_const(instr->src[0]))
+ params.image_index = nir_src_as_int(instr->src[0]);
+ else
+ params.image_index_offset = get_src(bld_base, instr->src[0]);
bld_base->image_op(bld_base, &params);
}
@@ -1635,20 +1629,13 @@ visit_store_image(struct lp_build_nir_context *bld_base,
{
struct gallivm_state *gallivm = bld_base->base.gallivm;
LLVMBuilderRef builder = gallivm->builder;
- nir_deref_instr *deref = nir_instr_as_deref(instr->src[0].ssa->parent_instr);
- nir_variable *var = nir_deref_instr_get_variable(deref);
LLVMValueRef coord_val = get_src(bld_base, instr->src[1]);
LLVMValueRef in_val = get_src(bld_base, instr->src[3]);
LLVMValueRef coords[5];
struct lp_img_params params;
- const struct glsl_type *type = glsl_without_array(var->type);
- unsigned const_index;
- LLVMValueRef indir_index;
- get_deref_offset(bld_base, deref, false, NULL, NULL,
- &const_index, &indir_index);
memset(&params, 0, sizeof(params));
- params.target = glsl_sampler_to_pipe(glsl_get_sampler_dim(type), glsl_sampler_type_is_array(type));
+ params.target = glsl_sampler_to_pipe(nir_intrinsic_image_dim(instr), nir_intrinsic_image_array(instr));
for (unsigned i = 0; i < 4; i++)
coords[i] = LLVMBuildExtractValue(builder, coord_val, i, "");
if (params.target == PIPE_TEXTURE_1D_ARRAY)
@@ -1659,11 +1646,13 @@ visit_store_image(struct lp_build_nir_context *bld_base,
params.indata[i] = LLVMBuildExtractValue(builder, in_val, i, "");
params.indata[i] = LLVMBuildBitCast(builder, params.indata[i], bld_base->base.vec_type, "");
}
- if (glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_MS)
+ if (nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_MS)
params.ms_index = get_src(bld_base, instr->src[2]);
params.img_op = LP_IMG_STORE;
- params.image_index = var->data.binding + (indir_index ? 0 : const_index);
- params.image_index_offset = indir_index;
+ if (nir_src_is_const(instr->src[0]))
+ params.image_index = nir_src_as_int(instr->src[0]);
+ else
+ params.image_index_offset = get_src(bld_base, instr->src[0]);
if (params.target == PIPE_TEXTURE_1D_ARRAY)
coords[2] = coords[1];
@@ -1678,54 +1667,47 @@ visit_atomic_image(struct lp_build_nir_context *bld_base,
{
struct gallivm_state *gallivm = bld_base->base.gallivm;
LLVMBuilderRef builder = gallivm->builder;
- nir_deref_instr *deref = nir_instr_as_deref(instr->src[0].ssa->parent_instr);
- nir_variable *var = nir_deref_instr_get_variable(deref);
struct lp_img_params params;
LLVMValueRef coord_val = get_src(bld_base, instr->src[1]);
LLVMValueRef in_val = get_src(bld_base, instr->src[3]);
LLVMValueRef coords[5];
- const struct glsl_type *type = glsl_without_array(var->type);
- unsigned const_index;
- LLVMValueRef indir_index;
- get_deref_offset(bld_base, deref, false, NULL, NULL,
- &const_index, &indir_index);
memset(&params, 0, sizeof(params));
switch (instr->intrinsic) {
- case nir_intrinsic_image_deref_atomic_add:
+ case nir_intrinsic_image_atomic_add:
params.op = LLVMAtomicRMWBinOpAdd;
break;
- case nir_intrinsic_image_deref_atomic_exchange:
+ case nir_intrinsic_image_atomic_exchange:
params.op = LLVMAtomicRMWBinOpXchg;
break;
- case nir_intrinsic_image_deref_atomic_and:
+ case nir_intrinsic_image_atomic_and:
params.op = LLVMAtomicRMWBinOpAnd;
break;
- case nir_intrinsic_image_deref_atomic_or:
+ case nir_intrinsic_image_atomic_or:
params.op = LLVMAtomicRMWBinOpOr;
break;
- case nir_intrinsic_image_deref_atomic_xor:
+ case nir_intrinsic_image_atomic_xor:
params.op = LLVMAtomicRMWBinOpXor;
break;
- case nir_intrinsic_image_deref_atomic_umin:
+ case nir_intrinsic_image_atomic_umin:
params.op = LLVMAtomicRMWBinOpUMin;
break;
- case nir_intrinsic_image_deref_atomic_umax:
+ case nir_intrinsic_image_atomic_umax:
params.op = LLVMAtomicRMWBinOpUMax;
break;
- case nir_intrinsic_image_deref_atomic_imin:
+ case nir_intrinsic_image_atomic_imin:
params.op = LLVMAtomicRMWBinOpMin;
break;
- case nir_intrinsic_image_deref_atomic_imax:
+ case nir_intrinsic_image_atomic_imax:
params.op = LLVMAtomicRMWBinOpMax;
break;
default:
break;
}
- params.target = glsl_sampler_to_pipe(glsl_get_sampler_dim(type),
- glsl_sampler_type_is_array(type));
+ params.target = glsl_sampler_to_pipe(nir_intrinsic_image_dim(instr),
+ nir_intrinsic_image_array(instr));
for (unsigned i = 0; i < 4; i++) {
coords[i] = LLVMBuildExtractValue(builder, coord_val, i, "");
}
@@ -1735,10 +1717,9 @@ visit_atomic_image(struct lp_build_nir_context *bld_base,
params.coords = coords;
- if (glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_MS) {
+ if (nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_MS)
params.ms_index = get_src(bld_base, instr->src[2]);
- }
- if (instr->intrinsic == nir_intrinsic_image_deref_atomic_comp_swap) {
+ if (instr->intrinsic == nir_intrinsic_image_atomic_comp_swap) {
LLVMValueRef cas_val = get_src(bld_base, instr->src[4]);
params.indata[0] = in_val;
params.indata2[0] = cas_val;
@@ -1748,10 +1729,12 @@ visit_atomic_image(struct lp_build_nir_context *bld_base,
params.outdata = result;
params.img_op =
- (instr->intrinsic == nir_intrinsic_image_deref_atomic_comp_swap)
+ (instr->intrinsic == nir_intrinsic_image_atomic_comp_swap)
? LP_IMG_ATOMIC_CAS : LP_IMG_ATOMIC;
- params.image_index = var->data.binding + (indir_index ? 0 : const_index);
- params.image_index_offset = indir_index;
+ if (nir_src_is_const(instr->src[0]))
+ params.image_index = nir_src_as_int(instr->src[0]);
+ else
+ params.image_index_offset = get_src(bld_base, instr->src[0]);
bld_base->image_op(bld_base, &params);
}
@@ -1762,18 +1745,14 @@ visit_image_size(struct lp_build_nir_context *bld_base,
nir_intrinsic_instr *instr,
LLVMValueRef result[NIR_MAX_VEC_COMPONENTS])
{
- nir_deref_instr *deref = nir_instr_as_deref(instr->src[0].ssa->parent_instr);
- nir_variable *var = nir_deref_instr_get_variable(deref);
struct lp_sampler_size_query_params params = { 0 };
- unsigned const_index;
- LLVMValueRef indir_index;
- const struct glsl_type *type = glsl_without_array(var->type);
- get_deref_offset(bld_base, deref, false, NULL, NULL,
- &const_index, &indir_index);
- params.texture_unit = var->data.binding + (indir_index ? 0 : const_index);
- params.texture_unit_offset = indir_index;
- params.target = glsl_sampler_to_pipe(glsl_get_sampler_dim(type),
- glsl_sampler_type_is_array(type));
+
+ if (nir_src_is_const(instr->src[0]))
+ params.texture_unit = nir_src_as_int(instr->src[0]);
+ else
+ params.texture_unit_offset = get_src(bld_base, instr->src[0]);
+ params.target = glsl_sampler_to_pipe(nir_intrinsic_image_dim(instr),
+ nir_intrinsic_image_array(instr));
params.sizes_out = result;
bld_base->image_size(bld_base, &params);
@@ -1785,19 +1764,14 @@ visit_image_samples(struct lp_build_nir_context *bld_base,
nir_intrinsic_instr *instr,
LLVMValueRef result[NIR_MAX_VEC_COMPONENTS])
{
- nir_deref_instr *deref = nir_instr_as_deref(instr->src[0].ssa->parent_instr);
- nir_variable *var = nir_deref_instr_get_variable(deref);
struct lp_sampler_size_query_params params = { 0 };
- unsigned const_index;
- LLVMValueRef indir_index;
- const struct glsl_type *type = glsl_without_array(var->type);
- get_deref_offset(bld_base, deref, false, NULL, NULL,
- &const_index, &indir_index);
- params.texture_unit = var->data.binding + (indir_index ? 0 : const_index);
- params.texture_unit_offset = indir_index;
- params.target = glsl_sampler_to_pipe(glsl_get_sampler_dim(type),
- glsl_sampler_type_is_array(type));
+ if (nir_src_is_const(instr->src[0]))
+ params.texture_unit = nir_src_as_int(instr->src[0]);
+ else
+ params.texture_unit_offset = get_src(bld_base, instr->src[0]);
+ params.target = glsl_sampler_to_pipe(nir_intrinsic_image_dim(instr),
+ nir_intrinsic_image_array(instr));
params.sizes_out = result;
params.samples_only = true;
@@ -2084,28 +2058,28 @@ visit_intrinsic(struct lp_build_nir_context *bld_base,
case nir_intrinsic_ssbo_atomic_comp_swap:
visit_ssbo_atomic(bld_base, instr, result);
break;
- case nir_intrinsic_image_deref_load:
+ case nir_intrinsic_image_load:
visit_load_image(bld_base, instr, result);
break;
- case nir_intrinsic_image_deref_store:
+ case nir_intrinsic_image_store:
visit_store_image(bld_base, instr);
break;
- case nir_intrinsic_image_deref_atomic_add:
- case nir_intrinsic_image_deref_atomic_imin:
- case nir_intrinsic_image_deref_atomic_imax:
- case nir_intrinsic_image_deref_atomic_umin:
- case nir_intrinsic_image_deref_atomic_umax:
- case nir_intrinsic_image_deref_atomic_and:
- case nir_intrinsic_image_deref_atomic_or:
- case nir_intrinsic_image_deref_atomic_xor:
- case nir_intrinsic_image_deref_atomic_exchange:
- case nir_intrinsic_image_deref_atomic_comp_swap:
+ case nir_intrinsic_image_atomic_add:
+ case nir_intrinsic_image_atomic_imin:
+ case nir_intrinsic_image_atomic_imax:
+ case nir_intrinsic_image_atomic_umin:
+ case nir_intrinsic_image_atomic_umax:
+ case nir_intrinsic_image_atomic_and:
+ case nir_intrinsic_image_atomic_or:
+ case nir_intrinsic_image_atomic_xor:
+ case nir_intrinsic_image_atomic_exchange:
+ case nir_intrinsic_image_atomic_comp_swap:
visit_atomic_image(bld_base, instr, result);
break;
- case nir_intrinsic_image_deref_size:
+ case nir_intrinsic_image_size:
visit_image_size(bld_base, instr, result);
break;
- case nir_intrinsic_image_deref_samples:
+ case nir_intrinsic_image_samples:
visit_image_samples(bld_base, instr, result);
break;
case nir_intrinsic_load_shared:
diff --git a/src/gallium/auxiliary/nir/nir_to_tgsi_info.c b/src/gallium/auxiliary/nir/nir_to_tgsi_info.c
index ca02678c333..ccf86ac6bba 100644
--- a/src/gallium/auxiliary/nir/nir_to_tgsi_info.c
+++ b/src/gallium/auxiliary/nir/nir_to_tgsi_info.c
@@ -282,6 +282,7 @@ static void scan_instruction(const struct nir_shader *nir,
info->writes_memory = true;
break;
case nir_intrinsic_image_deref_store:
+ case nir_intrinsic_image_store:
info->writes_memory = true;
break;
case nir_intrinsic_bindless_image_atomic_add:
@@ -313,6 +314,16 @@ static void scan_instruction(const struct nir_shader *nir,
case nir_intrinsic_image_deref_atomic_xor:
case nir_intrinsic_image_deref_atomic_exchange:
case nir_intrinsic_image_deref_atomic_comp_swap:
+ case nir_intrinsic_image_atomic_add:
+ case nir_intrinsic_image_atomic_imin:
+ case nir_intrinsic_image_atomic_imax:
+ case nir_intrinsic_image_atomic_umin:
+ case nir_intrinsic_image_atomic_umax:
+ case nir_intrinsic_image_atomic_and:
+ case nir_intrinsic_image_atomic_or:
+ case nir_intrinsic_image_atomic_xor:
+ case nir_intrinsic_image_atomic_exchange:
+ case nir_intrinsic_image_atomic_comp_swap:
info->writes_memory = true;
break;
case nir_intrinsic_store_ssbo:
diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
index f1667fe1cfa..ba307ee6fc7 100644
--- a/src/gallium/drivers/llvmpipe/lp_screen.c
+++ b/src/gallium/drivers/llvmpipe/lp_screen.c
@@ -365,6 +365,8 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
case PIPE_CAP_PACKED_UNIFORMS: {
struct llvmpipe_screen *lscreen = llvmpipe_screen(screen);
return !lscreen->use_tgsi;
+ case PIPE_CAP_NIR_IMAGES_AS_DEREF:
+ return 0;
}
default:
return u_pipe_screen_get_param_defaults(screen, param);
diff --git a/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt b/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt
index 78d50b466aa..cfec873e490 100644
--- a/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt
+++ b/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt
@@ -112,8 +112,7 @@ spec@!opengl 1.0@gl-1.0-edgeflag,Fail
spec@!opengl 1.0@gl-1.0-edgeflag-quads,Fail
spec@!opengl 1.0@gl-1.0-swapbuffers-behavior,Fail
-# https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10641
-spec@!opengl 1.0@rasterpos,Crash
+spec@!opengl 1.0@rasterpos,Fail
spec@!opengl 1.0@rasterpos@glsl_vs_gs_linked,Fail
spec@!opengl 1.0@rasterpos@glsl_vs_tes_linked,Fail
diff --git a/src/intel/ci/iris-kbl-fails.txt b/src/intel/ci/iris-kbl-fails.txt
index 60c5be5d9c1..5a3e3a1652e 100644
--- a/src/intel/ci/iris-kbl-fails.txt
+++ b/src/intel/ci/iris-kbl-fails.txt
@@ -49,9 +49,7 @@ glx@glx_ext_import_context@make current- multi process,Fail
glx@glx_ext_import_context@make current- single process,Fail
glx@glx_ext_import_context@query context info,Fail
-# "Unsupported intrinsic: vec4 32 ssa_56 = intrinsic image_load (ssa_44, ssa_55, ssa_40, ssa_44) (5, 0, 12, 80, 160) /* image_dim=Buf */ /* image_array=false */ /* format=r32g32b32a32_float */ /* access=80 */ /* dest_type=float32 */
-# rasterpos: ../src/gallium/auxiliary/gallivm/lp_bld_nir.c:1930: visit_intrinsic: Assertion `0' failed."
-spec@!opengl 1.0@rasterpos,Crash
+spec@!opengl 1.0@rasterpos,Fail
spec@!opengl 1.0@rasterpos@glsl_vs_gs_linked,Fail
spec@!opengl 1.0@rasterpos@glsl_vs_tes_linked,Fail
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 15c1efcf9ac..8aa25431689 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -745,8 +745,10 @@ st_create_common_variant(struct st_context *st,
}
}
- if (key->is_draw_shader)
+ if (key->is_draw_shader) {
+ NIR_PASS_V(state.ir.nir, gl_nir_lower_images, false);
v->base.driver_shader = draw_create_vertex_shader(st->draw, &state);
+ }
else
v->base.driver_shader = st_create_nir_shader(st, &state);