summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Clark <[email protected]>2014-03-30 12:06:35 -0400
committerRob Clark <[email protected]>2014-03-30 12:10:26 -0400
commitdb414c468609764c2394b4472900e7878f4ddfaa (patch)
tree068a77ea6bf0dbd49c125539724d38475ec87593
parent83808a90bea75598a279ae45d96e55c562ad58e4 (diff)
freedreno/a3xx/compiler: fix RECT textures
Whether or not the coords are normalized is handled in the texture state. But we otherwise need to treat RECT sample instructions as 2D. Signed-off-by: Rob Clark <[email protected]>
-rw-r--r--src/gallium/drivers/freedreno/a3xx/fd3_compiler.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_compiler.c b/src/gallium/drivers/freedreno/a3xx/fd3_compiler.c
index 9b644742615..1d99e5caa99 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_compiler.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_compiler.c
@@ -1090,21 +1090,41 @@ trans_samp(const struct instr_translater *t,
switch (t->arg) {
case TGSI_OPCODE_TEX:
- if (tex == TGSI_TEXTURE_2D) {
+ switch (tex) {
+ case TGSI_TEXTURE_2D:
+ case TGSI_TEXTURE_RECT:
order = (int8_t[4]){ 0, 1, -1, -1 };
src_wrmask = TGSI_WRITEMASK_XY;
- } else {
+ break;
+ case TGSI_TEXTURE_3D:
+ case TGSI_TEXTURE_CUBE:
order = (int8_t[4]){ 0, 1, 2, -1 };
src_wrmask = TGSI_WRITEMASK_XYZ;
+ flags |= IR3_INSTR_3D;
+ break;
+ default:
+ compile_error(ctx, "unknown texture type: %s\n",
+ tgsi_texture_names[tex]);
+ break;
}
break;
case TGSI_OPCODE_TXP:
- if (tex == TGSI_TEXTURE_2D) {
+ switch (tex) {
+ case TGSI_TEXTURE_2D:
+ case TGSI_TEXTURE_RECT:
order = (int8_t[4]){ 0, 1, 3, -1 };
src_wrmask = TGSI_WRITEMASK_XYZ;
- } else {
+ break;
+ case TGSI_TEXTURE_3D:
+ case TGSI_TEXTURE_CUBE:
order = (int8_t[4]){ 0, 1, 2, 3 };
src_wrmask = TGSI_WRITEMASK_XYZW;
+ flags |= IR3_INSTR_3D;
+ break;
+ default:
+ compile_error(ctx, "unknown texture type: %s\n",
+ tgsi_texture_names[tex]);
+ break;
}
flags |= IR3_INSTR_P;
break;
@@ -1113,9 +1133,6 @@ trans_samp(const struct instr_translater *t,
break;
}
- if ((tex == TGSI_TEXTURE_3D) || (tex == TGSI_TEXTURE_CUBE))
- flags |= IR3_INSTR_3D;
-
/* cat5 instruction cannot seem to handle const or relative: */
if (is_rel_or_const(coord))
needs_mov = true;