[virglrenderer-devel] [PATCH 06/12] arb_gpu_shader5: add support for enhanced texture gather
Dave Airlie
airlied at gmail.com
Tue May 15 04:38:04 UTC 2018
From: Dave Airlie <airlied at redhat.com>
---
src/vrend_shader.c | 47 +++++++++++++++++++++++++++++++++++++----------
1 file changed, 37 insertions(+), 10 deletions(-)
diff --git a/src/vrend_shader.c b/src/vrend_shader.c
index 3ded04c..f54efb1 100644
--- a/src/vrend_shader.c
+++ b/src/vrend_shader.c
@@ -1145,7 +1145,8 @@ static int translate_tex(struct dump_ctx *ctx,
char dsts[3][255],
const char *writemask,
const char *dstconv,
- bool dst0_override_no_wm)
+ bool dst0_override_no_wm,
+ bool tg4_has_component)
{
const char *twm = "", *gwm = NULL, *txfi;
const char *dtypeprefix = "";
@@ -1342,7 +1343,9 @@ static int translate_tex(struct dump_ctx *ctx,
case TGSI_TEXTURE_SHADOWCUBE_ARRAY:
case TGSI_TEXTURE_CUBE_ARRAY:
default:
- if (inst->Instruction.Opcode == TGSI_OPCODE_TG4 && inst->Texture.Texture != TGSI_TEXTURE_CUBE_ARRAY)
+ if (inst->Instruction.Opcode == TGSI_OPCODE_TG4 &&
+ inst->Texture.Texture != TGSI_TEXTURE_CUBE_ARRAY
+ && inst->Texture.Texture != TGSI_TEXTURE_SHADOWCUBE_ARRAY)
twm = ".xyz";
else
twm = "";
@@ -1400,10 +1403,9 @@ static int translate_tex(struct dump_ctx *ctx,
snprintf(bias, 128, ", %s%s, %s%s", srcs[1], gwm, srcs[2], gwm);
sampler_index = 3;
} else if (inst->Instruction.Opcode == TGSI_OPCODE_TG4) {
-
sampler_index = 2;
ctx->uses_tg4 = true;
- if (inst->Texture.NumOffsets > 1 || is_shad)
+ if (inst->Texture.NumOffsets > 1 || is_shad || ctx->uses_sampler_rect)
ctx->uses_gpu_shader5 = true;
if (inst->Texture.NumOffsets == 1) {
if (inst->TexOffsets[0].File != TGSI_FILE_IMMEDIATE)
@@ -1411,11 +1413,26 @@ static int translate_tex(struct dump_ctx *ctx,
}
if (is_shad) {
if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE ||
- inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY ||
- inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE_ARRAY)
+ inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)
snprintf(bias, 64, ", %s.w", srcs[0]);
+ else if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE_ARRAY)
+ snprintf(bias, 64, ", %s.x", srcs[1]);
else
snprintf(bias, 64, ", %s.z", srcs[0]);
+ } else if (tg4_has_component) {
+ if (inst->Texture.NumOffsets == 0) {
+ if (inst->Texture.Texture == TGSI_TEXTURE_2D ||
+ inst->Texture.Texture == TGSI_TEXTURE_RECT ||
+ inst->Texture.Texture == TGSI_TEXTURE_CUBE ||
+ inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY ||
+ inst->Texture.Texture == TGSI_TEXTURE_CUBE_ARRAY)
+ snprintf(bias, 64, ", int(%s)", srcs[1]);
+ } else if (inst->Texture.NumOffsets) {
+ if (inst->Texture.Texture == TGSI_TEXTURE_2D ||
+ inst->Texture.Texture == TGSI_TEXTURE_RECT ||
+ inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY)
+ snprintf(bias, 64, ", int(%s)", srcs[1]);
+ }
}
} else
bias[0] = 0;
@@ -1514,12 +1531,11 @@ static int translate_tex(struct dump_ctx *ctx,
break;
}
}
- if (inst->Instruction.Opcode == TGSI_OPCODE_TXL || inst->Instruction.Opcode == TGSI_OPCODE_TXL2 || inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
+ if (inst->Instruction.Opcode == TGSI_OPCODE_TXL || inst->Instruction.Opcode == TGSI_OPCODE_TXL2 || inst->Instruction.Opcode == TGSI_OPCODE_TXD || (inst->Instruction.Opcode == TGSI_OPCODE_TG4 && is_shad)) {
char tmp[128];
strcpy(tmp, offbuf);
strcpy(offbuf, bias);
strcpy(bias, tmp);
-
}
}
if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) {
@@ -1616,7 +1632,7 @@ iter_instruction(struct tgsi_iterate_context *iter,
bool dst_override_no_wm[2];
char *sret;
int ret;
-
+ bool tg4_has_component = false;
if (ctx->prog_type == -1)
ctx->prog_type = iter->processor.Processor;
if (dtype == TGSI_TYPE_SIGNED || dtype == TGSI_TYPE_UNSIGNED ||
@@ -1849,6 +1865,9 @@ iter_instruction(struct tgsi_iterate_context *iter,
const char *vtype = "vec4";
const char *imm_stypeprefix = stypeprefix;
+ if ((inst->Instruction.Opcode == TGSI_OPCODE_TG4 && i == 1))
+ stype = TGSI_TYPE_SIGNED;
+
if (imd->type == TGSI_IMM_UINT32 || imd->type == TGSI_IMM_INT32) {
if (imd->type == TGSI_IMM_UINT32)
vtype = "uvec4";
@@ -1879,6 +1898,14 @@ iter_instruction(struct tgsi_iterate_context *iter,
idx = src->Register.SwizzleZ;
else if (j == 3)
idx = src->Register.SwizzleW;
+
+ if (inst->Instruction.Opcode == TGSI_OPCODE_TG4 && i == 1 && j == 0) {
+ if (imd->val[idx].ui > 0) {
+ tg4_has_component = true;
+ ctx->uses_gpu_shader5 = true;
+ }
+ }
+
switch (imd->type) {
case TGSI_IMM_FLOAT32:
if (isinf(imd->val[idx].f) || isnan(imd->val[idx].f)) {
@@ -2160,7 +2187,7 @@ iter_instruction(struct tgsi_iterate_context *iter,
case TGSI_OPCODE_TXP:
case TGSI_OPCODE_TXQ:
case TGSI_OPCODE_LODQ:
- ret = translate_tex(ctx, inst, sreg_index, srcs, dsts, writemask, dstconv, dst_override_no_wm[0]);
+ ret = translate_tex(ctx, inst, sreg_index, srcs, dsts, writemask, dstconv, dst_override_no_wm[0], tg4_has_component);
if (ret)
return FALSE;
break;
--
2.14.3
More information about the virglrenderer-devel
mailing list