blob: 4806abd07bfbb4304dd706a5d52b1f779216f56c [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// SimpleOperationTest:
7// Basic GL commands such as linking a program, initializing a buffer, etc.
8
Corentin Wallezd3970de2015-05-14 11:07:48 -04009#include "test_utils/ANGLETest.h"
Geoff Langf1e85922015-02-23 14:40:04 -050010
11#include <vector>
12
Jamie Madillcc6ac252017-01-25 12:57:21 -080013#include "random_utils.h"
14#include "test_utils/gl_raii.h"
15
Jamie Madillfa05f602015-05-07 13:47:11 -040016using namespace angle;
Geoff Langf1e85922015-02-23 14:40:04 -050017
Jamie Madillfa05f602015-05-07 13:47:11 -040018namespace
19{
20
Geoff Langf1e85922015-02-23 14:40:04 -050021class SimpleOperationTest : public ANGLETest
22{
23 protected:
Jamie Madillfa05f602015-05-07 13:47:11 -040024 SimpleOperationTest()
Geoff Langf1e85922015-02-23 14:40:04 -050025 {
26 setWindowWidth(128);
27 setWindowHeight(128);
28 setConfigRedBits(8);
29 setConfigGreenBits(8);
30 setConfigBlueBits(8);
31 setConfigAlphaBits(8);
32 }
Jamie Madillcc6ac252017-01-25 12:57:21 -080033
34 void verifyBuffer(const std::vector<uint8_t> &data, GLenum binding);
Geoff Langf1e85922015-02-23 14:40:04 -050035};
36
Jamie Madillcc6ac252017-01-25 12:57:21 -080037void SimpleOperationTest::verifyBuffer(const std::vector<uint8_t> &data, GLenum binding)
38{
39 if (!extensionEnabled("GL_EXT_map_buffer_range"))
40 {
41 return;
42 }
43
44 uint8_t *mapPointer =
45 static_cast<uint8_t *>(glMapBufferRangeEXT(GL_ARRAY_BUFFER, 0, 1024, GL_MAP_READ_BIT));
46 ASSERT_GL_NO_ERROR();
47
48 std::vector<uint8_t> readbackData(data.size());
49 memcpy(readbackData.data(), mapPointer, data.size());
50 glUnmapBufferOES(GL_ARRAY_BUFFER);
51
52 EXPECT_EQ(data, readbackData);
53}
54
Jamie Madillfa05f602015-05-07 13:47:11 -040055TEST_P(SimpleOperationTest, CompileVertexShader)
Geoff Langf1e85922015-02-23 14:40:04 -050056{
57 const std::string source = SHADER_SOURCE
58 (
59 attribute vec4 a_input;
60 void main()
61 {
62 gl_Position = a_input;
63 }
64 );
65
66 GLuint shader = CompileShader(GL_VERTEX_SHADER, source);
67 EXPECT_NE(shader, 0u);
68 glDeleteShader(shader);
69
70 EXPECT_GL_NO_ERROR();
71}
72
Jamie Madillfa05f602015-05-07 13:47:11 -040073TEST_P(SimpleOperationTest, CompileFragmentShader)
Geoff Langf1e85922015-02-23 14:40:04 -050074{
75 const std::string source = SHADER_SOURCE
76 (
77 precision mediump float;
78 varying vec4 v_input;
79 void main()
80 {
81 gl_FragColor = v_input;
82 }
83 );
84
85 GLuint shader = CompileShader(GL_FRAGMENT_SHADER, source);
86 EXPECT_NE(shader, 0u);
87 glDeleteShader(shader);
88
89 EXPECT_GL_NO_ERROR();
90}
Geoff Langb1f435e2015-02-20 10:01:01 -050091
Jamie Madillfa05f602015-05-07 13:47:11 -040092TEST_P(SimpleOperationTest, LinkProgram)
Geoff Langb1f435e2015-02-20 10:01:01 -050093{
94 const std::string vsSource = SHADER_SOURCE
95 (
96 void main()
97 {
98 gl_Position = vec4(1.0, 1.0, 1.0, 1.0);
99 }
100 );
101
102 const std::string fsSource = SHADER_SOURCE
103 (
104 void main()
105 {
106 gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
107 }
108 );
109
110 GLuint program = CompileProgram(vsSource, fsSource);
111 EXPECT_NE(program, 0u);
112 glDeleteProgram(program);
113
114 EXPECT_GL_NO_ERROR();
115}
116
Jamie Madillfa05f602015-05-07 13:47:11 -0400117TEST_P(SimpleOperationTest, LinkProgramWithUniforms)
Geoff Langb1f435e2015-02-20 10:01:01 -0500118{
119 const std::string vsSource = SHADER_SOURCE
120 (
121 void main()
122 {
123 gl_Position = vec4(1.0, 1.0, 1.0, 1.0);
124 }
125 );
126
127 const std::string fsSource = SHADER_SOURCE
128 (
129 precision mediump float;
130 uniform vec4 u_input;
131 void main()
132 {
133 gl_FragColor = u_input;
134 }
135 );
136
137 GLuint program = CompileProgram(vsSource, fsSource);
138 EXPECT_NE(program, 0u);
139
140 GLint uniformLoc = glGetUniformLocation(program, "u_input");
141 EXPECT_NE(-1, uniformLoc);
142
143 glDeleteProgram(program);
144
145 EXPECT_GL_NO_ERROR();
146}
147
Jamie Madillfa05f602015-05-07 13:47:11 -0400148TEST_P(SimpleOperationTest, LinkProgramWithAttributes)
Geoff Langb1f435e2015-02-20 10:01:01 -0500149{
150 const std::string vsSource = SHADER_SOURCE
151 (
152 attribute vec4 a_input;
153 void main()
154 {
155 gl_Position = a_input;
156 }
157 );
158
159 const std::string fsSource = SHADER_SOURCE
160 (
161 void main()
162 {
163 gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
164 }
165 );
166
167 GLuint program = CompileProgram(vsSource, fsSource);
168 EXPECT_NE(program, 0u);
169
170 GLint attribLoc = glGetAttribLocation(program, "a_input");
171 EXPECT_NE(-1, attribLoc);
172
173 glDeleteProgram(program);
174
175 EXPECT_GL_NO_ERROR();
176}
Geoff Lang36c79012015-02-24 11:47:20 -0500177
Jamie Madillfa05f602015-05-07 13:47:11 -0400178TEST_P(SimpleOperationTest, BufferDataWithData)
Geoff Lang36c79012015-02-24 11:47:20 -0500179{
Jamie Madillcc6ac252017-01-25 12:57:21 -0800180 GLBuffer buffer;
181 glBindBuffer(GL_ARRAY_BUFFER, buffer.get());
Geoff Lang36c79012015-02-24 11:47:20 -0500182
183 std::vector<uint8_t> data(1024);
Jamie Madillcc6ac252017-01-25 12:57:21 -0800184 FillVectorWithRandomUBytes(&data);
Geoff Lang36c79012015-02-24 11:47:20 -0500185 glBufferData(GL_ARRAY_BUFFER, data.size(), &data[0], GL_STATIC_DRAW);
186
Jamie Madillcc6ac252017-01-25 12:57:21 -0800187 verifyBuffer(data, GL_ARRAY_BUFFER);
Geoff Lang36c79012015-02-24 11:47:20 -0500188
189 EXPECT_GL_NO_ERROR();
190}
191
Jamie Madillfa05f602015-05-07 13:47:11 -0400192TEST_P(SimpleOperationTest, BufferDataWithNoData)
Geoff Lang36c79012015-02-24 11:47:20 -0500193{
Jamie Madillcc6ac252017-01-25 12:57:21 -0800194 GLBuffer buffer;
195 glBindBuffer(GL_ARRAY_BUFFER, buffer.get());
Geoff Lang36c79012015-02-24 11:47:20 -0500196 glBufferData(GL_ARRAY_BUFFER, 1024, nullptr, GL_STATIC_DRAW);
Geoff Lang36c79012015-02-24 11:47:20 -0500197
198 EXPECT_GL_NO_ERROR();
199}
200
Jamie Madillfa05f602015-05-07 13:47:11 -0400201TEST_P(SimpleOperationTest, BufferSubData)
Geoff Lang36c79012015-02-24 11:47:20 -0500202{
Jamie Madillcc6ac252017-01-25 12:57:21 -0800203 GLBuffer buffer;
204 glBindBuffer(GL_ARRAY_BUFFER, buffer.get());
Geoff Lang36c79012015-02-24 11:47:20 -0500205
Jamie Madillcc6ac252017-01-25 12:57:21 -0800206 constexpr size_t bufferSize = 1024;
207 std::vector<uint8_t> data(bufferSize);
208 FillVectorWithRandomUBytes(&data);
209
Geoff Lang36c79012015-02-24 11:47:20 -0500210 glBufferData(GL_ARRAY_BUFFER, bufferSize, nullptr, GL_STATIC_DRAW);
211
Jamie Madillcc6ac252017-01-25 12:57:21 -0800212 constexpr size_t subDataCount = 16;
213 constexpr size_t sliceSize = bufferSize / subDataCount;
Geoff Lang36c79012015-02-24 11:47:20 -0500214 for (size_t i = 0; i < subDataCount; i++)
215 {
Jamie Madillcc6ac252017-01-25 12:57:21 -0800216 size_t offset = i * sliceSize;
217 glBufferSubData(GL_ARRAY_BUFFER, offset, sliceSize, &data[offset]);
Geoff Lang36c79012015-02-24 11:47:20 -0500218 }
219
Jamie Madillcc6ac252017-01-25 12:57:21 -0800220 verifyBuffer(data, GL_ARRAY_BUFFER);
Geoff Lang36c79012015-02-24 11:47:20 -0500221
222 EXPECT_GL_NO_ERROR();
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(SimpleOperationTest,
227 ES2_D3D9(),
Austin Kinross2a63b3f2016-02-08 12:29:08 -0800228 ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE),
229 ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE),
Geoff Lange0cc2a42016-01-20 10:58:17 -0500230 ES3_D3D11(),
231 ES2_OPENGL(),
232 ES3_OPENGL(),
233 ES2_OPENGLES(),
234 ES3_OPENGLES());
Jamie Madillfa05f602015-05-07 13:47:11 -0400235
236} // namespace