diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/virgl/virgl_tgsi.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/gallium/drivers/virgl/virgl_tgsi.c b/src/gallium/drivers/virgl/virgl_tgsi.c index d1f785d4d21..7a06a572794 100644 --- a/src/gallium/drivers/virgl/virgl_tgsi.c +++ b/src/gallium/drivers/virgl/virgl_tgsi.c @@ -25,13 +25,17 @@ so add a transform stage to remove things we don't want to send unless the receiver supports it. */ + #include "tgsi/tgsi_transform.h" +#include "tgsi/tgsi_info.h" #include "virgl_context.h" #include "virgl_screen.h" + struct virgl_transform_context { struct tgsi_transform_context base; bool cull_enabled; bool has_precise; + bool fake_fp64; }; static void @@ -78,6 +82,13 @@ virgl_tgsi_transform_instruction(struct tgsi_transform_context *ctx, struct tgsi_full_instruction *inst) { struct virgl_transform_context *vtctx = (struct virgl_transform_context *)ctx; + if (vtctx->fake_fp64 && + (tgsi_opcode_infer_src_type(inst->Instruction.Opcode, 0) == TGSI_TYPE_DOUBLE || + tgsi_opcode_infer_dst_type(inst->Instruction.Opcode, 0) == TGSI_TYPE_DOUBLE)) { + fprintf(stderr, "ARB_gpu_shader_fp64 is exposed but not supported."); + return; + } + if (!vtctx->has_precise && inst->Instruction.Precise) inst->Instruction.Precise = 0; @@ -107,6 +118,8 @@ struct tgsi_token *virgl_tgsi_transform(struct virgl_context *vctx, const struct transform.base.transform_instruction = virgl_tgsi_transform_instruction; transform.cull_enabled = vscreen->caps.caps.v1.bset.has_cull; transform.has_precise = vscreen->caps.caps.v2.capability_bits & VIRGL_CAP_TGSI_PRECISE; + transform.fake_fp64 = + vscreen->caps.caps.v2.capability_bits & VIRGL_CAP_FAKE_FP64; tgsi_transform_shader(tokens_in, new_tokens, newLen, &transform.base); return new_tokens; |