xref: /aosp_15_r20/external/angle/util/shader_utils.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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