-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathVKIndexBuffer.cpp
80 lines (70 loc) · 2.15 KB
/
VKIndexBuffer.cpp
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
78
79
80
#include "VKPCH.h"
size_t IndexBufferCounter = 0;
VKIndexBuffer::VKIndexBuffer()
{
Buffer = 0;
m_Memory = 0;
m_dynamic = false; Size = 0;
IndexBufferCounter++;
}
void VKIndexBuffer::Create(size_t count, bool dynamic, void* data)
{
Clear();
m_dynamic = dynamic;
if (dynamic)
CreateBuffer(Factory->PhysicalDevice, Factory->Device, count * sizeof(uint32), VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, Buffer, m_Memory);
else
CreateBuffer(Factory->PhysicalDevice, Factory->Device, count * sizeof(uint32), VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, Buffer, m_Memory);
Size = count * sizeof(uint32);
if (data && !dynamic)
{
VkBuffer TempBuffer;
VkDeviceMemory TempMemory;
CreateBuffer(Factory->PhysicalDevice, Factory->Device, Size, VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_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);
}
else if (data)
{
memcpy(Lock(), data, count * sizeof(uint32));
Unlock();
}
}
VKIndexBuffer::~VKIndexBuffer()
{
IndexBufferCounter--;
Clear();
}
uint32* VKIndexBuffer::Lock()
{
if (m_Memory == 0)return 0;
BEAR_CHECK(m_dynamic);
uint8_t* pData;
V_CHK(vkMapMemory(Factory->Device, m_Memory, 0, Size, 0, (void**)&pData));
return (uint32*)pData;
}
void VKIndexBuffer::Unlock()
{
if (m_Memory == 0)return;
vkUnmapMemory(Factory->Device, m_Memory);
}
void VKIndexBuffer::Clear()
{
Size = 0;
m_dynamic = false;
if (Buffer)vkDestroyBuffer(Factory->Device, Buffer, 0);
Buffer = 0;
if (m_Memory)vkFreeMemory(Factory->Device, m_Memory, 0);
m_Memory = 0;
}
size_t VKIndexBuffer::GetCount()
{
return Size/sizeof(uint32);
}