New parameter for FrameBufferImage creation
[platform/core/uifw/dali-core.git] / dali / internal / update / resources / complete-status-manager.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 <dali/internal/update/resources/complete-status-manager.h>
20
21 // INTERNAL INCLUDES
22 #include <dali/integration-api/gl-sync-abstraction.h>
23 #include <dali/integration-api/resource-declarations.h>
24 #include <dali/internal/update/resources/resource-manager.h>
25 #include <dali/internal/update/resources/resource-tracker.h>
26 #include <dali/internal/update/resources/sync-resource-tracker.h>
27 #include <dali/internal/update/controllers/render-message-dispatcher.h>
28 #include <dali/internal/render/common/render-tracker.h>
29 #include <dali/internal/update/resources/complete-status-manager-debug.h>
30
31 namespace Dali
32 {
33 namespace Internal
34 {
35
36 CompleteStatusManager::CompleteStatusManager( Integration::GlSyncAbstraction& glSyncAbstraction,
37                                               SceneGraph::RenderMessageDispatcher& renderMessageDispatcher,
38                                               ResourceManager& resourceManager )
39 : mGlSyncAbstraction(glSyncAbstraction),
40   mRenderMessageDispatcher(renderMessageDispatcher),
41   mResourceManager(resourceManager)
42 {
43   TRACKER_LOG(Debug::Verbose);
44 }
45
46 CompleteStatusManager::~CompleteStatusManager()
47 {
48   // Delete all extant resource trackers
49   CompleteStatusManager::TrackedResourcesIter iter = mTrackedResources.begin();
50   CompleteStatusManager::TrackedResourcesIter end = mTrackedResources.end();
51   while( iter != end )
52   {
53     delete iter->second;
54     ++iter;
55   }
56
57   TRACKER_LOG(Debug::Verbose);
58 }
59
60 void CompleteStatusManager::TrackResource( Integration::ResourceId id )
61 {
62   TRACKER_LOG_FMT( Debug::General, "id:%d\n", id );
63
64   CompleteStatusManager::TrackedResourcesIter iter = mTrackedResources.find(id);
65   if( iter == mTrackedResources.end() )
66   {
67     // Create new tracker for ID
68     ResourceTracker* resourceTracker = CreateResourceTracker( id );
69     resourceTracker->Initialize();
70     mTrackedResources[id] = resourceTracker;
71   }
72   else
73   {
74     // We've found existing tracker. Reset it
75     iter->second->Reset();
76   }
77 }
78
79 void CompleteStatusManager::StopTrackingResource( Integration::ResourceId id )
80 {
81   TRACKER_LOG_FMT( Debug::General, "id:%d\n", id );
82
83   CompleteStatusManager::TrackedResourcesIter iter = mTrackedResources.find(id);
84   if( iter != mTrackedResources.end() )
85   {
86     iter->second->OnDestroy();
87     delete iter->second;
88     mTrackedResources.erase(iter);
89   }
90 }
91
92 ResourceTracker* CompleteStatusManager::FindResourceTracker( Integration::ResourceId id )
93 {
94   ResourceTracker* tracker = NULL;
95
96   TrackedResourcesIter iter = mTrackedResources.find(id);
97   if( iter != mTrackedResources.end() )
98   {
99     tracker = iter->second;
100   }
101
102   TRACKER_LOG_FMT(Debug::General, "id:%d = tracker:%p\n", id, tracker);
103   return tracker;
104 }
105
106 CompleteStatusManager::CompleteState CompleteStatusManager::GetStatus( Integration::ResourceId id )
107 {
108   CompleteState readiness = CompleteStatusManager::NOT_READY;
109
110   if( 0 != id )
111   {
112     TrackedResourcesIter iter = mTrackedResources.find(id);
113     if( iter != mTrackedResources.end() )
114     {
115       if( iter->second->IsComplete() )
116       {
117         readiness = CompleteStatusManager::COMPLETE;
118       }
119     }
120     else if( mResourceManager.IsResourceLoaded(id) )
121     {
122       readiness = CompleteStatusManager::COMPLETE;
123     }
124     else if( mResourceManager.IsResourceLoadFailed(id) )
125     {
126       readiness = CompleteStatusManager::NEVER;
127     }
128   }
129   else
130   {
131     // Loading is essentially finished if we don't have a resource ID
132     readiness = CompleteStatusManager::COMPLETE;
133   }
134
135   TRACKER_LOG_FMT(Debug::General, "id:%d = %s\n", id, (readiness==CompleteStatusManager::COMPLETE)?"COMPLETE":((readiness==CompleteStatusManager::NEVER)?"NEVER":"NOT_READY"));
136
137   return readiness;
138 }
139
140 ResourceTracker* CompleteStatusManager::CreateResourceTracker( Integration::ResourceId id )
141 {
142   ResourceTracker* resourceTracker = NULL;
143   BitmapMetadata bitmapMetadata = mResourceManager.GetBitmapMetadata( id );
144   if( bitmapMetadata.GetIsNativeImage() && bitmapMetadata.GetIsFramebuffer()  )
145   {
146     resourceTracker = new SyncResourceTracker( mGlSyncAbstraction, mRenderMessageDispatcher );
147   }
148   else
149   {
150     resourceTracker = new ResourceTracker();
151   }
152   return resourceTracker;
153 }
154
155 } // Internal
156 } // Dali