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
[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, \
}
[PIPE_FORMAT_##pipe] = { \
.vtx = ETNA_NO_MATCH, \
.tex = TEXTURE_FORMAT_##fmt, \
- .rs = RS_FORMAT_##rsfmt, \
+ .pe = PE_FORMAT_##rsfmt, \
.present = 1, \
.tex_swiz = swiz, \
}
[PIPE_FORMAT_##pipe] = { \
.vtx = FE_DATA_TYPE_##fmt, \
.tex = ETNA_NO_MATCH, \
- .rs = RS_FORMAT_##rsfmt, \
+ .pe = PE_FORMAT_##rsfmt, \
.present = 1, \
}
_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),
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),
}
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 */
#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)
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;
/* 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,
.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,