summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2020-03-10 10:30:13 +1000
committerMarge Bot <eric+marge@anholt.net>2020-05-06 06:20:37 +0000
commit1b02eb1a4c99b1268da2c17420ece6f341b42789 (patch)
tree8bdce41d5e94d885dfdf301f3a69deb2338b7fc5
parent339aec7241f77fc027ee32d1537b30505c20028c (diff)
llvmpipe: add multisample support to texture allocator.
This adds a sample stride field and allocates enough memory for each sample storage. Hook up the sample_stride field to draw and jit textures and images Reviewed-by: Roland Scheidegger <sroland@vmware.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4122>
-rw-r--r--src/gallium/drivers/llvmpipe/lp_setup.c4
-rw-r--r--src/gallium/drivers/llvmpipe/lp_state_cs.c3
-rw-r--r--src/gallium/drivers/llvmpipe/lp_state_sampler.c4
-rw-r--r--src/gallium/drivers/llvmpipe/lp_texture.c5
-rw-r--r--src/gallium/drivers/llvmpipe/lp_texture.h1
5 files changed, 14 insertions, 3 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
index a52f6bbb9c5..eaa759bdab9 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup.c
@@ -726,7 +726,7 @@ lp_setup_set_fs_images(struct lp_setup_context *setup,
jit_image->row_stride = lp_res->row_stride[image->u.tex.level];
jit_image->img_stride = lp_res->img_stride[image->u.tex.level];
- jit_image->sample_stride = 0;
+ jit_image->sample_stride = lp_res->sample_stride;
jit_image->base = (uint8_t *)jit_image->base + mip_offset;
}
else {
@@ -943,6 +943,8 @@ lp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
jit_tex->img_stride[j] = lp_tex->img_stride[j];
}
+ jit_tex->sample_stride = lp_tex->sample_stride;
+
if (res->target == PIPE_TEXTURE_1D_ARRAY ||
res->target == PIPE_TEXTURE_2D_ARRAY ||
res->target == PIPE_TEXTURE_CUBE ||
diff --git a/src/gallium/drivers/llvmpipe/lp_state_cs.c b/src/gallium/drivers/llvmpipe/lp_state_cs.c
index 1d33d5314d6..38210d444f5 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_cs.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_cs.c
@@ -880,6 +880,7 @@ lp_csctx_set_sampler_views(struct lp_cs_context *csctx,
jit_tex->row_stride[j] = lp_tex->row_stride[j];
jit_tex->img_stride[j] = lp_tex->img_stride[j];
}
+ jit_tex->sample_stride = lp_tex->sample_stride;
if (res->target == PIPE_TEXTURE_1D_ARRAY ||
res->target == PIPE_TEXTURE_2D_ARRAY ||
@@ -1076,7 +1077,7 @@ lp_csctx_set_cs_images(struct lp_cs_context *csctx,
jit_image->row_stride = lp_res->row_stride[image->u.tex.level];
jit_image->img_stride = lp_res->img_stride[image->u.tex.level];
- jit_image->sample_stride = 0;
+ jit_image->sample_stride = lp_res->sample_stride;
jit_image->base = (uint8_t *)jit_image->base + mip_offset;
} else {
unsigned view_blocksize = util_format_get_blocksize(image->format);
diff --git a/src/gallium/drivers/llvmpipe/lp_state_sampler.c b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
index 9ddfc37864f..0851213a798 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_sampler.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
@@ -283,6 +283,8 @@ prepare_shader_sampling(
assert(last_level <= res->last_level);
addr = lp_tex->tex_data;
+ sample_stride = lp_tex->sample_stride;
+
for (j = first_level; j <= last_level; j++) {
mip_offsets[j] = lp_tex->mip_offsets[j];
row_stride[j] = lp_tex->row_stride[j];
@@ -443,7 +445,7 @@ prepare_shader_images(
row_stride = lp_img->row_stride[view->u.tex.level];
img_stride = lp_img->img_stride[view->u.tex.level];
- sample_stride = 0;
+ sample_stride = lp_img->sample_stride;
addr = (uint8_t *)addr + mip_offset;
}
else {
diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c
index 0d5c4ac544d..47491ac4604 100644
--- a/src/gallium/drivers/llvmpipe/lp_texture.c
+++ b/src/gallium/drivers/llvmpipe/lp_texture.c
@@ -76,6 +76,8 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen,
unsigned depth = pt->depth0;
uint64_t total_size = 0;
unsigned layers = pt->array_size;
+ unsigned num_samples = util_res_sample_count(pt);
+
/* XXX:
* This alignment here (same for displaytarget) was added for the purpose of
* ARB_map_buffer_alignment. I am not convinced it's needed for non-buffer
@@ -166,6 +168,9 @@ llvmpipe_texture_layout(struct llvmpipe_screen *screen,
depth = u_minify(depth, 1);
}
+ lpr->sample_stride = total_size;
+ total_size *= num_samples;
+
if (allocate) {
lpr->tex_data = align_malloc(total_size, mip_align);
if (!lpr->tex_data) {
diff --git a/src/gallium/drivers/llvmpipe/lp_texture.h b/src/gallium/drivers/llvmpipe/lp_texture.h
index 3d315bb9a73..03cf5a749d5 100644
--- a/src/gallium/drivers/llvmpipe/lp_texture.h
+++ b/src/gallium/drivers/llvmpipe/lp_texture.h
@@ -90,6 +90,7 @@ struct llvmpipe_resource
unsigned id; /**< temporary, for debugging */
+ unsigned sample_stride;
#ifdef DEBUG
/** for linked list */
struct llvmpipe_resource *prev, *next;