/*
- * Copyright (c) 2015 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.
#include <dali/internal/event/rendering/texture-impl.h> // Dali::Internal::Texture
// INTERNAL INCLUDES
-#include <dali/internal/update/manager/update-manager.h>
+#include <dali/integration-api/render-controller.h>
#include <dali/internal/event/common/stage-impl.h>
+#include <dali/internal/update/manager/update-manager.h>
namespace Dali
{
namespace Internal
{
-
-NewTexturePtr NewTexture::New(TextureType::Type type, Pixel::Format format, unsigned int width, unsigned int height )
+TexturePtr Texture::New(TextureType::Type type, Pixel::Format format, unsigned int width, unsigned int height)
{
- NewTexturePtr texture( new NewTexture( type, format, width, height ) );
+ constexpr auto max_value = std::numeric_limits<uint16_t>::max();
+ DALI_ASSERT_ALWAYS((width < max_value) && (height < max_value) && "Size out of range");
+ TexturePtr texture(new Texture(type, format, ImageDimensions(width, height)));
texture->Initialize();
return texture;
}
-NewTexturePtr NewTexture::New( NativeImageInterface& nativeImageInterface )
+TexturePtr Texture::New(NativeImageInterface& nativeImageInterface)
{
- NewTexturePtr texture( new NewTexture( &nativeImageInterface ) );
+ TexturePtr texture(new Texture(&nativeImageInterface));
texture->Initialize();
+
+ // Request event processing and update forcely.
+ texture->mEventThreadServices.GetRenderController().RequestProcessEventsOnIdle(true);
+ texture->mEventThreadServices.ForceNextUpdate();
return texture;
}
-Render::NewTexture* NewTexture::GetRenderObject() const
+Render::Texture* Texture::GetRenderObject() const
{
return mRenderObject;
}
-NewTexture::NewTexture(TextureType::Type type, Pixel::Format format, unsigned int width, unsigned int height )
-: mEventThreadServices( *Stage::GetCurrent() ),
- mRenderObject( NULL ),
+Texture::Texture(TextureType::Type type, Pixel::Format format, ImageDimensions size)
+: mEventThreadServices(EventThreadServices::Get()),
+ mRenderObject(nullptr),
mNativeImage(),
- mType( type ),
- mFormat( format ),
- mWidth( width ),
- mHeight( height )
+ mSize(size),
+ mType(type),
+ mFormat(format)
{
}
-NewTexture::NewTexture( NativeImageInterfacePtr nativeImageInterface )
-: mEventThreadServices( *Stage::GetCurrent() ),
- mRenderObject( NULL ),
- mNativeImage( nativeImageInterface ),
- mType( TextureType::TEXTURE_2D ),
- mFormat( Pixel::RGB888 ),
- mWidth( nativeImageInterface->GetWidth() ),
- mHeight( nativeImageInterface->GetHeight() )
+Texture::Texture(NativeImageInterfacePtr nativeImageInterface)
+: mEventThreadServices(EventThreadServices::Get()),
+ mRenderObject(nullptr),
+ mNativeImage(nativeImageInterface),
+ mSize(nativeImageInterface->GetWidth(), nativeImageInterface->GetHeight()),
+ mType(TextureType::TEXTURE_2D),
+ mFormat(Pixel::RGB888)
{
}
-void NewTexture::Initialize()
+void Texture::Initialize()
{
- if( EventThreadServices::IsCoreRunning() )
+ if(EventThreadServices::IsCoreRunning())
{
- if( mNativeImage )
+ if(mNativeImage)
{
- mRenderObject = new Render::NewTexture( mNativeImage );
+ mRenderObject = new Render::Texture(mNativeImage);
}
else
{
- mRenderObject = new Render::NewTexture( mType, mFormat, mWidth, mHeight );
+ mRenderObject = new Render::Texture(mType, mFormat, mSize);
}
- AddTexture( mEventThreadServices.GetUpdateManager(), *mRenderObject );
+ OwnerPointer<Render::Texture> transferOwnership(mRenderObject);
+ AddTexture(mEventThreadServices.GetUpdateManager(), transferOwnership);
}
}
-NewTexture::~NewTexture()
+Texture::~Texture()
{
- if( EventThreadServices::IsCoreRunning() && mRenderObject )
+ if(EventThreadServices::IsCoreRunning() && mRenderObject)
{
- RemoveTexture( mEventThreadServices.GetUpdateManager(), *mRenderObject );
+ RemoveTexture(mEventThreadServices.GetUpdateManager(), *mRenderObject);
}
}
-bool NewTexture::Upload( PixelDataPtr pixelData )
+bool Texture::Upload(PixelDataPtr pixelData)
{
- return Upload( pixelData, 0u, 0u, 0u, 0u, pixelData->GetWidth(), pixelData->GetHeight() );
+ return Upload(pixelData, 0u, 0u, 0u, 0u, pixelData->GetWidth(), pixelData->GetHeight());
}
-bool NewTexture::Upload( PixelDataPtr pixelData,
- unsigned int layer, unsigned int mipmap,
- unsigned int xOffset, unsigned int yOffset,
- unsigned int width, unsigned int height )
+bool Texture::Upload(PixelDataPtr pixelData,
+ unsigned int layer,
+ unsigned int mipmap,
+ unsigned int xOffset,
+ unsigned int yOffset,
+ unsigned int width,
+ unsigned int height)
{
+ constexpr auto max_value = std::numeric_limits<uint16_t>::max();
+ DALI_ASSERT_ALWAYS(layer < max_value &&
+ mipmap < max_value &&
+ xOffset < max_value &&
+ yOffset < max_value &&
+ width < max_value &&
+ height < max_value &&
+ "Parameter value out of range");
+
bool result(false);
- if( EventThreadServices::IsCoreRunning() && mRenderObject )
+ if(EventThreadServices::IsCoreRunning() && mRenderObject)
{
- if( mNativeImage )
+ if(mNativeImage)
{
- DALI_LOG_ERROR( "OpenGL ES does not support uploading data to native texture\n");
+ DALI_LOG_ERROR("OpenGL ES does not support uploading data to native texture\n");
}
else
{
- unsigned int pixelDataSize = pixelData->GetWidth()*pixelData->GetHeight();
- if( pixelData->GetBuffer() == NULL || pixelDataSize == 0 )
+ unsigned int pixelDataSize = pixelData->GetWidth() * pixelData->GetHeight();
+ if(pixelData->GetBuffer() == nullptr || pixelDataSize == 0)
{
- DALI_LOG_ERROR( "PixelData is empty\n");
+ DALI_LOG_ERROR("PixelData is empty\n");
}
else
{
Pixel::Format pixelDataFormat = pixelData->GetPixelFormat();
- if( ( pixelDataFormat == mFormat ) || ( (pixelDataFormat == Pixel::RGB888 ) && ( mFormat == Pixel::RGBA8888 ) ) )
+ if((pixelDataFormat == mFormat) || ((pixelDataFormat == Pixel::RGB888) && (mFormat == Pixel::RGBA8888)))
{
- if( pixelDataSize < width * height )
+ if(pixelDataSize < width * height)
{
- DALI_LOG_ERROR( "PixelData of an incorrect size when trying to update texture\n");
+ DALI_LOG_ERROR("PixelData of an incorrect size when trying to update texture\n");
}
- else if( ( xOffset + width > ( mWidth / (1<<mipmap) ) ) ||
- ( yOffset + height > ( mHeight / (1<<mipmap) ) ) )
+ else if((xOffset + width > (mSize.GetWidth() / (1u << mipmap))) ||
+ (yOffset + height > (mSize.GetHeight() / (1u << mipmap))))
{
- DALI_LOG_ERROR( "Texture update area out of bounds\n");
+ DALI_LOG_ERROR("Texture update area out of bounds\n");
}
else
{
//Parameters are correct. Send message to upload data to the texture
- UploadParams params = { layer, mipmap, xOffset, yOffset, width, height };
- UploadTextureMessage( mEventThreadServices.GetUpdateManager(), *mRenderObject, pixelData, params );
+ UploadParams params = {static_cast<uint16_t>(layer),
+ static_cast<uint16_t>(mipmap),
+ static_cast<uint16_t>(xOffset),
+ static_cast<uint16_t>(yOffset),
+ static_cast<uint16_t>(width),
+ static_cast<uint16_t>(height)};
+ UploadTextureMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject, pixelData, params);
+
+ // Request event processing and update forcely
+ mEventThreadServices.GetRenderController().RequestProcessEventsOnIdle(true);
+ mEventThreadServices.ForceNextUpdate();
+
result = true;
}
}
else
{
- DALI_LOG_ERROR( "Bad format\n");
+ DALI_LOG_ERROR("Bad format\n");
}
}
}
return result;
}
-void NewTexture::GenerateMipmaps()
+void Texture::GenerateMipmaps()
{
- if( EventThreadServices::IsCoreRunning() && mRenderObject )
+ if(EventThreadServices::IsCoreRunning() && mRenderObject)
{
- GenerateMipmapsMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject );
+ GenerateMipmapsMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject);
}
}
-unsigned int NewTexture::GetWidth() const
+unsigned int Texture::GetWidth() const
{
- return mWidth;
+ return mSize.GetWidth();
}
-unsigned int NewTexture::GetHeight() const
+unsigned int Texture::GetHeight() const
{
- return mHeight;
+ return mSize.GetHeight();
+}
+
+bool Texture::IsNative() const
+{
+ return static_cast<bool>(mNativeImage);
+}
+
+bool Texture::ApplyNativeFragmentShader(std::string& shader)
+{
+ bool modified = false;
+ if(mNativeImage && !shader.empty())
+ {
+ modified = mNativeImage->ApplyNativeFragmentShader(shader);
+ }
+
+ return modified;
}
} // namespace Internal