Module: Mesa Branch: main Commit: 839045bcc840b451679b0dfcaf7653d019a66fb2 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=839045bcc840b451679b0dfcaf7653d019a66fb2
Author: Dave Airlie <airl...@redhat.com> Date: Wed Sep 27 14:44:37 2023 +1000 gallivm/lp: merge sample info into normal info multisample textures don't have mipmaps, so store sample_stride into mipmap offset 15 and store num_samples into last_level We can't use mipmap_offset0 as arrays might still store some values into it. Reviewed-by: Roland Scheidegger <srol...@vmware.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25398> --- src/gallium/auxiliary/draw/draw_llvm.c | 19 +++++++----- src/gallium/auxiliary/gallivm/lp_bld_jit_types.c | 16 ++-------- src/gallium/auxiliary/gallivm/lp_bld_jit_types.h | 10 +++---- src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 36 +++++++++++------------ src/gallium/drivers/llvmpipe/lp_jit.c | 31 ++++++++++--------- 5 files changed, 50 insertions(+), 62 deletions(-) diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c index f6f5135e637..36ff317c85d 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.c +++ b/src/gallium/auxiliary/draw/draw_llvm.c @@ -2165,14 +2165,19 @@ draw_llvm_set_mapped_texture(struct draw_context *draw, jit_tex->depth = depth; jit_tex->first_level = first_level; jit_tex->last_level = last_level; + jit_tex->mip_offsets[0] = 0; jit_tex->base = base_ptr; - jit_tex->num_samples = num_samples; - jit_tex->sample_stride = sample_stride; - - for (unsigned j = first_level; j <= last_level; j++) { - jit_tex->mip_offsets[j] = mip_offsets[j]; - jit_tex->row_stride[j] = row_stride[j]; - jit_tex->img_stride[j] = img_stride[j]; + if (num_samples > 1) { + jit_tex->mip_offsets[LP_JIT_TEXTURE_SAMPLE_STRIDE] = sample_stride; + jit_tex->row_stride[0] = row_stride[0]; + jit_tex->img_stride[0] = img_stride[0]; + jit_tex->last_level = num_samples; + } else { + for (unsigned j = first_level; j <= last_level; j++) { + jit_tex->mip_offsets[j] = mip_offsets[j]; + jit_tex->row_stride[j] = row_stride[j]; + jit_tex->img_stride[j] = img_stride[j]; + } } } diff --git a/src/gallium/auxiliary/gallivm/lp_bld_jit_types.c b/src/gallium/auxiliary/gallivm/lp_bld_jit_types.c index e819c82aada..0d9faef2ca9 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_jit_types.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_jit_types.c @@ -146,11 +146,9 @@ lp_build_create_jit_texture_type(struct gallivm_state *gallivm) LLVMTypeRef elem_types[LP_JIT_TEXTURE_NUM_FIELDS]; /* struct lp_jit_texture */ - elem_types[LP_JIT_TEXTURE_WIDTH] = - elem_types[LP_JIT_TEXTURE_SAMPLE_STRIDE] = LLVMInt32TypeInContext(lc); + elem_types[LP_JIT_TEXTURE_WIDTH] = LLVMInt32TypeInContext(lc); elem_types[LP_JIT_TEXTURE_HEIGHT] = elem_types[LP_JIT_TEXTURE_DEPTH] = LLVMInt16TypeInContext(lc); - elem_types[LP_JIT_TEXTURE_NUM_SAMPLES] = elem_types[LP_JIT_TEXTURE_FIRST_LEVEL] = elem_types[LP_JIT_TEXTURE_LAST_LEVEL] = LLVMInt8TypeInContext(lc); elem_types[LP_JIT_TEXTURE_BASE] = LLVMPointerType(LLVMInt8TypeInContext(lc), 0); @@ -189,12 +187,6 @@ lp_build_create_jit_texture_type(struct gallivm_state *gallivm) LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, mip_offsets, gallivm->target, texture_type, LP_JIT_TEXTURE_MIP_OFFSETS); - LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, num_samples, - gallivm->target, texture_type, - LP_JIT_TEXTURE_NUM_SAMPLES); - LP_CHECK_MEMBER_OFFSET(struct lp_jit_texture, sample_stride, - gallivm->target, texture_type, - LP_JIT_TEXTURE_SAMPLE_STRIDE); LP_CHECK_STRUCT_SIZE(struct lp_jit_texture, gallivm->target, texture_type); return texture_type; @@ -460,8 +452,6 @@ LP_BUILD_LLVM_TEXTURE_MEMBER(base_ptr, LP_JIT_TEXTURE_BASE, true) LP_BUILD_LLVM_TEXTURE_MEMBER_OUTTYPE(row_stride, LP_JIT_TEXTURE_ROW_STRIDE, false) LP_BUILD_LLVM_TEXTURE_MEMBER_OUTTYPE(img_stride, LP_JIT_TEXTURE_IMG_STRIDE, false) LP_BUILD_LLVM_TEXTURE_MEMBER_OUTTYPE(mip_offsets, LP_JIT_TEXTURE_MIP_OFFSETS, false) -LP_BUILD_LLVM_TEXTURE_MEMBER(num_samples, LP_JIT_TEXTURE_NUM_SAMPLES, true) -LP_BUILD_LLVM_TEXTURE_MEMBER(sample_stride, LP_JIT_TEXTURE_SAMPLE_STRIDE, true) /** * Fetch the specified member of the lp_jit_sampler structure. @@ -674,8 +664,6 @@ lp_build_jit_fill_sampler_dynamic_state(struct lp_sampler_dynamic_state *state) state->row_stride = lp_build_llvm_texture_row_stride; state->img_stride = lp_build_llvm_texture_img_stride; state->mip_offsets = lp_build_llvm_texture_mip_offsets; - state->num_samples = lp_build_llvm_texture_num_samples; - state->sample_stride = lp_build_llvm_texture_sample_stride; state->min_lod = lp_build_llvm_sampler_min_lod; state->max_lod = lp_build_llvm_sampler_max_lod; @@ -694,7 +682,7 @@ lp_build_jit_fill_image_dynamic_state(struct lp_sampler_dynamic_state *state) state->base_ptr = lp_build_llvm_image_base_ptr; state->row_stride = lp_build_llvm_image_row_stride; state->img_stride = lp_build_llvm_image_img_stride; - state->num_samples = lp_build_llvm_image_num_samples; + state->last_level = lp_build_llvm_image_num_samples; state->sample_stride = lp_build_llvm_image_sample_stride; } diff --git a/src/gallium/auxiliary/gallivm/lp_bld_jit_types.h b/src/gallium/auxiliary/gallivm/lp_bld_jit_types.h index dd768209555..957b80f4542 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_jit_types.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_jit_types.h @@ -60,19 +60,19 @@ lp_llvm_buffer_num_elements(struct gallivm_state *gallivm, LLVMValueRef buffers_ptr, LLVMValueRef buffers_offset, unsigned buffers_limit); +#define LP_JIT_TEXTURE_SAMPLE_STRIDE 15 /* mip_offsets[15] */ + struct lp_jit_texture { const void *base; uint32_t width; /* same as number of elements */ uint16_t height; uint16_t depth; /* doubles as array size */ - uint8_t num_samples; uint8_t first_level; - uint8_t last_level; - uint32_t sample_stride; + uint8_t last_level; /* contains num_samples for multisample */ uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS]; uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS]; - uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS]; + uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS]; /* sample stride is in mip_offsets[15] */ }; enum { @@ -80,10 +80,8 @@ enum { LP_JIT_TEXTURE_WIDTH, LP_JIT_TEXTURE_HEIGHT, LP_JIT_TEXTURE_DEPTH, - LP_JIT_TEXTURE_NUM_SAMPLES, LP_JIT_TEXTURE_FIRST_LEVEL, LP_JIT_TEXTURE_LAST_LEVEL, - LP_JIT_TEXTURE_SAMPLE_STRIDE, LP_JIT_TEXTURE_ROW_STRIDE, LP_JIT_TEXTURE_IMG_STRIDE, LP_JIT_TEXTURE_MIP_OFFSETS, diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c index 66ebe6ba951..4887a58cda2 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c @@ -3259,17 +3259,16 @@ lp_build_fetch_texel(struct lp_build_sample_context *bld, } 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, - texture_unit, NULL); + LLVMValueRef num_samples = bld->dynamic_state->last_level(bld->gallivm, + bld->resources_type, + bld->resources_ptr, + texture_unit, NULL); num_samples = LLVMBuildZExt(bld->gallivm->builder, num_samples, bld->int_bld.elem_type, ""); - LLVMValueRef sample_stride = bld->dynamic_state->sample_stride(bld->gallivm, - bld->resources_type, - bld->resources_ptr, - texture_unit, - NULL); + LLVMValueRef sample_stride = lp_sample_load_mip_value(bld->gallivm, + bld->mip_offsets_type, + bld->mip_offsets, + lp_build_const_int32(bld->gallivm, LP_JIT_TEXTURE_SAMPLE_STRIDE)); lp_build_sample_ms_offset(int_coord_bld, ms_index, num_samples, sample_stride, &offset, &out_of_bounds); } @@ -4518,14 +4517,13 @@ lp_build_size_query_soa(struct gallivm_state *gallivm, 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); + num_samples = dynamic_state->last_level(gallivm, + resources_type, + resources_ptr, + texture_unit, + texture_unit_offset); num_samples = LLVMBuildZExt(gallivm->builder, num_samples, bld_int_vec4.elem_type, ""); } else { @@ -4965,10 +4963,10 @@ lp_build_img_op_soa(const struct lp_static_texture_state *static_texture_state, &offset, &i, &j); if (params->ms_index && static_texture_state->level_zero_only) { - LLVMValueRef num_samples = dynamic_state->num_samples(gallivm, - params->resources_type, - params->resources_ptr, - params->image_index, NULL); + LLVMValueRef num_samples = dynamic_state->last_level(gallivm, + params->resources_type, + params->resources_ptr, + params->image_index, NULL); num_samples = LLVMBuildZExt(gallivm->builder, num_samples, int_coord_bld.elem_type, ""); LLVMValueRef sample_stride = dynamic_state->sample_stride(gallivm, diff --git a/src/gallium/drivers/llvmpipe/lp_jit.c b/src/gallium/drivers/llvmpipe/lp_jit.c index 77be06f4853..be5d3487efc 100644 --- a/src/gallium/drivers/llvmpipe/lp_jit.c +++ b/src/gallium/drivers/llvmpipe/lp_jit.c @@ -393,28 +393,31 @@ lp_jit_texture_from_pipe(struct lp_jit_texture *jit, const struct pipe_sampler_v jit->first_level = 0; jit->last_level = 0; jit->mip_offsets[0] = 0; + jit->mip_offsets[LP_JIT_TEXTURE_SAMPLE_STRIDE] = 0; jit->row_stride[0] = 0; jit->img_stride[0] = 0; - jit->num_samples = 0; - jit->sample_stride = 0; } else { jit->width = res->width0; jit->height = res->height0; jit->depth = res->depth0; jit->first_level = first_level; jit->last_level = last_level; - jit->num_samples = res->nr_samples; - jit->sample_stride = 0; + jit->mip_offsets[0] = 0; if (llvmpipe_resource_is_texture(res)) { - for (unsigned j = first_level; j <= last_level; j++) { - jit->mip_offsets[j] = lp_tex->mip_offsets[j]; - jit->row_stride[j] = lp_tex->row_stride[j]; - jit->img_stride[j] = lp_tex->img_stride[j]; + if (res->nr_samples > 1) { + jit->last_level = res->nr_samples; + jit->mip_offsets[LP_JIT_TEXTURE_SAMPLE_STRIDE] = lp_tex->sample_stride; + jit->row_stride[0] = lp_tex->row_stride[0]; + jit->img_stride[0] = lp_tex->img_stride[0]; + } else { + for (unsigned j = first_level; j <= last_level; j++) { + jit->mip_offsets[j] = lp_tex->mip_offsets[j]; + jit->row_stride[j] = lp_tex->row_stride[j]; + jit->img_stride[j] = lp_tex->img_stride[j]; + } } - jit->sample_stride = lp_tex->sample_stride; - if (res->target == PIPE_TEXTURE_1D_ARRAY || res->target == PIPE_TEXTURE_2D_ARRAY || res->target == PIPE_TEXTURE_CUBE || @@ -484,8 +487,8 @@ lp_jit_texture_from_pipe(struct lp_jit_texture *jit, const struct pipe_sampler_v jit->height = res->height0; jit->depth = res->depth0; jit->first_level = jit->last_level = 0; - jit->num_samples = res->nr_samples; - jit->sample_stride = 0; + if (res->nr_samples > 1) + jit->last_level = res->nr_samples; assert(jit->base); } } @@ -506,15 +509,11 @@ lp_jit_texture_buffer_from_bda(struct lp_jit_texture *jit, void *mem, size_t siz jit->mip_offsets[0] = 0; jit->row_stride[0] = 0; jit->img_stride[0] = 0; - jit->num_samples = 0; - jit->sample_stride = 0; } else { jit->height = 1; jit->depth = 1; jit->first_level = 0; jit->last_level = 0; - jit->num_samples = 1; - jit->sample_stride = 0; /* * For buffers, we don't have "offset", instead adjust