1e5c31af7Sopenharmony_ci#ifndef _SGLRSHADERPROGRAM_HPP
2e5c31af7Sopenharmony_ci#define _SGLRSHADERPROGRAM_HPP
3e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci * drawElements Quality Program OpenGL ES Utilities
5e5c31af7Sopenharmony_ci * ------------------------------------------------
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Copyright 2014 The Android Open Source Project
8e5c31af7Sopenharmony_ci *
9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci *
15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci * limitations under the License.
20e5c31af7Sopenharmony_ci *
21e5c31af7Sopenharmony_ci *//*!
22e5c31af7Sopenharmony_ci * \file
23e5c31af7Sopenharmony_ci * \brief SGLR shader program.
24e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci#include "tcuDefs.hpp"
27e5c31af7Sopenharmony_ci#include "rrShaders.hpp"
28e5c31af7Sopenharmony_ci#include "gluShaderUtil.hpp"
29e5c31af7Sopenharmony_ci
30e5c31af7Sopenharmony_ci#include <vector>
31e5c31af7Sopenharmony_ci#include <string>
32e5c31af7Sopenharmony_ci
33e5c31af7Sopenharmony_cinamespace sglr
34e5c31af7Sopenharmony_ci{
35e5c31af7Sopenharmony_ci
36e5c31af7Sopenharmony_cinamespace rc
37e5c31af7Sopenharmony_ci{
38e5c31af7Sopenharmony_ciclass Texture1D;
39e5c31af7Sopenharmony_ciclass Texture2D;
40e5c31af7Sopenharmony_ciclass TextureCube;
41e5c31af7Sopenharmony_ciclass Texture2DArray;
42e5c31af7Sopenharmony_ciclass Texture3D;
43e5c31af7Sopenharmony_ciclass TextureCubeArray;
44e5c31af7Sopenharmony_ci} // rc
45e5c31af7Sopenharmony_ci
46e5c31af7Sopenharmony_ciclass ShaderProgram;
47e5c31af7Sopenharmony_ci
48e5c31af7Sopenharmony_cinamespace pdec
49e5c31af7Sopenharmony_ci{
50e5c31af7Sopenharmony_ci
51e5c31af7Sopenharmony_cienum VaryingFlags
52e5c31af7Sopenharmony_ci{
53e5c31af7Sopenharmony_ci	VARYINGFLAG_NONE		= 0,
54e5c31af7Sopenharmony_ci	VARYINGFLAG_FLATSHADE	= (1 << 0),
55e5c31af7Sopenharmony_ci};
56e5c31af7Sopenharmony_ci
57e5c31af7Sopenharmony_cistruct VertexAttribute
58e5c31af7Sopenharmony_ci{
59e5c31af7Sopenharmony_ci						VertexAttribute				(const std::string& name_, rr::GenericVecType type_) : name(name_), type(type_) { }
60e5c31af7Sopenharmony_ci
61e5c31af7Sopenharmony_ci	std::string			name;
62e5c31af7Sopenharmony_ci	rr::GenericVecType	type;
63e5c31af7Sopenharmony_ci};
64e5c31af7Sopenharmony_ci
65e5c31af7Sopenharmony_cistruct VertexToFragmentVarying
66e5c31af7Sopenharmony_ci{
67e5c31af7Sopenharmony_ci						VertexToFragmentVarying		(rr::GenericVecType type_, int flags = VARYINGFLAG_NONE) : type(type_), flatshade((flags & VARYINGFLAG_FLATSHADE) != 0) { }
68e5c31af7Sopenharmony_ci
69e5c31af7Sopenharmony_ci	rr::GenericVecType	type;
70e5c31af7Sopenharmony_ci	bool				flatshade;
71e5c31af7Sopenharmony_ci};
72e5c31af7Sopenharmony_ci
73e5c31af7Sopenharmony_cistruct VertexToGeometryVarying
74e5c31af7Sopenharmony_ci{
75e5c31af7Sopenharmony_ci						VertexToGeometryVarying		(rr::GenericVecType type_, int flags = VARYINGFLAG_NONE) : type(type_), flatshade((flags & VARYINGFLAG_FLATSHADE) != 0) { }
76e5c31af7Sopenharmony_ci
77e5c31af7Sopenharmony_ci	rr::GenericVecType	type;
78e5c31af7Sopenharmony_ci	bool				flatshade;
79e5c31af7Sopenharmony_ci};
80e5c31af7Sopenharmony_ci
81e5c31af7Sopenharmony_cistruct GeometryToFragmentVarying
82e5c31af7Sopenharmony_ci{
83e5c31af7Sopenharmony_ci						GeometryToFragmentVarying	(rr::GenericVecType type_, int flags = VARYINGFLAG_NONE) : type(type_), flatshade((flags & VARYINGFLAG_FLATSHADE) != 0) { }
84e5c31af7Sopenharmony_ci
85e5c31af7Sopenharmony_ci	rr::GenericVecType	type;
86e5c31af7Sopenharmony_ci	bool				flatshade;
87e5c31af7Sopenharmony_ci};
88e5c31af7Sopenharmony_ci
89e5c31af7Sopenharmony_cistruct FragmentOutput
90e5c31af7Sopenharmony_ci{
91e5c31af7Sopenharmony_ci						FragmentOutput				(rr::GenericVecType type_) : type(type_) { }
92e5c31af7Sopenharmony_ci
93e5c31af7Sopenharmony_ci	rr::GenericVecType	type;
94e5c31af7Sopenharmony_ci};
95e5c31af7Sopenharmony_ci
96e5c31af7Sopenharmony_cistruct Uniform
97e5c31af7Sopenharmony_ci{
98e5c31af7Sopenharmony_ci						Uniform						(const std::string& name_, glu::DataType type_) : name(name_), type(type_) { }
99e5c31af7Sopenharmony_ci
100e5c31af7Sopenharmony_ci	std::string			name;
101e5c31af7Sopenharmony_ci	glu::DataType		type;
102e5c31af7Sopenharmony_ci};
103e5c31af7Sopenharmony_ci
104e5c31af7Sopenharmony_cistruct VertexSource
105e5c31af7Sopenharmony_ci{
106e5c31af7Sopenharmony_ci						VertexSource				(const std::string& str) : source(str) { }
107e5c31af7Sopenharmony_ci
108e5c31af7Sopenharmony_ci	std::string			source;
109e5c31af7Sopenharmony_ci};
110e5c31af7Sopenharmony_ci
111e5c31af7Sopenharmony_cistruct FragmentSource
112e5c31af7Sopenharmony_ci{
113e5c31af7Sopenharmony_ci						FragmentSource				(const std::string& str) : source(str) { }
114e5c31af7Sopenharmony_ci
115e5c31af7Sopenharmony_ci	std::string			source;
116e5c31af7Sopenharmony_ci};
117e5c31af7Sopenharmony_ci
118e5c31af7Sopenharmony_cistruct GeometrySource
119e5c31af7Sopenharmony_ci{
120e5c31af7Sopenharmony_ci						GeometrySource				(const std::string& str) : source(str) { }
121e5c31af7Sopenharmony_ci
122e5c31af7Sopenharmony_ci	std::string			source;
123e5c31af7Sopenharmony_ci};
124e5c31af7Sopenharmony_ci
125e5c31af7Sopenharmony_cistruct GeometryShaderDeclaration
126e5c31af7Sopenharmony_ci{
127e5c31af7Sopenharmony_ci									GeometryShaderDeclaration	(rr::GeometryShaderInputType inputType_,
128e5c31af7Sopenharmony_ci																 rr::GeometryShaderOutputType outputType_,
129e5c31af7Sopenharmony_ci																 size_t numOutputVertices_,
130e5c31af7Sopenharmony_ci																 size_t numInvocations_ = 1)
131e5c31af7Sopenharmony_ci									: inputType			(inputType_)
132e5c31af7Sopenharmony_ci									, outputType		(outputType_)
133e5c31af7Sopenharmony_ci									, numOutputVertices	(numOutputVertices_)
134e5c31af7Sopenharmony_ci									, numInvocations	(numInvocations_)
135e5c31af7Sopenharmony_ci									{
136e5c31af7Sopenharmony_ci									}
137e5c31af7Sopenharmony_ci
138e5c31af7Sopenharmony_ci	rr::GeometryShaderInputType		inputType;
139e5c31af7Sopenharmony_ci	rr::GeometryShaderOutputType	outputType;
140e5c31af7Sopenharmony_ci	size_t							numOutputVertices;
141e5c31af7Sopenharmony_ci	size_t							numInvocations;
142e5c31af7Sopenharmony_ci};
143e5c31af7Sopenharmony_ci
144e5c31af7Sopenharmony_ciclass ShaderProgramDeclaration
145e5c31af7Sopenharmony_ci{
146e5c31af7Sopenharmony_cipublic:
147e5c31af7Sopenharmony_ci											ShaderProgramDeclaration		(void);
148e5c31af7Sopenharmony_ci
149e5c31af7Sopenharmony_ci	ShaderProgramDeclaration&				operator<<						(const VertexAttribute&);
150e5c31af7Sopenharmony_ci	ShaderProgramDeclaration&				operator<<						(const VertexToFragmentVarying&);
151e5c31af7Sopenharmony_ci	ShaderProgramDeclaration&				operator<<						(const VertexToGeometryVarying&);
152e5c31af7Sopenharmony_ci	ShaderProgramDeclaration&				operator<<						(const GeometryToFragmentVarying&);
153e5c31af7Sopenharmony_ci	ShaderProgramDeclaration&				operator<<						(const FragmentOutput&);
154e5c31af7Sopenharmony_ci	ShaderProgramDeclaration&				operator<<						(const Uniform&);
155e5c31af7Sopenharmony_ci	ShaderProgramDeclaration&				operator<<						(const VertexSource&);
156e5c31af7Sopenharmony_ci	ShaderProgramDeclaration&				operator<<						(const FragmentSource&);
157e5c31af7Sopenharmony_ci	ShaderProgramDeclaration&				operator<<						(const GeometrySource&);
158e5c31af7Sopenharmony_ci	ShaderProgramDeclaration&				operator<<						(const GeometryShaderDeclaration&);
159e5c31af7Sopenharmony_ci
160e5c31af7Sopenharmony_ciprivate:
161e5c31af7Sopenharmony_ci	inline bool								hasGeometryShader				(void) const							{ return m_geometryShaderSet; }
162e5c31af7Sopenharmony_ci	inline size_t							getVertexInputCount				(void) const							{ return m_vertexAttributes.size(); }
163e5c31af7Sopenharmony_ci	inline size_t							getVertexOutputCount			(void) const							{ return hasGeometryShader() ? m_vertexToGeometryVaryings.size() : m_vertexToFragmentVaryings.size(); }
164e5c31af7Sopenharmony_ci	inline size_t							getFragmentInputCount			(void) const							{ return hasGeometryShader() ? m_geometryToFragmentVaryings.size() : m_vertexToFragmentVaryings.size(); }
165e5c31af7Sopenharmony_ci	inline size_t							getFragmentOutputCount			(void) const							{ return m_fragmentOutputs.size(); }
166e5c31af7Sopenharmony_ci	inline size_t							getGeometryInputCount			(void) const							{ return hasGeometryShader() ? m_vertexToGeometryVaryings.size() : 0; }
167e5c31af7Sopenharmony_ci	inline size_t							getGeometryOutputCount			(void) const							{ return hasGeometryShader() ? m_geometryToFragmentVaryings.size() : 0; }
168e5c31af7Sopenharmony_ci
169e5c31af7Sopenharmony_ci	bool									valid							(void) const;
170e5c31af7Sopenharmony_ci
171e5c31af7Sopenharmony_ci	std::vector<VertexAttribute>			m_vertexAttributes;
172e5c31af7Sopenharmony_ci	std::vector<VertexToFragmentVarying>	m_vertexToFragmentVaryings;
173e5c31af7Sopenharmony_ci	std::vector<VertexToGeometryVarying>	m_vertexToGeometryVaryings;
174e5c31af7Sopenharmony_ci	std::vector<GeometryToFragmentVarying>	m_geometryToFragmentVaryings;
175e5c31af7Sopenharmony_ci	std::vector<FragmentOutput>				m_fragmentOutputs;
176e5c31af7Sopenharmony_ci	std::vector<Uniform>					m_uniforms;
177e5c31af7Sopenharmony_ci	std::string								m_vertexSource;
178e5c31af7Sopenharmony_ci	std::string								m_fragmentSource;
179e5c31af7Sopenharmony_ci	std::string								m_geometrySource;
180e5c31af7Sopenharmony_ci	GeometryShaderDeclaration				m_geometryDecl;
181e5c31af7Sopenharmony_ci
182e5c31af7Sopenharmony_ci	bool									m_vertexShaderSet;
183e5c31af7Sopenharmony_ci	bool									m_fragmentShaderSet;
184e5c31af7Sopenharmony_ci	bool									m_geometryShaderSet;
185e5c31af7Sopenharmony_ci
186e5c31af7Sopenharmony_ci	friend class ::sglr::ShaderProgram;
187e5c31af7Sopenharmony_ci};
188e5c31af7Sopenharmony_ci
189e5c31af7Sopenharmony_ci} // pdec
190e5c31af7Sopenharmony_ci
191e5c31af7Sopenharmony_cistruct UniformSlot
192e5c31af7Sopenharmony_ci{
193e5c31af7Sopenharmony_ci	std::string		name;
194e5c31af7Sopenharmony_ci	glu::DataType	type;
195e5c31af7Sopenharmony_ci
196e5c31af7Sopenharmony_ci	union
197e5c31af7Sopenharmony_ci	{
198e5c31af7Sopenharmony_ci		deInt32		i;
199e5c31af7Sopenharmony_ci		deInt32		i4[4];
200e5c31af7Sopenharmony_ci		float		f;
201e5c31af7Sopenharmony_ci		float		f4[4];
202e5c31af7Sopenharmony_ci		float		m3[3*3];	//!< row major, can be fed directly to tcu::Matrix constructor
203e5c31af7Sopenharmony_ci		float		m4[4*4];	//!< row major, can be fed directly to tcu::Matrix constructor
204e5c31af7Sopenharmony_ci	} value;
205e5c31af7Sopenharmony_ci
206e5c31af7Sopenharmony_ci	union
207e5c31af7Sopenharmony_ci	{
208e5c31af7Sopenharmony_ci		const void*					ptr;
209e5c31af7Sopenharmony_ci
210e5c31af7Sopenharmony_ci		const rc::Texture1D*		tex1D;
211e5c31af7Sopenharmony_ci		const rc::Texture2D*		tex2D;
212e5c31af7Sopenharmony_ci		const rc::TextureCube*		texCube;
213e5c31af7Sopenharmony_ci		const rc::Texture2DArray*	tex2DArray;
214e5c31af7Sopenharmony_ci		const rc::Texture3D*		tex3D;
215e5c31af7Sopenharmony_ci		const rc::TextureCubeArray*	texCubeArray;
216e5c31af7Sopenharmony_ci	} sampler;
217e5c31af7Sopenharmony_ci
218e5c31af7Sopenharmony_ci	inline UniformSlot (void)
219e5c31af7Sopenharmony_ci		: type(glu::TYPE_LAST)
220e5c31af7Sopenharmony_ci	{
221e5c31af7Sopenharmony_ci		value.i = 0;
222e5c31af7Sopenharmony_ci		sampler.ptr = DE_NULL;
223e5c31af7Sopenharmony_ci	}
224e5c31af7Sopenharmony_ci};
225e5c31af7Sopenharmony_ci
226e5c31af7Sopenharmony_ciclass ShaderProgram : private rr::VertexShader, private rr::GeometryShader, private rr::FragmentShader
227e5c31af7Sopenharmony_ci{
228e5c31af7Sopenharmony_cipublic:
229e5c31af7Sopenharmony_ci											ShaderProgram		(const pdec::ShaderProgramDeclaration&);
230e5c31af7Sopenharmony_ci	virtual									~ShaderProgram		(void);
231e5c31af7Sopenharmony_ci
232e5c31af7Sopenharmony_ci	const UniformSlot&						getUniformByName	(const char* name) const;
233e5c31af7Sopenharmony_ci
234e5c31af7Sopenharmony_ci	inline const rr::VertexShader*			getVertexShader		(void) const { return static_cast<const rr::VertexShader*>(this);   }
235e5c31af7Sopenharmony_ci	inline const rr::FragmentShader*		getFragmentShader	(void) const { return static_cast<const rr::FragmentShader*>(this); }
236e5c31af7Sopenharmony_ci	inline const rr::GeometryShader*		getGeometryShader	(void) const { return static_cast<const rr::GeometryShader*>(this); }
237e5c31af7Sopenharmony_ci
238e5c31af7Sopenharmony_ciprivate:
239e5c31af7Sopenharmony_ci	virtual void							shadeVertices		(const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const = 0;
240e5c31af7Sopenharmony_ci	virtual void							shadeFragments		(rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const = 0;
241e5c31af7Sopenharmony_ci	virtual void							shadePrimitives		(rr::GeometryEmitter& output, int verticesIn, const rr::PrimitivePacket* packets, const int numPackets, int invocationID) const;
242e5c31af7Sopenharmony_ci
243e5c31af7Sopenharmony_ci	std::vector<std::string>				m_attributeNames;
244e5c31af7Sopenharmony_ciprotected:
245e5c31af7Sopenharmony_ci	std::vector<UniformSlot>				m_uniforms;
246e5c31af7Sopenharmony_ci
247e5c31af7Sopenharmony_ciprivate:
248e5c31af7Sopenharmony_ci	const std::string						m_vertSrc;
249e5c31af7Sopenharmony_ci	const std::string						m_fragSrc;
250e5c31af7Sopenharmony_ci	const std::string						m_geomSrc;
251e5c31af7Sopenharmony_ci	const bool								m_hasGeometryShader;
252e5c31af7Sopenharmony_ci
253e5c31af7Sopenharmony_ci	friend class ReferenceContext;	// for uniform access
254e5c31af7Sopenharmony_ci	friend class GLContext;			// for source string access
255e5c31af7Sopenharmony_ci} DE_WARN_UNUSED_TYPE;
256e5c31af7Sopenharmony_ci
257e5c31af7Sopenharmony_ci} // sglr
258e5c31af7Sopenharmony_ci
259e5c31af7Sopenharmony_ci#endif // _SGLRSHADERPROGRAM_HPP
260