From d819d4b34442a5b7663234bd08f117e7b3fb5ca2 Mon Sep 17 00:00:00 2001 From: Jonathan Marek Date: Fri, 9 Aug 2019 16:27:47 -0400 Subject: [PATCH] etnaviv: separate PE and RS formats, use only RS only for tiling There are PE formats not supported by RS, so we can't have a single to translate both. Use RS only for same formats until we have a translate_rs_format and test the possible different format blits. Signed-off-by: Jonathan Marek Reviewed-by: Christian Gmeiner --- src/gallium/drivers/etnaviv/etnaviv_blend.c | 4 +- src/gallium/drivers/etnaviv/etnaviv_context.c | 2 +- src/gallium/drivers/etnaviv/etnaviv_format.c | 36 ++++++++--------- src/gallium/drivers/etnaviv/etnaviv_format.h | 4 +- src/gallium/drivers/etnaviv/etnaviv_rs.c | 40 +++++++++++++------ src/gallium/drivers/etnaviv/etnaviv_screen.c | 2 +- src/gallium/drivers/etnaviv/etnaviv_state.c | 2 +- .../drivers/etnaviv/etnaviv_translate.h | 20 +--------- 8 files changed, 54 insertions(+), 56 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_blend.c b/src/gallium/drivers/etnaviv/etnaviv_blend.c index 1f57499e454..b9a7c0373d5 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_blend.c +++ b/src/gallium/drivers/etnaviv/etnaviv_blend.c @@ -123,7 +123,7 @@ etna_update_blend(struct etna_context *ctx) uint32_t colormask; if (pfb->cbufs[0] && - translate_rs_format_rb_swap(pfb->cbufs[0]->format)) { + translate_pe_format_rb_swap(pfb->cbufs[0]->format)) { colormask = rt0->colormask & (PIPE_MASK_A | PIPE_MASK_G); if (rt0->colormask & PIPE_MASK_R) colormask |= PIPE_MASK_B; @@ -164,7 +164,7 @@ etna_update_blend_color(struct etna_context *ctx) { struct pipe_framebuffer_state *pfb = &ctx->framebuffer_s; struct compiled_blend_color *cs = &ctx->blend_color; - bool rb_swap = (pfb->cbufs[0] && translate_rs_format_rb_swap(pfb->cbufs[0]->format)); + bool rb_swap = (pfb->cbufs[0] && translate_pe_format_rb_swap(pfb->cbufs[0]->format)); cs->PE_ALPHA_BLEND_COLOR = VIVS_PE_ALPHA_BLEND_COLOR_R(etna_cfloat_to_uint8(cs->color[rb_swap ? 2 : 0])) | diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c index 06b634d0966..97eab014b56 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_context.c +++ b/src/gallium/drivers/etnaviv/etnaviv_context.c @@ -255,7 +255,7 @@ etna_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) }; if (pfb->cbufs[0]) - key.frag_rb_swap = !!translate_rs_format_rb_swap(pfb->cbufs[0]->format); + key.frag_rb_swap = !!translate_pe_format_rb_swap(pfb->cbufs[0]->format); if (!etna_get_vs(ctx, key) || !etna_get_fs(ctx, key)) { BUG("compiled shaders are not okay"); diff --git a/src/gallium/drivers/etnaviv/etnaviv_format.c b/src/gallium/drivers/etnaviv/etnaviv_format.c index de3121e568a..d95302de8ef 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_format.c +++ b/src/gallium/drivers/etnaviv/etnaviv_format.c @@ -39,19 +39,19 @@ struct etna_format { unsigned vtx; unsigned tex; - unsigned rs; + unsigned pe; bool present; const unsigned char tex_swiz[4]; }; -#define RS_FORMAT_NONE ~0 +#define PE_FORMAT_NONE ~0 -#define RS_FORMAT_MASK 0xf -#define RS_FORMAT(x) ((x) & RS_FORMAT_MASK) -#define RS_FORMAT_RB_SWAP 0x10 +#define PE_FORMAT_MASK 0x7f +#define PE_FORMAT(x) ((x) & PE_FORMAT_MASK) +#define PE_FORMAT_RB_SWAP 0x80 -#define RS_FORMAT_X8B8G8R8 (RS_FORMAT_X8R8G8B8 | RS_FORMAT_RB_SWAP) -#define RS_FORMAT_A8B8G8R8 (RS_FORMAT_A8R8G8B8 | RS_FORMAT_RB_SWAP) +#define PE_FORMAT_X8B8G8R8 (PE_FORMAT_X8R8G8B8 | PE_FORMAT_RB_SWAP) +#define PE_FORMAT_A8B8G8R8 (PE_FORMAT_A8R8G8B8 | PE_FORMAT_RB_SWAP) #define TS_SAMPLER_FORMAT_NONE ETNA_NO_MATCH @@ -67,7 +67,7 @@ struct etna_format { [PIPE_FORMAT_##pipe] = { \ .vtx = FE_DATA_TYPE_##vtxfmt, \ .tex = TEXTURE_FORMAT_##texfmt, \ - .rs = RS_FORMAT_##rsfmt, \ + .pe = PE_FORMAT_##rsfmt, \ .present = 1, \ .tex_swiz = texswiz, \ } @@ -77,7 +77,7 @@ struct etna_format { [PIPE_FORMAT_##pipe] = { \ .vtx = ETNA_NO_MATCH, \ .tex = TEXTURE_FORMAT_##fmt, \ - .rs = RS_FORMAT_##rsfmt, \ + .pe = PE_FORMAT_##rsfmt, \ .present = 1, \ .tex_swiz = swiz, \ } @@ -87,7 +87,7 @@ struct etna_format { [PIPE_FORMAT_##pipe] = { \ .vtx = FE_DATA_TYPE_##fmt, \ .tex = ETNA_NO_MATCH, \ - .rs = RS_FORMAT_##rsfmt, \ + .pe = PE_FORMAT_##rsfmt, \ .present = 1, \ } @@ -118,7 +118,7 @@ static struct etna_format formats[PIPE_FORMAT_COUNT] = { _T(L8A8_UNORM, A8L8, SWIZ(X, Y, Z, W), NONE), - _T(Z16_UNORM, D16, SWIZ(X, Y, Z, W), A4R4G4B4), + _T(Z16_UNORM, D16, SWIZ(X, Y, Z, W), NONE), _T(B5G6R5_UNORM, R5G6B5, SWIZ(X, Y, Z, W), R5G6B5), _T(B5G5R5A1_UNORM, A1R5G5B5, SWIZ(X, Y, Z, W), A1R5G5B5), _T(B5G5R5X1_UNORM, X1R5G5B5, SWIZ(X, Y, Z, W), X1R5G5B5), @@ -176,8 +176,8 @@ static struct etna_format formats[PIPE_FORMAT_COUNT] = { V_(R10G10B10A2_USCALED, UNSIGNED_INT_10_10_10_2, NONE), V_(R10G10B10A2_SSCALED, INT_10_10_10_2, NONE), - _T(X8Z24_UNORM, D24X8, SWIZ(X, Y, Z, W), A8R8G8B8), - _T(S8_UINT_Z24_UNORM, D24X8, SWIZ(X, Y, Z, W), A8R8G8B8), + _T(X8Z24_UNORM, D24X8, SWIZ(X, Y, Z, W), NONE), + _T(S8_UINT_Z24_UNORM, D24X8, SWIZ(X, Y, Z, W), NONE), /* 48-bit */ V_(R16G16B16_UNORM, UNSIGNED_SHORT, NONE), @@ -330,23 +330,23 @@ get_texture_swiz(enum pipe_format fmt, unsigned swizzle_r, } uint32_t -translate_rs_format(enum pipe_format fmt) +translate_pe_format(enum pipe_format fmt) { if (!formats[fmt].present) return ETNA_NO_MATCH; - if (formats[fmt].rs == ETNA_NO_MATCH) + if (formats[fmt].pe == ETNA_NO_MATCH) return ETNA_NO_MATCH; - return RS_FORMAT(formats[fmt].rs); + return PE_FORMAT(formats[fmt].pe); } int -translate_rs_format_rb_swap(enum pipe_format fmt) +translate_pe_format_rb_swap(enum pipe_format fmt) { assert(formats[fmt].present); - return formats[fmt].rs & RS_FORMAT_RB_SWAP; + return formats[fmt].pe & PE_FORMAT_RB_SWAP; } /* Return type flags for vertex element format */ diff --git a/src/gallium/drivers/etnaviv/etnaviv_format.h b/src/gallium/drivers/etnaviv/etnaviv_format.h index 45b15370812..db3d8b970d1 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_format.h +++ b/src/gallium/drivers/etnaviv/etnaviv_format.h @@ -45,10 +45,10 @@ get_texture_swiz(enum pipe_format fmt, unsigned swizzle_r, unsigned swizzle_g, unsigned swizzle_b, unsigned swizzle_a); uint32_t -translate_rs_format(enum pipe_format fmt); +translate_pe_format(enum pipe_format fmt); int -translate_rs_format_rb_swap(enum pipe_format fmt); +translate_pe_format_rb_swap(enum pipe_format fmt); uint32_t translate_vertex_format_type(enum pipe_format fmt); diff --git a/src/gallium/drivers/etnaviv/etnaviv_rs.c b/src/gallium/drivers/etnaviv/etnaviv_rs.c index 55ff80dbcd9..52251150787 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_rs.c +++ b/src/gallium/drivers/etnaviv/etnaviv_rs.c @@ -50,6 +50,21 @@ #include +/* return a RS "compatible" format for use when copying */ +static uint32_t +etna_compatible_rs_format(enum pipe_format fmt) +{ + /* YUYV and UYVY are blocksize 4, but 2 bytes per pixel */ + if (fmt == PIPE_FORMAT_YUYV || fmt == PIPE_FORMAT_UYVY) + return RS_FORMAT_A4R4G4B4; + + switch (util_format_get_blocksize(fmt)) { + case 2: return RS_FORMAT_A4R4G4B4; + case 4: return RS_FORMAT_A8R8G8B8; + default: return ETNA_NO_MATCH; + } +} + void etna_compile_rs_state(struct etna_context *ctx, struct compiled_rs_state *cs, const struct rs_state *rs) @@ -602,18 +617,19 @@ etna_try_rs_blit(struct pipe_context *pctx, return false; } - unsigned src_format = blit_info->src.format; - unsigned dst_format = blit_info->dst.format; + /* Only support same format (used tiling/detiling) blits for now. + * TODO: figure out which different-format blits are possible and test them + * - fail if swizzle needed + * - avoid trying to convert between float/int formats? + */ + if (blit_info->src.format != blit_info->dst.format) + return false; - /* for a copy with same dst/src format, we can use a different format */ - if (translate_rs_format(src_format) == ETNA_NO_MATCH && - src_format == dst_format) { - src_format = dst_format = etna_compatible_rs_format(src_format); - } + uint32_t format = etna_compatible_rs_format(blit_info->dst.format); + if (format == ETNA_NO_MATCH) + return false; - if (translate_rs_format(src_format) == ETNA_NO_MATCH || - translate_rs_format(dst_format) == ETNA_NO_MATCH || - blit_info->scissor_enable || + if (blit_info->scissor_enable || blit_info->dst.box.depth != blit_info->src.box.depth || blit_info->dst.box.depth != 1) { return false; @@ -740,7 +756,7 @@ etna_try_rs_blit(struct pipe_context *pctx, /* Kick off RS here */ etna_compile_rs_state(ctx, ©_to_screen, &(struct rs_state) { - .source_format = translate_rs_format(src_format), + .source_format = format, .source_tiling = src->layout, .source = src->bo, .source_offset = src_offset, @@ -749,7 +765,7 @@ etna_try_rs_blit(struct pipe_context *pctx, .source_padded_height = src_lev->padded_height, .source_ts_valid = source_ts_valid, .source_ts_compressed = src_lev->ts_compress_fmt >= 0, - .dest_format = translate_rs_format(dst_format), + .dest_format = format, .dest_tiling = dst->layout, .dest = dst->bo, .dest_offset = dst_offset, diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c index 7c7d1d32e54..a7d7ce72205 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c @@ -431,7 +431,7 @@ etna_screen_is_format_supported(struct pipe_screen *pscreen, if (usage & PIPE_BIND_RENDER_TARGET) { /* if render target, must be RS-supported format */ - if (translate_rs_format(format) != ETNA_NO_MATCH) { + if (translate_pe_format(format) != ETNA_NO_MATCH) { /* Validate MSAA; number of samples must be allowed, and render target * must have MSAA'able format. */ if (sample_count > 1) { diff --git a/src/gallium/drivers/etnaviv/etnaviv_state.c b/src/gallium/drivers/etnaviv/etnaviv_state.c index e3c2345cb32..f5eba1c9943 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_state.c +++ b/src/gallium/drivers/etnaviv/etnaviv_state.c @@ -146,7 +146,7 @@ etna_set_framebuffer_state(struct pipe_context *pctx, etna_update_render_resource(pctx, etna_resource(cbuf->prsc)); cs->PE_COLOR_FORMAT = - VIVS_PE_COLOR_FORMAT_FORMAT(translate_rs_format(cbuf->base.format)) | + VIVS_PE_COLOR_FORMAT_FORMAT(translate_pe_format(cbuf->base.format)) | VIVS_PE_COLOR_FORMAT_COMPONENTS__MASK | VIVS_PE_COLOR_FORMAT_OVERWRITE | COND(color_supertiled, VIVS_PE_COLOR_FORMAT_SUPER_TILED) | diff --git a/src/gallium/drivers/etnaviv/etnaviv_translate.h b/src/gallium/drivers/etnaviv/etnaviv_translate.h index 3c2aa3f79d2..fea7328456e 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_translate.h +++ b/src/gallium/drivers/etnaviv/etnaviv_translate.h @@ -234,28 +234,10 @@ translate_texture_filter(unsigned filter) } } -/* return a RS "compatible" format for use when copying */ -static inline enum pipe_format -etna_compatible_rs_format(enum pipe_format fmt) -{ - /* YUYV and UYVY are blocksize 4, but 2 bytes per pixel */ - if (fmt == PIPE_FORMAT_YUYV || fmt == PIPE_FORMAT_UYVY) - return PIPE_FORMAT_B4G4R4A4_UNORM; - - switch (util_format_get_blocksize(fmt)) { - case 2: - return PIPE_FORMAT_B4G4R4A4_UNORM; - case 4: - return PIPE_FORMAT_B8G8R8A8_UNORM; - default: - return fmt; - } -} - static inline int translate_rb_src_dst_swap(enum pipe_format src, enum pipe_format dst) { - return translate_rs_format_rb_swap(src) ^ translate_rs_format_rb_swap(dst); + return translate_pe_format_rb_swap(src) ^ translate_pe_format_rb_swap(dst); } static inline uint32_t -- 2.30.2