virgl: Return an error if we use fp64 on top of GLES
authorElie Tournier <tournier.elie@gmail.com>
Fri, 15 Feb 2019 16:21:42 +0000 (16:21 +0000)
committerGert Wollny <gert.wollny@collabora.com>
Sat, 9 Mar 2019 10:33:20 +0000 (11:33 +0100)
Signed-off-by: Elie Tournier <elie.tournier@collabora.com>
Reviewed-by: <Gurchetan Singh gurchetansingh@chromium.org>
src/gallium/drivers/virgl/virgl_tgsi.c

index d1f785d4d213ef847d742518dfa4e5827d7cffc8..7a06a5727949fca0226d0ddffe7d4b740bf1cda0 100644 (file)
    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;