From cec330acef135802c7bd8952b56afa7c8cb963c1 Mon Sep 17 00:00:00 2001 From: David Steele Date: Thu, 3 May 2018 15:47:32 +0100 Subject: [PATCH] Moved framebuffer messages from UpdateManager to FrameBuffer Cleaned up messages and updated renderer to ensure consistency across all scene graph objects. UpdateManager now no longer does any graphics related logic - this is now farmed out to the right objects in scene graph Change-Id: I00420a4c1868eba0fe8f61c4c55a1e2d50233ddb Signed-off-by: David Steele --- .../internal/event/rendering/frame-buffer-impl.cpp | 7 +- dali/internal/event/rendering/geometry-impl.cpp | 4 +- dali/internal/update/manager/update-manager.cpp | 35 +--- dali/internal/update/manager/update-manager.h | 125 ++--------- .../update/rendering/scene-graph-frame-buffer.cpp | 10 +- .../update/rendering/scene-graph-frame-buffer.h | 22 ++ .../update/rendering/scene-graph-geometry.cpp | 3 +- .../update/rendering/scene-graph-renderer.cpp | 231 ++++++--------------- .../update/rendering/scene-graph-renderer.h | 25 ++- 9 files changed, 151 insertions(+), 311 deletions(-) diff --git a/dali/internal/event/rendering/frame-buffer-impl.cpp b/dali/internal/event/rendering/frame-buffer-impl.cpp index a1d43d8..0708095 100644 --- a/dali/internal/event/rendering/frame-buffer-impl.cpp +++ b/dali/internal/event/rendering/frame-buffer-impl.cpp @@ -54,7 +54,8 @@ FrameBuffer::FrameBuffer( unsigned int width, unsigned int height, unsigned int void FrameBuffer::Initialize() { mRenderObject = new SceneGraph::FrameBuffer( mWidth, mHeight, mAttachments ); - AddFrameBuffer( mEventThreadServices.GetUpdateManager(), *mRenderObject ); + OwnerPointer< SceneGraph::FrameBuffer > transferOwnership( mRenderObject ); + AddFrameBufferMessage( mEventThreadServices.GetUpdateManager(), transferOwnership ); } void FrameBuffer::AttachColorTexture( TexturePtr texture, unsigned int mipmapLevel, unsigned int layer ) @@ -63,7 +64,7 @@ void FrameBuffer::AttachColorTexture( TexturePtr texture, unsigned int mipmapLev ( texture->GetHeight() / ( 1u << mipmapLevel ) == mHeight ) ) { mColor = texture; - AttachColorTextureToFrameBuffer( mEventThreadServices.GetUpdateManager(), *mRenderObject, texture->GetRenderObject(), mipmapLevel, layer ); + AttachColorTextureMessage( mEventThreadServices, *mRenderObject, texture->GetRenderObject(), mipmapLevel, layer ); } else { @@ -80,7 +81,7 @@ FrameBuffer::~FrameBuffer() { if( EventThreadServices::IsCoreRunning() && mRenderObject ) { - RemoveFrameBuffer( mEventThreadServices.GetUpdateManager(), *mRenderObject ); + RemoveFrameBufferMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject ); } } diff --git a/dali/internal/event/rendering/geometry-impl.cpp b/dali/internal/event/rendering/geometry-impl.cpp index 1c2fe32..9903023 100644 --- a/dali/internal/event/rendering/geometry-impl.cpp +++ b/dali/internal/event/rendering/geometry-impl.cpp @@ -99,14 +99,14 @@ void Geometry::Initialize() { mRenderObject = new SceneGraph::Geometry(); OwnerPointer< SceneGraph::Geometry > transferOwnership( mRenderObject ); - AddGeometry( mEventThreadServices.GetUpdateManager(), transferOwnership ); + AddGeometryMessage( mEventThreadServices.GetUpdateManager(), transferOwnership ); } Geometry::~Geometry() { if( EventThreadServices::IsCoreRunning() && mRenderObject ) { - RemoveGeometry( mEventThreadServices.GetUpdateManager(), *mRenderObject ); + RemoveGeometryMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject ); } } diff --git a/dali/internal/update/manager/update-manager.cpp b/dali/internal/update/manager/update-manager.cpp index 6a71316..780e08f 100644 --- a/dali/internal/update/manager/update-manager.cpp +++ b/dali/internal/update/manager/update-manager.cpp @@ -291,12 +291,11 @@ struct UpdateManager::Impl OwnerContainer< Renderer* > renderers; ///< A container of owned renderers OwnerContainer< TextureSet* > textureSets; ///< A container of owned texture sets OwnerContainer< Shader* > shaders; ///< A container of owned shaders - - OwnerContainer< SceneGraph::Sampler* > samplerContainer; ///< List of owned samplers - OwnerContainer< SceneGraph::Texture* > textureContainer; ///< List of owned textures - OwnerContainer< SceneGraph::FrameBuffer* > frameBufferContainer; ///< List of owned framebuffers - OwnerContainer< SceneGraph::PropertyBuffer* > propertyBufferContainer; ///< List of owned property buffers - OwnerContainer< SceneGraph::Geometry* > geometryContainer; ///< List of owned Geometries + OwnerContainer< Sampler* > samplerContainer; ///< A container of owned samplers + OwnerContainer< Texture* > textureContainer; ///< A container of owned textures + OwnerContainer< FrameBuffer* > frameBufferContainer; ///< A container of owned framebuffers + OwnerContainer< PropertyBuffer* > propertyBufferContainer; ///< A container of owned property buffers + OwnerContainer< Geometry* > geometryContainer; ///< A container of owned Geometries OwnerPointer< PanGesture > panGestureProcessor; ///< Owned pan gesture processor; it lives for the lifecycle of UpdateManager @@ -362,7 +361,6 @@ void UpdateManager::InstallRoot( OwnerPointer& layer, bool systemLevel ) mImpl->systemLevelRoot->CreateTransform( &mImpl->transformManager ); mImpl->systemLevelRoot->SetRoot(true); } - } void UpdateManager::AddNode( OwnerPointer& node ) @@ -514,7 +512,7 @@ void UpdateManager::RemoveShader( Shader* shader ) void UpdateManager::AddRenderer( OwnerPointer< Renderer >& renderer ) { - renderer->ConnectToSceneGraph( mSceneGraphBuffers.GetUpdateBufferIndex() ); + renderer->Initialize( mImpl->graphics ); mImpl->renderers.PushBack( renderer.Release() ); mImpl->renderersAdded = true; } @@ -524,7 +522,6 @@ void UpdateManager::RemoveRenderer( Renderer* renderer ) // Find the renderer and destroy it // @todo Don't need to use discard queue for SceneGraph::Renderer any more ( No dependency from Graphics::RenderCommand ) EraseUsingDiscardQueue( mImpl->renderers, renderer, mImpl->discardQueue, mSceneGraphBuffers.GetUpdateBufferIndex() ); - renderer->DisconnectFromSceneGraph( mSceneGraphBuffers.GetUpdateBufferIndex() ); } void UpdateManager::SetPanGestureProcessor( PanGesture* panGestureProcessor ) @@ -724,7 +721,7 @@ void UpdateManager::UpdateRenderers( BufferIndex bufferIndex ) //Apply constraints ConstrainPropertyOwner( *mImpl->renderers[i], bufferIndex ); - mImpl->renderers[i]->PrepareRender( mImpl->graphics.GetController(), bufferIndex ); + mImpl->renderers[i]->PrepareRender( bufferIndex ); } } @@ -1029,17 +1026,16 @@ void UpdateManager::RemoveTexture( SceneGraph::Texture* texture) { if ( iter == texture ) { - //texture->Destroy(); //@todo Do something in Gfx? mImpl->textureContainer.Erase( &iter ); // Texture found; now destroy it return; } } } -void UpdateManager::AddFrameBuffer( SceneGraph::FrameBuffer* frameBuffer ) +void UpdateManager::AddFrameBuffer( OwnerPointer< SceneGraph::FrameBuffer>& frameBuffer ) { - mImpl->frameBufferContainer.PushBack( frameBuffer ); - //frameBuffer->Initialize(); @todo Rewrite for Gfx + frameBuffer->Initialize( mImpl->graphics ); + mImpl->frameBufferContainer.PushBack( frameBuffer.Release() ); } void UpdateManager::RemoveFrameBuffer( SceneGraph::FrameBuffer* frameBuffer) @@ -1051,23 +1047,12 @@ void UpdateManager::RemoveFrameBuffer( SceneGraph::FrameBuffer* frameBuffer) { if ( iter == frameBuffer ) { - //frameBuffer->Destroy(); @todo Rewrite for Gfx mImpl->frameBufferContainer.Erase( &iter ); // frameBuffer found; now destroy it break; } } } -void UpdateManager::AttachColorTextureToFrameBuffer( SceneGraph::FrameBuffer* frameBuffer, SceneGraph::Texture* texture, unsigned int mipmapLevel, unsigned int layer ) -{ - //frameBuffer->AttachColorTexture( mImpl->context, texture, mipmapLevel, layer ); @todo Rewrite for Gfx - DALI_ASSERT_ALWAYS( true && "GRAPHICS: FIXME" ); -} - -Graphics::API::Controller& UpdateManager::GetGraphicsController() const -{ - return mImpl->graphics.GetController(); -} } // namespace SceneGraph diff --git a/dali/internal/update/manager/update-manager.h b/dali/internal/update/manager/update-manager.h index c60f6a0..08b27b2 100644 --- a/dali/internal/update/manager/update-manager.h +++ b/dali/internal/update/manager/update-manager.h @@ -81,11 +81,8 @@ namespace SceneGraph class Animation; class DiscardQueue; -class RenderManager; class RenderTaskList; class RenderTaskProcessor; -class RenderQueue; -class PropertyBuffer; /** @@ -346,133 +343,70 @@ public: bool FlushQueue(); /** - * Add a new sampler to RenderManager + * Add a new sampler to Update Manager * @param[in] sampler The sampler to add - * @post Sends a message to RenderManager to add the sampler. - * The sampler will be owned by RenderManager + * The sampler will be owned by UpdateManager */ void AddSampler( OwnerPointer< SceneGraph::Sampler >& sampler ); /** - * Removes an existing sampler from RenderManager + * Removes an existing sampler from UpdateManager * @param[in] sampler The sampler to remove - * @post The sampler will be destroyed in the render thread */ void RemoveSampler( SceneGraph::Sampler* sampler ); /** - * Add a new property buffer to RenderManager + * Add a new property buffer to UpdateManager * @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 + * The property buffer will be owned by UpdateManager */ void AddPropertyBuffer( OwnerPointer< SceneGraph::PropertyBuffer >& propertyBuffer ); /** - * Removes an existing PropertyBuffer from RenderManager + * Removes an existing PropertyBuffer from UpdateManager * @param[in] propertryBuffer The property buffer to remove - * @post The property buffer will be destroyed in the render thread */ void RemovePropertyBuffer( SceneGraph::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( SceneGraph::PropertyBuffer* propertyBuffer, OwnerPointer< SceneGraph::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( SceneGraph::PropertyBuffer* propertyBuffer, OwnerPointer< Vector >& data, size_t size ); - - /** - * Adds a geometry to the RenderManager + * Adds a geometry to the UpdateManager * @param[in] geometry The geometry to add - * @post Sends a message to RenderManager to add the Geometry - * The geometry will be owned by RenderManager + * The geometry will be owned by UpdateManager */ void AddGeometry( OwnerPointer< SceneGraph::Geometry >& geometry ); /** - * Removes an existing Geometry from RenderManager + * Removes an existing Geometry from UpdateManager * @param[in] geometry The geometry to remove - * @post The geometry will be destroyed in the render thread */ void RemoveGeometry( SceneGraph::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( SceneGraph::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( SceneGraph::Geometry* geometry, Dali::Vector& indices ); - - /** - * Adds a vertex buffer to a geometry - * @param[in] geometry The geometry - * @param[in] propertyBuffer The property buffer - */ - void AttachVertexBuffer( SceneGraph::Geometry* geometry, SceneGraph::PropertyBuffer* propertyBuffer ); - - /** - * Removes a vertex buffer from a geometry - * @param[in] geometry The geometry - * @param[in] propertyBuffer The property buffer - */ - void RemoveVertexBuffer( SceneGraph::Geometry* geometry, SceneGraph::PropertyBuffer* propertyBuffer ); - - /** - * Adds a texture to the render manager + * Adds a texture to the update manager * @param[in] texture The texture to add - * The texture will be owned by RenderManager + * The texture will be owned by UpdateManager */ void AddTexture( OwnerPointer< SceneGraph::Texture >& texture ); /** - * Removes a texture from the render manager + * Removes a texture from the update manager * @param[in] texture The texture to remove - * @post The texture will be destroyed in the render thread */ void RemoveTexture( SceneGraph::Texture* texture ); /** - * Adds a framebuffer to the render manager + * Adds a framebuffer to the update manager * @param[in] frameBuffer The framebuffer to add - * The framebuffer will be owned by RenderManager + * The framebuffer will be owned by UpdateManager */ - void AddFrameBuffer( SceneGraph::FrameBuffer* frameBuffer ); + void AddFrameBuffer( OwnerPointer& frameBuffer ); /** - * Removes a FrameBuffer from the render manager + * Removes a FrameBuffer from the update manager * @param[in] frameBuffer The FrameBuffer to remove - * @post The FrameBuffer will be destroyed in the render thread */ void RemoveFrameBuffer( SceneGraph::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( SceneGraph::FrameBuffer* frameBuffer, SceneGraph::Texture* texture, unsigned int mipmapLevel, unsigned int face ); - - Graphics::API::Controller& GetGraphicsController() const; public: @@ -805,7 +739,6 @@ inline void PropertyNotificationSetNotifyModeMessage( UpdateManager& manager, new (slot) LocalType( &manager, &UpdateManager::PropertyNotificationSetNotify, propertyNotification, notifyMode ); } -// The render thread can safely change the Shader inline void AddShaderMessage( UpdateManager& manager, OwnerPointer< Shader >& shader ) { typedef MessageValue1< UpdateManager, OwnerPointer< Shader > > LocalType; @@ -817,7 +750,6 @@ inline void AddShaderMessage( UpdateManager& manager, OwnerPointer< Shader >& sh new (slot) LocalType( &manager, &UpdateManager::AddShader, shader ); } -// The render thread can safely change the Shader inline void RemoveShaderMessage( UpdateManager& manager, Shader& shader ) { typedef MessageValue1< UpdateManager, Shader* > LocalType; @@ -911,7 +843,6 @@ inline void AddTextureSetMessage( UpdateManager& manager, OwnerPointer< TextureS 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; @@ -969,7 +900,7 @@ inline void RemovePropertyBuffer( UpdateManager& manager, SceneGraph::PropertyBu new (slot) LocalType( &manager, &UpdateManager::RemovePropertyBuffer, &propertyBuffer ); } -inline void AddGeometry( UpdateManager& manager, OwnerPointer< SceneGraph::Geometry >& geometry ) +inline void AddGeometryMessage( UpdateManager& manager, OwnerPointer< SceneGraph::Geometry >& geometry ) { // Message has ownership of Geometry while in transit from event -> update typedef MessageValue1< UpdateManager, OwnerPointer< SceneGraph::Geometry > > LocalType; @@ -981,7 +912,7 @@ inline void AddGeometry( UpdateManager& manager, OwnerPointer< SceneGraph::Geome new (slot) LocalType( &manager, &UpdateManager::AddGeometry, geometry ); } -inline void RemoveGeometry( UpdateManager& manager, SceneGraph::Geometry& geometry ) +inline void RemoveGeometryMessage( UpdateManager& manager, SceneGraph::Geometry& geometry ) { typedef MessageValue1< UpdateManager, SceneGraph::Geometry* > LocalType; @@ -1015,19 +946,18 @@ inline void RemoveTextureMessage( UpdateManager& manager, SceneGraph::Texture& t new (slot) LocalType( &manager, &UpdateManager::RemoveTexture, &texture ); } - -inline void AddFrameBuffer( UpdateManager& manager, SceneGraph::FrameBuffer& frameBuffer ) +inline void AddFrameBufferMessage( UpdateManager& manager, OwnerPointer& frameBuffer ) { - typedef MessageValue1< UpdateManager, SceneGraph::FrameBuffer* > LocalType; + typedef MessageValue1< UpdateManager, OwnerPointer > 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 ); + new (slot) LocalType( &manager, &UpdateManager::AddFrameBuffer, frameBuffer ); } -inline void RemoveFrameBuffer( UpdateManager& manager, SceneGraph::FrameBuffer& frameBuffer ) +inline void RemoveFrameBufferMessage( UpdateManager& manager, SceneGraph::FrameBuffer& frameBuffer ) { typedef MessageValue1< UpdateManager, SceneGraph::FrameBuffer* > LocalType; @@ -1038,17 +968,6 @@ inline void RemoveFrameBuffer( UpdateManager& manager, SceneGraph::FrameBuffer& new (slot) LocalType( &manager, &UpdateManager::RemoveFrameBuffer, &frameBuffer ); } -inline void AttachColorTextureToFrameBuffer( UpdateManager& manager, SceneGraph::FrameBuffer& frameBuffer, SceneGraph::Texture* texture, unsigned int mipmapLevel, unsigned int layer ) -{ - typedef MessageValue4< UpdateManager, SceneGraph::FrameBuffer*, SceneGraph::Texture*, 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 ); -} - inline void SetDepthIndicesMessage( UpdateManager& manager, OwnerPointer< NodeDepths >& nodeDepths ) { typedef MessageValue1< UpdateManager, OwnerPointer< NodeDepths > > LocalType; diff --git a/dali/internal/update/rendering/scene-graph-frame-buffer.cpp b/dali/internal/update/rendering/scene-graph-frame-buffer.cpp index 1be69e8..7560457 100644 --- a/dali/internal/update/rendering/scene-graph-frame-buffer.cpp +++ b/dali/internal/update/rendering/scene-graph-frame-buffer.cpp @@ -28,8 +28,9 @@ namespace SceneGraph { FrameBuffer::FrameBuffer( unsigned int width, unsigned int height, unsigned int attachments ) -: mWidth( width ), - mHeight( height ) +: mGraphics( nullptr ), + mWidth( width ), + mHeight( height ) { } @@ -37,6 +38,11 @@ FrameBuffer::~FrameBuffer() { } +void FrameBuffer::Initialize( Integration::Graphics::Graphics& graphics ) +{ + mGraphics = &graphics; +} + void FrameBuffer::AttachColorTexture( SceneGraph::Texture* texture, unsigned int mipmapLevel, unsigned int layer ) { } diff --git a/dali/internal/update/rendering/scene-graph-frame-buffer.h b/dali/internal/update/rendering/scene-graph-frame-buffer.h index 11f66df..a16b217 100644 --- a/dali/internal/update/rendering/scene-graph-frame-buffer.h +++ b/dali/internal/update/rendering/scene-graph-frame-buffer.h @@ -47,6 +47,13 @@ public: ~FrameBuffer(); /** + * Initialize the frame buffer object with the Graphics API when added to UpdateManager + * + * @param[in] graphics The Graphics API + */ + void Initialize( Integration::Graphics::Graphics& graphics ); + + /** * @brief Attach a texture for color rendering. Valid only for Framebuffers with COLOR attachments. * param[in] context The GL context * @param[in] texture The texture that will be used as output when rendering @@ -68,11 +75,26 @@ public: unsigned int GetHeight() const; private: + Integration::Graphics::Graphics* mGraphics; ///< Graphics interface object unsigned int mWidth; unsigned int mHeight; }; +inline void AttachColorTextureMessage( EventThreadServices& eventThreadServices, + SceneGraph::FrameBuffer& frameBuffer, + SceneGraph::Texture* texture, + unsigned int mipmapLevel, + unsigned int layer ) +{ + typedef MessageValue3< SceneGraph::FrameBuffer, SceneGraph::Texture*, unsigned int, unsigned int > LocalType; + + // Reserve some memory inside the message queue + unsigned int* slot = eventThreadServices.ReserveMessageSlot( sizeof( LocalType ), false ); + + // Construct message in the message queue memory; note that delete should not be called on the return value + new (slot) LocalType( &frameBuffer, &FrameBuffer::AttachColorTexture, texture, mipmapLevel, layer ); +} } // namespace SceneGraph diff --git a/dali/internal/update/rendering/scene-graph-geometry.cpp b/dali/internal/update/rendering/scene-graph-geometry.cpp index ecc9533..2be9653 100644 --- a/dali/internal/update/rendering/scene-graph-geometry.cpp +++ b/dali/internal/update/rendering/scene-graph-geometry.cpp @@ -30,7 +30,8 @@ namespace SceneGraph { Geometry::Geometry() -: mIndices(), +: mGraphics( nullptr ), + mIndices(), mGeometryType( Dali::Geometry::TRIANGLES ), mIndicesChanged(false), mHasBeenUpdated(false), diff --git a/dali/internal/update/rendering/scene-graph-renderer.cpp b/dali/internal/update/rendering/scene-graph-renderer.cpp index f0ef54a..abf4281 100644 --- a/dali/internal/update/rendering/scene-graph-renderer.cpp +++ b/dali/internal/update/rendering/scene-graph-renderer.cpp @@ -118,31 +118,6 @@ void AddMappings( Dali::Internal::SceneGraph::CollectedUniformMap& localMap, con } } -// Flags for re-sending data to renderer. -enum Flags -{ - RESEND_DATA_PROVIDER = 1 << 0, - RESEND_GEOMETRY = 1 << 1, - RESEND_FACE_CULLING_MODE = 1 << 2, - RESEND_BLEND_COLOR = 1 << 3, - RESEND_BLEND_BIT_MASK = 1 << 4, - RESEND_PREMULTIPLIED_ALPHA = 1 << 5, - RESEND_INDEXED_DRAW_FIRST_ELEMENT = 1 << 6, - RESEND_INDEXED_DRAW_ELEMENTS_COUNT = 1 << 7, - RESEND_DEPTH_WRITE_MODE = 1 << 8, - RESEND_DEPTH_TEST_MODE = 1 << 9, - RESEND_DEPTH_FUNCTION = 1 << 10, - RESEND_RENDER_MODE = 1 << 11, - RESEND_STENCIL_FUNCTION = 1 << 12, - RESEND_STENCIL_FUNCTION_MASK = 1 << 13, - RESEND_STENCIL_FUNCTION_REFERENCE = 1 << 14, - RESEND_STENCIL_MASK = 1 << 15, - RESEND_STENCIL_OPERATION_ON_FAIL = 1 << 16, - RESEND_STENCIL_OPERATION_ON_Z_FAIL = 1 << 17, - RESEND_STENCIL_OPERATION_ON_Z_PASS = 1 << 18, - RESEND_WRITE_TO_COLOR_BUFFER = 1 << 19, -}; - } // Anonymous namespace namespace Dali @@ -158,7 +133,8 @@ Renderer* Renderer::New() } Renderer::Renderer() -: mRenderDataProvider(), +: mGraphics( nullptr ), + mRenderDataProvider(), mTextureSet( NULL ), mGeometry( NULL ), mShader( NULL ), @@ -168,7 +144,6 @@ Renderer::Renderer() mIndexedDrawElementsCount( 0u ), mBlendBitmask( 0u ), mRegenerateUniformMap( 0u ), - mResendFlag( 0u ), mDepthFunction( DepthFunction::LESS ), mFaceCullingMode( FaceCullingMode::NONE ), mBlendMode( BlendMode::AUTO ), @@ -204,6 +179,30 @@ void Renderer::operator delete( void* ptr ) gRendererMemoryPool.FreeThreadSafe( static_cast( ptr ) ); } +void Renderer::Initialize( Integration::Graphics::Graphics& graphics ) +{ + mGraphics = &graphics; + + mRegenerateUniformMap = REGENERATE_UNIFORM_MAP; + + mRenderDataProvider = std::make_unique< RenderDataProvider >(); + + mRenderDataProvider->mUniformMapDataProvider = this; + mRenderDataProvider->mShader = mShader; + + if( mTextureSet ) + { + size_t textureCount = mTextureSet->GetTextureCount(); + mRenderDataProvider->mTextures.resize( textureCount ); + mRenderDataProvider->mSamplers.resize( textureCount ); + for( unsigned int i(0); imTextures[i] = mTextureSet->GetTexture(i); + mRenderDataProvider->mSamplers[i] = mTextureSet->GetTextureSampler(i); + } + } +} + void* AllocateUniformBufferMemory( size_t size ) { @@ -211,9 +210,48 @@ void* AllocateUniformBufferMemory( size_t size ) } +void Renderer::UpdateUniformMap( BufferIndex updateBufferIndex ) +{ + + if( mRegenerateUniformMap > UNIFORM_MAP_READY ) + { + if( mRegenerateUniformMap == REGENERATE_UNIFORM_MAP) + { + CollectedUniformMap& localMap = mCollectedUniformMap[ updateBufferIndex ]; + localMap.Resize(0); + + const UniformMap& rendererUniformMap = PropertyOwner::GetUniformMap(); + AddMappings( localMap, rendererUniformMap ); + + if( mShader ) + { + AddMappings( localMap, mShader->GetUniformMap() ); + } + } + else if( mRegenerateUniformMap == COPY_UNIFORM_MAP ) + { + // Copy old map into current map + CollectedUniformMap& localMap = mCollectedUniformMap[ updateBufferIndex ]; + CollectedUniformMap& oldMap = mCollectedUniformMap[ 1-updateBufferIndex ]; + + localMap.Resize( oldMap.Count() ); + + unsigned int index=0; + for( CollectedUniformMap::Iterator iter = oldMap.Begin(), end = oldMap.End() ; iter != end ; ++iter, ++index ) + { + localMap[index] = *iter; + } + } + + mUniformMapChanged[updateBufferIndex] = true; + mRegenerateUniformMap--; + } +} -void Renderer::PrepareRender( Graphics::API::Controller& controller, BufferIndex updateBufferIndex ) +void Renderer::PrepareRender( BufferIndex updateBufferIndex ) { + auto& controller = mGraphics->GetController(); + // prepare all stuff auto gfxShader = mShader->GetGfxObject(); @@ -249,42 +287,7 @@ void Renderer::PrepareRender( Graphics::API::Controller& controller, BufferIndex } } - /** - * REGENERATE UNIFORM MAP - */ - if( mRegenerateUniformMap > UNIFORM_MAP_READY ) - { - if( mRegenerateUniformMap == REGENERATE_UNIFORM_MAP) - { - CollectedUniformMap& localMap = mCollectedUniformMap[ updateBufferIndex ]; - localMap.Resize(0); - - const UniformMap& rendererUniformMap = PropertyOwner::GetUniformMap(); - AddMappings( localMap, rendererUniformMap ); - - if( mShader ) - { - AddMappings( localMap, mShader->GetUniformMap() ); - } - } - else if( mRegenerateUniformMap == COPY_UNIFORM_MAP ) - { - // Copy old map into current map - CollectedUniformMap& localMap = mCollectedUniformMap[ updateBufferIndex ]; - CollectedUniformMap& oldMap = mCollectedUniformMap[ 1-updateBufferIndex ]; - - localMap.Resize( oldMap.Count() ); - - unsigned int index = 0; - for( CollectedUniformMap::Iterator iter = oldMap.Begin(), end = oldMap.End() ; iter != end ; ++iter, ++index ) - { - localMap[index] = *iter; - } - } - - mUniformMapChanged[updateBufferIndex] = true; - mRegenerateUniformMap--; - } + UpdateUniformMap( updateBufferIndex ); auto& shader = mShader->GetGfxObject().Get(); auto uboCount = shader.GetUniformBlockCount(); @@ -292,7 +295,7 @@ void Renderer::PrepareRender( Graphics::API::Controller& controller, BufferIndex auto pushConstantsBindings = Graphics::API::RenderCommand::NewPushConstantsBindings( uboCount ); // allocate new command ( may be not necessary at all ) - // mGfxRenderCommand = Graphics::API::RenderCommandBuilder().Build(); + // mGfxRenderCommand = Graphics::API::RenderCommandBuilder().Build(); // see if we need to reallocate memory for each UBO // todo: do it only when shader has changed @@ -430,49 +433,6 @@ void Renderer::WriteUniform( const std::string& name, const void* data, uint32_t } } -void Renderer::PrepareRender( BufferIndex updateBufferIndex ) -{ - - if( mRegenerateUniformMap > UNIFORM_MAP_READY ) - { - if( mRegenerateUniformMap == REGENERATE_UNIFORM_MAP) - { - CollectedUniformMap& localMap = mCollectedUniformMap[ updateBufferIndex ]; - localMap.Resize(0); - - const UniformMap& rendererUniformMap = PropertyOwner::GetUniformMap(); - AddMappings( localMap, rendererUniformMap ); - - if( mShader ) - { - AddMappings( localMap, mShader->GetUniformMap() ); - } - } - else if( mRegenerateUniformMap == COPY_UNIFORM_MAP ) - { - // Copy old map into current map - CollectedUniformMap& localMap = mCollectedUniformMap[ updateBufferIndex ]; - CollectedUniformMap& oldMap = mCollectedUniformMap[ 1-updateBufferIndex ]; - - localMap.Resize( oldMap.Count() ); - - unsigned int index=0; - for( CollectedUniformMap::Iterator iter = oldMap.Begin(), end = oldMap.End() ; iter != end ; ++iter, ++index ) - { - localMap[index] = *iter; - } - } - - mUniformMapChanged[updateBufferIndex] = true; - mRegenerateUniformMap--; - } - - if( mResendFlag != 0 ) - { - // This used to send messages to obsolete Render::Renderer at this point - mResendFlag = 0; - } -} void Renderer::SetTextures( TextureSet* textureSet ) { @@ -486,7 +446,6 @@ void Renderer::SetTextures( TextureSet* textureSet ) mTextureSet = textureSet; mTextureSet->AddObserver( this ); mRegenerateUniformMap = REGENERATE_UNIFORM_MAP; - mResendFlag |= RESEND_DATA_PROVIDER; } void Renderer::SetShader( Shader* shader ) @@ -501,7 +460,6 @@ void Renderer::SetShader( Shader* shader ) mShader = shader; mShader->AddConnectionObserver( *this ); mRegenerateUniformMap = REGENERATE_UNIFORM_MAP; - mResendFlag |= RESEND_DATA_PROVIDER; } void Renderer::SetGeometry( SceneGraph::Geometry* geometry ) @@ -518,7 +476,6 @@ void Renderer::SetDepthIndex( int depthIndex ) void Renderer::SetFaceCullingMode( FaceCullingMode::Type faceCullingMode ) { mFaceCullingMode = faceCullingMode; - mResendFlag |= RESEND_FACE_CULLING_MODE; } void Renderer::SetBlendMode( BlendMode::Type blendingMode ) @@ -531,7 +488,6 @@ void Renderer::SetBlendingOptions( unsigned int options ) if( mBlendBitmask != options) { mBlendBitmask = options; - mResendFlag |= RESEND_BLEND_BIT_MASK; } } @@ -552,120 +508,76 @@ void Renderer::SetBlendColor( const Vector4& blendColor ) *mBlendColor = blendColor; } } - - mResendFlag |= RESEND_BLEND_COLOR; } void Renderer::SetIndexedDrawFirstElement( size_t firstElement ) { mIndexedDrawFirstElement = firstElement; - mResendFlag |= RESEND_INDEXED_DRAW_FIRST_ELEMENT; } void Renderer::SetIndexedDrawElementsCount( size_t elementsCount ) { mIndexedDrawElementsCount = elementsCount; - mResendFlag |= RESEND_INDEXED_DRAW_ELEMENTS_COUNT; } void Renderer::EnablePreMultipliedAlpha( bool preMultipled ) { mPremultipledAlphaEnabled = preMultipled; - mResendFlag |= RESEND_PREMULTIPLIED_ALPHA; } void Renderer::SetDepthWriteMode( DepthWriteMode::Type depthWriteMode ) { mDepthWriteMode = depthWriteMode; - mResendFlag |= RESEND_DEPTH_WRITE_MODE; } void Renderer::SetDepthTestMode( DepthTestMode::Type depthTestMode ) { mDepthTestMode = depthTestMode; - mResendFlag |= RESEND_DEPTH_TEST_MODE; } void Renderer::SetDepthFunction( DepthFunction::Type depthFunction ) { mDepthFunction = depthFunction; - mResendFlag |= RESEND_DEPTH_FUNCTION; } void Renderer::SetRenderMode( RenderMode::Type mode ) { mStencilParameters.renderMode = mode; - mResendFlag |= RESEND_RENDER_MODE; } void Renderer::SetStencilFunction( StencilFunction::Type stencilFunction ) { mStencilParameters.stencilFunction = stencilFunction; - mResendFlag |= RESEND_STENCIL_FUNCTION; } void Renderer::SetStencilFunctionMask( int stencilFunctionMask ) { mStencilParameters.stencilFunctionMask = stencilFunctionMask; - mResendFlag |= RESEND_STENCIL_FUNCTION_MASK; } void Renderer::SetStencilFunctionReference( int stencilFunctionReference ) { mStencilParameters.stencilFunctionReference = stencilFunctionReference; - mResendFlag |= RESEND_STENCIL_FUNCTION_REFERENCE; } void Renderer::SetStencilMask( int stencilMask ) { mStencilParameters.stencilMask = stencilMask; - mResendFlag |= RESEND_STENCIL_MASK; } void Renderer::SetStencilOperationOnFail( StencilOperation::Type stencilOperationOnFail ) { mStencilParameters.stencilOperationOnFail = stencilOperationOnFail; - mResendFlag |= RESEND_STENCIL_OPERATION_ON_FAIL; } void Renderer::SetStencilOperationOnZFail( StencilOperation::Type stencilOperationOnZFail ) { mStencilParameters.stencilOperationOnZFail = stencilOperationOnZFail; - mResendFlag |= RESEND_STENCIL_OPERATION_ON_Z_FAIL; } void Renderer::SetStencilOperationOnZPass( StencilOperation::Type stencilOperationOnZPass ) { mStencilParameters.stencilOperationOnZPass = stencilOperationOnZPass; - mResendFlag |= RESEND_STENCIL_OPERATION_ON_Z_PASS; -} - -//Called when SceneGraph::Renderer is added to update manager ( that happens when an "event-thread renderer" is created ) -void Renderer::ConnectToSceneGraph( BufferIndex bufferIndex ) -{ - mRegenerateUniformMap = REGENERATE_UNIFORM_MAP; - - mRenderDataProvider = std::make_unique< RenderDataProvider >(); - - mRenderDataProvider->mUniformMapDataProvider = this; - mRenderDataProvider->mShader = mShader; - - if( mTextureSet ) - { - size_t textureCount = mTextureSet->GetTextureCount(); - mRenderDataProvider->mTextures.resize( textureCount ); - mRenderDataProvider->mSamplers.resize( textureCount ); - for( unsigned int i(0); imTextures[i] = mTextureSet->GetTexture(i); - mRenderDataProvider->mSamplers[i] = mTextureSet->GetTextureSampler(i); - } - } -} - -//Called just before destroying the scene-graph renderer ( when the "event-thread renderer" is no longer referenced ) -void Renderer::DisconnectFromSceneGraph( BufferIndex bufferIndex ) -{ } const Vector4& Renderer::GetBlendColor() const @@ -727,23 +639,18 @@ Renderer::Opacity Renderer::GetOpacity( BufferIndex updateBufferIndex, const Nod void Renderer::TextureSetChanged() { - mResendFlag |= RESEND_DATA_PROVIDER; } void Renderer::TextureSetDeleted() { mTextureSet = NULL; - - mResendFlag |= RESEND_DATA_PROVIDER; } + void Renderer::ConnectionsChanged( PropertyOwner& object ) { // One of our child objects has changed it's connections. Ensure the uniform // map gets regenerated during PrepareRender mRegenerateUniformMap = REGENERATE_UNIFORM_MAP; - - // Ensure the child object pointers get re-sent to the renderer - mResendFlag |= RESEND_DATA_PROVIDER; } void Renderer::ConnectedUniformMapChanged() diff --git a/dali/internal/update/rendering/scene-graph-renderer.h b/dali/internal/update/rendering/scene-graph-renderer.h index ddb8ae1..54eb226 100644 --- a/dali/internal/update/rendering/scene-graph-renderer.h +++ b/dali/internal/update/rendering/scene-graph-renderer.h @@ -81,6 +81,13 @@ public: void operator delete( void* ptr ); /** + * Initialize the renderer object with the Graphics API when added to UpdateManager + * + * @param[in] graphics The Graphics API + */ + void Initialize( Integration::Graphics::Graphics& graphics ); + + /** * Set the texture set for the renderer * @param[in] textureSet The texture set this renderer will use */ @@ -293,19 +300,6 @@ public: */ void TextureSetDeleted(); - /** - * Connect the object to the scene graph - * - * @param[in] bufferIndex The current buffer index - used for sending messages to render thread - */ - void ConnectToSceneGraph( BufferIndex bufferIndex ); - - /** - * Disconnect the object from the scene graph - * @param[in] bufferIndex The current buffer index - used for sending messages to render thread - */ - void DisconnectFromSceneGraph( BufferIndex bufferIndex ); - public: // Implementation of ConnectionChangePropagator /** * @copydoc ConnectionChangePropagator::AddObserver @@ -377,8 +371,13 @@ private: */ const Vector4& GetBlendColor() const; + /** + * Helper function to update the uniform map. + */ + void UpdateUniformMap( BufferIndex updateBufferIndex ); private: + Integration::Graphics::Graphics* mGraphics; ///< Graphics interface object CollectedUniformMap mCollectedUniformMap[2]; ///< Uniform maps collected by the renderer std::unique_ptr mRenderDataProvider; ///< Contains data for graphics renderer @todo Refactor -- 2.7.4