Module: Mesa Branch: main Commit: bdde30c1310e8720aa2d157829f82f01e06970ea URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=bdde30c1310e8720aa2d157829f82f01e06970ea
Author: Dave Airlie <airl...@redhat.com> Date: Thu Sep 28 11:39:43 2023 +1000 gallivm/sample: add some num_samples vs level zero only support This just checks the level zero only is set for multisample stuff. I tried using asserts, but there are paths due to precompilation that won't get hit, but do get compiled. Reviewed-by: Roland Scheidegger <srol...@vmware.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25398> --- src/gallium/auxiliary/gallivm/lp_bld_jit_sample.c | 1 + src/gallium/auxiliary/gallivm/lp_bld_nir.c | 7 ++++++- src/gallium/auxiliary/gallivm/lp_bld_sample.c | 2 +- src/gallium/auxiliary/gallivm/lp_bld_sample.h | 1 + src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 22 +++++++++++++++------- src/gallium/drivers/llvmpipe/lp_texture_handle.c | 1 + 6 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_jit_sample.c b/src/gallium/auxiliary/gallivm/lp_bld_jit_sample.c index b82e00350c6..10ecc191bae 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_jit_sample.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_jit_sample.c @@ -605,6 +605,7 @@ lp_bld_llvm_image_soa_emit_size_query(const struct lp_build_image_soa *base, .format = format, .res_format = format, .target = params->target, + .level_zero_only = params->ms, }; lp_build_size_query_soa(gallivm, &state, &image->dynamic_state.base, params); diff --git a/src/gallium/auxiliary/gallivm/lp_bld_nir.c b/src/gallium/auxiliary/gallivm/lp_bld_nir.c index ded1e8317e5..bed636cea5e 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_nir.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_nir.c @@ -1821,7 +1821,8 @@ visit_image_size(struct lp_build_nir_context *bld_base, params.target = glsl_sampler_to_pipe(nir_intrinsic_image_dim(instr), nir_intrinsic_image_array(instr)); params.sizes_out = result; - + params.ms = nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_MS || + nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_SUBPASS_MS; params.format = nir_intrinsic_format(instr); bld_base->image_size(bld_base, ¶ms); @@ -1840,6 +1841,8 @@ visit_image_samples(struct lp_build_nir_context *bld_base, params.target = glsl_sampler_to_pipe(nir_intrinsic_image_dim(instr), nir_intrinsic_image_array(instr)); params.sizes_out = result; + params.ms = nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_MS || + nir_intrinsic_image_dim(instr) == GLSL_SAMPLER_DIM_SUBPASS_MS; params.samples_only = true; params.format = nir_intrinsic_format(instr); @@ -2369,6 +2372,8 @@ visit_txs(struct lp_build_nir_context *bld_base, nir_tex_instr *instr) params.sizes_out = sizes_out; params.samples_only = (instr->op == nir_texop_texture_samples); params.texture_unit_offset = texture_unit_offset; + params.ms = instr->sampler_dim == GLSL_SAMPLER_DIM_MS || + instr->sampler_dim == GLSL_SAMPLER_DIM_SUBPASS_MS; if (instr->op == nir_texop_query_levels) params.explicit_lod = bld_base->uint_bld.zero; diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample.c b/src/gallium/auxiliary/gallivm/lp_bld_sample.c index 949f8290e24..e9db9f9bf6d 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_sample.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample.c @@ -166,7 +166,7 @@ lp_sampler_static_texture_state_image(struct lp_static_texture_state *state, state->pot_width = util_is_power_of_two_or_zero(resource->width0); state->pot_height = util_is_power_of_two_or_zero(resource->height0); state->pot_depth = util_is_power_of_two_or_zero(resource->depth0); - state->level_zero_only = 0; + state->level_zero_only = view->u.tex.level == 0; /* * the layer / element / level parameters are all either dynamic diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample.h b/src/gallium/auxiliary/gallivm/lp_bld_sample.h index 979f3eb235b..5c355947c5b 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_sample.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample.h @@ -136,6 +136,7 @@ struct lp_sampler_size_query_params LLVMValueRef resources_ptr; bool is_sviewinfo; bool samples_only; + bool ms; enum lp_sampler_lod_property lod_property; LLVMValueRef explicit_lod; LLVMValueRef *sizes_out; diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c index 9878e59dad0..ba5b1463d1a 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c @@ -3243,7 +3243,7 @@ lp_build_fetch_texel(struct lp_build_sample_context *bld, lp_build_get_mip_offsets(bld, ilevel)); } - if (bld->fetch_ms) { + if (bld->fetch_ms && bld->static_texture_state->level_zero_only) { LLVMValueRef num_samples = bld->dynamic_state->num_samples(bld->gallivm, bld->resources_type, bld->resources_ptr, @@ -4496,14 +4496,22 @@ lp_build_size_query_soa(struct gallivm_state *gallivm, lp_build_context_init(&bld_int_vec4, gallivm, lp_type_int_vec(32, 128)); if (params->samples_only) { + LLVMValueRef num_samples; + + if (params->ms && static_state->level_zero_only) { + /* multisample never has levels. */ + num_samples = dynamic_state->num_samples(gallivm, + resources_type, + resources_ptr, + texture_unit, + texture_unit_offset); + } else { + num_samples = lp_build_const_int32(gallivm, 0); + } params->sizes_out[0] = lp_build_broadcast(gallivm, lp_build_vec_type(gallivm, params->int_type), - dynamic_state->num_samples(gallivm, - resources_type, - resources_ptr, - texture_unit, - texture_unit_offset)); + num_samples); return; } @@ -4925,7 +4933,7 @@ lp_build_img_op_soa(const struct lp_static_texture_state *static_texture_state, x, y, z, row_stride_vec, img_stride_vec, &offset, &i, &j); - if (params->ms_index) { + if (params->ms_index && static_texture_state->level_zero_only) { LLVMValueRef num_samples = dynamic_state->num_samples(gallivm, params->resources_type, params->resources_ptr, diff --git a/src/gallium/drivers/llvmpipe/lp_texture_handle.c b/src/gallium/drivers/llvmpipe/lp_texture_handle.c index 179b429b12d..72152babcc4 100644 --- a/src/gallium/drivers/llvmpipe/lp_texture_handle.c +++ b/src/gallium/drivers/llvmpipe/lp_texture_handle.c @@ -526,6 +526,7 @@ compile_size_function(struct llvmpipe_context *ctx, struct lp_static_texture_sta .resources_type = cs.jit_resources_type, .is_sviewinfo = true, .samples_only = samples, + .ms = samples, }; if (params.target == PIPE_TEXTURE_1D)