Uses TextArray new type definition.
[platform/core/uifw/dali-adaptor.git] / adaptors / base / update-render-controller.cpp
1 /*
2  * Copyright (c) 2014 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 "update-render-controller.h"
20
21 // INTERNAL INCLUDES
22 #include <base/update-thread.h>
23 #include <base/render-thread.h>
24 #include <base/update-render-synchronization.h>
25 #include <base/vsync-notifier.h>
26 #include <base/interfaces/adaptor-internal-services.h>
27 #include <base/environment-options.h>
28
29
30 namespace Dali
31 {
32
33 namespace Internal
34 {
35
36 namespace Adaptor
37 {
38
39 UpdateRenderController::UpdateRenderController( AdaptorInternalServices& adaptorInterfaces,
40                                                 const EnvironmentOptions& environmentOptions ): mUpdateThread( NULL ),
41   mRenderThread( NULL ),
42   mVSyncNotifier( NULL ),
43   mUpdateRenderSync( NULL )
44 {
45
46   mUpdateRenderSync = new UpdateRenderSynchronization( adaptorInterfaces );
47
48   mUpdateThread = new UpdateThread( *mUpdateRenderSync, adaptorInterfaces, environmentOptions );
49
50   mRenderThread = new RenderThread( *mUpdateRenderSync, adaptorInterfaces, environmentOptions );
51
52   mVSyncNotifier = new VSyncNotifier( *mUpdateRenderSync, adaptorInterfaces, environmentOptions );
53 }
54
55 UpdateRenderController::~UpdateRenderController()
56 {
57   delete mVSyncNotifier;
58   delete mRenderThread;
59   delete mUpdateThread;
60   delete mUpdateRenderSync;
61 }
62
63 void UpdateRenderController::Start()
64 {
65   // Notify the synchronization object before starting the threads
66   mUpdateRenderSync->Start();
67
68   mUpdateThread->Start();
69   mRenderThread->Start();
70   mVSyncNotifier->Start();
71 }
72
73 void UpdateRenderController::Pause()
74 {
75   mUpdateRenderSync->Pause();
76   // if update thread is napping, wake it up to get it to pause in correct place
77   mUpdateRenderSync->UpdateRequested();
78 }
79
80 void UpdateRenderController::Resume()
81 {
82   mUpdateRenderSync->Resume();
83 }
84
85 void UpdateRenderController::Stop()
86 {
87   // Notify the synchronization object before stopping the threads
88   mUpdateRenderSync->Stop();
89
90   mVSyncNotifier->Stop();
91   mUpdateThread->Stop();
92   mRenderThread->Stop();
93 }
94
95 void UpdateRenderController::RequestUpdate()
96 {
97   mUpdateRenderSync->UpdateRequested();
98 }
99
100 void UpdateRenderController::RequestUpdateOnce()
101 {
102   // we may be sleeping
103   mUpdateRenderSync->UpdateRequested();
104   // if we are paused, need to allow one update
105   mUpdateRenderSync->UpdateWhilePaused();
106 }
107
108 void UpdateRenderController::ReplaceSurface( RenderSurface* surface )
109 {
110   // tell render thread to start the replace
111   mRenderThread->ReplaceSurface(surface);
112
113   // Ensure that a frame gets processed and render thread runs at least once
114   // Note: ReplaceSurface may be called while threads are paused so call
115   //       RequestUpdateOnce to ensure we do an update/render pass even if paused
116   RequestUpdateOnce();
117
118   // block here until replace complete
119   mRenderThread->WaitForSurfaceReplaceComplete();
120 }
121
122 void UpdateRenderController::RenderSync()
123 {
124   mRenderThread->RenderSync();
125 }
126
127 void UpdateRenderController::DisableVSync()
128 {
129   mRenderThread->SetVSyncMode( EglInterface::NO_SYNC );
130 }
131
132 } // namespace Adaptor
133
134 } // namespace Internal
135
136 } // namespace Dali