vulkan: Update Vulkan XML and headers to 1.2.145
[mesa.git] / include / vulkan / vulkan_beta.h
1 #ifndef VULKAN_BETA_H_
2 #define VULKAN_BETA_H_ 1
3
4 /*
5 ** Copyright (c) 2015-2020 The Khronos Group Inc.
6 **
7 ** SPDX-License-Identifier: Apache-2.0
8 */
9
10 /*
11 ** This header is generated from the Khronos Vulkan XML API Registry.
12 **
13 */
14
15
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19
20
21
22 #define VK_KHR_deferred_host_operations 1
23 VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDeferredOperationKHR)
24 #define VK_KHR_DEFERRED_HOST_OPERATIONS_SPEC_VERSION 3
25 #define VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME "VK_KHR_deferred_host_operations"
26 typedef struct VkDeferredOperationInfoKHR {
27 VkStructureType sType;
28 const void* pNext;
29 VkDeferredOperationKHR operationHandle;
30 } VkDeferredOperationInfoKHR;
31
32 typedef VkResult (VKAPI_PTR *PFN_vkCreateDeferredOperationKHR)(VkDevice device, const VkAllocationCallbacks* pAllocator, VkDeferredOperationKHR* pDeferredOperation);
33 typedef void (VKAPI_PTR *PFN_vkDestroyDeferredOperationKHR)(VkDevice device, VkDeferredOperationKHR operation, const VkAllocationCallbacks* pAllocator);
34 typedef uint32_t (VKAPI_PTR *PFN_vkGetDeferredOperationMaxConcurrencyKHR)(VkDevice device, VkDeferredOperationKHR operation);
35 typedef VkResult (VKAPI_PTR *PFN_vkGetDeferredOperationResultKHR)(VkDevice device, VkDeferredOperationKHR operation);
36 typedef VkResult (VKAPI_PTR *PFN_vkDeferredOperationJoinKHR)(VkDevice device, VkDeferredOperationKHR operation);
37
38 #ifndef VK_NO_PROTOTYPES
39 VKAPI_ATTR VkResult VKAPI_CALL vkCreateDeferredOperationKHR(
40 VkDevice device,
41 const VkAllocationCallbacks* pAllocator,
42 VkDeferredOperationKHR* pDeferredOperation);
43
44 VKAPI_ATTR void VKAPI_CALL vkDestroyDeferredOperationKHR(
45 VkDevice device,
46 VkDeferredOperationKHR operation,
47 const VkAllocationCallbacks* pAllocator);
48
49 VKAPI_ATTR uint32_t VKAPI_CALL vkGetDeferredOperationMaxConcurrencyKHR(
50 VkDevice device,
51 VkDeferredOperationKHR operation);
52
53 VKAPI_ATTR VkResult VKAPI_CALL vkGetDeferredOperationResultKHR(
54 VkDevice device,
55 VkDeferredOperationKHR operation);
56
57 VKAPI_ATTR VkResult VKAPI_CALL vkDeferredOperationJoinKHR(
58 VkDevice device,
59 VkDeferredOperationKHR operation);
60 #endif
61
62
63 #define VK_KHR_pipeline_library 1
64 #define VK_KHR_PIPELINE_LIBRARY_SPEC_VERSION 1
65 #define VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME "VK_KHR_pipeline_library"
66 typedef struct VkPipelineLibraryCreateInfoKHR {
67 VkStructureType sType;
68 const void* pNext;
69 uint32_t libraryCount;
70 const VkPipeline* pLibraries;
71 } VkPipelineLibraryCreateInfoKHR;
72
73
74
75 #define VK_KHR_ray_tracing 1
76 #define VK_KHR_RAY_TRACING_SPEC_VERSION 8
77 #define VK_KHR_RAY_TRACING_EXTENSION_NAME "VK_KHR_ray_tracing"
78
79 typedef enum VkAccelerationStructureBuildTypeKHR {
80 VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR = 0,
81 VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR = 1,
82 VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR = 2,
83 VK_ACCELERATION_STRUCTURE_BUILD_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF
84 } VkAccelerationStructureBuildTypeKHR;
85 typedef union VkDeviceOrHostAddressKHR {
86 VkDeviceAddress deviceAddress;
87 void* hostAddress;
88 } VkDeviceOrHostAddressKHR;
89
90 typedef union VkDeviceOrHostAddressConstKHR {
91 VkDeviceAddress deviceAddress;
92 const void* hostAddress;
93 } VkDeviceOrHostAddressConstKHR;
94
95 typedef struct VkAccelerationStructureBuildOffsetInfoKHR {
96 uint32_t primitiveCount;
97 uint32_t primitiveOffset;
98 uint32_t firstVertex;
99 uint32_t transformOffset;
100 } VkAccelerationStructureBuildOffsetInfoKHR;
101
102 typedef struct VkRayTracingShaderGroupCreateInfoKHR {
103 VkStructureType sType;
104 const void* pNext;
105 VkRayTracingShaderGroupTypeKHR type;
106 uint32_t generalShader;
107 uint32_t closestHitShader;
108 uint32_t anyHitShader;
109 uint32_t intersectionShader;
110 const void* pShaderGroupCaptureReplayHandle;
111 } VkRayTracingShaderGroupCreateInfoKHR;
112
113 typedef struct VkRayTracingPipelineInterfaceCreateInfoKHR {
114 VkStructureType sType;
115 const void* pNext;
116 uint32_t maxPayloadSize;
117 uint32_t maxAttributeSize;
118 uint32_t maxCallableSize;
119 } VkRayTracingPipelineInterfaceCreateInfoKHR;
120
121 typedef struct VkRayTracingPipelineCreateInfoKHR {
122 VkStructureType sType;
123 const void* pNext;
124 VkPipelineCreateFlags flags;
125 uint32_t stageCount;
126 const VkPipelineShaderStageCreateInfo* pStages;
127 uint32_t groupCount;
128 const VkRayTracingShaderGroupCreateInfoKHR* pGroups;
129 uint32_t maxRecursionDepth;
130 VkPipelineLibraryCreateInfoKHR libraries;
131 const VkRayTracingPipelineInterfaceCreateInfoKHR* pLibraryInterface;
132 VkPipelineLayout layout;
133 VkPipeline basePipelineHandle;
134 int32_t basePipelineIndex;
135 } VkRayTracingPipelineCreateInfoKHR;
136
137 typedef struct VkAccelerationStructureGeometryTrianglesDataKHR {
138 VkStructureType sType;
139 const void* pNext;
140 VkFormat vertexFormat;
141 VkDeviceOrHostAddressConstKHR vertexData;
142 VkDeviceSize vertexStride;
143 VkIndexType indexType;
144 VkDeviceOrHostAddressConstKHR indexData;
145 VkDeviceOrHostAddressConstKHR transformData;
146 } VkAccelerationStructureGeometryTrianglesDataKHR;
147
148 typedef struct VkAccelerationStructureGeometryAabbsDataKHR {
149 VkStructureType sType;
150 const void* pNext;
151 VkDeviceOrHostAddressConstKHR data;
152 VkDeviceSize stride;
153 } VkAccelerationStructureGeometryAabbsDataKHR;
154
155 typedef struct VkAccelerationStructureGeometryInstancesDataKHR {
156 VkStructureType sType;
157 const void* pNext;
158 VkBool32 arrayOfPointers;
159 VkDeviceOrHostAddressConstKHR data;
160 } VkAccelerationStructureGeometryInstancesDataKHR;
161
162 typedef union VkAccelerationStructureGeometryDataKHR {
163 VkAccelerationStructureGeometryTrianglesDataKHR triangles;
164 VkAccelerationStructureGeometryAabbsDataKHR aabbs;
165 VkAccelerationStructureGeometryInstancesDataKHR instances;
166 } VkAccelerationStructureGeometryDataKHR;
167
168 typedef struct VkAccelerationStructureGeometryKHR {
169 VkStructureType sType;
170 const void* pNext;
171 VkGeometryTypeKHR geometryType;
172 VkAccelerationStructureGeometryDataKHR geometry;
173 VkGeometryFlagsKHR flags;
174 } VkAccelerationStructureGeometryKHR;
175
176 typedef struct VkAccelerationStructureBuildGeometryInfoKHR {
177 VkStructureType sType;
178 const void* pNext;
179 VkAccelerationStructureTypeKHR type;
180 VkBuildAccelerationStructureFlagsKHR flags;
181 VkBool32 update;
182 VkAccelerationStructureKHR srcAccelerationStructure;
183 VkAccelerationStructureKHR dstAccelerationStructure;
184 VkBool32 geometryArrayOfPointers;
185 uint32_t geometryCount;
186 const VkAccelerationStructureGeometryKHR* const* ppGeometries;
187 VkDeviceOrHostAddressKHR scratchData;
188 } VkAccelerationStructureBuildGeometryInfoKHR;
189
190 typedef struct VkAccelerationStructureCreateGeometryTypeInfoKHR {
191 VkStructureType sType;
192 const void* pNext;
193 VkGeometryTypeKHR geometryType;
194 uint32_t maxPrimitiveCount;
195 VkIndexType indexType;
196 uint32_t maxVertexCount;
197 VkFormat vertexFormat;
198 VkBool32 allowsTransforms;
199 } VkAccelerationStructureCreateGeometryTypeInfoKHR;
200
201 typedef struct VkAccelerationStructureCreateInfoKHR {
202 VkStructureType sType;
203 const void* pNext;
204 VkDeviceSize compactedSize;
205 VkAccelerationStructureTypeKHR type;
206 VkBuildAccelerationStructureFlagsKHR flags;
207 uint32_t maxGeometryCount;
208 const VkAccelerationStructureCreateGeometryTypeInfoKHR* pGeometryInfos;
209 VkDeviceAddress deviceAddress;
210 } VkAccelerationStructureCreateInfoKHR;
211
212 typedef struct VkAccelerationStructureMemoryRequirementsInfoKHR {
213 VkStructureType sType;
214 const void* pNext;
215 VkAccelerationStructureMemoryRequirementsTypeKHR type;
216 VkAccelerationStructureBuildTypeKHR buildType;
217 VkAccelerationStructureKHR accelerationStructure;
218 } VkAccelerationStructureMemoryRequirementsInfoKHR;
219
220 typedef struct VkPhysicalDeviceRayTracingFeaturesKHR {
221 VkStructureType sType;
222 void* pNext;
223 VkBool32 rayTracing;
224 VkBool32 rayTracingShaderGroupHandleCaptureReplay;
225 VkBool32 rayTracingShaderGroupHandleCaptureReplayMixed;
226 VkBool32 rayTracingAccelerationStructureCaptureReplay;
227 VkBool32 rayTracingIndirectTraceRays;
228 VkBool32 rayTracingIndirectAccelerationStructureBuild;
229 VkBool32 rayTracingHostAccelerationStructureCommands;
230 VkBool32 rayQuery;
231 VkBool32 rayTracingPrimitiveCulling;
232 } VkPhysicalDeviceRayTracingFeaturesKHR;
233
234 typedef struct VkPhysicalDeviceRayTracingPropertiesKHR {
235 VkStructureType sType;
236 void* pNext;
237 uint32_t shaderGroupHandleSize;
238 uint32_t maxRecursionDepth;
239 uint32_t maxShaderGroupStride;
240 uint32_t shaderGroupBaseAlignment;
241 uint64_t maxGeometryCount;
242 uint64_t maxInstanceCount;
243 uint64_t maxPrimitiveCount;
244 uint32_t maxDescriptorSetAccelerationStructures;
245 uint32_t shaderGroupHandleCaptureReplaySize;
246 } VkPhysicalDeviceRayTracingPropertiesKHR;
247
248 typedef struct VkAccelerationStructureDeviceAddressInfoKHR {
249 VkStructureType sType;
250 const void* pNext;
251 VkAccelerationStructureKHR accelerationStructure;
252 } VkAccelerationStructureDeviceAddressInfoKHR;
253
254 typedef struct VkAccelerationStructureVersionKHR {
255 VkStructureType sType;
256 const void* pNext;
257 const uint8_t* versionData;
258 } VkAccelerationStructureVersionKHR;
259
260 typedef struct VkStridedBufferRegionKHR {
261 VkBuffer buffer;
262 VkDeviceSize offset;
263 VkDeviceSize stride;
264 VkDeviceSize size;
265 } VkStridedBufferRegionKHR;
266
267 typedef struct VkTraceRaysIndirectCommandKHR {
268 uint32_t width;
269 uint32_t height;
270 uint32_t depth;
271 } VkTraceRaysIndirectCommandKHR;
272
273 typedef struct VkCopyAccelerationStructureToMemoryInfoKHR {
274 VkStructureType sType;
275 const void* pNext;
276 VkAccelerationStructureKHR src;
277 VkDeviceOrHostAddressKHR dst;
278 VkCopyAccelerationStructureModeKHR mode;
279 } VkCopyAccelerationStructureToMemoryInfoKHR;
280
281 typedef struct VkCopyMemoryToAccelerationStructureInfoKHR {
282 VkStructureType sType;
283 const void* pNext;
284 VkDeviceOrHostAddressConstKHR src;
285 VkAccelerationStructureKHR dst;
286 VkCopyAccelerationStructureModeKHR mode;
287 } VkCopyMemoryToAccelerationStructureInfoKHR;
288
289 typedef struct VkCopyAccelerationStructureInfoKHR {
290 VkStructureType sType;
291 const void* pNext;
292 VkAccelerationStructureKHR src;
293 VkAccelerationStructureKHR dst;
294 VkCopyAccelerationStructureModeKHR mode;
295 } VkCopyAccelerationStructureInfoKHR;
296
297 typedef VkResult (VKAPI_PTR *PFN_vkCreateAccelerationStructureKHR)(VkDevice device, const VkAccelerationStructureCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkAccelerationStructureKHR* pAccelerationStructure);
298 typedef void (VKAPI_PTR *PFN_vkGetAccelerationStructureMemoryRequirementsKHR)(VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoKHR* pInfo, VkMemoryRequirements2* pMemoryRequirements);
299 typedef void (VKAPI_PTR *PFN_vkCmdBuildAccelerationStructureKHR)(VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildOffsetInfoKHR* const* ppOffsetInfos);
300 typedef void (VKAPI_PTR *PFN_vkCmdBuildAccelerationStructureIndirectKHR)(VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR* pInfo, VkBuffer indirectBuffer, VkDeviceSize indirectOffset, uint32_t indirectStride);
301 typedef VkResult (VKAPI_PTR *PFN_vkBuildAccelerationStructureKHR)(VkDevice device, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildOffsetInfoKHR* const* ppOffsetInfos);
302 typedef VkResult (VKAPI_PTR *PFN_vkCopyAccelerationStructureKHR)(VkDevice device, const VkCopyAccelerationStructureInfoKHR* pInfo);
303 typedef VkResult (VKAPI_PTR *PFN_vkCopyAccelerationStructureToMemoryKHR)(VkDevice device, const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);
304 typedef VkResult (VKAPI_PTR *PFN_vkCopyMemoryToAccelerationStructureKHR)(VkDevice device, const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);
305 typedef VkResult (VKAPI_PTR *PFN_vkWriteAccelerationStructuresPropertiesKHR)(VkDevice device, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR* pAccelerationStructures, VkQueryType queryType, size_t dataSize, void* pData, size_t stride);
306 typedef void (VKAPI_PTR *PFN_vkCmdCopyAccelerationStructureKHR)(VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureInfoKHR* pInfo);
307 typedef void (VKAPI_PTR *PFN_vkCmdCopyAccelerationStructureToMemoryKHR)(VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);
308 typedef void (VKAPI_PTR *PFN_vkCmdCopyMemoryToAccelerationStructureKHR)(VkCommandBuffer commandBuffer, const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);
309 typedef void (VKAPI_PTR *PFN_vkCmdTraceRaysKHR)(VkCommandBuffer commandBuffer, const VkStridedBufferRegionKHR* pRaygenShaderBindingTable, const VkStridedBufferRegionKHR* pMissShaderBindingTable, const VkStridedBufferRegionKHR* pHitShaderBindingTable, const VkStridedBufferRegionKHR* pCallableShaderBindingTable, uint32_t width, uint32_t height, uint32_t depth);
310 typedef VkResult (VKAPI_PTR *PFN_vkCreateRayTracingPipelinesKHR)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkRayTracingPipelineCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines);
311 typedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetAccelerationStructureDeviceAddressKHR)(VkDevice device, const VkAccelerationStructureDeviceAddressInfoKHR* pInfo);
312 typedef VkResult (VKAPI_PTR *PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR)(VkDevice device, VkPipeline pipeline, uint32_t firstGroup, uint32_t groupCount, size_t dataSize, void* pData);
313 typedef void (VKAPI_PTR *PFN_vkCmdTraceRaysIndirectKHR)(VkCommandBuffer commandBuffer, const VkStridedBufferRegionKHR* pRaygenShaderBindingTable, const VkStridedBufferRegionKHR* pMissShaderBindingTable, const VkStridedBufferRegionKHR* pHitShaderBindingTable, const VkStridedBufferRegionKHR* pCallableShaderBindingTable, VkBuffer buffer, VkDeviceSize offset);
314 typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)(VkDevice device, const VkAccelerationStructureVersionKHR* version);
315
316 #ifndef VK_NO_PROTOTYPES
317 VKAPI_ATTR VkResult VKAPI_CALL vkCreateAccelerationStructureKHR(
318 VkDevice device,
319 const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
320 const VkAllocationCallbacks* pAllocator,
321 VkAccelerationStructureKHR* pAccelerationStructure);
322
323 VKAPI_ATTR void VKAPI_CALL vkGetAccelerationStructureMemoryRequirementsKHR(
324 VkDevice device,
325 const VkAccelerationStructureMemoryRequirementsInfoKHR* pInfo,
326 VkMemoryRequirements2* pMemoryRequirements);
327
328 VKAPI_ATTR void VKAPI_CALL vkCmdBuildAccelerationStructureKHR(
329 VkCommandBuffer commandBuffer,
330 uint32_t infoCount,
331 const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
332 const VkAccelerationStructureBuildOffsetInfoKHR* const* ppOffsetInfos);
333
334 VKAPI_ATTR void VKAPI_CALL vkCmdBuildAccelerationStructureIndirectKHR(
335 VkCommandBuffer commandBuffer,
336 const VkAccelerationStructureBuildGeometryInfoKHR* pInfo,
337 VkBuffer indirectBuffer,
338 VkDeviceSize indirectOffset,
339 uint32_t indirectStride);
340
341 VKAPI_ATTR VkResult VKAPI_CALL vkBuildAccelerationStructureKHR(
342 VkDevice device,
343 uint32_t infoCount,
344 const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
345 const VkAccelerationStructureBuildOffsetInfoKHR* const* ppOffsetInfos);
346
347 VKAPI_ATTR VkResult VKAPI_CALL vkCopyAccelerationStructureKHR(
348 VkDevice device,
349 const VkCopyAccelerationStructureInfoKHR* pInfo);
350
351 VKAPI_ATTR VkResult VKAPI_CALL vkCopyAccelerationStructureToMemoryKHR(
352 VkDevice device,
353 const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);
354
355 VKAPI_ATTR VkResult VKAPI_CALL vkCopyMemoryToAccelerationStructureKHR(
356 VkDevice device,
357 const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);
358
359 VKAPI_ATTR VkResult VKAPI_CALL vkWriteAccelerationStructuresPropertiesKHR(
360 VkDevice device,
361 uint32_t accelerationStructureCount,
362 const VkAccelerationStructureKHR* pAccelerationStructures,
363 VkQueryType queryType,
364 size_t dataSize,
365 void* pData,
366 size_t stride);
367
368 VKAPI_ATTR void VKAPI_CALL vkCmdCopyAccelerationStructureKHR(
369 VkCommandBuffer commandBuffer,
370 const VkCopyAccelerationStructureInfoKHR* pInfo);
371
372 VKAPI_ATTR void VKAPI_CALL vkCmdCopyAccelerationStructureToMemoryKHR(
373 VkCommandBuffer commandBuffer,
374 const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);
375
376 VKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryToAccelerationStructureKHR(
377 VkCommandBuffer commandBuffer,
378 const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);
379
380 VKAPI_ATTR void VKAPI_CALL vkCmdTraceRaysKHR(
381 VkCommandBuffer commandBuffer,
382 const VkStridedBufferRegionKHR* pRaygenShaderBindingTable,
383 const VkStridedBufferRegionKHR* pMissShaderBindingTable,
384 const VkStridedBufferRegionKHR* pHitShaderBindingTable,
385 const VkStridedBufferRegionKHR* pCallableShaderBindingTable,
386 uint32_t width,
387 uint32_t height,
388 uint32_t depth);
389
390 VKAPI_ATTR VkResult VKAPI_CALL vkCreateRayTracingPipelinesKHR(
391 VkDevice device,
392 VkPipelineCache pipelineCache,
393 uint32_t createInfoCount,
394 const VkRayTracingPipelineCreateInfoKHR* pCreateInfos,
395 const VkAllocationCallbacks* pAllocator,
396 VkPipeline* pPipelines);
397
398 VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetAccelerationStructureDeviceAddressKHR(
399 VkDevice device,
400 const VkAccelerationStructureDeviceAddressInfoKHR* pInfo);
401
402 VKAPI_ATTR VkResult VKAPI_CALL vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
403 VkDevice device,
404 VkPipeline pipeline,
405 uint32_t firstGroup,
406 uint32_t groupCount,
407 size_t dataSize,
408 void* pData);
409
410 VKAPI_ATTR void VKAPI_CALL vkCmdTraceRaysIndirectKHR(
411 VkCommandBuffer commandBuffer,
412 const VkStridedBufferRegionKHR* pRaygenShaderBindingTable,
413 const VkStridedBufferRegionKHR* pMissShaderBindingTable,
414 const VkStridedBufferRegionKHR* pHitShaderBindingTable,
415 const VkStridedBufferRegionKHR* pCallableShaderBindingTable,
416 VkBuffer buffer,
417 VkDeviceSize offset);
418
419 VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceAccelerationStructureCompatibilityKHR(
420 VkDevice device,
421 const VkAccelerationStructureVersionKHR* version);
422 #endif
423
424 #ifdef __cplusplus
425 }
426 #endif
427
428 #endif