Commit 140cb0ee authored by Andres Gomez's avatar Andres Gomez

arb_enhanced_layouts: add aliasing tests with mixed type widths

Added tests which check component aliasing between types that have
different bit widths.

From Section 4.4.1 (Input Layout Qualifiers) of the GLSL 4.60 spec:

    "Further, when location aliasing, the aliases sharing the location
     must have the same underlying numerical type and bit
     width (floating-point or integer, 32-bit versus 64-bit, etc.)
     and the same auxiliary storage and interpolation
     qualification. The one exception where component aliasing is
     permitted is for two input variables (not block members) to a
     vertex shader, which are allowed to have component aliasing. This
     vertex-variable component aliasing is intended only to support
     vertex shaders where each execution path accesses at most one
     input per each aliased component. Implementations are permitted,
     but not required, to generate link-time errors if they detect
     that every path through the vertex shader executable accesses
     multiple inputs aliased to any single component."

Cc: Timothy Arceri <tarceri@itsqueeze.com>
Cc: Iago Toral Quiroga <itoral@igalia.com>
Cc: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Andres Gomez's avatarAndres Gomez <agomez@igalia.com>
Reviewed-by: Juan A. Suárez's avatarJuan A. Suarez <jasuarez@igalia.com>
parent 7c5cdf51
// [config]
// expect_result: pass
// glsl_version: 1.50
// check_link: true
// require_extensions: GL_ARB_enhanced_layouts GL_ARB_explicit_attrib_location GL_ARB_gpu_shader_fp64 GL_ARB_vertex_attrib_64bit
// [end config]
//
// From Section 4.4.1 (Input Layout Qualifiers) of the GLSL 4.50 spec:
//
// "Further, when location aliasing, the aliases sharing the location must
// have the same underlying numerical type (floating-point or integer) and
// the same auxiliary storage and interpolation qualification"
//
// ...
//
// "The one exception where component aliasing is permitted is for two input
// variables (not block members) to a vertex shader, which are allowed to
// have component aliasing. This vertex-variable component aliasing is
// intended only to support vertex shaders where each execution path
// accesses at most one input per each aliased component. Implementations
// are permitted, but not required, to generate link-time errors if they
// detect that every path through the vertex shader executable accesses
// multiple inputs aliased to any single component."
//
// Issue 16 from the ARB_enhanced_layouts spec:
//
// "We do allow this for vertex shader inputs, because we've supported
// "aliasing" behavior since OpenGL 2.0. This allows for an "uber-shader"
// with variables like:
//
// layout(location=3) in float var1;
// layout(location=3) in int var2;
//
// where sometimes it uses <var1> and sometimes <var2>. Since we don't
// treat the code above (with overlapping components) as an error, it
// would be strange to treat non-overlapping component assignments as an
// error."
#version 150
#extension GL_ARB_enhanced_layouts: require
#extension GL_ARB_explicit_attrib_location: require
#extension GL_ARB_gpu_shader_fp64: require
#extension GL_ARB_vertex_attrib_64bit: require
uniform int i;
// consume X/Y components
layout(location = 0) in ivec2 a;
// consume Z/W components
layout(location = 0, component = 2) in double b;
void main()
{
if (i == 1)
gl_Position = vec4(a, 1.0, 1.0);
else
gl_Position = vec4(b);
}
// [config]
// expect_result: pass
// glsl_version: 1.50
// check_link: true
// require_extensions: GL_ARB_enhanced_layouts GL_ARB_explicit_attrib_location GL_ARB_gpu_shader_fp64 GL_ARB_vertex_attrib_64bit
// [end config]
//
// From Section 4.4.1 (Input Layout Qualifiers) of the GLSL 4.60 spec:
//
// "Further, when location aliasing, the aliases sharing the
// location must have the same underlying numerical type and bit
// width (floating-point or integer, 32-bit versus 64-bit, etc.)
// and the same auxiliary storage and interpolation
// qualification. The one exception where component aliasing is
// permitted is for two input variables (not block members) to a
// vertex shader, which are allowed to have component
// aliasing. This vertex-variable component aliasing is intended
// only to support vertex shaders where each execution path
// accesses at most one input per each aliased
// component. Implementations are permitted, but not required, to
// generate link-time errors if they detect that every path through
// the vertex shader executable accesses multiple inputs aliased to
// any single component."
//
// Issue 16 from the ARB_enhanced_layouts spec:
//
// "We do allow this for vertex shader inputs, because we've supported
// "aliasing" behavior since OpenGL 2.0. This allows for an "uber-shader"
// with variables like:
//
// layout(location=3) in float var1;
// layout(location=3) in int var2;
//
// where sometimes it uses <var1> and sometimes <var2>. Since we don't
// treat the code above (with overlapping components) as an error, it
// would be strange to treat non-overlapping component assignments as an
// error."
#version 150
#extension GL_ARB_enhanced_layouts: require
#extension GL_ARB_explicit_attrib_location: require
#extension GL_ARB_gpu_shader_fp64: require
#extension GL_ARB_vertex_attrib_64bit: require
uniform int i;
// consume X/Y components
layout(location = 0) in vec2 a;
// consume Z/W components
layout(location = 0, component = 2) in double b;
void main()
{
if (i == 1)
gl_Position = vec4(a, 1.0, 1.0);
else
gl_Position = vec4(b);
}
// From Section 4.4.1 (Input Layout Qualifiers) of the GLSL 4.50 spec:
// From Section 4.4.1 (Input Layout Qualifiers) of the GLSL 4.60 spec:
//
// "Location aliasing is causing two variables or block members to have the
// same location number. Component aliasing is assigning the same (or
// overlapping) component numbers for two location aliases. (Recall if
// component is not used, components are assigned starting with 0.) With one
// exception, location aliasing is allowed only if it does not cause
// component aliasing; it is a compile-time or link-time error to cause
// component aliasing."
//
// "Further, when location aliasing, the aliases sharing the location must
// have the same underlying numerical type (floating-point or integer) and
// the same auxiliary storage and interpolation qualification"
// "Location aliasing is causing two variables or block members to
// have the same location number. Component aliasing is assigning
// the same (or overlapping) component numbers for two location
// aliases. (Recall if component is not used, components are
// assigned starting with 0.) With one exception, location aliasing
// is allowed only if it does not cause component aliasing; it is a
// compile-time or link-time error to cause component
// aliasing. Further, when location aliasing, the aliases sharing
// the location must have the same underlying numerical type and
// bit width (floating-point or integer, 32-bit versus 64-bit,
// etc.) and the same auxiliary storage and interpolation
// qualification."
[require]
GLSL >= 1.50
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment