Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / tests / angle_tests / TransformFeedbackTest.cpp
1 #include "ANGLETest.h"
2
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);
6
7 template<typename T>
8 class TransformFeedbackTest : public ANGLETest
9 {
10   protected:
11     TransformFeedbackTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetRequestedRenderer())
12     {
13         setWindowWidth(128);
14         setWindowHeight(128);
15         setConfigRedBits(8);
16         setConfigGreenBits(8);
17         setConfigBlueBits(8);
18         setConfigAlphaBits(8);
19     }
20
21     virtual void SetUp()
22     {
23         ANGLETest::SetUp();
24
25         const std::string vertexShaderSource = SHADER_SOURCE
26         (
27             precision highp float;
28             attribute vec4 position;
29
30             void main()
31             {
32                 gl_Position = position;
33             }
34         );
35
36         const std::string fragmentShaderSource = SHADER_SOURCE
37         (
38             precision highp float;
39
40             void main()
41             {
42                 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
43             }
44         );
45
46         mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
47         if (mProgram == 0)
48         {
49             FAIL() << "shader compilation failed.";
50         }
51
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);
56
57         ASSERT_GL_NO_ERROR();
58     }
59
60     virtual void TearDown()
61     {
62         glDeleteProgram(mProgram);
63         glDeleteBuffers(1, &mTransformFeedbackBuffer);
64         ANGLETest::TearDown();
65     }
66
67     GLuint mProgram;
68
69     size_t mTransformFeedbackBufferSize;
70     GLuint mTransformFeedbackBuffer;
71 };
72
73 TYPED_TEST(TransformFeedbackTest, ZeroSizedViewport)
74 {
75     // Set the program's transform feedback varyings (just gl_Position)
76     const GLchar* transformFeedbackVaryings[] =
77     {
78         "gl_Position"
79     };
80     glTransformFeedbackVaryings(mProgram, ArraySize(transformFeedbackVaryings), transformFeedbackVaryings, GL_INTERLEAVED_ATTRIBS);
81     glLinkProgram(mProgram);
82
83     // Re-link the program
84     GLint linkStatus;
85     glGetProgramiv(mProgram, GL_LINK_STATUS, &linkStatus);
86     ASSERT_NE(linkStatus, 0);
87
88     glUseProgram(mProgram);
89
90     // Bind the buffer for transform feedback output and start transform feedback
91     glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, mTransformFeedbackBuffer);
92     glBeginTransformFeedback(GL_TRIANGLES);
93
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);
98
99     // Set a viewport that would result in no pixels being written to the framebuffer and draw
100     // a quad
101     glViewport(0, 0, 0, 0);
102
103     drawQuad(mProgram, "position", 0.5f);
104
105     // End the query and transform feedkback
106     glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
107     glEndTransformFeedback();
108
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();
114
115     EXPECT_EQ(primitivesWritten, 2);
116 }