1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker #include "util/shader_utils.h"
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker #include <cstring>
10*8975f5c5SAndroid Build Coastguard Worker #include <fstream>
11*8975f5c5SAndroid Build Coastguard Worker #include <iostream>
12*8975f5c5SAndroid Build Coastguard Worker #include <vector>
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Worker #include "common/utilities.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "util/test_utils.h"
16*8975f5c5SAndroid Build Coastguard Worker
17*8975f5c5SAndroid Build Coastguard Worker namespace
18*8975f5c5SAndroid Build Coastguard Worker {
CompileProgramInternal(const char * vsSource,const char * tcsSource,const char * tesSource,const char * gsSource,const char * fsSource,const std::function<void (GLuint)> & preLinkCallback)19*8975f5c5SAndroid Build Coastguard Worker GLuint CompileProgramInternal(const char *vsSource,
20*8975f5c5SAndroid Build Coastguard Worker const char *tcsSource,
21*8975f5c5SAndroid Build Coastguard Worker const char *tesSource,
22*8975f5c5SAndroid Build Coastguard Worker const char *gsSource,
23*8975f5c5SAndroid Build Coastguard Worker const char *fsSource,
24*8975f5c5SAndroid Build Coastguard Worker const std::function<void(GLuint)> &preLinkCallback)
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker GLuint program = glCreateProgram();
27*8975f5c5SAndroid Build Coastguard Worker
28*8975f5c5SAndroid Build Coastguard Worker GLuint vs = CompileShader(GL_VERTEX_SHADER, vsSource);
29*8975f5c5SAndroid Build Coastguard Worker GLuint fs = CompileShader(GL_FRAGMENT_SHADER, fsSource);
30*8975f5c5SAndroid Build Coastguard Worker
31*8975f5c5SAndroid Build Coastguard Worker if (vs == 0 || fs == 0)
32*8975f5c5SAndroid Build Coastguard Worker {
33*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(fs);
34*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(vs);
35*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(program);
36*8975f5c5SAndroid Build Coastguard Worker return 0;
37*8975f5c5SAndroid Build Coastguard Worker }
38*8975f5c5SAndroid Build Coastguard Worker
39*8975f5c5SAndroid Build Coastguard Worker glAttachShader(program, vs);
40*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(vs);
41*8975f5c5SAndroid Build Coastguard Worker
42*8975f5c5SAndroid Build Coastguard Worker glAttachShader(program, fs);
43*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(fs);
44*8975f5c5SAndroid Build Coastguard Worker
45*8975f5c5SAndroid Build Coastguard Worker GLuint tcs = 0;
46*8975f5c5SAndroid Build Coastguard Worker GLuint tes = 0;
47*8975f5c5SAndroid Build Coastguard Worker GLuint gs = 0;
48*8975f5c5SAndroid Build Coastguard Worker
49*8975f5c5SAndroid Build Coastguard Worker if (strlen(tcsSource) > 0)
50*8975f5c5SAndroid Build Coastguard Worker {
51*8975f5c5SAndroid Build Coastguard Worker tcs = CompileShader(GL_TESS_CONTROL_SHADER_EXT, tcsSource);
52*8975f5c5SAndroid Build Coastguard Worker if (tcs == 0)
53*8975f5c5SAndroid Build Coastguard Worker {
54*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(vs);
55*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(fs);
56*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(program);
57*8975f5c5SAndroid Build Coastguard Worker return 0;
58*8975f5c5SAndroid Build Coastguard Worker }
59*8975f5c5SAndroid Build Coastguard Worker
60*8975f5c5SAndroid Build Coastguard Worker glAttachShader(program, tcs);
61*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(tcs);
62*8975f5c5SAndroid Build Coastguard Worker }
63*8975f5c5SAndroid Build Coastguard Worker
64*8975f5c5SAndroid Build Coastguard Worker if (strlen(tesSource) > 0)
65*8975f5c5SAndroid Build Coastguard Worker {
66*8975f5c5SAndroid Build Coastguard Worker tes = CompileShader(GL_TESS_EVALUATION_SHADER_EXT, tesSource);
67*8975f5c5SAndroid Build Coastguard Worker if (tes == 0)
68*8975f5c5SAndroid Build Coastguard Worker {
69*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(vs);
70*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(fs);
71*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(tcs);
72*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(program);
73*8975f5c5SAndroid Build Coastguard Worker return 0;
74*8975f5c5SAndroid Build Coastguard Worker }
75*8975f5c5SAndroid Build Coastguard Worker
76*8975f5c5SAndroid Build Coastguard Worker glAttachShader(program, tes);
77*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(tes);
78*8975f5c5SAndroid Build Coastguard Worker }
79*8975f5c5SAndroid Build Coastguard Worker
80*8975f5c5SAndroid Build Coastguard Worker if (strlen(gsSource) > 0)
81*8975f5c5SAndroid Build Coastguard Worker {
82*8975f5c5SAndroid Build Coastguard Worker gs = CompileShader(GL_GEOMETRY_SHADER_EXT, gsSource);
83*8975f5c5SAndroid Build Coastguard Worker if (gs == 0)
84*8975f5c5SAndroid Build Coastguard Worker {
85*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(vs);
86*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(fs);
87*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(tcs);
88*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(tes);
89*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(program);
90*8975f5c5SAndroid Build Coastguard Worker return 0;
91*8975f5c5SAndroid Build Coastguard Worker }
92*8975f5c5SAndroid Build Coastguard Worker
93*8975f5c5SAndroid Build Coastguard Worker glAttachShader(program, gs);
94*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(gs);
95*8975f5c5SAndroid Build Coastguard Worker }
96*8975f5c5SAndroid Build Coastguard Worker
97*8975f5c5SAndroid Build Coastguard Worker if (preLinkCallback)
98*8975f5c5SAndroid Build Coastguard Worker {
99*8975f5c5SAndroid Build Coastguard Worker preLinkCallback(program);
100*8975f5c5SAndroid Build Coastguard Worker }
101*8975f5c5SAndroid Build Coastguard Worker
102*8975f5c5SAndroid Build Coastguard Worker glLinkProgram(program);
103*8975f5c5SAndroid Build Coastguard Worker
104*8975f5c5SAndroid Build Coastguard Worker return CheckLinkStatusAndReturnProgram(program, true);
105*8975f5c5SAndroid Build Coastguard Worker }
106*8975f5c5SAndroid Build Coastguard Worker
107*8975f5c5SAndroid Build Coastguard Worker const void *gCallbackChainUserParam;
108*8975f5c5SAndroid Build Coastguard Worker
DebugMessageCallback(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar * message,const void * userParam)109*8975f5c5SAndroid Build Coastguard Worker void KHRONOS_APIENTRY DebugMessageCallback(GLenum source,
110*8975f5c5SAndroid Build Coastguard Worker GLenum type,
111*8975f5c5SAndroid Build Coastguard Worker GLuint id,
112*8975f5c5SAndroid Build Coastguard Worker GLenum severity,
113*8975f5c5SAndroid Build Coastguard Worker GLsizei length,
114*8975f5c5SAndroid Build Coastguard Worker const GLchar *message,
115*8975f5c5SAndroid Build Coastguard Worker const void *userParam)
116*8975f5c5SAndroid Build Coastguard Worker {
117*8975f5c5SAndroid Build Coastguard Worker std::string sourceText = gl::GetDebugMessageSourceString(source);
118*8975f5c5SAndroid Build Coastguard Worker std::string typeText = gl::GetDebugMessageTypeString(type);
119*8975f5c5SAndroid Build Coastguard Worker std::string severityText = gl::GetDebugMessageSeverityString(severity);
120*8975f5c5SAndroid Build Coastguard Worker std::cerr << sourceText << ", " << typeText << ", " << severityText << ": " << message << "\n";
121*8975f5c5SAndroid Build Coastguard Worker
122*8975f5c5SAndroid Build Coastguard Worker GLDEBUGPROC callbackChain = reinterpret_cast<GLDEBUGPROC>(const_cast<void *>(userParam));
123*8975f5c5SAndroid Build Coastguard Worker if (callbackChain)
124*8975f5c5SAndroid Build Coastguard Worker {
125*8975f5c5SAndroid Build Coastguard Worker callbackChain(source, type, id, severity, length, message, gCallbackChainUserParam);
126*8975f5c5SAndroid Build Coastguard Worker }
127*8975f5c5SAndroid Build Coastguard Worker }
128*8975f5c5SAndroid Build Coastguard Worker
GetPerfCounterValue(const CounterNameToIndexMap & counterIndexMap,std::vector<angle::PerfMonitorTriplet> & triplets,const char * name,GLuint64 * counterOut)129*8975f5c5SAndroid Build Coastguard Worker void GetPerfCounterValue(const CounterNameToIndexMap &counterIndexMap,
130*8975f5c5SAndroid Build Coastguard Worker std::vector<angle::PerfMonitorTriplet> &triplets,
131*8975f5c5SAndroid Build Coastguard Worker const char *name,
132*8975f5c5SAndroid Build Coastguard Worker GLuint64 *counterOut)
133*8975f5c5SAndroid Build Coastguard Worker {
134*8975f5c5SAndroid Build Coastguard Worker auto iter = counterIndexMap.find(name);
135*8975f5c5SAndroid Build Coastguard Worker ASSERT(iter != counterIndexMap.end());
136*8975f5c5SAndroid Build Coastguard Worker GLuint counterIndex = iter->second;
137*8975f5c5SAndroid Build Coastguard Worker
138*8975f5c5SAndroid Build Coastguard Worker for (const angle::PerfMonitorTriplet &triplet : triplets)
139*8975f5c5SAndroid Build Coastguard Worker {
140*8975f5c5SAndroid Build Coastguard Worker ASSERT(triplet.group == 0);
141*8975f5c5SAndroid Build Coastguard Worker if (triplet.counter == counterIndex)
142*8975f5c5SAndroid Build Coastguard Worker {
143*8975f5c5SAndroid Build Coastguard Worker *counterOut = triplet.value;
144*8975f5c5SAndroid Build Coastguard Worker return;
145*8975f5c5SAndroid Build Coastguard Worker }
146*8975f5c5SAndroid Build Coastguard Worker }
147*8975f5c5SAndroid Build Coastguard Worker
148*8975f5c5SAndroid Build Coastguard Worker // Additional logs for b/382094011
149*8975f5c5SAndroid Build Coastguard Worker std::cerr << "GetPerfCounterValue missing counter: " << name << "; index: " << counterIndex
150*8975f5c5SAndroid Build Coastguard Worker << "; triplets: " << std::endl;
151*8975f5c5SAndroid Build Coastguard Worker for (const angle::PerfMonitorTriplet &triplet : triplets)
152*8975f5c5SAndroid Build Coastguard Worker {
153*8975f5c5SAndroid Build Coastguard Worker std::cerr << triplet.counter << " " << triplet.value << std::endl;
154*8975f5c5SAndroid Build Coastguard Worker }
155*8975f5c5SAndroid Build Coastguard Worker
156*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
157*8975f5c5SAndroid Build Coastguard Worker }
158*8975f5c5SAndroid Build Coastguard Worker } // namespace
159*8975f5c5SAndroid Build Coastguard Worker
CompileShader(GLenum type,const char * source)160*8975f5c5SAndroid Build Coastguard Worker GLuint CompileShader(GLenum type, const char *source)
161*8975f5c5SAndroid Build Coastguard Worker {
162*8975f5c5SAndroid Build Coastguard Worker GLuint shader = glCreateShader(type);
163*8975f5c5SAndroid Build Coastguard Worker
164*8975f5c5SAndroid Build Coastguard Worker const char *sourceArray[1] = {source};
165*8975f5c5SAndroid Build Coastguard Worker glShaderSource(shader, 1, sourceArray, nullptr);
166*8975f5c5SAndroid Build Coastguard Worker glCompileShader(shader);
167*8975f5c5SAndroid Build Coastguard Worker
168*8975f5c5SAndroid Build Coastguard Worker GLint compileResult;
169*8975f5c5SAndroid Build Coastguard Worker glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
170*8975f5c5SAndroid Build Coastguard Worker
171*8975f5c5SAndroid Build Coastguard Worker if (compileResult == 0)
172*8975f5c5SAndroid Build Coastguard Worker {
173*8975f5c5SAndroid Build Coastguard Worker GLint infoLogLength;
174*8975f5c5SAndroid Build Coastguard Worker glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
175*8975f5c5SAndroid Build Coastguard Worker
176*8975f5c5SAndroid Build Coastguard Worker // Info log length includes the null terminator, so 1 means that the info log is an empty
177*8975f5c5SAndroid Build Coastguard Worker // string.
178*8975f5c5SAndroid Build Coastguard Worker if (infoLogLength > 1)
179*8975f5c5SAndroid Build Coastguard Worker {
180*8975f5c5SAndroid Build Coastguard Worker std::vector<GLchar> infoLog(infoLogLength);
181*8975f5c5SAndroid Build Coastguard Worker glGetShaderInfoLog(shader, static_cast<GLsizei>(infoLog.size()), nullptr, &infoLog[0]);
182*8975f5c5SAndroid Build Coastguard Worker std::cerr << "shader compilation failed: " << &infoLog[0];
183*8975f5c5SAndroid Build Coastguard Worker }
184*8975f5c5SAndroid Build Coastguard Worker else
185*8975f5c5SAndroid Build Coastguard Worker {
186*8975f5c5SAndroid Build Coastguard Worker std::cerr << "shader compilation failed. <Empty log message>";
187*8975f5c5SAndroid Build Coastguard Worker }
188*8975f5c5SAndroid Build Coastguard Worker
189*8975f5c5SAndroid Build Coastguard Worker std::cerr << std::endl;
190*8975f5c5SAndroid Build Coastguard Worker
191*8975f5c5SAndroid Build Coastguard Worker glDeleteShader(shader);
192*8975f5c5SAndroid Build Coastguard Worker shader = 0;
193*8975f5c5SAndroid Build Coastguard Worker }
194*8975f5c5SAndroid Build Coastguard Worker
195*8975f5c5SAndroid Build Coastguard Worker return shader;
196*8975f5c5SAndroid Build Coastguard Worker }
197*8975f5c5SAndroid Build Coastguard Worker
CompileShaderFromFile(GLenum type,const std::string & sourcePath)198*8975f5c5SAndroid Build Coastguard Worker GLuint CompileShaderFromFile(GLenum type, const std::string &sourcePath)
199*8975f5c5SAndroid Build Coastguard Worker {
200*8975f5c5SAndroid Build Coastguard Worker std::string source;
201*8975f5c5SAndroid Build Coastguard Worker if (!angle::ReadEntireFileToString(sourcePath.c_str(), &source))
202*8975f5c5SAndroid Build Coastguard Worker {
203*8975f5c5SAndroid Build Coastguard Worker std::cerr << "Error reading shader file: " << sourcePath << "\n";
204*8975f5c5SAndroid Build Coastguard Worker return 0;
205*8975f5c5SAndroid Build Coastguard Worker }
206*8975f5c5SAndroid Build Coastguard Worker
207*8975f5c5SAndroid Build Coastguard Worker return CompileShader(type, source.c_str());
208*8975f5c5SAndroid Build Coastguard Worker }
209*8975f5c5SAndroid Build Coastguard Worker
CheckLinkStatusAndReturnProgram(GLuint program,bool outputErrorMessages)210*8975f5c5SAndroid Build Coastguard Worker GLuint CheckLinkStatusAndReturnProgram(GLuint program, bool outputErrorMessages)
211*8975f5c5SAndroid Build Coastguard Worker {
212*8975f5c5SAndroid Build Coastguard Worker if (glGetError() != GL_NO_ERROR)
213*8975f5c5SAndroid Build Coastguard Worker return 0;
214*8975f5c5SAndroid Build Coastguard Worker
215*8975f5c5SAndroid Build Coastguard Worker GLint linkStatus;
216*8975f5c5SAndroid Build Coastguard Worker glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
217*8975f5c5SAndroid Build Coastguard Worker if (linkStatus == 0)
218*8975f5c5SAndroid Build Coastguard Worker {
219*8975f5c5SAndroid Build Coastguard Worker if (outputErrorMessages)
220*8975f5c5SAndroid Build Coastguard Worker {
221*8975f5c5SAndroid Build Coastguard Worker GLint infoLogLength;
222*8975f5c5SAndroid Build Coastguard Worker glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength);
223*8975f5c5SAndroid Build Coastguard Worker
224*8975f5c5SAndroid Build Coastguard Worker // Info log length includes the null terminator, so 1 means that the info log is an
225*8975f5c5SAndroid Build Coastguard Worker // empty string.
226*8975f5c5SAndroid Build Coastguard Worker if (infoLogLength > 1)
227*8975f5c5SAndroid Build Coastguard Worker {
228*8975f5c5SAndroid Build Coastguard Worker std::vector<GLchar> infoLog(infoLogLength);
229*8975f5c5SAndroid Build Coastguard Worker glGetProgramInfoLog(program, static_cast<GLsizei>(infoLog.size()), nullptr,
230*8975f5c5SAndroid Build Coastguard Worker &infoLog[0]);
231*8975f5c5SAndroid Build Coastguard Worker
232*8975f5c5SAndroid Build Coastguard Worker std::cerr << "program link failed: " << &infoLog[0];
233*8975f5c5SAndroid Build Coastguard Worker }
234*8975f5c5SAndroid Build Coastguard Worker else
235*8975f5c5SAndroid Build Coastguard Worker {
236*8975f5c5SAndroid Build Coastguard Worker std::cerr << "program link failed. <Empty log message>";
237*8975f5c5SAndroid Build Coastguard Worker }
238*8975f5c5SAndroid Build Coastguard Worker }
239*8975f5c5SAndroid Build Coastguard Worker
240*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(program);
241*8975f5c5SAndroid Build Coastguard Worker return 0;
242*8975f5c5SAndroid Build Coastguard Worker }
243*8975f5c5SAndroid Build Coastguard Worker
244*8975f5c5SAndroid Build Coastguard Worker return program;
245*8975f5c5SAndroid Build Coastguard Worker }
246*8975f5c5SAndroid Build Coastguard Worker
GetProgramShader(GLuint program,GLint requestedType)247*8975f5c5SAndroid Build Coastguard Worker GLuint GetProgramShader(GLuint program, GLint requestedType)
248*8975f5c5SAndroid Build Coastguard Worker {
249*8975f5c5SAndroid Build Coastguard Worker static constexpr GLsizei kMaxShaderCount = 16;
250*8975f5c5SAndroid Build Coastguard Worker GLuint attachedShaders[kMaxShaderCount] = {0u};
251*8975f5c5SAndroid Build Coastguard Worker GLsizei count = 0;
252*8975f5c5SAndroid Build Coastguard Worker glGetAttachedShaders(program, kMaxShaderCount, &count, attachedShaders);
253*8975f5c5SAndroid Build Coastguard Worker for (int i = 0; i < count; ++i)
254*8975f5c5SAndroid Build Coastguard Worker {
255*8975f5c5SAndroid Build Coastguard Worker GLint type = 0;
256*8975f5c5SAndroid Build Coastguard Worker glGetShaderiv(attachedShaders[i], GL_SHADER_TYPE, &type);
257*8975f5c5SAndroid Build Coastguard Worker if (type == requestedType)
258*8975f5c5SAndroid Build Coastguard Worker {
259*8975f5c5SAndroid Build Coastguard Worker return attachedShaders[i];
260*8975f5c5SAndroid Build Coastguard Worker }
261*8975f5c5SAndroid Build Coastguard Worker }
262*8975f5c5SAndroid Build Coastguard Worker
263*8975f5c5SAndroid Build Coastguard Worker return 0;
264*8975f5c5SAndroid Build Coastguard Worker }
265*8975f5c5SAndroid Build Coastguard Worker
CompileProgramWithTransformFeedback(const char * vsSource,const char * fsSource,const std::vector<std::string> & transformFeedbackVaryings,GLenum bufferMode)266*8975f5c5SAndroid Build Coastguard Worker GLuint CompileProgramWithTransformFeedback(
267*8975f5c5SAndroid Build Coastguard Worker const char *vsSource,
268*8975f5c5SAndroid Build Coastguard Worker const char *fsSource,
269*8975f5c5SAndroid Build Coastguard Worker const std::vector<std::string> &transformFeedbackVaryings,
270*8975f5c5SAndroid Build Coastguard Worker GLenum bufferMode)
271*8975f5c5SAndroid Build Coastguard Worker {
272*8975f5c5SAndroid Build Coastguard Worker auto preLink = [&](GLuint program) {
273*8975f5c5SAndroid Build Coastguard Worker if (transformFeedbackVaryings.size() > 0)
274*8975f5c5SAndroid Build Coastguard Worker {
275*8975f5c5SAndroid Build Coastguard Worker std::vector<const char *> constCharTFVaryings;
276*8975f5c5SAndroid Build Coastguard Worker
277*8975f5c5SAndroid Build Coastguard Worker for (const std::string &transformFeedbackVarying : transformFeedbackVaryings)
278*8975f5c5SAndroid Build Coastguard Worker {
279*8975f5c5SAndroid Build Coastguard Worker constCharTFVaryings.push_back(transformFeedbackVarying.c_str());
280*8975f5c5SAndroid Build Coastguard Worker }
281*8975f5c5SAndroid Build Coastguard Worker
282*8975f5c5SAndroid Build Coastguard Worker glTransformFeedbackVaryings(program,
283*8975f5c5SAndroid Build Coastguard Worker static_cast<GLsizei>(transformFeedbackVaryings.size()),
284*8975f5c5SAndroid Build Coastguard Worker &constCharTFVaryings[0], bufferMode);
285*8975f5c5SAndroid Build Coastguard Worker }
286*8975f5c5SAndroid Build Coastguard Worker };
287*8975f5c5SAndroid Build Coastguard Worker
288*8975f5c5SAndroid Build Coastguard Worker return CompileProgramInternal(vsSource, "", "", "", fsSource, preLink);
289*8975f5c5SAndroid Build Coastguard Worker }
290*8975f5c5SAndroid Build Coastguard Worker
CompileProgram(const char * vsSource,const char * fsSource)291*8975f5c5SAndroid Build Coastguard Worker GLuint CompileProgram(const char *vsSource, const char *fsSource)
292*8975f5c5SAndroid Build Coastguard Worker {
293*8975f5c5SAndroid Build Coastguard Worker return CompileProgramInternal(vsSource, "", "", "", fsSource, nullptr);
294*8975f5c5SAndroid Build Coastguard Worker }
295*8975f5c5SAndroid Build Coastguard Worker
CompileProgram(const char * vsSource,const char * fsSource,const std::function<void (GLuint)> & preLinkCallback)296*8975f5c5SAndroid Build Coastguard Worker GLuint CompileProgram(const char *vsSource,
297*8975f5c5SAndroid Build Coastguard Worker const char *fsSource,
298*8975f5c5SAndroid Build Coastguard Worker const std::function<void(GLuint)> &preLinkCallback)
299*8975f5c5SAndroid Build Coastguard Worker {
300*8975f5c5SAndroid Build Coastguard Worker return CompileProgramInternal(vsSource, "", "", "", fsSource, preLinkCallback);
301*8975f5c5SAndroid Build Coastguard Worker }
302*8975f5c5SAndroid Build Coastguard Worker
CompileProgramWithGS(const char * vsSource,const char * gsSource,const char * fsSource)303*8975f5c5SAndroid Build Coastguard Worker GLuint CompileProgramWithGS(const char *vsSource, const char *gsSource, const char *fsSource)
304*8975f5c5SAndroid Build Coastguard Worker {
305*8975f5c5SAndroid Build Coastguard Worker return CompileProgramInternal(vsSource, "", "", gsSource, fsSource, nullptr);
306*8975f5c5SAndroid Build Coastguard Worker }
307*8975f5c5SAndroid Build Coastguard Worker
CompileProgramWithTESS(const char * vsSource,const char * tcsSource,const char * tesSource,const char * fsSource)308*8975f5c5SAndroid Build Coastguard Worker GLuint CompileProgramWithTESS(const char *vsSource,
309*8975f5c5SAndroid Build Coastguard Worker const char *tcsSource,
310*8975f5c5SAndroid Build Coastguard Worker const char *tesSource,
311*8975f5c5SAndroid Build Coastguard Worker const char *fsSource)
312*8975f5c5SAndroid Build Coastguard Worker {
313*8975f5c5SAndroid Build Coastguard Worker return CompileProgramInternal(vsSource, tcsSource, tesSource, "", fsSource, nullptr);
314*8975f5c5SAndroid Build Coastguard Worker }
315*8975f5c5SAndroid Build Coastguard Worker
CompileProgramFromFiles(const std::string & vsPath,const std::string & fsPath)316*8975f5c5SAndroid Build Coastguard Worker GLuint CompileProgramFromFiles(const std::string &vsPath, const std::string &fsPath)
317*8975f5c5SAndroid Build Coastguard Worker {
318*8975f5c5SAndroid Build Coastguard Worker std::string vsSource;
319*8975f5c5SAndroid Build Coastguard Worker if (!angle::ReadEntireFileToString(vsPath.c_str(), &vsSource))
320*8975f5c5SAndroid Build Coastguard Worker {
321*8975f5c5SAndroid Build Coastguard Worker std::cerr << "Error reading shader: " << vsPath << "\n";
322*8975f5c5SAndroid Build Coastguard Worker return 0;
323*8975f5c5SAndroid Build Coastguard Worker }
324*8975f5c5SAndroid Build Coastguard Worker
325*8975f5c5SAndroid Build Coastguard Worker std::string fsSource;
326*8975f5c5SAndroid Build Coastguard Worker if (!angle::ReadEntireFileToString(fsPath.c_str(), &fsSource))
327*8975f5c5SAndroid Build Coastguard Worker {
328*8975f5c5SAndroid Build Coastguard Worker std::cerr << "Error reading shader: " << fsPath << "\n";
329*8975f5c5SAndroid Build Coastguard Worker return 0;
330*8975f5c5SAndroid Build Coastguard Worker }
331*8975f5c5SAndroid Build Coastguard Worker
332*8975f5c5SAndroid Build Coastguard Worker return CompileProgram(vsSource.c_str(), fsSource.c_str());
333*8975f5c5SAndroid Build Coastguard Worker }
334*8975f5c5SAndroid Build Coastguard Worker
CompileComputeProgram(const char * csSource,bool outputErrorMessages)335*8975f5c5SAndroid Build Coastguard Worker GLuint CompileComputeProgram(const char *csSource, bool outputErrorMessages)
336*8975f5c5SAndroid Build Coastguard Worker {
337*8975f5c5SAndroid Build Coastguard Worker GLuint program = glCreateProgram();
338*8975f5c5SAndroid Build Coastguard Worker
339*8975f5c5SAndroid Build Coastguard Worker GLuint cs = CompileShader(GL_COMPUTE_SHADER, csSource);
340*8975f5c5SAndroid Build Coastguard Worker if (cs == 0)
341*8975f5c5SAndroid Build Coastguard Worker {
342*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(program);
343*8975f5c5SAndroid Build Coastguard Worker return 0;
344*8975f5c5SAndroid Build Coastguard Worker }
345*8975f5c5SAndroid Build Coastguard Worker
346*8975f5c5SAndroid Build Coastguard Worker glAttachShader(program, cs);
347*8975f5c5SAndroid Build Coastguard Worker
348*8975f5c5SAndroid Build Coastguard Worker glLinkProgram(program);
349*8975f5c5SAndroid Build Coastguard Worker
350*8975f5c5SAndroid Build Coastguard Worker return CheckLinkStatusAndReturnProgram(program, outputErrorMessages);
351*8975f5c5SAndroid Build Coastguard Worker }
352*8975f5c5SAndroid Build Coastguard Worker
LoadBinaryProgramOES(const std::vector<uint8_t> & binary,GLenum binaryFormat)353*8975f5c5SAndroid Build Coastguard Worker GLuint LoadBinaryProgramOES(const std::vector<uint8_t> &binary, GLenum binaryFormat)
354*8975f5c5SAndroid Build Coastguard Worker {
355*8975f5c5SAndroid Build Coastguard Worker GLuint program = glCreateProgram();
356*8975f5c5SAndroid Build Coastguard Worker glProgramBinaryOES(program, binaryFormat, binary.data(), static_cast<GLint>(binary.size()));
357*8975f5c5SAndroid Build Coastguard Worker return CheckLinkStatusAndReturnProgram(program, true);
358*8975f5c5SAndroid Build Coastguard Worker }
359*8975f5c5SAndroid Build Coastguard Worker
LoadBinaryProgramES3(const std::vector<uint8_t> & binary,GLenum binaryFormat)360*8975f5c5SAndroid Build Coastguard Worker GLuint LoadBinaryProgramES3(const std::vector<uint8_t> &binary, GLenum binaryFormat)
361*8975f5c5SAndroid Build Coastguard Worker {
362*8975f5c5SAndroid Build Coastguard Worker GLuint program = glCreateProgram();
363*8975f5c5SAndroid Build Coastguard Worker glProgramBinary(program, binaryFormat, binary.data(), static_cast<GLint>(binary.size()));
364*8975f5c5SAndroid Build Coastguard Worker return CheckLinkStatusAndReturnProgram(program, true);
365*8975f5c5SAndroid Build Coastguard Worker }
366*8975f5c5SAndroid Build Coastguard Worker
LinkAttachedProgram(GLuint program)367*8975f5c5SAndroid Build Coastguard Worker bool LinkAttachedProgram(GLuint program)
368*8975f5c5SAndroid Build Coastguard Worker {
369*8975f5c5SAndroid Build Coastguard Worker glLinkProgram(program);
370*8975f5c5SAndroid Build Coastguard Worker return (CheckLinkStatusAndReturnProgram(program, true) != 0);
371*8975f5c5SAndroid Build Coastguard Worker }
372*8975f5c5SAndroid Build Coastguard Worker
EnableDebugCallback(GLDEBUGPROC callbackChain,const void * userParam)373*8975f5c5SAndroid Build Coastguard Worker void EnableDebugCallback(GLDEBUGPROC callbackChain, const void *userParam)
374*8975f5c5SAndroid Build Coastguard Worker {
375*8975f5c5SAndroid Build Coastguard Worker gCallbackChainUserParam = userParam;
376*8975f5c5SAndroid Build Coastguard Worker
377*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEBUG_OUTPUT);
378*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
379*8975f5c5SAndroid Build Coastguard Worker // Enable medium and high priority messages.
380*8975f5c5SAndroid Build Coastguard Worker glDebugMessageControlKHR(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, nullptr,
381*8975f5c5SAndroid Build Coastguard Worker GL_TRUE);
382*8975f5c5SAndroid Build Coastguard Worker glDebugMessageControlKHR(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0, nullptr,
383*8975f5c5SAndroid Build Coastguard Worker GL_TRUE);
384*8975f5c5SAndroid Build Coastguard Worker // Disable low and notification priority messages.
385*8975f5c5SAndroid Build Coastguard Worker glDebugMessageControlKHR(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, nullptr,
386*8975f5c5SAndroid Build Coastguard Worker GL_FALSE);
387*8975f5c5SAndroid Build Coastguard Worker glDebugMessageControlKHR(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, nullptr,
388*8975f5c5SAndroid Build Coastguard Worker GL_FALSE);
389*8975f5c5SAndroid Build Coastguard Worker // Disable performance messages to reduce spam.
390*8975f5c5SAndroid Build Coastguard Worker glDebugMessageControlKHR(GL_DONT_CARE, GL_DEBUG_TYPE_PERFORMANCE, GL_DONT_CARE, 0, nullptr,
391*8975f5c5SAndroid Build Coastguard Worker GL_FALSE);
392*8975f5c5SAndroid Build Coastguard Worker glDebugMessageCallbackKHR(DebugMessageCallback, reinterpret_cast<const void *>(callbackChain));
393*8975f5c5SAndroid Build Coastguard Worker }
394*8975f5c5SAndroid Build Coastguard Worker
BuildCounterNameToIndexMap()395*8975f5c5SAndroid Build Coastguard Worker CounterNameToIndexMap BuildCounterNameToIndexMap()
396*8975f5c5SAndroid Build Coastguard Worker {
397*8975f5c5SAndroid Build Coastguard Worker GLint numCounters = 0;
398*8975f5c5SAndroid Build Coastguard Worker glGetPerfMonitorCountersAMD(0, &numCounters, nullptr, 0, nullptr);
399*8975f5c5SAndroid Build Coastguard Worker if (glGetError() != GL_NO_ERROR)
400*8975f5c5SAndroid Build Coastguard Worker {
401*8975f5c5SAndroid Build Coastguard Worker std::cerr << "glGetPerfMonitorCountersAMD failed (count)" << std::endl;
402*8975f5c5SAndroid Build Coastguard Worker return {};
403*8975f5c5SAndroid Build Coastguard Worker }
404*8975f5c5SAndroid Build Coastguard Worker
405*8975f5c5SAndroid Build Coastguard Worker std::vector<GLuint> counterIndexes(numCounters, 0);
406*8975f5c5SAndroid Build Coastguard Worker glGetPerfMonitorCountersAMD(0, nullptr, nullptr, numCounters, counterIndexes.data());
407*8975f5c5SAndroid Build Coastguard Worker if (glGetError() != GL_NO_ERROR)
408*8975f5c5SAndroid Build Coastguard Worker {
409*8975f5c5SAndroid Build Coastguard Worker std::cerr << "glGetPerfMonitorCountersAMD failed (data)" << std::endl;
410*8975f5c5SAndroid Build Coastguard Worker return {};
411*8975f5c5SAndroid Build Coastguard Worker }
412*8975f5c5SAndroid Build Coastguard Worker
413*8975f5c5SAndroid Build Coastguard Worker CounterNameToIndexMap indexMap;
414*8975f5c5SAndroid Build Coastguard Worker
415*8975f5c5SAndroid Build Coastguard Worker for (GLuint counterIndex : counterIndexes)
416*8975f5c5SAndroid Build Coastguard Worker {
417*8975f5c5SAndroid Build Coastguard Worker static constexpr size_t kBufSize = 1000;
418*8975f5c5SAndroid Build Coastguard Worker char buffer[kBufSize] = {};
419*8975f5c5SAndroid Build Coastguard Worker glGetPerfMonitorCounterStringAMD(0, counterIndex, kBufSize, nullptr, buffer);
420*8975f5c5SAndroid Build Coastguard Worker if (glGetError() != GL_NO_ERROR)
421*8975f5c5SAndroid Build Coastguard Worker {
422*8975f5c5SAndroid Build Coastguard Worker std::cerr << "glGetPerfMonitorCounterStringAMD failed" << std::endl;
423*8975f5c5SAndroid Build Coastguard Worker return {};
424*8975f5c5SAndroid Build Coastguard Worker }
425*8975f5c5SAndroid Build Coastguard Worker
426*8975f5c5SAndroid Build Coastguard Worker indexMap[buffer] = counterIndex;
427*8975f5c5SAndroid Build Coastguard Worker }
428*8975f5c5SAndroid Build Coastguard Worker
429*8975f5c5SAndroid Build Coastguard Worker return indexMap;
430*8975f5c5SAndroid Build Coastguard Worker }
431*8975f5c5SAndroid Build Coastguard Worker
GetPerfMonitorTriplets()432*8975f5c5SAndroid Build Coastguard Worker std::vector<angle::PerfMonitorTriplet> GetPerfMonitorTriplets()
433*8975f5c5SAndroid Build Coastguard Worker {
434*8975f5c5SAndroid Build Coastguard Worker GLuint resultSize = 0;
435*8975f5c5SAndroid Build Coastguard Worker glGetPerfMonitorCounterDataAMD(0, GL_PERFMON_RESULT_SIZE_AMD, sizeof(GLuint), &resultSize,
436*8975f5c5SAndroid Build Coastguard Worker nullptr);
437*8975f5c5SAndroid Build Coastguard Worker if (glGetError() != GL_NO_ERROR || resultSize == 0)
438*8975f5c5SAndroid Build Coastguard Worker {
439*8975f5c5SAndroid Build Coastguard Worker std::cerr << "glGetPerfMonitorCounterDataAMD failed (count)" << std::endl;
440*8975f5c5SAndroid Build Coastguard Worker return {};
441*8975f5c5SAndroid Build Coastguard Worker }
442*8975f5c5SAndroid Build Coastguard Worker
443*8975f5c5SAndroid Build Coastguard Worker std::vector<angle::PerfMonitorTriplet> perfResults(resultSize /
444*8975f5c5SAndroid Build Coastguard Worker sizeof(angle::PerfMonitorTriplet));
445*8975f5c5SAndroid Build Coastguard Worker GLint bytesWritten = 0;
446*8975f5c5SAndroid Build Coastguard Worker glGetPerfMonitorCounterDataAMD(
447*8975f5c5SAndroid Build Coastguard Worker 0, GL_PERFMON_RESULT_AMD, static_cast<GLsizei>(perfResults.size() * sizeof(perfResults[0])),
448*8975f5c5SAndroid Build Coastguard Worker &perfResults.data()->group, &bytesWritten);
449*8975f5c5SAndroid Build Coastguard Worker
450*8975f5c5SAndroid Build Coastguard Worker if (glGetError() != GL_NO_ERROR)
451*8975f5c5SAndroid Build Coastguard Worker {
452*8975f5c5SAndroid Build Coastguard Worker std::cerr << "glGetPerfMonitorCounterDataAMD failed (data)" << std::endl;
453*8975f5c5SAndroid Build Coastguard Worker return {};
454*8975f5c5SAndroid Build Coastguard Worker }
455*8975f5c5SAndroid Build Coastguard Worker ASSERT(static_cast<GLuint>(bytesWritten) == resultSize);
456*8975f5c5SAndroid Build Coastguard Worker
457*8975f5c5SAndroid Build Coastguard Worker return perfResults;
458*8975f5c5SAndroid Build Coastguard Worker }
459*8975f5c5SAndroid Build Coastguard Worker
GetPerfCounters(const CounterNameToIndexMap & indexMap)460*8975f5c5SAndroid Build Coastguard Worker angle::VulkanPerfCounters GetPerfCounters(const CounterNameToIndexMap &indexMap)
461*8975f5c5SAndroid Build Coastguard Worker {
462*8975f5c5SAndroid Build Coastguard Worker std::vector<angle::PerfMonitorTriplet> perfResults = GetPerfMonitorTriplets();
463*8975f5c5SAndroid Build Coastguard Worker
464*8975f5c5SAndroid Build Coastguard Worker angle::VulkanPerfCounters counters;
465*8975f5c5SAndroid Build Coastguard Worker
466*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_UNPACK_PERF_COUNTER(COUNTER) \
467*8975f5c5SAndroid Build Coastguard Worker GetPerfCounterValue(indexMap, perfResults, #COUNTER, &counters.COUNTER);
468*8975f5c5SAndroid Build Coastguard Worker
469*8975f5c5SAndroid Build Coastguard Worker ANGLE_VK_PERF_COUNTERS_X(ANGLE_UNPACK_PERF_COUNTER)
470*8975f5c5SAndroid Build Coastguard Worker
471*8975f5c5SAndroid Build Coastguard Worker #undef ANGLE_UNPACK_PERF_COUNTER
472*8975f5c5SAndroid Build Coastguard Worker
473*8975f5c5SAndroid Build Coastguard Worker return counters;
474*8975f5c5SAndroid Build Coastguard Worker }
475*8975f5c5SAndroid Build Coastguard Worker
BuildCounterNameToValueMap()476*8975f5c5SAndroid Build Coastguard Worker CounterNameToValueMap BuildCounterNameToValueMap()
477*8975f5c5SAndroid Build Coastguard Worker {
478*8975f5c5SAndroid Build Coastguard Worker CounterNameToIndexMap indexMap = BuildCounterNameToIndexMap();
479*8975f5c5SAndroid Build Coastguard Worker std::vector<angle::PerfMonitorTriplet> perfResults = GetPerfMonitorTriplets();
480*8975f5c5SAndroid Build Coastguard Worker
481*8975f5c5SAndroid Build Coastguard Worker CounterNameToValueMap valueMap;
482*8975f5c5SAndroid Build Coastguard Worker
483*8975f5c5SAndroid Build Coastguard Worker for (const auto &iter : indexMap)
484*8975f5c5SAndroid Build Coastguard Worker {
485*8975f5c5SAndroid Build Coastguard Worker const std::string &name = iter.first;
486*8975f5c5SAndroid Build Coastguard Worker GLuint index = iter.second;
487*8975f5c5SAndroid Build Coastguard Worker
488*8975f5c5SAndroid Build Coastguard Worker valueMap[name] = perfResults[index].value;
489*8975f5c5SAndroid Build Coastguard Worker }
490*8975f5c5SAndroid Build Coastguard Worker
491*8975f5c5SAndroid Build Coastguard Worker return valueMap;
492*8975f5c5SAndroid Build Coastguard Worker }
493*8975f5c5SAndroid Build Coastguard Worker
494*8975f5c5SAndroid Build Coastguard Worker namespace angle
495*8975f5c5SAndroid Build Coastguard Worker {
496*8975f5c5SAndroid Build Coastguard Worker
497*8975f5c5SAndroid Build Coastguard Worker namespace essl1_shaders
498*8975f5c5SAndroid Build Coastguard Worker {
499*8975f5c5SAndroid Build Coastguard Worker
PositionAttrib()500*8975f5c5SAndroid Build Coastguard Worker const char *PositionAttrib()
501*8975f5c5SAndroid Build Coastguard Worker {
502*8975f5c5SAndroid Build Coastguard Worker return "a_position";
503*8975f5c5SAndroid Build Coastguard Worker }
ColorUniform()504*8975f5c5SAndroid Build Coastguard Worker const char *ColorUniform()
505*8975f5c5SAndroid Build Coastguard Worker {
506*8975f5c5SAndroid Build Coastguard Worker return "u_color";
507*8975f5c5SAndroid Build Coastguard Worker }
508*8975f5c5SAndroid Build Coastguard Worker
Texture2DUniform()509*8975f5c5SAndroid Build Coastguard Worker const char *Texture2DUniform()
510*8975f5c5SAndroid Build Coastguard Worker {
511*8975f5c5SAndroid Build Coastguard Worker return "u_tex2D";
512*8975f5c5SAndroid Build Coastguard Worker }
513*8975f5c5SAndroid Build Coastguard Worker
514*8975f5c5SAndroid Build Coastguard Worker namespace vs
515*8975f5c5SAndroid Build Coastguard Worker {
516*8975f5c5SAndroid Build Coastguard Worker
517*8975f5c5SAndroid Build Coastguard Worker // A shader that sets gl_Position to zero.
Zero()518*8975f5c5SAndroid Build Coastguard Worker const char *Zero()
519*8975f5c5SAndroid Build Coastguard Worker {
520*8975f5c5SAndroid Build Coastguard Worker return R"(void main()
521*8975f5c5SAndroid Build Coastguard Worker {
522*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(0);
523*8975f5c5SAndroid Build Coastguard Worker })";
524*8975f5c5SAndroid Build Coastguard Worker }
525*8975f5c5SAndroid Build Coastguard Worker
526*8975f5c5SAndroid Build Coastguard Worker // A shader that sets gl_Position to attribute a_position.
Simple()527*8975f5c5SAndroid Build Coastguard Worker const char *Simple()
528*8975f5c5SAndroid Build Coastguard Worker {
529*8975f5c5SAndroid Build Coastguard Worker return R"(precision highp float;
530*8975f5c5SAndroid Build Coastguard Worker attribute vec4 a_position;
531*8975f5c5SAndroid Build Coastguard Worker
532*8975f5c5SAndroid Build Coastguard Worker void main()
533*8975f5c5SAndroid Build Coastguard Worker {
534*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
535*8975f5c5SAndroid Build Coastguard Worker })";
536*8975f5c5SAndroid Build Coastguard Worker }
537*8975f5c5SAndroid Build Coastguard Worker
538*8975f5c5SAndroid Build Coastguard Worker // A shader that sets gl_Position to attribute a_position, and sets gl_PointSize to 1.
SimpleForPoints()539*8975f5c5SAndroid Build Coastguard Worker const char *SimpleForPoints()
540*8975f5c5SAndroid Build Coastguard Worker {
541*8975f5c5SAndroid Build Coastguard Worker return R"(precision highp float;
542*8975f5c5SAndroid Build Coastguard Worker attribute vec4 a_position;
543*8975f5c5SAndroid Build Coastguard Worker
544*8975f5c5SAndroid Build Coastguard Worker void main()
545*8975f5c5SAndroid Build Coastguard Worker {
546*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
547*8975f5c5SAndroid Build Coastguard Worker gl_PointSize = 1.0;
548*8975f5c5SAndroid Build Coastguard Worker })";
549*8975f5c5SAndroid Build Coastguard Worker }
550*8975f5c5SAndroid Build Coastguard Worker
551*8975f5c5SAndroid Build Coastguard Worker // A shader that simply passes through attribute a_position, setting it to gl_Position and varying
552*8975f5c5SAndroid Build Coastguard Worker // v_position.
Passthrough()553*8975f5c5SAndroid Build Coastguard Worker const char *Passthrough()
554*8975f5c5SAndroid Build Coastguard Worker {
555*8975f5c5SAndroid Build Coastguard Worker return R"(precision highp float;
556*8975f5c5SAndroid Build Coastguard Worker attribute vec4 a_position;
557*8975f5c5SAndroid Build Coastguard Worker varying vec4 v_position;
558*8975f5c5SAndroid Build Coastguard Worker
559*8975f5c5SAndroid Build Coastguard Worker void main()
560*8975f5c5SAndroid Build Coastguard Worker {
561*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
562*8975f5c5SAndroid Build Coastguard Worker v_position = a_position;
563*8975f5c5SAndroid Build Coastguard Worker })";
564*8975f5c5SAndroid Build Coastguard Worker }
565*8975f5c5SAndroid Build Coastguard Worker
566*8975f5c5SAndroid Build Coastguard Worker // A shader that simply passes through attribute a_position, setting it to gl_Position and varying
567*8975f5c5SAndroid Build Coastguard Worker // texcoord.
Texture2D()568*8975f5c5SAndroid Build Coastguard Worker const char *Texture2D()
569*8975f5c5SAndroid Build Coastguard Worker {
570*8975f5c5SAndroid Build Coastguard Worker return R"(precision highp float;
571*8975f5c5SAndroid Build Coastguard Worker attribute vec4 a_position;
572*8975f5c5SAndroid Build Coastguard Worker varying vec2 v_texCoord;
573*8975f5c5SAndroid Build Coastguard Worker
574*8975f5c5SAndroid Build Coastguard Worker void main()
575*8975f5c5SAndroid Build Coastguard Worker {
576*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
577*8975f5c5SAndroid Build Coastguard Worker v_texCoord = a_position.xy * 0.5 + vec2(0.5);
578*8975f5c5SAndroid Build Coastguard Worker })";
579*8975f5c5SAndroid Build Coastguard Worker }
580*8975f5c5SAndroid Build Coastguard Worker
Texture2DArray()581*8975f5c5SAndroid Build Coastguard Worker const char *Texture2DArray()
582*8975f5c5SAndroid Build Coastguard Worker {
583*8975f5c5SAndroid Build Coastguard Worker return R"(#version 300 es
584*8975f5c5SAndroid Build Coastguard Worker out vec2 v_texCoord;
585*8975f5c5SAndroid Build Coastguard Worker in vec4 a_position;
586*8975f5c5SAndroid Build Coastguard Worker void main()
587*8975f5c5SAndroid Build Coastguard Worker {
588*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(a_position.xy, 0.0, 1.0);
589*8975f5c5SAndroid Build Coastguard Worker v_texCoord = (a_position.xy * 0.5) + 0.5;
590*8975f5c5SAndroid Build Coastguard Worker })";
591*8975f5c5SAndroid Build Coastguard Worker }
592*8975f5c5SAndroid Build Coastguard Worker
593*8975f5c5SAndroid Build Coastguard Worker } // namespace vs
594*8975f5c5SAndroid Build Coastguard Worker
595*8975f5c5SAndroid Build Coastguard Worker namespace fs
596*8975f5c5SAndroid Build Coastguard Worker {
597*8975f5c5SAndroid Build Coastguard Worker
598*8975f5c5SAndroid Build Coastguard Worker // A shader that renders a simple checker pattern of red and green. X axis and y axis separate the
599*8975f5c5SAndroid Build Coastguard Worker // different colors. Needs varying v_position.
Checkered()600*8975f5c5SAndroid Build Coastguard Worker const char *Checkered()
601*8975f5c5SAndroid Build Coastguard Worker {
602*8975f5c5SAndroid Build Coastguard Worker return R"(precision highp float;
603*8975f5c5SAndroid Build Coastguard Worker varying vec4 v_position;
604*8975f5c5SAndroid Build Coastguard Worker
605*8975f5c5SAndroid Build Coastguard Worker void main()
606*8975f5c5SAndroid Build Coastguard Worker {
607*8975f5c5SAndroid Build Coastguard Worker bool isLeft = v_position.x < 0.0;
608*8975f5c5SAndroid Build Coastguard Worker bool isTop = v_position.y < 0.0;
609*8975f5c5SAndroid Build Coastguard Worker if (isLeft)
610*8975f5c5SAndroid Build Coastguard Worker {
611*8975f5c5SAndroid Build Coastguard Worker if (isTop)
612*8975f5c5SAndroid Build Coastguard Worker {
613*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
614*8975f5c5SAndroid Build Coastguard Worker }
615*8975f5c5SAndroid Build Coastguard Worker else
616*8975f5c5SAndroid Build Coastguard Worker {
617*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
618*8975f5c5SAndroid Build Coastguard Worker }
619*8975f5c5SAndroid Build Coastguard Worker }
620*8975f5c5SAndroid Build Coastguard Worker else
621*8975f5c5SAndroid Build Coastguard Worker {
622*8975f5c5SAndroid Build Coastguard Worker if (isTop)
623*8975f5c5SAndroid Build Coastguard Worker {
624*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
625*8975f5c5SAndroid Build Coastguard Worker }
626*8975f5c5SAndroid Build Coastguard Worker else
627*8975f5c5SAndroid Build Coastguard Worker {
628*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);
629*8975f5c5SAndroid Build Coastguard Worker }
630*8975f5c5SAndroid Build Coastguard Worker }
631*8975f5c5SAndroid Build Coastguard Worker })";
632*8975f5c5SAndroid Build Coastguard Worker }
633*8975f5c5SAndroid Build Coastguard Worker
634*8975f5c5SAndroid Build Coastguard Worker // A shader that fills with color taken from uniform named "color".
UniformColor()635*8975f5c5SAndroid Build Coastguard Worker const char *UniformColor()
636*8975f5c5SAndroid Build Coastguard Worker {
637*8975f5c5SAndroid Build Coastguard Worker return R"(uniform mediump vec4 u_color;
638*8975f5c5SAndroid Build Coastguard Worker void main(void)
639*8975f5c5SAndroid Build Coastguard Worker {
640*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = u_color;
641*8975f5c5SAndroid Build Coastguard Worker })";
642*8975f5c5SAndroid Build Coastguard Worker }
643*8975f5c5SAndroid Build Coastguard Worker
644*8975f5c5SAndroid Build Coastguard Worker // A shader that fills with 100% opaque red.
Red()645*8975f5c5SAndroid Build Coastguard Worker const char *Red()
646*8975f5c5SAndroid Build Coastguard Worker {
647*8975f5c5SAndroid Build Coastguard Worker return R"(precision mediump float;
648*8975f5c5SAndroid Build Coastguard Worker
649*8975f5c5SAndroid Build Coastguard Worker void main()
650*8975f5c5SAndroid Build Coastguard Worker {
651*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
652*8975f5c5SAndroid Build Coastguard Worker })";
653*8975f5c5SAndroid Build Coastguard Worker }
654*8975f5c5SAndroid Build Coastguard Worker
655*8975f5c5SAndroid Build Coastguard Worker // A shader that fills with 100% opaque green.
Green()656*8975f5c5SAndroid Build Coastguard Worker const char *Green()
657*8975f5c5SAndroid Build Coastguard Worker {
658*8975f5c5SAndroid Build Coastguard Worker return R"(precision mediump float;
659*8975f5c5SAndroid Build Coastguard Worker
660*8975f5c5SAndroid Build Coastguard Worker void main()
661*8975f5c5SAndroid Build Coastguard Worker {
662*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
663*8975f5c5SAndroid Build Coastguard Worker })";
664*8975f5c5SAndroid Build Coastguard Worker }
665*8975f5c5SAndroid Build Coastguard Worker
666*8975f5c5SAndroid Build Coastguard Worker // A shader that fills with 100% opaque blue.
Blue()667*8975f5c5SAndroid Build Coastguard Worker const char *Blue()
668*8975f5c5SAndroid Build Coastguard Worker {
669*8975f5c5SAndroid Build Coastguard Worker return R"(precision mediump float;
670*8975f5c5SAndroid Build Coastguard Worker
671*8975f5c5SAndroid Build Coastguard Worker void main()
672*8975f5c5SAndroid Build Coastguard Worker {
673*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
674*8975f5c5SAndroid Build Coastguard Worker })";
675*8975f5c5SAndroid Build Coastguard Worker }
676*8975f5c5SAndroid Build Coastguard Worker
677*8975f5c5SAndroid Build Coastguard Worker // A shader that samples the texture.
Texture2D()678*8975f5c5SAndroid Build Coastguard Worker const char *Texture2D()
679*8975f5c5SAndroid Build Coastguard Worker {
680*8975f5c5SAndroid Build Coastguard Worker return R"(precision mediump float;
681*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D u_tex2D;
682*8975f5c5SAndroid Build Coastguard Worker varying vec2 v_texCoord;
683*8975f5c5SAndroid Build Coastguard Worker
684*8975f5c5SAndroid Build Coastguard Worker void main()
685*8975f5c5SAndroid Build Coastguard Worker {
686*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = texture2D(u_tex2D, v_texCoord);
687*8975f5c5SAndroid Build Coastguard Worker })";
688*8975f5c5SAndroid Build Coastguard Worker }
689*8975f5c5SAndroid Build Coastguard Worker
Texture2DArray()690*8975f5c5SAndroid Build Coastguard Worker const char *Texture2DArray()
691*8975f5c5SAndroid Build Coastguard Worker {
692*8975f5c5SAndroid Build Coastguard Worker return R"(#version 300 es
693*8975f5c5SAndroid Build Coastguard Worker precision highp float;
694*8975f5c5SAndroid Build Coastguard Worker uniform highp sampler2DArray tex2DArray;
695*8975f5c5SAndroid Build Coastguard Worker uniform int slice;
696*8975f5c5SAndroid Build Coastguard Worker in vec2 v_texCoord;
697*8975f5c5SAndroid Build Coastguard Worker out vec4 fragColor;
698*8975f5c5SAndroid Build Coastguard Worker void main()
699*8975f5c5SAndroid Build Coastguard Worker {
700*8975f5c5SAndroid Build Coastguard Worker fragColor = texture(tex2DArray, vec3(v_texCoord, float(slice)));
701*8975f5c5SAndroid Build Coastguard Worker })";
702*8975f5c5SAndroid Build Coastguard Worker }
703*8975f5c5SAndroid Build Coastguard Worker
704*8975f5c5SAndroid Build Coastguard Worker } // namespace fs
705*8975f5c5SAndroid Build Coastguard Worker } // namespace essl1_shaders
706*8975f5c5SAndroid Build Coastguard Worker
707*8975f5c5SAndroid Build Coastguard Worker namespace essl3_shaders
708*8975f5c5SAndroid Build Coastguard Worker {
709*8975f5c5SAndroid Build Coastguard Worker
PositionAttrib()710*8975f5c5SAndroid Build Coastguard Worker const char *PositionAttrib()
711*8975f5c5SAndroid Build Coastguard Worker {
712*8975f5c5SAndroid Build Coastguard Worker return "a_position";
713*8975f5c5SAndroid Build Coastguard Worker }
Texture2DUniform()714*8975f5c5SAndroid Build Coastguard Worker const char *Texture2DUniform()
715*8975f5c5SAndroid Build Coastguard Worker {
716*8975f5c5SAndroid Build Coastguard Worker return "u_tex2D";
717*8975f5c5SAndroid Build Coastguard Worker }
LodUniform()718*8975f5c5SAndroid Build Coastguard Worker const char *LodUniform()
719*8975f5c5SAndroid Build Coastguard Worker {
720*8975f5c5SAndroid Build Coastguard Worker return "u_lod";
721*8975f5c5SAndroid Build Coastguard Worker }
722*8975f5c5SAndroid Build Coastguard Worker
723*8975f5c5SAndroid Build Coastguard Worker namespace vs
724*8975f5c5SAndroid Build Coastguard Worker {
725*8975f5c5SAndroid Build Coastguard Worker
726*8975f5c5SAndroid Build Coastguard Worker // A shader that sets gl_Position to zero.
Zero()727*8975f5c5SAndroid Build Coastguard Worker const char *Zero()
728*8975f5c5SAndroid Build Coastguard Worker {
729*8975f5c5SAndroid Build Coastguard Worker return R"(#version 300 es
730*8975f5c5SAndroid Build Coastguard Worker void main()
731*8975f5c5SAndroid Build Coastguard Worker {
732*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(0);
733*8975f5c5SAndroid Build Coastguard Worker })";
734*8975f5c5SAndroid Build Coastguard Worker }
735*8975f5c5SAndroid Build Coastguard Worker
736*8975f5c5SAndroid Build Coastguard Worker // A shader that sets gl_Position to attribute a_position.
Simple()737*8975f5c5SAndroid Build Coastguard Worker const char *Simple()
738*8975f5c5SAndroid Build Coastguard Worker {
739*8975f5c5SAndroid Build Coastguard Worker return R"(#version 300 es
740*8975f5c5SAndroid Build Coastguard Worker in vec4 a_position;
741*8975f5c5SAndroid Build Coastguard Worker void main()
742*8975f5c5SAndroid Build Coastguard Worker {
743*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
744*8975f5c5SAndroid Build Coastguard Worker })";
745*8975f5c5SAndroid Build Coastguard Worker }
746*8975f5c5SAndroid Build Coastguard Worker
747*8975f5c5SAndroid Build Coastguard Worker // A shader that sets gl_Position to attribute a_position, and sets gl_PointSize to 1.
SimpleForPoints()748*8975f5c5SAndroid Build Coastguard Worker const char *SimpleForPoints()
749*8975f5c5SAndroid Build Coastguard Worker {
750*8975f5c5SAndroid Build Coastguard Worker return R"(#version 300 es
751*8975f5c5SAndroid Build Coastguard Worker in vec4 a_position;
752*8975f5c5SAndroid Build Coastguard Worker void main()
753*8975f5c5SAndroid Build Coastguard Worker {
754*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
755*8975f5c5SAndroid Build Coastguard Worker gl_PointSize = 1.0;
756*8975f5c5SAndroid Build Coastguard Worker })";
757*8975f5c5SAndroid Build Coastguard Worker }
758*8975f5c5SAndroid Build Coastguard Worker
759*8975f5c5SAndroid Build Coastguard Worker // A shader that simply passes through attribute a_position, setting it to gl_Position and varying
760*8975f5c5SAndroid Build Coastguard Worker // v_position.
Passthrough()761*8975f5c5SAndroid Build Coastguard Worker const char *Passthrough()
762*8975f5c5SAndroid Build Coastguard Worker {
763*8975f5c5SAndroid Build Coastguard Worker return R"(#version 300 es
764*8975f5c5SAndroid Build Coastguard Worker in vec4 a_position;
765*8975f5c5SAndroid Build Coastguard Worker out vec4 v_position;
766*8975f5c5SAndroid Build Coastguard Worker void main()
767*8975f5c5SAndroid Build Coastguard Worker {
768*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
769*8975f5c5SAndroid Build Coastguard Worker v_position = a_position;
770*8975f5c5SAndroid Build Coastguard Worker })";
771*8975f5c5SAndroid Build Coastguard Worker }
772*8975f5c5SAndroid Build Coastguard Worker
773*8975f5c5SAndroid Build Coastguard Worker // A shader that simply passes through attribute a_position, setting it to gl_Position and varying
774*8975f5c5SAndroid Build Coastguard Worker // texcoord.
Texture2DLod()775*8975f5c5SAndroid Build Coastguard Worker const char *Texture2DLod()
776*8975f5c5SAndroid Build Coastguard Worker {
777*8975f5c5SAndroid Build Coastguard Worker return R"(#version 300 es
778*8975f5c5SAndroid Build Coastguard Worker in vec4 a_position;
779*8975f5c5SAndroid Build Coastguard Worker out vec2 v_texCoord;
780*8975f5c5SAndroid Build Coastguard Worker
781*8975f5c5SAndroid Build Coastguard Worker void main()
782*8975f5c5SAndroid Build Coastguard Worker {
783*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(a_position.xy, 0.0, 1.0);
784*8975f5c5SAndroid Build Coastguard Worker v_texCoord = a_position.xy * 0.5 + vec2(0.5);
785*8975f5c5SAndroid Build Coastguard Worker })";
786*8975f5c5SAndroid Build Coastguard Worker }
787*8975f5c5SAndroid Build Coastguard Worker
788*8975f5c5SAndroid Build Coastguard Worker } // namespace vs
789*8975f5c5SAndroid Build Coastguard Worker
790*8975f5c5SAndroid Build Coastguard Worker namespace fs
791*8975f5c5SAndroid Build Coastguard Worker {
792*8975f5c5SAndroid Build Coastguard Worker
793*8975f5c5SAndroid Build Coastguard Worker // A shader that fills with 100% opaque red.
Red()794*8975f5c5SAndroid Build Coastguard Worker const char *Red()
795*8975f5c5SAndroid Build Coastguard Worker {
796*8975f5c5SAndroid Build Coastguard Worker return R"(#version 300 es
797*8975f5c5SAndroid Build Coastguard Worker precision highp float;
798*8975f5c5SAndroid Build Coastguard Worker out vec4 my_FragColor;
799*8975f5c5SAndroid Build Coastguard Worker void main()
800*8975f5c5SAndroid Build Coastguard Worker {
801*8975f5c5SAndroid Build Coastguard Worker my_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
802*8975f5c5SAndroid Build Coastguard Worker })";
803*8975f5c5SAndroid Build Coastguard Worker }
804*8975f5c5SAndroid Build Coastguard Worker
805*8975f5c5SAndroid Build Coastguard Worker // A shader that fills with 100% opaque green.
Green()806*8975f5c5SAndroid Build Coastguard Worker const char *Green()
807*8975f5c5SAndroid Build Coastguard Worker {
808*8975f5c5SAndroid Build Coastguard Worker return R"(#version 300 es
809*8975f5c5SAndroid Build Coastguard Worker precision highp float;
810*8975f5c5SAndroid Build Coastguard Worker out vec4 my_FragColor;
811*8975f5c5SAndroid Build Coastguard Worker void main()
812*8975f5c5SAndroid Build Coastguard Worker {
813*8975f5c5SAndroid Build Coastguard Worker my_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
814*8975f5c5SAndroid Build Coastguard Worker })";
815*8975f5c5SAndroid Build Coastguard Worker }
816*8975f5c5SAndroid Build Coastguard Worker
817*8975f5c5SAndroid Build Coastguard Worker // A shader that fills with 100% opaque blue.
Blue()818*8975f5c5SAndroid Build Coastguard Worker const char *Blue()
819*8975f5c5SAndroid Build Coastguard Worker {
820*8975f5c5SAndroid Build Coastguard Worker return R"(#version 300 es
821*8975f5c5SAndroid Build Coastguard Worker precision highp float;
822*8975f5c5SAndroid Build Coastguard Worker out vec4 my_FragColor;
823*8975f5c5SAndroid Build Coastguard Worker void main()
824*8975f5c5SAndroid Build Coastguard Worker {
825*8975f5c5SAndroid Build Coastguard Worker my_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
826*8975f5c5SAndroid Build Coastguard Worker })";
827*8975f5c5SAndroid Build Coastguard Worker }
828*8975f5c5SAndroid Build Coastguard Worker
829*8975f5c5SAndroid Build Coastguard Worker // A shader that samples the texture at a given lod.
Texture2DLod()830*8975f5c5SAndroid Build Coastguard Worker const char *Texture2DLod()
831*8975f5c5SAndroid Build Coastguard Worker {
832*8975f5c5SAndroid Build Coastguard Worker return R"(#version 300 es
833*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
834*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D u_tex2D;
835*8975f5c5SAndroid Build Coastguard Worker uniform float u_lod;
836*8975f5c5SAndroid Build Coastguard Worker in vec2 v_texCoord;
837*8975f5c5SAndroid Build Coastguard Worker out vec4 my_FragColor;
838*8975f5c5SAndroid Build Coastguard Worker
839*8975f5c5SAndroid Build Coastguard Worker void main()
840*8975f5c5SAndroid Build Coastguard Worker {
841*8975f5c5SAndroid Build Coastguard Worker my_FragColor = textureLod(u_tex2D, v_texCoord, u_lod);
842*8975f5c5SAndroid Build Coastguard Worker })";
843*8975f5c5SAndroid Build Coastguard Worker }
844*8975f5c5SAndroid Build Coastguard Worker
845*8975f5c5SAndroid Build Coastguard Worker } // namespace fs
846*8975f5c5SAndroid Build Coastguard Worker } // namespace essl3_shaders
847*8975f5c5SAndroid Build Coastguard Worker
848*8975f5c5SAndroid Build Coastguard Worker namespace essl31_shaders
849*8975f5c5SAndroid Build Coastguard Worker {
850*8975f5c5SAndroid Build Coastguard Worker
PositionAttrib()851*8975f5c5SAndroid Build Coastguard Worker const char *PositionAttrib()
852*8975f5c5SAndroid Build Coastguard Worker {
853*8975f5c5SAndroid Build Coastguard Worker return "a_position";
854*8975f5c5SAndroid Build Coastguard Worker }
855*8975f5c5SAndroid Build Coastguard Worker
856*8975f5c5SAndroid Build Coastguard Worker namespace vs
857*8975f5c5SAndroid Build Coastguard Worker {
858*8975f5c5SAndroid Build Coastguard Worker
859*8975f5c5SAndroid Build Coastguard Worker // A shader that sets gl_Position to zero.
Zero()860*8975f5c5SAndroid Build Coastguard Worker const char *Zero()
861*8975f5c5SAndroid Build Coastguard Worker {
862*8975f5c5SAndroid Build Coastguard Worker return R"(#version 310 es
863*8975f5c5SAndroid Build Coastguard Worker void main()
864*8975f5c5SAndroid Build Coastguard Worker {
865*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(0);
866*8975f5c5SAndroid Build Coastguard Worker })";
867*8975f5c5SAndroid Build Coastguard Worker }
868*8975f5c5SAndroid Build Coastguard Worker
869*8975f5c5SAndroid Build Coastguard Worker // A shader that sets gl_Position to attribute a_position.
Simple()870*8975f5c5SAndroid Build Coastguard Worker const char *Simple()
871*8975f5c5SAndroid Build Coastguard Worker {
872*8975f5c5SAndroid Build Coastguard Worker return R"(#version 310 es
873*8975f5c5SAndroid Build Coastguard Worker in vec4 a_position;
874*8975f5c5SAndroid Build Coastguard Worker void main()
875*8975f5c5SAndroid Build Coastguard Worker {
876*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
877*8975f5c5SAndroid Build Coastguard Worker })";
878*8975f5c5SAndroid Build Coastguard Worker }
879*8975f5c5SAndroid Build Coastguard Worker
880*8975f5c5SAndroid Build Coastguard Worker // A shader that simply passes through attribute a_position, setting it to gl_Position and varying
881*8975f5c5SAndroid Build Coastguard Worker // v_position.
Passthrough()882*8975f5c5SAndroid Build Coastguard Worker const char *Passthrough()
883*8975f5c5SAndroid Build Coastguard Worker {
884*8975f5c5SAndroid Build Coastguard Worker return R"(#version 310 es
885*8975f5c5SAndroid Build Coastguard Worker in vec4 a_position;
886*8975f5c5SAndroid Build Coastguard Worker out vec4 v_position;
887*8975f5c5SAndroid Build Coastguard Worker void main()
888*8975f5c5SAndroid Build Coastguard Worker {
889*8975f5c5SAndroid Build Coastguard Worker gl_Position = a_position;
890*8975f5c5SAndroid Build Coastguard Worker v_position = a_position;
891*8975f5c5SAndroid Build Coastguard Worker })";
892*8975f5c5SAndroid Build Coastguard Worker }
893*8975f5c5SAndroid Build Coastguard Worker
894*8975f5c5SAndroid Build Coastguard Worker } // namespace vs
895*8975f5c5SAndroid Build Coastguard Worker
896*8975f5c5SAndroid Build Coastguard Worker namespace fs
897*8975f5c5SAndroid Build Coastguard Worker {
898*8975f5c5SAndroid Build Coastguard Worker
899*8975f5c5SAndroid Build Coastguard Worker // A shader that fills with 100% opaque red.
Red()900*8975f5c5SAndroid Build Coastguard Worker const char *Red()
901*8975f5c5SAndroid Build Coastguard Worker {
902*8975f5c5SAndroid Build Coastguard Worker return R"(#version 310 es
903*8975f5c5SAndroid Build Coastguard Worker precision highp float;
904*8975f5c5SAndroid Build Coastguard Worker out vec4 my_FragColor;
905*8975f5c5SAndroid Build Coastguard Worker void main()
906*8975f5c5SAndroid Build Coastguard Worker {
907*8975f5c5SAndroid Build Coastguard Worker my_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
908*8975f5c5SAndroid Build Coastguard Worker })";
909*8975f5c5SAndroid Build Coastguard Worker }
910*8975f5c5SAndroid Build Coastguard Worker
911*8975f5c5SAndroid Build Coastguard Worker // A shader that fills with 100% opaque green.
Green()912*8975f5c5SAndroid Build Coastguard Worker const char *Green()
913*8975f5c5SAndroid Build Coastguard Worker {
914*8975f5c5SAndroid Build Coastguard Worker return R"(#version 310 es
915*8975f5c5SAndroid Build Coastguard Worker precision highp float;
916*8975f5c5SAndroid Build Coastguard Worker out vec4 my_FragColor;
917*8975f5c5SAndroid Build Coastguard Worker void main()
918*8975f5c5SAndroid Build Coastguard Worker {
919*8975f5c5SAndroid Build Coastguard Worker my_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
920*8975f5c5SAndroid Build Coastguard Worker })";
921*8975f5c5SAndroid Build Coastguard Worker }
922*8975f5c5SAndroid Build Coastguard Worker
923*8975f5c5SAndroid Build Coastguard Worker // A shader that renders a simple gradient of red to green. Needs varying v_position.
RedGreenGradient()924*8975f5c5SAndroid Build Coastguard Worker const char *RedGreenGradient()
925*8975f5c5SAndroid Build Coastguard Worker {
926*8975f5c5SAndroid Build Coastguard Worker return R"(#version 310 es
927*8975f5c5SAndroid Build Coastguard Worker precision highp float;
928*8975f5c5SAndroid Build Coastguard Worker in vec4 v_position;
929*8975f5c5SAndroid Build Coastguard Worker out vec4 my_FragColor;
930*8975f5c5SAndroid Build Coastguard Worker
931*8975f5c5SAndroid Build Coastguard Worker void main()
932*8975f5c5SAndroid Build Coastguard Worker {
933*8975f5c5SAndroid Build Coastguard Worker my_FragColor = vec4(v_position.xy * 0.5 + vec2(0.5), 0.0, 1.0);
934*8975f5c5SAndroid Build Coastguard Worker })";
935*8975f5c5SAndroid Build Coastguard Worker }
936*8975f5c5SAndroid Build Coastguard Worker
937*8975f5c5SAndroid Build Coastguard Worker } // namespace fs
938*8975f5c5SAndroid Build Coastguard Worker } // namespace essl31_shaders
939*8975f5c5SAndroid Build Coastguard Worker } // namespace angle
940