Commit 4c655248 by Jamie Madill Committed by Commit Bot

D3D11: Fix unreferenced XFB vars getting dropped.

Our for-loop logic was confused so that some unreferenced transform feedback varyings might get dropped. BUG=chromium:651493 Change-Id: Id283230da0a47fc647b2a3862da60be5538e439e Reviewed-on: https://chromium-review.googlesource.com/391945 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 0e48719f
...@@ -267,33 +267,37 @@ bool VaryingPacking::packVaryings(gl::InfoLog &infoLog, ...@@ -267,33 +267,37 @@ bool VaryingPacking::packVaryings(gl::InfoLog &infoLog,
continue; continue;
} }
bool found = false;
for (const PackedVarying &packedVarying : packedVaryings) for (const PackedVarying &packedVarying : packedVaryings)
{ {
const auto &varying = *packedVarying.varying; const auto &varying = *packedVarying.varying;
// Make sure transform feedback varyings aren't optimized out. // Make sure transform feedback varyings aren't optimized out.
if (uniqueVaryingNames.count(transformFeedbackVaryingName) == 0) if (uniqueVaryingNames.count(transformFeedbackVaryingName) > 0)
{ {
bool found = false; found = true;
if (transformFeedbackVaryingName == varying.name) break;
{ }
if (!packVarying(packedVarying))
{ if (transformFeedbackVaryingName == varying.name)
infoLog << "Could not pack varying " << varying.name; {
return false; if (!packVarying(packedVarying))
}
found = true;
break;
}
if (!found)
{ {
infoLog << "Transform feedback varying " << transformFeedbackVaryingName infoLog << "Could not pack varying " << varying.name;
<< " does not exist in the vertex shader.";
return false; return false;
} }
found = true;
break;
} }
} }
if (!found)
{
infoLog << "Transform feedback varying " << transformFeedbackVaryingName
<< " does not exist in the vertex shader.";
return false;
}
} }
// Sort the packed register list // Sort the packed register list
......
...@@ -823,6 +823,69 @@ TEST_P(TransformFeedbackTest, OptimizedVaryings) ...@@ -823,6 +823,69 @@ TEST_P(TransformFeedbackTest, OptimizedVaryings)
ASSERT_NE(0u, mProgram); ASSERT_NE(0u, mProgram);
} }
// Test an edge case where two varyings are unreferenced in the frag shader.
TEST_P(TransformFeedbackTest, TwoUnreferencedInFragShader)
{
// TODO(jmadill): With points and rasterizer discard?
const std::string &vertexShaderSource =
"#version 300 es\n"
"in vec3 position;\n"
"out vec3 outAttrib1;\n"
"out vec3 outAttrib2;\n"
"void main() {"
" outAttrib1 = position;\n"
" outAttrib2 = position;\n"
" gl_Position = vec4(position, 1);\n"
"}";
const std::string &fragmentShaderSource =
"#version 300 es\n"
"precision mediump float;\n"
"out vec4 color;\n"
"in vec3 outAttrib1;\n"
"in vec3 outAttrib2;\n"
"void main() {\n"
" color = vec4(0);\n"
"}";
std::vector<std::string> tfVaryings;
tfVaryings.push_back("outAttrib1");
tfVaryings.push_back("outAttrib2");
mProgram = CompileProgramWithTransformFeedback(vertexShaderSource, fragmentShaderSource,
tfVaryings, GL_INTERLEAVED_ATTRIBS);
ASSERT_NE(0u, mProgram);
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBuffer);
glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(Vector3) * 2 * 6, nullptr, GL_STREAM_DRAW);
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, mTransformFeedback);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer);
glUseProgram(mProgram);
glBeginTransformFeedback(GL_TRIANGLES);
drawQuad(mProgram, "position", 0.5f);
glEndTransformFeedback();
glUseProgram(0);
ASSERT_GL_NO_ERROR();
const GLvoid *mapPointer =
glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(Vector2) * 2 * 6, GL_MAP_READ_BIT);
ASSERT_NE(nullptr, mapPointer);
const auto &quadVertices = GetQuadVertices();
const Vector3 *vecPointer = static_cast<const Vector3 *>(mapPointer);
for (unsigned int vectorIndex = 0; vectorIndex < 3; ++vectorIndex)
{
unsigned int stream1Index = vectorIndex * 2;
unsigned int stream2Index = vectorIndex * 2 + 1;
EXPECT_EQ(quadVertices[vectorIndex], vecPointer[stream1Index]);
EXPECT_EQ(quadVertices[vectorIndex], vecPointer[stream2Index]);
}
ASSERT_GL_NO_ERROR();
}
class TransformFeedbackLifetimeTest : public TransformFeedbackTest class TransformFeedbackLifetimeTest : public TransformFeedbackTest
{ {
protected: protected:
......
...@@ -132,6 +132,16 @@ Vector3 operator-(const Vector3 &a, const Vector3 &b) ...@@ -132,6 +132,16 @@ Vector3 operator-(const Vector3 &a, const Vector3 &b)
return Vector3(a.x - b.x, a.y - b.y, a.z - b.z); return Vector3(a.x - b.x, a.y - b.y, a.z - b.z);
} }
bool operator==(const Vector3 &a, const Vector3 &b)
{
return (a.x == b.x && a.y == b.y && a.z == b.z);
}
bool operator!=(const Vector3 &a, const Vector3 &b)
{
return !(a == b);
}
Vector4::Vector4() : x(0.0f), y(0.0f), z(0.0f), w(0.0f) Vector4::Vector4() : x(0.0f), y(0.0f), z(0.0f), w(0.0f)
{ {
} }
......
...@@ -60,6 +60,8 @@ ANGLE_EXPORT Vector3 operator/(const Vector3 &a, const Vector3 &b); ...@@ -60,6 +60,8 @@ ANGLE_EXPORT Vector3 operator/(const Vector3 &a, const Vector3 &b);
ANGLE_EXPORT Vector3 operator/(const Vector3 &a, const float &b); ANGLE_EXPORT Vector3 operator/(const Vector3 &a, const float &b);
ANGLE_EXPORT Vector3 operator+(const Vector3 &a, const Vector3 &b); ANGLE_EXPORT Vector3 operator+(const Vector3 &a, const Vector3 &b);
ANGLE_EXPORT Vector3 operator-(const Vector3 &a, const Vector3 &b); ANGLE_EXPORT Vector3 operator-(const Vector3 &a, const Vector3 &b);
ANGLE_EXPORT bool operator==(const Vector3 &a, const Vector3 &b);
ANGLE_EXPORT bool operator!=(const Vector3 &a, const Vector3 &b);
struct ANGLE_EXPORT Vector4 struct ANGLE_EXPORT Vector4
{ {
......
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