diff options
author | Dave Airlie <airlied@redhat.com> | 2021-05-05 13:13:14 +1000 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2022-08-05 06:18:44 +0000 |
commit | a17635e98812029f16a53c57460f252716c64870 (patch) | |
tree | 90e437aa3c2740437f3312d790b6a3ce500389a4 | |
parent | 060936fe0de668127310a65e607fa4b7b48d6f0a (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.c | 144 | ||||
-rw-r--r-- | src/gallium/auxiliary/nir/nir_to_tgsi_info.c | 11 | ||||
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_screen.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt | 3 | ||||
-rw-r--r-- | src/intel/ci/iris-kbl-fails.txt | 4 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_program.c | 4 |
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(¶ms, 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, ¶ms); } @@ -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(¶ms, 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(¶ms, 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, ¶ms); } @@ -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, ¶ms); @@ -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); |