diff options
author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2016-02-29 00:42:37 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2016-02-29 00:09:24 +0000 |
commit | d6ade3c0c3701483ce8ecf245a98337a7e24048d (patch) | |
tree | 571709e4e8465a704af79a03c55dc390963a9a4b | |
parent | 175292b2df949ccda9db471b1cc28df8f2f294d9 (diff) |
shader: improve TXQ translation
TXQ may query levels and size.
Fixes all piglit texturesize tests and others.
[airlied: use EMIT_BUF_WITH_RET].
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | src/vrend_shader.c | 54 |
1 files changed, 47 insertions, 7 deletions
diff --git a/src/vrend_shader.c b/src/vrend_shader.c index e72231f..7447ef4 100644 --- a/src/vrend_shader.c +++ b/src/vrend_shader.c @@ -25,6 +25,7 @@ #include "tgsi/tgsi_info.h" #include "tgsi/tgsi_iterate.h" #include "util/u_memory.h" +#include "util/u_math.h" #include <string.h> #include <stdio.h> #include <math.h> @@ -943,7 +944,7 @@ static int translate_tex(struct dump_ctx *ctx, const char *dstconv, const char *dtypeprefix) { - const char *twm, *gwm = NULL, *txfi; + const char *twm = "", *gwm = NULL, *txfi; bool is_shad = false; char buf[512]; char offbuf[128] = {0}; @@ -1010,13 +1011,52 @@ static int translate_tex(struct dump_ctx *ctx, /* need to emit a textureQueryLevels */ if (inst->Dst[0].Register.WriteMask & 0x8) { - ctx->uses_txq_levels = true; - snprintf(buf, 255, "%s = %s(%s(textureQueryLevels(%s)));\n", dsts[0], dstconv, dtypeprefix, srcs[sampler_index]); - return emit_buf(ctx, buf); - } else { - snprintf(buf, 255, "%s = %s(%s(textureSize(%s%s)));\n", dsts[0], dstconv, dtypeprefix, srcs[sampler_index], bias); - return emit_buf(ctx, buf); + + if (inst->Texture.Texture != TGSI_TEXTURE_BUFFER && + inst->Texture.Texture != TGSI_TEXTURE_RECT && + inst->Texture.Texture != TGSI_TEXTURE_2D_MSAA && + inst->Texture.Texture != TGSI_TEXTURE_2D_ARRAY_MSAA) { + ctx->uses_txq_levels = true; + if (inst->Dst[0].Register.WriteMask & 0x7) + twm = ".w"; + snprintf(buf, 255, "%s%s = %s(textureQueryLevels(%s));\n", dsts[0], twm, dtypeprefix, srcs[sampler_index]); + EMIT_BUF_WITH_RET(ctx, buf); + } + + if (inst->Dst[0].Register.WriteMask & 0x7) { + switch (inst->Texture.Texture) { + case TGSI_TEXTURE_1D: + case TGSI_TEXTURE_BUFFER: + case TGSI_TEXTURE_SHADOW1D: + twm = ".x"; + break; + case TGSI_TEXTURE_1D_ARRAY: + case TGSI_TEXTURE_SHADOW1D_ARRAY: + case TGSI_TEXTURE_2D: + case TGSI_TEXTURE_SHADOW2D: + case TGSI_TEXTURE_RECT: + case TGSI_TEXTURE_SHADOWRECT: + case TGSI_TEXTURE_CUBE: + case TGSI_TEXTURE_SHADOWCUBE: + twm = ".xy"; + break; + case TGSI_TEXTURE_3D: + case TGSI_TEXTURE_2D_ARRAY: + case TGSI_TEXTURE_SHADOW2D_ARRAY: + case TGSI_TEXTURE_SHADOWCUBE_ARRAY: + case TGSI_TEXTURE_CUBE_ARRAY: + twm = ".xyz"; + break; + } + } + } + + if (inst->Dst[0].Register.WriteMask & 0x7) { + snprintf(buf, 255, "%s%s = %s(textureSize(%s%s))%s;\n", dsts[0], twm, dtypeprefix, srcs[sampler_index], bias, util_bitcount(inst->Dst[0].Register.WriteMask) > 1 ? writemask : ""); + EMIT_BUF_WITH_RET(ctx, buf); } + + return 0; } switch (inst->Texture.Texture) { |