Merge branch 'devel/master' into tizen
[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    * @brief Sets the background color.
98    * @param[in] color The new background color
99    */
100   void SetBackgroundColor( const Vector4& color );
101
102   /**
103    * @copydoc Dali::Internal::FrameBuffer::MarkSurfaceAsInvalid()
104    */
105   void MarkSurfaceAsInvalid() { mIsSurfaceInvalid = true; };
106
107 public:
108
109   /**
110    * Called after this frame buffer is rendered in the render manager
111    */
112   void PostRender();
113
114   /**
115    * Gets the context holding the GL state of rendering for the surface
116    * @return the context
117    */
118   Context* GetContext();
119
120   /**
121    * @brief Makes the graphics context current
122    */
123   void MakeContextCurrent();
124
125   /**
126    * @brief Gets whether the depth buffer is required
127    * @return TRUE if the depth buffer is required
128    */
129   Integration::DepthBufferAvailable GetDepthBufferRequired();
130
131   /**
132    * @brief Gets whether the stencil buffer is required
133    * @return TRUE if the stencil buffer is required
134    */
135   Integration::StencilBufferAvailable GetStencilBufferRequired();
136
137   /**
138    * @brief Gets the background color of the surface.
139    * @return The background color
140    */
141   Vector4 GetBackgroundColor();
142
143 private:
144
145   Integration::RenderSurface* mSurface;   ///< The render surface
146   Context*                    mContext;   ///< The context holding the GL state of rendering for the surface backed frame buffer
147
148   uint32_t                    mWidth;
149   uint32_t                    mHeight;
150   Vector4                     mBackgroundColor;
151   bool                        mSizeChanged;
152   std::atomic<bool>           mIsSurfaceInvalid; ///< This is set only from the event thread and read only from the render thread
153 };
154
155 // Messages for FrameBuffer
156 inline void SetFrameBufferSizeMessage( SceneGraph::UpdateManager& updateManager, SurfaceFrameBuffer* surfaceFrameBuffer, uint32_t width, uint32_t height )
157 {
158   typedef MessageValue2< SurfaceFrameBuffer, uint32_t, uint32_t  > LocalType;
159
160   // Reserve some memory inside the message queue
161   uint32_t* slot = updateManager.ReserveMessageSlot( sizeof( LocalType ) );
162
163   // Construct message in the message queue memory; note that delete should not be called on the return value
164   new (slot) LocalType( surfaceFrameBuffer, &SurfaceFrameBuffer::SetSize, width, height );
165 }
166
167 inline void SetFrameBufferBackgroundColorMessage( SceneGraph::UpdateManager& updateManager, SurfaceFrameBuffer* surfaceFrameBuffer, const Vector4& color )
168 {
169   typedef MessageValue1< SurfaceFrameBuffer, Vector4 > LocalType;
170
171   // Reserve some memory inside the message queue
172   uint32_t* slot = updateManager.ReserveMessageSlot( sizeof( LocalType ) );
173
174   // Construct message in the message queue memory; note that delete should not be called on the return value
175   new (slot) LocalType( surfaceFrameBuffer, &SurfaceFrameBuffer::SetBackgroundColor, color );
176 }
177
178 } // namespace Render
179
180 } // namespace Internal
181
182 } // namespace Dali
183
184
185 #endif // DALI_INTERNAL_RENDER_SURFACE_FRAME_BUFFER_H