Interesting it doesn't work with llvmpipe, I thought there were tests
for this using some other state tracker...
My guess is that (for llvmpipe) in prepare_shader_sampling() and
lp_setup_set_fragment_sampler_views() we miss adjusting the mip offsets
since we only do that if it's an array target, but this is based on
view->target and not tex->target...

Roland


Am 16.10.2015 um 01:53 schrieb Glenn Kennard:
> Signed-off-by: Glenn Kennard <glenn.kenn...@gmail.com>
> ---
> See also additional texture view piglit test case posted to piglit ml,
> which tests cases with layer>0. Notably softpipe and llvmpipe fail that
> case but i965/hsw, nv50/nvc0 and r600g pass.
> 
>  docs/GL3.txt                               |  2 +-
>  docs/relnotes/11.1.0.html                  |  1 +
>  src/gallium/drivers/r600/evergreen_state.c | 23 +++++++++++++++++------
>  src/gallium/drivers/r600/r600_pipe.c       |  2 +-
>  4 files changed, 20 insertions(+), 8 deletions(-)
> 
> diff --git a/docs/GL3.txt b/docs/GL3.txt
> index 6503e2a..c03a574 100644
> --- a/docs/GL3.txt
> +++ b/docs/GL3.txt
> @@ -169,7 +169,7 @@ GL 4.3, GLSL 4.30:
>    GL_ARB_texture_buffer_range                          DONE (nv50, nvc0, 
> i965, r600, radeonsi, llvmpipe)
>    GL_ARB_texture_query_levels                          DONE (all drivers 
> that support GLSL 1.30)
>    GL_ARB_texture_storage_multisample                   DONE (all drivers 
> that support GL_ARB_texture_multisample)
> -  GL_ARB_texture_view                                  DONE (i965, nv50, 
> nvc0, llvmpipe, softpipe)
> +  GL_ARB_texture_view                                  DONE (i965, nv50, 
> nvc0, r600, llvmpipe, softpipe)
>    GL_ARB_vertex_attrib_binding                         DONE (all drivers)
>  
>  
> diff --git a/docs/relnotes/11.1.0.html b/docs/relnotes/11.1.0.html
> index dcf425e..cb8715c 100644
> --- a/docs/relnotes/11.1.0.html
> +++ b/docs/relnotes/11.1.0.html
> @@ -53,6 +53,7 @@ Note: some of the new features are only available with 
> certain drivers.
>  <li>GL_ARB_texture_query_lod on softpipe</li>
>  <li>EGL_KHR_create_context on softpipe, llvmpipe</li>
>  <li>EGL_KHR_gl_colorspace on softpipe, llvmpipe</li>
> +<li>GL_ARB_texture_view on r600 for Evergreen and later chips</li>
>  </ul>
>  
>  <h2>Bug fixes</h2>
> diff --git a/src/gallium/drivers/r600/evergreen_state.c 
> b/src/gallium/drivers/r600/evergreen_state.c
> index c6702a9..60747d1 100644
> --- a/src/gallium/drivers/r600/evergreen_state.c
> +++ b/src/gallium/drivers/r600/evergreen_state.c
> @@ -666,6 +666,7 @@ evergreen_create_sampler_view_custom(struct pipe_context 
> *ctx,
>       enum pipe_format pipe_format = state->format;
>       struct radeon_surf_level *surflevel;
>       unsigned base_level, first_level, last_level;
> +     unsigned dim, last_layer;
>       uint64_t va;
>  
>       if (view == NULL)
> @@ -679,7 +680,7 @@ evergreen_create_sampler_view_custom(struct pipe_context 
> *ctx,
>       view->base.reference.count = 1;
>       view->base.context = ctx;
>  
> -     if (texture->target == PIPE_BUFFER)
> +     if (state->target == PIPE_BUFFER)
>               return texture_buffer_sampler_view(rctx, view, width0, height0);
>  
>       swizzle[0] = state->swizzle_r;
> @@ -773,12 +774,12 @@ evergreen_create_sampler_view_custom(struct 
> pipe_context *ctx,
>       }
>       nbanks = eg_num_banks(rscreen->b.tiling_info.num_banks);
>  
> -     if (texture->target == PIPE_TEXTURE_1D_ARRAY) {
> +     if (state->target == PIPE_TEXTURE_1D_ARRAY) {
>               height = 1;
>               depth = texture->array_size;
> -     } else if (texture->target == PIPE_TEXTURE_2D_ARRAY) {
> +     } else if (state->target == PIPE_TEXTURE_2D_ARRAY) {
>               depth = texture->array_size;
> -     } else if (texture->target == PIPE_TEXTURE_CUBE_ARRAY)
> +     } else if (state->target == PIPE_TEXTURE_CUBE_ARRAY)
>               depth = texture->array_size / 6;
>  
>       va = tmp->resource.gpu_address;
> @@ -790,7 +791,13 @@ evergreen_create_sampler_view_custom(struct pipe_context 
> *ctx,
>               view->is_stencil_sampler = true;
>  
>       view->tex_resource = &tmp->resource;
> -     view->tex_resource_words[0] = 
> (S_030000_DIM(r600_tex_dim(texture->target, texture->nr_samples)) |
> +
> +     /* array type views and views into array types need to use layer offset 
> */
> +     dim = state->target;
> +     if (state->target != PIPE_TEXTURE_CUBE)
> +             dim = MAX2(state->target, texture->target);
> +
> +     view->tex_resource_words[0] = (S_030000_DIM(r600_tex_dim(dim, 
> texture->nr_samples)) |
>                                      S_030000_PITCH((pitch / 8) - 1) |
>                                      S_030000_TEX_WIDTH(width - 1));
>       if (rscreen->b.chip_class == CAYMAN)
> @@ -818,10 +825,14 @@ evergreen_create_sampler_view_custom(struct 
> pipe_context *ctx,
>               view->tex_resource_words[3] = (surflevel[base_level].offset + 
> va) >> 8;
>       }
>  
> +     last_layer = state->u.tex.last_layer;
> +     if (state->target != texture->target && depth == 1) {
> +             last_layer = state->u.tex.first_layer;
> +     }
>       view->tex_resource_words[4] = (word4 |
>                                      S_030010_ENDIAN_SWAP(endian));
>       view->tex_resource_words[5] = 
> S_030014_BASE_ARRAY(state->u.tex.first_layer) |
> -                                   
> S_030014_LAST_ARRAY(state->u.tex.last_layer);
> +                                   S_030014_LAST_ARRAY(last_layer);
>       view->tex_resource_words[6] = S_030018_TILE_SPLIT(tile_split);
>  
>       if (texture->nr_samples > 1) {
> diff --git a/src/gallium/drivers/r600/r600_pipe.c 
> b/src/gallium/drivers/r600/r600_pipe.c
> index 32ce76a..c5da44d 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -323,6 +323,7 @@ static int r600_get_param(struct pipe_screen* pscreen, 
> enum pipe_cap param)
>       case PIPE_CAP_TEXTURE_GATHER_SM5:
>       case PIPE_CAP_TEXTURE_QUERY_LOD:
>       case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
> +     case PIPE_CAP_SAMPLER_VIEW_TARGET:
>               return family >= CHIP_CEDAR ? 1 : 0;
>       case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
>               return family >= CHIP_CEDAR ? 4 : 0;
> @@ -338,7 +339,6 @@ static int r600_get_param(struct pipe_screen* pscreen, 
> enum pipe_cap param)
>       case PIPE_CAP_VERTEX_COLOR_CLAMPED:
>       case PIPE_CAP_USER_VERTEX_BUFFERS:
>       case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
> -     case PIPE_CAP_SAMPLER_VIEW_TARGET:
>       case PIPE_CAP_VERTEXID_NOBASE:
>       case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
>       case PIPE_CAP_DEPTH_BOUNDS_TEST:
> 

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to