Revert "[Tizen] Implement partial update"
[platform/core/uifw/dali-core.git] / dali / internal / event / rendering / texture-impl.cpp
index abea005..02e7484 100644 (file)
@@ -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.
 // INTERNAL INCLUDES
 #include <dali/internal/update/manager/update-manager.h>
 #include <dali/internal/event/common/stage-impl.h>
+#include <dali/integration-api/render-controller.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() ),
+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<<mipmap) ) ) ||
-                 ( yOffset + height > ( mHeight / (1<<mipmap) ) ) )
+        DALI_LOG_ERROR( "PixelData is empty\n");
+      }
+      else
+      {
+        Pixel::Format pixelDataFormat = pixelData->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