Commit ddba70da by Shahbaz Youssefi Committed by Commit Bot

Fix xfb mode validation with geometry/tessellation

In the presence of geometry and/or tessellation shaders, transform feedback mode must match what these shaders produce, instead of what's passed to glDrawArrays. Bug: angleproject:5557 Bug: angleproject:5579 Change-Id: I6a21621e66b31553ed6a3a50c3aebf60e1ac7be5 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2653908 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com>
parent a685db2e
...@@ -328,6 +328,8 @@ class ProgramExecutable final : public angle::Subject ...@@ -328,6 +328,8 @@ class ProgramExecutable final : public angle::Subject
int getGeometryShaderMaxVertices() const { return mGeometryShaderMaxVertices; } int getGeometryShaderMaxVertices() const { return mGeometryShaderMaxVertices; }
GLenum getTessGenMode() const { return mTessGenMode; }
private: private:
// TODO(timvp): http://anglebug.com/3570: Investigate removing these friend // TODO(timvp): http://anglebug.com/3570: Investigate removing these friend
// class declarations and accessing the necessary members with getters/setters. // class declarations and accessing the necessary members with getters/setters.
......
...@@ -735,6 +735,22 @@ bool ValidateTransformFeedbackPrimitiveMode(const Context *context, ...@@ -735,6 +735,22 @@ bool ValidateTransformFeedbackPrimitiveMode(const Context *context,
return transformFeedbackPrimitiveMode == renderPrimitiveMode; return transformFeedbackPrimitiveMode == renderPrimitiveMode;
} }
const ProgramExecutable *executable = context->getState().getProgramExecutable();
ASSERT(executable);
if (executable->hasLinkedShaderStage(ShaderType::Geometry))
{
// If geometry shader is active, transform feedback mode must match what is output from this
// stage.
renderPrimitiveMode = executable->getGeometryShaderOutputPrimitiveType();
}
else if (executable->hasLinkedShaderStage(ShaderType::TessEvaluation))
{
// Similarly with tessellation shaders, but only if no geometry shader is present. With
// tessellation shaders, only triangles are possibly output.
return transformFeedbackPrimitiveMode == PrimitiveMode::Triangles &&
executable->getTessGenMode() == GL_TRIANGLES;
}
// [GL_EXT_geometry_shader] Table 12.1gs // [GL_EXT_geometry_shader] Table 12.1gs
switch (renderPrimitiveMode) switch (renderPrimitiveMode)
{ {
......
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