2 * Copyright (c) 2021 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/adaptor/common/adaptor-impl.h>
28 #include <dali/internal/graphics/common/egl-image-extensions.h>
29 #include <dali/internal/graphics/gles/egl-graphics.h>
39 #define TBM_SURFACE_QUEUE_SIZE 3
41 const char* FRAGMENT_PREFIX = "#extension GL_OES_EGL_image_external:require\n";
42 const char* SAMPLER_TYPE = "samplerExternalOES";
45 int FORMATS_BLENDING_REQUIRED[] = {
46 TBM_FORMAT_ARGB4444, TBM_FORMAT_ABGR4444,
47 TBM_FORMAT_RGBA4444, TBM_FORMAT_BGRA4444,
48 TBM_FORMAT_RGBX5551, TBM_FORMAT_BGRX5551,
49 TBM_FORMAT_ARGB1555, TBM_FORMAT_ABGR1555,
50 TBM_FORMAT_RGBA5551, TBM_FORMAT_BGRA5551,
51 TBM_FORMAT_ARGB8888, TBM_FORMAT_ABGR8888,
52 TBM_FORMAT_RGBA8888, TBM_FORMAT_BGRA8888,
53 TBM_FORMAT_ARGB2101010, TBM_FORMAT_ABGR2101010,
54 TBM_FORMAT_RGBA1010102, TBM_FORMAT_BGRA1010102
58 const int NUM_FORMATS_BLENDING_REQUIRED = 18;
62 NativeImageSourceQueueTizen* NativeImageSourceQueueTizen::New(uint32_t width, uint32_t height, Dali::NativeImageSourceQueue::ColorDepth depth, Any nativeImageSourceQueue)
64 NativeImageSourceQueueTizen* image = new NativeImageSourceQueueTizen(width, height, depth, nativeImageSourceQueue);
65 DALI_ASSERT_DEBUG(image && "NativeImageSourceQueueTizen allocation failed.");
69 image->Initialize(depth);
75 NativeImageSourceQueueTizen::NativeImageSourceQueueTizen(uint32_t width, uint32_t height, Dali::NativeImageSourceQueue::ColorDepth depth, Any nativeImageSourceQueue)
80 mConsumeSurface(NULL),
83 mEglImageExtensions(NULL),
85 mBlendingRequired(false)
87 DALI_ASSERT_ALWAYS(Adaptor::IsAvailable());
89 GraphicsInterface* graphics = &(Adaptor::GetImplementation(Adaptor::Get()).GetGraphicsInterface());
90 mEglGraphics = static_cast<EglGraphics*>(graphics);
92 mTbmQueue = GetSurfaceFromAny(nativeImageSourceQueue);
96 mBlendingRequired = CheckBlending(tbm_surface_queue_get_format(mTbmQueue));
97 mWidth = tbm_surface_queue_get_width(mTbmQueue);
98 mHeight = tbm_surface_queue_get_height(mTbmQueue);
102 NativeImageSourceQueueTizen::~NativeImageSourceQueueTizen()
106 if(mTbmQueue != NULL)
108 tbm_surface_queue_destroy(mTbmQueue);
113 void NativeImageSourceQueueTizen::Initialize(Dali::NativeImageSourceQueue::ColorDepth depth)
115 if(mWidth == 0 || mHeight == 0)
120 if(mTbmQueue == NULL)
122 int format = TBM_FORMAT_ARGB8888;
126 case Dali::NativeImageSourceQueue::COLOR_DEPTH_DEFAULT:
127 case Dali::NativeImageSourceQueue::COLOR_DEPTH_32:
129 format = TBM_FORMAT_ARGB8888;
130 mBlendingRequired = true;
133 case Dali::NativeImageSourceQueue::COLOR_DEPTH_24:
135 format = TBM_FORMAT_RGB888;
136 mBlendingRequired = false;
141 DALI_LOG_WARNING("Wrong color depth.\n");
146 mTbmQueue = tbm_surface_queue_create(TBM_SURFACE_QUEUE_SIZE, mWidth, mHeight, format, 0);
149 DALI_LOG_ERROR("NativeImageSourceQueueTizen::Initialize: tbm_surface_queue_create is failed! [%p]\n", mTbmQueue);
157 tbm_surface_queue_h NativeImageSourceQueueTizen::GetSurfaceFromAny(Any source) const
164 if(source.GetType() == typeid(tbm_surface_queue_h))
166 return AnyCast<tbm_surface_queue_h>(source);
174 Any NativeImageSourceQueueTizen::GetNativeImageSourceQueue() const
176 return Any(mTbmQueue);
179 void NativeImageSourceQueueTizen::SetSize(uint32_t width, uint32_t height)
181 Dali::Mutex::ScopedLock lock(mMutex);
183 tbm_surface_queue_reset(mTbmQueue, width, height, tbm_surface_queue_get_format(mTbmQueue));
191 void NativeImageSourceQueueTizen::IgnoreSourceImage()
193 Dali::Mutex::ScopedLock lock(mMutex);
194 tbm_surface_h surface;
196 if(tbm_surface_queue_can_acquire(mTbmQueue, 0))
198 if(tbm_surface_queue_acquire(mTbmQueue, &surface) != TBM_SURFACE_QUEUE_ERROR_NONE)
200 DALI_LOG_ERROR("NativeImageSourceQueueTizen::IgnoreSourceImage: Failed to aquire a tbm_surface\n");
204 if(tbm_surface_internal_is_valid(surface))
206 tbm_surface_queue_release(mTbmQueue, surface);
211 bool NativeImageSourceQueueTizen::CreateResource()
213 mEglImageExtensions = mEglGraphics->GetImageExtensions();
214 DALI_ASSERT_DEBUG(mEglImageExtensions);
219 void NativeImageSourceQueueTizen::DestroyResource()
221 Dali::Mutex::ScopedLock lock(mMutex);
226 uint32_t NativeImageSourceQueueTizen::TargetTexture()
231 void NativeImageSourceQueueTizen::PrepareTexture()
233 Dali::Mutex::ScopedLock lock(mMutex);
235 tbm_surface_h oldSurface = mConsumeSurface;
237 if(tbm_surface_queue_can_acquire(mTbmQueue, 0))
239 if(tbm_surface_queue_acquire(mTbmQueue, &mConsumeSurface) != TBM_SURFACE_QUEUE_ERROR_NONE)
241 DALI_LOG_ERROR("Failed to aquire a tbm_surface\n");
247 if(tbm_surface_internal_is_valid(oldSurface))
249 tbm_surface_queue_release(mTbmQueue, oldSurface);
255 bool existing = false;
256 for(auto&& iter : mEglImages)
258 if(iter.first == mConsumeSurface)
260 // Find the surface in the existing list
262 mEglImageExtensions->TargetTextureKHR(iter.second);
270 tbm_surface_internal_ref(mConsumeSurface);
272 void* eglImageKHR = mEglImageExtensions->CreateImageKHR(reinterpret_cast<EGLClientBuffer>(mConsumeSurface));
273 mEglImageExtensions->TargetTextureKHR(eglImageKHR);
275 mEglImages.push_back(EglImagePair(mConsumeSurface, eglImageKHR));
281 const char* NativeImageSourceQueueTizen::GetCustomFragmentPrefix() const
283 return FRAGMENT_PREFIX;
286 bool NativeImageSourceQueueTizen::ApplyNativeFragmentShader(std::string& shader)
288 return mEglGraphics->ApplyNativeFragmentShader(shader, SAMPLER_TYPE);
291 const char* NativeImageSourceQueueTizen::GetCustomSamplerTypename() const
296 int NativeImageSourceQueueTizen::GetTextureTarget() const
298 return GL_TEXTURE_EXTERNAL_OES;
301 Any NativeImageSourceQueueTizen::GetNativeImageHandle() const
306 bool NativeImageSourceQueueTizen::SourceChanged() const
311 void NativeImageSourceQueueTizen::ResetEglImageList()
315 if(tbm_surface_internal_is_valid(mConsumeSurface))
317 tbm_surface_queue_release(mTbmQueue, mConsumeSurface);
319 mConsumeSurface = NULL;
322 for(auto&& iter : mEglImages)
324 mEglImageExtensions->DestroyImageKHR(iter.second);
326 tbm_surface_internal_unref(iter.first);
331 bool NativeImageSourceQueueTizen::CheckBlending(int format)
333 for(int i = 0; i < NUM_FORMATS_BLENDING_REQUIRED; ++i)
335 if(format == FORMATS_BLENDING_REQUIRED[i])
344 } // namespace Adaptor
346 } // namespace Internal