-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathVKRayTracingShaderTable.cpp
More file actions
122 lines (101 loc) · 5.01 KB
/
VKRayTracingShaderTable.cpp
File metadata and controls
122 lines (101 loc) · 5.01 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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "VKPCH.h"
bsize RayTracingShaderTableCounter = 0;
inline bsize GetAlignment(bsize size, const bsize alignment)
{
return (size + (alignment - 1)) & (~(alignment - 1));
}
#ifdef RTX
VKRayTracingShaderTable::VKRayTracingShaderTable(const BearRayTracingShaderTableDescription& description)
{
RayTracingShaderTableCounter++;
VKPipelineRayTracing* Pipeline = reinterpret_cast<VKPipelineRayTracing*>(const_cast<BearRHI::BearRHIPipelineRayTracing*>(description.Pipeline.get())->QueryInterface(VKQ_RayTracingPipeline));
BEAR_CHECK(Pipeline);
if (description.RayGenerateShader.size())
{
VkBuffer Buffer;
VkDeviceMemory Memory;
void* Identifier = Pipeline->GetShaderIdentifier(description.RayGenerateShader);
uint8* Pointer = nullptr;
bsize Size = GetAlignment(Factory->PhysicalDeviceRayTracingProperties.shaderGroupHandleSize, Factory->PhysicalDeviceRayTracingProperties.shaderGroupBaseAlignment);
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, Buffer, Memory);
V_CHK(vkMapMemory(Factory->Device, Memory, 0, Size, 0, (void**)&Pointer));
bear_copy(Pointer, Identifier, Factory->PhysicalDeviceRayTracingProperties.shaderGroupHandleSize);
vkUnmapMemory(Factory->Device, Memory);
RayGenerateRecord.Buffer = Buffer;
RayGenerateRecord.Memory = Memory;
RayGenerateRecord.Stride = Size;
}
if (description.MissShader.size())
{
VkBuffer Buffer;
VkDeviceMemory Memory;
void* Identifier = Pipeline->GetShaderIdentifier(description.MissShader);
uint8* Pointer = nullptr;
bsize Size = GetAlignment(Factory->PhysicalDeviceRayTracingProperties.shaderGroupHandleSize, Factory->PhysicalDeviceRayTracingProperties.shaderGroupBaseAlignment);
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, Buffer, Memory);
V_CHK(vkMapMemory(Factory->Device, Memory, 0, Size, 0, (void**)&Pointer));
bear_copy(Pointer, Identifier, Factory->PhysicalDeviceRayTracingProperties.shaderGroupHandleSize);
vkUnmapMemory(Factory->Device, Memory);
MissRecord.Buffer = Buffer;
MissRecord.Memory = Memory;
MissRecord.Stride = Size;
}
if (description.CallableShader.size())
{
VkBuffer Buffer;
VkDeviceMemory Memory;
void* Identifier = Pipeline->GetShaderIdentifier(description.CallableShader);
uint8* Pointer = nullptr;
bsize Size = GetAlignment(Factory->PhysicalDeviceRayTracingProperties.shaderGroupHandleSize, Factory->PhysicalDeviceRayTracingProperties.shaderGroupBaseAlignment);
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, Buffer, Memory);
V_CHK(vkMapMemory(Factory->Device, Memory, 0, Size, 0, (void**)&Pointer));
bear_copy(Pointer, Identifier, Factory->PhysicalDeviceRayTracingProperties.shaderGroupHandleSize);
vkUnmapMemory(Factory->Device, Memory);
CallableRecord.Buffer = Buffer;
CallableRecord.Memory = Memory;
CallableRecord.Stride = Size;
}
{
VkBuffer Buffer;
VkDeviceMemory Memory;
uint8* Pointer = nullptr;
bsize Size = GetAlignment(Factory->PhysicalDeviceRayTracingProperties.shaderGroupHandleSize, Factory->PhysicalDeviceRayTracingProperties.shaderGroupBaseAlignment)* description.HitGroups.size();
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, Buffer, Memory);
HitGroups.Buffer = Buffer;
HitGroups.Memory = Memory;
HitGroups.Stride = GetAlignment(Factory->PhysicalDeviceRayTracingProperties.shaderGroupHandleSize, Factory->PhysicalDeviceRayTracingProperties.shaderGroupBaseAlignment);
V_CHK(vkMapMemory(Factory->Device, Memory, 0, Size, 0, (void**)&Pointer));
for (bsize i = 0; i < description.HitGroups.size(); i++)
{
void* Identifier = Pipeline->GetShaderIdentifier(description.HitGroups[i]);
bear_copy(Pointer, Identifier, Factory->PhysicalDeviceRayTracingProperties.shaderGroupHandleSize);
Pointer += CallableRecord.Stride;
}
vkUnmapMemory(Factory->Device, Memory);
}
}
VKRayTracingShaderTable::~VKRayTracingShaderTable()
{
RayTracingShaderTableCounter--;
if (RayGenerateRecord.Buffer)
{
vkDestroyBuffer(Factory->Device, RayGenerateRecord.Buffer, 0);
vkFreeMemory(Factory->Device, RayGenerateRecord.Memory, 0);
}
if (MissRecord.Buffer)
{
vkDestroyBuffer(Factory->Device, MissRecord.Buffer, 0);
vkFreeMemory(Factory->Device, MissRecord.Memory, 0);
}
if (CallableRecord.Buffer)
{
vkDestroyBuffer(Factory->Device, CallableRecord.Buffer, 0);
vkFreeMemory(Factory->Device, CallableRecord.Memory, 0);
}
if (HitGroups.Buffer)
{
vkDestroyBuffer(Factory->Device, HitGroups.Buffer, 0);
vkFreeMemory(Factory->Device, HitGroups.Memory, 0);
}
}
#endif