Revert "[3.0] Clipping API feature in Actor"
[platform/core/uifw/dali-core.git] / dali / internal / render / renderers / render-renderer.h
1 #ifndef DALI_INTERNAL_RENDER_RENDERER_H
2 #define DALI_INTERNAL_RENDER_RENDERER_H
3
4 /*
5  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
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
21 // INTERNAL INCLUDES
22 #include <dali/public-api/math/matrix.h>
23 #include <dali/public-api/math/vector4.h>
24 #include <dali/public-api/rendering/texture-set.h>
25 #include <dali/internal/common/blending-options.h>
26 #include <dali/internal/common/message.h>
27 #include <dali/internal/common/type-abstraction-enums.h>
28 #include <dali/internal/event/common/property-input-impl.h>
29 #include <dali/internal/event/effects/shader-declarations.h>
30 #include <dali/internal/render/data-providers/render-data-provider.h>
31 #include <dali/internal/render/gl-resources/gl-resource-owner.h>
32 #include <dali/internal/render/renderers/render-geometry.h>
33 #include <dali/internal/update/manager/prepare-render-instructions.h>
34 #include <dali/integration-api/debug.h>
35
36 namespace Dali
37 {
38
39 namespace Internal
40 {
41 class Context;
42 class Texture;
43 class Program;
44
45 namespace SceneGraph
46 {
47 class SceneController;
48 class Shader;
49 class TextureCache;
50 class NodeDataProvider;
51 }
52
53
54 namespace Render
55 {
56
57 /**
58  * Renderers are used to render meshes
59  * These objects are used during RenderManager::Render(), so properties modified during
60  * the Update must either be double-buffered, or set via a message added to the RenderQueue.
61  */
62 class Renderer : public GlResourceOwner
63 {
64 public:
65
66   /**
67    * @brief Struct to encapsulate stencil parameters required for control of the stencil buffer.
68    */
69   struct StencilParameters
70   {
71     StencilParameters( RenderMode::Type renderMode, StencilFunction::Type stencilFunction, int stencilFunctionMask,
72                        int stencilFunctionReference, int stencilMask, StencilOperation::Type stencilOperationOnFail,
73                        StencilOperation::Type stencilOperationOnZFail, StencilOperation::Type stencilOperationOnZPass )
74     : stencilFunctionMask      ( stencilFunctionMask      ),
75       stencilFunctionReference ( stencilFunctionReference ),
76       stencilMask              ( stencilMask              ),
77       renderMode               ( renderMode               ),
78       stencilFunction          ( stencilFunction          ),
79       stencilOperationOnFail   ( stencilOperationOnFail   ),
80       stencilOperationOnZFail  ( stencilOperationOnZFail  ),
81       stencilOperationOnZPass  ( stencilOperationOnZPass  )
82     {
83     }
84
85     int stencilFunctionMask;                          ///< The stencil function mask
86     int stencilFunctionReference;                     ///< The stencil function reference
87     int stencilMask;                                  ///< The stencil mask
88     RenderMode::Type       renderMode:3;              ///< The render mode
89     StencilFunction::Type  stencilFunction:3;         ///< The stencil function
90     StencilOperation::Type stencilOperationOnFail:3;  ///< The stencil operation for stencil test fail
91     StencilOperation::Type stencilOperationOnZFail:3; ///< The stencil operation for depth test fail
92     StencilOperation::Type stencilOperationOnZPass:3; ///< The stencil operation for depth test pass
93   };
94
95   /**
96    * @copydoc Dali::Internal::GlResourceOwner::GlContextDestroyed()
97    */
98   void GlContextDestroyed();
99
100   /**
101    * @copydoc Dali::Internal::GlResourceOwner::GlCleanup()
102    */
103   void GlCleanup();
104
105   /**
106    * Create a new renderer instance
107    * @param[in] dataProviders The data providers for the renderer
108    * @param[in] geometry The geometry for the renderer
109    * @param[in] blendingBitmask A bitmask of blending options.
110    * @param[in] blendColor The blend color to pass to GL
111    * @param[in] faceCullingMode The face-culling mode.
112    * @param[in] preMultipliedAlphaEnabled whether alpha is pre-multiplied.
113    * @param[in] depthWriteMode Depth buffer write mode
114    * @param[in] depthTestMode Depth buffer test mode
115    * @param[in] depthFunction Depth function
116    * @param[in] stencilParameters Struct containing all stencil related options
117    */
118   static Renderer* New( SceneGraph::RenderDataProvider* dataProviders,
119                         Render::Geometry* geometry,
120                         unsigned int blendingBitmask,
121                         const Vector4* blendColor,
122                         FaceCullingMode::Type faceCullingMode,
123                         bool preMultipliedAlphaEnabled,
124                         DepthWriteMode::Type depthWriteMode,
125                         DepthTestMode::Type depthTestMode,
126                         DepthFunction::Type depthFunction,
127                         StencilParameters& stencilParameters );
128
129   /**
130    * Constructor.
131    * @param[in] dataProviders The data providers for the renderer
132    * @param[in] geometry The geometry for the renderer
133    * @param[in] blendingBitmask A bitmask of blending options.
134    * @param[in] blendColor The blend color to pass to GL
135    * @param[in] faceCullingMode The face-culling mode.
136    * @param[in] preMultipliedAlphaEnabled whether alpha is pre-multiplied.
137    * @param[in] depthWriteMode Depth buffer write mode
138    * @param[in] depthTestMode Depth buffer test mode
139    * @param[in] depthFunction Depth function
140    * @param[in] stencilParameters Struct containing all stencil related options
141    */
142   Renderer( SceneGraph::RenderDataProvider* dataProviders,
143             Render::Geometry* geometry,
144             unsigned int blendingBitmask,
145             const Vector4* blendColor,
146             FaceCullingMode::Type faceCullingMode,
147             bool preMultipliedAlphaEnabled,
148             DepthWriteMode::Type depthWriteMode,
149             DepthTestMode::Type depthTestMode,
150             DepthFunction::Type depthFunction,
151             StencilParameters& stencilParameters );
152
153   /**
154    * Change the data providers of the renderer
155    * @param[in] dataProviders The data providers
156    */
157   void SetRenderDataProvider( SceneGraph::RenderDataProvider* dataProviders );
158
159   /**
160    * Change the geometry used by the renderer
161    * @param[in] geometry The new geometry
162    */
163   void SetGeometry( Render::Geometry* geometry );
164   /**
165    * Second-phase construction.
166    * This is called when the renderer is inside render thread
167    * @param[in] context Context used by the renderer
168    * @param[in] textureCache The texture cache to use
169    */
170   void Initialize( Context& context, SceneGraph::TextureCache& textureCache );
171
172   /**
173    * Destructor
174    */
175   ~Renderer();
176
177   /**
178    * Set the face-culling mode.
179    * @param[in] mode The face-culling mode.
180    */
181   void SetFaceCullingMode( FaceCullingMode::Type mode );
182
183   /**
184    * Set the bitmask for blending options
185    * @param[in] bitmask A bitmask of blending options.
186    */
187   void SetBlendingBitMask( unsigned int bitmask );
188
189   /**
190    * Set the blend color for blending options
191    * @param[in] blendColor The blend color to pass to GL
192    */
193   void SetBlendColor( const Vector4* color );
194
195   /**
196    * Set the first element index to draw by the indexed draw
197    * @param[in] firstElement index of first element to draw
198    */
199   void SetIndexedDrawFirstElement( size_t firstElement );
200
201   /**
202    * Set the number of elements to draw by the indexed draw
203    * @param[in] elementsCount number of elements to draw
204    */
205   void SetIndexedDrawElementsCount( size_t elementsCount );
206
207   /**
208    * @brief Set whether the Pre-multiplied Alpha Blending is required
209    *
210    * @param[in] preMultipled whether alpha is pre-multiplied.
211    */
212   void EnablePreMultipliedAlpha( bool preMultipled );
213
214   /**
215    * Sets the depth write mode
216    * @param[in] depthWriteMode The depth write mode
217    */
218   void SetDepthWriteMode( DepthWriteMode::Type depthWriteMode );
219
220   /**
221    * Query the Renderer's depth write mode
222    * @return The renderer depth write mode
223    */
224   DepthWriteMode::Type GetDepthWriteMode() const;
225
226   /**
227    * Sets the depth test mode
228    * @param[in] depthTestMode The depth test mode
229    */
230   void SetDepthTestMode( DepthTestMode::Type depthTestMode );
231
232   /**
233    * Query the Renderer's depth test mode
234    * @return The renderer depth test mode
235    */
236   DepthTestMode::Type GetDepthTestMode() const;
237
238   /**
239    * Sets the depth function
240    * @param[in] depthFunction The depth function
241    */
242   void SetDepthFunction( DepthFunction::Type depthFunction );
243
244   /**
245    * Query the Renderer's depth function
246    * @return The renderer depth function
247    */
248   DepthFunction::Type GetDepthFunction() const;
249
250   /**
251    * Sets the render mode
252    * @param[in] renderMode The render mode
253    */
254   void SetRenderMode( RenderMode::Type mode );
255
256   /**
257    * Gets the render mode
258    * @return The render mode
259    */
260   RenderMode::Type GetRenderMode() const;
261
262   /**
263    * Sets the stencil function
264    * @param[in] stencilFunction The stencil function
265    */
266   void SetStencilFunction( StencilFunction::Type stencilFunction );
267
268   /**
269    * Gets the stencil function
270    * @return The stencil function
271    */
272   StencilFunction::Type GetStencilFunction() const;
273
274   /**
275    * Sets the stencil function mask
276    * @param[in] stencilFunctionMask The stencil function mask
277    */
278   void SetStencilFunctionMask( int stencilFunctionMask );
279
280   /**
281    * Gets the stencil function mask
282    * @return The stencil function mask
283    */
284   int GetStencilFunctionMask() const;
285
286   /**
287    * Sets the stencil function reference
288    * @param[in] stencilFunctionReference The stencil function reference
289    */
290   void SetStencilFunctionReference( int stencilFunctionReference );
291
292   /**
293    * Gets the stencil function reference
294    * @return The stencil function reference
295    */
296   int GetStencilFunctionReference() const;
297
298   /**
299    * Sets the stencil mask
300    * @param[in] stencilMask The stencil mask
301    */
302   void SetStencilMask( int stencilMask );
303
304   /**
305    * Gets the stencil mask
306    * @return The stencil mask
307    */
308   int GetStencilMask() const;
309
310   /**
311    * Sets the stencil operation for when the stencil test fails
312    * @param[in] stencilOperationOnFail The stencil operation
313    */
314   void SetStencilOperationOnFail( StencilOperation::Type stencilOperationOnFail );
315
316   /**
317    * Gets the stencil operation for when the stencil test fails
318    * @return The stencil operation
319    */
320   StencilOperation::Type GetStencilOperationOnFail() const;
321
322   /**
323    * Sets the stencil operation for when the depth test fails
324    * @param[in] stencilOperationOnZFail The stencil operation
325    */
326   void SetStencilOperationOnZFail( StencilOperation::Type stencilOperationOnZFail );
327
328   /**
329    * Gets the stencil operation for when the depth test fails
330    * @return The stencil operation
331    */
332   StencilOperation::Type GetStencilOperationOnZFail() const;
333
334   /**
335    * Sets the stencil operation for when the depth test passes
336    * @param[in] stencilOperationOnZPass The stencil operation
337    */
338   void SetStencilOperationOnZPass( StencilOperation::Type stencilOperationOnZPass );
339
340   /**
341    * Gets the stencil operation for when the depth test passes
342    * @return The stencil operation
343    */
344   StencilOperation::Type GetStencilOperationOnZPass() const;
345
346   /**
347    * Called to render during RenderManager::Render().
348    * @param[in] context The context used for rendering
349    * @param[in] textureCache The texture cache used to get textures
350    * @param[in] bufferIndex The index of the previous update buffer.
351    * @param[in] node The node using this renderer
352    * @param[in] defaultShader in case there is no custom shader
353    * @param[in] modelViewMatrix The model-view matrix.
354    * @param[in] viewMatrix The view matrix.
355    * @param[in] projectionMatrix The projection matrix.
356    */
357   void Render( Context& context,
358                SceneGraph::TextureCache& textureCache,
359                BufferIndex bufferIndex,
360                const SceneGraph::NodeDataProvider& node,
361                SceneGraph::Shader& defaultShader,
362                const Matrix& modelMatrix,
363                const Matrix& modelViewMatrix,
364                const Matrix& viewMatrix,
365                const Matrix& projectionMatrix,
366                const Vector3& size,
367                bool blend);
368
369   /**
370    * Write the renderer's sort attributes to the passed in reference
371    *
372    * @param[in] bufferIndex The current update buffer index.
373    * @param[out] sortAttributes
374    */
375   void SetSortAttributes( BufferIndex bufferIndex, SceneGraph::RendererWithSortAttributes& sortAttributes ) const;
376
377 private:
378
379   struct UniformIndexMap;
380
381   // Undefined
382   Renderer( const Renderer& );
383
384   // Undefined
385   Renderer& operator=( const Renderer& rhs );
386
387   /**
388    * Sets blending options
389    * @param context to use
390    * @param blend Wheter blending should be enabled or not
391    */
392   void SetBlending( Context& context, bool blend );
393
394   /**
395    * Set the uniforms from properties according to the uniform map
396    * @param[in] bufferIndex The index of the previous update buffer.
397    * @param[in] node The node using the renderer
398    * @param[in] size The size of the renderer
399    * @param[in] program The shader program on which to set the uniforms.
400    */
401   void SetUniforms( BufferIndex bufferIndex, const SceneGraph::NodeDataProvider& node, const Vector3& size, Program& program );
402
403   /**
404    * Set the program uniform in the map from the mapped property
405    * @param[in] bufferIndex The index of the previous update buffer.
406    * @param[in] program The shader program
407    * @param[in] map The uniform
408    */
409   void SetUniformFromProperty( BufferIndex bufferIndex, Program& program, UniformIndexMap& map );
410
411   /**
412    * Bind the textures and setup the samplers
413    * @param[in] context The GL context
414    * @param[in] textureCache The texture cache
415    * @param[in] program The shader program
416    * @return False if create or bind failed, true if success.
417    */
418   bool BindTextures( Context& context, SceneGraph::TextureCache& textureCache, Program& program );
419
420 private:
421
422   OwnerPointer< SceneGraph::RenderDataProvider > mRenderDataProvider;
423
424   Context*                     mContext;
425   SceneGraph::TextureCache*    mTextureCache;
426   Render::Geometry*            mGeometry;
427
428   struct UniformIndexMap
429   {
430     unsigned int               uniformIndex;  ///< The index of the cached location in the Program
431     const PropertyInputImpl*   propertyValue;
432   };
433
434   typedef Dali::Vector< UniformIndexMap > UniformIndexMappings;
435   UniformIndexMappings         mUniformIndexMap;
436   Vector<GLint>                mAttributesLocation;
437
438   StencilParameters            mStencilParameters;          ///< Struct containing all stencil related options
439   BlendingOptions              mBlendingOptions;            ///< Blending options including blend color, blend func and blend equation
440
441   size_t                       mIndexedDrawFirstElement;    ///< Offset of first element to draw
442   size_t                       mIndexedDrawElementsCount;   ///< Number of elements to draw
443
444   DepthFunction::Type          mDepthFunction:3;            ///< The depth function
445   FaceCullingMode::Type        mFaceCullingMode:2;          ///< The mode of face culling
446   BlendMode::Type              mBlendMode:2;                ///< The mode of blending
447   DepthWriteMode::Type         mDepthWriteMode:2;           ///< The depth write mode
448   DepthTestMode::Type          mDepthTestMode:2;            ///< The depth test mode
449   bool                         mUpdateAttributesLocation:1; ///< Indicates attribute locations have changed
450   bool                         mPremultipledAlphaEnabled:1; ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
451 };
452
453 } // namespace SceneGraph
454
455 } // namespace Internal
456
457 } // namespace Dali
458
459 #endif // DALI_INTERNAL_RENDER_RENDERER_H