1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES Utilities
3*35238bceSAndroid Build Coastguard Worker * ------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief SGLR shader program.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "sglrShaderProgram.hpp"
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker namespace sglr
27*35238bceSAndroid Build Coastguard Worker {
28*35238bceSAndroid Build Coastguard Worker namespace pdec
29*35238bceSAndroid Build Coastguard Worker {
30*35238bceSAndroid Build Coastguard Worker
ShaderProgramDeclaration(void)31*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration::ShaderProgramDeclaration(void)
32*35238bceSAndroid Build Coastguard Worker : m_geometryDecl(rr::GEOMETRYSHADERINPUTTYPE_LAST, rr::GEOMETRYSHADEROUTPUTTYPE_LAST, 0, 0)
33*35238bceSAndroid Build Coastguard Worker , m_vertexShaderSet(false)
34*35238bceSAndroid Build Coastguard Worker , m_fragmentShaderSet(false)
35*35238bceSAndroid Build Coastguard Worker , m_geometryShaderSet(false)
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker }
38*35238bceSAndroid Build Coastguard Worker
operator <<(const VertexAttribute & v)39*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &pdec::ShaderProgramDeclaration::operator<<(const VertexAttribute &v)
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker m_vertexAttributes.push_back(v);
42*35238bceSAndroid Build Coastguard Worker return *this;
43*35238bceSAndroid Build Coastguard Worker }
44*35238bceSAndroid Build Coastguard Worker
operator <<(const VertexToFragmentVarying & v)45*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &pdec::ShaderProgramDeclaration::operator<<(const VertexToFragmentVarying &v)
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker m_vertexToFragmentVaryings.push_back(v);
48*35238bceSAndroid Build Coastguard Worker return *this;
49*35238bceSAndroid Build Coastguard Worker }
50*35238bceSAndroid Build Coastguard Worker
operator <<(const VertexToGeometryVarying & v)51*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &pdec::ShaderProgramDeclaration::operator<<(const VertexToGeometryVarying &v)
52*35238bceSAndroid Build Coastguard Worker {
53*35238bceSAndroid Build Coastguard Worker m_vertexToGeometryVaryings.push_back(v);
54*35238bceSAndroid Build Coastguard Worker return *this;
55*35238bceSAndroid Build Coastguard Worker }
56*35238bceSAndroid Build Coastguard Worker
operator <<(const GeometryToFragmentVarying & v)57*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &pdec::ShaderProgramDeclaration::operator<<(const GeometryToFragmentVarying &v)
58*35238bceSAndroid Build Coastguard Worker {
59*35238bceSAndroid Build Coastguard Worker m_geometryToFragmentVaryings.push_back(v);
60*35238bceSAndroid Build Coastguard Worker return *this;
61*35238bceSAndroid Build Coastguard Worker }
62*35238bceSAndroid Build Coastguard Worker
operator <<(const FragmentOutput & v)63*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &pdec::ShaderProgramDeclaration::operator<<(const FragmentOutput &v)
64*35238bceSAndroid Build Coastguard Worker {
65*35238bceSAndroid Build Coastguard Worker m_fragmentOutputs.push_back(v);
66*35238bceSAndroid Build Coastguard Worker return *this;
67*35238bceSAndroid Build Coastguard Worker }
68*35238bceSAndroid Build Coastguard Worker
operator <<(const Uniform & v)69*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &pdec::ShaderProgramDeclaration::operator<<(const Uniform &v)
70*35238bceSAndroid Build Coastguard Worker {
71*35238bceSAndroid Build Coastguard Worker m_uniforms.push_back(v);
72*35238bceSAndroid Build Coastguard Worker return *this;
73*35238bceSAndroid Build Coastguard Worker }
74*35238bceSAndroid Build Coastguard Worker
operator <<(const VertexSource & c)75*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &pdec::ShaderProgramDeclaration::operator<<(const VertexSource &c)
76*35238bceSAndroid Build Coastguard Worker {
77*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_vertexShaderSet);
78*35238bceSAndroid Build Coastguard Worker m_vertexSource = c.source;
79*35238bceSAndroid Build Coastguard Worker m_vertexShaderSet = true;
80*35238bceSAndroid Build Coastguard Worker return *this;
81*35238bceSAndroid Build Coastguard Worker }
82*35238bceSAndroid Build Coastguard Worker
operator <<(const FragmentSource & c)83*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &pdec::ShaderProgramDeclaration::operator<<(const FragmentSource &c)
84*35238bceSAndroid Build Coastguard Worker {
85*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_fragmentShaderSet);
86*35238bceSAndroid Build Coastguard Worker m_fragmentSource = c.source;
87*35238bceSAndroid Build Coastguard Worker m_fragmentShaderSet = true;
88*35238bceSAndroid Build Coastguard Worker return *this;
89*35238bceSAndroid Build Coastguard Worker }
90*35238bceSAndroid Build Coastguard Worker
operator <<(const GeometrySource & c)91*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &pdec::ShaderProgramDeclaration::operator<<(const GeometrySource &c)
92*35238bceSAndroid Build Coastguard Worker {
93*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_geometryShaderSet);
94*35238bceSAndroid Build Coastguard Worker m_geometrySource = c.source;
95*35238bceSAndroid Build Coastguard Worker m_geometryShaderSet = true;
96*35238bceSAndroid Build Coastguard Worker return *this;
97*35238bceSAndroid Build Coastguard Worker }
98*35238bceSAndroid Build Coastguard Worker
operator <<(const GeometryShaderDeclaration & c)99*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &pdec::ShaderProgramDeclaration::operator<<(const GeometryShaderDeclaration &c)
100*35238bceSAndroid Build Coastguard Worker {
101*35238bceSAndroid Build Coastguard Worker m_geometryDecl = c;
102*35238bceSAndroid Build Coastguard Worker return *this;
103*35238bceSAndroid Build Coastguard Worker }
104*35238bceSAndroid Build Coastguard Worker
valid(void) const105*35238bceSAndroid Build Coastguard Worker bool ShaderProgramDeclaration::valid(void) const
106*35238bceSAndroid Build Coastguard Worker {
107*35238bceSAndroid Build Coastguard Worker if (!m_vertexShaderSet || !m_fragmentShaderSet)
108*35238bceSAndroid Build Coastguard Worker return false;
109*35238bceSAndroid Build Coastguard Worker
110*35238bceSAndroid Build Coastguard Worker if (m_fragmentOutputs.empty())
111*35238bceSAndroid Build Coastguard Worker return false;
112*35238bceSAndroid Build Coastguard Worker
113*35238bceSAndroid Build Coastguard Worker if (hasGeometryShader())
114*35238bceSAndroid Build Coastguard Worker {
115*35238bceSAndroid Build Coastguard Worker if (m_geometryDecl.inputType == rr::GEOMETRYSHADERINPUTTYPE_LAST ||
116*35238bceSAndroid Build Coastguard Worker m_geometryDecl.outputType == rr::GEOMETRYSHADEROUTPUTTYPE_LAST)
117*35238bceSAndroid Build Coastguard Worker return false;
118*35238bceSAndroid Build Coastguard Worker }
119*35238bceSAndroid Build Coastguard Worker else
120*35238bceSAndroid Build Coastguard Worker {
121*35238bceSAndroid Build Coastguard Worker if (m_geometryDecl.inputType != rr::GEOMETRYSHADERINPUTTYPE_LAST ||
122*35238bceSAndroid Build Coastguard Worker m_geometryDecl.outputType != rr::GEOMETRYSHADEROUTPUTTYPE_LAST || m_geometryDecl.numOutputVertices != 0 ||
123*35238bceSAndroid Build Coastguard Worker m_geometryDecl.numInvocations != 0)
124*35238bceSAndroid Build Coastguard Worker return false;
125*35238bceSAndroid Build Coastguard Worker }
126*35238bceSAndroid Build Coastguard Worker
127*35238bceSAndroid Build Coastguard Worker return true;
128*35238bceSAndroid Build Coastguard Worker }
129*35238bceSAndroid Build Coastguard Worker
130*35238bceSAndroid Build Coastguard Worker } // namespace pdec
131*35238bceSAndroid Build Coastguard Worker
ShaderProgram(const pdec::ShaderProgramDeclaration & decl)132*35238bceSAndroid Build Coastguard Worker ShaderProgram::ShaderProgram(const pdec::ShaderProgramDeclaration &decl)
133*35238bceSAndroid Build Coastguard Worker : rr::VertexShader(decl.getVertexInputCount(), decl.getVertexOutputCount())
134*35238bceSAndroid Build Coastguard Worker , rr::GeometryShader(decl.getGeometryInputCount(), decl.getGeometryOutputCount(), decl.m_geometryDecl.inputType,
135*35238bceSAndroid Build Coastguard Worker decl.m_geometryDecl.outputType, decl.m_geometryDecl.numOutputVertices,
136*35238bceSAndroid Build Coastguard Worker decl.m_geometryDecl.numInvocations)
137*35238bceSAndroid Build Coastguard Worker , rr::FragmentShader(decl.getFragmentInputCount(), decl.getFragmentOutputCount())
138*35238bceSAndroid Build Coastguard Worker , m_attributeNames(decl.getVertexInputCount())
139*35238bceSAndroid Build Coastguard Worker , m_uniforms(decl.m_uniforms.size())
140*35238bceSAndroid Build Coastguard Worker , m_vertSrc(decl.m_vertexSource)
141*35238bceSAndroid Build Coastguard Worker , m_fragSrc(decl.m_fragmentSource)
142*35238bceSAndroid Build Coastguard Worker , m_geomSrc(decl.hasGeometryShader() ? (decl.m_geometrySource) : (""))
143*35238bceSAndroid Build Coastguard Worker , m_hasGeometryShader(decl.hasGeometryShader())
144*35238bceSAndroid Build Coastguard Worker {
145*35238bceSAndroid Build Coastguard Worker DE_ASSERT(decl.valid());
146*35238bceSAndroid Build Coastguard Worker
147*35238bceSAndroid Build Coastguard Worker // Set up shader IO
148*35238bceSAndroid Build Coastguard Worker
149*35238bceSAndroid Build Coastguard Worker for (size_t ndx = 0; ndx < decl.m_vertexAttributes.size(); ++ndx)
150*35238bceSAndroid Build Coastguard Worker {
151*35238bceSAndroid Build Coastguard Worker this->rr::VertexShader::m_inputs[ndx].type = decl.m_vertexAttributes[ndx].type;
152*35238bceSAndroid Build Coastguard Worker m_attributeNames[ndx] = decl.m_vertexAttributes[ndx].name;
153*35238bceSAndroid Build Coastguard Worker }
154*35238bceSAndroid Build Coastguard Worker
155*35238bceSAndroid Build Coastguard Worker if (m_hasGeometryShader)
156*35238bceSAndroid Build Coastguard Worker {
157*35238bceSAndroid Build Coastguard Worker for (size_t ndx = 0; ndx < decl.m_vertexToGeometryVaryings.size(); ++ndx)
158*35238bceSAndroid Build Coastguard Worker {
159*35238bceSAndroid Build Coastguard Worker this->rr::VertexShader::m_outputs[ndx].type = decl.m_vertexToGeometryVaryings[ndx].type;
160*35238bceSAndroid Build Coastguard Worker this->rr::VertexShader::m_outputs[ndx].flatshade = decl.m_vertexToGeometryVaryings[ndx].flatshade;
161*35238bceSAndroid Build Coastguard Worker
162*35238bceSAndroid Build Coastguard Worker this->rr::GeometryShader::m_inputs[ndx] = this->rr::VertexShader::m_outputs[ndx];
163*35238bceSAndroid Build Coastguard Worker }
164*35238bceSAndroid Build Coastguard Worker for (size_t ndx = 0; ndx < decl.m_geometryToFragmentVaryings.size(); ++ndx)
165*35238bceSAndroid Build Coastguard Worker {
166*35238bceSAndroid Build Coastguard Worker this->rr::GeometryShader::m_outputs[ndx].type = decl.m_geometryToFragmentVaryings[ndx].type;
167*35238bceSAndroid Build Coastguard Worker this->rr::GeometryShader::m_outputs[ndx].flatshade = decl.m_geometryToFragmentVaryings[ndx].flatshade;
168*35238bceSAndroid Build Coastguard Worker
169*35238bceSAndroid Build Coastguard Worker this->rr::FragmentShader::m_inputs[ndx] = this->rr::GeometryShader::m_outputs[ndx];
170*35238bceSAndroid Build Coastguard Worker }
171*35238bceSAndroid Build Coastguard Worker }
172*35238bceSAndroid Build Coastguard Worker else
173*35238bceSAndroid Build Coastguard Worker {
174*35238bceSAndroid Build Coastguard Worker for (size_t ndx = 0; ndx < decl.m_vertexToFragmentVaryings.size(); ++ndx)
175*35238bceSAndroid Build Coastguard Worker {
176*35238bceSAndroid Build Coastguard Worker this->rr::VertexShader::m_outputs[ndx].type = decl.m_vertexToFragmentVaryings[ndx].type;
177*35238bceSAndroid Build Coastguard Worker this->rr::VertexShader::m_outputs[ndx].flatshade = decl.m_vertexToFragmentVaryings[ndx].flatshade;
178*35238bceSAndroid Build Coastguard Worker
179*35238bceSAndroid Build Coastguard Worker this->rr::FragmentShader::m_inputs[ndx] = this->rr::VertexShader::m_outputs[ndx];
180*35238bceSAndroid Build Coastguard Worker }
181*35238bceSAndroid Build Coastguard Worker }
182*35238bceSAndroid Build Coastguard Worker
183*35238bceSAndroid Build Coastguard Worker for (size_t ndx = 0; ndx < decl.m_fragmentOutputs.size(); ++ndx)
184*35238bceSAndroid Build Coastguard Worker this->rr::FragmentShader::m_outputs[ndx].type = decl.m_fragmentOutputs[ndx].type;
185*35238bceSAndroid Build Coastguard Worker
186*35238bceSAndroid Build Coastguard Worker // Set up uniforms
187*35238bceSAndroid Build Coastguard Worker
188*35238bceSAndroid Build Coastguard Worker for (size_t ndx = 0; ndx < decl.m_uniforms.size(); ++ndx)
189*35238bceSAndroid Build Coastguard Worker {
190*35238bceSAndroid Build Coastguard Worker this->m_uniforms[ndx].name = decl.m_uniforms[ndx].name;
191*35238bceSAndroid Build Coastguard Worker this->m_uniforms[ndx].type = decl.m_uniforms[ndx].type;
192*35238bceSAndroid Build Coastguard Worker }
193*35238bceSAndroid Build Coastguard Worker }
194*35238bceSAndroid Build Coastguard Worker
~ShaderProgram(void)195*35238bceSAndroid Build Coastguard Worker ShaderProgram::~ShaderProgram(void)
196*35238bceSAndroid Build Coastguard Worker {
197*35238bceSAndroid Build Coastguard Worker }
198*35238bceSAndroid Build Coastguard Worker
getUniformByName(const char * name) const199*35238bceSAndroid Build Coastguard Worker const UniformSlot &ShaderProgram::getUniformByName(const char *name) const
200*35238bceSAndroid Build Coastguard Worker {
201*35238bceSAndroid Build Coastguard Worker DE_ASSERT(name);
202*35238bceSAndroid Build Coastguard Worker
203*35238bceSAndroid Build Coastguard Worker for (size_t ndx = 0; ndx < m_uniforms.size(); ++ndx)
204*35238bceSAndroid Build Coastguard Worker if (m_uniforms[ndx].name == std::string(name))
205*35238bceSAndroid Build Coastguard Worker return m_uniforms[ndx];
206*35238bceSAndroid Build Coastguard Worker
207*35238bceSAndroid Build Coastguard Worker DE_FATAL("Invalid uniform name, uniform not found.");
208*35238bceSAndroid Build Coastguard Worker return m_uniforms[0];
209*35238bceSAndroid Build Coastguard Worker }
210*35238bceSAndroid Build Coastguard Worker
shadePrimitives(rr::GeometryEmitter & output,int verticesIn,const rr::PrimitivePacket * packets,const int numPackets,int invocationID) const211*35238bceSAndroid Build Coastguard Worker void ShaderProgram::shadePrimitives(rr::GeometryEmitter &output, int verticesIn, const rr::PrimitivePacket *packets,
212*35238bceSAndroid Build Coastguard Worker const int numPackets, int invocationID) const
213*35238bceSAndroid Build Coastguard Worker {
214*35238bceSAndroid Build Coastguard Worker DE_UNREF(output);
215*35238bceSAndroid Build Coastguard Worker DE_UNREF(verticesIn && packets && numPackets && invocationID);
216*35238bceSAndroid Build Coastguard Worker
217*35238bceSAndroid Build Coastguard Worker // Should never be called.
218*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
219*35238bceSAndroid Build Coastguard Worker }
220*35238bceSAndroid Build Coastguard Worker
221*35238bceSAndroid Build Coastguard Worker } // namespace sglr
222