aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Marek <[email protected]>2019-08-09 16:27:47 -0400
committerChristian Gmeiner <[email protected]>2019-11-18 20:58:14 +0100
commitd819d4b34442a5b7663234bd08f117e7b3fb5ca2 (patch)
tree7613a3a76b52ce44a50c6f7e665e45eeb7b2ea02
parente1a86bd6346b64a770839f446af07e4072ec2708 (diff)
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 <[email protected]> Reviewed-by: Christian Gmeiner <[email protected]>
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_blend.c4
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_context.c2
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_format.c36
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_format.h4
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_rs.c40
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_screen.c2
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_state.c2
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_translate.h20
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 <assert.h>
+/* 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, &copy_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