X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fimaging%2Ftizen%2Fnative-image-source-queue-impl-tizen.cpp;h=7f72939119d53037e30a7f3829c3db87cad9b080;hb=d2fed3ef69696425608efc37faba1751659aad4e;hp=e7fa5548325730be4ea103c58b6dceb68a698527;hpb=f6d58a764f0d23b15e75275940b5cb57523cfc9a;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/imaging/tizen/native-image-source-queue-impl-tizen.cpp b/dali/internal/imaging/tizen/native-image-source-queue-impl-tizen.cpp index e7fa554..7f72939 100644 --- a/dali/internal/imaging/tizen/native-image-source-queue-impl-tizen.cpp +++ b/dali/internal/imaging/tizen/native-image-source-queue-impl-tizen.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 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. @@ -24,26 +24,23 @@ #include // INTERNAL INCLUDES +#include #include #include -#include namespace Dali { - namespace Internal { - namespace Adaptor { - namespace { -#define TBM_SURFACE_QUEUE_SIZE 3 +#define TBM_SURFACE_QUEUE_SIZE 3 -const char* FRAGMENT_PREFIX = "#extension GL_OES_EGL_image_external:require\n"; const char* SAMPLER_TYPE = "samplerExternalOES"; +// clang-format off int FORMATS_BLENDING_REQUIRED[] = { TBM_FORMAT_ARGB4444, TBM_FORMAT_ABGR4444, TBM_FORMAT_RGBA4444, TBM_FORMAT_BGRA4444, @@ -55,99 +52,103 @@ int FORMATS_BLENDING_REQUIRED[] = { TBM_FORMAT_ARGB2101010, TBM_FORMAT_ABGR2101010, TBM_FORMAT_RGBA1010102, TBM_FORMAT_BGRA1010102 }; +// clang-format on const int NUM_FORMATS_BLENDING_REQUIRED = 18; -} +} // namespace -NativeImageSourceQueueTizen* NativeImageSourceQueueTizen::New( uint32_t width, uint32_t height, Dali::NativeImageSourceQueue::ColorDepth depth, Any nativeImageSourceQueue ) +NativeImageSourceQueueTizen* NativeImageSourceQueueTizen::New(uint32_t width, uint32_t height, Dali::NativeImageSourceQueue::ColorDepth depth, Any nativeImageSourceQueue) { - NativeImageSourceQueueTizen* image = new NativeImageSourceQueueTizen( width, height, depth, nativeImageSourceQueue ); - DALI_ASSERT_DEBUG( image && "NativeImageSourceQueueTizen allocation failed." ); + NativeImageSourceQueueTizen* image = new NativeImageSourceQueueTizen(width, height, depth, nativeImageSourceQueue); + DALI_ASSERT_DEBUG(image && "NativeImageSourceQueueTizen allocation failed."); - if( image ) + if(image) { - image->Initialize( depth ); + image->Initialize(depth); } return image; } -NativeImageSourceQueueTizen::NativeImageSourceQueueTizen( uint32_t width, uint32_t height, Dali::NativeImageSourceQueue::ColorDepth depth, Any nativeImageSourceQueue ) -: mMutex(), - mWidth( width ), - mHeight( height ), - mTbmQueue( NULL ), - mConsumeSurface( NULL ), +NativeImageSourceQueueTizen::NativeImageSourceQueueTizen(uint32_t width, uint32_t height, Dali::NativeImageSourceQueue::ColorDepth depth, Any nativeImageSourceQueue) +: mCustomFragmentPrefix(), + mMutex(), + mWidth(width), + mHeight(height), + mTbmQueue(NULL), + mConsumeSurface(NULL), mEglImages(), - mEglGraphics( NULL ), - mEglImageExtensions( NULL ), - mOwnTbmQueue( false ), - mBlendingRequired( false ) + mEglGraphics(NULL), + mEglImageExtensions(NULL), + mOwnTbmQueue(false), + mBlendingRequired(false) { - DALI_ASSERT_ALWAYS( Adaptor::IsAvailable() ); + DALI_ASSERT_ALWAYS(Adaptor::IsAvailable()); + + GraphicsInterface* graphics = &(Adaptor::GetImplementation(Adaptor::Get()).GetGraphicsInterface()); + mEglGraphics = static_cast(graphics); - GraphicsInterface* graphics = &( Adaptor::GetImplementation( Adaptor::Get() ).GetGraphicsInterface() ); - mEglGraphics = static_cast(graphics); + mCustomFragmentPrefix = mEglGraphics->GetEglImageExtensionString(); - mTbmQueue = GetSurfaceFromAny( nativeImageSourceQueue ); + mTbmQueue = GetSurfaceFromAny(nativeImageSourceQueue); - if( mTbmQueue != NULL ) + if(mTbmQueue != NULL) { - mBlendingRequired = CheckBlending( tbm_surface_queue_get_format( mTbmQueue ) ); - mWidth = tbm_surface_queue_get_width( mTbmQueue ); - mHeight = tbm_surface_queue_get_height( mTbmQueue ); + mBlendingRequired = CheckBlending(tbm_surface_queue_get_format(mTbmQueue)); + mWidth = tbm_surface_queue_get_width(mTbmQueue); + mHeight = tbm_surface_queue_get_height(mTbmQueue); } } NativeImageSourceQueueTizen::~NativeImageSourceQueueTizen() { - if( mOwnTbmQueue ) + if(mOwnTbmQueue) { - if( mTbmQueue != NULL ) + if(mTbmQueue != NULL) { - tbm_surface_queue_destroy( mTbmQueue ); + tbm_surface_queue_destroy(mTbmQueue); } } } -void NativeImageSourceQueueTizen::Initialize( Dali::NativeImageSourceQueue::ColorDepth depth ) +void NativeImageSourceQueueTizen::Initialize(Dali::NativeImageSourceQueue::ColorDepth depth) { - if( mWidth == 0 || mHeight == 0 ) + if(mWidth == 0 || mHeight == 0) { return; } - if( mTbmQueue == NULL ) + if(mTbmQueue == NULL) { int format = TBM_FORMAT_ARGB8888; - switch( depth ) + switch(depth) { case Dali::NativeImageSourceQueue::COLOR_DEPTH_DEFAULT: case Dali::NativeImageSourceQueue::COLOR_DEPTH_32: { - format = TBM_FORMAT_ARGB8888; + format = TBM_FORMAT_ARGB8888; mBlendingRequired = true; break; } case Dali::NativeImageSourceQueue::COLOR_DEPTH_24: { - format = TBM_FORMAT_RGB888; + format = TBM_FORMAT_RGB888; mBlendingRequired = false; break; } default: { - DALI_LOG_WARNING( "Wrong color depth.\n" ); + DALI_LOG_WARNING("Wrong color depth.\n"); return; } } - mTbmQueue = tbm_surface_queue_create( TBM_SURFACE_QUEUE_SIZE, mWidth, mHeight, format, 0 ); - if( !mTbmQueue ) + mTbmQueue = tbm_surface_queue_create(TBM_SURFACE_QUEUE_SIZE, mWidth, mHeight, format, 0); + if(!mTbmQueue) { - DALI_LOG_ERROR( "NativeImageSourceQueueTizen::Initialize: tbm_surface_queue_create is failed! [%p]\n", mTbmQueue ); + DALI_LOG_ERROR("NativeImageSourceQueueTizen::Initialize: tbm_surface_queue_create is failed! [%p]\n", mTbmQueue); return; } @@ -155,16 +156,16 @@ void NativeImageSourceQueueTizen::Initialize( Dali::NativeImageSourceQueue::Colo } } -tbm_surface_queue_h NativeImageSourceQueueTizen::GetSurfaceFromAny( Any source ) const +tbm_surface_queue_h NativeImageSourceQueueTizen::GetSurfaceFromAny(Any source) const { - if( source.Empty() ) + if(source.Empty()) { return NULL; } - if( source.GetType() == typeid( tbm_surface_queue_h ) ) + if(source.GetType() == typeid(tbm_surface_queue_h)) { - return AnyCast< tbm_surface_queue_h >( source ); + return AnyCast(source); } else { @@ -174,32 +175,52 @@ tbm_surface_queue_h NativeImageSourceQueueTizen::GetSurfaceFromAny( Any source ) Any NativeImageSourceQueueTizen::GetNativeImageSourceQueue() const { - return Any( mTbmQueue ); + return Any(mTbmQueue); } -void NativeImageSourceQueueTizen::SetSize( uint32_t width, uint32_t height ) +void NativeImageSourceQueueTizen::SetSize(uint32_t width, uint32_t height) { - Dali::Mutex::ScopedLock lock( mMutex ); + Dali::Mutex::ScopedLock lock(mMutex); - tbm_surface_queue_reset( mTbmQueue, width, height, tbm_surface_queue_get_format( mTbmQueue ) ); + tbm_surface_queue_reset(mTbmQueue, width, height, tbm_surface_queue_get_format(mTbmQueue)); - mWidth = width; + mWidth = width; mHeight = height; ResetEglImageList(); } -bool NativeImageSourceQueueTizen::GlExtensionCreate() +void NativeImageSourceQueueTizen::IgnoreSourceImage() +{ + Dali::Mutex::ScopedLock lock(mMutex); + tbm_surface_h surface; + + if(tbm_surface_queue_can_acquire(mTbmQueue, 0)) + { + if(tbm_surface_queue_acquire(mTbmQueue, &surface) != TBM_SURFACE_QUEUE_ERROR_NONE) + { + DALI_LOG_ERROR("NativeImageSourceQueueTizen::IgnoreSourceImage: Failed to aquire a tbm_surface\n"); + return; + } + + if(tbm_surface_internal_is_valid(surface)) + { + tbm_surface_queue_release(mTbmQueue, surface); + } + } +} + +bool NativeImageSourceQueueTizen::CreateResource() { mEglImageExtensions = mEglGraphics->GetImageExtensions(); - DALI_ASSERT_DEBUG( mEglImageExtensions ); + DALI_ASSERT_DEBUG(mEglImageExtensions); return true; } -void NativeImageSourceQueueTizen::GlExtensionDestroy() +void NativeImageSourceQueueTizen::DestroyResource() { - Dali::Mutex::ScopedLock lock( mMutex ); + Dali::Mutex::ScopedLock lock(mMutex); ResetEglImageList(); } @@ -211,94 +232,104 @@ uint32_t NativeImageSourceQueueTizen::TargetTexture() void NativeImageSourceQueueTizen::PrepareTexture() { - Dali::Mutex::ScopedLock lock( mMutex ); + Dali::Mutex::ScopedLock lock(mMutex); tbm_surface_h oldSurface = mConsumeSurface; - if( tbm_surface_queue_can_acquire( mTbmQueue, 0 ) ) + if(tbm_surface_queue_can_acquire(mTbmQueue, 0)) { - if( tbm_surface_queue_acquire( mTbmQueue, &mConsumeSurface ) != TBM_SURFACE_QUEUE_ERROR_NONE ) + if(tbm_surface_queue_acquire(mTbmQueue, &mConsumeSurface) != TBM_SURFACE_QUEUE_ERROR_NONE) { - DALI_LOG_ERROR( "Failed to aquire a tbm_surface\n" ); + DALI_LOG_ERROR("Failed to aquire a tbm_surface\n"); return; } - if( oldSurface ) + if(oldSurface) { - if( tbm_surface_internal_is_valid( oldSurface ) ) + if(tbm_surface_internal_is_valid(oldSurface)) { - tbm_surface_queue_release( mTbmQueue, oldSurface ); + tbm_surface_queue_release(mTbmQueue, oldSurface); } } - if( mConsumeSurface ) + if(mConsumeSurface) { bool existing = false; - for( auto&& iter : mEglImages ) + for(auto&& iter : mEglImages) { - if( iter.first == mConsumeSurface ) + if(iter.first == mConsumeSurface) { // Find the surface in the existing list existing = true; - mEglImageExtensions->TargetTextureKHR( iter.second ); + mEglImageExtensions->TargetTextureKHR(iter.second); break; } } - if( !existing ) + if(!existing) { // Push the surface - tbm_surface_internal_ref( mConsumeSurface ); + tbm_surface_internal_ref(mConsumeSurface); - void* eglImageKHR = mEglImageExtensions->CreateImageKHR( reinterpret_cast< EGLClientBuffer >( mConsumeSurface ) ); - mEglImageExtensions->TargetTextureKHR( eglImageKHR ); + void* eglImageKHR = mEglImageExtensions->CreateImageKHR(reinterpret_cast(mConsumeSurface)); + mEglImageExtensions->TargetTextureKHR(eglImageKHR); - mEglImages.push_back( EglImagePair( mConsumeSurface, eglImageKHR) ); + mEglImages.push_back(EglImagePair(mConsumeSurface, eglImageKHR)); } } } } -const char* NativeImageSourceQueueTizen::GetCustomFragmentPreFix() +const char* NativeImageSourceQueueTizen::GetCustomFragmentPrefix() const { - return FRAGMENT_PREFIX; + return mCustomFragmentPrefix; } -const char* NativeImageSourceQueueTizen::GetCustomSamplerTypename() +const char* NativeImageSourceQueueTizen::GetCustomSamplerTypename() const { return SAMPLER_TYPE; } -int NativeImageSourceQueueTizen::GetEglImageTextureTarget() +int NativeImageSourceQueueTizen::GetTextureTarget() const { return GL_TEXTURE_EXTERNAL_OES; } +Any NativeImageSourceQueueTizen::GetNativeImageHandle() const +{ + return nullptr; +} + +bool NativeImageSourceQueueTizen::SourceChanged() const +{ + return false; +} + void NativeImageSourceQueueTizen::ResetEglImageList() { - if( mConsumeSurface ) + if(mConsumeSurface) { - if( tbm_surface_internal_is_valid( mConsumeSurface ) ) + if(tbm_surface_internal_is_valid(mConsumeSurface)) { - tbm_surface_queue_release( mTbmQueue, mConsumeSurface ); + tbm_surface_queue_release(mTbmQueue, mConsumeSurface); } mConsumeSurface = NULL; } - for( auto&& iter : mEglImages ) + for(auto&& iter : mEglImages) { - mEglImageExtensions->DestroyImageKHR( iter.second ); + mEglImageExtensions->DestroyImageKHR(iter.second); - tbm_surface_internal_unref( iter.first ); + tbm_surface_internal_unref(iter.first); } mEglImages.clear(); } -bool NativeImageSourceQueueTizen::CheckBlending( int format ) +bool NativeImageSourceQueueTizen::CheckBlending(int format) { - for( int i = 0; i < NUM_FORMATS_BLENDING_REQUIRED; ++i ) + for(int i = 0; i < NUM_FORMATS_BLENDING_REQUIRED; ++i) { - if( format == FORMATS_BLENDING_REQUIRED[i] ) + if(format == FORMATS_BLENDING_REQUIRED[i]) { return true; } @@ -309,6 +340,6 @@ bool NativeImageSourceQueueTizen::CheckBlending( int format ) } // namespace Adaptor -} // namespace internal +} // namespace Internal } // namespace Dali