From: Eunki, Hong Date: Thu, 15 Feb 2024 08:32:10 +0000 (+0900) Subject: Ignore glTexImage2D if we know given texture is already discarded X-Git-Tag: accepted/tizen/unified/20240221.062924~3^2^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4568a4204bba6f5a6716efc8068ee09b26706335;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git 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 --- diff --git a/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp b/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp index abe4c4753..3d7979ace 100644 --- a/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp +++ b/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp @@ -438,7 +438,7 @@ void EglGraphicsController::ProcessDiscardQueues() DALI_TRACE_SCOPE(gTraceFilter, "DALI_EGL_CONTROLLER_DISCARD_QUEUE"); // Process textures - ProcessDiscardQueue(mDiscardTextureQueue); + ProcessDiscardSet(mDiscardTextureSet); // Process buffers ProcessDiscardQueue(mDiscardBufferQueue); @@ -777,89 +777,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 c4a0ba01b..cddc538b8 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 @@ -384,7 +385,7 @@ public: */ void DiscardResource(GLES::Texture* texture) { - mDiscardTextureQueue.push(texture); + mDiscardTextureSet.insert(texture); } /** @@ -644,6 +645,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 */ @@ -820,8 +855,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