diff options
author | Rob Clark <[email protected]> | 2019-02-19 08:51:30 -0500 |
---|---|---|
committer | Rob Clark <[email protected]> | 2019-02-20 18:50:08 -0500 |
commit | 8c486083d0c132c42e4ad750ebb2fd0f3d5fa2d6 (patch) | |
tree | 900dc2c4a2c3c52bfaa66c7a5177fa7593d2daaf /src/gallium/drivers/freedreno | |
parent | 97479df8aaf6f00ebc70da452ea43e04f829ef2f (diff) |
freedreno/a6xx: 3d and cube image fixes
Fixes dEQP-GLES31.functional.image_load_store.{3d,cube}.store.*
and a bunch more
Signed-off-by: Rob Clark <[email protected]>
Diffstat (limited to 'src/gallium/drivers/freedreno')
-rw-r--r-- | src/gallium/drivers/freedreno/a6xx/fd6_image.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_image.c b/src/gallium/drivers/freedreno/a6xx/fd6_image.c index 153c00435f6..e7874139bec 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_image.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_image.c @@ -85,14 +85,39 @@ static void translate_image(struct fd6_image *img, const struct pipe_image_view img->depth = 0; } else { img->buffer = false; + unsigned lvl = pimg->u.tex.level; - img->offset = rsc->slices[lvl].offset; + unsigned layers = pimg->u.tex.last_layer - pimg->u.tex.first_layer + 1; + + img->offset = fd_resource_offset(rsc, lvl, pimg->u.tex.first_layer); img->pitch = rsc->slices[lvl].pitch * rsc->cpp; - img->array_pitch = rsc->layer_size; + + switch (prsc->target) { + case PIPE_TEXTURE_RECT: + case PIPE_TEXTURE_1D: + case PIPE_TEXTURE_2D: + img->array_pitch = rsc->layer_size; + img->depth = 1; + break; + case PIPE_TEXTURE_1D_ARRAY: + case PIPE_TEXTURE_2D_ARRAY: + case PIPE_TEXTURE_CUBE: + case PIPE_TEXTURE_CUBE_ARRAY: + img->array_pitch = rsc->layer_size; + // TODO the CUBE/CUBE_ARRAY might need to be layers/6 for tex state, + // but empirically for ibo state it shouldn't be divided. + img->depth = layers; + break; + case PIPE_TEXTURE_3D: + img->array_pitch = rsc->slices[lvl].size0; + img->depth = u_minify(prsc->depth0, lvl); + break; + default: + break; + } img->width = u_minify(prsc->width0, lvl); img->height = u_minify(prsc->height0, lvl); - img->depth = u_minify(prsc->depth0, lvl); } } @@ -132,9 +157,11 @@ static void translate_buf(struct fd6_image *img, const struct pipe_shader_buffer static void emit_image_tex(struct fd_ringbuffer *ring, struct fd6_image *img) { + debug_assert(fd_resource(img->prsc)->tile_mode == 0); + OUT_RING(ring, A6XX_TEX_CONST_0_FMT(img->fmt) | A6XX_TEX_CONST_0_TILE_MODE(fd_resource(img->prsc)->tile_mode) | - fd6_tex_swiz(img->prsc, img->fmt, PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y, + fd6_tex_swiz(img->prsc, img->pfmt, PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y, PIPE_SWIZZLE_Z, PIPE_SWIZZLE_W) | COND(img->srgb, A6XX_TEX_CONST_0_SRGB)); OUT_RING(ring, A6XX_TEX_CONST_1_WIDTH(img->width) | |