2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include "render-helper.h"
22 #include <dali/integration-api/debug.h>
25 #include <base/interfaces/adaptor-internal-services.h>
26 #include <base/display-connection.h>
37 RenderHelper::RenderHelper( AdaptorInternalServices& adaptorInterfaces )
38 : mGLES( adaptorInterfaces.GetGlesInterface() ),
39 mEglFactory( &adaptorInterfaces.GetEGLFactoryInterface()),
41 mSurfaceReplaced( false ),
42 mSurfaceResized( false )
44 // set the initial values before render thread starts
45 mSurface = adaptorInterfaces.GetRenderSurfaceInterface();
49 mDisplayConnection = Dali::DisplayConnection::New( mSurface->GetSurfaceType() );
53 mDisplayConnection = Dali::DisplayConnection::New();
57 RenderHelper::~RenderHelper()
59 if (mDisplayConnection)
61 delete mDisplayConnection;
62 mDisplayConnection = NULL;
65 mEglFactory->Destroy();
68 void RenderHelper::Start()
72 mSurface->StartRender();
76 void RenderHelper::Stop()
80 // Tell surface we have stopped rendering
81 mSurface->StopRender();
83 // The surface will be destroyed soon; this pointer will become invalid
88 void RenderHelper::ConsumeEvents()
90 mDisplayConnection->ConsumeEvents();
93 void RenderHelper::InitializeEgl()
95 mEGL = mEglFactory->Create();
97 DALI_ASSERT_ALWAYS( mSurface && "NULL surface" );
99 // Initialize EGL & OpenGL
100 mDisplayConnection->InitializeEgl( *mEGL );
101 mSurface->InitializeEgl( *mEGL );
103 // create the OpenGL context
104 mEGL->CreateContext();
106 // create the OpenGL surface
107 mSurface->CreateEglSurface(*mEGL);
110 mEGL->MakeContextCurrent();
113 void RenderHelper::ReplaceSurface( RenderSurface* newSurface )
115 mSurface->DestroyEglSurface(*mEGL);
117 // This is designed for replacing pixmap surfaces, but should work for window as well
118 // we need to delete the egl surface and renderable (pixmap / window)
119 // Then create a new pixmap/window and new egl surface
120 // If the new surface has a different display connection, then the context will be lost
121 DALI_ASSERT_ALWAYS(newSurface && "NULL surface");
123 mDisplayConnection->InitializeEgl(*mEGL);
125 newSurface->ReplaceEGLSurface(*mEGL);
127 // use the new surface from now on
128 mSurface = newSurface;
129 mSurfaceReplaced = true;
132 void RenderHelper::ResizeSurface()
134 mSurfaceResized = true;
137 void RenderHelper::ShutdownEgl()
141 // give a chance to destroy the OpenGL surface that created externally
142 mSurface->DestroyEglSurface( *mEGL );
145 // delete the GL context / egl surface
146 mEGL->TerminateGles();
149 bool RenderHelper::PreRender()
153 mSurface->PreRender( *mEGL, mGLES, mSurfaceResized );
159 void RenderHelper::PostRender()
161 // Inform the gl implementation that rendering has finished before informing the surface
166 // Inform the surface that rendering this frame has finished.
167 mSurface->PostRender( *mEGL, mGLES, mDisplayConnection, mSurfaceReplaced, mSurfaceResized );
169 mSurfaceReplaced = false;
170 mSurfaceResized = false;
173 } // namespace Adaptor
175 } // namespace Internal