[SRUK] Initial copy from Tizen 2.2 version
[platform/core/uifw/dali-core.git] / dali / internal / render / shaders / program.h
1 #ifndef __DALI_INTERNAL_PROGRAM_H__
2 #define __DALI_INTERNAL_PROGRAM_H__
3
4 //
5 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
6 //
7 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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 // EXTERNAL INCLUDES
21 #include <string>
22
23 // INTERNAL INCLUDES
24 #include <dali/public-api/common/vector-wrapper.h>
25 #include <dali/public-api/object/ref-object.h>
26 #include <dali/internal/render/gl-resources/context.h>
27 #include <dali/internal/render/gl-resources/context-observer.h>
28 #include <dali/integration-api/resource-cache.h>
29
30 namespace Dali
31 {
32
33 class Matrix;
34
35 namespace Integration
36 {
37 class GlAbstraction;
38 class ShaderData;
39 }
40
41 namespace Internal
42 {
43
44 class Context;
45
46 /*
47  * A program contains a vertex & fragment shader.
48  *
49  * A program will contain vertex attributes and uniform variables
50  * E.g. inside the code for our text fragment shaders we have the line:
51  * \code
52  * uniform lowp vec4  uColor
53  * \endcode
54  *
55  * This describes a variable used to color text as it is drawn.
56  *
57  * uColor is set to the value specified by Actor::SetColor and is
58  * animatable through the property Actor::COLOR
59  */
60 class Program : public ContextObserver
61 {
62 public:
63
64   /**
65    * Size of the uniform cache per program
66    * GLES specification states that minimum uniform count for fragment shader
67    * is 16 and for vertex shader 128. We're caching the 16 common ones for now
68    */
69   static const int MAX_UNIFORM_CACHE_SIZE = 16;
70
71   /**
72    * Constant for uniform / attribute not found
73    */
74   static const int NOT_FOUND = -1;
75
76   /**
77    * Vertex attributes
78    */
79   enum AttribType
80   {
81     ATTRIB_UNKNOWN = -1,
82     ATTRIB_POSITION,
83     ATTRIB_NORMAL,
84     ATTRIB_TEXCOORD,
85     ATTRIB_COLOR,
86     ATTRIB_BONE_WEIGHTS,
87     ATTRIB_BONE_INDICES,
88     ATTRIB_TYPE_LAST
89   };
90
91   /**
92    * Common shader uniform names
93    */
94   enum UniformType
95   {
96     UNIFORM_NOT_QUERIED = -2,
97     UNIFORM_UNKNOWN = -1,
98     UNIFORM_MVP_MATRIX,
99     UNIFORM_MODELVIEW_MATRIX,
100     UNIFORM_PROJECTION_MATRIX,
101     UNIFORM_MODEL_MATRIX,
102     UNIFORM_VIEW_MATRIX,
103     UNIFORM_NORMAL_MATRIX,
104     UNIFORM_COLOR,
105     UNIFORM_CUSTOM_TEXTURE_COORDS,
106     UNIFORM_SAMPLER,
107     UNIFORM_SAMPLER_RECT,
108     UNIFORM_EFFECT_SAMPLER,
109     UNIFORM_EFFECT_SAMPLER_RECT,
110     UNIFORM_TIME_DELTA,
111     UNIFORM_SAMPLER_OPACITY,
112     UNIFORM_SAMPLER_NORMAL_MAP,
113
114     UNIFORM_TEXT_COLOR,
115     UNIFORM_SMOOTHING,
116     UNIFORM_OUTLINE,
117     UNIFORM_OUTLINE_COLOR,
118     UNIFORM_GLOW,
119     UNIFORM_GLOW_COLOR,
120     UNIFORM_SHADOW,
121     UNIFORM_SHADOW_COLOR,
122     UNIFORM_SHADOW_SMOOTHING,
123     UNIFORM_GRADIENT_COLOR,
124     UNIFORM_GRADIENT_LINE,
125     UNIFORM_INVERSE_TEXT_SIZE,
126
127     UNIFORM_TYPE_LAST
128   };
129
130   /**
131    * Creates a new program, or returns a copy of an existing program in the program cache
132    * maintained by Context
133    * @param [in] resourceId ResourceManager resourceId for the shader source and binary.
134    *                        Used as a lookup key in the program cache
135    * @param[in] shaderData  A pointer to a data structure containing the program source
136    *                        and optionally precompiled binary. If the binary is empty the program bytecode
137    *                        is copied into it after compilation and linking)
138    * @param [in] context    GL context
139    * @return pointer to the program
140    */
141   static Program* New( const Integration::ResourceId& resourceId, Integration::ShaderData* shaderData, Context& context );
142
143   /**
144    * Takes this program into use
145    */
146   void Use();
147
148   /**
149    * @return true if this program is used currently
150    */
151   bool IsUsed();
152
153   /**
154    * @param [in] type of the attribute
155    * @return the index of the attribute
156    */
157   GLint GetAttribLocation( AttribType type );
158
159   /**
160    * Register a uniform name in our local cache
161    * @param [in] name uniform name
162    * @return the index of the uniform name in local cache
163    */
164   unsigned int RegisterUniform( const std::string& name );
165
166   /**
167    * Gets the location of a pre-registered uniform.
168    * Uniforms in list UniformType are always registered and in the order of the enumeration
169    * @param [in] uniformIndex of the uniform in local cache
170    * @return the index of the uniform in the GL program
171    */
172   GLint GetUniformLocation( unsigned int uniformIndex );
173
174   /**
175    * Sets the uniform value
176    * @param [in] location of uniform
177    * @param [in] value0 as int
178    */
179   void SetUniform1i( GLint location, GLint value0 );
180
181   /**
182    * Sets the uniform value
183    * @param [in] location of uniform
184    * @param [in] value0 as int
185    * @param [in] value1 as int
186    * @param [in] value2 as int
187    * @param [in] value3 as int
188    */
189   void SetUniform4i( GLint location, GLint value0, GLint value1, GLint value2, GLint value3 );
190
191   /**
192    * Sets the uniform value
193    * @param [in] location of uniform
194    * @param [in] value0 as float
195    */
196   void SetUniform1f( GLint location, GLfloat value0 );
197
198   /**
199    * Sets the uniform value
200    * @param [in] location of uniform
201    * @param [in] value0 as float
202    * @param [in] value1 as float
203    */
204   void SetUniform2f( GLint location, GLfloat value0, GLfloat value1 );
205
206   /**
207    * Sets the uniform value
208    * @param [in] location of uniform
209    * @param [in] value0 as float
210    * @param [in] value1 as float
211    * @param [in] value2 as float
212    */
213   void SetUniform3f( GLint location, GLfloat value0, GLfloat value1, GLfloat value2 );
214
215   /**
216    * Sets the uniform value
217    * @param [in] location of uniform
218    * @param [in] value0 as float
219    * @param [in] value1 as float
220    * @param [in] value2 as float
221    * @param [in] value3 as float
222    */
223   void SetUniform4f( GLint location, GLfloat value0, GLfloat value1, GLfloat value2, GLfloat value3 );
224
225   /**
226    * Sets the uniform value as matrix. NOTE! we never want GPU to transpose
227    * so make sure your matrix is in correct order for GL.
228    * @param [in] location Location of uniform
229    * @param [in] count Count of matrices
230    * @param [in] value values as float pointers
231    */
232   void SetUniformMatrix4fv( GLint location, GLsizei count, const GLfloat* value );
233
234   /**
235    * Sets the uniform value as matrix. NOTE! we never want GPU to transpose
236    * so make sure your matrix is in correct order for GL.
237    * @param [in] location Location of uniform
238    * @param [in] count Count of matrices
239    * @param [in] value values as float pointers
240    */
241   void SetUniformMatrix3fv( GLint location, GLsizei count, const GLfloat* value );
242
243 public: // From ContextObserver
244
245   /**
246    * @copydoc ContextObserver::GlContextCreated
247    */
248   virtual void GlContextCreated();          // From ContextObserver
249
250   /**
251    * @copydoc ContextObserver::GlContextToBeDestroyed
252    */
253   virtual void GlContextToBeDestroyed();   // From ContextObserver
254
255 private: // Implementation
256
257   /**
258    * Constructor, private so no direct instantiation
259    * @param[in] shaderData A pointer to a data structure containing the program source and binary
260    * @param[in] context    The GL context state cache.
261    */
262   Program( Integration::ShaderData* shaderData, Context& context );
263
264 public:
265
266   /**
267    * Destructor
268    */
269   virtual ~Program();
270
271 private:
272
273   // default constructor, not defined
274   Program();
275   // assignment operator, not defined
276   Program& operator=( const Program& );
277
278   /**
279    * Load the shader, from a precompiled binary if available, else from source code
280    */
281   void Load();
282
283   /**
284    * Unload the shader
285    */
286   void Unload();
287
288   /**
289    * Compile the shader
290    * @param shaderType vertex or fragment shader
291    * @param shaderId of the shader, returned
292    * @param src of the shader
293    * @return true if the compilation succeeded
294    */
295   bool CompileShader(GLenum shaderType, GLuint& shaderId, const char* src);
296
297   /**
298    * Links the shaders together to create program
299    */
300   void Link();
301
302   /**
303    * Frees the shader programs
304    */
305   void FreeShaders();
306
307   /**
308    * Resets caches
309    */
310   void ResetAttribsUniforms();
311
312 private:  // Data
313
314   Context& mContext;                          ///< The GL context state cache
315   Integration::GlAbstraction& mGlAbstraction; ///< The OpenGL Abstraction layer
316   bool mLinked;                               ///< whether the program is linked
317   GLuint mVertexShaderId;                     ///< GL identifier for vertex shader
318   GLuint mFragmentShaderId;                   ///< GL identifier for fragment shader
319   GLuint mProgramId;                          ///< GL identifier for program
320   Integration::ShaderData* mProgramData;      ///< Shader program source and binary (when compiled & linked or loaded)
321
322   // location caches
323   GLint mAttribLocations[ ATTRIB_TYPE_LAST ]; ///< attribute location cache
324   std::vector< std::pair< std::string, GLint > > mUniformLocations; ///< uniform location cache
325
326   // uniform value caching
327   GLint mUniformCacheInt[ MAX_UNIFORM_CACHE_SIZE ];         ///< Value cache for uniforms of single int
328   GLfloat mUniformCacheFloat[ MAX_UNIFORM_CACHE_SIZE ];     ///< Value cache for uniforms of single float
329   GLfloat mUniformCacheFloat4[ MAX_UNIFORM_CACHE_SIZE ][4]; ///< Value cache for uniforms of four float
330
331 };
332
333 } // namespace Internal
334
335 } // namespace Dali
336
337 #endif // __DALI_INTERNAL_PROGRAM_H__