2
// Copyright 2019 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.
7
// Test various shader matrix variable declarations.
10
#include "test_utils/ANGLETest.h"
11
#include "test_utils/gl_raii.h"
13
using namespace angle;
18
class MatrixTest31 : public ANGLETest
26
setConfigGreenBits(8);
28
setConfigAlphaBits(8);
32
TEST_P(MatrixTest31, Mat3Varying)
34
constexpr char kVS[] = R"(#version 310 es
35
precision mediump float;
39
layout(location=0) out mat3 matrix;
40
layout(location=3) out vec3 vector;
46
gl_Position = a_position;
49
constexpr char kFS[] = R"(#version 310 es
50
precision mediump float;
52
layout(location=0) in mat3 matrix;
53
layout(location=3) in vec3 vector;
59
oColor = vec4(matrix[0], 1.0);
62
ANGLE_GL_PROGRAM(program, kVS, kFS);
63
glUseProgram(program);
64
drawQuad(program, "a_position", 0.5f);
68
TEST_P(MatrixTest31, Mat3VaryingBadLocation)
70
constexpr char kVS[] = R"(#version 310 es
71
precision mediump float;
75
layout(location=0) out mat3 matrix;
76
layout(location=2) out vec3 vector;
82
gl_Position = a_position;
87
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
88
const char *sourceVsArray[1] = {kVS};
89
glShaderSource(vs, 1, sourceVsArray, nullptr);
92
glGetShaderiv(vs, GL_COMPILE_STATUS, &compileResult);
93
EXPECT_GL_FALSE(compileResult);
96
TEST_P(MatrixTest31, Mat3x4Varying)
98
constexpr char kVS[] = R"(#version 310 es
99
precision mediump float;
103
layout(location=0) out mat3x4 matrix;
104
layout(location=3) out vec3 vector;
108
matrix = mat3x4(1.0);
110
gl_Position = a_position;
113
constexpr char kFS[] = R"(#version 310 es
114
precision mediump float;
116
layout(location=0) in mat3x4 matrix;
117
layout(location=3) in vec3 vector;
123
oColor = vec4(matrix[0]);
126
ANGLE_GL_PROGRAM(program, kVS, kFS);
127
glUseProgram(program);
128
drawQuad(program, "a_position", 0.5f);
129
EXPECT_GL_NO_ERROR();
132
TEST_P(MatrixTest31, Mat3x4VaryingBadLocation)
134
constexpr char kVS[] = R"(#version 310 es
135
precision mediump float;
139
layout(location=0) out mat3x4 matrix;
140
layout(location=2) out vec3 vector;
144
matrix = mat3x4(1.0);
146
gl_Position = a_position;
151
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
152
const char *sourceVsArray[1] = {kVS};
153
glShaderSource(vs, 1, sourceVsArray, nullptr);
156
glGetShaderiv(vs, GL_COMPILE_STATUS, &compileResult);
157
EXPECT_GL_FALSE(compileResult);
160
TEST_P(MatrixTest31, Mat3x4ArrayVarying)
162
constexpr char kVS[] = R"(#version 310 es
163
precision mediump float;
167
layout(location=0) out mat3x4[2] matrix;
168
layout(location=6) out vec3 vector;
172
matrix[0] = mat3x4(1.0);
173
matrix[1] = mat3x4(1.0);
175
gl_Position = a_position;
178
constexpr char kFS[] = R"(#version 310 es
179
precision mediump float;
181
layout(location=0) in mat3x4[2] matrix;
182
layout(location=6) in vec3 vector;
188
oColor = vec4(matrix[0][0]);
191
ANGLE_GL_PROGRAM(program, kVS, kFS);
192
glUseProgram(program);
193
drawQuad(program, "a_position", 0.5f);
194
EXPECT_GL_NO_ERROR();
197
TEST_P(MatrixTest31, Mat3x4ArrayVaryingBadLocation)
199
constexpr char kVS[] = R"(#version 310 es
200
precision mediump float;
204
layout(location=0) out mat3x4[2] matrix;
205
layout(location=5) out vec3 vector;
209
matrix[0] = mat3x4(1.0);
210
matrix[1] = mat3x4(1.0);
212
gl_Position = a_position;
217
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
218
const char *sourceVsArray[1] = {kVS};
219
glShaderSource(vs, 1, sourceVsArray, nullptr);
222
glGetShaderiv(vs, GL_COMPILE_STATUS, &compileResult);
223
EXPECT_GL_FALSE(compileResult);
226
TEST_P(MatrixTest31, Mat3x4StructVarying)
228
constexpr char kVS[] = R"(#version 310 es
229
precision mediump float;
237
layout(location=0) out S matrix;
238
layout(location=3) out vec3 vector;
242
matrix.m = mat3x4(1.0);
244
gl_Position = a_position;
247
constexpr char kFS[] = R"(#version 310 es
248
precision mediump float;
254
layout(location=0) in S matrix;
255
layout(location=3) in vec3 vector;
261
oColor = vec4(matrix.m[0]);
264
ANGLE_GL_PROGRAM(program, kVS, kFS);
265
glUseProgram(program);
266
drawQuad(program, "a_position", 0.5f);
267
EXPECT_GL_NO_ERROR();
270
TEST_P(MatrixTest31, Mat3x4StructVaryingBadLocation)
272
constexpr char kVS[] = R"(#version 310 es
273
precision mediump float;
281
layout(location=0) out S matrix;
282
layout(location=2) out vec3 vector;
286
matrix.m = mat3x4(1.0);
288
gl_Position = a_position;
293
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
294
const char *sourceVsArray[1] = {kVS};
295
glShaderSource(vs, 1, sourceVsArray, nullptr);
298
glGetShaderiv(vs, GL_COMPILE_STATUS, &compileResult);
299
EXPECT_GL_FALSE(compileResult);
302
ANGLE_INSTANTIATE_TEST_ES31(MatrixTest31);