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

Reply via email to