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:
@@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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,
|
||||
|
@@ -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,
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user