X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Fmanager%2Fupdate-manager.h;h=e90ab9dbacca43df6c6ac25ac631f2ec46d2c231;hb=485765dab55e1b81644d15aa867abf8173c6e0ee;hp=5c23c9f7a3798599eeafa7317fd364578653a51f;hpb=38c6aa8ebba5e173cbdc71ff517c0b75f195582f;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/update/manager/update-manager.h b/dali/internal/update/manager/update-manager.h index 5c23c9f..e90ab9d 100644 --- a/dali/internal/update/manager/update-manager.h +++ b/dali/internal/update/manager/update-manager.h @@ -2,7 +2,7 @@ #define __DALI_INTERNAL_SCENE_GRAPH_UPDATE_MANAGER_H__ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,11 +32,12 @@ #include #include #include -#include #include #include - +#include #include +#include +#include namespace Dali { @@ -57,6 +58,11 @@ class CompleteNotificationInterface; class ResourceManager; class TouchResampler; +namespace Render +{ +struct Sampler; +class FrameBuffer; +} // value types used by messages template <> struct ParameterType< PropertyNotification::NotifyMode > : public BasicType< PropertyNotification::NotifyMode > {}; @@ -70,16 +76,14 @@ class PanGesture; class RenderManager; class RenderTaskList; class RenderQueue; -class TextureCache; -class Geometry; +class TextureCacheDispatcher; class PropertyBuffer; -class Material; -class Sampler; -class RendererAttachment; +class TextureSet; +class Camera; /** - * UpdateManager maintains a scene graph i.e. a tree of nodes and attachments and - * other property owner objects. + * UpdateManager maintains a scene graph i.e. a tree of nodes as well as + * other scene graph property owning objects. * It controls the Update traversal, in which nodes are repositioned/animated, * and organizes the the culling and rendering of the scene. * It also maintains the lifecycle of nodes and other property owners that are @@ -92,7 +96,6 @@ public: /** * Construct a new UpdateManager. * @param[in] notificationManager This should be notified when animations have finished. - * @param[in] glSyncAbstraction Used to determine when framebuffers are ready * @param[in] animationFinishedNotifier The CompleteNotificationInterface that handles animation completions * @param[in] propertyNotifier The PropertyNotifier * @param[in] resourceManager The resource manager used to load textures etc. @@ -100,11 +103,9 @@ public: * @param[in] controller After messages are flushed, we request a render from the RenderController. * @param[in] renderManager This is responsible for rendering the results of each "update". * @param[in] renderQueue Used to queue messages for the next render. - * @param[in] textureCache Used for caching textures. - * @param[in] touchResampler Used for re-sampling touch events. + * @param[in] textureCacheDispatcher Used for sending messages to texture cache. */ UpdateManager( NotificationManager& notificationManager, - Integration::GlSyncAbstraction& glSyncAbstraction, CompleteNotificationInterface& animationFinishedNotifier, PropertyNotifier& propertyNotifier, ResourceManager& resourceManager, @@ -112,8 +113,7 @@ public: Integration::RenderController& controller, RenderManager& renderManager, RenderQueue& renderQueue, - TextureCache& textureCache, - TouchResampler& touchResampler ); + TextureCacheDispatcher& textureCacheDispatcher ); /** * Destructor. @@ -151,10 +151,9 @@ public: * Connect a Node to the scene-graph. * A disconnected Node has has no parent or children, and its properties cannot be animated/constrained. * @pre The node does not already have a parent. - * @param[in] node The new parent node. - * @param[in] node The node to connect. + * @param[in] parent The new parent node. */ - void ConnectNode( Node* parent, Node* node, int index ); + void ConnectNode( Node* parent, Node* node ); /** * Disconnect a Node from the scene-graph. @@ -165,14 +164,6 @@ public: void DisconnectNode( Node* node ); /** - * Called when a property is set on a disconnected Node (via public API) - * A disconnected Node has has no parent or children, and its properties cannot be animated/constrained. - * @pre The node does not have a parent. - * @param[in] node The node to set as "active". - */ - void SetNodeActive( Node* node ); - - /** * Destroy a Node owned by UpdateManager. * This is not immediate; Nodes are passed to the RenderQueue to allow GL resources to be deleted. * In the following update, the previously queued Nodes may be deleted. @@ -182,18 +173,16 @@ public: void DestroyNode( Node* node ); /** - * Attach an object to a Node. - * The UpdateManager is responsible for calling NodeAttachment::Initialize(). - * @param[in] node The node which will own the attachment. - * @param[in] attachment The object to attach. + * Add a camera on scene + * @param[in] camera to add */ - void AttachToNode( Node* node, NodeAttachment* attachment ); + void AddCamera( Camera* camera ); /** - * Attach a renderer to the scene graph + * Remove a camera from scene + * @param[in] camera to remove */ - void AttachToSceneGraph( RendererAttachment* renderer ); - + void RemoveCamera( const Camera* camera ); /** * Add a newly created object. @@ -258,25 +247,11 @@ public: void PropertyNotificationSetNotify( PropertyNotification* propertyNotification, PropertyNotification::NotifyMode notifyMode ); /** - * @brief Get the geometry owner - * - * @return The geometry owner - */ - ObjectOwnerContainer< Geometry >& GetGeometryOwner(); - - /** - * @brief Get the material owner - * - * @return The material owner - */ - ObjectOwnerContainer< Material >& GetMaterialOwner(); - - /** - * @brief Get the sampler owner + * @brief Get the renderer owner * - * @return The sampler owner + * @return The renderer owner */ - ObjectOwnerContainer< Sampler >& GetSamplerOwner(); + ObjectOwnerContainer< Renderer >& GetRendererOwner(); /** * @brief Get the property buffer owner @@ -304,6 +279,21 @@ public: void RemoveShader(Shader* shader); /** + * Add a newly created TextureSet. + * @param[in] textureSet The texture set to add. + * @post The TextureSet is owned by the UpdateManager. + */ + void AddTextureSet(TextureSet* textureSet); + + /** + * Remove a TextureSet. + * @pre The TextureSet has been added to the UpdateManager. + * @param[in] textureSet The TextureSet to remove. + * @post The TextureSet is destroyed. + */ + void RemoveTextureSet(TextureSet* textureSet); + + /** * Set the shader program for a Shader object * @param[in] shader The shader to modify * @param[in] shaderData Source code, hash over source, and optional compiled binary for the shader program @@ -377,6 +367,164 @@ public: */ bool FlushQueue(); + /** + * Add a new sampler to RenderManager + * @param[in] sampler The sampler to add + * @post Sends a message to RenderManager to add the sampler. + * The sampler will be owned by RenderManager + */ + void AddSampler( Render::Sampler* sampler ); + + /** + * Removes an existing sampler from RenderManager + * @param[in] sampler The sampler to remove + * @post The sampler will be destroyed in the render thread + */ + void RemoveSampler( Render::Sampler* sampler ); + + /** + * Sets the filter modes for an existing sampler + * @param[in] sampler The sampler + * @param[in] minFilterMode The filter to use under minification + * @param[in] magFilterMode The filter to use under magnification + */ + void SetFilterMode( Render::Sampler* sampler, unsigned int minFilterMode, unsigned int magFilterMode ); + + /** + * Sets the wrap mode for an existing sampler + * @param[in] sampler The sampler + * @param[in] rWrapMode Wrapping mode in z direction + * @param[in] sWrapMode Wrapping mode in x direction + * @param[in] tWrapMode Wrapping mode in y direction + */ + void SetWrapMode( Render::Sampler* sampler, unsigned int rWrapMode, unsigned int sWrapMode, unsigned int tWrapMode ); + + /** + * Add a new property buffer to RenderManager + * @param[in] propertryBuffer The property buffer to add + * @post Sends a message to RenderManager to add the property buffer. + * The property buffer will be owned by RenderManager + */ + void AddPropertyBuffer( Render::PropertyBuffer* propertryBuffer ); + + /** + * Removes an existing PropertyBuffer from RenderManager + * @param[in] propertryBuffer The property buffer to remove + * @post The property buffer will be destroyed in the render thread + */ + void RemovePropertyBuffer( Render::PropertyBuffer* propertryBuffer ); + + /** + * Sets the format of an existing property buffer + * @param[in] propertyBuffer The property buffer. + * @param[in] format The new format of the buffer + * @post Sends a message to RenderManager to set the new format to the property buffer. + */ + void SetPropertyBufferFormat(Render::PropertyBuffer* propertyBuffer, Render::PropertyBuffer::Format* format ); + + /** + * Sets the data of an existing property buffer + * @param[in] propertyBuffer The property buffer. + * @param[in] data The new data of the buffer + * @param[in] size The new size of the buffer + * @post Sends a message to RenderManager to set the new data to the property buffer. + */ + void SetPropertyBufferData(Render::PropertyBuffer* propertyBuffer, Dali::Vector* data, size_t size); + + /** + * Adds a geometry to the RenderManager + * @param[in] geometry The geometry to add + * @post Sends a message to RenderManager to add the Geometry + * The geometry will be owned by RenderManager + */ + void AddGeometry( Render::Geometry* geometry ); + + /** + * Removes an existing Geometry from RenderManager + * @param[in] geometry The geometry to remove + * @post The geometry will be destroyed in the render thread + */ + void RemoveGeometry( Render::Geometry* geometry ); + + /** + * Sets the geometry type of an existing Geometry + * @param[in] geometry The geometry + * @param[in] geometryType The type of the geometry + */ + void SetGeometryType( Render::Geometry* geometry, unsigned int geometryType ); + + /** + * Sets the index buffer to be used by a geometry + * @param[in] geometry The geometry + * @param[in] indices A vector containing the indices for the geometry + */ + void SetIndexBuffer( Render::Geometry* geometry, Dali::Vector& indices ); + + /** + * Adds a vertex buffer to a geomtry + * @param[in] geometry The geometry + * @param[in] propertyBuffer The property buffer + */ + void AddVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer ); + + /** + * Removes a vertex buffer from a geometry + * @param[in] geometry The geometry + * @param[in] propertyBuffer The property buffer + */ + void RemoveVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer ); + + /** + * Adds a texture to the render manager + * @param[in] texture The texture to add + * The texture will be owned by RenderManager + */ + void AddTexture( Render::NewTexture* texture ); + + /** + * Removes a texture from the render manager + * @param[in] texture The texture to remove + * @post The texture will be destroyed in the render thread + */ + void RemoveTexture( Render::NewTexture* texture ); + + /** + * Uploads data to a texture owned by the RenderManager + * @param[in] texture The texture + * @param[in] pixelData The pixel data object + * @param[in] params The parameters for the upload + */ + void UploadTexture( Render::NewTexture* texture, PixelDataPtr pixelData, const NewTexture::UploadParams& params ); + + /** + * Generates mipmaps for a texture owned by the RenderManager + * @param[in] texture The texture + */ + void GenerateMipmaps( Render::NewTexture* texture ); + + /** + * Adds a framebuffer to the render manager + * @param[in] frameBuffer The framebuffer to add + * The framebuffer will be owned by RenderManager + */ + void AddFrameBuffer( Render::FrameBuffer* frameBuffer ); + + /** + * Removes a FrameBuffer from the render manager + * @param[in] frameBuffer The FrameBuffer to remove + * @post The FrameBuffer will be destroyed in the render thread + */ + void RemoveFrameBuffer( Render::FrameBuffer* frameBuffer ); + + /** + * Attach a texture as color output to an existing FrameBuffer + * @param[in] frameBuffer The FrameBuffer + * @param[in] texture The texture that will be used as output when rendering + * @param[in] mipmapLevel The mipmap of the texture to be attached + * @param[in] layer Indicates which layer of a cube map or array texture to attach. Unused for 2D textures + */ + void AttachColorTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::NewTexture* texture, unsigned int mipmapLevel, unsigned int face ); + public: /** @@ -428,52 +576,60 @@ private: unsigned int KeepUpdatingCheck( float elapsedSeconds ) const; /** - * Helper to calculate new camera setup when root node resizes. - * @param[in] updateBuffer The buffer to read the root node size from. - */ - void UpdateProjectionAndViewMatrices(int updateBuffer); - - /** * Post process resources that have been updated by renderer */ void PostProcessResources(); /** - * Helper to reset a Node properties. - * @param[in] node The node. - */ - void ResetNodeProperty( Node& node ); - - /** * Helper to reset all Node properties + * @param[in] bufferIndex to use */ - void ResetProperties(); + void ResetProperties( BufferIndex bufferIndex ); /** * Perform gesture updates. - * @param[in] lastVSyncTime The last VSync time in milliseconds. - * @param[in] nextVSyncTime The estimated time of the next VSync in milliseconds. + * @param[in] bufferIndex to use + * @param[in] lastVSyncTime The last VSync time in milliseconds. + * @param[in] nextVSyncTime The estimated time of the next VSync in milliseconds. * @return true, if any properties were updated. */ - bool ProcessGestures( unsigned int lastVSyncTimeMilliseconds, unsigned int nextVSyncTimeMilliseconds ); + bool ProcessGestures( BufferIndex bufferIndex, unsigned int lastVSyncTimeMilliseconds, unsigned int nextVSyncTimeMilliseconds ); /** * Perform animation updates + * @param[in] bufferIndex to use * @param[in] elapsedSeconds time since last frame */ - void Animate( float elapsedSeconds ); + void Animate( BufferIndex bufferIndex, float elapsedSeconds ); + + /** + * Applies constraints to CustomObjects + * @param[in] bufferIndex to use + */ + void ConstrainCustomObjects( BufferIndex bufferIndex ); /** - * Perform constraint updates. - * @note Applies constraints to nodes first (depth first search order). - * Then shader constraints second (construction order) + * Applies constraints to RenderTasks + * @param[in] bufferIndex to use */ - void ApplyConstraints(); + void ConstrainRenderTasks( BufferIndex bufferIndex ); + + /** + * Applies constraints to Shaders + * @param[in] bufferIndex to use + */ + void ConstrainShaders( BufferIndex bufferIndex ); /** * Perform property notification updates + * @param[in] bufferIndex to use + */ + void ProcessPropertyNotifications( BufferIndex bufferIndex ); + + /** + * Prepare textures for rendering */ - void ProcessPropertyNotifications(); + void PrepareTextureSets( BufferIndex bufferIndex ); /** * Pass shader binaries queued here on to event thread. @@ -481,16 +637,16 @@ private: void ForwardCompiledShadersToEventThread(); /** - * Update the default camera. - * This must be altered to match the root Node for 2D layouting. - * @param[in] updateBuffer The buffer to read the root node size from. + * Update node shaders, opacity, geometry etc. + * @param[in] bufferIndex to use */ - void UpdateDefaultCamera( int updateBuffer ); + void UpdateNodes( BufferIndex bufferIndex ); /** - * Update node shaders, opacity, geometry etc. + * Update Renderers + * @param[in] bufferIndex to use */ - void UpdateNodes(); + void UpdateRenderers( BufferIndex bufferIndex ); private: @@ -526,19 +682,19 @@ inline void AddNodeMessage( UpdateManager& manager, Node& node ) new (slot) LocalType( &manager, &UpdateManager::AddNode, &node ); } -inline void ConnectNodeMessage( UpdateManager& manager, const Node& constParent, const Node& constChild, int index ) +inline void ConnectNodeMessage( UpdateManager& manager, const Node& constParent, const Node& constChild ) { // Update thread can edit the object Node& parent = const_cast< Node& >( constParent ); Node& child = const_cast< Node& >( constChild ); - typedef MessageValue3< UpdateManager, Node*, Node*, int > LocalType; + typedef MessageValue2< UpdateManager, Node*, Node* > LocalType; // Reserve some memory inside the message queue unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::ConnectNode, &parent, &child, index ); + new (slot) LocalType( &manager, &UpdateManager::ConnectNode, &parent, &child ); } inline void DisconnectNodeMessage( UpdateManager& manager, const Node& constNode ) @@ -569,31 +725,27 @@ inline void DestroyNodeMessage( UpdateManager& manager, const Node& constNode ) new (slot) LocalType( &manager, &UpdateManager::DestroyNode, &node ); } -inline void AttachToNodeMessage( UpdateManager& manager, const Node& constParent, NodeAttachment* attachment ) +inline void AddCameraMessage( UpdateManager& manager, const Camera* constCamera ) { - // Scene graph thread can modify this object. - Node& parent = const_cast< Node& >( constParent ); - - // @todo MESH_REWORK Don't pass by owner pointer after merge with SceneGraph::RenderableAttachment ? (not needed if we split RendererAttachment to 2 objects) - typedef MessageValue2< UpdateManager, Node*, NodeAttachmentOwner > LocalType; + typedef MessageValue1< UpdateManager, Camera* > LocalType; + Camera* camera = const_cast( constCamera ); // Reserve some memory inside the message queue unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::AttachToNode, &parent, attachment ); + new (slot) LocalType( &manager, &UpdateManager::AddCamera, camera ); } -inline void AttachToSceneGraphMessage( UpdateManager& manager, RendererAttachment* renderer ) +inline void RemoveCameraMessage( UpdateManager& manager, const Camera* camera ) { - // @todo MESH_REWORK Pass by owner pointer after merge with SceneGraph::RenderableAttachment - typedef MessageValue1< UpdateManager, RendererAttachment* > LocalType; + typedef MessageValue1< UpdateManager, const Camera* > LocalType; // Reserve some memory inside the message queue unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); // Construct message in the message queue memory; note that delete should not be called on the return value - new (slot) LocalType( &manager, &UpdateManager::AttachToSceneGraph, renderer ); + new (slot) LocalType( &manager, &UpdateManager::RemoveCamera, camera ); } inline void AddObjectMessage( UpdateManager& manager, PropertyOwner* object ) @@ -830,6 +982,302 @@ inline void RemoveMessage( UpdateManager& manager, ObjectOwnerContainer& owne new (slot) LocalType( &owner, &ObjectOwnerContainer::Remove, &object ); } +// The render thread can safely change the Shader +inline void AddTextureSetMessage( UpdateManager& manager, TextureSet& textureSet ) +{ + typedef MessageValue1< UpdateManager, OwnerPointer< TextureSet > > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::AddTextureSet, &textureSet ); +} + +// The render thread can safely change the Shader +inline void RemoveTextureSetMessage( UpdateManager& manager, TextureSet& textureSet ) +{ + typedef MessageValue1< UpdateManager, TextureSet* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::RemoveTextureSet, &textureSet ); +} + +inline void AddSamplerMessage( UpdateManager& manager, Render::Sampler& sampler ) +{ + typedef MessageValue1< UpdateManager, Render::Sampler* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::AddSampler, &sampler ); +} + +inline void RemoveSamplerMessage( UpdateManager& manager, Render::Sampler& sampler ) +{ + typedef MessageValue1< UpdateManager, Render::Sampler* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::RemoveSampler, &sampler ); +} + +inline void SetFilterModeMessage( UpdateManager& manager, Render::Sampler& sampler, unsigned int minFilterMode, unsigned int magFilterMode ) +{ + typedef MessageValue3< UpdateManager, Render::Sampler*, unsigned int, unsigned int > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::SetFilterMode, &sampler, minFilterMode, magFilterMode ); +} + +inline void SetWrapModeMessage( UpdateManager& manager, Render::Sampler& sampler, unsigned int rWrapMode, unsigned int sWrapMode, unsigned int tWrapMode ) +{ + typedef MessageValue4< UpdateManager, Render::Sampler*, unsigned int, unsigned int, unsigned int > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::SetWrapMode, &sampler, rWrapMode, sWrapMode, tWrapMode ); +} + +inline void AddPropertyBuffer( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer ) +{ + typedef MessageValue1< UpdateManager, Render::PropertyBuffer* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::AddPropertyBuffer, &propertyBuffer ); +} + +inline void RemovePropertyBuffer( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer ) +{ + typedef MessageValue1< UpdateManager, Render::PropertyBuffer* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::RemovePropertyBuffer, &propertyBuffer ); +} + +inline void SetPropertyBufferFormat( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer, Render::PropertyBuffer::Format* format ) +{ + typedef MessageValue2< UpdateManager, Render::PropertyBuffer*, Render::PropertyBuffer::Format* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::SetPropertyBufferFormat, &propertyBuffer, format ); +} + +inline void SetPropertyBufferData( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer, Vector* data, size_t size ) +{ + typedef MessageValue3< UpdateManager, Render::PropertyBuffer*, Vector*, size_t > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::SetPropertyBufferData, &propertyBuffer, data, size ); +} + +inline void AddGeometry( UpdateManager& manager, Render::Geometry& geometry ) +{ + typedef MessageValue1< UpdateManager, Render::Geometry* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::AddGeometry, &geometry ); +} + +inline void RemoveGeometry( UpdateManager& manager, Render::Geometry& geometry ) +{ + typedef MessageValue1< UpdateManager, Render::Geometry* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::RemoveGeometry, &geometry ); +} + +inline void AddVertexBufferMessage( UpdateManager& manager, Render::Geometry& geometry, const Render::PropertyBuffer& vertexBuffer ) +{ + typedef MessageValue2< UpdateManager, Render::Geometry*, Render::PropertyBuffer* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::AddVertexBuffer, &geometry, const_cast(&vertexBuffer) ); +} + +inline void RemoveVertexBufferMessage( UpdateManager& manager, Render::Geometry& geometry, const Render::PropertyBuffer& vertexBuffer ) +{ + typedef MessageValue2< UpdateManager, Render::Geometry*, Render::PropertyBuffer* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::RemoveVertexBuffer, &geometry, const_cast(&vertexBuffer) ); +} + +// Custom message type for SetIndexBuffer() used to move data with Vector::Swap() +template< typename T > +class IndexBufferMessage : public MessageBase +{ +public: + + /** + * Constructor which does a Vector::Swap() + */ + IndexBufferMessage( T* manager, Render::Geometry* geometry, Dali::Vector& indices ) + : MessageBase(), + mManager( manager ), + mRenderGeometry( geometry ) + { + mIndices.Swap( indices ); + } + + /** + * Virtual destructor + */ + virtual ~IndexBufferMessage() + { + } + + /** + * @copydoc MessageBase::Process + */ + virtual void Process( BufferIndex /*bufferIndex*/ ) + { + DALI_ASSERT_DEBUG( mManager && "Message does not have an object" ); + mManager->SetIndexBuffer( mRenderGeometry, mIndices ); + } + +private: + + T* mManager; + Render::Geometry* mRenderGeometry; + Dali::Vector mIndices; +}; + +inline void SetIndexBufferMessage( UpdateManager& manager, Render::Geometry& geometry, Dali::Vector& indices ) +{ + typedef IndexBufferMessage< UpdateManager > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &geometry, indices ); +} + +inline void SetGeometryTypeMessage( UpdateManager& manager, Render::Geometry& geometry, unsigned int geometryType ) +{ + typedef MessageValue2< UpdateManager, Render::Geometry*, unsigned int > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::SetGeometryType, &geometry, geometryType ); +} + +inline void AddTexture( UpdateManager& manager, Render::NewTexture& texture ) +{ + typedef MessageValue1< UpdateManager, Render::NewTexture* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::AddTexture, &texture ); +} + +inline void RemoveTexture( UpdateManager& manager, Render::NewTexture& texture ) +{ + typedef MessageValue1< UpdateManager, Render::NewTexture* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::RemoveTexture, &texture ); +} + +inline void UploadTextureMessage( UpdateManager& manager, Render::NewTexture& texture, PixelDataPtr pixelData, const NewTexture::UploadParams& params ) +{ + typedef MessageValue3< UpdateManager, Render::NewTexture*, PixelDataPtr, NewTexture::UploadParams > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::UploadTexture, &texture, pixelData, params ); +} + +inline void GenerateMipmapsMessage( UpdateManager& manager, Render::NewTexture& texture ) +{ + typedef MessageValue1< UpdateManager, Render::NewTexture* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::GenerateMipmaps, &texture ); +} + + +inline void AddFrameBuffer( UpdateManager& manager, Render::FrameBuffer& frameBuffer ) +{ + typedef MessageValue1< UpdateManager, Render::FrameBuffer* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::AddFrameBuffer, &frameBuffer ); +} + +inline void RemoveFrameBuffer( UpdateManager& manager, Render::FrameBuffer& frameBuffer ) +{ + typedef MessageValue1< UpdateManager, Render::FrameBuffer* > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::RemoveFrameBuffer, &frameBuffer ); +} + +inline void AttachColorTextureToFrameBuffer( UpdateManager& manager, Render::FrameBuffer& frameBuffer, Render::NewTexture* texture, unsigned int mipmapLevel, unsigned int layer ) +{ + typedef MessageValue4< UpdateManager, Render::FrameBuffer*, Render::NewTexture*, unsigned int, unsigned int > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &manager, &UpdateManager::AttachColorTextureToFrameBuffer, &frameBuffer, texture, mipmapLevel, layer ); +} + } // namespace SceneGraph } // namespace Internal