/*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 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.
#include "scene-graph-texture-set.h"
// INTERNAL HEADERS
-#include <dali/devel-api/rendering/texture-set.h>
-#include <dali/integration-api/resource-declarations.h>
#include <dali/internal/common/internal-constants.h>
-#include <dali/internal/update/resources/texture-metadata.h>
-#include <dali/internal/update/resources/resource-manager.h>
#include <dali/internal/common/memory-pool-object-allocator.h>
+#include <dali/internal/render/renderers/render-texture.h>
#include <dali/internal/update/rendering/scene-graph-renderer.h>
namespace //Unnamed namespace
{
//Memory pool used to allocate new texture sets. Memory used by this pool will be released when shutting down DALi
Dali::Internal::MemoryPoolObjectAllocator<Dali::Internal::SceneGraph::TextureSet> gTextureSetMemoryPool;
-}
+} // namespace
namespace Dali
{
-
namespace Internal
{
-
namespace SceneGraph
{
-
TextureSet* TextureSet::New()
{
- return new ( gTextureSetMemoryPool.AllocateRawThreadSafe() ) TextureSet();
+ return new(gTextureSetMemoryPool.AllocateRawThreadSafe()) TextureSet();
}
TextureSet::TextureSet()
: mSamplers(),
- mTextureId(),
- mRenderers(),
- mResourcesReady( false ),
- mFinishedResourceAcquisition( false ),
- mChanged( true ),
- mHasAlpha( false )
+ mHasAlpha(false)
{
}
{
}
-void TextureSet::operator delete( void* ptr )
+void TextureSet::operator delete(void* ptr)
{
- gTextureSetMemoryPool.FreeThreadSafe( static_cast<TextureSet*>( ptr ) );
+ gTextureSetMemoryPool.FreeThreadSafe(static_cast<TextureSet*>(ptr));
}
-void TextureSet::Prepare( const ResourceManager& resourceManager )
+void TextureSet::SetSampler(uint32_t index, Render::Sampler* sampler)
{
- if( mChanged )
+ const uint32_t samplerCount = static_cast<uint32_t>(mSamplers.Size());
+ if(samplerCount < index + 1)
{
- unsigned int opaqueCount = 0;
- unsigned int completeCount = 0;
- unsigned int failedCount = 0;
- unsigned int frameBufferCount = 0;
- const std::size_t textureCount( mTextureId.Count() );
- if( textureCount > 0 )
- {
- for( unsigned int i(0); i<textureCount; ++i )
- {
- const ResourceId textureId = mTextureId[ i ];
- TextureMetadata* metadata = NULL;
- if( textureId != Integration::InvalidResourceId )
- {
- // if there is metadata, resource is loaded
- if( resourceManager.GetTextureMetadata( textureId, metadata ) )
- {
- DALI_ASSERT_DEBUG( metadata );
- // metadata is valid pointer from now on
- if( metadata->IsFullyOpaque() )
- {
- ++opaqueCount;
- }
-
- if( metadata->IsFramebuffer() )
- {
- if( metadata->HasFrameBufferBeenRenderedTo() )
- {
- ++completeCount;
- }
- else
- {
- frameBufferCount++;
- }
- }
- else
- {
- // loaded so will complete this frame
- ++completeCount;
- }
- // no point checking failure as there is no metadata for failed loads
- }
- // if no metadata, loading can be failed
- else if( resourceManager.HasResourceLoadFailed( textureId ) )
- {
- ++failedCount;
- }
- }
- else
- {
- //If the texture is not valid it is considerer opaque and complete
- ++opaqueCount;
- ++completeCount;
- }
- }
- }
-
- mHasAlpha = ( opaqueCount != textureCount );
-
- // ready for rendering when all textures are either successfully loaded or they are FBOs
- mResourcesReady = (completeCount + frameBufferCount >= textureCount);
-
- // Texture set is complete if all resources are either loaded or failed or, if they are FBOs have been rendererd to
- mFinishedResourceAcquisition = ( completeCount + failedCount == textureCount );
-
- if( mFinishedResourceAcquisition )
+ mSamplers.Resize(index + 1);
+ for(uint32_t i(samplerCount); i <= index; ++i)
{
- // Texture set is now considered not changed
- mChanged = false;
+ mSamplers[i] = nullptr;
}
}
-}
-void TextureSet::SetImage( size_t index, ResourceId imageId )
-{
- size_t textureCount( mTextureId.Size() );
- if( textureCount < index + 1 )
+ mSamplers[index] = sampler;
+
+ if(index < static_cast<uint32_t>(mTextures.Size()))
{
- mTextureId.Resize( index + 1 );
- mSamplers.Resize( index + 1 );
- for( size_t i(textureCount); i<=index; ++i )
- {
- mTextureId[i] = Integration::InvalidResourceId;
- mSamplers[i] = NULL;
- }
+ mTextures[index]->SetUpdated(true);
}
-
- mTextureId[index] = imageId;
- mChanged = true;
- NotifyChangeToRenderers();
}
-void TextureSet::SetSampler( size_t index, Render::Sampler* sampler )
+void TextureSet::SetTexture(uint32_t index, Render::Texture* texture)
{
- size_t samplerCount( mSamplers.Size() );
- if( samplerCount < index + 1 )
+ const uint32_t textureCount = static_cast<uint32_t>(mTextures.Size());
+ if(textureCount < index + 1)
{
- mSamplers.Resize( index + 1 );
- mTextureId.Resize( index + 1 );
- for( size_t i(samplerCount); i<=index; ++i )
+ mTextures.Resize(index + 1);
+
+ bool samplerExist = true;
+ if(mSamplers.Size() < index + 1)
{
- mTextureId[i] = Integration::InvalidResourceId;
- mSamplers[i] = NULL;
+ mSamplers.Resize(index + 1);
+ samplerExist = false;
}
- }
-
- mSamplers[index] = sampler;
- mChanged = true;
- NotifyChangeToRenderers();
-}
-
-void TextureSet::SetTexture( size_t index, Render::NewTexture* texture )
-{
- const size_t textureCount( mTextures.Size() );
- if( textureCount < index + 1 )
- {
- mTextures.Resize( index + 1 );
- mSamplers.Resize( index + 1 );
-
- for( size_t i(textureCount); i<=index; ++i )
+ for(uint32_t i(textureCount); i <= index; ++i)
{
- mTextures[i] = 0;
- mSamplers[i] = 0;
+ mTextures[i] = nullptr;
+
+ if(!samplerExist)
+ {
+ mSamplers[i] = nullptr;
+ }
}
}
mTextures[index] = texture;
- mHasAlpha |= texture->HasAlphaChannel();
-
- mChanged = true;
- NotifyChangeToRenderers();
-}
-
-bool TextureSet::HasAlpha() const
-{
- return mHasAlpha;
-}
-
-void TextureSet::GetResourcesStatus( bool& resourcesReady, bool& finishedResourceAcquisition )
-{
- resourcesReady = mResourcesReady;
- finishedResourceAcquisition = mFinishedResourceAcquisition;
-}
-
-void TextureSet::AddObserver( Renderer* renderer )
-{
- size_t rendererCount( mRenderers.Size() );
- for( size_t i(0); i<rendererCount; ++i )
+ if(texture)
{
- if( mRenderers[i] == renderer )
- {
- //Renderer already in the list
- return;
- }
+ mHasAlpha |= texture->HasAlphaChannel();
+ texture->SetUpdated(true);
}
-
- mRenderers.PushBack( renderer );
}
-void TextureSet::RemoveObserver( Renderer* renderer )
+bool TextureSet::HasAlpha() const
{
- size_t rendererCount( mRenderers.Size() );
- for( size_t i(0); i<rendererCount; ++i )
- {
- if( mRenderers[i] == renderer )
- {
- mRenderers.Remove( mRenderers.Begin() + i );
- return;
- }
- }
+ return mHasAlpha;
}
-void TextureSet::NotifyChangeToRenderers()
+uint32_t TextureSet::GetMemoryPoolCapacity()
{
- size_t rendererCount = mRenderers.Size();
- for( size_t i(0); i<rendererCount; ++i )
- {
- mRenderers[i]->TextureSetChanged();
- }
+ return gTextureSetMemoryPool.GetCapacity();
}
} // namespace SceneGraph