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()
49 if(mBuffer && mMemory)
51 mController->UnmapMemory(std::move(mMemory));
55 void UniformBuffer::Flush()
57 if(mBuffer && mMemory)
63 void UniformBuffer::Reserve(uint32_t size)
65 if(mBuffer && mMemory)
73 auto createInfo = Graphics::BufferCreateInfo()
75 .SetBufferPropertiesFlags( 0 | Graphics::BufferPropertiesFlagBit::CPU_ALLOCATED )
76 .SetUsage(mUsageFlags);
78 mBuffer = mController->CreateBuffer(createInfo, std::move(mBuffer));
80 mMapBufferInfo.buffer = mBuffer.get();
81 mMapBufferInfo.usage = 0 | Graphics::MemoryUsageFlagBits::WRITE;
82 mMapBufferInfo.offset = 0;
83 mMapBufferInfo.size = size;
85 if(mPersistentMappedEnabled)
91 void UniformBuffer::Fill(char data, uint32_t offset, uint32_t size)
93 bool locallyMapped = (mMemory == nullptr);
101 void* ptr = mMemory->LockRegion(0, mSize);
103 auto begin = (reinterpret_cast<char*>(ptr) + offset);
106 size = mSize - offset - 1;
108 auto end = begin + size;
109 std::fill(begin, end, data);
111 mMemory->Unlock(true);
120 void UniformBuffer::Write(const void* data, uint32_t size, uint32_t dstOffset)
122 bool locallyMapped = (mMemory == nullptr);
130 void* ptr = mMemory->LockRegion(0, size);
131 if(dstOffset + size < mSize)
133 memcpy(reinterpret_cast<char*>(ptr) + dstOffset, data, size);
135 mMemory->Unlock(true);
144 void UniformBuffer::Map()
148 mMemory = mController->MapBufferRange(mMapBufferInfo);
152 void UniformBuffer::Unmap()
156 mController->UnmapMemory(std::move(mMemory));
160 UniformBufferManager::UniformBufferManager(Dali::Graphics::Controller* controller)
161 : mController(controller)
165 UniformBufferManager::~UniformBufferManager() = default;
167 Graphics::UniquePtr<UniformBuffer> UniformBufferManager::AllocateUniformBuffer(uint32_t size)
169 return Graphics::UniquePtr<UniformBuffer>(
170 new UniformBuffer(mController, size, 256u, true, Dali::Graphics::BufferUsageFlags{0u} | Dali::Graphics::BufferUsage::TRANSFER_DST | Dali::Graphics::BufferUsage::UNIFORM_BUFFER));
173 } // namespace Render
175 } // namespace Internal