PixmapSurface changes to double buffered pixmap.
[platform/core/uifw/dali-adaptor.git] / adaptors / base / render-helper.cpp
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include "render-helper.h"
20
21 // EXTERNAL INCLUDES
22 #include <dali/integration-api/debug.h>
23
24 // INTERNAL INCLUDES
25 #include <base/interfaces/adaptor-internal-services.h>
26 #include <base/display-connection.h>
27
28 namespace Dali
29 {
30
31 namespace Internal
32 {
33
34 namespace Adaptor
35 {
36
37 RenderHelper::RenderHelper( AdaptorInternalServices& adaptorInterfaces )
38 : mGLES( adaptorInterfaces.GetGlesInterface() ),
39   mEglFactory( &adaptorInterfaces.GetEGLFactoryInterface()),
40   mEGL( NULL ),
41   mSurfaceReplaced( false )
42 {
43   // set the initial values before render thread starts
44   mSurface = adaptorInterfaces.GetRenderSurfaceInterface();
45
46   mDisplayConnection = Dali::DisplayConnection::New();
47 }
48
49 RenderHelper::~RenderHelper()
50 {
51   if (mDisplayConnection)
52   {
53     delete mDisplayConnection;
54     mDisplayConnection = NULL;
55   }
56
57   mEglFactory->Destroy();
58 }
59
60 void RenderHelper::Start()
61 {
62   if( mSurface )
63   {
64     mSurface->StartRender();
65   }
66 }
67
68 void RenderHelper::Stop()
69 {
70   if( mSurface )
71   {
72     // Tell surface we have stopped rendering
73     mSurface->StopRender();
74
75     // The surface will be destroyed soon; this pointer will become invalid
76     mSurface = NULL;
77   }
78 }
79
80 void RenderHelper::ConsumeEvents()
81 {
82   mDisplayConnection->ConsumeEvents();
83 }
84
85 void RenderHelper::InitializeEgl()
86 {
87   mEGL = mEglFactory->Create();
88
89   DALI_ASSERT_ALWAYS( mSurface && "NULL surface" );
90
91   // Initialize EGL & OpenGL
92   mDisplayConnection->InitializeEgl( *mEGL );
93   mSurface->InitializeEgl( *mEGL );
94
95   // create the OpenGL context
96   mEGL->CreateContext();
97
98   // create the OpenGL surface
99   mSurface->CreateEglSurface(*mEGL);
100
101   // Make it current
102   mEGL->MakeContextCurrent();
103 }
104
105 void RenderHelper::ReplaceSurface( RenderSurface* newSurface )
106 {
107   mSurface->DestroyEglSurface(*mEGL);
108
109   // This is designed for replacing pixmap surfaces, but should work for window as well
110   // we need to delete the egl surface and renderable (pixmap / window)
111   // Then create a new pixmap/window and new egl surface
112   // If the new surface has a different display connection, then the context will be lost
113   DALI_ASSERT_ALWAYS(newSurface && "NULL surface");
114
115   mDisplayConnection->InitializeEgl(*mEGL);
116
117   newSurface->ReplaceEGLSurface(*mEGL);
118
119   // use the new surface from now on
120   mSurface = newSurface;
121   mSurfaceReplaced = true;
122 }
123
124 void RenderHelper::ShutdownEgl()
125 {
126   if( mSurface )
127   {
128     // give a chance to destroy the OpenGL surface that created externally
129     mSurface->DestroyEglSurface( *mEGL );
130   }
131
132   // delete the GL context / egl surface
133   mEGL->TerminateGles();
134 }
135
136 bool RenderHelper::PreRender()
137 {
138   if( mSurface )
139   {
140     mSurface->PreRender( *mEGL, mGLES );
141   }
142   mGLES.PreRender();
143   return true;
144 }
145
146 void RenderHelper::PostRender()
147 {
148   // Inform the gl implementation that rendering has finished before informing the surface
149   mGLES.PostRender();
150
151   if( mSurface )
152   {
153     // Inform the surface that rendering this frame has finished.
154     mSurface->PostRender( *mEGL, mGLES, mDisplayConnection, mSurfaceReplaced );
155   }
156   mSurfaceReplaced = false;
157 }
158
159 } // namespace Adaptor
160
161 } // namespace Internal
162
163 } // namespace Dali