X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Frendering%2Ftexture-impl.cpp;h=02e7484341b8094e126a2ef37b76364d4e25dfb9;hb=0a68c62785eaa442cfa213157431d6f2c9b37033;hp=abea00577408f6982057933bcce0c9e7144a010e;hpb=0d965a29cd89fe044757ffce9b5c7ba973f66487;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/rendering/texture-impl.cpp b/dali/internal/event/rendering/texture-impl.cpp index abea005..02e7484 100644 --- a/dali/internal/event/rendering/texture-impl.cpp +++ b/dali/internal/event/rendering/texture-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * Copyright (c) 2019 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. @@ -21,68 +21,77 @@ // INTERNAL INCLUDES #include #include +#include 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() ), +Texture::Texture(TextureType::Type type, Pixel::Format format, ImageDimensions size ) +: mEventThreadServices( EventThreadServices::Get() ), mRenderObject( NULL ), mNativeImage(), + mSize( size ), mType( type ), - mFormat( format ), - mWidth( width ), - mHeight( height ) + mFormat( format ) { } -NewTexture::NewTexture( NativeImageInterfacePtr nativeImageInterface ) -: mEventThreadServices( *Stage::GetCurrent() ), +Texture::Texture( NativeImageInterfacePtr nativeImageInterface ) +: mEventThreadServices( EventThreadServices::Get() ), mRenderObject( NULL ), mNativeImage( nativeImageInterface ), + mSize( nativeImageInterface->GetWidth(), nativeImageInterface->GetHeight() ), mType( TextureType::TEXTURE_2D ), - mFormat( Pixel::RGB888 ), - mWidth( nativeImageInterface->GetWidth() ), - mHeight( nativeImageInterface->GetHeight() ) + mFormat( Pixel::RGB888 ) { } -void NewTexture::Initialize() +void Texture::Initialize() { - if( mNativeImage ) - { - mRenderObject = new Render::NewTexture( mNativeImage ); - } - else + if( EventThreadServices::IsCoreRunning() ) { - mRenderObject = new Render::NewTexture( mType, mFormat, mWidth, mHeight ); - } + if( mNativeImage ) + { + mRenderObject = new Render::Texture( mNativeImage ); + } + else + { + 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 ) { @@ -90,69 +99,98 @@ NewTexture::~NewTexture() } } -void NewTexture::Upload( PixelDataPtr pixelData ) +bool Texture::Upload( PixelDataPtr pixelData ) { - Upload( pixelData, 0u, 0u, 0u, 0u, mWidth, mHeight ); + return Upload( pixelData, 0u, 0u, 0u, 0u, pixelData->GetWidth(), pixelData->GetHeight() ); } -void 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 ) { - if( mNativeImage ) - { - DALI_LOG_ERROR( "OpenGLES does not support uploading data to native texture"); - } - else + 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 ) { - unsigned int pixelDataSize = pixelData->GetWidth()*pixelData->GetHeight(); - if( pixelData->GetBuffer() == NULL || pixelDataSize == 0 ) + if( mNativeImage ) { - DALI_LOG_ERROR( "PixelData is empty"); + DALI_LOG_ERROR( "OpenGL ES does not support uploading data to native texture\n"); } else { - Pixel::Format pixelDataFormat = pixelData->GetPixelFormat(); - if( ( pixelDataFormat == mFormat ) || ( (pixelDataFormat == Pixel::RGB888 ) && ( mFormat == Pixel::RGBA8888 ) ) ) + unsigned int pixelDataSize = pixelData->GetWidth()*pixelData->GetHeight(); + if( pixelData->GetBuffer() == NULL || pixelDataSize == 0 ) { - if( pixelDataSize < width * height ) - { - DALI_LOG_ERROR( "Pixel data of an incorrect size when trying to update texture"); - } - else if( ( xOffset + width > ( mWidth / (1< ( mHeight / (1<GetPixelFormat(); + if( ( pixelDataFormat == mFormat ) || ( (pixelDataFormat == Pixel::RGB888 ) && ( mFormat == Pixel::RGBA8888 ) ) ) { - DALI_LOG_ERROR( "Texture update area out of bounds"); + if( pixelDataSize < width * height ) + { + DALI_LOG_ERROR( "PixelData of an incorrect size when trying to update texture\n"); + } + else if( ( xOffset + width > ( mSize.GetWidth() / (1u << mipmap) ) ) || + ( yOffset + height > ( mSize.GetHeight() / (1u << mipmap) ) ) ) + { + DALI_LOG_ERROR( "Texture update area out of bounds\n"); + } + else + { + //Parameters are correct. Send message to upload data to the texture + 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 { - //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 ); + DALI_LOG_ERROR( "Bad format\n"); } } - else - { - DALI_LOG_ERROR( "Bad format"); - } } } + + return result; } -void NewTexture::GenerateMipmaps() +void Texture::GenerateMipmaps() { - GenerateMipmapsMessage(mEventThreadServices.GetUpdateManager(), *mRenderObject ); + if( EventThreadServices::IsCoreRunning() && 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(); } } // namespace Internal