Re: [Mesa-dev] [PATCH] mesa/program_interface_query: fix transform feedback varyings.

2016-05-27 Thread Timothy Arceri
On Wed, 2016-05-25 at 09:10 +1000, Dave Airlie wrote:
> From: Dave Airlie 
> 
> The spec says gl_NextBuffer and gl_SkipComponents need to be
> returned to userspace in the program interface queries.
> 
> We currently throw those away, this requires a complete piglit
> run to make sure no drivers fallover due to the extra varyings.
> 
> This fixes:
> GL45-CTS.program_interface_query.transform-feedback-built-in

Looks good to me.

Reviewed-by: Timothy Arceri 

> 
> Signed-off-by: Dave Airlie 

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] mesa/program_interface_query: fix transform feedback varyings.

2016-05-24 Thread Dave Airlie
From: Dave Airlie 

The spec says gl_NextBuffer and gl_SkipComponents need to be
returned to userspace in the program interface queries.

We currently throw those away, this requires a complete piglit
run to make sure no drivers fallover due to the extra varyings.

This fixes:
GL45-CTS.program_interface_query.transform-feedback-built-in

Signed-off-by: Dave Airlie 
---
 src/compiler/glsl/link_varyings.cpp | 81 +
 src/mesa/main/shader_query.cpp  |  2 +-
 2 files changed, 48 insertions(+), 35 deletions(-)

diff --git a/src/compiler/glsl/link_varyings.cpp 
b/src/compiler/glsl/link_varyings.cpp
index a7667a4..aa9b08b 100644
--- a/src/compiler/glsl/link_varyings.cpp
+++ b/src/compiler/glsl/link_varyings.cpp
@@ -812,15 +812,20 @@ tfeedback_decl::store(struct gl_context *ctx, struct 
gl_shader_program *prog,
   const unsigned max_outputs, bool *explicit_stride,
   bool has_xfb_qualifiers) const
 {
-   assert(!this->next_buffer_separator);
-
+   unsigned xfb_offset = 0;
+   unsigned size = this->size;
/* Handle gl_SkipComponents. */
if (this->skip_components) {
   info->Buffers[buffer].Stride += this->skip_components;
-  return true;
+  size = this->skip_components;
+  goto store_varying;
+   }
+
+   if (this->next_buffer_separator) {
+  size = 0;
+  goto store_varying;
}
 
-   unsigned xfb_offset = 0;
if (has_xfb_qualifiers) {
   xfb_offset = this->offset / 4;
} else {
@@ -828,37 +833,39 @@ tfeedback_decl::store(struct gl_context *ctx, struct 
gl_shader_program *prog,
}
info->Varyings[info->NumVarying].Offset = xfb_offset * 4;
 
-   unsigned location = this->location;
-   unsigned location_frac = this->location_frac;
-   unsigned num_components = this->num_components();
-   while (num_components > 0) {
-  unsigned output_size = MIN2(num_components, 4 - location_frac);
-  assert((info->NumOutputs == 0 && max_outputs == 0) ||
- info->NumOutputs < max_outputs);
+   {
+  unsigned location = this->location;
+  unsigned location_frac = this->location_frac;
+  unsigned num_components = this->num_components();
+  while (num_components > 0) {
+ unsigned output_size = MIN2(num_components, 4 - location_frac);
+ assert((info->NumOutputs == 0 && max_outputs == 0) ||
+info->NumOutputs < max_outputs);
+
+ /* From the ARB_enhanced_layouts spec:
+  *
+  *"If such a block member or variable is not written during a 
shader
+  *invocation, the buffer contents at the assigned offset will be
+  *undefined.  Even if there are no static writes to a variable or
+  *member that is assigned a transform feedback offset, the space 
is
+  *still allocated in the buffer and still affects the stride."
+  */
+ if (this->is_varying_written()) {
+info->Outputs[info->NumOutputs].ComponentOffset = location_frac;
+info->Outputs[info->NumOutputs].OutputRegister = location;
+info->Outputs[info->NumOutputs].NumComponents = output_size;
+info->Outputs[info->NumOutputs].StreamId = stream_id;
+info->Outputs[info->NumOutputs].OutputBuffer = buffer;
+info->Outputs[info->NumOutputs].DstOffset = xfb_offset;
+++info->NumOutputs;
+ }
+ info->Buffers[buffer].Stream = this->stream_id;
+ xfb_offset += output_size;
 
-  /* From the ARB_enhanced_layouts spec:
-   *
-   *"If such a block member or variable is not written during a shader
-   *invocation, the buffer contents at the assigned offset will be
-   *undefined.  Even if there are no static writes to a variable or
-   *member that is assigned a transform feedback offset, the space is
-   *still allocated in the buffer and still affects the stride."
-   */
-  if (this->is_varying_written()) {
- info->Outputs[info->NumOutputs].ComponentOffset = location_frac;
- info->Outputs[info->NumOutputs].OutputRegister = location;
- info->Outputs[info->NumOutputs].NumComponents = output_size;
- info->Outputs[info->NumOutputs].StreamId = stream_id;
- info->Outputs[info->NumOutputs].OutputBuffer = buffer;
- info->Outputs[info->NumOutputs].DstOffset = xfb_offset;
- ++info->NumOutputs;
+ num_components -= output_size;
+ location++;
+ location_frac = 0;
   }
-  info->Buffers[buffer].Stream = this->stream_id;
-  xfb_offset += output_size;
-
-  num_components -= output_size;
-  location++;
-  location_frac = 0;
}
 
if (explicit_stride && explicit_stride[buffer]) {
@@ -903,10 +910,11 @@ tfeedback_decl::store(struct gl_context *ctx, struct 
gl_shader_program *prog,
   return false;
}
 
+store_varying: