Commit 2be71410 by Mohan Maiya Committed by Commit Bot

Handle inactive structure type varyings correctly

Correctly handle inactive varyings of structure type when collecting transform feedback varyings. Previously, all varyings of structure type were marked as active by mistake. Bug: angleproject:5557 Test: TransformFeedbackTest.InactiveStructureVarying* Change-Id: Ica1cbce5c551cdbb97999eeac59d09a961937615 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2770680 Commit-Queue: Mohan Maiya <m.maiya@samsung.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent 570970f9
...@@ -790,8 +790,8 @@ void VaryingPacking::collectTFVarying(const std::string &tfVarying, ...@@ -790,8 +790,8 @@ void VaryingPacking::collectTFVarying(const std::string &tfVarying,
collectUserVaryingFieldTF(ref, *field, fieldIndex, GL_INVALID_INDEX); collectUserVaryingFieldTF(ref, *field, fieldIndex, GL_INVALID_INDEX);
} }
(*uniqueFullNames)[ref.frontShaderStage].insert(tfVarying); (*uniqueFullNames)[ref.frontShaderStage].insert(tfVarying);
(*uniqueFullNames)[ref.frontShaderStage].insert(input->name);
} }
(*uniqueFullNames)[ref.frontShaderStage].insert(input->name);
} }
// Array as a whole and array element conflict has already been checked in // Array as a whole and array element conflict has already been checked in
// linkValidateTransformFeedback. // linkValidateTransformFeedback.
......
...@@ -751,6 +751,79 @@ TEST_P(TransformFeedbackTest, VertexOnly) ...@@ -751,6 +751,79 @@ TEST_P(TransformFeedbackTest, VertexOnly)
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
} }
// Test that we can link inactive structure type vayrings with xfb and capture varyings only used in
// the vertex shader.
TEST_P(TransformFeedbackTest, InactiveStructureVarying)
{
// TODO(anglebug.com/4533) This fails after the upgrade to the 26.20.100.7870 driver.
ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsVulkan());
constexpr char kVS[] =
R"(#version 300 es
in vec2 position;
in float attrib;
flat out struct
{
int test1;
float test2;
} outStruct;
out float varyingAttrib;
void main() {
gl_Position = vec4(position, 0, 1);
varyingAttrib = attrib;
})";
constexpr char kFS[] =
R"(#version 300 es
out mediump vec4 color;
void main() {
color = vec4(0.0, 1.0, 0.0, 1.0);
})";
std::vector<std::string> tfVaryings;
tfVaryings.push_back("varyingAttrib");
mProgram = CompileProgramWithTransformFeedback(kVS, kFS, tfVaryings, GL_INTERLEAVED_ATTRIBS);
ASSERT_NE(0u, mProgram);
glUseProgram(mProgram);
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedback);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer);
std::vector<float> attribData;
for (unsigned int cnt = 0; cnt < 100; ++cnt)
{
attribData.push_back(static_cast<float>(cnt));
}
GLint attribLocation = glGetAttribLocation(mProgram, "attrib");
ASSERT_NE(-1, attribLocation);
glVertexAttribPointer(attribLocation, 1, GL_FLOAT, GL_FALSE, 4, &attribData[0]);
glEnableVertexAttribArray(attribLocation);
glBeginTransformFeedback(GL_TRIANGLES);
drawQuad(mProgram, "position", 0.5f);
glEndTransformFeedback();
ASSERT_GL_NO_ERROR();
glUseProgram(0);
void *mappedBuffer =
glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(float) * 6, GL_MAP_READ_BIT);
ASSERT_NE(nullptr, mappedBuffer);
float *mappedFloats = static_cast<float *>(mappedBuffer);
for (unsigned int cnt = 0; cnt < 6; ++cnt)
{
EXPECT_EQ(attribData[cnt], mappedFloats[cnt]);
}
glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
EXPECT_GL_NO_ERROR();
}
// Test that multiple paused transform feedbacks do not generate errors or crash // Test that multiple paused transform feedbacks do not generate errors or crash
TEST_P(TransformFeedbackTest, MultiplePaused) TEST_P(TransformFeedbackTest, MultiplePaused)
{ {
......
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