Revert "Separating integration-devel from devel package for 2nd party to use adaptor"
[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 )
41 : mAdaptorInterfaces( adaptorInterfaces ),
42   mUpdateThread( NULL ),
43   mRenderThread( NULL ),
44   mVSyncNotifier( NULL ),
45   mUpdateRenderSync( NULL ),
46   mNumberOfVSyncsPerRender( 1 )
47 {
48   mUpdateRenderSync = new UpdateRenderSynchronization( adaptorInterfaces, mNumberOfVSyncsPerRender );
49
50   mUpdateThread = new UpdateThread( *mUpdateRenderSync, adaptorInterfaces, environmentOptions );
51
52   mRenderThread = new RenderThread( *mUpdateRenderSync, adaptorInterfaces, environmentOptions );
53
54   mVSyncNotifier = new VSyncNotifier( *mUpdateRenderSync, adaptorInterfaces, environmentOptions );
55 }
56
57 UpdateRenderController::~UpdateRenderController()
58 {
59   delete mVSyncNotifier;
60   delete mRenderThread;
61   delete mUpdateThread;
62   delete mUpdateRenderSync;
63 }
64
65 void UpdateRenderController::Start()
66 {
67   // Notify the synchronization object before starting the threads
68   mUpdateRenderSync->Start();
69
70   mUpdateThread->Start();
71   mRenderThread->Start();
72   mVSyncNotifier->Start();
73 }
74
75 void UpdateRenderController::Pause()
76 {
77   mUpdateRenderSync->Pause();
78
79   // if update thread is napping, wake it up to get it to pause in correct place
80   mUpdateRenderSync->UpdateRequested();
81 }
82
83 void UpdateRenderController::ResumeFrameTime()
84 {
85   mUpdateRenderSync->ResumeFrameTime();
86 }
87
88 void UpdateRenderController::Resume()
89 {
90   mUpdateRenderSync->Resume();
91 }
92
93 void UpdateRenderController::Stop()
94 {
95   // Notify the synchronization object before stopping the threads
96   mUpdateRenderSync->Stop();
97
98   mVSyncNotifier->Stop();
99   mUpdateThread->Stop();
100   mRenderThread->Stop();
101 }
102
103 void UpdateRenderController::RequestUpdate()
104 {
105   mUpdateRenderSync->UpdateRequested();
106 }
107
108 void UpdateRenderController::RequestUpdateOnce()
109 {
110   // we may be sleeping
111   mUpdateRenderSync->UpdateRequested();
112   // if we are paused, need to allow one update
113   mUpdateRenderSync->UpdateWhilePaused();
114 }
115
116 void UpdateRenderController::ReplaceSurface( RenderSurface* newSurface )
117 {
118   // tell render thread to start the replace. This call will block until the replace
119   // has completed.
120   RenderSurface* currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface();
121
122   // Ensure the current surface releases any locks to prevent deadlock.
123   currentSurface->StopRender();
124
125   mUpdateRenderSync->ReplaceSurface( newSurface );
126 }
127
128 void UpdateRenderController::NewSurface( RenderSurface* newSurface )
129 {
130   // This API shouldn't be used when there is a current surface, but check anyway.
131   RenderSurface* currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface();
132   if( currentSurface )
133   {
134     currentSurface->StopRender();
135   }
136
137   mUpdateRenderSync->NewSurface( newSurface );
138 }
139
140 void UpdateRenderController::SetRenderRefreshRate(unsigned int numberOfVSyncsPerRender )
141 {
142   mNumberOfVSyncsPerRender = numberOfVSyncsPerRender;
143   mUpdateRenderSync->SetRenderRefreshRate(numberOfVSyncsPerRender);
144 }
145
146
147 } // namespace Adaptor
148
149 } // namespace Internal
150
151 } // namespace Dali