ES31: Add link validation on geometry shader itself
This patch intends to support program link validation on geometry
shader itself. A link error should occur when linking a program with
a geometry shader that lacks input primitive or output primitive or
the declaration of 'max_vertices'.
This patch also adds the support of linking a program with geometry
shader in angle_end2end_tests.
BUG=angleproject:1941
TEST=angle_end2end_tests
dEQP-GLES31.functional.shaders.linkage.es31.geometry.varying.rules.unspecified_*
Change-Id: I25fb08514753102f5dd3ab86211c05d2ca4fd185
Reviewed-on: https://chromium-review.googlesource.com/898842
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/MemoryProgramCache.cpp b/src/libANGLE/MemoryProgramCache.cpp
index 4f01c62..89721fd 100644
--- a/src/libANGLE/MemoryProgramCache.cpp
+++ b/src/libANGLE/MemoryProgramCache.cpp
@@ -230,6 +230,11 @@
state->mComputeShaderLocalSize[1] = stream.readInt<int>();
state->mComputeShaderLocalSize[2] = stream.readInt<int>();
+ state->mGeometryShaderInputPrimitiveType = stream.readInt<GLenum>();
+ state->mGeometryShaderOutputPrimitiveType = stream.readInt<GLenum>();
+ state->mGeometryShaderInvocations = stream.readInt<int>();
+ state->mGeometryShaderMaxVertices = stream.readInt<int>();
+
state->mNumViews = stream.readInt<int>();
static_assert(MAX_VERTEX_ATTRIBS * 2 <= sizeof(uint32_t) * 8,
@@ -451,6 +456,12 @@
stream.writeInt(computeLocalSize[1]);
stream.writeInt(computeLocalSize[2]);
+ ASSERT(state.mGeometryShaderInvocations >= 1 && state.mGeometryShaderMaxVertices >= 0);
+ stream.writeInt(state.mGeometryShaderInputPrimitiveType);
+ stream.writeInt(state.mGeometryShaderOutputPrimitiveType);
+ stream.writeInt(state.mGeometryShaderInvocations);
+ stream.writeInt(state.mGeometryShaderMaxVertices);
+
stream.writeInt(state.mNumViews);
static_assert(MAX_VERTEX_ATTRIBS * 2 <= sizeof(uint32_t) * 8,
@@ -604,10 +615,11 @@
const Shader *vertexShader = program->getAttachedVertexShader();
const Shader *fragmentShader = program->getAttachedFragmentShader();
const Shader *computeShader = program->getAttachedComputeShader();
+ const Shader *geometryShader = program->getAttachedGeometryShader();
// Compute the program hash. Start with the shader hashes and resource strings.
HashStream hashStream;
- hashStream << vertexShader << fragmentShader << computeShader;
+ hashStream << vertexShader << fragmentShader << computeShader << geometryShader;
// Add some ANGLE metadata and Context properties, such as version and back-end.
hashStream << ANGLE_COMMIT_HASH << context->getClientMajorVersion()