-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathVKVertexBuffer.cpp
84 lines (75 loc) · 2.4 KB
/
VKVertexBuffer.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
81
82
83
84
#include "VKPCH.h"
size_t VertexBufferCounter = 0;
VKVertexBuffer::VKVertexBuffer() :m_Dynamic(false)
{
VertexBufferCounter++;
Buffer = 0;
m_Memory = 0;
Size = 0;
}
void VKVertexBuffer::Create(size_t stride, size_t count, bool dynamic,void*data)
{
Clear();
m_Dynamic = dynamic;
if (dynamic)
CreateBuffer(Factory->PhysicalDevice, Factory->Device, count * stride, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT| VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, Buffer, m_Memory);
else
CreateBuffer(Factory->PhysicalDevice, Factory->Device, count * stride, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, Buffer, m_Memory);
VertexDescription.binding = 0;
VertexDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
VertexDescription.stride = static_cast<uint32_t>(stride);
Size = stride * count;
if (data && !dynamic)
{
VkBuffer TempBuffer;
VkDeviceMemory TempMemory;
CreateBuffer(Factory->PhysicalDevice, Factory->Device, Size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT , VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, TempBuffer, TempMemory);
uint8_t* pData;
V_CHK(vkMapMemory(Factory->Device, TempMemory, 0, Size, 0, (void**)&pData));
memcpy(pData, 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();
}
BEAR_CHECK(m_Memory != 0);
}
VKVertexBuffer::~VKVertexBuffer()
{
VertexBufferCounter--;
Clear();
}
void* VKVertexBuffer::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 VKVertexBuffer::Unlock()
{
if (m_Memory == 0)return;
vkUnmapMemory(Factory->Device, m_Memory);
}
void VKVertexBuffer::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 VKVertexBuffer::GetCount()
{
if (VertexDescription.stride == 0)return 0;
return Size/ VertexDescription.stride;
}