Commit 2c90a90a by Jamie Madill Committed by Commit Bot

Geometry Shaders: Don't require 'flat' for integer varyings.

The 3.2 spec and the dEQP tests are quite clear in only requiring the 'flat' on fragment shader inputs. This restriction remains on older shader versions. Bug: angleproject:5409 Change-Id: Icc4b113b404280c2867a3e0bf6f77256a4316bff Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2574826 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent a10d694e
......@@ -2445,7 +2445,10 @@ void TParseContext::checkInputOutputTypeIsValidES3(const TQualifier qualifier,
bool typeContainsIntegers =
(type.getBasicType() == EbtInt || type.getBasicType() == EbtUInt ||
type.isStructureContainingType(EbtInt) || type.isStructureContainingType(EbtUInt));
if (typeContainsIntegers && qualifier != EvqFlatIn && qualifier != EvqFlatOut)
bool extendedShaderTypes =
mShaderVersion == 320 || isExtensionEnabled(TExtension::EXT_geometry_shader);
if (typeContainsIntegers && qualifier != EvqFlatIn && qualifier != EvqFlatOut &&
(!extendedShaderTypes || mShaderType == GL_FRAGMENT_SHADER))
{
error(qualifierLocation, "must use 'flat' interpolation here",
getQualifierString(qualifier));
......
......@@ -616,8 +616,8 @@ class TParseContext : angle::NonCopyable
// followed by a declarator.
bool mDeferredNonEmptyDeclarationErrorCheck;
sh::GLenum mShaderType; // vertex or fragment language (future: pack or unpack)
ShShaderSpec mShaderSpec; // The language specification compiler conforms to - GLES2 or WebGL.
sh::GLenum mShaderType; // vertex/fragment/geometry/etc shader
ShShaderSpec mShaderSpec; // The language specification compiler conforms to - GLES/WebGL/etc.
ShCompileOptions mCompileOptions; // Options passed to TCompiler
int mShaderVersion;
TIntermBlock *mTreeRoot; // root of parse tree being created
......
......@@ -819,6 +819,42 @@ TEST_P(GeometryShaderTest, NegativeLayeredFramebufferCompletenessWithCubeMapText
EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, status);
}
// Verify that we can use default interpolation in the GS.
TEST_P(GeometryShaderTest, FlatQualifierNotRequired)
{
ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_geometry_shader"));
constexpr char kGS[] = R"(#version 310 es
#extension GL_EXT_geometry_shader : require
layout(points) in;
layout(points, max_vertices=1) out;
in highp int target[];
highp uniform vec4 dummyZero; // Default value is vec4(0.0).
void main()
{
highp vec4 retValue = dummyZero;
retValue += vec4(float(target[0]));
retValue += gl_in[0].gl_Position;
gl_Position = retValue;
EmitVertex();
})";
GLuint geometryShader = CompileShader(GL_GEOMETRY_SHADER_EXT, kGS);
EXPECT_NE(0u, geometryShader);
GLuint programID = glCreateProgram();
glAttachShader(programID, geometryShader);
glDetachShader(programID, geometryShader);
glDeleteShader(geometryShader);
glDeleteProgram(programID);
EXPECT_GL_NO_ERROR();
}
ANGLE_INSTANTIATE_TEST_ES3(GeometryShaderTestES3);
ANGLE_INSTANTIATE_TEST_ES31(GeometryShaderTest);
} // namespace
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