From d2dd61be7c0c013e449b808054d5f531ff29a5b1 Mon Sep 17 00:00:00 2001 From: "Eunki, Hong" Date: Thu, 15 Feb 2024 17:32:10 +0900 Subject: [PATCH] [Tizen] Ignore glTexImage2D if we know given texture is already discarded Since glTexImage2D is heavy operation, and if we know that we don't use it, we can ignore the texture upload operations. Change-Id: If474919945d39d19f8870b06850db4e843d7ba11 Signed-off-by: Eunki, Hong --- .../gles-impl/egl-graphics-controller.cpp | 146 +++++++++--------- .../gles-impl/egl-graphics-controller.h | 41 ++++- .../graphics/gles/gl-implementation.h | 4 +- 3 files changed, 115 insertions(+), 76 deletions(-) diff --git a/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp b/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp index 7d6717d60..40eeb0c85 100644 --- a/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp +++ b/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp @@ -441,7 +441,7 @@ void EglGraphicsController::ProcessDiscardQueues() DALI_TRACE_SCOPE(gTraceFilter, "DALI_EGL_CONTROLLER_DISCARD_QUEUE"); // Process textures - ProcessDiscardQueue(mDiscardTextureQueue); + ProcessDiscardSet(mDiscardTextureSet); // Process buffers ProcessDiscardQueue(mDiscardBufferQueue); @@ -780,89 +780,93 @@ void EglGraphicsController::ProcessTextureUpdateQueue() sourceBufferReleaseRequired = Dali::Integration::IsPixelDataReleaseAfterUpload(source.pixelDataSource.pixelData) && info.srcOffset == 0u; } - auto sourceStride = info.srcStride; - std::vector tempBuffer; - - if(mGlAbstraction->TextureRequiresConverting(srcFormat, destFormat, isSubImage)) + // Skip texture upload if given texture is already discarded for this render loop. + if(mDiscardTextureSet.find(texture) == mDiscardTextureSet.end()) { - // Convert RGB to RGBA if necessary. - if(texture->TryConvertPixelData(sourceBuffer, info.srcFormat, createInfo.format, info.srcSize, info.srcStride, info.srcExtent2D.width, info.srcExtent2D.height, tempBuffer)) + auto sourceStride = info.srcStride; + std::vector tempBuffer; + + if(mGlAbstraction->TextureRequiresConverting(srcFormat, destFormat, isSubImage)) { - sourceBuffer = &tempBuffer[0]; - sourceStride = 0u; // Converted buffer compacted. make stride as 0. - srcFormat = destFormat; - srcType = GLES::GLTextureFormatType(createInfo.format).type; + // Convert RGB to RGBA if necessary. + if(texture->TryConvertPixelData(sourceBuffer, info.srcFormat, createInfo.format, info.srcSize, info.srcStride, info.srcExtent2D.width, info.srcExtent2D.height, tempBuffer)) + { + sourceBuffer = &tempBuffer[0]; + sourceStride = 0u; // Converted buffer compacted. make stride as 0. + srcFormat = destFormat; + srcType = GLES::GLTextureFormatType(createInfo.format).type; + } } - } - // Calculate the maximum mipmap level for the texture - texture->SetMaxMipMapLevel(std::max(texture->GetMaxMipMapLevel(), info.level)); + // Calculate the maximum mipmap level for the texture + texture->SetMaxMipMapLevel(std::max(texture->GetMaxMipMapLevel(), info.level)); - GLenum bindTarget{GL_TEXTURE_2D}; - GLenum target{GL_TEXTURE_2D}; + GLenum bindTarget{GL_TEXTURE_2D}; + GLenum target{GL_TEXTURE_2D}; - if(createInfo.textureType == Graphics::TextureType::TEXTURE_CUBEMAP) - { - bindTarget = GL_TEXTURE_CUBE_MAP; - target = GL_TEXTURE_CUBE_MAP_POSITIVE_X + info.layer; - } + if(createInfo.textureType == Graphics::TextureType::TEXTURE_CUBEMAP) + { + bindTarget = GL_TEXTURE_CUBE_MAP; + target = GL_TEXTURE_CUBE_MAP_POSITIVE_X + info.layer; + } - mGlAbstraction->PixelStorei(GL_UNPACK_ALIGNMENT, 1); - mGlAbstraction->PixelStorei(GL_UNPACK_ROW_LENGTH, sourceStride); + mGlAbstraction->PixelStorei(GL_UNPACK_ALIGNMENT, 1); + mGlAbstraction->PixelStorei(GL_UNPACK_ROW_LENGTH, sourceStride); - mCurrentContext->BindTexture(bindTarget, texture->GetTextureTypeId(), texture->GetGLTexture()); + mCurrentContext->BindTexture(bindTarget, texture->GetTextureTypeId(), texture->GetGLTexture()); - if(!isSubImage) - { - if(!texture->IsCompressed()) - { - mGlAbstraction->TexImage2D(target, - info.level, - destInternalFormat, - info.srcExtent2D.width, - info.srcExtent2D.height, - 0, - srcFormat, - srcType, - sourceBuffer); - } - else - { - mGlAbstraction->CompressedTexImage2D(target, - info.level, - destInternalFormat, - info.srcExtent2D.width, - info.srcExtent2D.height, - 0, - info.srcSize, - sourceBuffer); - } - } - else - { - if(!texture->IsCompressed()) + if(!isSubImage) { - mGlAbstraction->TexSubImage2D(target, - info.level, - info.dstOffset2D.x, - info.dstOffset2D.y, - info.srcExtent2D.width, - info.srcExtent2D.height, - srcFormat, - srcType, - sourceBuffer); + if(!texture->IsCompressed()) + { + mGlAbstraction->TexImage2D(target, + info.level, + destInternalFormat, + info.srcExtent2D.width, + info.srcExtent2D.height, + 0, + srcFormat, + srcType, + sourceBuffer); + } + else + { + mGlAbstraction->CompressedTexImage2D(target, + info.level, + destInternalFormat, + info.srcExtent2D.width, + info.srcExtent2D.height, + 0, + info.srcSize, + sourceBuffer); + } } else { - mGlAbstraction->CompressedTexSubImage2D(target, - info.level, - info.dstOffset2D.x, - info.dstOffset2D.y, - info.srcExtent2D.width, - info.srcExtent2D.height, - srcFormat, - info.srcSize, - sourceBuffer); + if(!texture->IsCompressed()) + { + mGlAbstraction->TexSubImage2D(target, + info.level, + info.dstOffset2D.x, + info.dstOffset2D.y, + info.srcExtent2D.width, + info.srcExtent2D.height, + srcFormat, + srcType, + sourceBuffer); + } + else + { + mGlAbstraction->CompressedTexSubImage2D(target, + info.level, + info.dstOffset2D.x, + info.dstOffset2D.y, + info.srcExtent2D.width, + info.srcExtent2D.height, + srcFormat, + info.srcSize, + sourceBuffer); + } } } diff --git a/dali/internal/graphics/gles-impl/egl-graphics-controller.h b/dali/internal/graphics/gles-impl/egl-graphics-controller.h index 2c3f435f5..2b8c6b5e0 100644 --- a/dali/internal/graphics/gles-impl/egl-graphics-controller.h +++ b/dali/internal/graphics/gles-impl/egl-graphics-controller.h @@ -22,6 +22,7 @@ #include #include #include +#include // INTERNAL INCLUDES #include @@ -377,7 +378,7 @@ public: */ void DiscardResource(GLES::Texture* texture) { - mDiscardTextureQueue.push(texture); + mDiscardTextureSet.insert(texture); } /** @@ -637,6 +638,40 @@ public: } } + /** + * @brief Processes a discard set for type specified + * + * @param[in,out] set Reference to the discard set + */ + template + void ProcessDiscardSet(T& set) + { + while(!set.empty()) + { + auto iter = set.begin(); + auto* object = const_cast(*iter); + + // Destroy + object->DestroyResource(); + + // Free + auto* clbk = object->GetCreateInfo().allocationCallbacks; + if(clbk) + { + // Call destructor + object->~U(); + + // Free memory + clbk->freeCallback(object, clbk->userData); + } + else + { + delete object; + } + set.erase(iter); + } + } + /** * @brief Processes all resource create queues */ @@ -813,8 +848,8 @@ private: Internal::Adaptor::EglSyncImplementation* mEglSyncImplementation{nullptr}; Internal::Adaptor::GraphicsInterface* mGraphics{nullptr}; // Pointer to owning structure via interface. - std::queue mCreateTextureQueue; ///< Create queue for texture resource - std::queue mDiscardTextureQueue; ///< Discard queue for texture resource + std::queue mCreateTextureQueue; ///< Create queue for texture resource + std::unordered_set mDiscardTextureSet; ///< Discard queue for texture resource std::queue mCreateBufferQueue; ///< Create queue for buffer resource std::queue mDiscardBufferQueue; ///< Discard queue for buffer resource diff --git a/dali/internal/graphics/gles/gl-implementation.h b/dali/internal/graphics/gles/gl-implementation.h index bf40d8cb0..733743bdd 100644 --- a/dali/internal/graphics/gles/gl-implementation.h +++ b/dali/internal/graphics/gles/gl-implementation.h @@ -877,7 +877,7 @@ public: glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); - FINISH_DURATION_CHECK_WITH_FORMAT("glTexImage2D", "size : %u x %u", width, height); + FINISH_DURATION_CHECK_WITH_FORMAT("glTexImage2D", "size : %u x %u, format : %d, type : %d", width, height, static_cast(format), static_cast(type)); } void TexParameterf(GLenum target, GLenum pname, GLfloat param) override @@ -906,7 +906,7 @@ public: glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); - FINISH_DURATION_CHECK_WITH_FORMAT("glTexSubImage2D", "size : %u x %u", width, height); + FINISH_DURATION_CHECK_WITH_FORMAT("glTexSubImage2D", "size : %u x %u, format : %d, type : %d", width, height, static_cast(format), static_cast(type)); } void Uniform1f(GLint location, GLfloat x) override -- 2.34.1