1*35238bceSAndroid Build Coastguard Worker #ifndef _RRSHADERS_HPP
2*35238bceSAndroid Build Coastguard Worker #define _RRSHADERS_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Reference Renderer
5*35238bceSAndroid Build Coastguard Worker * -----------------------------------------------
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker *
9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker *
15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker *
21*35238bceSAndroid Build Coastguard Worker *//*!
22*35238bceSAndroid Build Coastguard Worker * \file
23*35238bceSAndroid Build Coastguard Worker * \brief Shader interfaces.
24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker #include "rrDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "rrVertexAttrib.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "rrVertexPacket.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "rrFragmentPacket.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "rrPrimitivePacket.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "rrShadingContext.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "deString.h"
33*35238bceSAndroid Build Coastguard Worker
34*35238bceSAndroid Build Coastguard Worker namespace rr
35*35238bceSAndroid Build Coastguard Worker {
36*35238bceSAndroid Build Coastguard Worker
37*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
38*35238bceSAndroid Build Coastguard Worker * \brief Vertex shader input information
39*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
40*35238bceSAndroid Build Coastguard Worker struct VertexInputInfo
41*35238bceSAndroid Build Coastguard Worker {
VertexInputInforr::VertexInputInfo42*35238bceSAndroid Build Coastguard Worker VertexInputInfo(void)
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker // sensible defaults
45*35238bceSAndroid Build Coastguard Worker type = GENERICVECTYPE_LAST;
46*35238bceSAndroid Build Coastguard Worker }
47*35238bceSAndroid Build Coastguard Worker
48*35238bceSAndroid Build Coastguard Worker GenericVecType type;
49*35238bceSAndroid Build Coastguard Worker };
50*35238bceSAndroid Build Coastguard Worker
51*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
52*35238bceSAndroid Build Coastguard Worker * \brief Shader varying information
53*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
54*35238bceSAndroid Build Coastguard Worker struct VertexVaryingInfo
55*35238bceSAndroid Build Coastguard Worker {
VertexVaryingInforr::VertexVaryingInfo56*35238bceSAndroid Build Coastguard Worker VertexVaryingInfo(void)
57*35238bceSAndroid Build Coastguard Worker {
58*35238bceSAndroid Build Coastguard Worker // sensible defaults
59*35238bceSAndroid Build Coastguard Worker type = GENERICVECTYPE_LAST;
60*35238bceSAndroid Build Coastguard Worker flatshade = false;
61*35238bceSAndroid Build Coastguard Worker }
62*35238bceSAndroid Build Coastguard Worker
63*35238bceSAndroid Build Coastguard Worker // \note used by std::vector<T>::operator==() const
operator ==rr::VertexVaryingInfo64*35238bceSAndroid Build Coastguard Worker bool operator==(const VertexVaryingInfo &other) const
65*35238bceSAndroid Build Coastguard Worker {
66*35238bceSAndroid Build Coastguard Worker return type == other.type && flatshade == other.flatshade;
67*35238bceSAndroid Build Coastguard Worker }
68*35238bceSAndroid Build Coastguard Worker
69*35238bceSAndroid Build Coastguard Worker GenericVecType type;
70*35238bceSAndroid Build Coastguard Worker bool flatshade;
71*35238bceSAndroid Build Coastguard Worker };
72*35238bceSAndroid Build Coastguard Worker
73*35238bceSAndroid Build Coastguard Worker typedef VertexVaryingInfo VertexOutputInfo;
74*35238bceSAndroid Build Coastguard Worker typedef VertexVaryingInfo FragmentInputInfo;
75*35238bceSAndroid Build Coastguard Worker typedef VertexVaryingInfo GeometryInputInfo;
76*35238bceSAndroid Build Coastguard Worker typedef VertexVaryingInfo GeometryOutputInfo;
77*35238bceSAndroid Build Coastguard Worker
78*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
79*35238bceSAndroid Build Coastguard Worker * \brief Fragment shader output information
80*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
81*35238bceSAndroid Build Coastguard Worker struct FragmentOutputInfo
82*35238bceSAndroid Build Coastguard Worker {
FragmentOutputInforr::FragmentOutputInfo83*35238bceSAndroid Build Coastguard Worker FragmentOutputInfo(void)
84*35238bceSAndroid Build Coastguard Worker {
85*35238bceSAndroid Build Coastguard Worker // sensible defaults
86*35238bceSAndroid Build Coastguard Worker type = GENERICVECTYPE_LAST;
87*35238bceSAndroid Build Coastguard Worker }
88*35238bceSAndroid Build Coastguard Worker
89*35238bceSAndroid Build Coastguard Worker GenericVecType type;
90*35238bceSAndroid Build Coastguard Worker };
91*35238bceSAndroid Build Coastguard Worker
92*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
93*35238bceSAndroid Build Coastguard Worker * \brief Vertex shader interface
94*35238bceSAndroid Build Coastguard Worker *
95*35238bceSAndroid Build Coastguard Worker * Vertex shaders execute shading for set of vertex packets. See VertexPacket
96*35238bceSAndroid Build Coastguard Worker * documentation for more details on shading API.
97*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
98*35238bceSAndroid Build Coastguard Worker class VertexShader
99*35238bceSAndroid Build Coastguard Worker {
100*35238bceSAndroid Build Coastguard Worker public:
VertexShader(size_t numInputs,size_t numOutputs)101*35238bceSAndroid Build Coastguard Worker VertexShader(size_t numInputs, size_t numOutputs) : m_inputs(numInputs), m_outputs(numOutputs)
102*35238bceSAndroid Build Coastguard Worker {
103*35238bceSAndroid Build Coastguard Worker }
104*35238bceSAndroid Build Coastguard Worker
105*35238bceSAndroid Build Coastguard Worker virtual void shadeVertices(const VertexAttrib *inputs, VertexPacket *const *packets,
106*35238bceSAndroid Build Coastguard Worker const int numPackets) const = 0;
107*35238bceSAndroid Build Coastguard Worker
getInputs(void) const108*35238bceSAndroid Build Coastguard Worker const std::vector<VertexInputInfo> &getInputs(void) const
109*35238bceSAndroid Build Coastguard Worker {
110*35238bceSAndroid Build Coastguard Worker return m_inputs;
111*35238bceSAndroid Build Coastguard Worker }
getOutputs(void) const112*35238bceSAndroid Build Coastguard Worker const std::vector<VertexOutputInfo> &getOutputs(void) const
113*35238bceSAndroid Build Coastguard Worker {
114*35238bceSAndroid Build Coastguard Worker return m_outputs;
115*35238bceSAndroid Build Coastguard Worker }
116*35238bceSAndroid Build Coastguard Worker
117*35238bceSAndroid Build Coastguard Worker protected:
~VertexShader(void)118*35238bceSAndroid Build Coastguard Worker virtual ~VertexShader(void)
119*35238bceSAndroid Build Coastguard Worker {
120*35238bceSAndroid Build Coastguard Worker } // \note Renderer will not delete any objects passed in.
121*35238bceSAndroid Build Coastguard Worker
122*35238bceSAndroid Build Coastguard Worker std::vector<VertexInputInfo> m_inputs;
123*35238bceSAndroid Build Coastguard Worker std::vector<VertexOutputInfo> m_outputs;
124*35238bceSAndroid Build Coastguard Worker } DE_WARN_UNUSED_TYPE;
125*35238bceSAndroid Build Coastguard Worker
126*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
127*35238bceSAndroid Build Coastguard Worker * \brief Fragment shader interface
128*35238bceSAndroid Build Coastguard Worker *
129*35238bceSAndroid Build Coastguard Worker * Fragment shader executes shading for list of fragment packets. See
130*35238bceSAndroid Build Coastguard Worker * FragmentPacket documentation for more details on shading API.
131*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
132*35238bceSAndroid Build Coastguard Worker class FragmentShader
133*35238bceSAndroid Build Coastguard Worker {
134*35238bceSAndroid Build Coastguard Worker public:
FragmentShader(size_t numInputs,size_t numOutputs)135*35238bceSAndroid Build Coastguard Worker FragmentShader(size_t numInputs, size_t numOutputs) : m_inputs(numInputs), m_outputs(numOutputs)
136*35238bceSAndroid Build Coastguard Worker {
137*35238bceSAndroid Build Coastguard Worker }
138*35238bceSAndroid Build Coastguard Worker
getInputs(void) const139*35238bceSAndroid Build Coastguard Worker const std::vector<FragmentInputInfo> &getInputs(void) const
140*35238bceSAndroid Build Coastguard Worker {
141*35238bceSAndroid Build Coastguard Worker return m_inputs;
142*35238bceSAndroid Build Coastguard Worker }
getOutputs(void) const143*35238bceSAndroid Build Coastguard Worker const std::vector<FragmentOutputInfo> &getOutputs(void) const
144*35238bceSAndroid Build Coastguard Worker {
145*35238bceSAndroid Build Coastguard Worker return m_outputs;
146*35238bceSAndroid Build Coastguard Worker }
147*35238bceSAndroid Build Coastguard Worker
148*35238bceSAndroid Build Coastguard Worker virtual void shadeFragments(FragmentPacket *packets, const int numPackets, const FragmentShadingContext &context)
149*35238bceSAndroid Build Coastguard Worker const = 0; // \note numPackets must be greater than zero.
150*35238bceSAndroid Build Coastguard Worker
151*35238bceSAndroid Build Coastguard Worker protected:
~FragmentShader(void)152*35238bceSAndroid Build Coastguard Worker virtual ~FragmentShader(void)
153*35238bceSAndroid Build Coastguard Worker {
154*35238bceSAndroid Build Coastguard Worker } // \note Renderer will not delete any objects passed in.
155*35238bceSAndroid Build Coastguard Worker
156*35238bceSAndroid Build Coastguard Worker std::vector<FragmentInputInfo> m_inputs;
157*35238bceSAndroid Build Coastguard Worker std::vector<FragmentOutputInfo> m_outputs;
158*35238bceSAndroid Build Coastguard Worker } DE_WARN_UNUSED_TYPE;
159*35238bceSAndroid Build Coastguard Worker
160*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
161*35238bceSAndroid Build Coastguard Worker * \brief Geometry shader input primitive type
162*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
163*35238bceSAndroid Build Coastguard Worker enum GeometryShaderInputType
164*35238bceSAndroid Build Coastguard Worker {
165*35238bceSAndroid Build Coastguard Worker GEOMETRYSHADERINPUTTYPE_POINTS = 0,
166*35238bceSAndroid Build Coastguard Worker GEOMETRYSHADERINPUTTYPE_LINES,
167*35238bceSAndroid Build Coastguard Worker GEOMETRYSHADERINPUTTYPE_LINES_ADJACENCY,
168*35238bceSAndroid Build Coastguard Worker GEOMETRYSHADERINPUTTYPE_TRIANGLES,
169*35238bceSAndroid Build Coastguard Worker GEOMETRYSHADERINPUTTYPE_TRIANGLES_ADJACENCY,
170*35238bceSAndroid Build Coastguard Worker
171*35238bceSAndroid Build Coastguard Worker GEOMETRYSHADERINPUTTYPE_LAST
172*35238bceSAndroid Build Coastguard Worker };
173*35238bceSAndroid Build Coastguard Worker
174*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
175*35238bceSAndroid Build Coastguard Worker * \brief Geometry shader output primitive type
176*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
177*35238bceSAndroid Build Coastguard Worker enum GeometryShaderOutputType
178*35238bceSAndroid Build Coastguard Worker {
179*35238bceSAndroid Build Coastguard Worker GEOMETRYSHADEROUTPUTTYPE_POINTS = 0,
180*35238bceSAndroid Build Coastguard Worker GEOMETRYSHADEROUTPUTTYPE_LINE_STRIP,
181*35238bceSAndroid Build Coastguard Worker GEOMETRYSHADEROUTPUTTYPE_TRIANGLE_STRIP,
182*35238bceSAndroid Build Coastguard Worker
183*35238bceSAndroid Build Coastguard Worker GEOMETRYSHADEROUTPUTTYPE_LAST
184*35238bceSAndroid Build Coastguard Worker };
185*35238bceSAndroid Build Coastguard Worker
186*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
187*35238bceSAndroid Build Coastguard Worker * \brief Geometry shader interface
188*35238bceSAndroid Build Coastguard Worker *
189*35238bceSAndroid Build Coastguard Worker * Geometry shader executes a list of primitive packets and outputs
190*35238bceSAndroid Build Coastguard Worker * a new set of vertex packets for new primitives.
191*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
192*35238bceSAndroid Build Coastguard Worker class GeometryShader
193*35238bceSAndroid Build Coastguard Worker {
194*35238bceSAndroid Build Coastguard Worker public:
195*35238bceSAndroid Build Coastguard Worker GeometryShader(size_t numVaryingInputs, size_t numVaryingOutputs, GeometryShaderInputType inputType,
196*35238bceSAndroid Build Coastguard Worker GeometryShaderOutputType outputType, size_t numVerticesOut, size_t numInvocations);
197*35238bceSAndroid Build Coastguard Worker
198*35238bceSAndroid Build Coastguard Worker virtual void shadePrimitives(GeometryEmitter &output, int verticesIn, const PrimitivePacket *packets,
199*35238bceSAndroid Build Coastguard Worker const int numPackets, int invocationID) const = 0;
200*35238bceSAndroid Build Coastguard Worker
getInputs(void) const201*35238bceSAndroid Build Coastguard Worker const std::vector<GeometryInputInfo> &getInputs(void) const
202*35238bceSAndroid Build Coastguard Worker {
203*35238bceSAndroid Build Coastguard Worker return m_inputs;
204*35238bceSAndroid Build Coastguard Worker }
getOutputs(void) const205*35238bceSAndroid Build Coastguard Worker const std::vector<GeometryOutputInfo> &getOutputs(void) const
206*35238bceSAndroid Build Coastguard Worker {
207*35238bceSAndroid Build Coastguard Worker return m_outputs;
208*35238bceSAndroid Build Coastguard Worker }
getInputType(void) const209*35238bceSAndroid Build Coastguard Worker inline GeometryShaderInputType getInputType(void) const
210*35238bceSAndroid Build Coastguard Worker {
211*35238bceSAndroid Build Coastguard Worker return m_inputType;
212*35238bceSAndroid Build Coastguard Worker }
getOutputType(void) const213*35238bceSAndroid Build Coastguard Worker inline GeometryShaderOutputType getOutputType(void) const
214*35238bceSAndroid Build Coastguard Worker {
215*35238bceSAndroid Build Coastguard Worker return m_outputType;
216*35238bceSAndroid Build Coastguard Worker }
getNumVerticesOut(void) const217*35238bceSAndroid Build Coastguard Worker inline size_t getNumVerticesOut(void) const
218*35238bceSAndroid Build Coastguard Worker {
219*35238bceSAndroid Build Coastguard Worker return m_numVerticesOut;
220*35238bceSAndroid Build Coastguard Worker }
getNumInvocations(void) const221*35238bceSAndroid Build Coastguard Worker inline size_t getNumInvocations(void) const
222*35238bceSAndroid Build Coastguard Worker {
223*35238bceSAndroid Build Coastguard Worker return m_numInvocations;
224*35238bceSAndroid Build Coastguard Worker }
225*35238bceSAndroid Build Coastguard Worker
226*35238bceSAndroid Build Coastguard Worker protected:
~GeometryShader(void)227*35238bceSAndroid Build Coastguard Worker virtual ~GeometryShader(void)
228*35238bceSAndroid Build Coastguard Worker {
229*35238bceSAndroid Build Coastguard Worker }
230*35238bceSAndroid Build Coastguard Worker
231*35238bceSAndroid Build Coastguard Worker const GeometryShaderInputType m_inputType;
232*35238bceSAndroid Build Coastguard Worker const GeometryShaderOutputType m_outputType;
233*35238bceSAndroid Build Coastguard Worker const size_t m_numVerticesOut;
234*35238bceSAndroid Build Coastguard Worker const size_t m_numInvocations;
235*35238bceSAndroid Build Coastguard Worker
236*35238bceSAndroid Build Coastguard Worker std::vector<GeometryInputInfo> m_inputs;
237*35238bceSAndroid Build Coastguard Worker std::vector<GeometryOutputInfo> m_outputs;
238*35238bceSAndroid Build Coastguard Worker } DE_WARN_UNUSED_TYPE;
239*35238bceSAndroid Build Coastguard Worker
240*35238bceSAndroid Build Coastguard Worker // Helpers for shader implementations.
241*35238bceSAndroid Build Coastguard Worker
242*35238bceSAndroid Build Coastguard Worker template <class Shader>
243*35238bceSAndroid Build Coastguard Worker class VertexShaderLoop : public VertexShader
244*35238bceSAndroid Build Coastguard Worker {
245*35238bceSAndroid Build Coastguard Worker public:
VertexShaderLoop(const Shader & shader)246*35238bceSAndroid Build Coastguard Worker VertexShaderLoop(const Shader &shader) : m_shader(shader)
247*35238bceSAndroid Build Coastguard Worker {
248*35238bceSAndroid Build Coastguard Worker }
249*35238bceSAndroid Build Coastguard Worker
250*35238bceSAndroid Build Coastguard Worker void shadeVertices(const VertexAttrib *inputs, VertexPacket *packets, const int numPackets) const;
251*35238bceSAndroid Build Coastguard Worker
252*35238bceSAndroid Build Coastguard Worker private:
253*35238bceSAndroid Build Coastguard Worker const Shader &m_shader;
254*35238bceSAndroid Build Coastguard Worker };
255*35238bceSAndroid Build Coastguard Worker
256*35238bceSAndroid Build Coastguard Worker template <class Shader>
shadeVertices(const VertexAttrib * inputs,VertexPacket * packets,const int numPackets) const257*35238bceSAndroid Build Coastguard Worker void VertexShaderLoop<Shader>::shadeVertices(const VertexAttrib *inputs, VertexPacket *packets,
258*35238bceSAndroid Build Coastguard Worker const int numPackets) const
259*35238bceSAndroid Build Coastguard Worker {
260*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < numPackets; ndx++)
261*35238bceSAndroid Build Coastguard Worker m_shader.shadeVertex(inputs, packets[ndx]);
262*35238bceSAndroid Build Coastguard Worker }
263*35238bceSAndroid Build Coastguard Worker
264*35238bceSAndroid Build Coastguard Worker template <class Shader>
265*35238bceSAndroid Build Coastguard Worker class FragmentShaderLoop : public FragmentShader
266*35238bceSAndroid Build Coastguard Worker {
267*35238bceSAndroid Build Coastguard Worker public:
FragmentShaderLoop(const Shader & shader)268*35238bceSAndroid Build Coastguard Worker FragmentShaderLoop(const Shader &shader) : m_shader(shader)
269*35238bceSAndroid Build Coastguard Worker {
270*35238bceSAndroid Build Coastguard Worker }
271*35238bceSAndroid Build Coastguard Worker
272*35238bceSAndroid Build Coastguard Worker void shadeFragments(FragmentPacket *packets, const int numPackets) const;
273*35238bceSAndroid Build Coastguard Worker
274*35238bceSAndroid Build Coastguard Worker private:
275*35238bceSAndroid Build Coastguard Worker const Shader &m_shader;
276*35238bceSAndroid Build Coastguard Worker };
277*35238bceSAndroid Build Coastguard Worker
278*35238bceSAndroid Build Coastguard Worker template <class Shader>
shadeFragments(FragmentPacket * packets,const int numPackets) const279*35238bceSAndroid Build Coastguard Worker void FragmentShaderLoop<Shader>::shadeFragments(FragmentPacket *packets, const int numPackets) const
280*35238bceSAndroid Build Coastguard Worker {
281*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < numPackets; ndx++)
282*35238bceSAndroid Build Coastguard Worker m_shader.shadeFragment(packets[ndx]);
283*35238bceSAndroid Build Coastguard Worker }
284*35238bceSAndroid Build Coastguard Worker
285*35238bceSAndroid Build Coastguard Worker } // namespace rr
286*35238bceSAndroid Build Coastguard Worker
287*35238bceSAndroid Build Coastguard Worker #endif // _RRSHADERS_HPP
288