blob: 8bdb4e71eef31432b1954d20d3a96559bd65d32d [file] [log] [blame]
Geoff Lang02f18b82014-09-17 11:42:17 -04001#include "ANGLETest.h"
2
3class TransformFeedbackTest : public ANGLETest
4{
5 protected:
6 TransformFeedbackTest()
7 {
8 setWindowWidth(128);
9 setWindowHeight(128);
10 setConfigRedBits(8);
11 setConfigGreenBits(8);
12 setConfigBlueBits(8);
13 setConfigAlphaBits(8);
14 setClientVersion(3);
15 }
16
17 virtual void SetUp()
18 {
19 ANGLETest::SetUp();
20
21 const std::string vertexShaderSource = SHADER_SOURCE
22 (
23 precision highp float;
24 attribute vec4 position;
25
26 void main()
27 {
28 gl_Position = position;
29 }
30 );
31
32 const std::string fragmentShaderSource = SHADER_SOURCE
33 (
34 precision highp float;
35
36 void main()
37 {
38 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
39 }
40 );
41
42 mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
43 if (mProgram == 0)
44 {
45 FAIL() << "shader compilation failed.";
46 }
47
48 glGenBuffers(1, &mTransformFeedbackBuffer);
49 mTransformFeedbackBufferSize = 1 << 24; // ~16MB
50 glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBuffer);
51 glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, mTransformFeedbackBufferSize, NULL, GL_STATIC_DRAW);
52
53 ASSERT_GL_NO_ERROR();
54 }
55
56 virtual void TearDown()
57 {
58 glDeleteProgram(mProgram);
59 glDeleteBuffers(1, &mTransformFeedbackBuffer);
60 ANGLETest::TearDown();
61 }
62
63 GLuint mProgram;
64
65 size_t mTransformFeedbackBufferSize;
66 GLuint mTransformFeedbackBuffer;
67};
68
69TEST_F(TransformFeedbackTest, ZeroSizedViewport)
70{
71 // Set the program's transform feedback varyings (just gl_Position)
72 const GLchar* transformFeedbackVaryings[] =
73 {
74 "gl_Position"
75 };
76 glTransformFeedbackVaryings(mProgram, ArraySize(transformFeedbackVaryings), transformFeedbackVaryings, GL_INTERLEAVED_ATTRIBS);
77 glLinkProgram(mProgram);
78
79 // Re-link the program
80 GLint linkStatus;
81 glGetProgramiv(mProgram, GL_LINK_STATUS, &linkStatus);
82 ASSERT_NE(linkStatus, 0);
83
84 glUseProgram(mProgram);
85
86 // Bind the buffer for transform feedback output and start transform feedback
87 glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer);
88 glBeginTransformFeedback(GL_TRIANGLES);
89
90 // Create a query to check how many primitives were written
91 GLuint primitivesWrittenQuery = 0;
92 glGenQueries(1, &primitivesWrittenQuery);
93 glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, primitivesWrittenQuery);
94
95 // Set a viewport that would result in no pixels being written to the framebuffer and draw
96 // a quad
97 glViewport(0, 0, 0, 0);
98
99 drawQuad(mProgram, "position", 0.5f);
100
101 // End the query and transform feedkback
102 glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
103 glEndTransformFeedback();
104
105 // Check how many primitives were written and verify that some were written even if
106 // no pixels were rendered
107 GLuint primitivesWritten = 0;
108 glGetQueryObjectuiv(primitivesWrittenQuery, GL_QUERY_RESULT_EXT, &primitivesWritten);
109 EXPECT_GL_NO_ERROR();
110
111 EXPECT_EQ(primitivesWritten, 2);
112}