X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fupdate%2Fmanager%2Fupdate-manager.h;h=8f272d87ff55ea14c4810ce9e806131de833aaf8;hb=ee9d14cd99ad293d46b17dc2f3591cc061ec403c;hp=2ad4f2c83d26d0995e8da719623d65e4a5f8c164;hpb=a6bfe927cc016703a7c2815beec1c8b1751c1d5f;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 2ad4f2c..8f272d8 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) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -22,26 +22,34 @@ #include #include -#include +#include #include #include #include #include #include +#include #include #include -#include +#include #include #include -#include -#include -#include +#include // for OwnerPointer< FrameCallback > +#include // for OwnerPointer< Renderer > +#include // for OwnerPointer< TextureSet > +#include +#include +#include +#include // for OwnerPointer< Shader > +#include #include namespace Dali { +class FrameCallbackInterface; + namespace Integration { class GlSyncAbstraction; @@ -55,7 +63,6 @@ namespace Internal class PropertyNotifier; class NotificationManager; class CompleteNotificationInterface; -class ResourceManager; class TouchResampler; namespace Render @@ -72,15 +79,35 @@ namespace SceneGraph class Animation; class DiscardQueue; -class PanGesture; class RenderManager; class RenderTaskList; class RenderTaskProcessor; class RenderQueue; -class TextureCacheDispatcher; -class PropertyBuffer; -class TextureSet; -class Camera; +class VertexBuffer; + +struct NodeDepthPair +{ + SceneGraph::Node* node; + uint32_t sortedDepth; + NodeDepthPair( SceneGraph::Node* node, uint32_t sortedDepth ) + : node(node), + sortedDepth(sortedDepth) + { + } +}; + +struct NodeDepths +{ + NodeDepths() = default; + + void Add( SceneGraph::Node* node, uint32_t sortedDepth ) + { + nodeDepths.push_back( NodeDepthPair( node, sortedDepth ) ); + } + + std::vector nodeDepths; +}; + /** * UpdateManager maintains a scene graph i.e. a tree of nodes as well as @@ -97,60 +124,55 @@ public: /** * Construct a new UpdateManager. * @param[in] notificationManager This should be notified when animations have finished. - * @param[in] animationFinishedNotifier The CompleteNotificationInterface that handles animation completions + * @param[in] animationPlaylist The CompleteNotificationInterface that handles the animations * @param[in] propertyNotifier The PropertyNotifier - * @param[in] resourceManager The resource manager used to load textures etc. * @param[in] discardQueue Nodes are added here when disconnected from the scene-graph. * @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] textureCacheDispatcher Used for sending messages to texture cache. - * @param[in] geometryBatcher Used when geometry batching is enabled. * @param[in] renderTaskProcessor Handles RenderTasks and RenderInstrucitons. */ UpdateManager( NotificationManager& notificationManager, - CompleteNotificationInterface& animationFinishedNotifier, + CompleteNotificationInterface& animationPlaylist, PropertyNotifier& propertyNotifier, - ResourceManager& resourceManager, DiscardQueue& discardQueue, Integration::RenderController& controller, RenderManager& renderManager, RenderQueue& renderQueue, - TextureCacheDispatcher& textureCacheDispatcher, - GeometryBatcher& geometryBatcher, RenderTaskProcessor& renderTaskProcessor ); /** * Destructor. */ - virtual ~UpdateManager(); + ~UpdateManager() override; // Node connection methods /** - * Get the scene graph side list of RenderTasks. - * @param[in] systemLevel True if using the system-level overlay. - * @return The list of render tasks + * Installs a new layer as the root node. + * @pre The layer is of derived Node type Layer. + * @pre The layer does not have a parent. + * @param[in] layer The new root node. + * @post The node is owned by UpdateManager. */ - RenderTaskList* GetRenderTaskList( bool systemLevel ); + void InstallRoot( OwnerPointer& layer ); /** - * Installs a new layer as the root node. - * @pre The UpdateManager does not already have an installed root node. + * Uninstalls the root node. * @pre The layer is of derived Node type Layer. * @pre The layer does not have a parent. - * @param[in] layer The new root node. - * @param[in] systemLevel True if using the system-level overlay. + * @param[in] layer The root node. * @post The node is owned by UpdateManager. */ - void InstallRoot( Layer* layer, bool systemLevel ); + void UninstallRoot( Layer* layer ); /** * Add a Node; UpdateManager takes ownership. * @pre The node does not have a parent. + * @note even though nodes are pool allocated, they also contain other heap allocated data, thus using OwnerPointer when transferring the data * @param[in] node The node to add. */ - void AddNode( Node* node ); + void AddNode( OwnerPointer& node ); /** * Connect a Node to the scene-graph. @@ -179,22 +201,22 @@ public: /** * Add a camera on scene - * @param[in] camera to add + * @param[in] camera The camera to add */ - void AddCamera( Camera* camera ); + void AddCamera( OwnerPointer< Camera >& camera ); /** * Remove a camera from scene * @param[in] camera to remove */ - void RemoveCamera( const Camera* camera ); + void RemoveCamera( Camera* camera ); /** * Add a newly created object. * @param[in] object The object to add. * @post The object is owned by UpdateManager. */ - void AddObject( PropertyOwner* object ); + void AddObject( OwnerPointer& object ); /** * Remove an object. @@ -202,6 +224,32 @@ public: */ void RemoveObject( PropertyOwner* object ); + /** + * Add a newly created render task list. + * @param[in] taskList The render task list to add. + * @post The render task list is owned by UpdateManager. + */ + void AddRenderTaskList( OwnerPointer& taskList ); + + /** + * Remove a render task list. + * @param[in] taskList The render task list to remove. + */ + void RemoveRenderTaskList( RenderTaskList* taskList ); + + /** + * Add a newly created scene. + * @param[in] scene The scene to add. + * @post The scene is owned by UpdateManager. + */ + void AddScene( OwnerPointer& scene ); + + /** + * Remove a scene. + * @param[in] scene The scene to remove. + */ + void RemoveScene( Scene* scene ); + // Animations /** @@ -209,7 +257,7 @@ public: * @param[in] animation The animation to add. * @post The animation is owned by UpdateManager. */ - void AddAnimation( Animation* animation ); + void AddAnimation( OwnerPointer< SceneGraph::Animation >& animation ); /** * Stop an animation. @@ -229,6 +277,13 @@ public: */ bool IsAnimationRunning() const; + /** + * Add a property resetter. UpdateManager takes ownership of the object. + * It will be killed by UpdateManager when the associated animator or + * constraint has finished; or the property owner of the property is destroyed. + */ + void AddPropertyResetter( OwnerPointer& propertyResetter ); + // Property Notification /** @@ -236,7 +291,7 @@ public: * @param[in] propertyNotification The notification to add * @post The propertyNotification is owned by UpdateManager. */ - void AddPropertyNotification( PropertyNotification* propertyNotification ); + void AddPropertyNotification( OwnerPointer< PropertyNotification >& propertyNotification ); /** * Remove a property notification @@ -251,21 +306,6 @@ public: */ void PropertyNotificationSetNotify( PropertyNotification* propertyNotification, PropertyNotification::NotifyMode notifyMode ); - /** - * @brief Get the renderer owner - * - * @return The renderer owner - */ - ObjectOwnerContainer< Renderer >& GetRendererOwner(); - - /** - * @brief Get the property buffer owner - * - * @return The property buffer owner - */ - ObjectOwnerContainer< PropertyBuffer >& GetPropertyBufferOwner(); - - // Shaders /** @@ -273,7 +313,7 @@ public: * @param[in] shader The shader to add. * @post The shader is owned by the UpdateManager. */ - void AddShader(Shader* shader); + void AddShader( OwnerPointer< Shader >& shader ); /** * Remove a shader. @@ -281,22 +321,7 @@ public: * @param[in] shader The shader to remove. * @post The shader is destroyed. */ - 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); + void RemoveShader( Shader* shader ); /** * Set the shader program for a Shader object @@ -310,7 +335,7 @@ public: * @brief Accept compiled shaders passed back on render thread for saving. * @param[in] shaderData Source code, hash over source, and corresponding compiled binary to be saved. */ - virtual void SaveBinary( Internal::ShaderDataPtr shaderData ); + void SaveBinary( Internal::ShaderDataPtr shaderData ) override; /** * @brief Set the destination for compiled shader binaries to be passed on to. @@ -319,22 +344,55 @@ public: */ void SetShaderSaver( ShaderSaver& upstream ); + // Renderers + + /** + * Add a new renderer to scene + * @param renderer to add + */ + void AddRenderer( OwnerPointer< Renderer >& renderer ); + + /** + * Add a renderer from scene + * @param renderer to remove + */ + void RemoveRenderer( Renderer* renderer ); + // Gestures /** - * Add a newly created gesture. - * @param[in] gesture The gesture to add. - * @post The gesture is owned by the UpdateManager. + * Set the pan gesture processor. + * Pan Gesture processor lives for the lifetime of UpdateManager + * @param[in] gesture The gesture processor. + * @post The gestureProcessor is owned by the UpdateManager. */ - void AddGesture( PanGesture* gesture ); + void SetPanGestureProcessor( PanGesture* gestureProcessor ); + + // Textures /** - * Remove a gesture. - * @pre The gesture has been added to the UpdateManager. - * @param[in] gesture The gesture to remove. - * @post The gesture is destroyed. + * Add a newly created TextureSet. + * @param[in] textureSet The texture set to add. + * @post The TextureSet is owned by the UpdateManager. + */ + void AddTextureSet( OwnerPointer< 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 RemoveGesture( PanGesture* gesture ); + void RemoveTextureSet( TextureSet* textureSet ); + + // Render tasks + + /** + * Get the scene graph side list of RenderTasks. + * @param[in] systemLevel True if using the system-level overlay. + * @return The list of render tasks + */ + RenderTaskList* GetRenderTaskList( bool systemLevel ); // Message queue handling @@ -347,7 +405,7 @@ public: * @note the default value of updateScene should match that in EventThreadServices::ReserveMessageSlot. * @return A pointer to the first char allocated for the message. */ - unsigned int* ReserveMessageSlot( std::size_t size, bool updateScene = true ); + uint32_t* ReserveMessageSlot( uint32_t size, bool updateScene = true ); /** * @return the current event-buffer index. @@ -378,7 +436,7 @@ public: * @post Sends a message to RenderManager to add the sampler. * The sampler will be owned by RenderManager */ - void AddSampler( Render::Sampler* sampler ); + void AddSampler( OwnerPointer< Render::Sampler >& sampler ); /** * Removes an existing sampler from RenderManager @@ -393,7 +451,7 @@ public: * @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 ); + void SetFilterMode( Render::Sampler* sampler, uint32_t minFilterMode, uint32_t magFilterMode ); /** * Sets the wrap mode for an existing sampler @@ -402,7 +460,7 @@ public: * @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 ); + void SetWrapMode( Render::Sampler* sampler, uint32_t rWrapMode, uint32_t sWrapMode, uint32_t tWrapMode ); /** * Add a new property buffer to RenderManager @@ -410,31 +468,31 @@ public: * @post Sends a message to RenderManager to add the property buffer. * The property buffer will be owned by RenderManager */ - void AddPropertyBuffer( Render::PropertyBuffer* propertryBuffer ); + void AddVertexBuffer( OwnerPointer< Render::VertexBuffer >& propertryBuffer ); /** - * Removes an existing PropertyBuffer from RenderManager + * Removes an existing VertexBuffer 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 ); + void RemoveVertexBuffer( Render::VertexBuffer* propertryBuffer ); /** * Sets the format of an existing property buffer - * @param[in] propertyBuffer The property buffer. + * @param[in] vertexBuffer 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 ); + void SetVertexBufferFormat( Render::VertexBuffer* vertexBuffer, OwnerPointer< Render::VertexBuffer::Format>& format ); /** * Sets the data of an existing property buffer - * @param[in] propertyBuffer The property buffer. + * @param[in] vertexBuffer 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); + void SetVertexBufferData( Render::VertexBuffer* vertexBuffer, OwnerPointer< Vector >& data, uint32_t size ); /** * Adds a geometry to the RenderManager @@ -442,7 +500,7 @@ public: * @post Sends a message to RenderManager to add the Geometry * The geometry will be owned by RenderManager */ - void AddGeometry( Render::Geometry* geometry ); + void AddGeometry( OwnerPointer< Render::Geometry >& geometry ); /** * Removes an existing Geometry from RenderManager @@ -456,42 +514,42 @@ public: * @param[in] geometry The geometry * @param[in] geometryType The type of the geometry */ - void SetGeometryType( Render::Geometry* geometry, unsigned int geometryType ); + void SetGeometryType( Render::Geometry* geometry, uint32_t 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 ); + void SetIndexBuffer( Render::Geometry* geometry, Dali::Vector& indices ); /** - * Adds a vertex buffer to a geomtry + * Adds a vertex buffer to a geometry * @param[in] geometry The geometry - * @param[in] propertyBuffer The property buffer + * @param[in] vertexBuffer The property buffer */ - void AddVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer ); + void AttachVertexBuffer( Render::Geometry* geometry, Render::VertexBuffer* vertexBuffer ); /** * Removes a vertex buffer from a geometry * @param[in] geometry The geometry - * @param[in] propertyBuffer The property buffer + * @param[in] vertexBuffer The property buffer */ - void RemoveVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer ); + void RemoveVertexBuffer( Render::Geometry* geometry, Render::VertexBuffer* vertexBuffer ); /** * 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 ); + void AddTexture( OwnerPointer< Render::Texture >& 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 ); + void RemoveTexture( Render::Texture* texture ); /** * Uploads data to a texture owned by the RenderManager @@ -499,20 +557,20 @@ public: * @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 ); + void UploadTexture( Render::Texture* texture, PixelDataPtr pixelData, const Texture::UploadParams& params ); /** * Generates mipmaps for a texture owned by the RenderManager * @param[in] texture The texture */ - void GenerateMipmaps( Render::NewTexture* texture ); + void GenerateMipmaps( Render::Texture* 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 ); + void AddFrameBuffer( OwnerPointer< Render::FrameBuffer >& frameBuffer ); /** * Removes a FrameBuffer from the render manager @@ -528,7 +586,29 @@ public: * @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 ); + void AttachColorTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::Texture* texture, uint32_t mipmapLevel, uint32_t face ); + + /** + * Attach a texture as depth 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 + */ + void AttachDepthTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::Texture* texture, uint32_t mipmapLevel ); + + /** + * Attach a texture as depth/stencil 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 + */ + void AttachDepthStencilTextureToFrameBuffer( Render::FrameBuffer* frameBuffer, Render::Texture* texture, uint32_t mipmapLevel ); + + /** + * This is called when the surface of the scene has been replaced. + * @param[in] scene The scene. + */ + void SurfaceReplaced( Scene* scene ); public: @@ -537,15 +617,15 @@ public: * @param[in] elapsedSeconds The elapsed time that should be applied to animations. * @param[in] lastVSyncTimeMilliseconds The last time, in milliseconds, that we had a VSync. * @param[in] nextVSyncTimeMilliseconds The estimated time, in milliseconds, of the next VSync. + * @param[in] renderToFboEnabled Whether rendering into the Frame Buffer Object is enabled. + * @param[in] isRenderingToFbo Whether this frame is being rendered into the Frame Buffer Object. * @return True if further updates are required e.g. during animations. */ - unsigned int Update( float elapsedSeconds, unsigned int lastVSyncTimeMilliseconds, unsigned int nextVSyncTimeMilliseconds ); - - /** - * Set the background color i.e. the glClear color used at the beginning of each frame. - * @param[in] color The new background color. - */ - void SetBackgroundColor(const Vector4& color); + uint32_t Update( float elapsedSeconds, + uint32_t lastVSyncTimeMilliseconds, + uint32_t nextVSyncTimeMilliseconds, + bool renderToFboEnabled, + bool isRenderingToFbo ); /** * Set the default surface rect. @@ -559,11 +639,49 @@ public: void KeepRendering( float durationSeconds ); /** + * @copydoc Dali::DevelStage::SetRenderingBehavior() + */ + void SetRenderingBehavior( DevelStage::Rendering renderingBehavior ); + + /** + * Request to render the current frame + * @note This is a temporary workaround (to be removed in the future) to request the rendering of + * the current frame if the color or visibility of any actor is updated. It MUST NOT be used + * for any other purposes. + */ + void RequestRendering(); + + /** * Sets the depths of all layers. * @param layers The layers in depth order. - * @param[in] systemLevel True if using the system-level overlay. + * @param[in] rootLayer The root layer of the sorted layers. */ - void SetLayerDepths( const std::vector< Layer* >& layers, bool systemLevel ); + void SetLayerDepths( const std::vector< Layer* >& layers, const Layer* rootLayer ); + + /** + * Set the depth indices of all nodes (in LayerUI's) + * @param[in] nodeDepths A vector of nodes and associated depth indices + */ + void SetDepthIndices( OwnerPointer< NodeDepths >& nodeDepths ); + + /** + * Query wheter the default surface rect is changed or not. + * @return true if the default surface rect is changed. + */ + bool IsDefaultSurfaceRectChanged(); + + /** + * Adds an implementation of the FrameCallbackInterface. + * @param[in] frameCallback An OwnerPointer to the SceneGraph FrameCallback object + * @param[in] rootNode A pointer to the root node to apply the FrameCallback to + */ + void AddFrameCallback( OwnerPointer< FrameCallback >& frameCallback, const Node* rootNode ); + + /** + * Removes the specified implementation of FrameCallbackInterface. + * @param[in] frameCallback A pointer to the implementation of the FrameCallbackInterface to remove. + */ + void RemoveFrameCallback( FrameCallbackInterface* frameCallback ); private: @@ -578,12 +696,7 @@ private: * @param[in] elapsedSeconds The time in seconds since the previous update. * @return True if the update-thread should keep going. */ - unsigned int KeepUpdatingCheck( float elapsedSeconds ) const; - - /** - * Post process resources that have been updated by renderer - */ - void PostProcessResources(); + uint32_t KeepUpdatingCheck( float elapsedSeconds ) const; /** * Helper to reset all Node properties @@ -598,14 +711,15 @@ private: * @param[in] nextVSyncTime The estimated time of the next VSync in milliseconds. * @return true, if any properties were updated. */ - bool ProcessGestures( BufferIndex bufferIndex, unsigned int lastVSyncTimeMilliseconds, unsigned int nextVSyncTimeMilliseconds ); + bool ProcessGestures( BufferIndex bufferIndex, uint32_t lastVSyncTimeMilliseconds, uint32_t nextVSyncTimeMilliseconds ); /** * Perform animation updates * @param[in] bufferIndex to use * @param[in] elapsedSeconds time since last frame + * @return true if at least one animations is currently active or false otherwise */ - void Animate( BufferIndex bufferIndex, float elapsedSeconds ); + bool Animate( BufferIndex bufferIndex, float elapsedSeconds ); /** * Applies constraints to CustomObjects @@ -660,26 +774,42 @@ private: // Messages for UpdateManager -inline void InstallRootMessage( UpdateManager& manager, Layer& root, bool systemLevel ) +inline void InstallRootMessage( UpdateManager& manager, OwnerPointer& root ) { - typedef MessageValue2< UpdateManager, Layer*, bool > LocalType; + // Message has ownership of Layer while in transit from event -> update + using LocalType = MessageValue1 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::InstallRoot, &root, systemLevel ); + new (slot) LocalType( &manager, &UpdateManager::InstallRoot, root ); } -inline void AddNodeMessage( UpdateManager& manager, Node& node ) +inline void UninstallRootMessage( UpdateManager& manager, const Layer* constRoot ) { - typedef MessageValue1< UpdateManager, OwnerPointer > LocalType; + // Scene graph thread can destroy this object. + Layer* root = const_cast< Layer* >( constRoot ); + + using LocalType = MessageValue1; + + // Reserve some memory inside the message queue + uint32_t* 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::UninstallRoot, root ); +} + +inline void AddNodeMessage( UpdateManager& manager, OwnerPointer& node ) +{ + // Message has ownership of Node while in transit from event -> update + using LocalType = MessageValue1 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::AddNode, &node ); + new (slot) LocalType( &manager, &UpdateManager::AddNode, node ); } inline void ConnectNodeMessage( UpdateManager& manager, const Node& constParent, const Node& constChild ) @@ -688,10 +818,10 @@ inline void ConnectNodeMessage( UpdateManager& manager, const Node& constParent, Node& parent = const_cast< Node& >( constParent ); Node& child = const_cast< Node& >( constChild ); - typedef MessageValue2< UpdateManager, Node*, Node* > LocalType; + using LocalType = MessageValue2; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ); @@ -702,10 +832,10 @@ inline void DisconnectNodeMessage( UpdateManager& manager, const Node& constNode // Scene graph thread can modify this object. Node& node = const_cast< Node& >( constNode ); - typedef MessageValue1< UpdateManager, Node* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::DisconnectNode, &node ); @@ -716,22 +846,22 @@ inline void DestroyNodeMessage( UpdateManager& manager, const Node& constNode ) // Scene graph thread can destroy this object. Node& node = const_cast< Node& >( constNode ); - typedef MessageValue1< UpdateManager, Node* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::DestroyNode, &node ); } -inline void AddCameraMessage( UpdateManager& manager, const Camera* constCamera ) +inline void AddCameraMessage( UpdateManager& manager, OwnerPointer< Camera >& camera ) { - typedef MessageValue1< UpdateManager, Camera* > LocalType; + // Message has ownership of Camera while in transit from event -> update + using LocalType = MessageValue1 >; - Camera* camera = const_cast( constCamera ); // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::AddCamera, camera ); @@ -739,43 +869,44 @@ inline void AddCameraMessage( UpdateManager& manager, const Camera* constCamera inline void RemoveCameraMessage( UpdateManager& manager, const Camera* camera ) { - typedef MessageValue1< UpdateManager, const Camera* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::RemoveCamera, camera ); + new (slot) LocalType( &manager, &UpdateManager::RemoveCamera, const_cast( camera ) ); } -inline void AddObjectMessage( UpdateManager& manager, PropertyOwner* object ) +inline void AddObjectMessage( UpdateManager& manager, OwnerPointer& object ) { - typedef MessageValue1< UpdateManager, OwnerPointer > LocalType; + // Message has ownership of object while in transit from event -> update + using LocalType = MessageValue1 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::AddObject, object ); } -inline void RemoveObjectMessage( UpdateManager& manager, PropertyOwner* object ) +inline void RemoveObjectMessage( UpdateManager& manager, const PropertyOwner* object ) { - typedef MessageValue1< UpdateManager, PropertyOwner* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::RemoveObject, object ); + new (slot) LocalType( &manager, &UpdateManager::RemoveObject, const_cast( object ) ); } -inline void AddAnimationMessage( UpdateManager& manager, Animation* animation ) +inline void AddAnimationMessage( UpdateManager& manager, OwnerPointer< SceneGraph::Animation >& animation ) { - typedef MessageValue1< UpdateManager, Animation* > LocalType; + using LocalType = MessageValue1 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::AddAnimation, animation ); @@ -786,10 +917,10 @@ inline void StopAnimationMessage( UpdateManager& manager, const Animation& const // The scene-graph thread owns this object so it can safely edit it. Animation& animation = const_cast< Animation& >( constAnimation ); - typedef MessageValue1< UpdateManager, Animation* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::StopAnimation, &animation ); @@ -800,21 +931,72 @@ inline void RemoveAnimationMessage( UpdateManager& manager, const Animation& con // The scene-graph thread owns this object so it can safely edit it. Animation& animation = const_cast< Animation& >( constAnimation ); - typedef MessageValue1< UpdateManager, Animation* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::RemoveAnimation, &animation ); } -inline void AddPropertyNotificationMessage( UpdateManager& manager, PropertyNotification* propertyNotification ) +inline void AddRenderTaskListMessage( UpdateManager& manager, OwnerPointer< SceneGraph::RenderTaskList >& taskList ) { - typedef MessageValue1< UpdateManager, PropertyNotification* > LocalType; + using LocalType = MessageValue1 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::AddRenderTaskList, taskList ); +} + +inline void RemoveRenderTaskListMessage( UpdateManager& manager, const RenderTaskList& constTaskList ) +{ + // The scene-graph thread owns this object so it can safely edit it. + RenderTaskList& taskList = const_cast< RenderTaskList& >( constTaskList ); + + using LocalType = MessageValue1; + + // Reserve some memory inside the message queue + uint32_t* 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::RemoveRenderTaskList, &taskList ); +} + +inline void AddSceneMessage( UpdateManager& manager, OwnerPointer< SceneGraph::Scene >& scene ) +{ + using LocalType = MessageValue1 >; + + // Reserve some memory inside the message queue + uint32_t* 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::AddScene, scene ); +} + +inline void RemoveSceneMessage( UpdateManager& manager, const SceneGraph::Scene& constScene ) +{ + // The scene-graph thread owns this object so it can safely edit it. + Scene& scene = const_cast< Scene& >( constScene ); + + using LocalType = MessageValue1; + + // Reserve some memory inside the message queue + uint32_t* 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::RemoveScene, &scene ); +} + +inline void AddPropertyNotificationMessage( UpdateManager& manager, OwnerPointer< PropertyNotification >& propertyNotification ) +{ + // Message has ownership of PropertyNotification while in transit from event -> update + using LocalType = MessageValue1 >; + + // Reserve some memory inside the message queue + uint32_t* 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::AddPropertyNotification, propertyNotification ); @@ -825,10 +1007,10 @@ inline void RemovePropertyNotificationMessage( UpdateManager& manager, const Pro // The scene-graph thread owns this object so it can safely edit it. PropertyNotification& propertyNotification = const_cast< PropertyNotification& >( constPropertyNotification ); - typedef MessageValue1< UpdateManager, PropertyNotification* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::RemovePropertyNotification, &propertyNotification ); @@ -841,301 +1023,307 @@ inline void PropertyNotificationSetNotifyModeMessage( UpdateManager& manager, // The scene-graph thread owns this object so it can safely edit it. PropertyNotification* propertyNotification = const_cast< PropertyNotification* >( constPropertyNotification ); - typedef MessageValue2< UpdateManager, PropertyNotification*, PropertyNotification::NotifyMode > LocalType; + using LocalType = MessageValue2; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::PropertyNotificationSetNotify, propertyNotification, notifyMode ); } // The render thread can safely change the Shader -inline void AddShaderMessage( UpdateManager& manager, Shader& shader ) +inline void AddShaderMessage( UpdateManager& manager, OwnerPointer< Shader >& shader ) { - typedef MessageValue1< UpdateManager, OwnerPointer< Shader > > LocalType; + using LocalType = MessageValue1 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::AddShader, &shader ); + new (slot) LocalType( &manager, &UpdateManager::AddShader, shader ); } // The render thread can safely change the Shader -inline void RemoveShaderMessage( UpdateManager& manager, Shader& shader ) +inline void RemoveShaderMessage( UpdateManager& manager, const Shader* shader ) { - typedef MessageValue1< UpdateManager, Shader* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::RemoveShader, &shader ); + new (slot) LocalType( &manager, &UpdateManager::RemoveShader, const_cast( shader ) ); } inline void SetShaderProgramMessage( UpdateManager& manager, - Shader& shader, + const Shader& shader, Internal::ShaderDataPtr shaderData, bool modifiesGeometry ) { - typedef MessageValue3< UpdateManager, Shader*, Internal::ShaderDataPtr, bool > LocalType; + using LocalType = MessageValue3; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::SetShaderProgram, &shader, shaderData, modifiesGeometry ); + new (slot) LocalType( &manager, &UpdateManager::SetShaderProgram, const_cast( &shader ), shaderData, modifiesGeometry ); } -inline void SetBackgroundColorMessage( UpdateManager& manager, const Vector4& color ) +inline void SetDefaultSurfaceRectMessage( UpdateManager& manager, const Rect& rect ) { - typedef MessageValue1< UpdateManager, Vector4 > LocalType; + using LocalType = MessageValue1 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::SetBackgroundColor, color ); + new (slot) LocalType( &manager, &UpdateManager::SetDefaultSurfaceRect, rect ); } -inline void SetDefaultSurfaceRectMessage( UpdateManager& manager, const Rect& rect ) +inline void SurfaceReplacedMessage( UpdateManager& manager, const SceneGraph::Scene& constScene ) { - typedef MessageValue1< UpdateManager, Rect > LocalType; + // The scene-graph thread owns this object so it can safely edit it. + Scene& scene = const_cast< Scene& >( constScene ); + + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::SetDefaultSurfaceRect, rect ); + new (slot) LocalType( &manager, &UpdateManager::SurfaceReplaced, &scene ); } inline void KeepRenderingMessage( UpdateManager& manager, float durationSeconds ) { - typedef MessageValue1< UpdateManager, float > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::KeepRendering, durationSeconds ); } -/** - * Create a message for setting the depth of a layer - * @param[in] manager The update manager - * @param[in] layers list of layers - * @param[in] systemLevel True if the layers are added via the SystemOverlay API - */ -inline void SetLayerDepthsMessage( UpdateManager& manager, const std::vector< Layer* >& layers, bool systemLevel ) +inline void SetRenderingBehaviorMessage( UpdateManager& manager, DevelStage::Rendering renderingBehavior ) { - typedef MessageValue2< UpdateManager, std::vector< Layer* >, bool > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::SetLayerDepths, layers, systemLevel ); + new (slot) LocalType( &manager, &UpdateManager::SetRenderingBehavior, renderingBehavior ); } -inline void AddGestureMessage( UpdateManager& manager, PanGesture* gesture ) +inline void RequestRenderingMessage( UpdateManager& manager ) { - typedef MessageValue1< UpdateManager, PanGesture* > LocalType; + using LocalType = Message; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::AddGesture, gesture ); + new (slot) LocalType( &manager, &UpdateManager::RequestRendering ); } -inline void RemoveGestureMessage( UpdateManager& manager, PanGesture* gesture ) +/** + * Create a message for setting the depth of a layer + * @param[in] manager The update manager + * @param[in] layers list of layers + * @param[in] rootLayer The rool layer + */ +inline void SetLayerDepthsMessage( UpdateManager& manager, const std::vector< Layer* >& layers, const Layer* rootLayer ) { - typedef MessageValue1< UpdateManager, PanGesture* > LocalType; + using LocalType = MessageValue2, const Layer*>; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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::RemoveGesture, gesture ); + new (slot) LocalType( &manager, &UpdateManager::SetLayerDepths, layers, rootLayer ); } -template< typename T > -inline void AddMessage( UpdateManager& manager, ObjectOwnerContainer& owner, T& object ) +inline void AddRendererMessage( UpdateManager& manager, OwnerPointer< Renderer >& object ) { - typedef MessageValue1< ObjectOwnerContainer, OwnerPointer< T > > LocalType; + using LocalType = MessageValue1 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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( &owner, &ObjectOwnerContainer::Add, &object ); + new (slot) LocalType( &manager, &UpdateManager::AddRenderer, object ); } -template< typename T > -inline void RemoveMessage( UpdateManager& manager, ObjectOwnerContainer& owner, T& object ) +inline void RemoveRendererMessage( UpdateManager& manager, const Renderer& object ) { - typedef MessageValue1< ObjectOwnerContainer, T* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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( &owner, &ObjectOwnerContainer::Remove, &object ); + new (slot) LocalType( &manager, &UpdateManager::RemoveRenderer, const_cast( &object ) ); } // The render thread can safely change the Shader -inline void AddTextureSetMessage( UpdateManager& manager, TextureSet& textureSet ) +inline void AddTextureSetMessage( UpdateManager& manager, OwnerPointer< TextureSet >& textureSet ) { - typedef MessageValue1< UpdateManager, OwnerPointer< TextureSet > > LocalType; + using LocalType = MessageValue1 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ); + 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; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ) +inline void AddSamplerMessage( UpdateManager& manager, OwnerPointer< Render::Sampler >& sampler ) { - typedef MessageValue1< UpdateManager, Render::Sampler* > LocalType; + // Message has ownership of Sampler while in transit from event -> update + using LocalType = MessageValue1 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ); + new (slot) LocalType( &manager, &UpdateManager::AddSampler, sampler ); } inline void RemoveSamplerMessage( UpdateManager& manager, Render::Sampler& sampler ) { - typedef MessageValue1< UpdateManager, Render::Sampler* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ) +inline void SetFilterModeMessage( UpdateManager& manager, Render::Sampler& sampler, uint32_t minFilterMode, uint32_t magFilterMode ) { - typedef MessageValue3< UpdateManager, Render::Sampler*, unsigned int, unsigned int > LocalType; + using LocalType = MessageValue3; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ) +inline void SetWrapModeMessage( UpdateManager& manager, Render::Sampler& sampler, uint32_t rWrapMode, uint32_t sWrapMode, uint32_t tWrapMode ) { - typedef MessageValue4< UpdateManager, Render::Sampler*, unsigned int, unsigned int, unsigned int > LocalType; + using LocalType = MessageValue4; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ) +inline void AddVertexBuffer( UpdateManager& manager, OwnerPointer< Render::VertexBuffer >& vertexBuffer ) { - typedef MessageValue1< UpdateManager, Render::PropertyBuffer* > LocalType; + // Message has ownership of vertexBuffer while in transit from event -> update + using LocalType = MessageValue1 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ); + new (slot) LocalType( &manager, &UpdateManager::AddVertexBuffer, vertexBuffer ); } -inline void RemovePropertyBuffer( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer ) +inline void RemoveVertexBuffer( UpdateManager& manager, Render::VertexBuffer& vertexBuffer ) { - typedef MessageValue1< UpdateManager, Render::PropertyBuffer* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ); + new (slot) LocalType( &manager, &UpdateManager::RemoveVertexBuffer, &vertexBuffer ); } -inline void SetPropertyBufferFormat( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer, Render::PropertyBuffer::Format* format ) +inline void SetVertexBufferFormat( UpdateManager& manager, Render::VertexBuffer& vertexBuffer, OwnerPointer< Render::VertexBuffer::Format>& format ) { - typedef MessageValue2< UpdateManager, Render::PropertyBuffer*, Render::PropertyBuffer::Format* > LocalType; + // Message has ownership of VertexBuffer::Format while in transit from event -> update + using LocalType = MessageValue2 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ); + new (slot) LocalType( &manager, &UpdateManager::SetVertexBufferFormat, &vertexBuffer, format ); } -inline void SetPropertyBufferData( UpdateManager& manager, Render::PropertyBuffer& propertyBuffer, Vector* data, size_t size ) +inline void SetVertexBufferData( UpdateManager& manager, Render::VertexBuffer& vertexBuffer, OwnerPointer< Vector >& data, uint32_t size ) { - typedef MessageValue3< UpdateManager, Render::PropertyBuffer*, Vector*, size_t > LocalType; + // Message has ownership of VertexBuffer data while in transit from event -> update + using LocalType = MessageValue3 >, uint32_t>; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ); + new (slot) LocalType( &manager, &UpdateManager::SetVertexBufferData, &vertexBuffer, data, size ); } -inline void AddGeometry( UpdateManager& manager, Render::Geometry& geometry ) +inline void AddGeometry( UpdateManager& manager, OwnerPointer< Render::Geometry >& geometry ) { - typedef MessageValue1< UpdateManager, Render::Geometry* > LocalType; + // Message has ownership of Geometry while in transit from event -> update + using LocalType = MessageValue1 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ); + new (slot) LocalType( &manager, &UpdateManager::AddGeometry, geometry ); } inline void RemoveGeometry( UpdateManager& manager, Render::Geometry& geometry ) { - typedef MessageValue1< UpdateManager, Render::Geometry* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ) +inline void AttachVertexBufferMessage( UpdateManager& manager, Render::Geometry& geometry, const Render::VertexBuffer& vertexBuffer ) { - typedef MessageValue2< UpdateManager, Render::Geometry*, Render::PropertyBuffer* > LocalType; + using LocalType = MessageValue2; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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) ); + new (slot) LocalType( &manager, &UpdateManager::AttachVertexBuffer, &geometry, const_cast(&vertexBuffer) ); } -inline void RemoveVertexBufferMessage( UpdateManager& manager, Render::Geometry& geometry, const Render::PropertyBuffer& vertexBuffer ) +inline void RemoveVertexBufferMessage( UpdateManager& manager, Render::Geometry& geometry, const Render::VertexBuffer& vertexBuffer ) { - typedef MessageValue2< UpdateManager, Render::Geometry*, Render::PropertyBuffer* > LocalType; + using LocalType = MessageValue2; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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) ); + new (slot) LocalType( &manager, &UpdateManager::RemoveVertexBuffer, &geometry, const_cast(&vertexBuffer) ); } // Custom message type for SetIndexBuffer() used to move data with Vector::Swap() @@ -1147,7 +1335,7 @@ public: /** * Constructor which does a Vector::Swap() */ - IndexBufferMessage( T* manager, Render::Geometry* geometry, Dali::Vector& indices ) + IndexBufferMessage( T* manager, Render::Geometry* geometry, Dali::Vector& indices ) : MessageBase(), mManager( manager ), mRenderGeometry( geometry ) @@ -1158,14 +1346,12 @@ public: /** * Virtual destructor */ - virtual ~IndexBufferMessage() - { - } + ~IndexBufferMessage() override = default; /** * @copydoc MessageBase::Process */ - virtual void Process( BufferIndex /*bufferIndex*/ ) + void Process( BufferIndex /*bufferIndex*/ ) override { DALI_ASSERT_DEBUG( mManager && "Message does not have an object" ); mManager->SetIndexBuffer( mRenderGeometry, mIndices ); @@ -1175,109 +1361,175 @@ private: T* mManager; Render::Geometry* mRenderGeometry; - Dali::Vector mIndices; + Dali::Vector mIndices; }; -inline void SetIndexBufferMessage( UpdateManager& manager, Render::Geometry& geometry, Dali::Vector& indices ) +inline void SetIndexBufferMessage( UpdateManager& manager, Render::Geometry& geometry, Dali::Vector& indices ) { - typedef IndexBufferMessage< UpdateManager > LocalType; + using LocalType = IndexBufferMessage; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ) +inline void SetGeometryTypeMessage( UpdateManager& manager, Render::Geometry& geometry, uint32_t geometryType ) { - typedef MessageValue2< UpdateManager, Render::Geometry*, unsigned int > LocalType; + using LocalType = MessageValue2; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ) +inline void AddTexture( UpdateManager& manager, OwnerPointer< Render::Texture >& texture ) { - typedef MessageValue1< UpdateManager, Render::NewTexture* > LocalType; + // Message has ownership of Texture while in transit from event -> update + using LocalType = MessageValue1 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ); + new (slot) LocalType( &manager, &UpdateManager::AddTexture, texture ); } -inline void RemoveTexture( UpdateManager& manager, Render::NewTexture& texture ) +inline void RemoveTexture( UpdateManager& manager, Render::Texture& texture ) { - typedef MessageValue1< UpdateManager, Render::NewTexture* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ) +inline void UploadTextureMessage( UpdateManager& manager, Render::Texture& texture, PixelDataPtr pixelData, const Texture::UploadParams& params ) { - typedef MessageValue3< UpdateManager, Render::NewTexture*, PixelDataPtr, NewTexture::UploadParams > LocalType; + using LocalType = MessageValue3; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ) +inline void GenerateMipmapsMessage( UpdateManager& manager, Render::Texture& texture ) { - typedef MessageValue1< UpdateManager, Render::NewTexture* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ) +inline void AddFrameBuffer( UpdateManager& manager, OwnerPointer< Render::FrameBuffer >& frameBuffer ) { - typedef MessageValue1< UpdateManager, Render::FrameBuffer* > LocalType; + using LocalType = MessageValue1 >; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ); + new (slot) LocalType( &manager, &UpdateManager::AddFrameBuffer, frameBuffer ); } inline void RemoveFrameBuffer( UpdateManager& manager, Render::FrameBuffer& frameBuffer ) { - typedef MessageValue1< UpdateManager, Render::FrameBuffer* > LocalType; + using LocalType = MessageValue1; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ) +inline void AttachColorTextureToFrameBuffer( UpdateManager& manager, Render::FrameBuffer& frameBuffer, Render::Texture* texture, uint32_t mipmapLevel, uint32_t layer ) { - typedef MessageValue4< UpdateManager, Render::FrameBuffer*, Render::NewTexture*, unsigned int, unsigned int > LocalType; + using LocalType = MessageValue4; // Reserve some memory inside the message queue - unsigned int* slot = manager.ReserveMessageSlot( sizeof( LocalType ) ); + uint32_t* 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 ); } +inline void AttachDepthTextureToFrameBuffer( UpdateManager& manager, Render::FrameBuffer& frameBuffer, Render::Texture* texture, uint32_t mipmapLevel ) +{ + using LocalType = MessageValue3; + + // Reserve some memory inside the message queue + uint32_t* 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::AttachDepthTextureToFrameBuffer, &frameBuffer, texture, mipmapLevel ); +} + +inline void AttachDepthStencilTextureToFrameBuffer( UpdateManager& manager, Render::FrameBuffer& frameBuffer, Render::Texture* texture, uint32_t mipmapLevel ) +{ + using LocalType = MessageValue3; + + // Reserve some memory inside the message queue + uint32_t* 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::AttachDepthStencilTextureToFrameBuffer, &frameBuffer, texture, mipmapLevel ); +} + +inline void SetDepthIndicesMessage( UpdateManager& manager, OwnerPointer< NodeDepths >& nodeDepths ) +{ + using LocalType = MessageValue1 >; + + // Reserve some memory inside the message queue + uint32_t* 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::SetDepthIndices, nodeDepths ); +} + +inline void AddResetterMessage( UpdateManager& manager, OwnerPointer resetter ) +{ + using LocalType = MessageValue1 >; + + // Reserve some memory inside the message queue + uint32_t* 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::AddPropertyResetter, resetter ); +} + +inline void AddFrameCallbackMessage( UpdateManager& manager, OwnerPointer< FrameCallback >& frameCallback, const Node& rootNode ) +{ + using LocalType = MessageValue2, const Node*>; + + // Reserve some memory inside the message queue + uint32_t* 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::AddFrameCallback, frameCallback, &rootNode ); +} + +inline void RemoveFrameCallbackMessage( UpdateManager& manager, FrameCallbackInterface& frameCallback ) +{ + using LocalType = MessageValue1; + + // Reserve some memory inside the message queue + uint32_t* 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::RemoveFrameCallback, &frameCallback ); +} } // namespace SceneGraph