2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "uniform-buffer-manager.h"
19 #include <dali/graphics-api/graphics-buffer-create-info.h>
20 #include <dali/graphics-api/graphics-buffer.h>
31 UniformBuffer::UniformBuffer(Dali::Graphics::Controller* controller,
34 bool persistentMappedEnabled,
35 Graphics::BufferUsageFlags usageFlags)
36 : mController(controller),
38 mPersistentMappedEnabled(persistentMappedEnabled),
39 mUsageFlags(usageFlags)
47 UniformBuffer::~UniformBuffer()
53 void UniformBuffer::Flush()
55 if(mBuffer && mMemory)
61 void UniformBuffer::Reserve(uint32_t size)
63 if(mBuffer && mMemory)
71 auto createInfo = Graphics::BufferCreateInfo()
73 .SetBufferPropertiesFlags(0 | Graphics::BufferPropertiesFlagBit::CPU_ALLOCATED)
74 .SetUsage(mUsageFlags);
76 mBuffer = mController->CreateBuffer(createInfo, std::move(mBuffer));
78 mMapBufferInfo.buffer = mBuffer.get();
79 mMapBufferInfo.usage = 0 | Graphics::MemoryUsageFlagBits::WRITE;
80 mMapBufferInfo.offset = 0;
81 mMapBufferInfo.size = size;
83 if(mPersistentMappedEnabled)
89 void UniformBuffer::Fill(char data, uint32_t offset, uint32_t size)
91 bool locallyMapped = (mMemory == nullptr);
99 void* ptr = mMemory->LockRegion(0, mSize);
101 auto begin = (reinterpret_cast<char*>(ptr) + offset);
104 size = mSize - offset - 1;
106 auto end = begin + size;
107 std::fill(begin, end, data);
109 mMemory->Unlock(true);
118 void UniformBuffer::Write(const void* data, uint32_t size, uint32_t dstOffset)
120 bool locallyMapped = (mMemory == nullptr);
128 void* ptr = mMemory->LockRegion(dstOffset, size);
129 if(ptr && dstOffset + size < mSize)
131 memcpy(ptr, data, size);
133 mMemory->Unlock(true);
142 void UniformBuffer::Map()
146 mMemory = mController->MapBufferRange(mMapBufferInfo);
150 void UniformBuffer::Unmap()
154 mController->UnmapMemory(std::move(mMemory));
158 UniformBufferManager::UniformBufferManager(Dali::Graphics::Controller* controller)
159 : mController(controller)
163 UniformBufferManager::~UniformBufferManager() = default;
165 Graphics::UniquePtr<UniformBuffer> UniformBufferManager::AllocateUniformBuffer(uint32_t size)
167 return Graphics::UniquePtr<UniformBuffer>(
168 new UniformBuffer(mController, size, 256u, true, Dali::Graphics::BufferUsageFlags{0u} | Dali::Graphics::BufferUsage::TRANSFER_DST | Dali::Graphics::BufferUsage::UNIFORM_BUFFER));
171 } // namespace Render
173 } // namespace Internal