2 * Copyright (c) 2017 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 <dali/graphics/vulkan/vulkan-buffer.h>
19 #include <dali/graphics/vulkan/vulkan-graphics.h>
20 #include <dali/graphics/vulkan/gpu-memory/vulkan-gpu-memory-manager.h>
21 #include <dali/graphics/vulkan/gpu-memory/vulkan-gpu-memory-handle.h>
30 struct Buffer::Impl final
37 Impl(Graphics& graphics, Buffer& owner, const vk::BufferCreateInfo& createInfo)
38 : mGraphics(graphics),
40 mDeviceMemory(nullptr),
50 mGraphics.GetDevice().destroyBuffer( mBuffer, mGraphics.GetAllocator() );
54 * Initialises Buffer with memory, as host visible ( for write )
59 mBuffer = VkAssert(mGraphics.GetDevice().createBuffer( mInfo, mGraphics.GetAllocator()));
67 vk::BufferUsageFlags GetUsage() const
76 size_t GetSize() const
78 return static_cast<size_t>(mInfo.size);
85 vk::Buffer GetVkBuffer() const
90 void BindMemory( GpuMemoryBlockHandle handle )
92 assert( mBuffer && "Buffer not initialised!");
93 VkAssert(mGraphics.GetDevice().bindBufferMemory( mBuffer, (*handle), 0 ));
94 mDeviceMemory = handle;
97 Vulkan::Graphics& mGraphics;
98 Vulkan::Buffer& mInterface;
99 GpuMemoryBlockHandle mDeviceMemory;
100 vk::BufferCreateInfo mInfo;
110 BufferHandle Buffer::New(Graphics& graphics, size_t size, Type type)
112 auto usageFlags = vk::BufferUsageFlags{};
116 case Type::VERTEX: { usageFlags |= vk::BufferUsageFlagBits::eVertexBuffer; break; };
117 case Type::INDEX: { usageFlags |= vk::BufferUsageFlagBits::eIndexBuffer; break; };
118 case Type::UNIFORM: { usageFlags |= vk::BufferUsageFlagBits::eUniformBuffer; break; };
119 case Type::SHADER_STORAGE: { usageFlags |= vk::BufferUsageFlagBits::eStorageBuffer; break; };
122 auto info = vk::BufferCreateInfo{};
123 info.setSharingMode( vk::SharingMode::eExclusive );
124 info.setSize( size );
125 info.setUsage( usageFlags | vk::BufferUsageFlagBits::eTransferDst );
126 auto buffer = Handle<Buffer>( new Buffer(graphics, info) );
128 if(buffer && buffer->mImpl->Initialise())
130 graphics.AddBuffer( buffer );
135 Buffer::Buffer(Graphics& graphics, const vk::BufferCreateInfo& createInfo)
138 mImpl = MakeUnique<Buffer::Impl>(graphics, *this, createInfo);
141 Buffer::~Buffer() = default;
143 vk::BufferUsageFlags Buffer::GetUsage() const
145 return mImpl->GetUsage();
148 const GpuMemoryBlockHandle& Buffer::GetMemoryHandle() const
150 return mImpl->mDeviceMemory;
153 uint32_t Buffer::GetSize() const
155 return U32(mImpl->GetSize());
158 vk::Buffer Buffer::GetVkBuffer() const
160 return mImpl->GetVkBuffer();
163 void Buffer::BindMemory( const GpuMemoryBlockHandle& handle )
165 mImpl->BindMemory( handle );
168 bool Buffer::OnDestroy()
170 mImpl->mGraphics.RemoveBuffer( *this );