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