Skip to content

Commit

Permalink
Make extention functions to be optional (#1052)
Browse files Browse the repository at this point in the history
  • Loading branch information
archimedus authored Sep 25, 2024
1 parent 910c29f commit 0d2f7e7
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 24 deletions.
48 changes: 40 additions & 8 deletions src/vulkan/device.cc
Original file line number Diff line number Diff line change
Expand Up @@ -616,20 +616,52 @@ Result Device::Initialize(
return amber::Result(
"Index type uint8_t requested but feature not returned");
}
if (feature == kAccelerationStructure &&
acceleration_structure_ptrs == nullptr) {
return amber::Result(
"Acceleration structure requested but feature not returned");
if (feature == kAccelerationStructure) {
if (acceleration_structure_ptrs == nullptr)
return amber::Result(
"Acceleration structure requested but feature not returned");
if (ptrs_.vkCreateAccelerationStructureKHR == nullptr)
return amber::Result(
"vkCreateAccelerationStructureKHR is required, but not provided");
if (ptrs_.vkDestroyAccelerationStructureKHR == nullptr)
return amber::Result(
"vkDestroyAccelerationStructureKHR is required, but not provided");
if (ptrs_.vkGetAccelerationStructureBuildSizesKHR == nullptr)
return amber::Result(
"vkGetAccelerationStructureBuildSizesKHR is required, but not "
"provided");
if (ptrs_.vkBuildAccelerationStructuresKHR == nullptr)
return amber::Result(
"vkBuildAccelerationStructuresKHR is required, but not "
"provided");
if (ptrs_.vkCmdBuildAccelerationStructuresKHR == nullptr)
return amber::Result(
"vkCmdBuildAccelerationStructuresKHR is required, but not "
"provided");
if (ptrs_.vkGetAccelerationStructureDeviceAddressKHR == nullptr)
return amber::Result(
"vkGetAccelerationStructureDeviceAddressKHR is required, but not "
"provided");
}
if (feature == kBufferDeviceAddress && bda_ptrs == nullptr &&
vulkan12_ptrs == nullptr) {
return amber::Result(
"Buffer device address requested but feature not returned");
}
if (feature == kRayTracingPipeline &&
ray_tracing_pipeline_ptrs == nullptr) {
return amber::Result(
"Ray tracing pipeline requested but feature not returned");
if (feature == kRayTracingPipeline) {
if (ray_tracing_pipeline_ptrs == nullptr)
return amber::Result(
"Ray tracing pipeline requested but feature not returned");
if (ptrs_.vkCreateRayTracingPipelinesKHR == nullptr)
return amber::Result(
"vkCreateRayTracingPipelinesKHR is required, but not provided");
if (ptrs_.vkCmdTraceRaysKHR == nullptr)
return amber::Result(
"vkCmdTraceRaysKHR is required, but not provided");
if (ptrs_.vkGetRayTracingShaderGroupHandlesKHR == nullptr)
return amber::Result(
"vkGetRayTracingShaderGroupHandlesKHR is required, but not "
"provided");
}

// Next check the fields of the feature structures.
Expand Down
18 changes: 9 additions & 9 deletions src/vulkan/vk-funcs-1-1.inc
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
AMBER_VK_FUNC(vkGetPhysicalDeviceProperties2)
AMBER_VK_FUNC(vkCreateRayTracingPipelinesKHR)
AMBER_VK_FUNC(vkCreateAccelerationStructureKHR)
AMBER_VK_FUNC(vkDestroyAccelerationStructureKHR)
AMBER_VK_FUNC(vkGetAccelerationStructureBuildSizesKHR)
AMBER_VK_FUNC(vkBuildAccelerationStructuresKHR)
AMBER_VK_FUNC(vkCmdBuildAccelerationStructuresKHR)
AMBER_VK_FUNC(vkGetAccelerationStructureDeviceAddressKHR)
AMBER_VK_FUNC(vkCmdTraceRaysKHR)
AMBER_VK_FUNC(vkGetRayTracingShaderGroupHandlesKHR)
OPTIONAL AMBER_VK_FUNC(vkCreateRayTracingPipelinesKHR)
OPTIONAL AMBER_VK_FUNC(vkCreateAccelerationStructureKHR)
OPTIONAL AMBER_VK_FUNC(vkDestroyAccelerationStructureKHR)
OPTIONAL AMBER_VK_FUNC(vkGetAccelerationStructureBuildSizesKHR)
OPTIONAL AMBER_VK_FUNC(vkBuildAccelerationStructuresKHR)
OPTIONAL AMBER_VK_FUNC(vkCmdBuildAccelerationStructuresKHR)
OPTIONAL AMBER_VK_FUNC(vkGetAccelerationStructureDeviceAddressKHR)
OPTIONAL AMBER_VK_FUNC(vkCmdTraceRaysKHR)
OPTIONAL AMBER_VK_FUNC(vkGetRayTracingShaderGroupHandlesKHR)
29 changes: 22 additions & 7 deletions tools/update_vk_wrappers.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,18 @@

def read_inc(file):
methods = []
pattern = re.compile(r"AMBER_VK_FUNC\((\w+)\)")
pattern = re.compile(r"(|OPTIONAL )AMBER_VK_FUNC\((\w+)\)")
with open(file, 'r') as f:
for line in f:
match = pattern.search(line)
if match == None:
raise Exception("FAILED TO MATCH PATTERN");

methods.append(match.group(1))
b = False
if match.group(1) != None and match.group(1) == "OPTIONAL ":
b = True
methods.append((match.group(2), b))

return methods


Expand Down Expand Up @@ -69,7 +73,8 @@ def read_vk(file):

def gen_wrappers(methods, xml):
content = ""
for method in methods:
for method_ in methods:
method = method_[0]
data = xml[method]
if data == None:
raise Exception("Failed to find {}".format(method))
Expand Down Expand Up @@ -137,7 +142,8 @@ def gen_wrappers(methods, xml):

def gen_headers(methods, xml):
content = ""
for method in methods:
for method_ in methods:
method = method_[0]
data = xml[method]
if data == None:
raise Exception("Failed to find {}".format(method))
Expand All @@ -161,17 +167,26 @@ def gen_direct(methods):
if (!(ptrs_.${method} = reinterpret_cast<PFN_${method}>(getInstanceProcAddr(instance_, "${method}")))) {
return Result("Vulkan: Unable to load ${method} pointer");
}
''')
template_optional = Template(R'''
ptrs_.${method} = reinterpret_cast<PFN_${method}>(getInstanceProcAddr(instance_, "${method}"));
''')

for method in methods:
content += template.substitute(method=method)
for method_ in methods:
method = method_[0]
optional = method_[1]
if (optional):
content += template_optional.substitute(method=method)
else:
content += template.substitute(method=method)

return content


def gen_direct_headers(methods):
content = ""
for method in methods:
for method_ in methods:
method = method_[0]
content += "PFN_{} {};\n".format(method, method);

return content
Expand Down

0 comments on commit 0d2f7e7

Please sign in to comment.