X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Frender%2Frenderers%2Funiform-buffer-manager.cpp;h=5e04f82cc0187ec4823d10069986a475c7ad911a;hb=fb91f027aa740dd18f01eef6aa1ec7b08fe21401;hp=828cfaea98087dabdf02f572e1cfee8a2838d11b;hpb=138030416be357e3806214182ee29825fa2b976f;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/render/renderers/uniform-buffer-manager.cpp b/dali/internal/render/renderers/uniform-buffer-manager.cpp index 828cfae..5e04f82 100644 --- a/dali/internal/render/renderers/uniform-buffer-manager.cpp +++ b/dali/internal/render/renderers/uniform-buffer-manager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 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. @@ -15,161 +15,70 @@ * */ -#include "uniform-buffer-manager.h" +// CLASS HEADER +#include + +// INTERNAL INCLUDES +#include +#include +#include + #include #include #include #include -namespace Dali -{ -namespace Internal -{ -namespace Render -{ -UniformBuffer::UniformBuffer(Dali::Graphics::Controller* controller, - uint32_t sizeInBytes, - uint32_t alignment, - bool persistentMappedEnabled, - Graphics::BufferUsageFlags usageFlags) -: mController(controller), - mSize(0u), - mPersistentMappedEnabled(persistentMappedEnabled), - mUsageFlags(usageFlags) -{ - if(sizeInBytes) - { - Reserve(sizeInBytes); - } -} - -UniformBuffer::~UniformBuffer() +namespace Dali::Internal::Render { - Flush(); - Unmap(); -} - -void UniformBuffer::Flush() +UniformBufferManager::UniformBufferManager(Dali::Graphics::Controller* controller) +: mController(controller) { - if(mBuffer && mMemory) - { - mMemory->Flush(); - } } -void UniformBuffer::Reserve(uint32_t size) -{ - if(mBuffer && mMemory) - { - Unmap(); - mMemory = nullptr; - } - - mSize = size; - - auto createInfo = Graphics::BufferCreateInfo() - .SetSize(mSize) - .SetBufferPropertiesFlags(0 | Graphics::BufferPropertiesFlagBit::CPU_ALLOCATED) - .SetUsage(mUsageFlags); - - mBuffer = mController->CreateBuffer(createInfo, std::move(mBuffer)); - - mMapBufferInfo.buffer = mBuffer.get(); - mMapBufferInfo.usage = 0 | Graphics::MemoryUsageFlagBits::WRITE; - mMapBufferInfo.offset = 0; - mMapBufferInfo.size = size; - - if(mPersistentMappedEnabled) - { - Map(); - } -} +UniformBufferManager::~UniformBufferManager() = default; -void UniformBuffer::Fill(char data, uint32_t offset, uint32_t size) +Graphics::UniquePtr UniformBufferManager::AllocateUniformBuffer(uint32_t size, uint32_t alignment) { - bool locallyMapped = (mMemory == nullptr); - if(locallyMapped) - { - Map(); - } - - if(mMemory) - { - void* ptr = mMemory->LockRegion(0, mSize); - - auto begin = (reinterpret_cast(ptr) + offset); - if(size == 0) - { - size = mSize - offset - 1; - } - auto end = begin + size; - std::fill(begin, end, data); - - mMemory->Unlock(true); - } - - if(locallyMapped) - { - Unmap(); - } + // TODO : Current code only assume CPU_ALLOCATED uniform buffer now + return Graphics::UniquePtr( + new UniformBuffer(mController, + size, + alignment, + Dali::Graphics::BufferUsageFlags{0u} | Dali::Graphics::BufferUsage::TRANSFER_DST | Dali::Graphics::BufferUsage::UNIFORM_BUFFER, + Dali::Graphics::BufferPropertiesFlags{0u} | Dali::Graphics::BufferPropertiesFlagBit::CPU_ALLOCATED)); } -void UniformBuffer::Write(const void* data, uint32_t size, uint32_t dstOffset) +Graphics::UniquePtr UniformBufferManager::CreateUniformBufferView(UniformBuffer* uniformBuffer, uint32_t offset, uint32_t size) { - bool locallyMapped = (mMemory == nullptr); - if(locallyMapped) - { - Map(); - } - - if(mMemory) - { - void* ptr = mMemory->LockRegion(dstOffset, size); - if(ptr && dstOffset + size < mSize) - { - memcpy(ptr, data, size); - } - mMemory->Unlock(true); - } - - if(locallyMapped) - { - Unmap(); - } + // Allocate offset of given UBO (allocation strategy may reuse memory) + return Graphics::UniquePtr(new UniformBufferView(*uniformBuffer, offset, size)); } -void UniformBuffer::Map() +Graphics::UniquePtr UniformBufferManager::CreateUniformBufferViewPool() { - if(!mMemory) - { - mMemory = mController->MapBufferRange(mMapBufferInfo); - } + return Graphics::UniquePtr( + new UniformBufferViewPool(*this, 1)); } -void UniformBuffer::Unmap() +[[nodiscard]] UniformBufferViewPool* UniformBufferManager::GetUniformBufferViewPool(uint32_t bufferIndex) { - if(mMemory) + if(!mUniformBufferPoolStorage[bufferIndex]) { - mController->UnmapMemory(std::move(mMemory)); + // create new uniform buffer view pool with default (initial) capacity + mUniformBufferPoolStorage[bufferIndex] = CreateUniformBufferViewPool(); } + return mUniformBufferPoolStorage[bufferIndex].get(); } -UniformBufferManager::UniformBufferManager(Dali::Graphics::Controller* controller) -: mController(controller) +void UniformBufferManager::ReadyToLockUniformBuffer(uint32_t bufferIndex) { + GetUniformBufferViewPool(bufferIndex)->ReadyToLockUniformBuffer(); } -UniformBufferManager::~UniformBufferManager() = default; - -Graphics::UniquePtr UniformBufferManager::AllocateUniformBuffer(uint32_t size) +void UniformBufferManager::UnlockUniformBuffer(uint32_t bufferIndex) { - return Graphics::UniquePtr( - new UniformBuffer(mController, size, 256u, true, Dali::Graphics::BufferUsageFlags{0u} | Dali::Graphics::BufferUsage::TRANSFER_DST | Dali::Graphics::BufferUsage::UNIFORM_BUFFER)); + GetUniformBufferViewPool(bufferIndex)->UnlockUniformBuffer(); } -} // namespace Render - -} // namespace Internal - -} // namespace Dali +} // namespace Dali::Internal::Render