f295c457368e3de831f7c29671adb43c9c22b364
[platform/core/uifw/dali-core.git] / dali / internal / render / renderers / render-surface-frame-buffer.h
1 #ifndef DALI_INTERNAL_RENDER_SURFACE_FRAME_BUFFER_H
2 #define DALI_INTERNAL_RENDER_SURFACE_FRAME_BUFFER_H
3
4 /*
5  * Copyright (c) 2019 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 // EXTERNAL INCLUDES
21 #include <atomic>
22
23 // INTERNAL INCLUDES
24 #include <dali/internal/update/manager/update-manager.h>
25 #include <dali/internal/render/renderers/render-frame-buffer.h>
26 #include <dali/integration-api/render-surface.h>
27
28 namespace Dali
29 {
30
31 namespace Internal
32 {
33
34 class Context;
35
36 namespace Render
37 {
38
39 class SurfaceFrameBuffer : public FrameBuffer
40 {
41 public:
42
43   /**
44    * Constructor
45    * @param[in] surface The render surface
46    */
47   SurfaceFrameBuffer( Integration::RenderSurface* surface );
48
49   /**
50    * Destructor
51    */
52   virtual ~SurfaceFrameBuffer();
53
54   /**
55    * @copydoc Dali::Internal::Renderer::FrameBuffer::Initialize()
56    */
57   void Initialize( Context& context ) override;
58
59   /**
60    * @copydoc Dali::Internal::Renderer::FrameBuffer::Destroy()
61    */
62   void Destroy( Context& context ) override;
63
64   /**
65    * @copydoc Dali::Internal::Renderer::FrameBuffer::GlContextDestroyed()
66    */
67   void GlContextDestroyed() override;
68
69   /**
70    * @copydoc Dali::Internal::Renderer::FrameBuffer::Bind()
71    */
72   void Bind( Context& context ) override;
73
74   /**
75    * @copydoc Dali::Internal::Renderer::FrameBuffer::GetWidth()
76    */
77   uint32_t GetWidth() const override;
78
79   /**
80    * @copydoc Dali::Internal::Renderer::FrameBuffer::GetHeight()
81    */
82   uint32_t GetHeight() const override;
83
84   /**
85    * @copydoc Dali::Internal::Renderer::FrameBuffer::IsSurfaceBacked()
86    */
87   bool IsSurfaceBacked() override { return true; };
88
89   /**
90    * @brief Sets the frame buffer size.
91    * @param[in] width The width size
92    * @param[in] height The height size
93    */
94   void SetSize( uint32_t width, uint32_t height );
95
96   /**
97    * @copydoc Dali::Internal::FrameBuffer::MarkSurfaceAsInvalid()
98    */
99   void MarkSurfaceAsInvalid() { mIsSurfaceInvalid = true; };
100
101   /**
102    * @brief Gets whether the render surface in this frame buffer is valid or not
103    * @note The render surface becomes invalid when it is deleted in the event thread
104    * @return Whether the render surface is valid or not
105    */
106   bool IsSurfaceValid() const;
107
108 public:
109
110   /**
111    * Called after this frame buffer is rendered in the render manager
112    */
113   void PostRender();
114
115   /**
116    * Gets the context holding the GL state of rendering for the surface
117    * @return the context
118    */
119   Context* GetContext();
120
121   /**
122    * @brief Makes the graphics context current
123    */
124   void MakeContextCurrent();
125
126   /**
127    * @brief Sets currentframe damaged rects
128    * @param[in] Sets currentframe damaged rects
129    * @param[out] return merged rect
130    */
131   void SetDamagedRect( const Dali::DamagedRect& damagedRect, Dali::DamagedRect& mergedRect );
132
133   /**
134    * @brief Gets whether partial update is required for partial update
135    * @return whether partial update or not
136    */
137   bool IsPartialUpdateEnabled() const;
138
139   /**
140    * @brief Sets whether partial update is required for partial update
141    * @param[in] value whether partial update or not
142    */
143   void SetPartialUpdateEnabled( bool value );
144
145 private:
146
147   Integration::RenderSurface* mSurface;   ///< The render surface
148   Context*                    mContext;   ///< The context holding the GL state of rendering for the surface backed frame buffer
149
150   uint32_t                    mWidth;
151   uint32_t                    mHeight;
152   bool                        mSizeChanged;
153   std::atomic<bool>           mIsSurfaceInvalid; ///< This is set only from the event thread and read only from the render thread
154   bool                        mPartialUpdateEnabled; ///< This value is whether partial update is required
155 };
156
157 // Messages for FrameBuffer
158 inline void SetFrameBufferSizeMessage( SceneGraph::UpdateManager& updateManager, SurfaceFrameBuffer* surfaceFrameBuffer, uint32_t width, uint32_t height )
159 {
160   typedef MessageValue2< SurfaceFrameBuffer, uint32_t, uint32_t  > LocalType;
161
162   // Reserve some memory inside the message queue
163   uint32_t* slot = updateManager.ReserveMessageSlot( sizeof( LocalType ) );
164
165   // Construct message in the message queue memory; note that delete should not be called on the return value
166   new (slot) LocalType( surfaceFrameBuffer, &SurfaceFrameBuffer::SetSize, width, height );
167 }
168
169 inline void SetFrameBufferPartialUpdateMessage( SceneGraph::UpdateManager& updateManager, SurfaceFrameBuffer* surfaceFrameBuffer, bool value )
170 {
171   typedef MessageValue1< SurfaceFrameBuffer, bool > LocalType;
172
173   // Reserve some memory inside the message queue
174   uint32_t* slot = updateManager.ReserveMessageSlot( sizeof( LocalType ) );
175
176   // Construct message in the message queue memory; note that delete should not be called on the return value
177   new (slot) LocalType( surfaceFrameBuffer, &SurfaceFrameBuffer::SetPartialUpdateEnabled, value );
178 }
179
180 } // namespace Render
181
182 } // namespace Internal
183
184 } // namespace Dali
185
186
187 #endif // DALI_INTERNAL_RENDER_SURFACE_FRAME_BUFFER_H