[5/5] emit precise keyword

Submitted by Erik Faye-Lund on July 12, 2018, 7:55 a.m.

Details

Message ID 20180712075539.11993-6-erik.faye-lund@collabora.com
State New
Headers show
Series "tesselation fixes" ( rev: 1 ) in Virgil 3D

Not browsing as part of any series.

Commit Message

Erik Faye-Lund July 12, 2018, 7:55 a.m.
TGSI has a different model for precise than GLSL, so we have to mark
all outputs that has gotten an precise operation output to it as
precise.

This only implements part of the 'precise' keyword (still lacking
support on indevidual operations), but it's enough to pass some dEQP
tests, in particular:

- dEQP-GLES31.functional.tessellation.common_edge.triangles_equal_spacing_precise
- dEQP-GLES31.functional.tessellation.common_edge.triangles_fractional_odd_spacing_precise
- dEQP-GLES31.functional.tessellation.common_edge.triangles_fractional_even_spacing_precise
- dEQP-GLES31.functional.tessellation.common_edge.quads_equal_spacing_precise
- dEQP-GLES31.functional.tessellation.common_edge.quads_fractional_odd_spacing_precise
- dEQP-GLES31.functional.tessellation.common_edge.quads_fractional_even_spacing_precise

Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
---
 src/vrend_shader.c | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/vrend_shader.c b/src/vrend_shader.c
index 15d7735..41b74e4 100644
--- a/src/vrend_shader.c
+++ b/src/vrend_shader.c
@@ -66,6 +66,7 @@  struct vrend_shader_io {
    int first;
    unsigned                location;
    bool                    invariant;
+   bool                    precise;
    bool glsl_predefined_no_emit;
    bool glsl_no_index;
    bool glsl_gl_block;
@@ -788,6 +789,7 @@  iter_declaration(struct tgsi_iterate_context *iter,
       ctx->outputs[i].sid = decl->Semantic.Index;
       ctx->outputs[i].interpolate = decl->Interp.Interpolate;
       ctx->outputs[i].invariant = decl->Declaration.Invariant;
+      ctx->outputs[i].precise = false;
       ctx->outputs[i].first = decl->Range.First;
       ctx->outputs[i].glsl_predefined_no_emit = false;
       ctx->outputs[i].glsl_no_index = false;
@@ -2199,6 +2201,12 @@  get_destination_info(struct dump_ctx *ctx,
       if (dst_reg->Register.File == TGSI_FILE_OUTPUT) {
          for (uint32_t j = 0; j < ctx->num_outputs; j++) {
             if (ctx->outputs[j].first == dst_reg->Register.Index) {
+
+               if (inst->Instruction.Precise) {
+                  ctx->outputs[j].precise = true;
+                  ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5;
+               }
+
                if (ctx->glsl_ver_required >= 140 && ctx->outputs[j].name == TGSI_SEMANTIC_CLIPVERTEX) {
                   snprintf(dsts[i], 255, "clipv_tmp");
                } else if (ctx->outputs[j].name == TGSI_SEMANTIC_CLIPDIST) {
@@ -3645,12 +3653,21 @@  static char *emit_ios(struct dump_ctx *ctx, char *glsl_hdr)
                else
                   snprintf(buf, 255, "%sout vec4 %s[];\n", prefix, ctx->outputs[i].glsl_name);
             } else if (ctx->prog_type == TGSI_PROCESSOR_GEOMETRY && ctx->outputs[i].stream)
-               snprintf(buf, 255, "layout (stream = %d) %s%sout vec4 %s;\n", ctx->outputs[i].stream, prefix, ctx->outputs[i].invariant ? "invariant " : "", ctx->outputs[i].glsl_name);
+               snprintf(buf, 255, "layout (stream = %d) %s%s%sout vec4 %s;\n", ctx->outputs[i].stream, prefix,
+                        ctx->outputs[i].invariant ? "invariant " : "",
+                        ctx->outputs[i].precise ? "precise " : "",
+                        ctx->outputs[i].glsl_name);
             else
-               snprintf(buf, 255, "%s%sout vec4 %s;\n", prefix, ctx->outputs[i].invariant ? "invariant " : "", ctx->outputs[i].glsl_name);
+               snprintf(buf, 255, "%s%s%sout vec4 %s;\n", prefix,
+                        ctx->outputs[i].invariant ? "invariant " : "",
+                        ctx->outputs[i].precise ? "precise " : "",
+                        ctx->outputs[i].glsl_name);
             STRCAT_WITH_RET(glsl_hdr, buf);
-         } else if (ctx->outputs[i].invariant) {
-            snprintf(buf, 255, "invariant %s;\n", ctx->outputs[i].glsl_name);
+         } else if (ctx->outputs[i].invariant || ctx->outputs[i].precise) {
+            snprintf(buf, 255, "%s%s %s;\n",
+               ctx->outputs[i].invariant ? "invariant " : "",
+               ctx->outputs[i].precise ? "precise " : "",
+               ctx->outputs[i].glsl_name);
             STRCAT_WITH_RET(glsl_hdr, buf);
          }
       }