OSDN Git Service

glsl: always enable transform feedback mode when xfb_stride defined
authorTimothy Arceri <timothy.arceri@collabora.com>
Mon, 14 Mar 2016 00:16:55 +0000 (11:16 +1100)
committerTimothy Arceri <timothy.arceri@collabora.com>
Thu, 31 Mar 2016 01:52:34 +0000 (12:52 +1100)
This enables in shader defined transform feedback mode even if the
only place xfb_stride is defined is on the global out.

We don't worry about xfb_buffer since Issue 22 c) in the spec says:

   "If the shader has an "xfb_buffer" qualifier identifying a buffer,
    but doesn't declare "xfb_offset" on anything associated with it,
    what happens?

    ...

    variables not qualified with "xfb_offset" are not captured, which
    makes the associated "xfb_buffer" qualifier irrelevant."

Reviewed-by: Dave Airlie <airlied@redhat.com>
src/compiler/glsl/link_varyings.cpp

index ce6ff08..d486b69 100644 (file)
@@ -113,6 +113,16 @@ process_xfb_layout_qualifiers(void *mem_ctx, const gl_shader *sh,
 {
    bool has_xfb_qualifiers = false;
 
+   /* We still need to enable transform feedback mode even if xfb_stride is
+    * only applied to a global out. Also we don't bother to propagate
+    * xfb_stride to interface block members so this will catch that case also.
+    */
+   for (unsigned j = 0; j < MAX_FEEDBACK_BUFFERS; j++) {
+      if (sh->TransformFeedback.BufferStride[j]) {
+         has_xfb_qualifiers = true;
+      }
+   }
+
    foreach_in_list(ir_instruction, node, sh->ir) {
       ir_variable *var = node->as_variable();
       if (!var || var->data.mode != ir_var_shader_out)