summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2020-06-19 16:46:18 +1000
committerDave Airlie <airlied@redhat.com>2020-07-27 13:48:11 +1000
commit8447e1465b8ed782e8ec86202135ef768a0e806a (patch)
tree936db811ebf1a316fcc27c68faecea4e2f3daad2
parent7e10310a7595fb4253c7b69aafe5452040c404f3 (diff)
llvmpipe: refactor out some texture/image param
-rw-r--r--src/gallium/drivers/llvmpipe/lp_setup.c57
-rw-r--r--src/gallium/drivers/llvmpipe/lp_state_cs.c56
-rw-r--r--src/gallium/drivers/llvmpipe/lp_state_sampler.c51
-rw-r--r--src/gallium/drivers/llvmpipe/lp_texture.c72
-rw-r--r--src/gallium/drivers/llvmpipe/lp_texture.h7
5 files changed, 103 insertions, 140 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
index 550062ffcfc..fe512fd31a5 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup.c
@@ -685,58 +685,17 @@ lp_setup_set_fs_images(struct lp_setup_context *setup,
struct pipe_image_view *image = &images[i];
util_copy_image_view(&setup->images[i].current, &images[i]);
- struct pipe_resource *res = image->resource;
- struct llvmpipe_resource *lp_res = llvmpipe_resource(res);
struct lp_jit_image *jit_image;
jit_image = &setup->fs.current.jit_context.images[i];
- if (!lp_res)
- continue;
- if (!lp_res->dt) {
- /* regular texture - setup array of mipmap level offsets */
- if (llvmpipe_resource_is_texture(res)) {
- jit_image->base = lp_res->tex_data;
- } else
- jit_image->base = lp_res->data;
-
- jit_image->width = res->width0;
- jit_image->height = res->height0;
- jit_image->depth = res->depth0;
- jit_image->num_samples = res->nr_samples;
-
- if (llvmpipe_resource_is_texture(res)) {
- uint32_t mip_offset = lp_res->mip_offsets[image->u.tex.level];
-
- jit_image->width = u_minify(jit_image->width, image->u.tex.level);
- jit_image->height = u_minify(jit_image->height, image->u.tex.level);
-
- if (res->target == PIPE_TEXTURE_1D_ARRAY ||
- res->target == PIPE_TEXTURE_2D_ARRAY ||
- res->target == PIPE_TEXTURE_3D ||
- res->target == PIPE_TEXTURE_CUBE ||
- res->target == PIPE_TEXTURE_CUBE_ARRAY) {
- /*
- * For array textures, we don't have first_layer, instead
- * adjust last_layer (stored as depth) plus the mip level offsets
- * (as we have mip-first layout can't just adjust base ptr).
- * XXX For mip levels, could do something similar.
- */
- jit_image->depth = image->u.tex.last_layer - image->u.tex.first_layer + 1;
- mip_offset += image->u.tex.first_layer * lp_res->img_stride[image->u.tex.level];
- } else
- jit_image->depth = u_minify(jit_image->depth, image->u.tex.level);
-
- 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 = lp_res->sample_stride;
- jit_image->base = (uint8_t *)jit_image->base + mip_offset;
- }
- else {
- unsigned view_blocksize = util_format_get_blocksize(image->format);
- jit_image->width = image->u.buf.size / view_blocksize;
- jit_image->base = (uint8_t *)jit_image->base + image->u.buf.offset;
- }
- }
+
+ llvmpipe_image_resource_get_params(image, &jit_image->width,
+ &jit_image->height, &jit_image->depth,
+ &jit_image->row_stride,
+ &jit_image->img_stride,
+ &jit_image->num_samples,
+ &jit_image->sample_stride,
+ &jit_image->base);
}
for (; i < ARRAY_SIZE(setup->images); i++) {
util_copy_image_view(&setup->images[i].current, NULL);
diff --git a/src/gallium/drivers/llvmpipe/lp_state_cs.c b/src/gallium/drivers/llvmpipe/lp_state_cs.c
index 3a437185ad6..9759513d8c6 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_cs.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_cs.c
@@ -1095,57 +1095,17 @@ lp_csctx_set_cs_images(struct lp_cs_context *csctx,
struct pipe_image_view *image = &images[i];
util_copy_image_view(&csctx->images[i].current, &images[i]);
- struct pipe_resource *res = image->resource;
- struct llvmpipe_resource *lp_res = llvmpipe_resource(res);
struct lp_jit_image *jit_image;
jit_image = &csctx->cs.current.jit_context.images[i];
- if (!lp_res)
- continue;
- if (!lp_res->dt) {
- /* regular texture - csctx array of mipmap level offsets */
- if (llvmpipe_resource_is_texture(res)) {
- jit_image->base = lp_res->tex_data;
- } else
- jit_image->base = lp_res->data;
-
- jit_image->width = res->width0;
- jit_image->height = res->height0;
- jit_image->depth = res->depth0;
- jit_image->num_samples = res->nr_samples;
-
- if (llvmpipe_resource_is_texture(res)) {
- uint32_t mip_offset = lp_res->mip_offsets[image->u.tex.level];
-
- jit_image->width = u_minify(jit_image->width, image->u.tex.level);
- jit_image->height = u_minify(jit_image->height, image->u.tex.level);
-
- if (res->target == PIPE_TEXTURE_1D_ARRAY ||
- res->target == PIPE_TEXTURE_2D_ARRAY ||
- res->target == PIPE_TEXTURE_3D ||
- res->target == PIPE_TEXTURE_CUBE ||
- res->target == PIPE_TEXTURE_CUBE_ARRAY) {
- /*
- * For array textures, we don't have first_layer, instead
- * adjust last_layer (stored as depth) plus the mip level offsets
- * (as we have mip-first layout can't just adjust base ptr).
- * XXX For mip levels, could do something similar.
- */
- jit_image->depth = image->u.tex.last_layer - image->u.tex.first_layer + 1;
- mip_offset += image->u.tex.first_layer * lp_res->img_stride[image->u.tex.level];
- } else
- jit_image->depth = u_minify(jit_image->depth, image->u.tex.level);
-
- 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 = lp_res->sample_stride;
- jit_image->base = (uint8_t *)jit_image->base + mip_offset;
- } else {
- unsigned view_blocksize = util_format_get_blocksize(image->format);
- jit_image->width = image->u.buf.size / view_blocksize;
- jit_image->base = (uint8_t *)jit_image->base + image->u.buf.offset;
- }
- }
+
+ llvmpipe_image_resource_get_params(image, &jit_image->width,
+ &jit_image->height, &jit_image->depth,
+ &jit_image->row_stride,
+ &jit_image->img_stride,
+ &jit_image->num_samples,
+ &jit_image->sample_stride,
+ &jit_image->base);
}
for (; i < ARRAY_SIZE(csctx->images); i++) {
util_copy_image_view(&csctx->images[i].current, NULL);
diff --git a/src/gallium/drivers/llvmpipe/lp_state_sampler.c b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
index f802af45f5a..db8dd8c62ea 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_sampler.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
@@ -419,54 +419,19 @@ prepare_shader_images(
struct pipe_image_view *view = i < num ? &views[i] : NULL;
if (view) {
+
+ unsigned width, height, num_layers, num_samples;
+ llvmpipe_image_resource_get_params(view, &width, &height,
+ &num_layers, &row_stride,
+ &img_stride, &num_samples,
+ &sample_stride, &addr);
struct pipe_resource *img = view->resource;
- struct llvmpipe_resource *lp_img = llvmpipe_resource(img);
if (!img)
continue;
- unsigned width = u_minify(img->width0, view->u.tex.level);
- unsigned height = u_minify(img->height0, view->u.tex.level);
- unsigned num_layers = img->depth0;
- unsigned num_samples = img->nr_samples;
-
- if (!lp_img->dt) {
- /* regular texture - setup array of mipmap level offsets */
- struct pipe_resource *res = view->resource;
-
- if (llvmpipe_resource_is_texture(res)) {
- uint32_t mip_offset = lp_img->mip_offsets[view->u.tex.level];
- addr = lp_img->tex_data;
-
- if (img->target == PIPE_TEXTURE_1D_ARRAY ||
- img->target == PIPE_TEXTURE_2D_ARRAY ||
- img->target == PIPE_TEXTURE_3D ||
- img->target == PIPE_TEXTURE_CUBE ||
- img->target == PIPE_TEXTURE_CUBE_ARRAY) {
- num_layers = view->u.tex.last_layer - view->u.tex.first_layer + 1;
- assert(view->u.tex.first_layer <= view->u.tex.last_layer);
- mip_offset += view->u.tex.first_layer * lp_img->img_stride[view->u.tex.level];
- }
-
- row_stride = lp_img->row_stride[view->u.tex.level];
- img_stride = lp_img->img_stride[view->u.tex.level];
- sample_stride = lp_img->sample_stride;
- addr = (uint8_t *)addr + mip_offset;
- }
- else {
- unsigned view_blocksize = util_format_get_blocksize(view->format);
- addr = lp_img->data;
- /* probably don't really need to fill that out */
- row_stride = 0;
- img_stride = 0;
- sample_stride = 0;
+ struct llvmpipe_resource *lp_img = llvmpipe_resource(img);
- /* everything specified in number of elements here. */
- width = view->u.buf.size / view_blocksize;
- addr = (uint8_t *)addr + view->u.buf.offset;
- assert(view->u.buf.offset + view->u.buf.size <= res->width0);
- }
- }
- else {
+ if (lp_img->dt) {
/* display target texture/surface */
/*
* XXX: Where should this be unmapped?
diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c
index e93b8a666ac..c4eda554576 100644
--- a/src/gallium/drivers/llvmpipe/lp_texture.c
+++ b/src/gallium/drivers/llvmpipe/lp_texture.c
@@ -942,3 +942,75 @@ llvmpipe_init_context_resource_funcs(struct pipe_context *pipe)
pipe->memory_barrier = llvmpipe_memory_barrier;
}
+
+bool
+llvmpipe_image_resource_get_params(struct pipe_image_view *iview,
+ uint32_t *width_p, uint32_t *height_p,
+ uint32_t *depth_p, uint32_t *row_stride_p,
+ uint32_t *img_stride_p, uint32_t *num_samples_p,
+ uint32_t *sample_stride_p, const void **base_p)
+{
+ struct pipe_resource *res = iview->resource;
+ struct llvmpipe_resource *lp_res = llvmpipe_resource(res);
+ void *base = NULL;
+ uint32_t width = 0, height = 0, depth = 0;
+ uint32_t row_stride = 0, img_stride = 0;
+ uint32_t num_samples = 0, sample_stride = 0;
+ if (!lp_res)
+ return false;
+
+ if (!lp_res->dt) {
+ /* regular driver resource */
+ if (llvmpipe_resource_is_texture(res))
+ base = lp_res->tex_data;
+ else
+ base = lp_res->data;
+
+ width = res->width0;
+ height = res->height0;
+ depth = res->depth0;
+ num_samples = res->nr_samples;
+
+ if (llvmpipe_resource_is_texture(res)) {
+ uint32_t level = iview->u.tex.level;
+ uint32_t mip_offset = lp_res->mip_offsets[level];
+
+ width = u_minify(width, level);
+ height = u_minify(height, level);
+
+ if (res->target == PIPE_TEXTURE_1D_ARRAY ||
+ res->target == PIPE_TEXTURE_2D_ARRAY ||
+ res->target == PIPE_TEXTURE_CUBE ||
+ res->target == PIPE_TEXTURE_CUBE_ARRAY) {
+ depth = iview->u.tex.last_layer - iview->u.tex.first_layer + 1;
+ mip_offset += iview->u.tex.first_layer * lp_res->img_stride[level];
+ } else if (res->target == PIPE_TEXTURE_3D) {
+ /* for a single layer 3D binding */
+ if (iview->u.tex.first_layer == iview->u.tex.last_layer && iview->u.tex.first_layer) {
+ depth = 1;
+ mip_offset += iview->u.tex.first_layer * lp_res->img_stride[level];
+ } else {
+ depth = u_minify(depth, level);
+ }
+ }
+ row_stride = lp_res->row_stride[level];
+ img_stride = lp_res->img_stride[level];
+ sample_stride = lp_res->sample_stride;
+ base = (uint8_t *)base + mip_offset;
+ } else {
+ unsigned view_blocksize = util_format_get_blocksize(iview->format);
+ width = iview->u.buf.size / view_blocksize;
+ base = (uint8_t *)base + iview->u.buf.offset;
+ }
+ }
+
+ *width_p = width;
+ *height_p = height;
+ *depth_p = depth;
+ *base_p = base;
+ *row_stride_p = row_stride;
+ *img_stride_p = img_stride;
+ *num_samples_p = num_samples;
+ *sample_stride_p = sample_stride;
+ return true;
+}
diff --git a/src/gallium/drivers/llvmpipe/lp_texture.h b/src/gallium/drivers/llvmpipe/lp_texture.h
index ba2cdffc878..abd5f86eeac 100644
--- a/src/gallium/drivers/llvmpipe/lp_texture.h
+++ b/src/gallium/drivers/llvmpipe/lp_texture.h
@@ -255,4 +255,11 @@ llvmpipe_transfer_map_ms( struct pipe_context *pipe,
unsigned sample,
const struct pipe_box *box,
struct pipe_transfer **transfer );
+
+bool
+llvmpipe_image_resource_get_params(struct pipe_image_view *iview,
+ uint32_t *width_p, uint32_t *height_p,
+ uint32_t *depth_p, uint32_t *row_stride_p,
+ uint32_t *img_stride_p, uint32_t *num_samples_p,
+ uint32_t *sample_stride_p, const void **base_p);
#endif /* LP_TEXTURE_H */