X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Frender%2Fcommon%2Frender-algorithms.h;h=bb5e066ba2c7999144f1711244adb71c9164607d;hb=55827866fcb8c7ee47581ac4335a3390472090e8;hp=a2e4c578ba9795c6399403d8376c22eb7d505a1a;hpb=09a4ac29b536cd57fc8c25ae586021acfce69c08;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/render/common/render-algorithms.h b/dali/internal/render/common/render-algorithms.h old mode 100644 new mode 100755 index a2e4c57..bb5e066 --- a/dali/internal/render/common/render-algorithms.h +++ b/dali/internal/render/common/render-algorithms.h @@ -2,7 +2,7 @@ #define DALI_INTERNAL_RENDER_ALGORITHMS_H /* - * Copyright (c) 2016 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. @@ -19,10 +19,13 @@ */ // INTERNAL INCLUDES +#include #include +#include namespace Dali { + namespace Internal { class Context; @@ -30,26 +33,119 @@ class Context; namespace SceneGraph { class RenderInstruction; -class Shader; -class TextureCache; +struct RenderItem; } namespace Render { /** - * Process a render-instruction. - * @param[in] instruction The render-instruction to process. - * @param[in] context The GL context. - * @param[in] textureCache The texture cache used to get textures. - * @param[in] defaultShader The default shader. - * @param[in] bufferIndex The current render buffer index (previous update buffer) + * @brief The responsibility of the RenderAlgorithms object is to action renders required by a RenderInstruction. */ -void ProcessRenderInstruction( const SceneGraph::RenderInstruction& instruction, +class RenderAlgorithms +{ + public: + + /** + * Constructor. + */ + RenderAlgorithms(); + + /** + * Process a render-instruction. + * @param[in] instruction The render-instruction to process. + * @param[in] context The GL context. + * @param[in] bufferIndex The current render buffer index (previous update buffer) + * @param[in] depthBufferAvailable Whether the depth buffer is available + * @param[in] stencilBufferAvailable Whether the stencil buffer is available + * @param[in] boundTextures The textures bound for rendering + * @param[in] scissorBox The damaged rect for partial update + */ + void ProcessRenderInstruction( const SceneGraph::RenderInstruction& instruction, + Context& context, + BufferIndex bufferIndex, + Integration::DepthBufferAvailable depthBufferAvailable, + Integration::StencilBufferAvailable stencilBufferAvailable, + Vector& boundTextures, + int orientation, + Dali::ClippingBox& scissorBox ); + + private: + + /** + * @brief Calculate a 2D AABB (axis aligned bounding box) in screen space. + * The RenderItems dimensions are translated and a Z value of 0 is assumed for this purpose. + * No projection is performed, but rotation on Z is supported. + * @param[in] item The RenderItem to generate an AABB for + * @return The generated AABB in screen space + */ + inline Dali::ClippingBox CalculateScreenSpaceAABB( const Dali::Internal::SceneGraph::RenderItem& item ); + + /** + * @brief Perform any scissor clipping related operations based on the current RenderItem. + * This includes: + * - Determining if any action is to be taken (so the method can be exited early if not). + * - If the node is a clipping node, apply the nodes clip intersected with the current/parent scissor clip. + * - If we have gone up the scissor hierarchy, and need to un-apply a scissor clip. + * - Disable scissor clipping completely if it is not needed + * @param[in] item The current RenderItem (about to be rendered) + * @param[in] context The current Context + */ + inline void SetupScissorClipping( const Dali::Internal::SceneGraph::RenderItem& item, Context& context, int orientation ); + + /** + * @brief Set up the clipping based on the specified clipping settings. + * @param[in] item The current RenderItem (about to be rendered) + * @param[in] context The context + * @param[in/out] usedStencilBuffer True if the stencil buffer has been used so far within this RenderList. Used by StencilMode::ON. + * @param[in/out] lastClippingDepth The stencil depth of the last renderer drawn. Used by the clipping feature. + * @param[in/out] lastClippingId The clipping ID of the last renderer drawn. Used by the clipping feature. + * @param[in] stencilBufferAvailable Whether the stencil buffer is available + */ + inline void SetupClipping( const Dali::Internal::SceneGraph::RenderItem& item, Context& context, - SceneGraph::TextureCache& textureCache, - SceneGraph::Shader& defaultShader, - BufferIndex bufferIndex ); + bool& usedStencilBuffer, + uint32_t& lastClippingDepth, + uint32_t& lastClippingId, + Integration::StencilBufferAvailable stencilBufferAvailable, + int orientation ); + + /** + * @brief Process a render-list. + * @param[in] renderList The render-list to process. + * @param[in] context The GL context. + * @param[in] buffer The current render buffer index (previous update buffer) + * @param[in] viewMatrix The view matrix from the appropriate camera. + * @param[in] projectionMatrix The projection matrix from the appropriate camera. + * @param[in] depthBufferAvailable Whether the depth buffer is available + * @param[in] stencilBufferAvailable Whether the stencil buffer is available + * @param[in] boundTextures The textures bound for rendering + * @param[in] scissorBox The damaged rect for partial update + */ + inline void ProcessRenderList( const Dali::Internal::SceneGraph::RenderList& renderList, + Context& context, + BufferIndex bufferIndex, + const Matrix& viewMatrix, + const Matrix& projectionMatrix, + Integration::DepthBufferAvailable depthBufferAvailable, + Integration::StencilBufferAvailable stencilBufferAvailable, + Vector& boundTextures, + int orientation, + Dali::ClippingBox& scissorBox ); + + // Prevent copying: + RenderAlgorithms( RenderAlgorithms& rhs ); + RenderAlgorithms& operator=( const RenderAlgorithms& rhs ); + + + // Member variables: + + using ScissorStackType = std::vector; ///< The container type used to maintain the applied scissor hierarchy + + ScissorStackType mScissorStack; ///< Contains the currently applied scissor hierarchy (so we can undo clips) + Dali::ClippingBox mViewportRectangle; ///< The viewport dimensions, used to translate AABBs to scissor coordinates + bool mHasLayerScissor:1; ///< Marks if the currently process render instruction has a layer-based clipping region +}; } // namespace Render