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); + 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; + 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; + 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