1 /*
2 * Copyright © 2020 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23
24 #include "anv_private.h"
25
26 void
anv_GetAccelerationStructureBuildSizesKHR(VkDevice device,VkAccelerationStructureBuildTypeKHR buildType,const VkAccelerationStructureBuildGeometryInfoKHR * pBuildInfo,const uint32_t * pMaxPrimitiveCounts,VkAccelerationStructureBuildSizesInfoKHR * pSizeInfo)27 anv_GetAccelerationStructureBuildSizesKHR(
28 VkDevice device,
29 VkAccelerationStructureBuildTypeKHR buildType,
30 const VkAccelerationStructureBuildGeometryInfoKHR* pBuildInfo,
31 const uint32_t* pMaxPrimitiveCounts,
32 VkAccelerationStructureBuildSizesInfoKHR* pSizeInfo)
33 {
34 assert(pSizeInfo->sType ==
35 VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR);
36
37 pSizeInfo->accelerationStructureSize = 0; /* TODO */
38
39 uint64_t cpu_build_scratch_size = 0; /* TODO */
40 uint64_t cpu_update_scratch_size = cpu_build_scratch_size;
41
42 uint64_t gpu_build_scratch_size = 0; /* TODO */
43 uint64_t gpu_update_scratch_size = gpu_build_scratch_size;
44
45 switch (buildType) {
46 case VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR:
47 pSizeInfo->buildScratchSize = cpu_build_scratch_size;
48 pSizeInfo->updateScratchSize = cpu_update_scratch_size;
49 break;
50
51 case VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR:
52 pSizeInfo->buildScratchSize = gpu_build_scratch_size;
53 pSizeInfo->updateScratchSize = gpu_update_scratch_size;
54 break;
55
56 case VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR:
57 pSizeInfo->buildScratchSize = MAX2(cpu_build_scratch_size,
58 gpu_build_scratch_size);
59 pSizeInfo->updateScratchSize = MAX2(cpu_update_scratch_size,
60 gpu_update_scratch_size);
61 break;
62
63 default:
64 unreachable("Invalid acceleration structure build type");
65 }
66 }
67
68 VkResult
anv_CreateAccelerationStructureKHR(VkDevice _device,const VkAccelerationStructureCreateInfoKHR * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkAccelerationStructureKHR * pAccelerationStructure)69 anv_CreateAccelerationStructureKHR(
70 VkDevice _device,
71 const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
72 const VkAllocationCallbacks* pAllocator,
73 VkAccelerationStructureKHR* pAccelerationStructure)
74 {
75 ANV_FROM_HANDLE(anv_device, device, _device);
76 ANV_FROM_HANDLE(anv_buffer, buffer, pCreateInfo->buffer);
77 struct anv_acceleration_structure *accel;
78
79 accel = vk_zalloc2(&device->vk.alloc, pAllocator, sizeof(*accel), 8,
80 VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
81 if (accel == NULL)
82 return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
83
84 vk_object_base_init(&device->vk, &accel->base,
85 VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR);
86
87 accel->size = pCreateInfo->size;
88 accel->address = anv_address_add(buffer->address, pCreateInfo->offset);
89
90 *pAccelerationStructure = anv_acceleration_structure_to_handle(accel);
91
92 return VK_SUCCESS;
93 }
94
95 void
anv_DestroyAccelerationStructureKHR(VkDevice _device,VkAccelerationStructureKHR accelerationStructure,const VkAllocationCallbacks * pAllocator)96 anv_DestroyAccelerationStructureKHR(
97 VkDevice _device,
98 VkAccelerationStructureKHR accelerationStructure,
99 const VkAllocationCallbacks* pAllocator)
100 {
101 ANV_FROM_HANDLE(anv_device, device, _device);
102 ANV_FROM_HANDLE(anv_acceleration_structure, accel, accelerationStructure);
103
104 if (!accel)
105 return;
106
107 vk_object_base_finish(&accel->base);
108 vk_free2(&device->vk.alloc, pAllocator, accel);
109 }
110
111 VkDeviceAddress
anv_GetAccelerationStructureDeviceAddressKHR(VkDevice device,const VkAccelerationStructureDeviceAddressInfoKHR * pInfo)112 anv_GetAccelerationStructureDeviceAddressKHR(
113 VkDevice device,
114 const VkAccelerationStructureDeviceAddressInfoKHR* pInfo)
115 {
116 ANV_FROM_HANDLE(anv_acceleration_structure, accel,
117 pInfo->accelerationStructure);
118
119 assert(!anv_address_is_null(accel->address));
120 assert(anv_bo_is_pinned(accel->address.bo));
121
122 return anv_address_physical(accel->address);
123 }
124
125 void
anv_GetDeviceAccelerationStructureCompatibilityKHR(VkDevice device,const VkAccelerationStructureVersionInfoKHR * pVersionInfo,VkAccelerationStructureCompatibilityKHR * pCompatibility)126 anv_GetDeviceAccelerationStructureCompatibilityKHR(
127 VkDevice device,
128 const VkAccelerationStructureVersionInfoKHR* pVersionInfo,
129 VkAccelerationStructureCompatibilityKHR* pCompatibility)
130 {
131 unreachable("Unimplemented");
132 }
133
134 VkResult
anv_BuildAccelerationStructuresKHR(VkDevice _device,VkDeferredOperationKHR deferredOperation,uint32_t infoCount,const VkAccelerationStructureBuildGeometryInfoKHR * pInfos,const VkAccelerationStructureBuildRangeInfoKHR * const * ppBuildRangeInfos)135 anv_BuildAccelerationStructuresKHR(
136 VkDevice _device,
137 VkDeferredOperationKHR deferredOperation,
138 uint32_t infoCount,
139 const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
140 const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos)
141 {
142 ANV_FROM_HANDLE(anv_device, device, _device);
143 unreachable("Unimplemented");
144 return vk_error(device, VK_ERROR_FEATURE_NOT_PRESENT);
145 }
146
147 VkResult
anv_CopyAccelerationStructureKHR(VkDevice _device,VkDeferredOperationKHR deferredOperation,const VkCopyAccelerationStructureInfoKHR * pInfo)148 anv_CopyAccelerationStructureKHR(
149 VkDevice _device,
150 VkDeferredOperationKHR deferredOperation,
151 const VkCopyAccelerationStructureInfoKHR* pInfo)
152 {
153 ANV_FROM_HANDLE(anv_device, device, _device);
154 unreachable("Unimplemented");
155 return vk_error(device, VK_ERROR_FEATURE_NOT_PRESENT);
156 }
157
158 VkResult
anv_CopyAccelerationStructureToMemoryKHR(VkDevice _device,VkDeferredOperationKHR deferredOperation,const VkCopyAccelerationStructureToMemoryInfoKHR * pInfo)159 anv_CopyAccelerationStructureToMemoryKHR(
160 VkDevice _device,
161 VkDeferredOperationKHR deferredOperation,
162 const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo)
163 {
164 ANV_FROM_HANDLE(anv_device, device, _device);
165 unreachable("Unimplemented");
166 return vk_error(device, VK_ERROR_FEATURE_NOT_PRESENT);
167 }
168
169 VkResult
anv_CopyMemoryToAccelerationStructureKHR(VkDevice _device,VkDeferredOperationKHR deferredOperation,const VkCopyMemoryToAccelerationStructureInfoKHR * pInfo)170 anv_CopyMemoryToAccelerationStructureKHR(
171 VkDevice _device,
172 VkDeferredOperationKHR deferredOperation,
173 const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo)
174 {
175 ANV_FROM_HANDLE(anv_device, device, _device);
176 unreachable("Unimplemented");
177 return vk_error(device, VK_ERROR_FEATURE_NOT_PRESENT);
178 }
179
180 VkResult
anv_WriteAccelerationStructuresPropertiesKHR(VkDevice _device,uint32_t accelerationStructureCount,const VkAccelerationStructureKHR * pAccelerationStructures,VkQueryType queryType,size_t dataSize,void * pData,size_t stride)181 anv_WriteAccelerationStructuresPropertiesKHR(
182 VkDevice _device,
183 uint32_t accelerationStructureCount,
184 const VkAccelerationStructureKHR* pAccelerationStructures,
185 VkQueryType queryType,
186 size_t dataSize,
187 void* pData,
188 size_t stride)
189 {
190 ANV_FROM_HANDLE(anv_device, device, _device);
191 unreachable("Unimplemented");
192 return vk_error(device, VK_ERROR_FEATURE_NOT_PRESENT);
193 }
194
195 void
anv_CmdBuildAccelerationStructuresKHR(VkCommandBuffer commandBuffer,uint32_t infoCount,const VkAccelerationStructureBuildGeometryInfoKHR * pInfos,const VkAccelerationStructureBuildRangeInfoKHR * const * ppBuildRangeInfos)196 anv_CmdBuildAccelerationStructuresKHR(
197 VkCommandBuffer commandBuffer,
198 uint32_t infoCount,
199 const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
200 const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos)
201 {
202 unreachable("Unimplemented");
203 }
204
205 void
anv_CmdBuildAccelerationStructuresIndirectKHR(VkCommandBuffer commandBuffer,uint32_t infoCount,const VkAccelerationStructureBuildGeometryInfoKHR * pInfos,const VkDeviceAddress * pIndirectDeviceAddresses,const uint32_t * pIndirectStrides,const uint32_t * const * ppMaxPrimitiveCounts)206 anv_CmdBuildAccelerationStructuresIndirectKHR(
207 VkCommandBuffer commandBuffer,
208 uint32_t infoCount,
209 const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
210 const VkDeviceAddress* pIndirectDeviceAddresses,
211 const uint32_t* pIndirectStrides,
212 const uint32_t* const* ppMaxPrimitiveCounts)
213 {
214 unreachable("Unimplemented");
215 }
216
217 void
anv_CmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,const VkCopyAccelerationStructureInfoKHR * pInfo)218 anv_CmdCopyAccelerationStructureKHR(
219 VkCommandBuffer commandBuffer,
220 const VkCopyAccelerationStructureInfoKHR* pInfo)
221 {
222 unreachable("Unimplemented");
223 }
224
225 void
anv_CmdCopyAccelerationStructureToMemoryKHR(VkCommandBuffer commandBuffer,const VkCopyAccelerationStructureToMemoryInfoKHR * pInfo)226 anv_CmdCopyAccelerationStructureToMemoryKHR(
227 VkCommandBuffer commandBuffer,
228 const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo)
229 {
230 unreachable("Unimplemented");
231 }
232
233 void
anv_CmdCopyMemoryToAccelerationStructureKHR(VkCommandBuffer commandBuffer,const VkCopyMemoryToAccelerationStructureInfoKHR * pInfo)234 anv_CmdCopyMemoryToAccelerationStructureKHR(
235 VkCommandBuffer commandBuffer,
236 const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo)
237 {
238 unreachable("Unimplemented");
239 }
240
241 void
anv_CmdWriteAccelerationStructuresPropertiesKHR(VkCommandBuffer commandBuffer,uint32_t accelerationStructureCount,const VkAccelerationStructureKHR * pAccelerationStructures,VkQueryType queryType,VkQueryPool queryPool,uint32_t firstQuery)242 anv_CmdWriteAccelerationStructuresPropertiesKHR(
243 VkCommandBuffer commandBuffer,
244 uint32_t accelerationStructureCount,
245 const VkAccelerationStructureKHR* pAccelerationStructures,
246 VkQueryType queryType,
247 VkQueryPool queryPool,
248 uint32_t firstQuery)
249 {
250 unreachable("Unimplemented");
251 }
252