X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fgraphics%2Fgles-impl%2Fegl-graphics-controller.cpp;h=2206b12ca0e2e0785369eac7b9e9b519aa4ea316;hb=738af85a1b87813312227305117798edf85af875;hp=12c4723a0aa164b14e172e6a9542a681e9cdb064;hpb=0c2e4f78ba84dfae392bb177c269940e7b9a03dd;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp b/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp index 12c4723..2206b12 100644 --- a/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp +++ b/dali/internal/graphics/gles-impl/egl-graphics-controller.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 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. @@ -18,6 +18,7 @@ #include // EXTERNAL INCLUDES +#include #include // INTERNAL INCLUDES @@ -128,6 +129,7 @@ T0* CastObject(T1* apiObject) // Maximum size of texture upload buffer. const uint32_t TEXTURE_UPLOAD_MAX_BUFER_SIZE_MB = 1; +DALI_INIT_TRACE_FILTER(gTraceFilter, DALI_TRACE_EGL, false); } // namespace EglGraphicsController::EglGraphicsController() @@ -150,7 +152,7 @@ void EglGraphicsController::InitializeGLES(Integration::GlAbstraction& glAbstrac { DALI_LOG_RELEASE_INFO("Initializing Graphics Controller Phase 1\n"); mGlAbstraction = &glAbstraction; - mContext = std::make_unique(*this); + mContext = std::make_unique(*this, mGlAbstraction); mCurrentContext = mContext.get(); } @@ -298,7 +300,7 @@ Graphics::UniquePtr EglGraphicsController::CreatePipeline( Graphics::UniquePtr EglGraphicsController::CreateProgram( const ProgramCreateInfo& programCreateInfo, UniquePtr&& oldProgram) { - // Create program cache if needed + // Create pipeline cache if needed if(!mPipelineCache) { mPipelineCache = std::make_unique(*this); @@ -309,7 +311,12 @@ Graphics::UniquePtr EglGraphicsController::CreateProgram( Graphics::UniquePtr EglGraphicsController::CreateShader(const ShaderCreateInfo& shaderCreateInfo, Graphics::UniquePtr&& oldShader) { - return NewObject(shaderCreateInfo, *this, std::move(oldShader)); + // Create pipeline cache if needed + if(!mPipelineCache) + { + mPipelineCache = std::make_unique(*this); + } + return mPipelineCache->GetShader(shaderCreateInfo, std::move(oldShader)); } Graphics::UniquePtr EglGraphicsController::CreateSampler(const SamplerCreateInfo& samplerCreateInfo, Graphics::UniquePtr&& oldSampler) @@ -352,7 +359,7 @@ MemoryRequirements EglGraphicsController::GetBufferMemoryRequirements(Buffer& bu TextureProperties EglGraphicsController::GetTextureProperties(const Texture& texture) { const GLES::Texture* glesTexture = static_cast(&texture); - auto createInfo = glesTexture->GetCreateInfo(); + const auto& createInfo = glesTexture->GetCreateInfo(); TextureProperties properties{}; properties.format = createInfo.format; @@ -371,7 +378,7 @@ const Graphics::Reflection& EglGraphicsController::GetProgramReflection(const Gr void EglGraphicsController::CreateSurfaceContext(Dali::RenderSurfaceInterface* surface) { - std::unique_ptr context = std::make_unique(*this); + std::unique_ptr context = std::make_unique(*this, mGlAbstraction); mSurfaceContexts.push_back(std::move(std::make_pair(surface, std::move(context)))); } @@ -430,6 +437,8 @@ void EglGraphicsController::AddFramebuffer(GLES::Framebuffer& framebuffer) void EglGraphicsController::ProcessDiscardQueues() { + DALI_TRACE_SCOPE(gTraceFilter, "DALI_EGL_CONTROLLER_DISCARD_QUEUE"); + // Process textures ProcessDiscardQueue(mDiscardTextureQueue); @@ -446,9 +455,17 @@ void EglGraphicsController::ProcessDiscardQueues() ProcessDiscardQueue(mDiscardRenderTargetQueue); // Process pipelines + if(mPipelineCache && !mDiscardPipelineQueue.empty()) + { + mPipelineCache->MarkPipelineCacheFlushRequired(); + } ProcessDiscardQueue(mDiscardPipelineQueue); // Process programs + if(mPipelineCache && !mDiscardProgramQueue.empty()) + { + mPipelineCache->MarkProgramCacheFlushRequired(); + } ProcessDiscardQueue(mDiscardProgramQueue); // Process shaders @@ -463,6 +480,7 @@ void EglGraphicsController::ProcessDiscardQueues() void EglGraphicsController::ProcessCreateQueues() { + DALI_TRACE_SCOPE(gTraceFilter, "DALI_EGL_CONTROLLER_CREATE_QUEUE"); // Process textures ProcessCreateQueue(mCreateTextureQueue); @@ -477,6 +495,11 @@ void EglGraphicsController::ProcessCommandBuffer(const GLES::CommandBuffer& comm { auto count = 0u; const auto commands = commandBuffer.GetCommands(count); + + DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_CONTROLLER_PROCESS", [&](std::ostringstream& oss) { + oss << "[commandCount:" << count << "]"; + }); + for(auto i = 0u; i < count; ++i) { auto& cmd = commands[i]; @@ -689,6 +712,7 @@ void EglGraphicsController::ProcessCommandBuffer(const GLES::CommandBuffer& comm } } } + DALI_TRACE_END(gTraceFilter, "DALI_EGL_CONTROLLER_PROCESS"); } void EglGraphicsController::ProcessCommandQueues() @@ -708,6 +732,11 @@ void EglGraphicsController::ProcessCommandQueues() void EglGraphicsController::ProcessTextureUpdateQueue() { + if(mTextureUpdateRequests.empty()) + { + return; + } + DALI_TRACE_SCOPE(gTraceFilter, "DALI_EGL_CONTROLLER_TEXTURE_UPDATE"); while(!mTextureUpdateRequests.empty()) { TextureUpdateRequest& request = mTextureUpdateRequests.front(); @@ -735,17 +764,19 @@ void EglGraphicsController::ProcessTextureUpdateQueue() info.srcExtent2D.width != (createInfo.size.width / (1 << info.level)) || info.srcExtent2D.height != (createInfo.size.height / (1 << info.level))); - uint8_t* sourceBuffer; + uint8_t* sourceBuffer = nullptr; + bool sourceBufferReleaseRequired = false; if(source.sourceType == Graphics::TextureUpdateSourceInfo::Type::MEMORY) { - sourceBuffer = reinterpret_cast(source.memorySource.memory); + sourceBuffer = reinterpret_cast(source.memorySource.memory); + sourceBufferReleaseRequired = true; } else { - // Get buffer of PixelData Dali::Integration::PixelDataBuffer pixelBufferData = Dali::Integration::GetPixelDataBuffer(source.pixelDataSource.pixelData); - sourceBuffer = pixelBufferData.buffer + info.srcOffset; + sourceBuffer = pixelBufferData.buffer + info.srcOffset; + sourceBufferReleaseRequired = Dali::Integration::IsPixelDataReleaseAfterUpload(source.pixelDataSource.pixelData) && info.srcOffset == 0u; } auto sourceStride = info.srcStride; @@ -834,10 +865,16 @@ void EglGraphicsController::ProcessTextureUpdateQueue() } } - if(source.sourceType == Graphics::TextureUpdateSourceInfo::Type::MEMORY) + if(sourceBufferReleaseRequired && sourceBuffer != nullptr) { - // free staging memory - free(source.memorySource.memory); + if(source.sourceType == Graphics::TextureUpdateSourceInfo::Type::MEMORY) + { + free(reinterpret_cast(sourceBuffer)); + } + else + { + Dali::Integration::ReleasePixelDataBuffer(source.pixelDataSource.pixelData); + } } break; } @@ -912,6 +949,11 @@ void EglGraphicsController::UpdateTextures(const std::vector& void EglGraphicsController::ProcessTextureMipmapGenerationQueue() { + if(mTextureMipmapGenerationRequests.empty()) + { + return; + } + DALI_TRACE_SCOPE(gTraceFilter, "DALI_EGL_CONTROLLER_TEXTURE_MIPMAP"); while(!mTextureMipmapGenerationRequests.empty()) { auto* texture = mTextureMipmapGenerationRequests.front();