[Tizen] Revert "Support screen rotation"
[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   if( mSurface )
47   {
48     mDisplayConnection = Dali::DisplayConnection::New( mSurface->GetSurfaceType() );
49   }
50   else
51   {
52     mDisplayConnection = Dali::DisplayConnection::New();
53   }
54 }
55
56 RenderHelper::~RenderHelper()
57 {
58   if (mDisplayConnection)
59   {
60     delete mDisplayConnection;
61     mDisplayConnection = NULL;
62   }
63
64   mEglFactory->Destroy();
65 }
66
67 void RenderHelper::Start()
68 {
69   if( mSurface )
70   {
71     mSurface->StartRender();
72   }
73 }
74
75 void RenderHelper::Stop()
76 {
77   if( mSurface )
78   {
79     // Tell surface we have stopped rendering
80     mSurface->StopRender();
81   }
82 }
83
84 void RenderHelper::ConsumeEvents()
85 {
86   mDisplayConnection->ConsumeEvents();
87 }
88
89 void RenderHelper::InitializeEgl()
90 {
91   mEGL = mEglFactory->Create();
92
93   DALI_ASSERT_ALWAYS( mSurface && "NULL surface" );
94
95   // Initialize EGL & OpenGL
96   mDisplayConnection->InitializeEgl( *mEGL );
97   mSurface->InitializeEgl( *mEGL );
98
99   // create the OpenGL context
100   mEGL->CreateContext();
101
102   // create the OpenGL surface
103   mSurface->CreateEglSurface(*mEGL);
104
105   // Make it current
106   mEGL->MakeContextCurrent();
107 }
108
109 void RenderHelper::ReplaceSurface( RenderSurface* newSurface )
110 {
111   mSurface->DestroyEglSurface(*mEGL);
112
113   // This is designed for replacing pixmap surfaces, but should work for window as well
114   // we need to delete the egl surface and renderable (pixmap / window)
115   // Then create a new pixmap/window and new egl surface
116   // If the new surface has a different display connection, then the context will be lost
117   DALI_ASSERT_ALWAYS(newSurface && "NULL surface");
118
119   mDisplayConnection->InitializeEgl(*mEGL);
120
121   newSurface->ReplaceEGLSurface(*mEGL);
122
123   // use the new surface from now on
124   mSurface = newSurface;
125   mSurfaceReplaced = true;
126 }
127
128 void RenderHelper::ShutdownEgl()
129 {
130   if( mSurface )
131   {
132     // give a chance to destroy the OpenGL surface that created externally
133     mSurface->DestroyEglSurface( *mEGL );
134
135     mSurface = NULL;
136   }
137
138   // delete the GL context / egl surface
139   mEGL->TerminateGles();
140 }
141
142 bool RenderHelper::PreRender()
143 {
144   if( mSurface )
145   {
146     mSurface->PreRender( *mEGL, mGLES );
147   }
148   mGLES.PreRender();
149   return true;
150 }
151
152 void RenderHelper::PostRender()
153 {
154   // Inform the gl implementation that rendering has finished before informing the surface
155   mGLES.PostRender();
156
157   if( mSurface )
158   {
159     // Inform the surface that rendering this frame has finished.
160     mSurface->PostRender( *mEGL, mGLES, mDisplayConnection, mSurfaceReplaced );
161   }
162   mSurfaceReplaced = false;
163 }
164
165 } // namespace Adaptor
166
167 } // namespace Internal
168
169 } // namespace Dali