blob: 778fee9fe2558474b98b7f27edad3e548004a22d [file] [log] [blame]
Jamie Madillfa05f602015-05-07 13:47:11 -04001//
2// Copyright 2015 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
Corentin Wallezd3970de2015-05-14 11:07:48 -04007#include "test_utils/ANGLETest.h"
Geoff Lang1f12fa02013-10-23 13:24:53 -04008
Jamie Madillfa05f602015-05-07 13:47:11 -04009using namespace angle;
Austin Kinross18b931d2014-09-29 12:58:31 -070010
Geoff Lang1f12fa02013-10-23 13:24:53 -040011class LineLoopTest : public ANGLETest
12{
Jamie Madillfa05f602015-05-07 13:47:11 -040013 protected:
14 LineLoopTest()
Geoff Lang1f12fa02013-10-23 13:24:53 -040015 {
16 setWindowWidth(256);
17 setWindowHeight(256);
18 setConfigRedBits(8);
19 setConfigGreenBits(8);
20 setConfigBlueBits(8);
21 setConfigAlphaBits(8);
22 }
23
24 virtual void SetUp()
25 {
26 ANGLETest::SetUp();
27
28 const std::string vsSource = SHADER_SOURCE
29 (
30 attribute highp vec4 position;
Geoff Lang1f12fa02013-10-23 13:24:53 -040031
32 void main(void)
33 {
34 gl_Position = position;
Geoff Lang1f12fa02013-10-23 13:24:53 -040035 }
36 );
37
38 const std::string fsSource = SHADER_SOURCE
39 (
Geoff Langf34d1db2015-05-20 14:10:46 -040040 uniform highp vec4 color;
Geoff Lang1f12fa02013-10-23 13:24:53 -040041 void main(void)
42 {
43 gl_FragColor = color;
44 }
45 );
46
Jamie Madill5599c8f2014-08-26 13:16:39 -040047 mProgram = CompileProgram(vsSource, fsSource);
Geoff Lang1f12fa02013-10-23 13:24:53 -040048 if (mProgram == 0)
49 {
50 FAIL() << "shader compilation failed.";
51 }
52
53 mPositionLocation = glGetAttribLocation(mProgram, "position");
Corentin Wallez91f828e2015-07-13 11:08:19 -040054 mColorLocation = glGetUniformLocation(mProgram, "color");
Geoff Lang1f12fa02013-10-23 13:24:53 -040055
56 glBlendFunc(GL_ONE, GL_ONE);
57 glEnable(GL_BLEND);
Geoff Lang1f12fa02013-10-23 13:24:53 -040058 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
Geoff Lang1f12fa02013-10-23 13:24:53 -040059
60 ASSERT_GL_NO_ERROR();
61 }
62
63 virtual void TearDown()
64 {
65 glDeleteProgram(mProgram);
66
67 ANGLETest::TearDown();
68 }
69
Minmin Gong794e0002015-04-07 18:31:54 -070070 void runTest(GLenum indexType, GLuint indexBuffer, const GLvoid *indexPtr)
Geoff Lang1f12fa02013-10-23 13:24:53 -040071 {
Corentin Wallez91f828e2015-07-13 11:08:19 -040072 glClear(GL_COLOR_BUFFER_BIT);
73
Geoff Lang1f12fa02013-10-23 13:24:53 -040074 static const GLfloat loopPositions[] =
75 {
76 0.0f, 0.0f,
77 0.0f, 0.0f,
78 0.0f, 0.0f,
79 0.0f, 0.0f,
80 0.0f, 0.0f,
81 0.0f, 0.0f,
82 -0.5f, -0.5f,
83 -0.5f, 0.5f,
84 0.5f, 0.5f,
85 0.5f, -0.5f
86 };
87
88 static const GLfloat stripPositions[] =
89 {
90 -0.5f, -0.5f,
91 -0.5f, 0.5f,
92 0.5f, 0.5f,
93 0.5f, -0.5f
94 };
95 static const GLubyte stripIndices[] =
96 {
Corentin Wallez91f828e2015-07-13 11:08:19 -040097 1, 0, 3, 2, 1
Geoff Lang1f12fa02013-10-23 13:24:53 -040098 };
99
100 glUseProgram(mProgram);
101 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
102 glEnableVertexAttribArray(mPositionLocation);
103 glVertexAttribPointer(mPositionLocation, 2, GL_FLOAT, GL_FALSE, 0, loopPositions);
104 glUniform4f(mColorLocation, 0.0f, 0.0f, 1.0f, 1.0f);
105 glDrawElements(GL_LINE_LOOP, 4, indexType, indexPtr);
106
107 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
108 glVertexAttribPointer(mPositionLocation, 2, GL_FLOAT, GL_FALSE, 0, stripPositions);
109 glUniform4f(mColorLocation, 0, 1, 0, 1);
110 glDrawElements(GL_LINE_STRIP, 5, GL_UNSIGNED_BYTE, stripIndices);
111
112 std::vector<GLubyte> pixels(getWindowWidth() * getWindowHeight() * 4);
Jamie Madillb4fd0c92014-10-01 17:40:24 -0400113 glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE, &pixels[0]);
Geoff Lang1f12fa02013-10-23 13:24:53 -0400114
Corentin Wallez91f828e2015-07-13 11:08:19 -0400115 ASSERT_GL_NO_ERROR();
116
Geoff Lang1f12fa02013-10-23 13:24:53 -0400117 for (int y = 0; y < getWindowHeight(); y++)
118 {
119 for (int x = 0; x < getWindowWidth(); x++)
120 {
Jamie Madillb4fd0c92014-10-01 17:40:24 -0400121 const GLubyte* pixel = &pixels[0] + ((y * getWindowWidth() + x) * 4);
Geoff Lang1f12fa02013-10-23 13:24:53 -0400122
123 EXPECT_EQ(pixel[0], 0);
124 EXPECT_EQ(pixel[1], pixel[2]);
125 EXPECT_EQ(pixel[3], 255);
126 }
127 }
128 }
129
130 GLuint mProgram;
131 GLint mPositionLocation;
132 GLint mColorLocation;
133};
134
Jamie Madillfa05f602015-05-07 13:47:11 -0400135TEST_P(LineLoopTest, LineLoopUByteIndices)
Geoff Lang1f12fa02013-10-23 13:24:53 -0400136{
Austin Kinrossd544cc92016-01-11 15:26:42 -0800137 // Disable D3D11 SDK Layers warnings checks, see ANGLE issue 667 for details
138 // On Win7, the D3D SDK Layers emits a false warning for these tests.
139 // This doesn't occur on Windows 10 (Version 1511) though.
140 ignoreD3D11SDKLayersWarnings();
141
Geoff Lang1f12fa02013-10-23 13:24:53 -0400142 static const GLubyte indices[] = { 0, 7, 6, 9, 8, 0 };
143 runTest(GL_UNSIGNED_BYTE, 0, indices + 1);
144}
145
Jamie Madillfa05f602015-05-07 13:47:11 -0400146TEST_P(LineLoopTest, LineLoopUShortIndices)
Geoff Lang1f12fa02013-10-23 13:24:53 -0400147{
Austin Kinrossd544cc92016-01-11 15:26:42 -0800148 // Disable D3D11 SDK Layers warnings checks, see ANGLE issue 667 for details
149 ignoreD3D11SDKLayersWarnings();
150
Geoff Lang1f12fa02013-10-23 13:24:53 -0400151 static const GLushort indices[] = { 0, 7, 6, 9, 8, 0 };
152 runTest(GL_UNSIGNED_SHORT, 0, indices + 1);
153}
154
Jamie Madillfa05f602015-05-07 13:47:11 -0400155TEST_P(LineLoopTest, LineLoopUIntIndices)
Geoff Lang1f12fa02013-10-23 13:24:53 -0400156{
157 if (!extensionEnabled("GL_OES_element_index_uint"))
158 {
159 return;
160 }
161
Austin Kinrossd544cc92016-01-11 15:26:42 -0800162 // Disable D3D11 SDK Layers warnings checks, see ANGLE issue 667 for details
163 ignoreD3D11SDKLayersWarnings();
164
Geoff Lang1f12fa02013-10-23 13:24:53 -0400165 static const GLuint indices[] = { 0, 7, 6, 9, 8, 0 };
166 runTest(GL_UNSIGNED_INT, 0, indices + 1);
167}
168
Jamie Madillfa05f602015-05-07 13:47:11 -0400169TEST_P(LineLoopTest, LineLoopUByteIndexBuffer)
Geoff Lang1f12fa02013-10-23 13:24:53 -0400170{
Austin Kinrossd544cc92016-01-11 15:26:42 -0800171 // Disable D3D11 SDK Layers warnings checks, see ANGLE issue 667 for details
172 ignoreD3D11SDKLayersWarnings();
173
Geoff Lang1f12fa02013-10-23 13:24:53 -0400174 static const GLubyte indices[] = { 0, 7, 6, 9, 8, 0 };
175
176 GLuint buf;
177 glGenBuffers(1, &buf);
178 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf);
179 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
180
181 runTest(GL_UNSIGNED_BYTE, buf, reinterpret_cast<const void *>(sizeof(GLubyte)));
182
183 glDeleteBuffers(1, &buf);
184}
185
Jamie Madillfa05f602015-05-07 13:47:11 -0400186TEST_P(LineLoopTest, LineLoopUShortIndexBuffer)
Geoff Lang1f12fa02013-10-23 13:24:53 -0400187{
Austin Kinrossd544cc92016-01-11 15:26:42 -0800188 // Disable D3D11 SDK Layers warnings checks, see ANGLE issue 667 for details
189 ignoreD3D11SDKLayersWarnings();
190
Geoff Lang1f12fa02013-10-23 13:24:53 -0400191 static const GLushort indices[] = { 0, 7, 6, 9, 8, 0 };
192
193 GLuint buf;
194 glGenBuffers(1, &buf);
195 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf);
196 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
197
198 runTest(GL_UNSIGNED_SHORT, buf, reinterpret_cast<const void *>(sizeof(GLushort)));
199
200 glDeleteBuffers(1, &buf);
201}
202
Jamie Madillfa05f602015-05-07 13:47:11 -0400203TEST_P(LineLoopTest, LineLoopUIntIndexBuffer)
Geoff Lang1f12fa02013-10-23 13:24:53 -0400204{
205 if (!extensionEnabled("GL_OES_element_index_uint"))
206 {
207 return;
208 }
209
Austin Kinrossd544cc92016-01-11 15:26:42 -0800210 // Disable D3D11 SDK Layers warnings checks, see ANGLE issue 667 for details
211 ignoreD3D11SDKLayersWarnings();
212
Geoff Lang1f12fa02013-10-23 13:24:53 -0400213 static const GLuint indices[] = { 0, 7, 6, 9, 8, 0 };
214
215 GLuint buf;
216 glGenBuffers(1, &buf);
217 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf);
218 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
219
220 runTest(GL_UNSIGNED_INT, buf, reinterpret_cast<const void *>(sizeof(GLuint)));
221
222 glDeleteBuffers(1, &buf);
223}
Jamie Madillfa05f602015-05-07 13:47:11 -0400224
225// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
Geoff Lange0cc2a42016-01-20 10:58:17 -0500226ANGLE_INSTANTIATE_TEST(LineLoopTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES());