From: Eric Anholt Date: Tue, 6 Jan 2015 21:35:21 +0000 (-0800) Subject: vc4: Add miptree/texture state support for ETC1 compressed textures. X-Git-Tag: upstream/17.1.0~4971 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=80157466cd56bfaeadbdcac497b04c16c2732a3b;p=platform%2Fupstream%2Fmesa.git vc4: Add miptree/texture state support for ETC1 compressed textures. The format isn't flagged as enabled at runtime yet, because we need kernel validation support. --- diff --git a/src/gallium/drivers/vc4/kernel/vc4_validate.c b/src/gallium/drivers/vc4/kernel/vc4_validate.c index 4ef0110..a9dce1f 100644 --- a/src/gallium/drivers/vc4/kernel/vc4_validate.c +++ b/src/gallium/drivers/vc4/kernel/vc4_validate.c @@ -640,6 +640,13 @@ reloc_tex(struct vc4_exec_info *exec, cpp = 1; break; case VC4_TEXTURE_TYPE_ETC1: + /* ETC1 is arranged as 64-bit blocks, where each block is 4x4 + * pixels. + */ + cpp = 8; + width = (width + 3) >> 2; + height = (height + 3) >> 2; + break; case VC4_TEXTURE_TYPE_BW1: case VC4_TEXTURE_TYPE_A4: case VC4_TEXTURE_TYPE_A1: diff --git a/src/gallium/drivers/vc4/vc4_formats.c b/src/gallium/drivers/vc4/vc4_formats.c index dd700cd..42cdad1 100644 --- a/src/gallium/drivers/vc4/vc4_formats.c +++ b/src/gallium/drivers/vc4/vc4_formats.c @@ -83,6 +83,8 @@ static const struct vc4_format vc4_format_table[] = { FORMAT(B5G6R5_UNORM, RGB565, RGB565, SWIZ(X, Y, Z, 1)), + FORMAT(ETC1_RGB8, NO, ETC1, SWIZ(X, Y, Z, 1)), + /* Depth sampling will be handled by doing nearest filtering and not * unpacking the RGBA value. */ diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c index 704cd71..e4784ff 100644 --- a/src/gallium/drivers/vc4/vc4_resource.c +++ b/src/gallium/drivers/vc4/vc4_resource.c @@ -283,6 +283,20 @@ vc4_resource_transfer_map(struct pipe_context *pctx, if (usage & PIPE_TRANSFER_MAP_DIRECTLY) return NULL; + if (format == PIPE_FORMAT_ETC1_RGB8) { + /* ETC1 is arranged as 64-bit blocks, where each block + * is 4x4 pixels. Texture tiling operates on the + * 64-bit block the way it would an uncompressed + * pixels. + */ + assert(!(ptrans->box.x & 3)); + assert(!(ptrans->box.y & 3)); + ptrans->box.x >>= 2; + ptrans->box.y >>= 2; + ptrans->box.width = (ptrans->box.width + 3) >> 2; + ptrans->box.height = (ptrans->box.height + 3) >> 2; + } + /* We need to align the box to utile boundaries, since that's * what load/store operates on. This may cause us to need to * read out the original contents in that border area. Right @@ -387,6 +401,11 @@ vc4_setup_slices(struct vc4_resource *rsc) struct pipe_resource *prsc = &rsc->base.b; uint32_t width = prsc->width0; uint32_t height = prsc->height0; + if (prsc->format == PIPE_FORMAT_ETC1_RGB8) { + width = (width + 3) >> 2; + height = (height + 3) >> 2; + } + uint32_t pot_width = util_next_power_of_two(width); uint32_t pot_height = util_next_power_of_two(height); uint32_t offset = 0; diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c index 0f9ba54..9aa80ca 100644 --- a/src/gallium/drivers/vc4/vc4_screen.c +++ b/src/gallium/drivers/vc4/vc4_screen.c @@ -486,7 +486,8 @@ vc4_screen_is_format_supported(struct pipe_screen *pscreen, } if ((usage & PIPE_BIND_SAMPLER_VIEW) && - vc4_tex_format_supported(format)) { + vc4_tex_format_supported(format) && + format != PIPE_FORMAT_ETC1_RGB8) { retval |= PIPE_BIND_SAMPLER_VIEW; } diff --git a/src/gallium/drivers/vc4/vc4_state.c b/src/gallium/drivers/vc4/vc4_state.c index 1247158..5403c34 100644 --- a/src/gallium/drivers/vc4/vc4_state.c +++ b/src/gallium/drivers/vc4/vc4_state.c @@ -615,6 +615,9 @@ vc4_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *prsc, VC4_SET_FIELD(prsc->height0 & 2047, VC4_TEX_P1_HEIGHT) | VC4_SET_FIELD(prsc->width0 & 2047, VC4_TEX_P1_WIDTH)); + if (prsc->format == PIPE_FORMAT_ETC1_RGB8) + so->texture_p1 |= VC4_TEX_P1_ETCFLIP_MASK; + return &so->base; }