[Mesa-dev] [PATCH 2/3] llvmpipe: enable ARB_texture_view
Brian Paul
brianp at vmware.com
Wed May 13 07:32:54 PDT 2015
On 05/12/2015 08:36 PM, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> All the functionality was pretty much there, just not tested.
> Trivially fix up the missing pieces (take target info from view not
> resource), and add some missing bits for cubes.
> Also add some minimal debug validation to detect uninitialized target values
> in the view...
>
> 49 new piglits, 47 pass, 2 fail (both related to fake multisampling,
> not texture_view itself). No other piglit changes.
> ---
> src/gallium/auxiliary/gallivm/lp_bld_sample.c | 2 +-
> src/gallium/drivers/llvmpipe/lp_screen.c | 3 ++-
> src/gallium/drivers/llvmpipe/lp_setup.c | 36 ++++++++++++++++++++++---
> src/gallium/drivers/llvmpipe/lp_state_sampler.c | 36 ++++++++++++++++++++++---
> 4 files changed, 67 insertions(+), 10 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample.c b/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> index 5b22045..4befb3a 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample.c
> @@ -113,7 +113,7 @@ lp_sampler_static_texture_state(struct lp_static_texture_state *state,
> state->swizzle_b = view->swizzle_b;
> state->swizzle_a = view->swizzle_a;
>
> - state->target = texture->target;
> + state->target = view->target;
> state->pot_width = util_is_power_of_two(texture->width0);
> state->pot_height = util_is_power_of_two(texture->height0);
> state->pot_depth = util_is_power_of_two(texture->depth0);
> diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
> index f4ba596..e001e53 100644
> --- a/src/gallium/drivers/llvmpipe/lp_screen.c
> +++ b/src/gallium/drivers/llvmpipe/lp_screen.c
> @@ -258,8 +258,9 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
> case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
> return 1;
> case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
> - case PIPE_CAP_SAMPLER_VIEW_TARGET:
> return 0;
> + case PIPE_CAP_SAMPLER_VIEW_TARGET:
> + return 1;
> case PIPE_CAP_FAKE_SW_MSAA:
> return 1;
> case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
> diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
> index 96cc77c..4c57fab 100644
> --- a/src/gallium/drivers/llvmpipe/lp_setup.c
> +++ b/src/gallium/drivers/llvmpipe/lp_setup.c
> @@ -811,6 +811,32 @@ lp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
> */
> pipe_resource_reference(&setup->fs.current_tex[i], res);
>
> +#ifdef DEBUG
> + /* this is possibly too lenient */
> + if (view->target != res->target) {
> + if (view->target == PIPE_TEXTURE_1D)
> + assert(res->target == PIPE_TEXTURE_1D_ARRAY);
> + else if (view->target == PIPE_TEXTURE_1D_ARRAY)
> + assert(res->target == PIPE_TEXTURE_1D);
> + else if (view->target == PIPE_TEXTURE_2D)
> + assert(res->target == PIPE_TEXTURE_2D_ARRAY ||
> + res->target == PIPE_TEXTURE_CUBE ||
> + res->target == PIPE_TEXTURE_CUBE_ARRAY);
> + else if (view->target == PIPE_TEXTURE_2D_ARRAY)
> + assert(res->target == PIPE_TEXTURE_2D ||
> + res->target == PIPE_TEXTURE_CUBE ||
> + res->target == PIPE_TEXTURE_CUBE_ARRAY);
> + else if (view->target == PIPE_TEXTURE_CUBE)
> + assert(res->target == PIPE_TEXTURE_CUBE_ARRAY ||
> + res->target == PIPE_TEXTURE_2D_ARRAY);
> + else if (view->target == PIPE_TEXTURE_CUBE_ARRAY)
> + assert(res->target == PIPE_TEXTURE_CUBE ||
> + res->target == PIPE_TEXTURE_2D_ARRAY);
> + else
> + assert(0);
> + }
> +#endif
> +
> if (!lp_tex->dt) {
> /* regular texture - setup array of mipmap level offsets */
> int j;
> @@ -854,9 +880,10 @@ lp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
> jit_tex->img_stride[j] = lp_tex->img_stride[j];
> }
>
> - if (res->target == PIPE_TEXTURE_1D_ARRAY ||
> - res->target == PIPE_TEXTURE_2D_ARRAY ||
> - res->target == PIPE_TEXTURE_CUBE_ARRAY) {
> + if (view->target == PIPE_TEXTURE_1D_ARRAY ||
> + view->target == PIPE_TEXTURE_2D_ARRAY ||
> + view->target == PIPE_TEXTURE_CUBE ||
> + view->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
> @@ -868,7 +895,8 @@ lp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
> jit_tex->mip_offsets[j] += view->u.tex.first_layer *
> lp_tex->img_stride[j];
> }
> - if (res->target == PIPE_TEXTURE_CUBE_ARRAY) {
> + if (view->target == PIPE_TEXTURE_CUBE ||
> + view->target == PIPE_TEXTURE_CUBE_ARRAY) {
> assert(jit_tex->depth % 6 == 0);
> }
> assert(view->u.tex.first_layer <= view->u.tex.last_layer);
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_sampler.c b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
> index 21da629..a9d0cd1 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_sampler.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
> @@ -228,6 +228,32 @@ prepare_shader_sampling(
> */
> pipe_resource_reference(&mapped_tex[i], tex);
>
> +#ifdef DEBUG
> + /* this is possibly too lenient */
> + if (view->target != tex->target) {
> + if (view->target == PIPE_TEXTURE_1D)
> + assert(tex->target == PIPE_TEXTURE_1D_ARRAY);
> + else if (view->target == PIPE_TEXTURE_1D_ARRAY)
> + assert(tex->target == PIPE_TEXTURE_1D);
> + else if (view->target == PIPE_TEXTURE_2D)
> + assert(tex->target == PIPE_TEXTURE_2D_ARRAY ||
> + tex->target == PIPE_TEXTURE_CUBE ||
> + tex->target == PIPE_TEXTURE_CUBE_ARRAY);
> + else if (view->target == PIPE_TEXTURE_2D_ARRAY)
> + assert(tex->target == PIPE_TEXTURE_2D ||
> + tex->target == PIPE_TEXTURE_CUBE ||
> + tex->target == PIPE_TEXTURE_CUBE_ARRAY);
> + else if (view->target == PIPE_TEXTURE_CUBE)
> + assert(tex->target == PIPE_TEXTURE_CUBE_ARRAY ||
> + tex->target == PIPE_TEXTURE_2D_ARRAY);
> + else if (view->target == PIPE_TEXTURE_CUBE_ARRAY)
> + assert(tex->target == PIPE_TEXTURE_CUBE ||
> + tex->target == PIPE_TEXTURE_2D_ARRAY);
> + else
> + assert(0);
> + }
> +#endif
How about putting these assertions into a function to avoid duplication
with the other ones earlier? Are they also useful for softpipe?
Otherwise,
Reviewed-by: Brian Paul <brianp at vmware.com>
> +
> if (!lp_tex->dt) {
> /* regular texture - setup array of mipmap level offsets */
> struct pipe_resource *res = view->texture;
> @@ -245,15 +271,17 @@ prepare_shader_sampling(
> row_stride[j] = lp_tex->row_stride[j];
> img_stride[j] = lp_tex->img_stride[j];
> }
> - if (res->target == PIPE_TEXTURE_1D_ARRAY ||
> - res->target == PIPE_TEXTURE_2D_ARRAY ||
> - res->target == PIPE_TEXTURE_CUBE_ARRAY) {
> + if (view->target == PIPE_TEXTURE_1D_ARRAY ||
> + view->target == PIPE_TEXTURE_2D_ARRAY ||
> + view->target == PIPE_TEXTURE_CUBE ||
> + view->target == PIPE_TEXTURE_CUBE_ARRAY) {
> num_layers = view->u.tex.last_layer - view->u.tex.first_layer + 1;
> for (j = first_level; j <= last_level; j++) {
> mip_offsets[j] += view->u.tex.first_layer *
> lp_tex->img_stride[j];
> }
> - if (res->target == PIPE_TEXTURE_CUBE_ARRAY) {
> + if (view->target == PIPE_TEXTURE_CUBE ||
> + view->target == PIPE_TEXTURE_CUBE_ARRAY) {
> assert(num_layers % 6 == 0);
> }
> assert(view->u.tex.first_layer <= view->u.tex.last_layer);
>
More information about the mesa-dev
mailing list