}
NativeImageSourceTizen::NativeImageSourceTizen(uint32_t width, uint32_t height, Dali::NativeImageSource::ColorDepth depth, Any nativeImageSource)
-: mCustomFragmentPrefix(),
- mWidth(width),
+: mWidth(width),
mHeight(height),
mOwnTbmSurface(false),
mTbmSurface(NULL),
mEglImageExtensions(NULL),
mSetSource(false),
mMutex(),
- mIsBufferAcquired(false)
+ mIsBufferAcquired(false),
+ mResourceDestructionCallback()
+
{
DALI_ASSERT_ALWAYS(Adaptor::IsAvailable());
GraphicsInterface* graphics = &(Adaptor::GetImplementation(Adaptor::Get()).GetGraphicsInterface());
mEglGraphics = static_cast<EglGraphics*>(graphics);
- mCustomFragmentPrefix = mEglGraphics->GetEglImageExtensionString();
-
mTbmSurface = GetSurfaceFromAny(nativeImageSource);
if(mTbmSurface != NULL)
bool NativeImageSourceTizen::CreateResource()
{
+ // If an EGL image exists, use it as it is without creating it.
+ if(mEglImageKHR != NULL)
+ {
+ return true;
+ }
+
// casting from an unsigned int to a void *, which should then be cast back
// to an unsigned int in the driver.
EGLClientBuffer eglBuffer = reinterpret_cast<EGLClientBuffer>(mTbmSurface);
mEglImageExtensions = mEglGraphics->GetImageExtensions();
DALI_ASSERT_DEBUG(mEglImageExtensions);
- // if resource of egl was not destroyed, destroy it first
- DestroyResource();
-
mEglImageKHR = mEglImageExtensions->CreateImageKHR(eglBuffer);
return mEglImageKHR != NULL;
mEglImageKHR = NULL;
}
+
+ if(mResourceDestructionCallback)
+ {
+ mResourceDestructionCallback->Trigger();
+ }
}
uint32_t NativeImageSourceTizen::TargetTexture()
Dali::Mutex::ScopedLock lock(mMutex);
if(mSetSource)
{
- void* eglImage = mEglImageKHR;
+ // Destroy previous eglImage because use for new one.
+ // if mEglImageKHR is not to be NULL here, it will not be updated with a new eglImage.
+ mEglImageExtensions->DestroyImageKHR(mEglImageKHR);
+ mEglImageKHR = NULL;
if(CreateResource())
{
TargetTexture();
}
- mEglImageExtensions->DestroyImageKHR(eglImage);
-
mSetSource = false;
}
}
-const char* NativeImageSourceTizen::GetCustomFragmentPrefix() const
+bool NativeImageSourceTizen::ApplyNativeFragmentShader(std::string& shader)
{
- return mCustomFragmentPrefix;
+ return mEglGraphics->ApplyNativeFragmentShader(shader, SAMPLER_TYPE);
}
const char* NativeImageSourceTizen::GetCustomSamplerTypename() const
{
tbm_surface_info_s info;
- if(tbm_surface_map(mTbmSurface, TBM_SURF_OPTION_READ, &info) != TBM_SURFACE_ERROR_NONE)
+ if(tbm_surface_map(mTbmSurface, TBM_SURF_OPTION_READ | TBM_SURF_OPTION_WRITE, &info) != TBM_SURFACE_ERROR_NONE)
{
DALI_LOG_ERROR("Fail to map tbm_surface\n");
return ret;
}
+void NativeImageSourceTizen::SetResourceDestructionCallback(EventThreadCallback* callback)
+{
+ mResourceDestructionCallback = std::unique_ptr<EventThreadCallback>(callback);
+}
+
} // namespace Adaptor
} // namespace Internal