Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 14 additions & 7 deletions include/vulkan/utility/vk_safe_struct.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,8 @@ struct safe_VkBufferCreateInfo {
const void* pNext{};
VkBufferCreateFlags flags;
VkDeviceSize size;
VkBufferUsageFlags usage;
// Can be extended from VkBufferUsageFlags2CreateInfo found in the pNext chain
VkBufferUsageFlags2 usage;
VkSharingMode sharingMode;
uint32_t queueFamilyIndexCount;
const uint32_t* pQueueFamilyIndices{};
Expand Down Expand Up @@ -612,7 +613,8 @@ struct safe_VkPipelineShaderStageCreateInfo {
struct safe_VkComputePipelineCreateInfo {
VkStructureType sType;
const void* pNext{};
VkPipelineCreateFlags flags;
// Can be extended from VkPipelineCreateFlags2CreateInfo found in the pNext chain
VkPipelineCreateFlags2 flags;
safe_VkPipelineShaderStageCreateInfo stage;
VkPipelineLayout layout;
VkPipeline basePipelineHandle;
Expand Down Expand Up @@ -1001,7 +1003,8 @@ struct safe_VkPipelineViewportStateCreateInfo {
struct safe_VkGraphicsPipelineCreateInfo {
VkStructureType sType;
const void* pNext{};
VkPipelineCreateFlags flags;
// Can be extended from VkPipelineCreateFlags2CreateInfo found in the pNext chain
VkPipelineCreateFlags2 flags;
uint32_t stageCount;
safe_VkPipelineShaderStageCreateInfo* pStages{};
safe_VkPipelineVertexInputStateCreateInfo* pVertexInputState{};
Expand Down Expand Up @@ -1720,7 +1723,8 @@ struct safe_VkPhysicalDeviceExternalBufferInfo {
VkStructureType sType;
const void* pNext{};
VkBufferCreateFlags flags;
VkBufferUsageFlags usage;
// Can be extended from VkBufferUsageFlags2CreateInfo found in the pNext chain
VkBufferUsageFlags2 usage;
VkExternalMemoryHandleTypeFlagBits handleType;

safe_VkPhysicalDeviceExternalBufferInfo(const VkPhysicalDeviceExternalBufferInfo* in_struct, PNextCopyState* copy_state = {},
Expand Down Expand Up @@ -13531,7 +13535,8 @@ struct safe_VkRayTracingShaderGroupCreateInfoNV {
struct safe_VkRayTracingPipelineCreateInfoNV {
VkStructureType sType;
const void* pNext{};
VkPipelineCreateFlags flags;
// Can be extended from VkPipelineCreateFlags2CreateInfo found in the pNext chain
VkPipelineCreateFlags2 flags;
uint32_t stageCount;
safe_VkPipelineShaderStageCreateInfo* pStages{};
uint32_t groupCount;
Expand Down Expand Up @@ -16518,7 +16523,8 @@ struct safe_VkDescriptorBufferBindingInfoEXT {
VkStructureType sType;
const void* pNext{};
VkDeviceAddress address;
VkBufferUsageFlags usage;
// Can be extended from VkBufferUsageFlags2CreateInfo found in the pNext chain
VkBufferUsageFlags2 usage;

safe_VkDescriptorBufferBindingInfoEXT(const VkDescriptorBufferBindingInfoEXT* in_struct, PNextCopyState* copy_state = {},
bool copy_pnext = true);
Expand Down Expand Up @@ -24788,7 +24794,8 @@ struct safe_VkRayTracingPipelineInterfaceCreateInfoKHR {
struct safe_VkRayTracingPipelineCreateInfoKHR {
VkStructureType sType;
const void* pNext{};
VkPipelineCreateFlags flags;
// Can be extended from VkPipelineCreateFlags2CreateInfo found in the pNext chain
VkPipelineCreateFlags2 flags;
uint32_t stageCount;
safe_VkPipelineShaderStageCreateInfo* pStages{};
uint32_t groupCount;
Expand Down
4 changes: 4 additions & 0 deletions include/vulkan/utility/vk_safe_struct_utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ void* SafePnextCopy(const void* pNext, PNextCopyState* copy_state = {});
void FreePnextChain(const void* pNext);
char* SafeStringCopy(const char* in_string);

// Not ideal, these are manually added, should be rare enough though
const VkBufferUsageFlags2CreateInfo* FindVkBufferUsageFlags2CreateInfo(const void* next);
const VkPipelineCreateFlags2CreateInfo* FindVkPipelineCreateFlags2CreateInfo(const void* next);

template <typename Base, typename T>
bool AddToPnext(Base& base, const T& data) {
assert(base.ptr()); // All safe struct have a ptr() method. Prevent use with non-safe structs.
Expand Down
53 changes: 52 additions & 1 deletion scripts/generators/safe_struct_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ def __init__(self):
['ppEnabledLayerNames', 'enabledLayerCount'],
}

self.extended_structs = set()

def isInPnextChain(self, struct: Struct) -> bool:
# Can appear in VkPipelineCreateInfoKHR::pNext even though it isn't listed in the xml structextends attribute
# VUID-VkPipelineCreateInfoKHR-pNext-09604
Expand Down Expand Up @@ -163,6 +165,30 @@ def generate(self):
****************************************************************************/\n''')
self.write('// NOLINTBEGIN') # Wrap for clang-tidy to ignore

# TODO - Remove when added to VulkanObject
from dataclasses import dataclass
@dataclass
class ExtendedFlag:
struct: str
member: Member

for member in (m for s in self.vk.structs.values() for m in s.members):
member.extendedFlag = None

buffer_usage2 = self.vk.structs['VkBufferUsageFlags2CreateInfo']
pipe_flags2 = self.vk.structs['VkPipelineCreateFlags2CreateInfo']
self.vk.structs['VkBufferCreateInfo'].members[4].extendedFlag = ExtendedFlag(struct=buffer_usage2.name, member=buffer_usage2.members[2])
self.vk.structs['VkPhysicalDeviceExternalBufferInfo'].members[3].extendedFlag = ExtendedFlag(struct=buffer_usage2.name, member=buffer_usage2.members[2])
self.vk.structs['VkDescriptorBufferBindingInfoEXT'].members[3].extendedFlag =ExtendedFlag(struct=buffer_usage2.name, member=buffer_usage2.members[2])
self.vk.structs['VkComputePipelineCreateInfo'].members[2].extendedFlag = ExtendedFlag(struct=pipe_flags2.name, member=pipe_flags2.members[2])
self.vk.structs['VkGraphicsPipelineCreateInfo'].members[2].extendedFlag = ExtendedFlag(struct=pipe_flags2.name, member=pipe_flags2.members[2])
self.vk.structs['VkRayTracingPipelineCreateInfoNV'].members[2].extendedFlag = ExtendedFlag(struct=pipe_flags2.name, member=pipe_flags2.members[2])
self.vk.structs['VkRayTracingPipelineCreateInfoKHR'].members[2].extendedFlag = ExtendedFlag(struct=pipe_flags2.name, member=pipe_flags2.members[2])
for member in (m for s in self.vk.structs.values() for m in s.members):
if member.extendedFlag:
self.extended_structs.add(member.extendedFlag.struct)
self.extended_structs = sorted(self.extended_structs)

if self.filename == 'vk_safe_struct.hpp':
self.generateHeader()
elif self.filename == 'vk_safe_struct_utils.cpp':
Expand Down Expand Up @@ -220,6 +246,9 @@ def generateHeader(self):

if member.length and self.containsObjectHandle(member) and not member.fixedSizeArray:
out.append(f' {member.type}* {member.name}{initialize};\n')
elif member.extendedFlag:
out.append(f'// Can be extended from {member.extendedFlag.struct} found in the pNext chain\n')
out.append(f'{member.extendedFlag.member.cDeclaration}{initialize};\n')
else:
out.append(f'{member.cDeclaration}{initialize};\n')

Expand Down Expand Up @@ -294,6 +323,23 @@ def generateUtil(self):
}

''')

for extended_struct in self.extended_structs:
struct = self.vk.structs[extended_struct]
out.append(f'''
// contains an extended flag
const {struct.name} *Find{struct.name}(const void *next) {{
const VkBaseOutStructure *current = reinterpret_cast<const VkBaseOutStructure *>(next);
while (current) {{
if ({struct.sType} == current->sType) {{
return reinterpret_cast<const {struct.name}*>(current);
}}
current = current->pNext;
}}
return nullptr;
}}
''')

out.append('''
// clang-format off
void *SafePnextCopy(const void *pNext, PNextCopyState* copy_state) {
Expand Down Expand Up @@ -584,7 +630,7 @@ def qfi_construct(item, member):

if member.pointer and ('PFN_' in member.type or member.name in self.unused_params.get(struct.name, [])):
m_shallow_copy = True

if member.name == 'pNext':
copy_pnext = 'pNext = SafePnextCopy(in_struct->pNext, copy_state);\n'
copy_pnext_if = '''
Expand Down Expand Up @@ -730,6 +776,11 @@ def qfi_construct(item, member):
if '' != init_list:
init_list = init_list[:-1] # hack off final comma

for member in (x for x in struct.members if x.extendedFlag):
construct_txt += f"if (auto extended_flag = Find{member.extendedFlag.struct}(pNext)) {{\n"
construct_txt += f" {member.name} = extended_flag->{member.extendedFlag.member.name};"
construct_txt += "}\n"

if struct.name in custom_construct_txt:
construct_txt = custom_construct_txt[struct.name]

Expand Down
45 changes: 45 additions & 0 deletions src/vulkan/vk_safe_struct_core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1586,6 +1586,9 @@ safe_VkBufferCreateInfo::safe_VkBufferCreateInfo(const VkBufferCreateInfo* in_st
} else {
queueFamilyIndexCount = 0;
}
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}
}

safe_VkBufferCreateInfo::safe_VkBufferCreateInfo()
Expand Down Expand Up @@ -1614,6 +1617,9 @@ safe_VkBufferCreateInfo::safe_VkBufferCreateInfo(const safe_VkBufferCreateInfo&
} else {
queueFamilyIndexCount = 0;
}
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}
}

safe_VkBufferCreateInfo& safe_VkBufferCreateInfo::operator=(const safe_VkBufferCreateInfo& copy_src) {
Expand All @@ -1637,6 +1643,9 @@ safe_VkBufferCreateInfo& safe_VkBufferCreateInfo::operator=(const safe_VkBufferC
} else {
queueFamilyIndexCount = 0;
}
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}

return *this;
}
Expand Down Expand Up @@ -1665,6 +1674,9 @@ void safe_VkBufferCreateInfo::initialize(const VkBufferCreateInfo* in_struct, [[
} else {
queueFamilyIndexCount = 0;
}
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}
}

void safe_VkBufferCreateInfo::initialize(const safe_VkBufferCreateInfo* copy_src, [[maybe_unused]] PNextCopyState* copy_state) {
Expand All @@ -1684,6 +1696,9 @@ void safe_VkBufferCreateInfo::initialize(const safe_VkBufferCreateInfo* copy_src
} else {
queueFamilyIndexCount = 0;
}
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}
}

safe_VkImageCreateInfo::safe_VkImageCreateInfo(const VkImageCreateInfo* in_struct, [[maybe_unused]] PNextCopyState* copy_state,
Expand Down Expand Up @@ -2854,6 +2869,9 @@ safe_VkComputePipelineCreateInfo::safe_VkComputePipelineCreateInfo(const VkCompu
if (copy_pnext) {
pNext = SafePnextCopy(in_struct->pNext, copy_state);
}
if (auto extended_flag = FindVkPipelineCreateFlags2CreateInfo(pNext)) {
flags = extended_flag->flags;
}
}

safe_VkComputePipelineCreateInfo::safe_VkComputePipelineCreateInfo()
Expand All @@ -2872,6 +2890,9 @@ safe_VkComputePipelineCreateInfo::safe_VkComputePipelineCreateInfo(const safe_Vk
basePipelineHandle = copy_src.basePipelineHandle;
basePipelineIndex = copy_src.basePipelineIndex;
pNext = SafePnextCopy(copy_src.pNext);
if (auto extended_flag = FindVkPipelineCreateFlags2CreateInfo(pNext)) {
flags = extended_flag->flags;
}
}

safe_VkComputePipelineCreateInfo& safe_VkComputePipelineCreateInfo::operator=(const safe_VkComputePipelineCreateInfo& copy_src) {
Expand All @@ -2886,6 +2907,9 @@ safe_VkComputePipelineCreateInfo& safe_VkComputePipelineCreateInfo::operator=(co
basePipelineHandle = copy_src.basePipelineHandle;
basePipelineIndex = copy_src.basePipelineIndex;
pNext = SafePnextCopy(copy_src.pNext);
if (auto extended_flag = FindVkPipelineCreateFlags2CreateInfo(pNext)) {
flags = extended_flag->flags;
}

return *this;
}
Expand All @@ -2902,6 +2926,9 @@ void safe_VkComputePipelineCreateInfo::initialize(const VkComputePipelineCreateI
basePipelineHandle = in_struct->basePipelineHandle;
basePipelineIndex = in_struct->basePipelineIndex;
pNext = SafePnextCopy(in_struct->pNext, copy_state);
if (auto extended_flag = FindVkPipelineCreateFlags2CreateInfo(pNext)) {
flags = extended_flag->flags;
}
}

void safe_VkComputePipelineCreateInfo::initialize(const safe_VkComputePipelineCreateInfo* copy_src,
Expand All @@ -2913,6 +2940,9 @@ void safe_VkComputePipelineCreateInfo::initialize(const safe_VkComputePipelineCr
basePipelineHandle = copy_src->basePipelineHandle;
basePipelineIndex = copy_src->basePipelineIndex;
pNext = SafePnextCopy(copy_src->pNext);
if (auto extended_flag = FindVkPipelineCreateFlags2CreateInfo(pNext)) {
flags = extended_flag->flags;
}
}

safe_VkPipelineLayoutCreateInfo::safe_VkPipelineLayoutCreateInfo(const VkPipelineLayoutCreateInfo* in_struct,
Expand Down Expand Up @@ -7452,6 +7482,9 @@ safe_VkPhysicalDeviceExternalBufferInfo::safe_VkPhysicalDeviceExternalBufferInfo
if (copy_pnext) {
pNext = SafePnextCopy(in_struct->pNext, copy_state);
}
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}
}

safe_VkPhysicalDeviceExternalBufferInfo::safe_VkPhysicalDeviceExternalBufferInfo()
Expand All @@ -7464,6 +7497,9 @@ safe_VkPhysicalDeviceExternalBufferInfo::safe_VkPhysicalDeviceExternalBufferInfo
usage = copy_src.usage;
handleType = copy_src.handleType;
pNext = SafePnextCopy(copy_src.pNext);
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}
}

safe_VkPhysicalDeviceExternalBufferInfo& safe_VkPhysicalDeviceExternalBufferInfo::operator=(
Expand All @@ -7477,6 +7513,9 @@ safe_VkPhysicalDeviceExternalBufferInfo& safe_VkPhysicalDeviceExternalBufferInfo
usage = copy_src.usage;
handleType = copy_src.handleType;
pNext = SafePnextCopy(copy_src.pNext);
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}

return *this;
}
Expand All @@ -7491,6 +7530,9 @@ void safe_VkPhysicalDeviceExternalBufferInfo::initialize(const VkPhysicalDeviceE
usage = in_struct->usage;
handleType = in_struct->handleType;
pNext = SafePnextCopy(in_struct->pNext, copy_state);
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}
}

void safe_VkPhysicalDeviceExternalBufferInfo::initialize(const safe_VkPhysicalDeviceExternalBufferInfo* copy_src,
Expand All @@ -7500,6 +7542,9 @@ void safe_VkPhysicalDeviceExternalBufferInfo::initialize(const safe_VkPhysicalDe
usage = copy_src->usage;
handleType = copy_src->handleType;
pNext = SafePnextCopy(copy_src->pNext);
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}
}

safe_VkExternalBufferProperties::safe_VkExternalBufferProperties(const VkExternalBufferProperties* in_struct,
Expand Down
15 changes: 15 additions & 0 deletions src/vulkan/vk_safe_struct_ext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9682,6 +9682,9 @@ safe_VkDescriptorBufferBindingInfoEXT::safe_VkDescriptorBufferBindingInfoEXT(con
if (copy_pnext) {
pNext = SafePnextCopy(in_struct->pNext, copy_state);
}
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}
}

safe_VkDescriptorBufferBindingInfoEXT::safe_VkDescriptorBufferBindingInfoEXT()
Expand All @@ -9693,6 +9696,9 @@ safe_VkDescriptorBufferBindingInfoEXT::safe_VkDescriptorBufferBindingInfoEXT(
address = copy_src.address;
usage = copy_src.usage;
pNext = SafePnextCopy(copy_src.pNext);
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}
}

safe_VkDescriptorBufferBindingInfoEXT& safe_VkDescriptorBufferBindingInfoEXT::operator=(
Expand All @@ -9705,6 +9711,9 @@ safe_VkDescriptorBufferBindingInfoEXT& safe_VkDescriptorBufferBindingInfoEXT::op
address = copy_src.address;
usage = copy_src.usage;
pNext = SafePnextCopy(copy_src.pNext);
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}

return *this;
}
Expand All @@ -9718,6 +9727,9 @@ void safe_VkDescriptorBufferBindingInfoEXT::initialize(const VkDescriptorBufferB
address = in_struct->address;
usage = in_struct->usage;
pNext = SafePnextCopy(in_struct->pNext, copy_state);
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}
}

void safe_VkDescriptorBufferBindingInfoEXT::initialize(const safe_VkDescriptorBufferBindingInfoEXT* copy_src,
Expand All @@ -9726,6 +9738,9 @@ void safe_VkDescriptorBufferBindingInfoEXT::initialize(const safe_VkDescriptorBu
address = copy_src->address;
usage = copy_src->usage;
pNext = SafePnextCopy(copy_src->pNext);
if (auto extended_flag = FindVkBufferUsageFlags2CreateInfo(pNext)) {
usage = extended_flag->usage;
}
}

safe_VkDescriptorBufferBindingPushDescriptorBufferHandleEXT::safe_VkDescriptorBufferBindingPushDescriptorBufferHandleEXT(
Expand Down
Loading
Loading