Merge "Include the algorithm header file" into devel/master
[platform/core/uifw/dali-core.git] / dali / internal / render / renderers / render-renderer.h
index 55bac57..cd601b8 100755 (executable)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_RENDER_RENDERER_H
 
 /*
- * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -46,6 +46,8 @@ namespace SceneGraph
 class SceneController;
 class Shader;
 class NodeDataProvider;
+
+class RenderInstruction; //for relfection effect
 }
 
 namespace Render
@@ -92,12 +94,12 @@ public:
   /**
    * @copydoc Dali::Internal::GlResourceOwner::GlContextDestroyed()
    */
-  void GlContextDestroyed();
+  void GlContextDestroyed() override;
 
   /**
    * @copydoc Dali::Internal::GlResourceOwner::GlCleanup()
    */
-  void GlCleanup();
+  void GlCleanup() override;
 
   /**
    * Create a new renderer instance
@@ -114,7 +116,7 @@ public:
    */
   static Renderer* New( SceneGraph::RenderDataProvider* dataProviders,
                         Render::Geometry* geometry,
-                        unsigned int blendingBitmask,
+                        uint32_t blendingBitmask,
                         const Vector4& blendColor,
                         FaceCullingMode::Type faceCullingMode,
                         bool preMultipliedAlphaEnabled,
@@ -138,7 +140,7 @@ public:
    */
   Renderer( SceneGraph::RenderDataProvider* dataProviders,
             Render::Geometry* geometry,
-            unsigned int blendingBitmask,
+            uint32_t blendingBitmask,
             const Vector4& blendColor,
             FaceCullingMode::Type faceCullingMode,
             bool preMultipliedAlphaEnabled,
@@ -153,6 +155,17 @@ public:
    */
   void SetGeometry( Render::Geometry* geometry );
 
+  void SetDrawCommands( Dali::DevelRenderer::DrawCommand* pDrawCommands, uint32_t size );
+
+  /**
+   * @brief Returns a reference to an array of draw commands
+   * @return Valid array of draw commands (may be empty)
+   */
+  const std::vector<Dali::DevelRenderer::DrawCommand>& GetDrawCommands() const
+  {
+    return mDrawCommands;
+  }
+
   /**
    * Second-phase construction.
    * This is called when the renderer is inside render thread
@@ -163,7 +176,7 @@ public:
   /**
    * Destructor
    */
-  ~Renderer();
+  ~Renderer() override;
 
   /**
    * Set the face-culling mode.
@@ -175,7 +188,7 @@ public:
    * Set the bitmask for blending options
    * @param[in] bitmask A bitmask of blending options.
    */
-  void SetBlendingBitMask( unsigned int bitmask );
+  void SetBlendingBitMask( uint32_t bitmask );
 
   /**
    * Set the blend color for blending options
@@ -187,13 +200,13 @@ public:
    * Set the first element index to draw by the indexed draw
    * @param[in] firstElement index of first element to draw
    */
-  void SetIndexedDrawFirstElement( size_t firstElement );
+  void SetIndexedDrawFirstElement( uint32_t firstElement );
 
   /**
    * Set the number of elements to draw by the indexed draw
    * @param[in] elementsCount number of elements to draw
    */
-  void SetIndexedDrawElementsCount( size_t elementsCount );
+  void SetIndexedDrawElementsCount( uint32_t elementsCount );
 
   /**
    * @brief Set whether the Pre-multiplied Alpha Blending is required
@@ -335,6 +348,12 @@ public:
   StencilOperation::Type GetStencilOperationOnZPass() const;
 
   /**
+   * Called to upload during RenderManager::Render().
+   * @param[in] context The context used for uploading
+   */
+  void Upload( Context& context );
+
+  /**
    * Called to render during RenderManager::Render().
    * @param[in] context The context used for rendering
    * @param[in] bufferIndex The index of the previous update buffer.
@@ -344,6 +363,9 @@ public:
    * @param[in] projectionMatrix The projection matrix.
    * @param[in] size Size of the render item
    * @param[in] blend If true, blending is enabled
+   * @param[in] boundTextures The textures bound for rendering
+   * @param[in] instruction. for use case like reflection where CullFace needs to be adjusted
+
    */
   void Render( Context& context,
                BufferIndex bufferIndex,
@@ -353,7 +375,10 @@ public:
                const Matrix& viewMatrix,
                const Matrix& projectionMatrix,
                const Vector3& size,
-               bool blend );
+               bool blend,
+               Vector<GLuint>& boundTextures,
+               const Dali::Internal::SceneGraph::RenderInstruction& instruction,
+               uint32_t queueIndex );
 
   /**
    * Write the renderer's sort attributes to the passed in reference
@@ -363,6 +388,21 @@ public:
    */
   void SetSortAttributes( BufferIndex bufferIndex, SceneGraph::RenderInstructionProcessor::SortAttributes& sortAttributes ) const;
 
+  /**
+   * Sets the flag indicating whether shader changed.
+   *
+   * @param[in] value True if shader changed
+   */
+  void SetShaderChanged( bool value );
+
+  /**
+   * Check if the renderer attributes/uniforms are updated and returns the flag
+   *
+   * @param[in] bufferIndex The current update buffer index.
+   * @param[in] node The node using this renderer
+   */
+  bool Updated(BufferIndex bufferIndex, const SceneGraph::NodeDataProvider* node);
+
 private:
 
   struct UniformIndexMap;
@@ -401,9 +441,10 @@ private:
    * Bind the textures and setup the samplers
    * @param[in] context The GL context
    * @param[in] program The shader program
+   * @param[in] boundTextures The textures bound for rendering
    * @return False if create or bind failed, true if success.
    */
-  bool BindTextures( Context& context, Program& program );
+  bool BindTextures( Context& context, Program& program, Vector<GLuint>& boundTextures );
 
 private:
 
@@ -414,20 +455,22 @@ private:
 
   struct UniformIndexMap
   {
-    unsigned int               uniformIndex;                ///< The index of the cached location in the Program
+    uint32_t                   uniformIndex;                ///< The index of the cached location in the Program
     const PropertyInputImpl*   propertyValue;
   };
 
-  typedef Dali::Vector< UniformIndexMap > UniformIndexMappings;
+  using UniformIndexMappings = Dali::Vector<UniformIndexMap>;
 
   UniformIndexMappings         mUniformIndexMap;
   Vector<GLint>                mAttributesLocation;
 
+  uint64_t                     mUniformsHash;
+
   StencilParameters            mStencilParameters;          ///< Struct containing all stencil related options
   BlendingOptions              mBlendingOptions;            ///< Blending options including blend color, blend func and blend equation
 
-  size_t                       mIndexedDrawFirstElement;    ///< Offset of first element to draw
-  size_t                       mIndexedDrawElementsCount;   ///< Number of elements to draw
+  uint32_t                     mIndexedDrawFirstElement;    ///< Offset of first element to draw
+  uint32_t                     mIndexedDrawElementsCount;   ///< Number of elements to draw
 
   DepthFunction::Type          mDepthFunction:4;            ///< The depth function
   FaceCullingMode::Type        mFaceCullingMode:3;          ///< The mode of face culling
@@ -435,7 +478,11 @@ private:
   DepthTestMode::Type          mDepthTestMode:3;            ///< The depth test mode
   bool                         mUpdateAttributesLocation:1; ///< Indicates attribute locations have changed
   bool                         mPremultipledAlphaEnabled:1; ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
+  bool                         mShaderChanged:1;            ///< Flag indicating the shader changed and uniform maps have to be updated
+  bool                         mUpdated:1;
+
 
+  std::vector<Dali::DevelRenderer::DrawCommand> mDrawCommands; // Devel stuff
 };
 
 } // namespace SceneGraph