2 * Copyright (c) 2014 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 "update-render-controller.h"
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>
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 )
48 mUpdateRenderSync = new UpdateRenderSynchronization( adaptorInterfaces, mNumberOfVSyncsPerRender );
50 mUpdateThread = new UpdateThread( *mUpdateRenderSync, adaptorInterfaces, environmentOptions );
52 mRenderThread = new RenderThread( *mUpdateRenderSync, adaptorInterfaces, environmentOptions );
54 mVSyncNotifier = new VSyncNotifier( *mUpdateRenderSync, adaptorInterfaces, environmentOptions );
57 UpdateRenderController::~UpdateRenderController()
59 delete mVSyncNotifier;
62 delete mUpdateRenderSync;
65 void UpdateRenderController::Start()
67 // Notify the synchronization object before starting the threads
68 mUpdateRenderSync->Start();
70 mUpdateThread->Start();
71 mRenderThread->Start();
72 mVSyncNotifier->Start();
75 void UpdateRenderController::Pause()
77 mUpdateRenderSync->Pause();
79 // if update thread is napping, wake it up to get it to pause in correct place
80 mUpdateRenderSync->UpdateRequested();
83 void UpdateRenderController::ResumeFrameTime()
85 mUpdateRenderSync->ResumeFrameTime();
88 void UpdateRenderController::Resume()
90 mUpdateRenderSync->Resume();
93 void UpdateRenderController::Stop()
95 // Notify the synchronization object before stopping the threads
96 mUpdateRenderSync->Stop();
98 mVSyncNotifier->Stop();
99 mUpdateThread->Stop();
100 mRenderThread->Stop();
103 void UpdateRenderController::RequestUpdate()
105 mUpdateRenderSync->UpdateRequested();
108 void UpdateRenderController::RequestUpdateOnce()
110 // we may be sleeping
111 mUpdateRenderSync->UpdateRequested();
112 // if we are paused, need to allow one update
113 mUpdateRenderSync->UpdateWhilePaused();
116 void UpdateRenderController::ReplaceSurface( RenderSurface* newSurface )
118 // tell render thread to start the replace. This call will block until the replace
120 RenderSurface* currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface();
122 // Ensure the current surface releases any locks to prevent deadlock.
123 currentSurface->StopRender();
125 mUpdateRenderSync->ReplaceSurface( newSurface );
128 void UpdateRenderController::NewSurface( RenderSurface* newSurface )
130 // This API shouldn't be used when there is a current surface, but check anyway.
131 RenderSurface* currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface();
134 currentSurface->StopRender();
137 mUpdateRenderSync->NewSurface( newSurface );
140 void UpdateRenderController::SetRenderRefreshRate(unsigned int numberOfVSyncsPerRender )
142 mNumberOfVSyncsPerRender = numberOfVSyncsPerRender;
143 mUpdateRenderSync->SetRenderRefreshRate(numberOfVSyncsPerRender);
147 } // namespace Adaptor
149 } // namespace Internal