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 <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25398>
This commit is contained in:
Dave Airlie
2023-09-27 14:44:37 +10:00
committed by Marge Bot
parent 344fa0895e
commit 839045bcc8
5 changed files with 50 additions and 62 deletions

View File

@@ -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];
}
}
}

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -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,

View File

@@ -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