Mesa (main): virgl: Apply integer op fix only for ALU ops and clear modifiers
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Apr 13 09:06:26 UTC 2022
Module: Mesa
Branch: main
Commit: 6a264e7024a29eb7b41bbea18c653c3d232d16e8
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6a264e7024a29eb7b41bbea18c653c3d232d16e8
Author: Gert Wollny <gert.wollny at collabora.com>
Date: Tue Apr 12 17:53:12 2022 +0200
virgl: Apply integer op fix only for ALU ops and clear modifiers
For texture fetches and buffer load the fix is not needed,
and the override creates faulty TGSI.
In addition remove all modifiers from the src in the additional mov
instruction.
Fixes: d1c7a7b1317c518e160cc6d37245de22b2bfa60d
virgl: Add an extra mov for int outputs from constant and immediate inputs
v2: Move workaround after the use of
virgl_tgsi_rewrite_src_for_input_temp (Emma)
Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15896>
---
src/gallium/drivers/virgl/virgl_tgsi.c | 45 ++++++++++++++++++----------------
1 file changed, 24 insertions(+), 21 deletions(-)
diff --git a/src/gallium/drivers/virgl/virgl_tgsi.c b/src/gallium/drivers/virgl/virgl_tgsi.c
index 5e67278aa9b..9e6158b1690 100644
--- a/src/gallium/drivers/virgl/virgl_tgsi.c
+++ b/src/gallium/drivers/virgl/virgl_tgsi.c
@@ -329,27 +329,6 @@ virgl_tgsi_transform_instruction(struct tgsi_transform_context *ctx,
inst->Src[0].Register.Index = vtctx->src_temp;
}
- /* virglrenderer doesn't resolve non-float output write properly,
- * so we have to first write to a temporary */
- if ((inst->Src[0].Register.File == TGSI_FILE_CONSTANT ||
- inst->Src[0].Register.File == TGSI_FILE_IMMEDIATE) &&
- inst->Dst[0].Register.File == TGSI_FILE_OUTPUT &&
- tgsi_opcode_infer_dst_type(inst->Instruction.Opcode, 0) != TGSI_TYPE_FLOAT) {
- struct tgsi_full_instruction op_to_temp = *inst;
- op_to_temp.Dst[0].Register.File = TGSI_FILE_TEMPORARY;
- op_to_temp.Dst[0].Register.Index = vtctx->src_temp;
- ctx->emit_instruction(ctx, &op_to_temp);
-
- inst->Instruction.Opcode = TGSI_OPCODE_MOV;
- inst->Src[0].Register.File = TGSI_FILE_TEMPORARY;
- inst->Src[0].Register.Index = vtctx->src_temp;
- inst->Src[0].Register.Indirect = 0;
- inst->Src[0].Register.SwizzleX = 0;
- inst->Src[0].Register.SwizzleY = 1;
- inst->Src[0].Register.SwizzleZ = 2;
- inst->Src[0].Register.SwizzleW = 3;
- }
-
for (unsigned i = 0; i < inst->Instruction.NumDstRegs; i++) {
/* virglrenderer would fail to compile on clipdist, clipvertex, and some
* two-sided-related color writes without a full writemask. So, we write
@@ -405,6 +384,30 @@ virgl_tgsi_transform_instruction(struct tgsi_transform_context *ctx,
}
ctx->emit_instruction(ctx, inst);
+ /* virglrenderer doesn't resolve non-float output write properly,
+ * so we have to first write to a temporary */
+ if ((inst->Src[0].Register.File == TGSI_FILE_CONSTANT ||
+ inst->Src[0].Register.File == TGSI_FILE_IMMEDIATE) &&
+ !tgsi_get_opcode_info(inst->Instruction.Opcode)->is_tex &&
+ !tgsi_get_opcode_info(inst->Instruction.Opcode)->is_store &&
+ inst->Dst[0].Register.File == TGSI_FILE_OUTPUT &&
+ tgsi_opcode_infer_dst_type(inst->Instruction.Opcode, 0) != TGSI_TYPE_FLOAT) {
+ struct tgsi_full_instruction op_to_temp = *inst;
+ op_to_temp.Dst[0].Register.File = TGSI_FILE_TEMPORARY;
+ op_to_temp.Dst[0].Register.Index = vtctx->src_temp;
+ ctx->emit_instruction(ctx, &op_to_temp);
+
+ inst->Instruction.Opcode = TGSI_OPCODE_MOV;
+ inst->Instruction.NumSrcRegs = 1;
+
+ memset(&inst->Src[0], 0, sizeof(inst->Src[0]));
+ inst->Src[0].Register.File = TGSI_FILE_TEMPORARY;
+ inst->Src[0].Register.Index = vtctx->src_temp;
+ inst->Src[0].Register.SwizzleY = 1;
+ inst->Src[0].Register.SwizzleZ = 2;
+ inst->Src[0].Register.SwizzleW = 3;
+ }
+
for (unsigned i = 0; i < inst->Instruction.NumDstRegs; i++) {
if (vtctx->num_writemask_fixups &&
inst->Dst[i].Register.File == TGSI_FILE_TEMPORARY &&
More information about the mesa-commit
mailing list