mirror of
https://github.com/KhronosGroup/Vulkan-Utility-Libraries.git
synced 2025-05-16 09:48:38 +00:00
1725 lines
81 KiB
C++
1725 lines
81 KiB
C++
/***************************************************************************
|
|
*
|
|
* 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>> 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> 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 (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;
|
|
as_geom_khr_host_alloc.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;
|
|
as_geom_khr_host_alloc.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);
|
|
auto src_iter = as_geom_khr_host_alloc.find(©_src);
|
|
if (src_iter != as_geom_khr_host_alloc.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;
|
|
as_geom_khr_host_alloc.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;
|
|
as_geom_khr_host_alloc.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 = as_geom_khr_host_alloc.pop(this);
|
|
if (iter != as_geom_khr_host_alloc.end()) {
|
|
delete iter->second;
|
|
}
|
|
FreePnextChain(pNext);
|
|
|
|
sType = copy_src.sType;
|
|
geometryType = copy_src.geometryType;
|
|
geometry = copy_src.geometry;
|
|
flags = copy_src.flags;
|
|
|
|
pNext = SafePnextCopy(copy_src.pNext);
|
|
auto src_iter = as_geom_khr_host_alloc.find(©_src);
|
|
if (src_iter != as_geom_khr_host_alloc.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;
|
|
as_geom_khr_host_alloc.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;
|
|
as_geom_khr_host_alloc.insert(
|
|
this, new ASGeomKHRExtraData(allocation, src_alloc->primitiveOffset, src_alloc->primitiveCount));
|
|
}
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
safe_VkAccelerationStructureGeometryKHR::~safe_VkAccelerationStructureGeometryKHR() {
|
|
auto iter = as_geom_khr_host_alloc.pop(this);
|
|
if (iter != as_geom_khr_host_alloc.end()) {
|
|
delete iter->second;
|
|
}
|
|
FreePnextChain(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 = as_geom_khr_host_alloc.pop(this);
|
|
if (iter != as_geom_khr_host_alloc.end()) {
|
|
delete iter->second;
|
|
}
|
|
FreePnextChain(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;
|
|
as_geom_khr_host_alloc.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;
|
|
as_geom_khr_host_alloc.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);
|
|
auto src_iter = as_geom_khr_host_alloc.find(copy_src);
|
|
if (src_iter != as_geom_khr_host_alloc.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;
|
|
as_geom_khr_host_alloc.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;
|
|
as_geom_khr_host_alloc.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 && !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 (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;
|
|
}
|
|
const bool has_rasterization = in_struct->pRasterizationState
|
|
? (is_dynamic_has_rasterization || !in_struct->pRasterizationState->rasterizerDiscardEnable)
|
|
: false;
|
|
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 && (renderPass != VK_NULL_HANDLE || 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;
|
|
}
|
|
const bool has_rasterization = copy_src.pRasterizationState
|
|
? (is_dynamic_has_rasterization || !copy_src.pRasterizationState->rasterizerDiscardEnable)
|
|
: false;
|
|
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;
|
|
}
|
|
const bool has_rasterization = copy_src.pRasterizationState
|
|
? (is_dynamic_has_rasterization || !copy_src.pRasterizationState->rasterizerDiscardEnable)
|
|
: false;
|
|
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 && !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 (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;
|
|
}
|
|
const bool has_rasterization = in_struct->pRasterizationState
|
|
? (is_dynamic_has_rasterization || !in_struct->pRasterizationState->rasterizerDiscardEnable)
|
|
: false;
|
|
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 && (renderPass != VK_NULL_HANDLE || 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;
|
|
}
|
|
const bool has_rasterization = copy_src->pRasterizationState
|
|
? (is_dynamic_has_rasterization || !copy_src->pRasterizationState->rasterizerDiscardEnable)
|
|
: false;
|
|
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
|