[Mesa-dev] [PATCH 2/7] nir: don't assert when xfb_buffer/stride is present but not xfb_offset

Alejandro PiƱeiro apinheiro at igalia.com
Thu Nov 8 13:22:13 UTC 2018


In order to allow nir_gather_xfb_info to be used on OpenGL,
specifically ARB_gl_spirv.

So, from OpenGL 4.6 spec, section 11.1.2.1, "Output Variables":

    "outputs specifying both an *XfbBuffer* and an *Offset* are
     captured, while outputs not specifying both of these are not
     captured. Values are captured each time the shader writes to such
     a decorated object."

This implies that are captured if both are present, and not if one of
those are lacking. Technically, it doesn't explicitly point that
having just one or the other is a mistake. In some cases, glslang is
adding some extra XfbBuffer without XfbOffset around, and mentioning
that technically that is not a bug (see issue#1526)

And for the case of Vulkan, as the same glslang issue mentions, it is
not clear if that should be a mistake or not. But even if it is a
mistake, it is not really needed to be checked on the driver, and we
can let the validation layers to check that.
---
 src/compiler/nir/nir_gather_xfb_info.c | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/compiler/nir/nir_gather_xfb_info.c b/src/compiler/nir/nir_gather_xfb_info.c
index e282bba0081..f5d831c6567 100644
--- a/src/compiler/nir/nir_gather_xfb_info.c
+++ b/src/compiler/nir/nir_gather_xfb_info.c
@@ -109,9 +109,16 @@ nir_gather_xfb_info(const nir_shader *shader, void *mem_ctx)
    nir_foreach_variable(var, &shader->outputs) {
       if (var->data.explicit_xfb_buffer ||
           var->data.explicit_xfb_stride) {
-         assert(var->data.explicit_xfb_buffer &&
-                var->data.explicit_xfb_stride &&
-                var->data.explicit_offset);
+
+         /* OpenGL points that both are needed to capture the output, but
+          * doesn't direcly imply that it is a mistake having one but not the
+          * other.
+          */
+         if (!var->data.explicit_xfb_buffer ||
+             !var->data.explicit_offset) {
+            continue;
+         }
+
          num_outputs += glsl_count_attribute_slots(var->type, false);
       }
    }
@@ -124,6 +131,16 @@ nir_gather_xfb_info(const nir_shader *shader, void *mem_ctx)
    nir_foreach_variable(var, &shader->outputs) {
       if (var->data.explicit_xfb_buffer ||
           var->data.explicit_xfb_stride) {
+
+         /* OpenGL points that both are needed to capture the output, but
+          * doesn't direcly imply that it is a mistake having one but not the
+          * other.
+          */
+         if (!var->data.explicit_xfb_buffer ||
+             !var->data.explicit_offset) {
+            continue;
+         }
+
          unsigned location = var->data.location;
          unsigned offset = var->data.offset;
          add_var_xfb_outputs(xfb, var, &location, &offset, var->type);
-- 
2.14.1



More information about the mesa-dev mailing list