aboutsummaryrefslogtreecommitdiff
path: root/tests/angle_tests/TransformFeedbackTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/angle_tests/TransformFeedbackTest.cpp')
-rw-r--r--tests/angle_tests/TransformFeedbackTest.cpp112
1 files changed, 112 insertions, 0 deletions
diff --git a/tests/angle_tests/TransformFeedbackTest.cpp b/tests/angle_tests/TransformFeedbackTest.cpp
new file mode 100644
index 00000000..8bdb4e71
--- /dev/null
+++ b/tests/angle_tests/TransformFeedbackTest.cpp
@@ -0,0 +1,112 @@
+#include "ANGLETest.h"
+
+class TransformFeedbackTest : public ANGLETest
+{
+ protected:
+ TransformFeedbackTest()
+ {
+ setWindowWidth(128);
+ setWindowHeight(128);
+ setConfigRedBits(8);
+ setConfigGreenBits(8);
+ setConfigBlueBits(8);
+ setConfigAlphaBits(8);
+ setClientVersion(3);
+ }
+
+ virtual void SetUp()
+ {
+ ANGLETest::SetUp();
+
+ const std::string vertexShaderSource = SHADER_SOURCE
+ (
+ precision highp float;
+ attribute vec4 position;
+
+ void main()
+ {
+ gl_Position = position;
+ }
+ );
+
+ const std::string fragmentShaderSource = SHADER_SOURCE
+ (
+ precision highp float;
+
+ void main()
+ {
+ gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
+ }
+ );
+
+ mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
+ if (mProgram == 0)
+ {
+ FAIL() << "shader compilation failed.";
+ }
+
+ glGenBuffers(1, &mTransformFeedbackBuffer);
+ mTransformFeedbackBufferSize = 1 << 24; // ~16MB
+ glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBuffer);
+ glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBufferSize, NULL, GL_STATIC_DRAW);
+
+ ASSERT_GL_NO_ERROR();
+ }
+
+ virtual void TearDown()
+ {
+ glDeleteProgram(mProgram);
+ glDeleteBuffers(1, &mTransformFeedbackBuffer);
+ ANGLETest::TearDown();
+ }
+
+ GLuint mProgram;
+
+ size_t mTransformFeedbackBufferSize;
+ GLuint mTransformFeedbackBuffer;
+};
+
+TEST_F(TransformFeedbackTest, ZeroSizedViewport)
+{
+ // Set the program's transform feedback varyings (just gl_Position)
+ const GLchar* transformFeedbackVaryings[] =
+ {
+ "gl_Position"
+ };
+ glTransformFeedbackVaryings(mProgram, ArraySize(transformFeedbackVaryings), transformFeedbackVaryings, GL_INTERLEAVED_ATTRIBS);
+ glLinkProgram(mProgram);
+
+ // Re-link the program
+ GLint linkStatus;
+ glGetProgramiv(mProgram, GL_LINK_STATUS, &linkStatus);
+ ASSERT_NE(linkStatus, 0);
+
+ glUseProgram(mProgram);
+
+ // Bind the buffer for transform feedback output and start transform feedback
+ glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer);
+ glBeginTransformFeedback(GL_TRIANGLES);
+
+ // Create a query to check how many primitives were written
+ GLuint primitivesWrittenQuery = 0;
+ glGenQueries(1, &primitivesWrittenQuery);
+ glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQuery);
+
+ // Set a viewport that would result in no pixels being written to the framebuffer and draw
+ // a quad
+ glViewport(0, 0, 0, 0);
+
+ drawQuad(mProgram, "position", 0.5f);
+
+ // End the query and transform feedkback
+ glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
+ glEndTransformFeedback();
+
+ // Check how many primitives were written and verify that some were written even if
+ // no pixels were rendered
+ GLuint primitivesWritten = 0;
+ glGetQueryObjectuiv(primitivesWrittenQuery, GL_QUERY_RESULT_EXT, &primitivesWritten);
+ EXPECT_GL_NO_ERROR();
+
+ EXPECT_EQ(primitivesWritten, 2);
+}