| /*************************************************************************** | |
| * | |
| * Copyright (c) 2015-2024 The Khronos Group Inc. | |
| * Copyright (c) 2015-2024 Valve Corporation | |
| * Copyright (c) 2015-2024 LunarG, Inc. | |
| * Copyright (c) 2015-2024 Google Inc. | |
| * | |
| * SPDX-License-Identifier: Apache-2.0 | |
| * | |
| ****************************************************************************/ | |
| #include <vulkan/utility/vk_safe_struct.hpp> | |
| #include <vulkan/utility/vk_struct_helper.hpp> | |
| #include <vulkan/utility/vk_concurrent_unordered_map.hpp> | |
| #include <cassert> | |
| #include <cstring> | |
| namespace vku { | |
| std::vector<std::pair<uint32_t, uint32_t>>& GetCustomStypeInfo() { | |
| static std::vector<std::pair<uint32_t, uint32_t>> custom_stype_info{}; | |
| return custom_stype_info; | |
| } | |
| struct ASGeomKHRExtraData { | |
| ASGeomKHRExtraData(uint8_t* alloc, uint32_t primOffset, uint32_t primCount) | |
| : ptr(alloc), primitiveOffset(primOffset), primitiveCount(primCount) {} | |
| ~ASGeomKHRExtraData() { | |
| if (ptr) delete[] ptr; | |
| } | |
| uint8_t* ptr; | |
| uint32_t primitiveOffset; | |
| uint32_t primitiveCount; | |
| }; | |
| vku::concurrent::unordered_map<const safe_VkAccelerationStructureGeometryKHR*, ASGeomKHRExtraData*, 4>& | |
| GetAccelStructGeomHostAllocMap() { | |
| static vku::concurrent::unordered_map<const safe_VkAccelerationStructureGeometryKHR*, ASGeomKHRExtraData*, 4> | |
| as_geom_khr_host_alloc; | |
| return as_geom_khr_host_alloc; | |
| } | |
| safe_VkAccelerationStructureGeometryKHR::safe_VkAccelerationStructureGeometryKHR( | |
| const VkAccelerationStructureGeometryKHR* in_struct, const bool is_host, | |
| const VkAccelerationStructureBuildRangeInfoKHR* build_range_info, [[maybe_unused]] PNextCopyState* copy_state, bool copy_pnext) | |
| : sType(in_struct->sType), geometryType(in_struct->geometryType), geometry(in_struct->geometry), flags(in_struct->flags) { | |
| if (copy_pnext) { | |
| pNext = SafePnextCopy(in_struct->pNext, copy_state); | |
| if (geometryType == VK_GEOMETRY_TYPE_INSTANCES_KHR) { | |
| geometry.instances.pNext = SafePnextCopy(in_struct->geometry.instances.pNext, copy_state); | |
| } else if (geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR) { | |
| geometry.triangles.pNext = SafePnextCopy(in_struct->geometry.triangles.pNext, copy_state); | |
| } else if (geometryType == VK_GEOMETRY_TYPE_AABBS_KHR) { | |
| geometry.aabbs.pNext = SafePnextCopy(in_struct->geometry.aabbs.pNext, copy_state); | |
| } | |
| } | |
| if (is_host && geometryType == VK_GEOMETRY_TYPE_INSTANCES_KHR) { | |
| if (geometry.instances.arrayOfPointers) { | |
| size_t pp_array_size = build_range_info->primitiveCount * sizeof(VkAccelerationStructureInstanceKHR*); | |
| size_t p_array_size = build_range_info->primitiveCount * sizeof(VkAccelerationStructureInstanceKHR); | |
| size_t array_size = build_range_info->primitiveOffset + pp_array_size + p_array_size; | |
| uint8_t* allocation = new uint8_t[array_size]; | |
| VkAccelerationStructureInstanceKHR** ppInstances = | |
| reinterpret_cast<VkAccelerationStructureInstanceKHR**>(allocation + build_range_info->primitiveOffset); | |
| VkAccelerationStructureInstanceKHR* pInstances = reinterpret_cast<VkAccelerationStructureInstanceKHR*>( | |
| allocation + build_range_info->primitiveOffset + pp_array_size); | |
| for (uint32_t i = 0; i < build_range_info->primitiveCount; ++i) { | |
| const uint8_t* byte_ptr = reinterpret_cast<const uint8_t*>(in_struct->geometry.instances.data.hostAddress); | |
| pInstances[i] = *( | |
| reinterpret_cast<VkAccelerationStructureInstanceKHR* const*>(byte_ptr + build_range_info->primitiveOffset)[i]); | |
| ppInstances[i] = &pInstances[i]; | |
| } | |
| geometry.instances.data.hostAddress = allocation; | |
| GetAccelStructGeomHostAllocMap().insert( | |
| this, new ASGeomKHRExtraData(allocation, build_range_info->primitiveOffset, build_range_info->primitiveCount)); | |
| } else { | |
| const auto primitive_offset = build_range_info->primitiveOffset; | |
| const auto primitive_count = build_range_info->primitiveCount; | |
| size_t array_size = primitive_offset + primitive_count * sizeof(VkAccelerationStructureInstanceKHR); | |
| uint8_t* allocation = new uint8_t[array_size]; | |
| auto host_address = static_cast<const uint8_t*>(in_struct->geometry.instances.data.hostAddress); | |
| memcpy(allocation + primitive_offset, host_address + primitive_offset, | |
| primitive_count * sizeof(VkAccelerationStructureInstanceKHR)); | |
| geometry.instances.data.hostAddress = allocation; | |
| GetAccelStructGeomHostAllocMap().insert( | |
| this, new ASGeomKHRExtraData(allocation, build_range_info->primitiveOffset, build_range_info->primitiveCount)); | |
| } | |
| } | |
| } | |
| safe_VkAccelerationStructureGeometryKHR::safe_VkAccelerationStructureGeometryKHR() | |
| : sType(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR), pNext(nullptr), geometryType(), geometry(), flags() {} | |
| safe_VkAccelerationStructureGeometryKHR::safe_VkAccelerationStructureGeometryKHR( | |
| const safe_VkAccelerationStructureGeometryKHR& copy_src) { | |
| sType = copy_src.sType; | |
| geometryType = copy_src.geometryType; | |
| geometry = copy_src.geometry; | |
| flags = copy_src.flags; | |
| pNext = SafePnextCopy(copy_src.pNext); | |
| if (geometryType == VK_GEOMETRY_TYPE_INSTANCES_KHR) { | |
| geometry.instances.pNext = SafePnextCopy(copy_src.geometry.instances.pNext); | |
| } else if (geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR) { | |
| geometry.triangles.pNext = SafePnextCopy(copy_src.geometry.triangles.pNext); | |
| } else if (geometryType == VK_GEOMETRY_TYPE_AABBS_KHR) { | |
| geometry.aabbs.pNext = SafePnextCopy(copy_src.geometry.aabbs.pNext); | |
| } | |
| auto src_iter = GetAccelStructGeomHostAllocMap().find(©_src); | |
| if (src_iter != GetAccelStructGeomHostAllocMap().end()) { | |
| auto& src_alloc = src_iter->second; | |
| if (geometry.instances.arrayOfPointers) { | |
| size_t pp_array_size = src_alloc->primitiveCount * sizeof(VkAccelerationStructureInstanceKHR*); | |
| size_t p_array_size = src_alloc->primitiveCount * sizeof(VkAccelerationStructureInstanceKHR); | |
| size_t array_size = src_alloc->primitiveOffset + pp_array_size + p_array_size; | |
| uint8_t* allocation = new uint8_t[array_size]; | |
| VkAccelerationStructureInstanceKHR** ppInstances = | |
| reinterpret_cast<VkAccelerationStructureInstanceKHR**>(allocation + src_alloc->primitiveOffset); | |
| VkAccelerationStructureInstanceKHR* pInstances = | |
| reinterpret_cast<VkAccelerationStructureInstanceKHR*>(allocation + src_alloc->primitiveOffset + pp_array_size); | |
| for (uint32_t i = 0; i < src_alloc->primitiveCount; ++i) { | |
| pInstances[i] = | |
| *(reinterpret_cast<VkAccelerationStructureInstanceKHR* const*>(src_alloc->ptr + src_alloc->primitiveOffset)[i]); | |
| ppInstances[i] = &pInstances[i]; | |
| } | |
| geometry.instances.data.hostAddress = allocation; | |
| GetAccelStructGeomHostAllocMap().insert( | |
| this, new ASGeomKHRExtraData(allocation, src_alloc->primitiveOffset, src_alloc->primitiveCount)); | |
| } else { | |
| size_t array_size = src_alloc->primitiveOffset + src_alloc->primitiveCount * sizeof(VkAccelerationStructureInstanceKHR); | |
| uint8_t* allocation = new uint8_t[array_size]; | |
| memcpy(allocation, src_alloc->ptr, array_size); | |
| geometry.instances.data.hostAddress = allocation; | |
| GetAccelStructGeomHostAllocMap().insert( | |
| this, new ASGeomKHRExtraData(allocation, src_alloc->primitiveOffset, src_alloc->primitiveCount)); | |
| } | |
| } | |
| } | |
| safe_VkAccelerationStructureGeometryKHR& safe_VkAccelerationStructureGeometryKHR::operator=( | |
| const safe_VkAccelerationStructureGeometryKHR& copy_src) { | |
| if (©_src == this) return *this; | |
| auto iter = GetAccelStructGeomHostAllocMap().pop(this); | |
| if (iter != GetAccelStructGeomHostAllocMap().end()) { | |
| delete iter->second; | |
| } | |
| FreePnextChain(pNext); | |
| if (geometryType == VK_GEOMETRY_TYPE_INSTANCES_KHR) { | |
| FreePnextChain(geometry.instances.pNext); | |
| } else if (geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR) { | |
| FreePnextChain(geometry.triangles.pNext); | |
| } else if (geometryType == VK_GEOMETRY_TYPE_AABBS_KHR) { | |
| FreePnextChain(geometry.aabbs.pNext); | |
| } | |
| sType = copy_src.sType; | |
| geometryType = copy_src.geometryType; | |
| geometry = copy_src.geometry; | |
| flags = copy_src.flags; | |
| pNext = SafePnextCopy(copy_src.pNext); | |
| if (geometryType == VK_GEOMETRY_TYPE_INSTANCES_KHR) { | |
| geometry.instances.pNext = SafePnextCopy(copy_src.geometry.instances.pNext); | |
| } else if (geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR) { | |
| geometry.triangles.pNext = SafePnextCopy(copy_src.geometry.triangles.pNext); | |
| } else if (geometryType == VK_GEOMETRY_TYPE_AABBS_KHR) { | |
| geometry.aabbs.pNext = SafePnextCopy(copy_src.geometry.aabbs.pNext); | |
| } | |
| auto src_iter = GetAccelStructGeomHostAllocMap().find(©_src); | |
| if (src_iter != GetAccelStructGeomHostAllocMap().end()) { | |
| auto& src_alloc = src_iter->second; | |
| if (geometry.instances.arrayOfPointers) { | |
| size_t pp_array_size = src_alloc->primitiveCount * sizeof(VkAccelerationStructureInstanceKHR*); | |
| size_t p_array_size = src_alloc->primitiveCount * sizeof(VkAccelerationStructureInstanceKHR); | |
| size_t array_size = src_alloc->primitiveOffset + pp_array_size + p_array_size; | |
| uint8_t* allocation = new uint8_t[array_size]; | |
| VkAccelerationStructureInstanceKHR** ppInstances = | |
| reinterpret_cast<VkAccelerationStructureInstanceKHR**>(allocation + src_alloc->primitiveOffset); | |
| VkAccelerationStructureInstanceKHR* pInstances = | |
| reinterpret_cast<VkAccelerationStructureInstanceKHR*>(allocation + src_alloc->primitiveOffset + pp_array_size); | |
| for (uint32_t i = 0; i < src_alloc->primitiveCount; ++i) { | |
| pInstances[i] = | |
| *(reinterpret_cast<VkAccelerationStructureInstanceKHR* const*>(src_alloc->ptr + src_alloc->primitiveOffset)[i]); | |
| ppInstances[i] = &pInstances[i]; | |
| } | |
| geometry.instances.data.hostAddress = allocation; | |
| GetAccelStructGeomHostAllocMap().insert( | |
| this, new ASGeomKHRExtraData(allocation, src_alloc->primitiveOffset, src_alloc->primitiveCount)); | |
| } else { | |
| size_t array_size = src_alloc->primitiveOffset + src_alloc->primitiveCount * sizeof(VkAccelerationStructureInstanceKHR); | |
| uint8_t* allocation = new uint8_t[array_size]; | |
| memcpy(allocation, src_alloc->ptr, array_size); | |
| geometry.instances.data.hostAddress = allocation; | |
| GetAccelStructGeomHostAllocMap().insert( | |
| this, new ASGeomKHRExtraData(allocation, src_alloc->primitiveOffset, src_alloc->primitiveCount)); | |
| } | |
| } | |
| return *this; | |
| } | |
| safe_VkAccelerationStructureGeometryKHR::~safe_VkAccelerationStructureGeometryKHR() { | |
| // Protect destructions of elements in GetAccelStructGeomHostAllocMap. | |
| // It should not be needed to check for emptyness of the map, | |
| // but testing showed doing so fixes a crash that can occur at application exit. | |
| if (!GetAccelStructGeomHostAllocMap().empty()) { | |
| auto iter = GetAccelStructGeomHostAllocMap().pop(this); | |
| if (iter != GetAccelStructGeomHostAllocMap().end()) { | |
| delete iter->second; | |
| } | |
| } | |
| FreePnextChain(pNext); | |
| if (geometryType == VK_GEOMETRY_TYPE_INSTANCES_KHR) { | |
| FreePnextChain(geometry.instances.pNext); | |
| } else if (geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR) { | |
| FreePnextChain(geometry.triangles.pNext); | |
| } else if (geometryType == VK_GEOMETRY_TYPE_AABBS_KHR) { | |
| FreePnextChain(geometry.aabbs.pNext); | |
| } | |
| } | |
| void safe_VkAccelerationStructureGeometryKHR::initialize(const VkAccelerationStructureGeometryKHR* in_struct, const bool is_host, | |
| const VkAccelerationStructureBuildRangeInfoKHR* build_range_info, | |
| [[maybe_unused]] PNextCopyState* copy_state) { | |
| auto iter = GetAccelStructGeomHostAllocMap().pop(this); | |
| if (iter != GetAccelStructGeomHostAllocMap().end()) { | |
| delete iter->second; | |
| } | |
| FreePnextChain(pNext); | |
| if (geometryType == VK_GEOMETRY_TYPE_INSTANCES_KHR) { | |
| FreePnextChain(geometry.instances.pNext); | |
| } else if (geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR) { | |
| FreePnextChain(geometry.triangles.pNext); | |
| } else if (geometryType == VK_GEOMETRY_TYPE_AABBS_KHR) { | |
| FreePnextChain(geometry.aabbs.pNext); | |
| } | |
| sType = in_struct->sType; | |
| geometryType = in_struct->geometryType; | |
| geometry = in_struct->geometry; | |
| flags = in_struct->flags; | |
| pNext = SafePnextCopy(in_struct->pNext, copy_state); | |
| if (is_host && geometryType == VK_GEOMETRY_TYPE_INSTANCES_KHR) { | |
| if (geometry.instances.arrayOfPointers) { | |
| size_t pp_array_size = build_range_info->primitiveCount * sizeof(VkAccelerationStructureInstanceKHR*); | |
| size_t p_array_size = build_range_info->primitiveCount * sizeof(VkAccelerationStructureInstanceKHR); | |
| size_t array_size = build_range_info->primitiveOffset + pp_array_size + p_array_size; | |
| uint8_t* allocation = new uint8_t[array_size]; | |
| VkAccelerationStructureInstanceKHR** ppInstances = | |
| reinterpret_cast<VkAccelerationStructureInstanceKHR**>(allocation + build_range_info->primitiveOffset); | |
| VkAccelerationStructureInstanceKHR* pInstances = reinterpret_cast<VkAccelerationStructureInstanceKHR*>( | |
| allocation + build_range_info->primitiveOffset + pp_array_size); | |
| for (uint32_t i = 0; i < build_range_info->primitiveCount; ++i) { | |
| const uint8_t* byte_ptr = reinterpret_cast<const uint8_t*>(in_struct->geometry.instances.data.hostAddress); | |
| pInstances[i] = *( | |
| reinterpret_cast<VkAccelerationStructureInstanceKHR* const*>(byte_ptr + build_range_info->primitiveOffset)[i]); | |
| ppInstances[i] = &pInstances[i]; | |
| } | |
| geometry.instances.data.hostAddress = allocation; | |
| GetAccelStructGeomHostAllocMap().insert( | |
| this, new ASGeomKHRExtraData(allocation, build_range_info->primitiveOffset, build_range_info->primitiveCount)); | |
| } else { | |
| const auto primitive_offset = build_range_info->primitiveOffset; | |
| const auto primitive_count = build_range_info->primitiveCount; | |
| size_t array_size = primitive_offset + primitive_count * sizeof(VkAccelerationStructureInstanceKHR); | |
| uint8_t* allocation = new uint8_t[array_size]; | |
| auto host_address = static_cast<const uint8_t*>(in_struct->geometry.instances.data.hostAddress); | |
| memcpy(allocation + primitive_offset, host_address + primitive_offset, | |
| primitive_count * sizeof(VkAccelerationStructureInstanceKHR)); | |
| geometry.instances.data.hostAddress = allocation; | |
| GetAccelStructGeomHostAllocMap().insert( | |
| this, new ASGeomKHRExtraData(allocation, build_range_info->primitiveOffset, build_range_info->primitiveCount)); | |
| } | |
| } | |
| } | |
| void safe_VkAccelerationStructureGeometryKHR::initialize(const safe_VkAccelerationStructureGeometryKHR* copy_src, | |
| [[maybe_unused]] PNextCopyState* copy_state) { | |
| sType = copy_src->sType; | |
| geometryType = copy_src->geometryType; | |
| geometry = copy_src->geometry; | |
| flags = copy_src->flags; | |
| pNext = SafePnextCopy(copy_src->pNext); | |
| if (geometryType == VK_GEOMETRY_TYPE_INSTANCES_KHR) { | |
| geometry.instances.pNext = SafePnextCopy(copy_src->geometry.instances.pNext, copy_state); | |
| } else if (geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR) { | |
| geometry.triangles.pNext = SafePnextCopy(copy_src->geometry.triangles.pNext, copy_state); | |
| } else if (geometryType == VK_GEOMETRY_TYPE_AABBS_KHR) { | |
| geometry.aabbs.pNext = SafePnextCopy(copy_src->geometry.aabbs.pNext, copy_state); | |
| } | |
| auto src_iter = GetAccelStructGeomHostAllocMap().find(copy_src); | |
| if (src_iter != GetAccelStructGeomHostAllocMap().end()) { | |
| auto& src_alloc = src_iter->second; | |
| if (geometry.instances.arrayOfPointers) { | |
| size_t pp_array_size = src_alloc->primitiveCount * sizeof(VkAccelerationStructureInstanceKHR*); | |
| size_t p_array_size = src_alloc->primitiveCount * sizeof(VkAccelerationStructureInstanceKHR); | |
| size_t array_size = src_alloc->primitiveOffset + pp_array_size + p_array_size; | |
| uint8_t* allocation = new uint8_t[array_size]; | |
| VkAccelerationStructureInstanceKHR** ppInstances = | |
| reinterpret_cast<VkAccelerationStructureInstanceKHR**>(allocation + src_alloc->primitiveOffset); | |
| VkAccelerationStructureInstanceKHR* pInstances = | |
| reinterpret_cast<VkAccelerationStructureInstanceKHR*>(allocation + src_alloc->primitiveOffset + pp_array_size); | |
| for (uint32_t i = 0; i < src_alloc->primitiveCount; ++i) { | |
| pInstances[i] = | |
| *(reinterpret_cast<VkAccelerationStructureInstanceKHR* const*>(src_alloc->ptr + src_alloc->primitiveOffset)[i]); | |
| ppInstances[i] = &pInstances[i]; | |
| } | |
| geometry.instances.data.hostAddress = allocation; | |
| GetAccelStructGeomHostAllocMap().insert( | |
| this, new ASGeomKHRExtraData(allocation, src_alloc->primitiveOffset, src_alloc->primitiveCount)); | |
| } else { | |
| size_t array_size = src_alloc->primitiveOffset + src_alloc->primitiveCount * sizeof(VkAccelerationStructureInstanceKHR); | |
| uint8_t* allocation = new uint8_t[array_size]; | |
| memcpy(allocation, src_alloc->ptr, array_size); | |
| geometry.instances.data.hostAddress = allocation; | |
| GetAccelStructGeomHostAllocMap().insert( | |
| this, new ASGeomKHRExtraData(allocation, src_alloc->primitiveOffset, src_alloc->primitiveCount)); | |
| } | |
| } | |
| } | |
| void safe_VkRayTracingPipelineCreateInfoCommon::initialize(const VkRayTracingPipelineCreateInfoNV* pCreateInfo) { | |
| safe_VkRayTracingPipelineCreateInfoNV nvStruct; | |
| nvStruct.initialize(pCreateInfo); | |
| sType = nvStruct.sType; | |
| // Take ownership of the pointer and null it out in nvStruct | |
| pNext = nvStruct.pNext; | |
| nvStruct.pNext = nullptr; | |
| flags = nvStruct.flags; | |
| stageCount = nvStruct.stageCount; | |
| pStages = nvStruct.pStages; | |
| nvStruct.pStages = nullptr; | |
| groupCount = nvStruct.groupCount; | |
| maxRecursionDepth = nvStruct.maxRecursionDepth; | |
| layout = nvStruct.layout; | |
| basePipelineHandle = nvStruct.basePipelineHandle; | |
| basePipelineIndex = nvStruct.basePipelineIndex; | |
| assert(pGroups == nullptr); | |
| if (nvStruct.groupCount && nvStruct.pGroups) { | |
| pGroups = new safe_VkRayTracingShaderGroupCreateInfoKHR[groupCount]; | |
| for (uint32_t i = 0; i < groupCount; ++i) { | |
| pGroups[i].sType = nvStruct.pGroups[i].sType; | |
| pGroups[i].pNext = nvStruct.pGroups[i].pNext; | |
| pGroups[i].type = nvStruct.pGroups[i].type; | |
| pGroups[i].generalShader = nvStruct.pGroups[i].generalShader; | |
| pGroups[i].closestHitShader = nvStruct.pGroups[i].closestHitShader; | |
| pGroups[i].anyHitShader = nvStruct.pGroups[i].anyHitShader; | |
| pGroups[i].intersectionShader = nvStruct.pGroups[i].intersectionShader; | |
| pGroups[i].intersectionShader = nvStruct.pGroups[i].intersectionShader; | |
| pGroups[i].pShaderGroupCaptureReplayHandle = nullptr; | |
| } | |
| } | |
| } | |
| void safe_VkRayTracingPipelineCreateInfoCommon::initialize(const VkRayTracingPipelineCreateInfoKHR* pCreateInfo) { | |
| safe_VkRayTracingPipelineCreateInfoKHR::initialize(pCreateInfo); | |
| } | |
| safe_VkGraphicsPipelineCreateInfo::safe_VkGraphicsPipelineCreateInfo(const VkGraphicsPipelineCreateInfo* in_struct, | |
| const bool uses_color_attachment, | |
| const bool uses_depthstencil_attachment, | |
| [[maybe_unused]] PNextCopyState* copy_state, bool copy_pnext) | |
| : sType(in_struct->sType), | |
| flags(in_struct->flags), | |
| stageCount(in_struct->stageCount), | |
| pStages(nullptr), | |
| pVertexInputState(nullptr), | |
| pInputAssemblyState(nullptr), | |
| pTessellationState(nullptr), | |
| pViewportState(nullptr), | |
| pRasterizationState(nullptr), | |
| pMultisampleState(nullptr), | |
| pDepthStencilState(nullptr), | |
| pColorBlendState(nullptr), | |
| pDynamicState(nullptr), | |
| layout(in_struct->layout), | |
| renderPass(in_struct->renderPass), | |
| subpass(in_struct->subpass), | |
| basePipelineHandle(in_struct->basePipelineHandle), | |
| basePipelineIndex(in_struct->basePipelineIndex) { | |
| if (copy_pnext) { | |
| pNext = SafePnextCopy(in_struct->pNext, copy_state); | |
| } | |
| const bool is_graphics_library = | |
| vku::FindStructInPNextChain<VkGraphicsPipelineLibraryCreateInfoEXT>(in_struct->pNext) != nullptr; | |
| if (stageCount && in_struct->pStages) { | |
| pStages = new safe_VkPipelineShaderStageCreateInfo[stageCount]; | |
| for (uint32_t i = 0; i < stageCount; ++i) { | |
| pStages[i].initialize(&in_struct->pStages[i]); | |
| } | |
| } | |
| if (in_struct->pVertexInputState) | |
| pVertexInputState = new safe_VkPipelineVertexInputStateCreateInfo(in_struct->pVertexInputState); | |
| else | |
| pVertexInputState = nullptr; | |
| if (in_struct->pInputAssemblyState) | |
| pInputAssemblyState = new safe_VkPipelineInputAssemblyStateCreateInfo(in_struct->pInputAssemblyState); | |
| else | |
| pInputAssemblyState = nullptr; | |
| bool has_tessellation_stage = false; | |
| if (stageCount && pStages) { | |
| for (uint32_t i = 0; i < stageCount; ++i) { | |
| if (pStages[i].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT || | |
| pStages[i].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) | |
| has_tessellation_stage = true; | |
| } | |
| } | |
| if (in_struct->pTessellationState && has_tessellation_stage) | |
| pTessellationState = new safe_VkPipelineTessellationStateCreateInfo(in_struct->pTessellationState); | |
| else | |
| pTessellationState = nullptr; // original pTessellationState pointer ignored | |
| bool is_dynamic_has_rasterization = false; | |
| if (in_struct->pDynamicState && in_struct->pDynamicState->pDynamicStates) { | |
| for (uint32_t i = 0; i < in_struct->pDynamicState->dynamicStateCount && !is_dynamic_has_rasterization; ++i) | |
| if (in_struct->pDynamicState->pDynamicStates[i] == VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT) | |
| is_dynamic_has_rasterization = true; | |
| } | |
| // No pRasterizationState is same as dynamic, we assume rasterizerDiscardEnable is false | |
| const bool has_rasterization = is_dynamic_has_rasterization || | |
| (!in_struct->pRasterizationState || !in_struct->pRasterizationState->rasterizerDiscardEnable); | |
| if (in_struct->pViewportState && (has_rasterization || is_graphics_library)) { | |
| bool is_dynamic_viewports = false; | |
| bool is_dynamic_scissors = false; | |
| if (in_struct->pDynamicState && in_struct->pDynamicState->pDynamicStates) { | |
| for (uint32_t i = 0; i < in_struct->pDynamicState->dynamicStateCount && !is_dynamic_viewports; ++i) | |
| if (in_struct->pDynamicState->pDynamicStates[i] == VK_DYNAMIC_STATE_VIEWPORT) is_dynamic_viewports = true; | |
| for (uint32_t i = 0; i < in_struct->pDynamicState->dynamicStateCount && !is_dynamic_scissors; ++i) | |
| if (in_struct->pDynamicState->pDynamicStates[i] == VK_DYNAMIC_STATE_SCISSOR) is_dynamic_scissors = true; | |
| } | |
| pViewportState = | |
| new safe_VkPipelineViewportStateCreateInfo(in_struct->pViewportState, is_dynamic_viewports, is_dynamic_scissors); | |
| } else | |
| pViewportState = nullptr; // original pViewportState pointer ignored | |
| if (in_struct->pRasterizationState) | |
| pRasterizationState = new safe_VkPipelineRasterizationStateCreateInfo(in_struct->pRasterizationState); | |
| else | |
| pRasterizationState = nullptr; | |
| if (in_struct->pMultisampleState && (has_rasterization || is_graphics_library)) | |
| pMultisampleState = new safe_VkPipelineMultisampleStateCreateInfo(in_struct->pMultisampleState); | |
| else | |
| pMultisampleState = nullptr; // original pMultisampleState pointer ignored | |
| // needs a tracked subpass state uses_depthstencil_attachment | |
| if (in_struct->pDepthStencilState && ((has_rasterization && uses_depthstencil_attachment) || is_graphics_library)) | |
| pDepthStencilState = new safe_VkPipelineDepthStencilStateCreateInfo(in_struct->pDepthStencilState); | |
| else | |
| pDepthStencilState = nullptr; // original pDepthStencilState pointer ignored | |
| // needs a tracked subpass state usesColorAttachment | |
| if (in_struct->pColorBlendState && ((has_rasterization && uses_color_attachment) || is_graphics_library)) | |
| pColorBlendState = new safe_VkPipelineColorBlendStateCreateInfo(in_struct->pColorBlendState); | |
| else | |
| pColorBlendState = nullptr; // original pColorBlendState pointer ignored | |
| if (in_struct->pDynamicState) | |
| pDynamicState = new safe_VkPipelineDynamicStateCreateInfo(in_struct->pDynamicState); | |
| else | |
| pDynamicState = nullptr; | |
| } | |
| safe_VkGraphicsPipelineCreateInfo::safe_VkGraphicsPipelineCreateInfo() | |
| : sType(VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO), | |
| pNext(nullptr), | |
| flags(), | |
| stageCount(), | |
| pStages(nullptr), | |
| pVertexInputState(nullptr), | |
| pInputAssemblyState(nullptr), | |
| pTessellationState(nullptr), | |
| pViewportState(nullptr), | |
| pRasterizationState(nullptr), | |
| pMultisampleState(nullptr), | |
| pDepthStencilState(nullptr), | |
| pColorBlendState(nullptr), | |
| pDynamicState(nullptr), | |
| layout(), | |
| renderPass(), | |
| subpass(), | |
| basePipelineHandle(), | |
| basePipelineIndex() {} | |
| safe_VkGraphicsPipelineCreateInfo::safe_VkGraphicsPipelineCreateInfo(const safe_VkGraphicsPipelineCreateInfo& copy_src) { | |
| sType = copy_src.sType; | |
| flags = copy_src.flags; | |
| stageCount = copy_src.stageCount; | |
| pStages = nullptr; | |
| pVertexInputState = nullptr; | |
| pInputAssemblyState = nullptr; | |
| pTessellationState = nullptr; | |
| pViewportState = nullptr; | |
| pRasterizationState = nullptr; | |
| pMultisampleState = nullptr; | |
| pDepthStencilState = nullptr; | |
| pColorBlendState = nullptr; | |
| pDynamicState = nullptr; | |
| layout = copy_src.layout; | |
| renderPass = copy_src.renderPass; | |
| subpass = copy_src.subpass; | |
| basePipelineHandle = copy_src.basePipelineHandle; | |
| basePipelineIndex = copy_src.basePipelineIndex; | |
| pNext = SafePnextCopy(copy_src.pNext); | |
| const bool is_graphics_library = vku::FindStructInPNextChain<VkGraphicsPipelineLibraryCreateInfoEXT>(copy_src.pNext); | |
| if (stageCount && copy_src.pStages) { | |
| pStages = new safe_VkPipelineShaderStageCreateInfo[stageCount]; | |
| for (uint32_t i = 0; i < stageCount; ++i) { | |
| pStages[i].initialize(©_src.pStages[i]); | |
| } | |
| } | |
| if (copy_src.pVertexInputState) | |
| pVertexInputState = new safe_VkPipelineVertexInputStateCreateInfo(*copy_src.pVertexInputState); | |
| else | |
| pVertexInputState = nullptr; | |
| if (copy_src.pInputAssemblyState) | |
| pInputAssemblyState = new safe_VkPipelineInputAssemblyStateCreateInfo(*copy_src.pInputAssemblyState); | |
| else | |
| pInputAssemblyState = nullptr; | |
| bool has_tessellation_stage = false; | |
| if (stageCount && pStages) | |
| for (uint32_t i = 0; i < stageCount && !has_tessellation_stage; ++i) | |
| if (pStages[i].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT || | |
| pStages[i].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) | |
| has_tessellation_stage = true; | |
| if (copy_src.pTessellationState && has_tessellation_stage) | |
| pTessellationState = new safe_VkPipelineTessellationStateCreateInfo(*copy_src.pTessellationState); | |
| else | |
| pTessellationState = nullptr; // original pTessellationState pointer ignored | |
| bool is_dynamic_has_rasterization = false; | |
| if (copy_src.pDynamicState && copy_src.pDynamicState->pDynamicStates) { | |
| for (uint32_t i = 0; i < copy_src.pDynamicState->dynamicStateCount && !is_dynamic_has_rasterization; ++i) | |
| if (copy_src.pDynamicState->pDynamicStates[i] == VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT) | |
| is_dynamic_has_rasterization = true; | |
| } | |
| // No pRasterizationState is same as dynamic, we assume rasterizerDiscardEnable is false | |
| const bool has_rasterization = | |
| is_dynamic_has_rasterization || (!copy_src.pRasterizationState || !copy_src.pRasterizationState->rasterizerDiscardEnable); | |
| if (copy_src.pViewportState && (has_rasterization || is_graphics_library)) { | |
| pViewportState = new safe_VkPipelineViewportStateCreateInfo(*copy_src.pViewportState); | |
| } else | |
| pViewportState = nullptr; // original pViewportState pointer ignored | |
| if (copy_src.pRasterizationState) | |
| pRasterizationState = new safe_VkPipelineRasterizationStateCreateInfo(*copy_src.pRasterizationState); | |
| else | |
| pRasterizationState = nullptr; | |
| if (copy_src.pMultisampleState && (has_rasterization || is_graphics_library)) | |
| pMultisampleState = new safe_VkPipelineMultisampleStateCreateInfo(*copy_src.pMultisampleState); | |
| else | |
| pMultisampleState = nullptr; // original pMultisampleState pointer ignored | |
| if (copy_src.pDepthStencilState && (has_rasterization || is_graphics_library)) | |
| pDepthStencilState = new safe_VkPipelineDepthStencilStateCreateInfo(*copy_src.pDepthStencilState); | |
| else | |
| pDepthStencilState = nullptr; // original pDepthStencilState pointer ignored | |
| if (copy_src.pColorBlendState && (has_rasterization || is_graphics_library)) | |
| pColorBlendState = new safe_VkPipelineColorBlendStateCreateInfo(*copy_src.pColorBlendState); | |
| else | |
| pColorBlendState = nullptr; // original pColorBlendState pointer ignored | |
| if (copy_src.pDynamicState) | |
| pDynamicState = new safe_VkPipelineDynamicStateCreateInfo(*copy_src.pDynamicState); | |
| else | |
| pDynamicState = nullptr; | |
| } | |
| safe_VkGraphicsPipelineCreateInfo& safe_VkGraphicsPipelineCreateInfo::operator=(const safe_VkGraphicsPipelineCreateInfo& copy_src) { | |
| if (©_src == this) return *this; | |
| if (pStages) delete[] pStages; | |
| if (pVertexInputState) delete pVertexInputState; | |
| if (pInputAssemblyState) delete pInputAssemblyState; | |
| if (pTessellationState) delete pTessellationState; | |
| if (pViewportState) delete pViewportState; | |
| if (pRasterizationState) delete pRasterizationState; | |
| if (pMultisampleState) delete pMultisampleState; | |
| if (pDepthStencilState) delete pDepthStencilState; | |
| if (pColorBlendState) delete pColorBlendState; | |
| if (pDynamicState) delete pDynamicState; | |
| FreePnextChain(pNext); | |
| sType = copy_src.sType; | |
| flags = copy_src.flags; | |
| stageCount = copy_src.stageCount; | |
| pStages = nullptr; | |
| pVertexInputState = nullptr; | |
| pInputAssemblyState = nullptr; | |
| pTessellationState = nullptr; | |
| pViewportState = nullptr; | |
| pRasterizationState = nullptr; | |
| pMultisampleState = nullptr; | |
| pDepthStencilState = nullptr; | |
| pColorBlendState = nullptr; | |
| pDynamicState = nullptr; | |
| layout = copy_src.layout; | |
| renderPass = copy_src.renderPass; | |
| subpass = copy_src.subpass; | |
| basePipelineHandle = copy_src.basePipelineHandle; | |
| basePipelineIndex = copy_src.basePipelineIndex; | |
| pNext = SafePnextCopy(copy_src.pNext); | |
| const bool is_graphics_library = vku::FindStructInPNextChain<VkGraphicsPipelineLibraryCreateInfoEXT>(copy_src.pNext); | |
| if (stageCount && copy_src.pStages) { | |
| pStages = new safe_VkPipelineShaderStageCreateInfo[stageCount]; | |
| for (uint32_t i = 0; i < stageCount; ++i) { | |
| pStages[i].initialize(©_src.pStages[i]); | |
| } | |
| } | |
| if (copy_src.pVertexInputState) | |
| pVertexInputState = new safe_VkPipelineVertexInputStateCreateInfo(*copy_src.pVertexInputState); | |
| else | |
| pVertexInputState = nullptr; | |
| if (copy_src.pInputAssemblyState) | |
| pInputAssemblyState = new safe_VkPipelineInputAssemblyStateCreateInfo(*copy_src.pInputAssemblyState); | |
| else | |
| pInputAssemblyState = nullptr; | |
| bool has_tessellation_stage = false; | |
| if (stageCount && pStages) | |
| for (uint32_t i = 0; i < stageCount && !has_tessellation_stage; ++i) | |
| if (pStages[i].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT || | |
| pStages[i].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) | |
| has_tessellation_stage = true; | |
| if (copy_src.pTessellationState && has_tessellation_stage) | |
| pTessellationState = new safe_VkPipelineTessellationStateCreateInfo(*copy_src.pTessellationState); | |
| else | |
| pTessellationState = nullptr; // original pTessellationState pointer ignored | |
| bool is_dynamic_has_rasterization = false; | |
| if (copy_src.pDynamicState && copy_src.pDynamicState->pDynamicStates) { | |
| for (uint32_t i = 0; i < copy_src.pDynamicState->dynamicStateCount && !is_dynamic_has_rasterization; ++i) | |
| if (copy_src.pDynamicState->pDynamicStates[i] == VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT) | |
| is_dynamic_has_rasterization = true; | |
| } | |
| // No pRasterizationState is same as dynamic, we assume rasterizerDiscardEnable is false | |
| const bool has_rasterization = | |
| is_dynamic_has_rasterization || (!copy_src.pRasterizationState || !copy_src.pRasterizationState->rasterizerDiscardEnable); | |
| if (copy_src.pViewportState && (has_rasterization || is_graphics_library)) { | |
| pViewportState = new safe_VkPipelineViewportStateCreateInfo(*copy_src.pViewportState); | |
| } else | |
| pViewportState = nullptr; // original pViewportState pointer ignored | |
| if (copy_src.pRasterizationState) | |
| pRasterizationState = new safe_VkPipelineRasterizationStateCreateInfo(*copy_src.pRasterizationState); | |
| else | |
| pRasterizationState = nullptr; | |
| if (copy_src.pMultisampleState && (has_rasterization || is_graphics_library)) | |
| pMultisampleState = new safe_VkPipelineMultisampleStateCreateInfo(*copy_src.pMultisampleState); | |
| else | |
| pMultisampleState = nullptr; // original pMultisampleState pointer ignored | |
| if (copy_src.pDepthStencilState && (has_rasterization || is_graphics_library)) | |
| pDepthStencilState = new safe_VkPipelineDepthStencilStateCreateInfo(*copy_src.pDepthStencilState); | |
| else | |
| pDepthStencilState = nullptr; // original pDepthStencilState pointer ignored | |
| if (copy_src.pColorBlendState && (has_rasterization || is_graphics_library)) | |
| pColorBlendState = new safe_VkPipelineColorBlendStateCreateInfo(*copy_src.pColorBlendState); | |
| else | |
| pColorBlendState = nullptr; // original pColorBlendState pointer ignored | |
| if (copy_src.pDynamicState) | |
| pDynamicState = new safe_VkPipelineDynamicStateCreateInfo(*copy_src.pDynamicState); | |
| else | |
| pDynamicState = nullptr; | |
| return *this; | |
| } | |
| safe_VkGraphicsPipelineCreateInfo::~safe_VkGraphicsPipelineCreateInfo() { | |
| if (pStages) delete[] pStages; | |
| if (pVertexInputState) delete pVertexInputState; | |
| if (pInputAssemblyState) delete pInputAssemblyState; | |
| if (pTessellationState) delete pTessellationState; | |
| if (pViewportState) delete pViewportState; | |
| if (pRasterizationState) delete pRasterizationState; | |
| if (pMultisampleState) delete pMultisampleState; | |
| if (pDepthStencilState) delete pDepthStencilState; | |
| if (pColorBlendState) delete pColorBlendState; | |
| if (pDynamicState) delete pDynamicState; | |
| FreePnextChain(pNext); | |
| } | |
| void safe_VkGraphicsPipelineCreateInfo::initialize(const VkGraphicsPipelineCreateInfo* in_struct, const bool uses_color_attachment, | |
| const bool uses_depthstencil_attachment, | |
| [[maybe_unused]] PNextCopyState* copy_state) { | |
| if (pStages) delete[] pStages; | |
| if (pVertexInputState) delete pVertexInputState; | |
| if (pInputAssemblyState) delete pInputAssemblyState; | |
| if (pTessellationState) delete pTessellationState; | |
| if (pViewportState) delete pViewportState; | |
| if (pRasterizationState) delete pRasterizationState; | |
| if (pMultisampleState) delete pMultisampleState; | |
| if (pDepthStencilState) delete pDepthStencilState; | |
| if (pColorBlendState) delete pColorBlendState; | |
| if (pDynamicState) delete pDynamicState; | |
| FreePnextChain(pNext); | |
| sType = in_struct->sType; | |
| flags = in_struct->flags; | |
| stageCount = in_struct->stageCount; | |
| pStages = nullptr; | |
| pVertexInputState = nullptr; | |
| pInputAssemblyState = nullptr; | |
| pTessellationState = nullptr; | |
| pViewportState = nullptr; | |
| pRasterizationState = nullptr; | |
| pMultisampleState = nullptr; | |
| pDepthStencilState = nullptr; | |
| pColorBlendState = nullptr; | |
| pDynamicState = nullptr; | |
| layout = in_struct->layout; | |
| renderPass = in_struct->renderPass; | |
| subpass = in_struct->subpass; | |
| basePipelineHandle = in_struct->basePipelineHandle; | |
| basePipelineIndex = in_struct->basePipelineIndex; | |
| pNext = SafePnextCopy(in_struct->pNext, copy_state); | |
| const bool is_graphics_library = | |
| vku::FindStructInPNextChain<VkGraphicsPipelineLibraryCreateInfoEXT>(in_struct->pNext) != nullptr; | |
| if (stageCount && in_struct->pStages) { | |
| pStages = new safe_VkPipelineShaderStageCreateInfo[stageCount]; | |
| for (uint32_t i = 0; i < stageCount; ++i) { | |
| pStages[i].initialize(&in_struct->pStages[i]); | |
| } | |
| } | |
| if (in_struct->pVertexInputState) | |
| pVertexInputState = new safe_VkPipelineVertexInputStateCreateInfo(in_struct->pVertexInputState); | |
| else | |
| pVertexInputState = nullptr; | |
| if (in_struct->pInputAssemblyState) | |
| pInputAssemblyState = new safe_VkPipelineInputAssemblyStateCreateInfo(in_struct->pInputAssemblyState); | |
| else | |
| pInputAssemblyState = nullptr; | |
| bool has_tessellation_stage = false; | |
| if (stageCount && pStages) { | |
| for (uint32_t i = 0; i < stageCount; ++i) { | |
| if (pStages[i].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT || | |
| pStages[i].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) | |
| has_tessellation_stage = true; | |
| } | |
| } | |
| if (in_struct->pTessellationState && has_tessellation_stage) | |
| pTessellationState = new safe_VkPipelineTessellationStateCreateInfo(in_struct->pTessellationState); | |
| else | |
| pTessellationState = nullptr; // original pTessellationState pointer ignored | |
| bool is_dynamic_has_rasterization = false; | |
| if (in_struct->pDynamicState && in_struct->pDynamicState->pDynamicStates) { | |
| for (uint32_t i = 0; i < in_struct->pDynamicState->dynamicStateCount && !is_dynamic_has_rasterization; ++i) | |
| if (in_struct->pDynamicState->pDynamicStates[i] == VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT) | |
| is_dynamic_has_rasterization = true; | |
| } | |
| // No pRasterizationState is same as dynamic, we assume rasterizerDiscardEnable is false | |
| const bool has_rasterization = is_dynamic_has_rasterization || | |
| (!in_struct->pRasterizationState || !in_struct->pRasterizationState->rasterizerDiscardEnable); | |
| if (in_struct->pViewportState && (has_rasterization || is_graphics_library)) { | |
| bool is_dynamic_viewports = false; | |
| bool is_dynamic_scissors = false; | |
| if (in_struct->pDynamicState && in_struct->pDynamicState->pDynamicStates) { | |
| for (uint32_t i = 0; i < in_struct->pDynamicState->dynamicStateCount && !is_dynamic_viewports; ++i) | |
| if (in_struct->pDynamicState->pDynamicStates[i] == VK_DYNAMIC_STATE_VIEWPORT) is_dynamic_viewports = true; | |
| for (uint32_t i = 0; i < in_struct->pDynamicState->dynamicStateCount && !is_dynamic_scissors; ++i) | |
| if (in_struct->pDynamicState->pDynamicStates[i] == VK_DYNAMIC_STATE_SCISSOR) is_dynamic_scissors = true; | |
| } | |
| pViewportState = | |
| new safe_VkPipelineViewportStateCreateInfo(in_struct->pViewportState, is_dynamic_viewports, is_dynamic_scissors); | |
| } else | |
| pViewportState = nullptr; // original pViewportState pointer ignored | |
| if (in_struct->pRasterizationState) | |
| pRasterizationState = new safe_VkPipelineRasterizationStateCreateInfo(in_struct->pRasterizationState); | |
| else | |
| pRasterizationState = nullptr; | |
| if (in_struct->pMultisampleState && (has_rasterization || is_graphics_library)) | |
| pMultisampleState = new safe_VkPipelineMultisampleStateCreateInfo(in_struct->pMultisampleState); | |
| else | |
| pMultisampleState = nullptr; // original pMultisampleState pointer ignored | |
| // needs a tracked subpass state uses_depthstencil_attachment | |
| if (in_struct->pDepthStencilState && ((has_rasterization && uses_depthstencil_attachment) || is_graphics_library)) | |
| pDepthStencilState = new safe_VkPipelineDepthStencilStateCreateInfo(in_struct->pDepthStencilState); | |
| else | |
| pDepthStencilState = nullptr; // original pDepthStencilState pointer ignored | |
| // needs a tracked subpass state usesColorAttachment | |
| if (in_struct->pColorBlendState && ((has_rasterization && uses_color_attachment) || is_graphics_library)) | |
| pColorBlendState = new safe_VkPipelineColorBlendStateCreateInfo(in_struct->pColorBlendState); | |
| else | |
| pColorBlendState = nullptr; // original pColorBlendState pointer ignored | |
| if (in_struct->pDynamicState) | |
| pDynamicState = new safe_VkPipelineDynamicStateCreateInfo(in_struct->pDynamicState); | |
| else | |
| pDynamicState = nullptr; | |
| } | |
| void safe_VkGraphicsPipelineCreateInfo::initialize(const safe_VkGraphicsPipelineCreateInfo* copy_src, | |
| [[maybe_unused]] PNextCopyState* copy_state) { | |
| sType = copy_src->sType; | |
| flags = copy_src->flags; | |
| stageCount = copy_src->stageCount; | |
| pStages = nullptr; | |
| pVertexInputState = nullptr; | |
| pInputAssemblyState = nullptr; | |
| pTessellationState = nullptr; | |
| pViewportState = nullptr; | |
| pRasterizationState = nullptr; | |
| pMultisampleState = nullptr; | |
| pDepthStencilState = nullptr; | |
| pColorBlendState = nullptr; | |
| pDynamicState = nullptr; | |
| layout = copy_src->layout; | |
| renderPass = copy_src->renderPass; | |
| subpass = copy_src->subpass; | |
| basePipelineHandle = copy_src->basePipelineHandle; | |
| basePipelineIndex = copy_src->basePipelineIndex; | |
| pNext = SafePnextCopy(copy_src->pNext); | |
| const bool is_graphics_library = vku::FindStructInPNextChain<VkGraphicsPipelineLibraryCreateInfoEXT>(copy_src->pNext); | |
| if (stageCount && copy_src->pStages) { | |
| pStages = new safe_VkPipelineShaderStageCreateInfo[stageCount]; | |
| for (uint32_t i = 0; i < stageCount; ++i) { | |
| pStages[i].initialize(©_src->pStages[i]); | |
| } | |
| } | |
| if (copy_src->pVertexInputState) | |
| pVertexInputState = new safe_VkPipelineVertexInputStateCreateInfo(*copy_src->pVertexInputState); | |
| else | |
| pVertexInputState = nullptr; | |
| if (copy_src->pInputAssemblyState) | |
| pInputAssemblyState = new safe_VkPipelineInputAssemblyStateCreateInfo(*copy_src->pInputAssemblyState); | |
| else | |
| pInputAssemblyState = nullptr; | |
| bool has_tessellation_stage = false; | |
| if (stageCount && pStages) | |
| for (uint32_t i = 0; i < stageCount && !has_tessellation_stage; ++i) | |
| if (pStages[i].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT || | |
| pStages[i].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) | |
| has_tessellation_stage = true; | |
| if (copy_src->pTessellationState && has_tessellation_stage) | |
| pTessellationState = new safe_VkPipelineTessellationStateCreateInfo(*copy_src->pTessellationState); | |
| else | |
| pTessellationState = nullptr; // original pTessellationState pointer ignored | |
| bool is_dynamic_has_rasterization = false; | |
| if (copy_src->pDynamicState && copy_src->pDynamicState->pDynamicStates) { | |
| for (uint32_t i = 0; i < copy_src->pDynamicState->dynamicStateCount && !is_dynamic_has_rasterization; ++i) | |
| if (copy_src->pDynamicState->pDynamicStates[i] == VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT) | |
| is_dynamic_has_rasterization = true; | |
| } | |
| // No pRasterizationState is same as dynamic, we assume rasterizerDiscardEnable is false | |
| const bool has_rasterization = | |
| is_dynamic_has_rasterization || (!copy_src->pRasterizationState || !copy_src->pRasterizationState->rasterizerDiscardEnable); | |
| if (copy_src->pViewportState && (has_rasterization || is_graphics_library)) { | |
| pViewportState = new safe_VkPipelineViewportStateCreateInfo(*copy_src->pViewportState); | |
| } else | |
| pViewportState = nullptr; // original pViewportState pointer ignored | |
| if (copy_src->pRasterizationState) | |
| pRasterizationState = new safe_VkPipelineRasterizationStateCreateInfo(*copy_src->pRasterizationState); | |
| else | |
| pRasterizationState = nullptr; | |
| if (copy_src->pMultisampleState && (has_rasterization || is_graphics_library)) | |
| pMultisampleState = new safe_VkPipelineMultisampleStateCreateInfo(*copy_src->pMultisampleState); | |
| else | |
| pMultisampleState = nullptr; // original pMultisampleState pointer ignored | |
| if (copy_src->pDepthStencilState && (has_rasterization || is_graphics_library)) | |
| pDepthStencilState = new safe_VkPipelineDepthStencilStateCreateInfo(*copy_src->pDepthStencilState); | |
| else | |
| pDepthStencilState = nullptr; // original pDepthStencilState pointer ignored | |
| if (copy_src->pColorBlendState && (has_rasterization || is_graphics_library)) | |
| pColorBlendState = new safe_VkPipelineColorBlendStateCreateInfo(*copy_src->pColorBlendState); | |
| else | |
| pColorBlendState = nullptr; // original pColorBlendState pointer ignored | |
| if (copy_src->pDynamicState) | |
| pDynamicState = new safe_VkPipelineDynamicStateCreateInfo(*copy_src->pDynamicState); | |
| else | |
| pDynamicState = nullptr; | |
| } | |
| safe_VkPipelineViewportStateCreateInfo::safe_VkPipelineViewportStateCreateInfo(const VkPipelineViewportStateCreateInfo* in_struct, | |
| const bool is_dynamic_viewports, | |
| const bool is_dynamic_scissors, | |
| [[maybe_unused]] PNextCopyState* copy_state, | |
| bool copy_pnext) | |
| : sType(in_struct->sType), | |
| flags(in_struct->flags), | |
| viewportCount(in_struct->viewportCount), | |
| pViewports(nullptr), | |
| scissorCount(in_struct->scissorCount), | |
| pScissors(nullptr) { | |
| if (copy_pnext) { | |
| pNext = SafePnextCopy(in_struct->pNext, copy_state); | |
| } | |
| if (in_struct->pViewports && !is_dynamic_viewports) { | |
| pViewports = new VkViewport[in_struct->viewportCount]; | |
| memcpy((void*)pViewports, (void*)in_struct->pViewports, sizeof(VkViewport) * in_struct->viewportCount); | |
| } else | |
| pViewports = nullptr; | |
| if (in_struct->pScissors && !is_dynamic_scissors) { | |
| pScissors = new VkRect2D[in_struct->scissorCount]; | |
| memcpy((void*)pScissors, (void*)in_struct->pScissors, sizeof(VkRect2D) * in_struct->scissorCount); | |
| } else | |
| pScissors = nullptr; | |
| } | |
| safe_VkPipelineViewportStateCreateInfo::safe_VkPipelineViewportStateCreateInfo() | |
| : sType(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO), | |
| pNext(nullptr), | |
| flags(), | |
| viewportCount(), | |
| pViewports(nullptr), | |
| scissorCount(), | |
| pScissors(nullptr) {} | |
| safe_VkPipelineViewportStateCreateInfo::safe_VkPipelineViewportStateCreateInfo( | |
| const safe_VkPipelineViewportStateCreateInfo& copy_src) { | |
| sType = copy_src.sType; | |
| flags = copy_src.flags; | |
| viewportCount = copy_src.viewportCount; | |
| pViewports = nullptr; | |
| scissorCount = copy_src.scissorCount; | |
| pScissors = nullptr; | |
| pNext = SafePnextCopy(copy_src.pNext); | |
| if (copy_src.pViewports) { | |
| pViewports = new VkViewport[copy_src.viewportCount]; | |
| memcpy((void*)pViewports, (void*)copy_src.pViewports, sizeof(VkViewport) * copy_src.viewportCount); | |
| } else | |
| pViewports = nullptr; | |
| if (copy_src.pScissors) { | |
| pScissors = new VkRect2D[copy_src.scissorCount]; | |
| memcpy((void*)pScissors, (void*)copy_src.pScissors, sizeof(VkRect2D) * copy_src.scissorCount); | |
| } else | |
| pScissors = nullptr; | |
| } | |
| safe_VkPipelineViewportStateCreateInfo& safe_VkPipelineViewportStateCreateInfo::operator=( | |
| const safe_VkPipelineViewportStateCreateInfo& copy_src) { | |
| if (©_src == this) return *this; | |
| if (pViewports) delete[] pViewports; | |
| if (pScissors) delete[] pScissors; | |
| FreePnextChain(pNext); | |
| sType = copy_src.sType; | |
| flags = copy_src.flags; | |
| viewportCount = copy_src.viewportCount; | |
| pViewports = nullptr; | |
| scissorCount = copy_src.scissorCount; | |
| pScissors = nullptr; | |
| pNext = SafePnextCopy(copy_src.pNext); | |
| if (copy_src.pViewports) { | |
| pViewports = new VkViewport[copy_src.viewportCount]; | |
| memcpy((void*)pViewports, (void*)copy_src.pViewports, sizeof(VkViewport) * copy_src.viewportCount); | |
| } else | |
| pViewports = nullptr; | |
| if (copy_src.pScissors) { | |
| pScissors = new VkRect2D[copy_src.scissorCount]; | |
| memcpy((void*)pScissors, (void*)copy_src.pScissors, sizeof(VkRect2D) * copy_src.scissorCount); | |
| } else | |
| pScissors = nullptr; | |
| return *this; | |
| } | |
| safe_VkPipelineViewportStateCreateInfo::~safe_VkPipelineViewportStateCreateInfo() { | |
| if (pViewports) delete[] pViewports; | |
| if (pScissors) delete[] pScissors; | |
| FreePnextChain(pNext); | |
| } | |
| void safe_VkPipelineViewportStateCreateInfo::initialize(const VkPipelineViewportStateCreateInfo* in_struct, | |
| const bool is_dynamic_viewports, const bool is_dynamic_scissors, | |
| [[maybe_unused]] PNextCopyState* copy_state) { | |
| if (pViewports) delete[] pViewports; | |
| if (pScissors) delete[] pScissors; | |
| FreePnextChain(pNext); | |
| sType = in_struct->sType; | |
| flags = in_struct->flags; | |
| viewportCount = in_struct->viewportCount; | |
| pViewports = nullptr; | |
| scissorCount = in_struct->scissorCount; | |
| pScissors = nullptr; | |
| pNext = SafePnextCopy(in_struct->pNext, copy_state); | |
| if (in_struct->pViewports && !is_dynamic_viewports) { | |
| pViewports = new VkViewport[in_struct->viewportCount]; | |
| memcpy((void*)pViewports, (void*)in_struct->pViewports, sizeof(VkViewport) * in_struct->viewportCount); | |
| } else | |
| pViewports = nullptr; | |
| if (in_struct->pScissors && !is_dynamic_scissors) { | |
| pScissors = new VkRect2D[in_struct->scissorCount]; | |
| memcpy((void*)pScissors, (void*)in_struct->pScissors, sizeof(VkRect2D) * in_struct->scissorCount); | |
| } else | |
| pScissors = nullptr; | |
| } | |
| void safe_VkPipelineViewportStateCreateInfo::initialize(const safe_VkPipelineViewportStateCreateInfo* copy_src, | |
| [[maybe_unused]] PNextCopyState* copy_state) { | |
| sType = copy_src->sType; | |
| flags = copy_src->flags; | |
| viewportCount = copy_src->viewportCount; | |
| pViewports = nullptr; | |
| scissorCount = copy_src->scissorCount; | |
| pScissors = nullptr; | |
| pNext = SafePnextCopy(copy_src->pNext); | |
| if (copy_src->pViewports) { | |
| pViewports = new VkViewport[copy_src->viewportCount]; | |
| memcpy((void*)pViewports, (void*)copy_src->pViewports, sizeof(VkViewport) * copy_src->viewportCount); | |
| } else | |
| pViewports = nullptr; | |
| if (copy_src->pScissors) { | |
| pScissors = new VkRect2D[copy_src->scissorCount]; | |
| memcpy((void*)pScissors, (void*)copy_src->pScissors, sizeof(VkRect2D) * copy_src->scissorCount); | |
| } else | |
| pScissors = nullptr; | |
| } | |
| safe_VkAccelerationStructureBuildGeometryInfoKHR::safe_VkAccelerationStructureBuildGeometryInfoKHR( | |
| const VkAccelerationStructureBuildGeometryInfoKHR* in_struct, const bool is_host, | |
| const VkAccelerationStructureBuildRangeInfoKHR* build_range_infos, [[maybe_unused]] PNextCopyState* copy_state, bool copy_pnext) | |
| : sType(in_struct->sType), | |
| type(in_struct->type), | |
| flags(in_struct->flags), | |
| mode(in_struct->mode), | |
| srcAccelerationStructure(in_struct->srcAccelerationStructure), | |
| dstAccelerationStructure(in_struct->dstAccelerationStructure), | |
| geometryCount(in_struct->geometryCount), | |
| pGeometries(nullptr), | |
| ppGeometries(nullptr), | |
| scratchData(&in_struct->scratchData) { | |
| if (copy_pnext) { | |
| pNext = SafePnextCopy(in_struct->pNext, copy_state); | |
| } | |
| if (geometryCount) { | |
| if (in_struct->ppGeometries) { | |
| ppGeometries = new safe_VkAccelerationStructureGeometryKHR*[geometryCount]; | |
| for (uint32_t i = 0; i < geometryCount; ++i) { | |
| ppGeometries[i] = | |
| new safe_VkAccelerationStructureGeometryKHR(in_struct->ppGeometries[i], is_host, &build_range_infos[i]); | |
| } | |
| } else { | |
| pGeometries = new safe_VkAccelerationStructureGeometryKHR[geometryCount]; | |
| for (uint32_t i = 0; i < geometryCount; ++i) { | |
| (pGeometries)[i] = | |
| safe_VkAccelerationStructureGeometryKHR(&(in_struct->pGeometries)[i], is_host, &build_range_infos[i]); | |
| } | |
| } | |
| } | |
| } | |
| safe_VkAccelerationStructureBuildGeometryInfoKHR::safe_VkAccelerationStructureBuildGeometryInfoKHR() | |
| : sType(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR), | |
| pNext(nullptr), | |
| type(), | |
| flags(), | |
| mode(), | |
| srcAccelerationStructure(), | |
| dstAccelerationStructure(), | |
| geometryCount(), | |
| pGeometries(nullptr), | |
| ppGeometries(nullptr) {} | |
| safe_VkAccelerationStructureBuildGeometryInfoKHR::safe_VkAccelerationStructureBuildGeometryInfoKHR( | |
| const safe_VkAccelerationStructureBuildGeometryInfoKHR& copy_src) { | |
| sType = copy_src.sType; | |
| type = copy_src.type; | |
| flags = copy_src.flags; | |
| mode = copy_src.mode; | |
| srcAccelerationStructure = copy_src.srcAccelerationStructure; | |
| dstAccelerationStructure = copy_src.dstAccelerationStructure; | |
| geometryCount = copy_src.geometryCount; | |
| pGeometries = nullptr; | |
| ppGeometries = nullptr; | |
| scratchData.initialize(©_src.scratchData); | |
| if (geometryCount) { | |
| if (copy_src.ppGeometries) { | |
| ppGeometries = new safe_VkAccelerationStructureGeometryKHR*[geometryCount]; | |
| for (uint32_t i = 0; i < geometryCount; ++i) { | |
| ppGeometries[i] = new safe_VkAccelerationStructureGeometryKHR(*copy_src.ppGeometries[i]); | |
| } | |
| } else { | |
| pGeometries = new safe_VkAccelerationStructureGeometryKHR[geometryCount]; | |
| for (uint32_t i = 0; i < geometryCount; ++i) { | |
| pGeometries[i] = safe_VkAccelerationStructureGeometryKHR(copy_src.pGeometries[i]); | |
| } | |
| } | |
| } | |
| } | |
| safe_VkAccelerationStructureBuildGeometryInfoKHR& safe_VkAccelerationStructureBuildGeometryInfoKHR::operator=( | |
| const safe_VkAccelerationStructureBuildGeometryInfoKHR& copy_src) { | |
| if (©_src == this) return *this; | |
| if (ppGeometries) { | |
| for (uint32_t i = 0; i < geometryCount; ++i) { | |
| delete ppGeometries[i]; | |
| } | |
| delete[] ppGeometries; | |
| } else if (pGeometries) { | |
| delete[] pGeometries; | |
| } | |
| FreePnextChain(pNext); | |
| sType = copy_src.sType; | |
| type = copy_src.type; | |
| flags = copy_src.flags; | |
| mode = copy_src.mode; | |
| srcAccelerationStructure = copy_src.srcAccelerationStructure; | |
| dstAccelerationStructure = copy_src.dstAccelerationStructure; | |
| geometryCount = copy_src.geometryCount; | |
| pGeometries = nullptr; | |
| ppGeometries = nullptr; | |
| scratchData.initialize(©_src.scratchData); | |
| if (geometryCount) { | |
| if (copy_src.ppGeometries) { | |
| ppGeometries = new safe_VkAccelerationStructureGeometryKHR*[geometryCount]; | |
| for (uint32_t i = 0; i < geometryCount; ++i) { | |
| ppGeometries[i] = new safe_VkAccelerationStructureGeometryKHR(*copy_src.ppGeometries[i]); | |
| } | |
| } else { | |
| pGeometries = new safe_VkAccelerationStructureGeometryKHR[geometryCount]; | |
| for (uint32_t i = 0; i < geometryCount; ++i) { | |
| pGeometries[i] = safe_VkAccelerationStructureGeometryKHR(copy_src.pGeometries[i]); | |
| } | |
| } | |
| } | |
| return *this; | |
| } | |
| safe_VkAccelerationStructureBuildGeometryInfoKHR::~safe_VkAccelerationStructureBuildGeometryInfoKHR() { | |
| if (ppGeometries) { | |
| for (uint32_t i = 0; i < geometryCount; ++i) { | |
| delete ppGeometries[i]; | |
| } | |
| delete[] ppGeometries; | |
| } else if (pGeometries) { | |
| delete[] pGeometries; | |
| } | |
| FreePnextChain(pNext); | |
| } | |
| void safe_VkAccelerationStructureBuildGeometryInfoKHR::initialize(const VkAccelerationStructureBuildGeometryInfoKHR* in_struct, | |
| const bool is_host, | |
| const VkAccelerationStructureBuildRangeInfoKHR* build_range_infos, | |
| [[maybe_unused]] PNextCopyState* copy_state) { | |
| if (ppGeometries) { | |
| for (uint32_t i = 0; i < geometryCount; ++i) { | |
| delete ppGeometries[i]; | |
| } | |
| delete[] ppGeometries; | |
| } else if (pGeometries) { | |
| delete[] pGeometries; | |
| } | |
| FreePnextChain(pNext); | |
| sType = in_struct->sType; | |
| type = in_struct->type; | |
| flags = in_struct->flags; | |
| mode = in_struct->mode; | |
| srcAccelerationStructure = in_struct->srcAccelerationStructure; | |
| dstAccelerationStructure = in_struct->dstAccelerationStructure; | |
| geometryCount = in_struct->geometryCount; | |
| pGeometries = nullptr; | |
| ppGeometries = nullptr; | |
| scratchData.initialize(&in_struct->scratchData); | |
| pNext = SafePnextCopy(in_struct->pNext, copy_state); | |
| if (geometryCount) { | |
| if (in_struct->ppGeometries) { | |
| ppGeometries = new safe_VkAccelerationStructureGeometryKHR*[geometryCount]; | |
| for (uint32_t i = 0; i < geometryCount; ++i) { | |
| ppGeometries[i] = | |
| new safe_VkAccelerationStructureGeometryKHR(in_struct->ppGeometries[i], is_host, &build_range_infos[i]); | |
| } | |
| } else { | |
| pGeometries = new safe_VkAccelerationStructureGeometryKHR[geometryCount]; | |
| for (uint32_t i = 0; i < geometryCount; ++i) { | |
| (pGeometries)[i] = | |
| safe_VkAccelerationStructureGeometryKHR(&(in_struct->pGeometries)[i], is_host, &build_range_infos[i]); | |
| } | |
| } | |
| } | |
| } | |
| void safe_VkAccelerationStructureBuildGeometryInfoKHR::initialize(const safe_VkAccelerationStructureBuildGeometryInfoKHR* copy_src, | |
| [[maybe_unused]] PNextCopyState* copy_state) { | |
| sType = copy_src->sType; | |
| type = copy_src->type; | |
| flags = copy_src->flags; | |
| mode = copy_src->mode; | |
| srcAccelerationStructure = copy_src->srcAccelerationStructure; | |
| dstAccelerationStructure = copy_src->dstAccelerationStructure; | |
| geometryCount = copy_src->geometryCount; | |
| pGeometries = nullptr; | |
| ppGeometries = nullptr; | |
| scratchData.initialize(©_src->scratchData); | |
| if (geometryCount) { | |
| if (copy_src->ppGeometries) { | |
| ppGeometries = new safe_VkAccelerationStructureGeometryKHR*[geometryCount]; | |
| for (uint32_t i = 0; i < geometryCount; ++i) { | |
| ppGeometries[i] = new safe_VkAccelerationStructureGeometryKHR(*copy_src->ppGeometries[i]); | |
| } | |
| } else { | |
| pGeometries = new safe_VkAccelerationStructureGeometryKHR[geometryCount]; | |
| for (uint32_t i = 0; i < geometryCount; ++i) { | |
| pGeometries[i] = safe_VkAccelerationStructureGeometryKHR(copy_src->pGeometries[i]); | |
| } | |
| } | |
| } | |
| } | |
| safe_VkMicromapBuildInfoEXT::safe_VkMicromapBuildInfoEXT(const VkMicromapBuildInfoEXT* in_struct, | |
| [[maybe_unused]] PNextCopyState* copy_state, bool copy_pnext) | |
| : sType(in_struct->sType), | |
| type(in_struct->type), | |
| flags(in_struct->flags), | |
| mode(in_struct->mode), | |
| dstMicromap(in_struct->dstMicromap), | |
| usageCountsCount(in_struct->usageCountsCount), | |
| pUsageCounts(nullptr), | |
| ppUsageCounts(nullptr), | |
| data(&in_struct->data), | |
| scratchData(&in_struct->scratchData), | |
| triangleArray(&in_struct->triangleArray), | |
| triangleArrayStride(in_struct->triangleArrayStride) { | |
| if (copy_pnext) { | |
| pNext = SafePnextCopy(in_struct->pNext, copy_state); | |
| } | |
| if (in_struct->pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[in_struct->usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)in_struct->pUsageCounts, sizeof(VkMicromapUsageEXT) * in_struct->usageCountsCount); | |
| } | |
| if (in_struct->ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[in_struct->usageCountsCount]; | |
| for (uint32_t i = 0; i < in_struct->usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*in_struct->ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| } | |
| safe_VkMicromapBuildInfoEXT::safe_VkMicromapBuildInfoEXT() | |
| : sType(VK_STRUCTURE_TYPE_MICROMAP_BUILD_INFO_EXT), | |
| pNext(nullptr), | |
| type(), | |
| flags(), | |
| mode(), | |
| dstMicromap(), | |
| usageCountsCount(), | |
| pUsageCounts(nullptr), | |
| ppUsageCounts(nullptr), | |
| triangleArrayStride() {} | |
| safe_VkMicromapBuildInfoEXT::safe_VkMicromapBuildInfoEXT(const safe_VkMicromapBuildInfoEXT& copy_src) { | |
| sType = copy_src.sType; | |
| type = copy_src.type; | |
| flags = copy_src.flags; | |
| mode = copy_src.mode; | |
| dstMicromap = copy_src.dstMicromap; | |
| usageCountsCount = copy_src.usageCountsCount; | |
| pUsageCounts = nullptr; | |
| ppUsageCounts = nullptr; | |
| data.initialize(©_src.data); | |
| scratchData.initialize(©_src.scratchData); | |
| triangleArray.initialize(©_src.triangleArray); | |
| triangleArrayStride = copy_src.triangleArrayStride; | |
| pNext = SafePnextCopy(copy_src.pNext); | |
| if (copy_src.pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[copy_src.usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)copy_src.pUsageCounts, sizeof(VkMicromapUsageEXT) * copy_src.usageCountsCount); | |
| } | |
| if (copy_src.ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[copy_src.usageCountsCount]; | |
| for (uint32_t i = 0; i < copy_src.usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*copy_src.ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| } | |
| safe_VkMicromapBuildInfoEXT& safe_VkMicromapBuildInfoEXT::operator=(const safe_VkMicromapBuildInfoEXT& copy_src) { | |
| if (©_src == this) return *this; | |
| if (pUsageCounts) delete[] pUsageCounts; | |
| if (ppUsageCounts) { | |
| for (uint32_t i = 0; i < usageCountsCount; ++i) { | |
| delete ppUsageCounts[i]; | |
| } | |
| delete[] ppUsageCounts; | |
| } | |
| FreePnextChain(pNext); | |
| sType = copy_src.sType; | |
| type = copy_src.type; | |
| flags = copy_src.flags; | |
| mode = copy_src.mode; | |
| dstMicromap = copy_src.dstMicromap; | |
| usageCountsCount = copy_src.usageCountsCount; | |
| pUsageCounts = nullptr; | |
| ppUsageCounts = nullptr; | |
| data.initialize(©_src.data); | |
| scratchData.initialize(©_src.scratchData); | |
| triangleArray.initialize(©_src.triangleArray); | |
| triangleArrayStride = copy_src.triangleArrayStride; | |
| pNext = SafePnextCopy(copy_src.pNext); | |
| if (copy_src.pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[copy_src.usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)copy_src.pUsageCounts, sizeof(VkMicromapUsageEXT) * copy_src.usageCountsCount); | |
| } | |
| if (copy_src.ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[copy_src.usageCountsCount]; | |
| for (uint32_t i = 0; i < copy_src.usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*copy_src.ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| return *this; | |
| } | |
| safe_VkMicromapBuildInfoEXT::~safe_VkMicromapBuildInfoEXT() { | |
| if (pUsageCounts) delete[] pUsageCounts; | |
| if (ppUsageCounts) { | |
| for (uint32_t i = 0; i < usageCountsCount; ++i) { | |
| delete ppUsageCounts[i]; | |
| } | |
| delete[] ppUsageCounts; | |
| } | |
| FreePnextChain(pNext); | |
| } | |
| void safe_VkMicromapBuildInfoEXT::initialize(const VkMicromapBuildInfoEXT* in_struct, [[maybe_unused]] PNextCopyState* copy_state) { | |
| if (pUsageCounts) delete[] pUsageCounts; | |
| if (ppUsageCounts) { | |
| for (uint32_t i = 0; i < usageCountsCount; ++i) { | |
| delete ppUsageCounts[i]; | |
| } | |
| delete[] ppUsageCounts; | |
| } | |
| FreePnextChain(pNext); | |
| sType = in_struct->sType; | |
| type = in_struct->type; | |
| flags = in_struct->flags; | |
| mode = in_struct->mode; | |
| dstMicromap = in_struct->dstMicromap; | |
| usageCountsCount = in_struct->usageCountsCount; | |
| pUsageCounts = nullptr; | |
| ppUsageCounts = nullptr; | |
| data.initialize(&in_struct->data); | |
| scratchData.initialize(&in_struct->scratchData); | |
| triangleArray.initialize(&in_struct->triangleArray); | |
| triangleArrayStride = in_struct->triangleArrayStride; | |
| pNext = SafePnextCopy(in_struct->pNext, copy_state); | |
| if (in_struct->pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[in_struct->usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)in_struct->pUsageCounts, sizeof(VkMicromapUsageEXT) * in_struct->usageCountsCount); | |
| } | |
| if (in_struct->ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[in_struct->usageCountsCount]; | |
| for (uint32_t i = 0; i < in_struct->usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*in_struct->ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| } | |
| void safe_VkMicromapBuildInfoEXT::initialize(const safe_VkMicromapBuildInfoEXT* copy_src, | |
| [[maybe_unused]] PNextCopyState* copy_state) { | |
| sType = copy_src->sType; | |
| type = copy_src->type; | |
| flags = copy_src->flags; | |
| mode = copy_src->mode; | |
| dstMicromap = copy_src->dstMicromap; | |
| usageCountsCount = copy_src->usageCountsCount; | |
| pUsageCounts = nullptr; | |
| ppUsageCounts = nullptr; | |
| data.initialize(©_src->data); | |
| scratchData.initialize(©_src->scratchData); | |
| triangleArray.initialize(©_src->triangleArray); | |
| triangleArrayStride = copy_src->triangleArrayStride; | |
| pNext = SafePnextCopy(copy_src->pNext); | |
| if (copy_src->pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[copy_src->usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)copy_src->pUsageCounts, sizeof(VkMicromapUsageEXT) * copy_src->usageCountsCount); | |
| } | |
| if (copy_src->ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[copy_src->usageCountsCount]; | |
| for (uint32_t i = 0; i < copy_src->usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*copy_src->ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| } | |
| safe_VkAccelerationStructureTrianglesOpacityMicromapEXT::safe_VkAccelerationStructureTrianglesOpacityMicromapEXT( | |
| const VkAccelerationStructureTrianglesOpacityMicromapEXT* in_struct, [[maybe_unused]] PNextCopyState* copy_state, | |
| bool copy_pnext) | |
| : sType(in_struct->sType), | |
| indexType(in_struct->indexType), | |
| indexBuffer(&in_struct->indexBuffer), | |
| indexStride(in_struct->indexStride), | |
| baseTriangle(in_struct->baseTriangle), | |
| usageCountsCount(in_struct->usageCountsCount), | |
| pUsageCounts(nullptr), | |
| ppUsageCounts(nullptr), | |
| micromap(in_struct->micromap) { | |
| if (copy_pnext) { | |
| pNext = SafePnextCopy(in_struct->pNext, copy_state); | |
| } | |
| if (in_struct->pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[in_struct->usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)in_struct->pUsageCounts, sizeof(VkMicromapUsageEXT) * in_struct->usageCountsCount); | |
| } | |
| if (in_struct->ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[in_struct->usageCountsCount]; | |
| for (uint32_t i = 0; i < in_struct->usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*in_struct->ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| } | |
| safe_VkAccelerationStructureTrianglesOpacityMicromapEXT::safe_VkAccelerationStructureTrianglesOpacityMicromapEXT() | |
| : sType(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_OPACITY_MICROMAP_EXT), | |
| pNext(nullptr), | |
| indexType(), | |
| indexStride(), | |
| baseTriangle(), | |
| usageCountsCount(), | |
| pUsageCounts(nullptr), | |
| ppUsageCounts(nullptr), | |
| micromap() {} | |
| safe_VkAccelerationStructureTrianglesOpacityMicromapEXT::safe_VkAccelerationStructureTrianglesOpacityMicromapEXT( | |
| const safe_VkAccelerationStructureTrianglesOpacityMicromapEXT& copy_src) { | |
| sType = copy_src.sType; | |
| indexType = copy_src.indexType; | |
| indexBuffer.initialize(©_src.indexBuffer); | |
| indexStride = copy_src.indexStride; | |
| baseTriangle = copy_src.baseTriangle; | |
| usageCountsCount = copy_src.usageCountsCount; | |
| pUsageCounts = nullptr; | |
| ppUsageCounts = nullptr; | |
| micromap = copy_src.micromap; | |
| pNext = SafePnextCopy(copy_src.pNext); | |
| if (copy_src.pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[copy_src.usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)copy_src.pUsageCounts, sizeof(VkMicromapUsageEXT) * copy_src.usageCountsCount); | |
| } | |
| if (copy_src.ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[copy_src.usageCountsCount]; | |
| for (uint32_t i = 0; i < copy_src.usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*copy_src.ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| } | |
| safe_VkAccelerationStructureTrianglesOpacityMicromapEXT& safe_VkAccelerationStructureTrianglesOpacityMicromapEXT::operator=( | |
| const safe_VkAccelerationStructureTrianglesOpacityMicromapEXT& copy_src) { | |
| if (©_src == this) return *this; | |
| if (pUsageCounts) delete[] pUsageCounts; | |
| if (ppUsageCounts) { | |
| for (uint32_t i = 0; i < usageCountsCount; ++i) { | |
| delete ppUsageCounts[i]; | |
| } | |
| delete[] ppUsageCounts; | |
| } | |
| FreePnextChain(pNext); | |
| sType = copy_src.sType; | |
| indexType = copy_src.indexType; | |
| indexBuffer.initialize(©_src.indexBuffer); | |
| indexStride = copy_src.indexStride; | |
| baseTriangle = copy_src.baseTriangle; | |
| usageCountsCount = copy_src.usageCountsCount; | |
| pUsageCounts = nullptr; | |
| ppUsageCounts = nullptr; | |
| micromap = copy_src.micromap; | |
| pNext = SafePnextCopy(copy_src.pNext); | |
| if (copy_src.pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[copy_src.usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)copy_src.pUsageCounts, sizeof(VkMicromapUsageEXT) * copy_src.usageCountsCount); | |
| } | |
| if (copy_src.ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[copy_src.usageCountsCount]; | |
| for (uint32_t i = 0; i < copy_src.usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*copy_src.ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| return *this; | |
| } | |
| safe_VkAccelerationStructureTrianglesOpacityMicromapEXT::~safe_VkAccelerationStructureTrianglesOpacityMicromapEXT() { | |
| if (pUsageCounts) delete[] pUsageCounts; | |
| if (ppUsageCounts) { | |
| for (uint32_t i = 0; i < usageCountsCount; ++i) { | |
| delete ppUsageCounts[i]; | |
| } | |
| delete[] ppUsageCounts; | |
| } | |
| FreePnextChain(pNext); | |
| } | |
| void safe_VkAccelerationStructureTrianglesOpacityMicromapEXT::initialize( | |
| const VkAccelerationStructureTrianglesOpacityMicromapEXT* in_struct, [[maybe_unused]] PNextCopyState* copy_state) { | |
| if (pUsageCounts) delete[] pUsageCounts; | |
| if (ppUsageCounts) { | |
| for (uint32_t i = 0; i < usageCountsCount; ++i) { | |
| delete ppUsageCounts[i]; | |
| } | |
| delete[] ppUsageCounts; | |
| } | |
| FreePnextChain(pNext); | |
| sType = in_struct->sType; | |
| indexType = in_struct->indexType; | |
| indexBuffer.initialize(&in_struct->indexBuffer); | |
| indexStride = in_struct->indexStride; | |
| baseTriangle = in_struct->baseTriangle; | |
| usageCountsCount = in_struct->usageCountsCount; | |
| pUsageCounts = nullptr; | |
| ppUsageCounts = nullptr; | |
| micromap = in_struct->micromap; | |
| pNext = SafePnextCopy(in_struct->pNext, copy_state); | |
| if (in_struct->pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[in_struct->usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)in_struct->pUsageCounts, sizeof(VkMicromapUsageEXT) * in_struct->usageCountsCount); | |
| } | |
| if (in_struct->ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[in_struct->usageCountsCount]; | |
| for (uint32_t i = 0; i < in_struct->usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*in_struct->ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| } | |
| void safe_VkAccelerationStructureTrianglesOpacityMicromapEXT::initialize( | |
| const safe_VkAccelerationStructureTrianglesOpacityMicromapEXT* copy_src, [[maybe_unused]] PNextCopyState* copy_state) { | |
| sType = copy_src->sType; | |
| indexType = copy_src->indexType; | |
| indexBuffer.initialize(©_src->indexBuffer); | |
| indexStride = copy_src->indexStride; | |
| baseTriangle = copy_src->baseTriangle; | |
| usageCountsCount = copy_src->usageCountsCount; | |
| pUsageCounts = nullptr; | |
| ppUsageCounts = nullptr; | |
| micromap = copy_src->micromap; | |
| pNext = SafePnextCopy(copy_src->pNext); | |
| if (copy_src->pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[copy_src->usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)copy_src->pUsageCounts, sizeof(VkMicromapUsageEXT) * copy_src->usageCountsCount); | |
| } | |
| if (copy_src->ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[copy_src->usageCountsCount]; | |
| for (uint32_t i = 0; i < copy_src->usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*copy_src->ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| } | |
| #ifdef VK_ENABLE_BETA_EXTENSIONS | |
| safe_VkAccelerationStructureTrianglesDisplacementMicromapNV::safe_VkAccelerationStructureTrianglesDisplacementMicromapNV( | |
| const VkAccelerationStructureTrianglesDisplacementMicromapNV* in_struct, [[maybe_unused]] PNextCopyState* copy_state, | |
| bool copy_pnext) | |
| : sType(in_struct->sType), | |
| displacementBiasAndScaleFormat(in_struct->displacementBiasAndScaleFormat), | |
| displacementVectorFormat(in_struct->displacementVectorFormat), | |
| displacementBiasAndScaleBuffer(&in_struct->displacementBiasAndScaleBuffer), | |
| displacementBiasAndScaleStride(in_struct->displacementBiasAndScaleStride), | |
| displacementVectorBuffer(&in_struct->displacementVectorBuffer), | |
| displacementVectorStride(in_struct->displacementVectorStride), | |
| displacedMicromapPrimitiveFlags(&in_struct->displacedMicromapPrimitiveFlags), | |
| displacedMicromapPrimitiveFlagsStride(in_struct->displacedMicromapPrimitiveFlagsStride), | |
| indexType(in_struct->indexType), | |
| indexBuffer(&in_struct->indexBuffer), | |
| indexStride(in_struct->indexStride), | |
| baseTriangle(in_struct->baseTriangle), | |
| usageCountsCount(in_struct->usageCountsCount), | |
| pUsageCounts(nullptr), | |
| ppUsageCounts(nullptr), | |
| micromap(in_struct->micromap) { | |
| if (copy_pnext) { | |
| pNext = SafePnextCopy(in_struct->pNext, copy_state); | |
| } | |
| if (in_struct->pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[in_struct->usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)in_struct->pUsageCounts, sizeof(VkMicromapUsageEXT) * in_struct->usageCountsCount); | |
| } | |
| if (in_struct->ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[in_struct->usageCountsCount]; | |
| for (uint32_t i = 0; i < in_struct->usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*in_struct->ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| } | |
| safe_VkAccelerationStructureTrianglesDisplacementMicromapNV::safe_VkAccelerationStructureTrianglesDisplacementMicromapNV() | |
| : sType(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_DISPLACEMENT_MICROMAP_NV), | |
| pNext(nullptr), | |
| displacementBiasAndScaleFormat(), | |
| displacementVectorFormat(), | |
| displacementBiasAndScaleStride(), | |
| displacementVectorStride(), | |
| displacedMicromapPrimitiveFlagsStride(), | |
| indexType(), | |
| indexStride(), | |
| baseTriangle(), | |
| usageCountsCount(), | |
| pUsageCounts(nullptr), | |
| ppUsageCounts(nullptr), | |
| micromap() {} | |
| safe_VkAccelerationStructureTrianglesDisplacementMicromapNV::safe_VkAccelerationStructureTrianglesDisplacementMicromapNV( | |
| const safe_VkAccelerationStructureTrianglesDisplacementMicromapNV& copy_src) { | |
| sType = copy_src.sType; | |
| displacementBiasAndScaleFormat = copy_src.displacementBiasAndScaleFormat; | |
| displacementVectorFormat = copy_src.displacementVectorFormat; | |
| displacementBiasAndScaleBuffer.initialize(©_src.displacementBiasAndScaleBuffer); | |
| displacementBiasAndScaleStride = copy_src.displacementBiasAndScaleStride; | |
| displacementVectorBuffer.initialize(©_src.displacementVectorBuffer); | |
| displacementVectorStride = copy_src.displacementVectorStride; | |
| displacedMicromapPrimitiveFlags.initialize(©_src.displacedMicromapPrimitiveFlags); | |
| displacedMicromapPrimitiveFlagsStride = copy_src.displacedMicromapPrimitiveFlagsStride; | |
| indexType = copy_src.indexType; | |
| indexBuffer.initialize(©_src.indexBuffer); | |
| indexStride = copy_src.indexStride; | |
| baseTriangle = copy_src.baseTriangle; | |
| usageCountsCount = copy_src.usageCountsCount; | |
| pUsageCounts = nullptr; | |
| ppUsageCounts = nullptr; | |
| micromap = copy_src.micromap; | |
| pNext = SafePnextCopy(copy_src.pNext); | |
| if (copy_src.pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[copy_src.usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)copy_src.pUsageCounts, sizeof(VkMicromapUsageEXT) * copy_src.usageCountsCount); | |
| } | |
| if (copy_src.ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[copy_src.usageCountsCount]; | |
| for (uint32_t i = 0; i < copy_src.usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*copy_src.ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| } | |
| safe_VkAccelerationStructureTrianglesDisplacementMicromapNV& safe_VkAccelerationStructureTrianglesDisplacementMicromapNV::operator=( | |
| const safe_VkAccelerationStructureTrianglesDisplacementMicromapNV& copy_src) { | |
| if (©_src == this) return *this; | |
| if (pUsageCounts) delete[] pUsageCounts; | |
| if (ppUsageCounts) { | |
| for (uint32_t i = 0; i < usageCountsCount; ++i) { | |
| delete ppUsageCounts[i]; | |
| } | |
| delete[] ppUsageCounts; | |
| } | |
| FreePnextChain(pNext); | |
| sType = copy_src.sType; | |
| displacementBiasAndScaleFormat = copy_src.displacementBiasAndScaleFormat; | |
| displacementVectorFormat = copy_src.displacementVectorFormat; | |
| displacementBiasAndScaleBuffer.initialize(©_src.displacementBiasAndScaleBuffer); | |
| displacementBiasAndScaleStride = copy_src.displacementBiasAndScaleStride; | |
| displacementVectorBuffer.initialize(©_src.displacementVectorBuffer); | |
| displacementVectorStride = copy_src.displacementVectorStride; | |
| displacedMicromapPrimitiveFlags.initialize(©_src.displacedMicromapPrimitiveFlags); | |
| displacedMicromapPrimitiveFlagsStride = copy_src.displacedMicromapPrimitiveFlagsStride; | |
| indexType = copy_src.indexType; | |
| indexBuffer.initialize(©_src.indexBuffer); | |
| indexStride = copy_src.indexStride; | |
| baseTriangle = copy_src.baseTriangle; | |
| usageCountsCount = copy_src.usageCountsCount; | |
| pUsageCounts = nullptr; | |
| ppUsageCounts = nullptr; | |
| micromap = copy_src.micromap; | |
| pNext = SafePnextCopy(copy_src.pNext); | |
| if (copy_src.pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[copy_src.usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)copy_src.pUsageCounts, sizeof(VkMicromapUsageEXT) * copy_src.usageCountsCount); | |
| } | |
| if (copy_src.ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[copy_src.usageCountsCount]; | |
| for (uint32_t i = 0; i < copy_src.usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*copy_src.ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| return *this; | |
| } | |
| safe_VkAccelerationStructureTrianglesDisplacementMicromapNV::~safe_VkAccelerationStructureTrianglesDisplacementMicromapNV() { | |
| if (pUsageCounts) delete[] pUsageCounts; | |
| if (ppUsageCounts) { | |
| for (uint32_t i = 0; i < usageCountsCount; ++i) { | |
| delete ppUsageCounts[i]; | |
| } | |
| delete[] ppUsageCounts; | |
| } | |
| FreePnextChain(pNext); | |
| } | |
| void safe_VkAccelerationStructureTrianglesDisplacementMicromapNV::initialize( | |
| const VkAccelerationStructureTrianglesDisplacementMicromapNV* in_struct, [[maybe_unused]] PNextCopyState* copy_state) { | |
| if (pUsageCounts) delete[] pUsageCounts; | |
| if (ppUsageCounts) { | |
| for (uint32_t i = 0; i < usageCountsCount; ++i) { | |
| delete ppUsageCounts[i]; | |
| } | |
| delete[] ppUsageCounts; | |
| } | |
| FreePnextChain(pNext); | |
| sType = in_struct->sType; | |
| displacementBiasAndScaleFormat = in_struct->displacementBiasAndScaleFormat; | |
| displacementVectorFormat = in_struct->displacementVectorFormat; | |
| displacementBiasAndScaleBuffer.initialize(&in_struct->displacementBiasAndScaleBuffer); | |
| displacementBiasAndScaleStride = in_struct->displacementBiasAndScaleStride; | |
| displacementVectorBuffer.initialize(&in_struct->displacementVectorBuffer); | |
| displacementVectorStride = in_struct->displacementVectorStride; | |
| displacedMicromapPrimitiveFlags.initialize(&in_struct->displacedMicromapPrimitiveFlags); | |
| displacedMicromapPrimitiveFlagsStride = in_struct->displacedMicromapPrimitiveFlagsStride; | |
| indexType = in_struct->indexType; | |
| indexBuffer.initialize(&in_struct->indexBuffer); | |
| indexStride = in_struct->indexStride; | |
| baseTriangle = in_struct->baseTriangle; | |
| usageCountsCount = in_struct->usageCountsCount; | |
| pUsageCounts = nullptr; | |
| ppUsageCounts = nullptr; | |
| micromap = in_struct->micromap; | |
| pNext = SafePnextCopy(in_struct->pNext, copy_state); | |
| if (in_struct->pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[in_struct->usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)in_struct->pUsageCounts, sizeof(VkMicromapUsageEXT) * in_struct->usageCountsCount); | |
| } | |
| if (in_struct->ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[in_struct->usageCountsCount]; | |
| for (uint32_t i = 0; i < in_struct->usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*in_struct->ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| } | |
| void safe_VkAccelerationStructureTrianglesDisplacementMicromapNV::initialize( | |
| const safe_VkAccelerationStructureTrianglesDisplacementMicromapNV* copy_src, [[maybe_unused]] PNextCopyState* copy_state) { | |
| sType = copy_src->sType; | |
| displacementBiasAndScaleFormat = copy_src->displacementBiasAndScaleFormat; | |
| displacementVectorFormat = copy_src->displacementVectorFormat; | |
| displacementBiasAndScaleBuffer.initialize(©_src->displacementBiasAndScaleBuffer); | |
| displacementBiasAndScaleStride = copy_src->displacementBiasAndScaleStride; | |
| displacementVectorBuffer.initialize(©_src->displacementVectorBuffer); | |
| displacementVectorStride = copy_src->displacementVectorStride; | |
| displacedMicromapPrimitiveFlags.initialize(©_src->displacedMicromapPrimitiveFlags); | |
| displacedMicromapPrimitiveFlagsStride = copy_src->displacedMicromapPrimitiveFlagsStride; | |
| indexType = copy_src->indexType; | |
| indexBuffer.initialize(©_src->indexBuffer); | |
| indexStride = copy_src->indexStride; | |
| baseTriangle = copy_src->baseTriangle; | |
| usageCountsCount = copy_src->usageCountsCount; | |
| pUsageCounts = nullptr; | |
| ppUsageCounts = nullptr; | |
| micromap = copy_src->micromap; | |
| pNext = SafePnextCopy(copy_src->pNext); | |
| if (copy_src->pUsageCounts) { | |
| pUsageCounts = new VkMicromapUsageEXT[copy_src->usageCountsCount]; | |
| memcpy((void*)pUsageCounts, (void*)copy_src->pUsageCounts, sizeof(VkMicromapUsageEXT) * copy_src->usageCountsCount); | |
| } | |
| if (copy_src->ppUsageCounts) { | |
| VkMicromapUsageEXT** pointer_array = new VkMicromapUsageEXT*[copy_src->usageCountsCount]; | |
| for (uint32_t i = 0; i < copy_src->usageCountsCount; ++i) { | |
| pointer_array[i] = new VkMicromapUsageEXT(*copy_src->ppUsageCounts[i]); | |
| } | |
| ppUsageCounts = pointer_array; | |
| } | |
| } | |
| #endif // VK_ENABLE_BETA_EXTENSIONS | |
| } // namespace vku |