3 // Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
4 typedef ::testing::Types<TFT<Gles::Three, Rend::D3D11>> TestFixtureTypes;
5 TYPED_TEST_CASE(TransformFeedbackTest, TestFixtureTypes);
8 class TransformFeedbackTest : public ANGLETest
11 TransformFeedbackTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetRequestedRenderer())
16 setConfigGreenBits(8);
18 setConfigAlphaBits(8);
25 const std::string vertexShaderSource = SHADER_SOURCE
27 precision highp float;
28 attribute vec4 position;
32 gl_Position = position;
36 const std::string fragmentShaderSource = SHADER_SOURCE
38 precision highp float;
42 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
46 mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
49 FAIL() << "shader compilation failed.";
52 glGenBuffers(1, &mTransformFeedbackBuffer);
53 mTransformFeedbackBufferSize = 1 << 24; // ~16MB
54 glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBuffer);
55 glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBufferSize, NULL, GL_STATIC_DRAW);
60 virtual void TearDown()
62 glDeleteProgram(mProgram);
63 glDeleteBuffers(1, &mTransformFeedbackBuffer);
64 ANGLETest::TearDown();
69 size_t mTransformFeedbackBufferSize;
70 GLuint mTransformFeedbackBuffer;
73 TYPED_TEST(TransformFeedbackTest, ZeroSizedViewport)
75 // Set the program's transform feedback varyings (just gl_Position)
76 const GLchar* transformFeedbackVaryings[] =
80 glTransformFeedbackVaryings(mProgram, ArraySize(transformFeedbackVaryings), transformFeedbackVaryings, GL_INTERLEAVED_ATTRIBS);
81 glLinkProgram(mProgram);
83 // Re-link the program
85 glGetProgramiv(mProgram, GL_LINK_STATUS, &linkStatus);
86 ASSERT_NE(linkStatus, 0);
88 glUseProgram(mProgram);
90 // Bind the buffer for transform feedback output and start transform feedback
91 glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer);
92 glBeginTransformFeedback(GL_TRIANGLES);
94 // Create a query to check how many primitives were written
95 GLuint primitivesWrittenQuery = 0;
96 glGenQueries(1, &primitivesWrittenQuery);
97 glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQuery);
99 // Set a viewport that would result in no pixels being written to the framebuffer and draw
101 glViewport(0, 0, 0, 0);
103 drawQuad(mProgram, "position", 0.5f);
105 // End the query and transform feedkback
106 glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
107 glEndTransformFeedback();
109 // Check how many primitives were written and verify that some were written even if
110 // no pixels were rendered
111 GLuint primitivesWritten = 0;
112 glGetQueryObjectuiv(primitivesWrittenQuery, GL_QUERY_RESULT_EXT, &primitivesWritten);
113 EXPECT_GL_NO_ERROR();
115 EXPECT_EQ(primitivesWritten, 2);