On Tue, Apr 12, 2016 at 7:56 PM, Samuel Pitoiset <samuel.pitoi...@gmail.com> wrote: > Loosely based on softpipe but with some changes, this computes correct > width, height and depth of different targets to help in processing > coordinates from the codegen part. > > This fixes a ton of dEQP/piglit tests. > > Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> > --- > src/gallium/drivers/nouveau/nvc0/nvc0_tex.c | 52 > +++++++++++++++++++++++++++-- > 1 file changed, 49 insertions(+), 3 deletions(-) > > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c > b/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c > index 7cac31d..fa89324 100644 > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_tex.c > @@ -743,6 +743,49 @@ static const uint8_t > nve4_su_format_map[PIPE_FORMAT_COUNT]; > static const uint16_t nve4_su_format_aux_map[PIPE_FORMAT_COUNT]; > static const uint16_t nve4_suldp_lib_offset[PIPE_FORMAT_COUNT]; > > +static void > +nvc0_get_surface_dims(struct pipe_image_view *view, int *width, int *height, > + int *depth) > +{ > + struct nv04_resource *res = nv04_resource(view->resource); > + int level; > + > + *width = *height = *depth = 1; > + if (res->base.target == PIPE_BUFFER) { > + *width = view->u.buf.last_element - view->u.buf.first_element + 1; > + return; > + } > + > + level = view->u.tex.level; > + *width = u_minify(view->resource->width0, level);
You can safely do *height = u_minify(view->resource->height0, level); here and be just fine. height0 will be 1 for 1d textures. This should simplify the switch below as well. > + switch (res->base.target) { > + case PIPE_TEXTURE_1D_ARRAY: > + *depth = view->u.tex.last_layer - view->u.tex.first_layer + 1; > + /* fallthrough */ > + case PIPE_TEXTURE_1D: > + break; > + case PIPE_TEXTURE_CUBE: > + case PIPE_TEXTURE_2D_ARRAY: > + *depth = view->u.tex.last_layer - view->u.tex.first_layer + 1; > + /* fallthrough */ > + case PIPE_TEXTURE_2D: > + case PIPE_TEXTURE_RECT: > + *height = u_minify(view->resource->height0, level); > + break; > + case PIPE_TEXTURE_3D: > + *height = u_minify(view->resource->height0, level); > + *depth = u_minify(view->resource->depth0, level); > + break; > + case PIPE_TEXTURE_CUBE_ARRAY: > + *height = u_minify(view->resource->height0, level); > + *depth = (view->u.tex.last_layer - view->u.tex.first_layer + 1) / 6; Are you sure? A cube array will be presented as, effectively, a 2d array... Same with cube above. I think for those, depth should be 6... > + break; > + default: > + assert(!"unexpected texture target"); > + break; > + } > +} > + > void > nve4_set_surface_info(struct nouveau_pushbuf *push, > struct pipe_image_view *view, > @@ -772,9 +815,8 @@ nve4_set_surface_info(struct nouveau_pushbuf *push, > > address = res->address; > > - width = u_minify(view->resource->width0, view->u.tex.level); > - height = u_minify(view->resource->height0, view->u.tex.level); > - depth = u_minify(view->resource->depth0, view->u.tex.level); > + /* get surface dimensions based on the target. */ > + nvc0_get_surface_dims(view, &width, &height, &depth); > > info[8] = width; > info[9] = height; > @@ -848,6 +890,10 @@ nve4_set_surface_info(struct nouveau_pushbuf *push, > address += mt->layer_stride * z; > } > } > + > + if (res->base.target == PIPE_TEXTURE_CUBE_ARRAY) > + depth = view->u.tex.last_layer - view->u.tex.first_layer + 1; You partially fix this up here, but I think that depth should be / 6 in the one place that needs that. Most places will want the full layer "span". Also note that the resource's target is irrelevant with texture views. I might have created a 2d array, and cast it as a cube array. I don't think anything's different as far as images are concerned. -ilia > + > info[0] = address >> 8; > info[2] = width - 1; > /* NOTE: this is really important: */ > -- > 2.8.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev