[dali_2.3.23] Merge branch 'devel/master'
[platform/core/uifw/dali-core.git] / dali / internal / render / common / render-tracker.cpp
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 <dali/internal/render/common/render-tracker.h>
20
21 // INTERNAL INCLUDES
22 #include <dali/graphics-api/graphics-sync-object-create-info.h>
23 #include <dali/internal/render/common/render-tracker-debug.h>
24
25 // EXTERNAL INCLUDES
26
27 namespace Dali
28 {
29 namespace Internal
30 {
31 namespace Render
32 {
33 RenderTracker::RenderTracker()
34 : mGraphicsController(nullptr),
35   mSyncObject(nullptr),
36   mSyncTrigger(0)
37 {
38   TRACKER_LOG(Debug::Verbose);
39 }
40
41 RenderTracker::~RenderTracker()
42 {
43   TRACKER_LOG(Debug::Verbose);
44   mSyncObject.reset(nullptr); // Will destroy sync object immediately
45 }
46
47 Graphics::SyncObject* RenderTracker::CreateSyncObject(Graphics::Controller& graphicsController)
48 {
49   mGraphicsController = &graphicsController;
50
51   TRACKER_LOG(Debug::General);
52
53   ResetSyncFlag();
54   mSyncObject = mGraphicsController->CreateSyncObject(Graphics::SyncObjectCreateInfo{}, std::move(mSyncObject));
55   return mSyncObject.get();
56 }
57
58 void RenderTracker::PollSyncObject()
59 {
60   if(mSyncObject && mSyncObject->IsSynced())
61   {
62     SetSyncFlag();
63     mSyncObject.reset();
64
65     TRACKER_LOG_FMT(Debug::General, " Synced\n");
66     return;
67   }
68   TRACKER_LOG_FMT(Debug::General, " Not Synced\n");
69 }
70
71 bool RenderTracker::IsSynced()
72 {
73   int x = __sync_val_compare_and_swap(&mSyncTrigger, 0xFF, 0x0);
74
75   TRACKER_LOG_FMT(Debug::General, " = %s\n", x != 0 ? "T" : "F");
76   return x != 0;
77 }
78
79 void RenderTracker::ResetSyncFlag()
80 {
81   TRACKER_LOG(Debug::General);
82   (void)__sync_lock_test_and_set(&mSyncTrigger, 0x0);
83 }
84
85 void RenderTracker::SetSyncFlag()
86 {
87   (void)__sync_lock_test_and_set(&mSyncTrigger, 0xFF);
88 }
89
90 } // namespace Render
91
92 } // namespace Internal
93
94 } // namespace Dali