X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Frendering%2Fscene-graph-renderer.h;h=3dda873976e4a3744d2a0185112a5392266e169f;hb=b43741a90b40ca9dfbd33d6a9d390d3c09230e89;hp=ee6762d8e534ab38fa54e56d3aa31c430690a40f;hpb=15667b2f6a89cc0acd92b2bce111b69fb62e8711;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/update/rendering/scene-graph-renderer.h b/dali/internal/update/rendering/scene-graph-renderer.h old mode 100644 new mode 100755 index ee6762d..3dda873 --- a/dali/internal/update/rendering/scene-graph-renderer.h +++ b/dali/internal/update/rendering/scene-graph-renderer.h @@ -2,7 +2,7 @@ #define DALI_INTERNAL_SCENE_GRAPH_RENDERER_H /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2018 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. @@ -19,12 +19,14 @@ #include #include // Dali::Renderer +#include #include #include #include #include #include #include +#include #include #include @@ -59,7 +61,7 @@ class Renderer : public PropertyOwner, { public: - enum Opacity + enum OpacityType { OPAQUE, TRANSPARENT, @@ -140,16 +142,34 @@ public: void SetFaceCullingMode( FaceCullingMode::Type faceCullingMode ); /** + * Get face culling mode + * @return The face culling mode + */ + FaceCullingMode::Type GetFaceCullingMode() const; + + /** * Set the blending mode * @param[in] blendingMode to use */ void SetBlendMode( BlendMode::Type blendingMode ); /** + * Get the blending mode + * @return The the blending mode + */ + BlendMode::Type GetBlendMode() const; + + /** * Set the blending options. This should only be called from the update thread. * @param[in] options A bitmask of blending options. */ - void SetBlendingOptions( unsigned int options ); + void SetBlendingOptions( uint32_t options ); + + /** + * Get the blending options + * @return The the blending mode + */ + uint32_t GetBlendingOptions() const; /** * Set the blend color for blending operation @@ -158,16 +178,34 @@ public: void SetBlendColor( const Vector4& blendColor ); /** + * Get the blending color + * @return The blend color + */ + Vector4 GetBlendColor() const; + + /** * Set the index of first element for indexed draw * @param[in] firstElement index of first element to draw */ - void SetIndexedDrawFirstElement( size_t firstElement ); + void SetIndexedDrawFirstElement( uint32_t firstElement ); + + /** + * Get the index of first element for indexed draw + * @return The index of first element for indexed draw + */ + uint32_t GetIndexedDrawFirstElement() const; /** * Set the number of elements to draw by indexed draw * @param[in] elementsCount number of elements to draw */ - void SetIndexedDrawElementsCount( size_t elementsCount ); + void SetIndexedDrawElementsCount( uint32_t elementsCount ); + + /** + * Get the number of elements to draw by indexed draw + * @return The number of elements to draw by indexed draw + */ + uint32_t GetIndexedDrawElementsCount() const; /** * @brief Set whether the Pre-multiplied Alpha Blending is required @@ -176,24 +214,48 @@ public: void EnablePreMultipliedAlpha( bool preMultipled ); /** + * @brief Query whether alpha is pre-multiplied. + * @return True is alpha is pre-multiplied, false otherwise. + */ + bool IsPreMultipliedAlphaEnabled() const; + + /** * Sets the depth buffer write mode * @param[in] depthWriteMode The depth buffer write mode */ void SetDepthWriteMode( DepthWriteMode::Type depthWriteMode ); /** + * Get the depth buffer write mode + * @return The depth buffer write mode + */ + DepthWriteMode::Type GetDepthWriteMode() const; + + /** * Sets the depth buffer test mode * @param[in] depthTestMode The depth buffer test mode */ void SetDepthTestMode( DepthTestMode::Type depthTestMode ); /** + * Get the depth buffer test mode + * @return The depth buffer test mode + */ + DepthTestMode::Type GetDepthTestMode() const; + + /** * Sets the depth function * @param[in] depthFunction The depth function */ void SetDepthFunction( DepthFunction::Type depthFunction ); /** + * Get the depth function + * @return The depth function + */ + DepthFunction::Type GetDepthFunction() const; + + /** * Sets the render mode * @param[in] mode The render mode */ @@ -242,13 +304,45 @@ public: void SetStencilOperationOnZPass( StencilOperation::Type stencilOperationOnZPass ); /** + * Gets the stencil parameters + * @return The stencil parameters + */ + const Render::Renderer::StencilParameters& GetStencilParameters() const; + + /** + * Bakes the opacity + * @param[in] updateBufferIndex The current update buffer index. + * @param[in] opacity The opacity + */ + void BakeOpacity( BufferIndex updateBufferIndex, float opacity ); + + /** + * Gets the opacity + * @param[in] bufferIndex The buffer to read from. + * @return The opacity + */ + float GetOpacity( BufferIndex updateBufferIndex ) const; + + /** + * Sets the rendering behavior + * @param[in] renderingBehavior The rendering behavior required. + */ + void SetRenderingBehavior( DevelRenderer::Rendering::Type renderingBehavior ); + + /** + * Gets the rendering behavior + * @return The rendering behavior + */ + DevelRenderer::Rendering::Type GetRenderingBehavior() const; + + /** * Prepare the object for rendering. * This is called by the UpdateManager when an object is due to be rendered in the current frame. * @param[in] updateBufferIndex The current update buffer index. */ void PrepareRender( BufferIndex updateBufferIndex ); - /* + /** * Retrieve the Render thread renderer * @return The associated render thread renderer */ @@ -259,7 +353,7 @@ public: * @param[in] updateBufferIndex The current update buffer index. * @return OPAQUE if fully opaque, TRANSPARENT if fully transparent and TRANSLUCENT if in between */ - Opacity GetOpacity( BufferIndex updateBufferIndex, const Node& node ) const; + OpacityType GetOpacityType( BufferIndex updateBufferIndex, const Node& node ) const; /** * Called by the TextureSet to notify to the renderer that it has changed @@ -286,6 +380,18 @@ public: */ void DisconnectFromSceneGraph( SceneController& sceneController, BufferIndex bufferIndex ); + /** + * Enable/Disable Partial update dirty flag + * @param[in] true to mark dirty else false + */ + void SetDirty( bool value ); + + /** + * Get Partial update dirty flag + * @return true if dirty else false + */ + bool IsDirty() const; + public: // Implementation of ConnectionChangePropagator /** * @copydoc ConnectionChangePropagator::AddObserver @@ -346,47 +452,45 @@ private: Renderer(); /** - * Helper function to create a new render data provider - * @return the new (initialized) data provider + * Update texture set to the render data provider */ - RenderDataProvider* NewRenderDataProvider(); - - /** - * Helper function to retrieve the blend color. - * @return The blend color. - */ - const Vector4& GetBlendColor() const; + void UpdateTextureSet(); private: CollectedUniformMap mCollectedUniformMap[2]; ///< Uniform maps collected by the renderer + SceneController* mSceneController; ///< Used for initializing renderers Render::Renderer* mRenderer; ///< Raw pointer to the renderer (that's owned by RenderManager) TextureSet* mTextureSet; ///< The texture set this renderer uses. (Not owned) Render::Geometry* mGeometry; ///< The geometry this renderer uses. (Not owned) Shader* mShader; ///< The shader this renderer uses. (Not owned) + RenderDataProvider* mRenderDataProvider; ///< The render data provider OwnerPointer< Vector4 > mBlendColor; ///< The blend color for blending operation Dali::Internal::Render::Renderer::StencilParameters mStencilParameters; ///< Struct containing all stencil related options - size_t mIndexedDrawFirstElement; ///< first element index to be drawn using indexed draw - size_t mIndexedDrawElementsCount; ///< number of elements to be drawn using indexed draw - unsigned int mBlendBitmask; ///< The bitmask of blending options - unsigned int mRegenerateUniformMap; ///< 2 if the map should be regenerated, 1 if it should be copied. - unsigned int mResendFlag; ///< Indicate whether data should be resent to the renderer + uint32_t mIndexedDrawFirstElement; ///< first element index to be drawn using indexed draw + uint32_t mIndexedDrawElementsCount; ///< number of elements to be drawn using indexed draw + uint32_t mBlendBitmask; ///< The bitmask of blending options + uint32_t mRegenerateUniformMap; ///< 2 if the map should be regenerated, 1 if it should be copied. + uint32_t mResendFlag; ///< Indicate whether data should be resent to the renderer - DepthFunction::Type mDepthFunction:3; ///< Local copy of the depth function - FaceCullingMode::Type mFaceCullingMode:2; ///< Local copy of the mode of face culling - BlendMode::Type mBlendMode:2; ///< Local copy of the mode of blending - DepthWriteMode::Type mDepthWriteMode:2; ///< Local copy of the depth write mode - DepthTestMode::Type mDepthTestMode:2; ///< Local copy of the depth test mode + DepthFunction::Type mDepthFunction:4; ///< Local copy of the depth function + FaceCullingMode::Type mFaceCullingMode:3; ///< Local copy of the mode of face culling + BlendMode::Type mBlendMode:3; ///< Local copy of the mode of blending + DepthWriteMode::Type mDepthWriteMode:3; ///< Local copy of the depth write mode + DepthTestMode::Type mDepthTestMode:3; ///< Local copy of the depth test mode + DevelRenderer::Rendering::Type mRenderingBehavior:2; ///< The rendering behavior bool mUniformMapChanged[2]; ///< Records if the uniform map has been altered this frame bool mPremultipledAlphaEnabled:1; ///< Flag indicating whether the Pre-multiplied Alpha Blending is required + bool mDirty:1; ///< Required for marking it dirty in case of partial update. public: - int mDepthIndex; ///< Used only in PrepareRenderInstructions + AnimatableProperty< float > mOpacity; ///< The opacity value + int32_t mDepthIndex; ///< Used only in PrepareRenderInstructions }; @@ -397,7 +501,7 @@ inline void SetTexturesMessage( EventThreadServices& eventThreadServices, const typedef MessageValue1< Renderer, TextureSet* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &renderer, &Renderer::SetTextures, const_cast(&textureSet) ); @@ -408,21 +512,21 @@ inline void SetGeometryMessage( EventThreadServices& eventThreadServices, const typedef MessageValue1< Renderer, Render::Geometry* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &renderer, &Renderer::SetGeometry, const_cast(&geometry) ); } -inline void SetShaderMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, Shader& shader ) +inline void SetShaderMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, const Shader& shader ) { typedef MessageValue1< Renderer, Shader* > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &renderer, &Renderer::SetShader, &shader ); + new (slot) LocalType( &renderer, &Renderer::SetShader, const_cast( &shader ) ); } inline void SetDepthIndexMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, int depthIndex ) @@ -430,7 +534,7 @@ inline void SetDepthIndexMessage( EventThreadServices& eventThreadServices, cons typedef MessageValue1< Renderer, int > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value new (slot) LocalType( &renderer, &Renderer::SetDepthIndex, depthIndex ); @@ -441,7 +545,7 @@ inline void SetFaceCullingModeMessage( EventThreadServices& eventThreadServices, typedef MessageValue1< Renderer, FaceCullingMode::Type > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetFaceCullingMode, faceCullingMode ); } @@ -451,17 +555,17 @@ inline void SetBlendModeMessage( EventThreadServices& eventThreadServices, const typedef MessageValue1< Renderer, BlendMode::Type > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetBlendMode, blendingMode ); } -inline void SetBlendingOptionsMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, unsigned int options ) +inline void SetBlendingOptionsMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, uint32_t options ) { - typedef MessageValue1< Renderer, unsigned int > LocalType; + typedef MessageValue1< Renderer, uint32_t > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetBlendingOptions, options ); } @@ -471,27 +575,27 @@ inline void SetBlendColorMessage( EventThreadServices& eventThreadServices, cons typedef MessageValue1< Renderer, Vector4 > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetBlendColor, blendColor ); } -inline void SetIndexedDrawFirstElementMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, size_t firstElement ) +inline void SetIndexedDrawFirstElementMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, uint32_t firstElement ) { - typedef MessageValue1< Renderer, size_t > LocalType; + typedef MessageValue1< Renderer, uint32_t > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetIndexedDrawFirstElement, firstElement ); } -inline void SetIndexedDrawElementsCountMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, size_t elementsCount ) +inline void SetIndexedDrawElementsCountMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, uint32_t elementsCount ) { - typedef MessageValue1< Renderer, size_t > LocalType; + typedef MessageValue1< Renderer, uint32_t > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetIndexedDrawElementsCount, elementsCount ); } @@ -501,7 +605,7 @@ inline void SetEnablePreMultipliedAlphaMessage( EventThreadServices& eventThread typedef MessageValue1< Renderer, bool > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::EnablePreMultipliedAlpha, preMultiplied ); } @@ -511,7 +615,7 @@ inline void SetDepthWriteModeMessage( EventThreadServices& eventThreadServices, typedef MessageValue1< Renderer, DepthWriteMode::Type > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetDepthWriteMode, depthWriteMode ); } @@ -521,7 +625,7 @@ inline void SetDepthTestModeMessage( EventThreadServices& eventThreadServices, c typedef MessageValue1< Renderer, DepthTestMode::Type > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetDepthTestMode, depthTestMode ); } @@ -531,7 +635,7 @@ inline void SetDepthFunctionMessage( EventThreadServices& eventThreadServices, c typedef MessageValue1< Renderer, DepthFunction::Type > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetDepthFunction, depthFunction ); } @@ -541,7 +645,7 @@ inline void SetRenderModeMessage( EventThreadServices& eventThreadServices, cons typedef MessageValue1< Renderer, RenderMode::Type > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetRenderMode, mode ); } @@ -551,7 +655,7 @@ inline void SetStencilFunctionMessage( EventThreadServices& eventThreadServices, typedef MessageValue1< Renderer, StencilFunction::Type > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetStencilFunction, stencilFunction ); } @@ -561,7 +665,7 @@ inline void SetStencilFunctionMaskMessage( EventThreadServices& eventThreadServi typedef MessageValue1< Renderer, int > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetStencilFunctionMask, mask ); } @@ -571,7 +675,7 @@ inline void SetStencilFunctionReferenceMessage( EventThreadServices& eventThread typedef MessageValue1< Renderer, int > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetStencilFunctionReference, stencilFunctionReference ); } @@ -581,7 +685,7 @@ inline void SetStencilMaskMessage( EventThreadServices& eventThreadServices, con typedef MessageValue1< Renderer, int > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetStencilMask, stencilMask ); } @@ -591,7 +695,7 @@ inline void SetStencilOperationOnFailMessage( EventThreadServices& eventThreadSe typedef MessageValue1< Renderer, StencilOperation::Type > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetStencilOperationOnFail, stencilOperation ); } @@ -601,7 +705,7 @@ inline void SetStencilOperationOnZFailMessage( EventThreadServices& eventThreadS typedef MessageValue1< Renderer, StencilOperation::Type > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetStencilOperationOnZFail, stencilOperation ); } @@ -611,11 +715,31 @@ inline void SetStencilOperationOnZPassMessage( EventThreadServices& eventThreadS typedef MessageValue1< Renderer, StencilOperation::Type > LocalType; // Reserve some memory inside the message queue - unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); new (slot) LocalType( &renderer, &Renderer::SetStencilOperationOnZPass, stencilOperation ); } +inline void BakeOpacityMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, float opacity ) +{ + typedef MessageDoubleBuffered1< Renderer, float > LocalType; + + // Reserve some memory inside the message queue + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + + new (slot) LocalType( &renderer, &Renderer::BakeOpacity, opacity ); +} + +inline void SetRenderingBehaviorMessage( EventThreadServices& eventThreadServices, const Renderer& renderer, DevelRenderer::Rendering::Type renderingBehavior ) +{ + using LocalType = MessageValue1< Renderer, DevelRenderer::Rendering::Type >; + + // Reserve some memory inside the message queue + uint32_t* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ) ); + + new (slot) LocalType( &renderer, &Renderer::SetRenderingBehavior, renderingBehavior ); +} + } // namespace SceneGraph } // namespace Internal } // namespace Dali