diff options
author | Dave Airlie <airlied@redhat.com> | 2020-06-19 16:46:18 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2020-07-27 13:48:11 +1000 |
commit | 8447e1465b8ed782e8ec86202135ef768a0e806a (patch) | |
tree | 936db811ebf1a316fcc27c68faecea4e2f3daad2 | |
parent | 7e10310a7595fb4253c7b69aafe5452040c404f3 (diff) |
llvmpipe: refactor out some texture/image param
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_setup.c | 57 | ||||
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_state_cs.c | 56 | ||||
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_state_sampler.c | 51 | ||||
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_texture.c | 72 | ||||
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_texture.h | 7 |
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 */ |