Dali 3D User Interface Engine
render-helper.cpp
Go to the documentation of this file.
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
23 
24 // INTERNAL INCLUDES
27 
28 namespace Dali
29 {
30 
31 namespace Internal
32 {
33 
34 namespace Adaptor
35 {
36 
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 
47 }
48 
50 {
52  {
53  delete mDisplayConnection;
54  mDisplayConnection = NULL;
55  }
56 
58 }
59 
61 {
62  if( mSurface )
63  {
64  mSurface->StartRender();
65  }
66 }
67 
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 
81 {
83 }
84 
86 {
87  mEGL = mEglFactory->Create();
88 
89  DALI_ASSERT_ALWAYS( mSurface && "NULL surface" );
90 
91  // Initialize EGL & OpenGL
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 
116 
117  newSurface->ReplaceEGLSurface(*mEGL);
118 
119  // use the new surface from now on
120  mSurface = newSurface;
121  mSurfaceReplaced = true;
122 }
123 
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 
137 {
138  if( mSurface )
139  {
140  mSurface->PreRender( *mEGL, mGLES );
141  }
142  mGLES.PreRender();
143  return true;
144 }
145 
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.
155  }
156  mSurfaceReplaced = false;
157 }
158 
159 } // namespace Adaptor
160 
161 } // namespace Internal
162 
163 } // namespace Dali
Dali Docs Home
Read more about Dali