2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/imaging/tizen/native-image-source-queue-impl-tizen.h>
22 #include <dali/integration-api/debug.h>
23 #include <dali/integration-api/gl-defines.h>
24 #include <tbm_surface_internal.h>
27 #include <dali/internal/graphics/common/egl-image-extensions.h>
28 #include <dali/internal/graphics/gles/egl-graphics.h>
29 #include <dali/internal/adaptor/common/adaptor-impl.h>
42 #define TBM_SURFACE_QUEUE_SIZE 3
44 const char* FRAGMENT_PREFIX = "#extension GL_OES_EGL_image_external:require\n";
45 const char* SAMPLER_TYPE = "samplerExternalOES";
47 int FORMATS_BLENDING_REQUIRED[] = {
48 TBM_FORMAT_ARGB4444, TBM_FORMAT_ABGR4444,
49 TBM_FORMAT_RGBA4444, TBM_FORMAT_BGRA4444,
50 TBM_FORMAT_RGBX5551, TBM_FORMAT_BGRX5551,
51 TBM_FORMAT_ARGB1555, TBM_FORMAT_ABGR1555,
52 TBM_FORMAT_RGBA5551, TBM_FORMAT_BGRA5551,
53 TBM_FORMAT_ARGB8888, TBM_FORMAT_ABGR8888,
54 TBM_FORMAT_RGBA8888, TBM_FORMAT_BGRA8888,
55 TBM_FORMAT_ARGB2101010, TBM_FORMAT_ABGR2101010,
56 TBM_FORMAT_RGBA1010102, TBM_FORMAT_BGRA1010102
59 const int NUM_FORMATS_BLENDING_REQUIRED = 18;
63 NativeImageSourceQueueTizen* NativeImageSourceQueueTizen::New( uint32_t width, uint32_t height, Dali::NativeImageSourceQueue::ColorDepth depth, Any nativeImageSourceQueue )
65 NativeImageSourceQueueTizen* image = new NativeImageSourceQueueTizen( width, height, depth, nativeImageSourceQueue );
66 DALI_ASSERT_DEBUG( image && "NativeImageSourceQueueTizen allocation failed." );
70 image->Initialize( depth );
76 NativeImageSourceQueueTizen::NativeImageSourceQueueTizen( uint32_t width, uint32_t height, Dali::NativeImageSourceQueue::ColorDepth depth, Any nativeImageSourceQueue )
81 mConsumeSurface( NULL ),
84 mEglImageExtensions( NULL ),
85 mOwnTbmQueue( false ),
86 mBlendingRequired( false )
88 DALI_ASSERT_ALWAYS( Adaptor::IsAvailable() );
90 GraphicsInterface* graphics = &( Adaptor::GetImplementation( Adaptor::Get() ).GetGraphicsInterface() );
91 mEglGraphics = static_cast<EglGraphics *>(graphics);
93 mTbmQueue = GetSurfaceFromAny( nativeImageSourceQueue );
95 if( mTbmQueue != NULL )
97 mBlendingRequired = CheckBlending( tbm_surface_queue_get_format( mTbmQueue ) );
98 mWidth = tbm_surface_queue_get_width( mTbmQueue );
99 mHeight = tbm_surface_queue_get_height( mTbmQueue );
103 NativeImageSourceQueueTizen::~NativeImageSourceQueueTizen()
107 if( mTbmQueue != NULL )
109 tbm_surface_queue_destroy( mTbmQueue );
114 void NativeImageSourceQueueTizen::Initialize( Dali::NativeImageSourceQueue::ColorDepth depth )
116 if( mWidth == 0 || mHeight == 0 )
121 if( mTbmQueue == NULL )
123 int format = TBM_FORMAT_ARGB8888;
127 case Dali::NativeImageSourceQueue::COLOR_DEPTH_DEFAULT:
128 case Dali::NativeImageSourceQueue::COLOR_DEPTH_32:
130 format = TBM_FORMAT_ARGB8888;
131 mBlendingRequired = true;
134 case Dali::NativeImageSourceQueue::COLOR_DEPTH_24:
136 format = TBM_FORMAT_RGB888;
137 mBlendingRequired = false;
142 DALI_LOG_WARNING( "Wrong color depth.\n" );
147 mTbmQueue = tbm_surface_queue_create( TBM_SURFACE_QUEUE_SIZE, mWidth, mHeight, format, 0 );
150 DALI_LOG_ERROR( "NativeImageSourceQueueTizen::Initialize: tbm_surface_queue_create is failed! [%p]\n", mTbmQueue );
158 tbm_surface_queue_h NativeImageSourceQueueTizen::GetSurfaceFromAny( Any source ) const
165 if( source.GetType() == typeid( tbm_surface_queue_h ) )
167 return AnyCast< tbm_surface_queue_h >( source );
175 Any NativeImageSourceQueueTizen::GetNativeImageSourceQueue() const
177 return Any( mTbmQueue );
180 void NativeImageSourceQueueTizen::SetSize( uint32_t width, uint32_t height )
182 Dali::Mutex::ScopedLock lock( mMutex );
184 tbm_surface_queue_reset( mTbmQueue, width, height, tbm_surface_queue_get_format( mTbmQueue ) );
192 void NativeImageSourceQueueTizen::IgnoreSourceImage()
194 Dali::Mutex::ScopedLock lock( mMutex );
195 tbm_surface_h surface;
197 if( tbm_surface_queue_can_acquire( mTbmQueue, 0 ) )
199 if( tbm_surface_queue_acquire( mTbmQueue, &surface ) != TBM_SURFACE_QUEUE_ERROR_NONE )
201 DALI_LOG_ERROR( "NativeImageSourceQueueTizen::IgnoreSourceImage: Failed to aquire a tbm_surface\n" );
205 if( tbm_surface_internal_is_valid( surface ) )
207 tbm_surface_queue_release( mTbmQueue, surface );
212 bool NativeImageSourceQueueTizen::CreateResource()
214 mEglImageExtensions = mEglGraphics->GetImageExtensions();
215 DALI_ASSERT_DEBUG( mEglImageExtensions );
220 void NativeImageSourceQueueTizen::DestroyResource()
222 Dali::Mutex::ScopedLock lock( mMutex );
227 uint32_t NativeImageSourceQueueTizen::TargetTexture()
232 void NativeImageSourceQueueTizen::PrepareTexture()
234 Dali::Mutex::ScopedLock lock( mMutex );
236 tbm_surface_h oldSurface = mConsumeSurface;
238 if( tbm_surface_queue_can_acquire( mTbmQueue, 0 ) )
240 if( tbm_surface_queue_acquire( mTbmQueue, &mConsumeSurface ) != TBM_SURFACE_QUEUE_ERROR_NONE )
242 DALI_LOG_ERROR( "Failed to aquire a tbm_surface\n" );
248 if( tbm_surface_internal_is_valid( oldSurface ) )
250 tbm_surface_queue_release( mTbmQueue, oldSurface );
254 if( mConsumeSurface )
256 bool existing = false;
257 for( auto&& iter : mEglImages )
259 if( iter.first == mConsumeSurface )
261 // Find the surface in the existing list
263 mEglImageExtensions->TargetTextureKHR( iter.second );
271 tbm_surface_internal_ref( mConsumeSurface );
273 void* eglImageKHR = mEglImageExtensions->CreateImageKHR( reinterpret_cast< EGLClientBuffer >( mConsumeSurface ) );
274 mEglImageExtensions->TargetTextureKHR( eglImageKHR );
276 mEglImages.push_back( EglImagePair( mConsumeSurface, eglImageKHR) );
282 const char* NativeImageSourceQueueTizen::GetCustomFragmentPrefix() const
284 return FRAGMENT_PREFIX;
287 const char* NativeImageSourceQueueTizen::GetCustomSamplerTypename() const
292 int NativeImageSourceQueueTizen::GetTextureTarget() const
294 return GL_TEXTURE_EXTERNAL_OES;
297 Any NativeImageSourceQueueTizen::GetNativeImageHandle() const
302 bool NativeImageSourceQueueTizen::SourceChanged() const
309 void NativeImageSourceQueueTizen::ResetEglImageList()
311 if( mConsumeSurface )
313 if( tbm_surface_internal_is_valid( mConsumeSurface ) )
315 tbm_surface_queue_release( mTbmQueue, mConsumeSurface );
317 mConsumeSurface = NULL;
320 for( auto&& iter : mEglImages )
322 mEglImageExtensions->DestroyImageKHR( iter.second );
324 tbm_surface_internal_unref( iter.first );
329 bool NativeImageSourceQueueTizen::CheckBlending( int format )
331 for( int i = 0; i < NUM_FORMATS_BLENDING_REQUIRED; ++i )
333 if( format == FORMATS_BLENDING_REQUIRED[i] )
342 } // namespace Adaptor
344 } // namespace internal