-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathBufferFactory.cpp
More file actions
77 lines (67 loc) · 2.81 KB
/
Copy pathBufferFactory.cpp
File metadata and controls
77 lines (67 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "BufferFactory.h"
#include "Renderer.h"
#include "VulkanContext.h"
#include "VulkanImpl/VulkanBuffer.h"
#include "VulkanImpl/VulkanDescriptorSet.h"
#include "Core/Logger.h"
#include <exception>
namespace sh::render
{
auto BufferFactory::CreateVkUniformBuffer(const vk::VulkanContext& context, const CreateInfo& info) -> std::unique_ptr<IBuffer>
{
std::unique_ptr<vk::VulkanBuffer> buffer = std::make_unique<vk::VulkanBuffer>(context);
VkBufferUsageFlags usage =
info.bDynamic ? VkBufferUsageFlagBits::VK_BUFFER_USAGE_STORAGE_BUFFER_BIT : VkBufferUsageFlagBits::VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
usage |= VkBufferUsageFlagBits::VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
usage |= VkBufferUsageFlagBits::VK_BUFFER_USAGE_TRANSFER_DST_BIT;
const VkMemoryPropertyFlags memFlag = info.bGPUOnly ? VkMemoryPropertyFlagBits::VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT :
VkMemoryPropertyFlagBits::VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VkMemoryPropertyFlagBits::VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
const VkResult result = buffer->Create(info.size, usage, VkSharingMode::VK_SHARING_MODE_EXCLUSIVE,memFlag, true);
assert(result == VkResult::VK_SUCCESS);
if (result != VkResult::VK_SUCCESS)
{
SH_ERROR_FORMAT("Can't create buffer: {}", string_VkResult(result));
throw std::runtime_error{ "Buffer creation failed" };
}
return buffer;
}
auto BufferFactory::Create(const IRenderContext& context, const CreateInfo& info) -> std::unique_ptr<IBuffer>
{
assert(context.GetRenderAPIType() == RenderAPI::Vulkan);
if (context.GetRenderAPIType() == RenderAPI::Vulkan)
return CreateVkUniformBuffer(static_cast<const vk::VulkanContext&>(context), info);
return nullptr;
}
auto BufferFactory::CreateShaderBinding(const IRenderContext& context, const ShaderPass& shader, UniformStructLayout::Usage usage) -> std::unique_ptr<IShaderBinding>
{
if (context.GetRenderAPIType() == RenderAPI::Vulkan)
{
std::unique_ptr<vk::VulkanDescriptorSet> ptr = std::make_unique<vk::VulkanDescriptorSet>();
ptr->Create(context, shader, usage);
return ptr;
}
else
assert(false);
return nullptr;
}
SH_RENDER_API auto BufferFactory::CreateShaderBinding(const IRenderContext& context, const ComputeShader& shader) -> std::unique_ptr<IShaderBinding>
{
if (context.GetRenderAPIType() == RenderAPI::Vulkan)
{
std::unique_ptr<vk::VulkanDescriptorSet> ptr = std::make_unique<vk::VulkanDescriptorSet>();
ptr->Create(context, shader);
return ptr;
}
else
assert(false);
return nullptr;
}
SH_RENDER_API auto BufferFactory::GetBufferAlignment(const IRenderContext& context) -> std::size_t
{
if (context.GetRenderAPIType() == RenderAPI::Vulkan)
{
return static_cast<std::size_t>(static_cast<const vk::VulkanContext&>(context).GetGPUProperty().limits.minUniformBufferOffsetAlignment);
}
return 256u;
}
}//namespace