On Thu, Oct 15, 2015 at 7:53 PM, Glenn Kennard <glenn.kenn...@gmail.com> wrote: > 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)
Not sure, but I'd guess things would have to be pretty messed up if texture->target == buffer, but state->target == not buffer. I'd throw in an assert actually. > 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; Not sure where depth is used, but doesn't this need to take first/last layer into account? Does textureSize() return the right thing for these? I guess there's no piglit for that either. > - } 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: > -- > 1.9.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev