From 68d1eb4bb4d3a6796fb84e81ce2ed99307d3caab Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Tue, 5 Jun 2018 10:54:04 +1000 Subject: [PATCH] shader: convert texture writemasks over to a string conversion (v2) v2: use TGSI_WRITEMASK defines (Gurchetan) Reviewed-by: Gurchetan Singh --- src/vrend_shader.c | 80 +++++++++++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 30 deletions(-) diff --git a/src/vrend_shader.c b/src/vrend_shader.c index a089fb5..3b8a34e 100644 --- a/src/vrend_shader.c +++ b/src/vrend_shader.c @@ -236,6 +236,25 @@ static inline const char *get_string(enum vrend_type_qualifier key) return conversion_table[key].string; } +static inline const char *get_wm_string(unsigned wm) +{ + switch(wm) { + case TGSI_WRITEMASK_NONE: + return ""; + case TGSI_WRITEMASK_X: + return ".x"; + case TGSI_WRITEMASK_XY: + return ".xy"; + case TGSI_WRITEMASK_XYZ: + return ".xyz"; + case TGSI_WRITEMASK_W: + return ".w"; + default: + printf("Unable to unknown writemask\n"); + return ""; + } +} + static inline const char *tgsi_proc_to_prefix(int shader_type) { switch (shader_type) { @@ -1358,7 +1377,7 @@ static int emit_txq(struct dump_ctx *ctx, char dsts[3][255], const char *writemask) { - const char *twm = ""; + unsigned twm = TGSI_WRITEMASK_NONE; char bias[128] = {0}; char buf[512]; const int sampler_index = 1; @@ -1385,8 +1404,8 @@ static int emit_txq(struct dump_ctx *ctx, inst->Texture.Texture != TGSI_TEXTURE_2D_ARRAY_MSAA) { ctx->shader_req_bits |= SHADER_REQ_TXQ_LEVELS; if (inst->Dst[0].Register.WriteMask & 0x7) - twm = ".w"; - snprintf(buf, 255, "%s%s = %s(textureQueryLevels(%s));\n", dsts[0], twm, get_string(dtypeprefix), srcs[sampler_index]); + twm = TGSI_WRITEMASK_W; + snprintf(buf, 255, "%s%s = %s(textureQueryLevels(%s));\n", dsts[0], get_wm_string(twm), get_string(dtypeprefix), srcs[sampler_index]); EMIT_BUF_WITH_RET(ctx, buf); } @@ -1395,7 +1414,7 @@ static int emit_txq(struct dump_ctx *ctx, case TGSI_TEXTURE_1D: case TGSI_TEXTURE_BUFFER: case TGSI_TEXTURE_SHADOW1D: - twm = ".x"; + twm = TGSI_WRITEMASK_X; break; case TGSI_TEXTURE_1D_ARRAY: case TGSI_TEXTURE_SHADOW1D_ARRAY: @@ -1406,7 +1425,7 @@ static int emit_txq(struct dump_ctx *ctx, case TGSI_TEXTURE_CUBE: case TGSI_TEXTURE_SHADOWCUBE: case TGSI_TEXTURE_2D_MSAA: - twm = ".xy"; + twm = TGSI_WRITEMASK_XY; break; case TGSI_TEXTURE_3D: case TGSI_TEXTURE_2D_ARRAY: @@ -1414,14 +1433,14 @@ static int emit_txq(struct dump_ctx *ctx, case TGSI_TEXTURE_SHADOWCUBE_ARRAY: case TGSI_TEXTURE_CUBE_ARRAY: case TGSI_TEXTURE_2D_ARRAY_MSAA: - twm = ".xyz"; + twm = TGSI_WRITEMASK_XYZ; break; } } } if (inst->Dst[0].Register.WriteMask & 0x7) { - snprintf(buf, 255, "%s%s = %s(textureSize(%s%s))%s;\n", dsts[0], twm, get_string(dtypeprefix), srcs[sampler_index], bias, util_bitcount(inst->Dst[0].Register.WriteMask) > 1 ? writemask : ""); + snprintf(buf, 255, "%s%s = %s(textureSize(%s%s))%s;\n", dsts[0], get_wm_string(twm), get_string(dtypeprefix), srcs[sampler_index], bias, util_bitcount(inst->Dst[0].Register.WriteMask) > 1 ? writemask : ""); EMIT_BUF_WITH_RET(ctx, buf); } return 0; @@ -1478,7 +1497,8 @@ static int translate_tex(struct dump_ctx *ctx, bool dst0_override_no_wm, bool tg4_has_component) { - const char *twm = "", *gwm = NULL, *txfi; + const char *txfi; + unsigned twm = TGSI_WRITEMASK_NONE, gwm = TGSI_WRITEMASK_NONE; enum vrend_type_qualifier dtypeprefix = TYPE_CONVERSION_NONE; bool is_shad = false; char buf[512]; @@ -1514,21 +1534,21 @@ static int translate_tex(struct dump_ctx *ctx, case TGSI_TEXTURE_1D: case TGSI_TEXTURE_BUFFER: if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) - twm = ""; + twm = TGSI_WRITEMASK_NONE; else - twm = ".x"; + twm = TGSI_WRITEMASK_X; txfi = "int"; break; case TGSI_TEXTURE_1D_ARRAY: - twm = ".xy"; + twm = TGSI_WRITEMASK_XY; txfi = "ivec2"; break; case TGSI_TEXTURE_2D: case TGSI_TEXTURE_RECT: if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) - twm = ""; + twm = TGSI_WRITEMASK_NONE; else - twm = ".xy"; + twm = TGSI_WRITEMASK_XY; txfi = "ivec2"; break; case TGSI_TEXTURE_SHADOW1D: @@ -1537,24 +1557,24 @@ static int translate_tex(struct dump_ctx *ctx, case TGSI_TEXTURE_SHADOWRECT: case TGSI_TEXTURE_3D: if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) - twm = ""; + twm = TGSI_WRITEMASK_NONE; else if (inst->Instruction.Opcode == TGSI_OPCODE_TG4) - twm = ".xy"; + twm = TGSI_WRITEMASK_XY; else - twm = ".xyz"; + twm = TGSI_WRITEMASK_XYZ; txfi = "ivec3"; break; case TGSI_TEXTURE_CUBE: case TGSI_TEXTURE_2D_ARRAY: - twm = ".xyz"; + twm = TGSI_WRITEMASK_XYZ; txfi = "ivec3"; break; case TGSI_TEXTURE_2D_MSAA: - twm = ".xy"; + twm = TGSI_WRITEMASK_XY; txfi = "ivec2"; break; case TGSI_TEXTURE_2D_ARRAY_MSAA: - twm = ".xyz"; + twm = TGSI_WRITEMASK_XYZ; txfi = "ivec3"; break; @@ -1566,9 +1586,9 @@ static int translate_tex(struct dump_ctx *ctx, if (inst->Instruction.Opcode == TGSI_OPCODE_TG4 && inst->Texture.Texture != TGSI_TEXTURE_CUBE_ARRAY && inst->Texture.Texture != TGSI_TEXTURE_SHADOWCUBE_ARRAY) - twm = ".xyz"; + twm = TGSI_WRITEMASK_XYZ; else - twm = ""; + twm = TGSI_WRITEMASK_NONE; txfi = ""; break; } @@ -1579,7 +1599,7 @@ static int translate_tex(struct dump_ctx *ctx, case TGSI_TEXTURE_SHADOW1D: case TGSI_TEXTURE_1D_ARRAY: case TGSI_TEXTURE_SHADOW1D_ARRAY: - gwm = ".x"; + gwm = TGSI_WRITEMASK_X; break; case TGSI_TEXTURE_2D: case TGSI_TEXTURE_SHADOW2D: @@ -1587,16 +1607,16 @@ static int translate_tex(struct dump_ctx *ctx, case TGSI_TEXTURE_SHADOW2D_ARRAY: case TGSI_TEXTURE_RECT: case TGSI_TEXTURE_SHADOWRECT: - gwm = ".xy"; + gwm = TGSI_WRITEMASK_XY; break; case TGSI_TEXTURE_3D: case TGSI_TEXTURE_CUBE: case TGSI_TEXTURE_SHADOWCUBE: case TGSI_TEXTURE_CUBE_ARRAY: - gwm = ".xyz"; + gwm = TGSI_WRITEMASK_XYZ; break; default: - gwm = ""; + gwm = TGSI_WRITEMASK_NONE; break; } } @@ -1620,7 +1640,7 @@ static int translate_tex(struct dump_ctx *ctx, snprintf(bias, 64, ", int(%s.w)", srcs[0]); } } else if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { - snprintf(bias, 128, ", %s%s, %s%s", srcs[1], gwm, srcs[2], gwm); + snprintf(bias, 128, ", %s%s, %s%s", srcs[1], get_wm_string(gwm), srcs[2], get_wm_string(gwm)); sampler_index = 3; } else if (inst->Instruction.Opcode == TGSI_OPCODE_TG4) { sampler_index = 2; @@ -1736,7 +1756,7 @@ static int translate_tex(struct dump_ctx *ctx, } } if (inst->Instruction.Opcode == TGSI_OPCODE_TXF) { - snprintf(buf, 255, "%s = %s(%s(texelFetch%s(%s, %s(%s%s)%s%s)%s));\n", dsts[0], dstconv, get_string(dtypeprefix), tex_ext, srcs[sampler_index], txfi, srcs[0], twm, bias, offbuf, dst0_override_no_wm ? "" : writemask); + snprintf(buf, 255, "%s = %s(%s(texelFetch%s(%s, %s(%s%s)%s%s)%s));\n", dsts[0], dstconv, get_string(dtypeprefix), tex_ext, srcs[sampler_index], txfi, srcs[0], get_wm_string(twm), bias, offbuf, dst0_override_no_wm ? "" : writemask); } else if (ctx->cfg->glsl_version < 140 && (ctx->shader_req_bits & SHADER_REQ_SAMPLER_RECT)) { /* rect is special in GLSL 1.30 */ if (inst->Texture.Texture == TGSI_TEXTURE_RECT) @@ -1746,15 +1766,15 @@ static int translate_tex(struct dump_ctx *ctx, } else if (is_shad && inst->Instruction.Opcode != TGSI_OPCODE_TG4) { /* TGSI returns 1.0 in alpha */ const char *cname = tgsi_proc_to_prefix(ctx->prog_type); const struct tgsi_full_src_register *src = &inst->Src[sampler_index]; - snprintf(buf, 255, "%s = %s(%s(vec4(vec4(texture%s(%s, %s%s%s%s)) * %sshadmask%d + %sshadadd%d)%s));\n", dsts[0], dstconv, get_string(dtypeprefix), tex_ext, srcs[sampler_index], srcs[0], twm, offbuf, bias, cname, src->Register.Index, cname, src->Register.Index, writemask); + snprintf(buf, 255, "%s = %s(%s(vec4(vec4(texture%s(%s, %s%s%s%s)) * %sshadmask%d + %sshadadd%d)%s));\n", dsts[0], dstconv, get_string(dtypeprefix), tex_ext, srcs[sampler_index], srcs[0], get_wm_string(twm), offbuf, bias, cname, src->Register.Index, cname, src->Register.Index, writemask); } else { /* OpenGL ES do not support 1D texture * so we use a 2D texture with a parameter set to 0.5 */ if (ctx->cfg->use_gles && inst->Texture.Texture == TGSI_TEXTURE_1D) { - snprintf(buf, 255, "%s = %s(%s(texture2D(%s, vec2(%s%s%s%s, 0.5))%s));\n", dsts[0], dstconv, get_string(dtypeprefix), srcs[sampler_index], srcs[0], twm, offbuf, bias, dst0_override_no_wm ? "" : writemask); + snprintf(buf, 255, "%s = %s(%s(texture2D(%s, vec2(%s%s%s%s, 0.5))%s));\n", dsts[0], dstconv, get_string(dtypeprefix), srcs[sampler_index], srcs[0], get_wm_string(twm), offbuf, bias, dst0_override_no_wm ? "" : writemask); } else { - snprintf(buf, 255, "%s = %s(%s(texture%s(%s, %s%s%s%s)%s));\n", dsts[0], dstconv, get_string(dtypeprefix), tex_ext, srcs[sampler_index], srcs[0], twm, offbuf, bias, dst0_override_no_wm ? "" : writemask); + snprintf(buf, 255, "%s = %s(%s(texture%s(%s, %s%s%s%s)%s));\n", dsts[0], dstconv, get_string(dtypeprefix), tex_ext, srcs[sampler_index], srcs[0], get_wm_string(twm), offbuf, bias, dst0_override_no_wm ? "" : writemask); } } return emit_buf(ctx, buf);