-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathVKStructuredBuffer.cpp
More file actions
70 lines (62 loc) · 2.34 KB
/
VKStructuredBuffer.cpp
File metadata and controls
70 lines (62 loc) · 2.34 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
#include "VKPCH.h"
size_t StructuredBufferCounter = 0;
VKStructuredBuffer::VKStructuredBuffer(size_t size, void* data, bool uac):Size(size)
{
StructuredBufferCounter++;
CreateBuffer(Factory->PhysicalDevice, Factory->Device, Size, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, Buffer, Memory);
if (data)
{
VkBuffer TempBuffer;
VkDeviceMemory TempMemory;
CreateBuffer(Factory->PhysicalDevice, Factory->Device, Size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, TempBuffer, TempMemory);
uint8_t* Pointer;
V_CHK(vkMapMemory(Factory->Device, TempMemory, 0, Size, 0, (void**)&Pointer));
memcpy(Pointer, data, Size);
vkUnmapMemory(Factory->Device, TempMemory);
Factory->LockCommandBuffer();
CopyBuffer(Factory->CommandBuffer, TempBuffer, Buffer, Size);
Factory->UnlockCommandBuffer();
vkDestroyBuffer(Factory->Device, TempBuffer, 0);
vkFreeMemory(Factory->Device, TempMemory, 0);
}
}
VKStructuredBuffer::~VKStructuredBuffer()
{
StructuredBufferCounter--;
if (Buffer)vkDestroyBuffer(Factory->Device, Buffer, 0);
if (Memory)vkFreeMemory(Factory->Device, Memory, 0);
}
void VKStructuredBuffer::SetAsSRV(VkWriteDescriptorSet* heap, size_t offset)
{
heap->descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
BufferInfo.buffer = Buffer;
BufferInfo.offset = offset;
BufferInfo.range = Size- offset;
heap->pBufferInfo = &BufferInfo;
}
void* VKStructuredBuffer::QueryInterface(int Type)
{
switch (Type)
{
case VKQ_ShaderResource:
return reinterpret_cast<void*>(static_cast<VKShaderResource*>(this));
case VKQ_UnorderedAccess:
return reinterpret_cast<void*>(static_cast<VKShaderResource*>(this));
default:
return nullptr;
}
}
void VKStructuredBuffer::SetAsUAV(VkWriteDescriptorSet* heap, size_t offset)
{
heap->descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
BufferInfo.buffer = Buffer;
BufferInfo.offset = offset;
BufferInfo.range = Size - offset;
heap->pBufferInfo = &BufferInfo;
}
void VKStructuredBuffer::LockUAV(VkCommandBuffer command_line)
{
}
void VKStructuredBuffer::UnlockUAV(VkCommandBuffer command_line)
{
}