1 #ifndef __DALI_INTERNAL_RESOURCE_MANAGER_H__
2 #define __DALI_INTERNAL_RESOURCE_MANAGER_H__
5 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
25 #include <dali/public-api/images/image.h>
26 #include <dali/public-api/images/native-image.h>
27 #include <dali/public-api/images/bitmap-image.h>
28 #include <dali/public-api/common/ref-counted-dali-vector.h>
30 #include <dali/integration-api/bitmap.h>
31 #include <dali/integration-api/platform-abstraction.h>
32 #include <dali/integration-api/resource-cache.h>
33 #include <dali/integration-api/shader-data.h>
35 #include <dali/internal/common/event-to-update.h>
36 #include <dali/internal/common/message.h>
37 #include <dali/internal/event/common/thread-local-storage.h>
38 #include <dali/internal/common/bitmap-upload.h>
39 #include <dali/internal/event/text/font-impl.h>
40 #include <dali/internal/event/modeling/model-data-impl.h>
41 #include <dali/internal/event/resources/resource-client-declarations.h>
42 #include <dali/internal/event/effects/shader-factory.h>
43 #include <dali/internal/update/modeling/internal-mesh-data.h>
44 #include <dali/internal/update/modeling/scene-graph-mesh-declarations.h>
45 #include <dali/internal/update/resources/resource-manager-declarations.h>
46 #include <dali/internal/update/resources/bitmap-metadata.h>
61 // value types used by messages
62 template <> struct ParameterType< Integration::LoadResourcePriority >
63 : public BasicType< Integration::LoadResourcePriority > {};
64 template <> struct ParameterType< Pixel::Format >
65 : public BasicType< Pixel::Format > {};
66 template <> struct ParameterType< Integration::ResourceTypeId >
67 : public BasicType< Integration::ResourceTypeId > {};
73 class TextureCacheDispatcher;
74 class PostProcessResourceDispatcher;
77 class NotificationManager;
79 /** Raw bytes of a resource laid out exactly as it wouldbe in a file, but in memory. */
80 typedef Dali::RefCountedVector<uint8_t> RequestBuffer;
81 /** Counting smart pointer for managing a buffer of raw bytes. */
82 typedef IntrusivePtr<RequestBuffer> RequestBufferPtr;
85 * ResourceManager keeps track of resource loading requests, and caches resources that are loaded.
86 * It uses ResourceTicket objects, to keep track of the lifetime of each request.
87 * If the same resource is required by two client objects, they will share the same ResourceTicket
88 * i.e. only one load will occur using the native filesystem.
90 * Multi-threading notes:
91 * Resources are received from the PlatformAbstraction API during the Core::Render() method, which
92 * may be called from a dedicated rendering thread.
93 * Loading requests must be made from the application's main thread e.g. when Dali::Image is created.
95 class ResourceManager : public Integration::ResourceCache
100 * Create a resource manager.
101 * There should exactly one of these objects per Dali Core.
102 * @param[in] platformAbstraction Used to request resources from the native filesystem.
103 * @param[in] notificationManager Used to send NotifyTickets message.
104 * @param[in] postProcessResourcesQueue Used for performing post processing on resources
105 * @param[in] discardQueue Used to cleanup nodes & resources when no longer in use.
106 * @param[in] renderQueue Used to queue resource updates until the next Render.
108 ResourceManager( Integration::PlatformAbstraction& platformAbstraction,
109 NotificationManager& notificationManager,
110 SceneGraph::TextureCacheDispatcher& textureCacheDispatcher,
111 ResourcePostProcessList& postProcessResourcesQueue,
112 SceneGraph::PostProcessResourceDispatcher& postProcessResourceDispatcher,
113 SceneGraph::DiscardQueue& discardQueue,
114 SceneGraph::RenderQueue& renderQueue );
117 * Virtual destructor.
119 virtual ~ResourceManager();
121 public: // Used by ResourceClient
123 /********************************************************************************
124 ************************ ResourceClient direct interface **********************
125 ********************************************************************************/
128 * Resource client passes itself for secondary intialisation.
129 * (The resource client requires the ResourceManager to be instantiated first).
130 * @param[in] resourceClient The ResourceClient.
132 void SetClient( ResourceClient& resourceClient );
134 /********************************************************************************
135 ************************ UpdateManager direct interface ***********************
136 ********************************************************************************/
139 * Called to update the resource cache before rendering.
140 * New resources will be added to the cache using PlatformAbstraction::FillResourceCache().
141 * Unwanted resources will be added to the DiscardQueue.
142 * @param[in] updateBufferIndex The current update buffer index.
143 * @return true, if a resource load was completed or failed
145 bool UpdateCache( BufferIndex updateBufferIndex );
148 * Iterate through the post process queue, performing requested updates.
149 * @param[in] updateBufferIndex The current update buffer index.
151 void PostProcessResources( BufferIndex updateBufferIndex );
153 /********************************************************************************
154 *************************** CoreImpl direct interface *************************
155 ********************************************************************************/
158 * Returns whether the Resource Manager is still processing any resource requests.
159 * @return true if still processing, false otherwise.
161 bool ResourcesToProcess();
163 /********************************************************************************
164 ********************************* Message handlers *****************************
165 ********************************************************************************/
168 * Request a resource from the native filesystem.
169 * @param[in] id The Id of the requested resource
170 * @param[in] typePath The type & path of requested resource.
171 * @param[in] priority The priority of the request. This is ignored if the resource is already being loaded.
173 void HandleLoadResourceRequest( ResourceId id,
174 const ResourceTypePath& typePath,
175 Integration::LoadResourcePriority priority );
178 * Decode a resource from a memory buffer with the semantics of loading.
179 * Notifications of partial completion, success, and failure will happen via
180 * the same loading notification path used for loading from files: Update()
181 * will retrieve loading events in its main loop and notify listeners to its
182 * own loading events, and forward them, still as loading events, to the event
183 * thread via its update queue.
184 * Resource manager and lower levels make no attempt to detect resource
185 * aliases as is done for multiple requests to load the same resource
186 * file, so the caller is responsible for ensuring that it only requests
187 * the decoding of an in-memory resource once and for doing the sharing of the
188 * resulting object itself. Ultimately this responsibility resides with the
190 * @note ! Only Bitmap resources are supported for decoding from memory !
191 * @param[in] id The Id of the requested resource.
192 * @param[in] typePath The type of the requested resource and a path that is ignored.
193 * @param[in] buffer The raw encoded bytes of the resource as they would appear in a file.
194 * @param[in] priority The priority of the request. This is ignored if the resource is already being loaded.
196 void HandleDecodeResourceRequest( ResourceId id,
197 const ResourceTypePath& typePath,
198 RequestBufferPtr buffer,
199 Integration::LoadResourcePriority priority );
202 * Injects a bitmap resource (does not require loading).
203 * @pre bitmap has to be initialized
204 * @param[in] id The resource id
205 * @param[in] bitmap an initialized bitmap
207 void HandleAddBitmapImageRequest(ResourceId id, Integration::BitmapPtr bitmap);
210 * Add an existing resource to the resource manager.
211 * @param[in] id The resource id
212 * @param [in] resourceData the NativeImage object
213 * @return A ref-counted request object. Keep a copy until the resource is no longer required.
215 void HandleAddNativeImageRequest( ResourceId id, NativeImagePtr resourceData );
218 * Add an existing resource to the resource manager.
219 * @param[in] id The resource id
220 * @param[in] width width in pixels
221 * @param[in] height height in pixels
222 * @param[in] pixelFormat Pixel format
224 void HandleAddFrameBufferImageRequest( ResourceId id, unsigned int width, unsigned int height, Pixel::Format pixelFormat );
227 * Add an existing resource to the resource manager.
228 * @param[in] id The resource id
229 * @param[in] nativeImage The NativeImage
231 void HandleAddFrameBufferImageRequest( ResourceId id, NativeImagePtr nativeImage );
234 * Allocate a new empty texture.
235 * @param[in] id The resource id
236 * @param[in] width width in pixels
237 * @param[in] height height in pixels
238 * @param[in] pixelFormat Pixel format
240 void HandleAllocateTextureRequest( ResourceId id, unsigned int width, unsigned int height, Pixel::Format pixelFormat );
243 * Upload an array of bitmaps to a texture.
244 * @param[in] id The resource id
245 * @param[in] uploadArray bitmap upload array.
247 void HandleUpdateTextureRequest( ResourceId id, const BitmapUploadArray& uploadArray );
250 * Requests allocation of a mesh resource
251 * @param[in] id The resource id
252 * @param[in] meshData The mesh data
254 void HandleAllocateMeshRequest (ResourceId id, MeshData* meshData);
257 * Requests allocation of a font resource
259 void HandleAllocateFontRequest(ResourceId id, const std::string& familyNameAndStyle);
262 * Load a shader program from a file
263 * @param[in] id The resource id
264 * @param[in] typePath The type & path of the resource
266 void HandleLoadShaderRequest(ResourceId id, const ResourceTypePath& typePath );
269 * Update bitmap area request
270 * @param[in] textureId The resource ID of a bitmap-texture to remove.
271 * @param[in] area The updated area. Zero width/height indicates the whole bitmap has been updated
273 void HandleUpdateBitmapAreaRequest( ResourceId textureId, const Dali::RectArea& area );
276 * Upload a bitmap to a position within a specified texture
277 * @param[in] destId The destination texture ID
278 * @param[in] srcId The resource ID of the bitmap to upload
279 * @param [in] xOffset Specifies an offset in the x direction within the texture
280 * @param [in] yOffset Specifies an offset in the y direction within the texture
282 void HandleUploadBitmapRequest( ResourceId destId, ResourceId srcId, std::size_t xOffset, std::size_t yOffset );
285 * Upload mesh buffer changes.
286 * @param[in] updateBufferIndex The current update buffer index.
287 * @param[in] id The ID of a Mesh resource.
288 * @param[in] meshData Newly allocated mesh data; ownership is taken.
290 void HandleUpdateMeshRequest( BufferIndex updateBufferIndex, ResourceId id, MeshData* meshData );
293 * Request reloading a resource from the native filesystem.
294 * @param[in] id The resource id
295 * @param[in] typePath The type & path of the resource
296 * @param[in] priority The priority of the request. This is ignored if the resource is already being refreshed.
297 * @param[in] resetFinishedStatus True if the finished status of the resource id should be reset
299 void HandleReloadResourceRequest( ResourceId id, const ResourceTypePath& typePath, Integration::LoadResourcePriority priority, bool resetFinishedStatus );
302 * Save a resource to the given url
303 * @param[in] id The resource id
304 * @param[in] typePath The type & path of the resource
306 void HandleSaveResourceRequest( ResourceId id, const ResourceTypePath& typePath );
309 * Resource ticket has been discarded, throw away the actual resource
311 void HandleDiscardResourceRequest( ResourceId id, Integration::ResourceTypeId typeId );
314 * Update font texture atlas status
315 * @param[in] id The resource id
316 * @param[in] atlasId texture ID of the atlas
317 * @param[in] loadStatus The status update.
319 void HandleAtlasUpdateRequest( ResourceId id, ResourceId atlasId, Integration::LoadStatus loadStatus );
321 /********************************************************************************
322 ******************** Event thread object direct interface *********************
323 ********************************************************************************/
326 * Called by model implementations which require access to the model
328 * @note Only called from event thread objects - ModelData is not used
330 * @param[in] id - the id of a ModelData resource.
331 * @return the model data or NULL if it has not been loaded.
333 Internal::ModelDataPtr GetModelData(ResourceId id);
335 /********************************************************************************
336 ******************** Update thread object direct interface ********************
337 ********************************************************************************/
340 * Check if a resource has completed loading.
341 * @param[in] id The ID of a bitmap/texture resource.
342 * @return true if the bitmap or texture has finished loading
344 bool IsResourceLoaded(ResourceId id);
347 * Check if a resource has failed to load, e.g. file not found, etc.
348 * @param[in] id The ID of a bitmap/texture resource.
349 * @return true if the bitmap or texture has failed to load
351 bool IsResourceLoadFailed(ResourceId id);
354 * Get bitmap metadata. This stores meta data about the resource, but
355 * doesn't keep track of the resource
357 BitmapMetadata GetBitmapMetadata(ResourceId id);
361 * @note Used by update thread objects (SceneGraph::Mesh) only
362 * @param[in] id - the id of a MeshData resource.
363 * @return the mesh data or NULL if this resource isn't valid
365 Internal::SceneGraph::Mesh* GetMesh(ResourceId id);
368 * Returns the shader resource corresponding to the Id
369 * @param[in] id - the id of a shader binary resource.
370 * @return the shader binary resource data or NULL if it has not been loaded.
372 Integration::ShaderDataPtr GetShaderData(ResourceId id);
375 * Check if current set of glyph requests on given atlas have finished loading
376 * @param[in] id Request Id of the text atlas texture
377 * @return true if the current set of glyph requests have all completed, false
378 * if there are outstanding glyph requests that haven't finished.
380 bool IsAtlasLoaded(ResourceId id);
383 * Check the load status of a given atlas.
384 * @param[in] id Request Id of the text atlas texture
387 Integration::LoadStatus GetAtlasLoadStatus( ResourceId atlasId );
389 /********************************************************************************
390 ************************* ResourceCache Implementation ************************
391 ********************************************************************************/
395 * @copydoc Integration::ResourceCache::LoadResponse
397 virtual void LoadResponse(ResourceId id, Integration::ResourceTypeId type, Integration::ResourcePointer resource, Integration::LoadStatus loadStatus);
400 * @copydoc Integration::ResourceCache::SaveComplete
402 virtual void SaveComplete(ResourceId id, Integration::ResourceTypeId type);
405 * @copydoc Integration::ResourceCache::LoadFailed
407 virtual void LoadFailed(ResourceId id, Integration::ResourceFailure failure);
410 * @copydoc Integration::ResourceCache::SaveFailed
412 virtual void SaveFailed(ResourceId id, Integration::ResourceFailure failure);
414 /********************************************************************************
415 ********************************* Private Methods *****************************
416 ********************************************************************************/
419 * @param[in] id Resource id to clear
420 * @param[in] typePath Glyphs to be loaded, and cleared beforehand
422 void ClearRequestedGlyphArea( ResourceId id, const ResourceTypePath& typePath );
425 * Sends loaded glyphs to texture atlas for uploading
426 * @param[in] glyphSet Loaded glyphs
428 void UploadGlyphsToTexture( const Integration::GlyphSet& glyphSet );
431 * Sends notification messages for load sucess & failure,
432 * pushes from newComplete / newFailed into oldComplete / oldFailed respectively
434 void NotifyTickets();
437 * Triggers message to Event thread to update the ticket's image attributes
438 * @pre An Image resource with the given id should exist in the cache.
439 * @param id ID of the image resource
440 * @param attributes Resource image attributes
442 void UpdateImageTicket( ResourceId id, ImageAttributes& attributes );
445 * Send message to ResourceClient in event thread
446 * @param[in] message The message to send
448 void SendToClient( MessageBase* message );
451 * Discard all dead resources.
452 * @param[in] updateBufferIndex The current update buffer index.
454 void DiscardDeadResources( BufferIndex updateBufferIndex );
457 struct ResourceManagerImpl;
458 ResourceManagerImpl* mImpl;
461 // Messages sent to resource manager from other threads:
462 // These functions are run on other threads and insert messages to be
463 // picked-up by the update thread in its main loop and executed on that in
466 inline void RequestLoadResourceMessage( EventToUpdate& eventToUpdate,
467 ResourceManager& manager,
469 const ResourceTypePath& typePath,
470 Integration::LoadResourcePriority priority )
472 typedef MessageValue3< ResourceManager, ResourceId, ResourceTypePath, Integration::LoadResourcePriority > LocalType;
474 // Reserve some memory inside the message queue
475 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ), false );
477 // Construct message in the message queue memory; note that delete should not be called on the return value
478 new (slot) LocalType( &manager, &ResourceManager::HandleLoadResourceRequest, id, typePath, priority );
481 inline void RequestDecodeResourceMessage( EventToUpdate& eventToUpdate,
482 ResourceManager& manager,
484 /// We use typePath instead of the raw type for ownership and to enable copying of a concrete type.
485 const ResourceTypePath& typePath,
486 RequestBufferPtr buffer,
487 Integration::LoadResourcePriority priority )
489 typedef MessageValue4< ResourceManager, ResourceId, ResourceTypePath, RequestBufferPtr, Integration::LoadResourcePriority > LocalType;
491 // Reserve some memory inside the message queue
492 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ), false );
494 // Construct message in the message queue memory; note that delete should not be called on the return value
495 new (slot) LocalType( &manager, &ResourceManager::HandleDecodeResourceRequest, id, typePath, buffer, priority );
498 inline void RequestAddBitmapImageMessage( EventToUpdate& eventToUpdate,
499 ResourceManager& manager,
501 Integration::Bitmap* resourceData )
503 typedef MessageValue2< ResourceManager, ResourceId, Integration::BitmapPtr > LocalType;
505 // Reserve some memory inside the message queue
506 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
508 // Construct message in the message queue memory; note that delete should not be called on the return value
509 new (slot) LocalType( &manager, &ResourceManager::HandleAddBitmapImageRequest, id, resourceData );
512 inline void RequestAddNativeImageMessage( EventToUpdate& eventToUpdate,
513 ResourceManager& manager,
515 NativeImagePtr resourceData )
517 typedef MessageValue2< ResourceManager, ResourceId, NativeImagePtr > LocalType;
519 // Reserve some memory inside the message queue
520 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
522 // Construct message in the message queue memory; note that delete should not be called on the return value
523 new (slot) LocalType( &manager, &ResourceManager::HandleAddNativeImageRequest, id, resourceData );
526 inline void RequestAddFrameBufferImageMessage( EventToUpdate& eventToUpdate,
527 ResourceManager& manager,
531 Pixel::Format pixelFormat )
533 typedef MessageValue4< ResourceManager, ResourceId, unsigned int, unsigned int, Pixel::Format > LocalType;
535 // Reserve some memory inside the message queue
536 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
538 // Construct message in the message queue memory; note that delete should not be called on the return value
539 new (slot) LocalType( &manager, &ResourceManager::HandleAddFrameBufferImageRequest, id, width, height, pixelFormat );
542 inline void RequestAddFrameBufferImageMessage( EventToUpdate& eventToUpdate,
543 ResourceManager& manager,
545 NativeImagePtr resourceData )
547 typedef MessageValue2< ResourceManager, ResourceId, NativeImagePtr > LocalType;
549 // Reserve some memory inside the message queue
550 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
552 // Construct message in the message queue memory; note that delete should not be called on the return value
553 new (slot) LocalType( &manager, &ResourceManager::HandleAddFrameBufferImageRequest, id, resourceData );
556 inline void RequestAllocateTextureMessage(EventToUpdate& eventToUpdate,
557 ResourceManager& manager,
561 Pixel::Format pixelFormat)
563 typedef MessageValue4< ResourceManager, ResourceId, unsigned int, unsigned int, Pixel::Format > LocalType;
565 // Reserve some memory inside the message queue
566 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
568 // Construct message in the message queue memory; note that delete should not be called on the return value
569 new (slot) LocalType( &manager, &ResourceManager::HandleAllocateTextureRequest, id, width, height, pixelFormat );
572 inline void RequestUpdateTextureMessage(EventToUpdate& eventToUpdate,
573 ResourceManager& manager,
575 BitmapUploadArray uploadArray )
577 typedef MessageValue2< ResourceManager, ResourceId, BitmapUploadArray > LocalType;
579 // Reserve some memory inside the message queue
580 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
582 // Construct message in the message queue memory; note that delete should not be called on the return value
583 new (slot) LocalType( &manager, &ResourceManager::HandleUpdateTextureRequest, id, uploadArray );
586 inline void RequestAllocateMeshMessage( EventToUpdate& eventToUpdate,
587 ResourceManager& manager,
589 OwnerPointer<MeshData>& meshData )
591 typedef MessageValue2< ResourceManager, ResourceId, OwnerPointer<MeshData> > LocalType;
593 // Reserve some memory inside the message queue
594 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
596 // Construct message in the message queue memory; note that delete should not be called on the return value
597 new (slot) LocalType( &manager, &ResourceManager::HandleAllocateMeshRequest, id, meshData.Release() );
600 inline void RequestAllocateFontMessage( EventToUpdate& eventToUpdate,
601 ResourceManager& manager,
603 const std::string& familyNameAndStyle)
605 typedef MessageValue2< ResourceManager, ResourceId, std::string > LocalType;
607 // Reserve some memory inside the message queue
608 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
610 // Construct message in the message queue memory; note that delete should not be called on the return value
611 new (slot) LocalType( &manager, &ResourceManager::HandleAllocateFontRequest, id, familyNameAndStyle );
614 inline void RequestLoadShaderMessage( EventToUpdate& eventToUpdate,
615 ResourceManager& manager,
617 const ResourceTypePath& typePath )
619 typedef MessageValue2< ResourceManager, ResourceId, ResourceTypePath > LocalType;
621 // Reserve some memory inside the message queue
622 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
624 // Construct message in the message queue memory; note that delete should not be called on the return value
625 new (slot) LocalType( &manager, &ResourceManager::HandleLoadShaderRequest, id, typePath );
628 inline void RequestUpdateBitmapAreaMessage( EventToUpdate& eventToUpdate,
629 ResourceManager& manager,
631 const Dali::RectArea& area )
633 typedef MessageValue2< ResourceManager, ResourceId, Dali::RectArea > LocalType;
635 // Reserve some memory inside the message queue
636 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ), false );
638 // Construct message in the message queue memory; note that delete should not be called on the return value
639 new (slot) LocalType( &manager, &ResourceManager::HandleUpdateBitmapAreaRequest, id, area );
642 inline void RequestUploadBitmapMessage( EventToUpdate& eventToUpdate,
643 ResourceManager& manager,
647 std::size_t yOffset )
649 typedef MessageValue4< ResourceManager, ResourceId, ResourceId, std::size_t, std::size_t > LocalType;
651 // Reserve some memory inside the message queue
652 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ), false );
654 // Construct message in the message queue memory; note that delete should not be called on the return value
655 new (slot) LocalType( &manager, &ResourceManager::HandleUploadBitmapRequest, destId, srcId, xOffset, yOffset );
658 inline void RequestUpdateMeshMessage( EventToUpdate& eventToUpdate,
659 ResourceManager& manager,
661 const Dali::MeshData& meshData,
662 ResourcePolicy::Discardable discardable )
664 typedef MessageDoubleBuffered2< ResourceManager, ResourceId, OwnerPointer< MeshData > > LocalType;
665 // Reserve some memory inside the message queue
666 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
668 MeshData* internalMeshData = new MeshData( meshData, discardable, false );
670 // Construct message in the message queue memory; note that delete should not be called on the return value
671 new (slot) LocalType( &manager, &ResourceManager::HandleUpdateMeshRequest, id, internalMeshData );
674 inline void RequestReloadResourceMessage( EventToUpdate& eventToUpdate,
675 ResourceManager& manager,
677 const ResourceTypePath& typePath,
678 Integration::LoadResourcePriority priority,
679 bool resetFinishedStatus )
681 typedef MessageValue4< ResourceManager, ResourceId, ResourceTypePath, Integration::LoadResourcePriority, bool > LocalType;
683 // Reserve some memory inside the message queue
684 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ), false );
686 // Construct message in the message queue memory; note that delete should not be called on the return value
687 new (slot) LocalType( &manager, &ResourceManager::HandleReloadResourceRequest, id, typePath, priority, resetFinishedStatus );
690 inline void RequestSaveResourceMessage( EventToUpdate& eventToUpdate,
691 ResourceManager& manager,
693 const ResourceTypePath& typePath )
695 typedef MessageValue2< ResourceManager, ResourceId, ResourceTypePath > LocalType;
697 // Reserve some memory inside the message queue
698 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
700 // Construct message in the message queue memory; note that delete should not be called on the return value
701 new (slot) LocalType( &manager, &ResourceManager::HandleSaveResourceRequest, id, typePath );
704 inline void RequestDiscardResourceMessage( EventToUpdate& eventToUpdate,
705 ResourceManager& manager,
707 Integration::ResourceTypeId typeId )
709 typedef MessageValue2< ResourceManager, ResourceId, Integration::ResourceTypeId > LocalType;
711 // Reserve some memory inside the message queue
712 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
714 // Construct message in the message queue memory; note that delete should not be called on the return value
715 new (slot) LocalType( &manager, &ResourceManager::HandleDiscardResourceRequest, id, typeId );
718 inline void RequestAtlasUpdateMessage( EventToUpdate& eventToUpdate,
719 ResourceManager& manager,
722 Integration::LoadStatus loadStatus )
724 typedef MessageValue3< ResourceManager, ResourceId, ResourceId, Integration::LoadStatus > LocalType;
726 // Reserve some memory inside the message queue
727 unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
729 // Construct message in the message queue memory; note that delete should not be called on the return value
730 new (slot) LocalType( &manager, &ResourceManager::HandleAtlasUpdateRequest, id, atlasId, loadStatus );
733 } // namespace Internal
737 #endif // __DALI_INTERNAL_RESOURCE_MANAGER_H__