layers: Add VkGeometryNV validation
Adds checks to validate VkGeometryNV structs in ray tracing functions.
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index c2fccd1..4f87ba3 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -6591,6 +6591,69 @@
cb_state->status |= CBSTATUS_SHADING_RATE_PALETTE_SET;
}
+bool CoreChecks::ValidateGeometryTrianglesNV(const VkGeometryTrianglesNV &triangles, VkDebugReportObjectTypeEXT object_type,
+ uint64_t object_handle, const char *func_name) const {
+ bool skip = false;
+
+ const BUFFER_STATE *vb_state = GetBufferState(triangles.vertexData);
+ if (vb_state != nullptr && vb_state->binding.size <= triangles.vertexOffset) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
+ "VUID-VkGeometryTrianglesNV-vertexOffset-02428", "%s", func_name);
+ }
+
+ const BUFFER_STATE *ib_state = GetBufferState(triangles.indexData);
+ if (ib_state != nullptr && ib_state->binding.size <= triangles.indexOffset) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
+ "VUID-VkGeometryTrianglesNV-indexOffset-02431", "%s", func_name);
+ }
+
+ const BUFFER_STATE *td_state = GetBufferState(triangles.transformData);
+ if (td_state != nullptr && td_state->binding.size <= triangles.transformOffset) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
+ "VUID-VkGeometryTrianglesNV-transformOffset-02437", "%s", func_name);
+ }
+
+ return skip;
+}
+
+bool CoreChecks::ValidateGeometryAABBNV(const VkGeometryAABBNV &aabbs, VkDebugReportObjectTypeEXT object_type,
+ uint64_t object_handle, const char *func_name) const {
+ bool skip = false;
+
+ const BUFFER_STATE *aabb_state = GetBufferState(aabbs.aabbData);
+ if (aabb_state != nullptr && aabb_state->binding.size > 0 && aabb_state->binding.size <= aabbs.offset) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
+ "VUID-VkGeometryAABBNV-offset-02439", "%s", func_name);
+ }
+
+ return skip;
+}
+
+bool CoreChecks::ValidateGeometryNV(const VkGeometryNV &geometry, VkDebugReportObjectTypeEXT object_type, uint64_t object_handle,
+ const char *func_name) const {
+ bool skip = false;
+ if (geometry.geometryType == VK_GEOMETRY_TYPE_TRIANGLES_NV) {
+ skip = ValidateGeometryTrianglesNV(geometry.geometry.triangles, object_type, object_handle, func_name);
+ } else if (geometry.geometryType == VK_GEOMETRY_TYPE_AABBS_NV) {
+ skip = ValidateGeometryAABBNV(geometry.geometry.aabbs, object_type, object_handle, func_name);
+ }
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCreateAccelerationStructureNV(VkDevice device,
+ const VkAccelerationStructureCreateInfoNV *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator,
+ VkAccelerationStructureNV *pAccelerationStructure) {
+ bool skip = false;
+ if (pCreateInfo != nullptr && pCreateInfo->info.type == VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV) {
+ for (uint32_t i = 0; i < pCreateInfo->info.geometryCount; i++) {
+ skip |= ValidateGeometryNV(pCreateInfo->info.pGeometries[i], VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT,
+ HandleToUint64(device), "vkCreateAccelerationStructureNV():");
+ }
+ }
+ return skip;
+}
+
void ValidationStateTracker::PostCallRecordCreateAccelerationStructureNV(VkDevice device,
const VkAccelerationStructureCreateInfoNV *pCreateInfo,
const VkAllocationCallbacks *pAllocator,
@@ -6763,6 +6826,13 @@
skip |= ValidateCmd(cb_state, CMD_BUILDACCELERATIONSTRUCTURENV, "vkCmdBuildAccelerationStructureNV()");
+ if (pInfo != nullptr && pInfo->type == VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV) {
+ for (uint32_t i = 0; i < pInfo->geometryCount; i++) {
+ skip |= ValidateGeometryNV(pInfo->pGeometries[i], VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT,
+ HandleToUint64(device), "vkCmdBuildAccelerationStructureNV():");
+ }
+ }
+
if (pInfo != nullptr && pInfo->geometryCount > phys_dev_ext_props.ray_tracing_props.maxGeometryCount) {
skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
HandleToUint64(commandBuffer), "VUID-vkCmdBuildAccelerationStructureNV-geometryCount-02241",
diff --git a/layers/core_validation.h b/layers/core_validation.h
index 38b131a..eed02db 100644
--- a/layers/core_validation.h
+++ b/layers/core_validation.h
@@ -1638,6 +1638,15 @@
bool PreCallValidateCmdSetViewportShadingRatePaletteNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
uint32_t viewportCount,
const VkShadingRatePaletteNV* pShadingRatePalettes);
+ bool ValidateGeometryTrianglesNV(const VkGeometryTrianglesNV& triangles, VkDebugReportObjectTypeEXT object_type,
+ uint64_t object_handle, const char* func_name) const;
+ bool ValidateGeometryAABBNV(const VkGeometryAABBNV& geometry, VkDebugReportObjectTypeEXT object_type, uint64_t object_handle,
+ const char* func_name) const;
+ bool ValidateGeometryNV(const VkGeometryNV& geometry, VkDebugReportObjectTypeEXT object_type, uint64_t object_handle,
+ const char* func_name) const;
+ bool PreCallValidateCreateAccelerationStructureNV(VkDevice device, const VkAccelerationStructureCreateInfoNV* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkAccelerationStructureNV* pAccelerationStructure);
void PostCallRecordGetAccelerationStructureMemoryRequirementsNV(VkDevice device,
const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo,
VkMemoryRequirements2KHR* pMemoryRequirements);
diff --git a/layers/generated/object_tracker.cpp b/layers/generated/object_tracker.cpp
index a1ae157..24b207e 100644
--- a/layers/generated/object_tracker.cpp
+++ b/layers/generated/object_tracker.cpp
@@ -1119,6 +1119,7 @@
skip |= ValidateObject(device, pipelineCache, kVulkanObjectTypePipelineCache, true, "VUID-vkCreateComputePipelines-pipelineCache-parameter", "VUID-vkCreateComputePipelines-pipelineCache-parent");
if (pCreateInfos) {
for (uint32_t index0 = 0; index0 < createInfoCount; ++index0) {
+ skip |= ValidateObject(device, pCreateInfos[index0].stage.module, kVulkanObjectTypeShaderModule, false, "VUID-VkPipelineShaderStageCreateInfo-module-parameter", kVUIDUndefined);
skip |= ValidateObject(device, pCreateInfos[index0].layout, kVulkanObjectTypePipelineLayout, false, "VUID-VkComputePipelineCreateInfo-layout-parameter", "VUID-VkComputePipelineCreateInfo-commonparent");
skip |= ValidateObject(device, pCreateInfos[index0].basePipelineHandle, kVulkanObjectTypePipeline, true, kVUIDUndefined, "VUID-VkComputePipelineCreateInfo-commonparent");
}
@@ -4496,6 +4497,14 @@
bool skip = false;
skip |= ValidateObject(device, device, kVulkanObjectTypeDevice, false, "VUID-vkCreateAccelerationStructureNV-device-parameter", kVUIDUndefined);
if (pCreateInfo) {
+ if (pCreateInfo->info.pGeometries) {
+ for (uint32_t index2 = 0; index2 < pCreateInfo->info.geometryCount; ++index2) {
+ skip |= ValidateObject(device, pCreateInfo->info.pGeometries[index2].geometry.triangles.vertexData, kVulkanObjectTypeBuffer, true, "VUID-VkGeometryTrianglesNV-vertexData-parameter", "VUID-VkGeometryTrianglesNV-commonparent");
+ skip |= ValidateObject(device, pCreateInfo->info.pGeometries[index2].geometry.triangles.indexData, kVulkanObjectTypeBuffer, true, "VUID-VkGeometryTrianglesNV-indexData-parameter", "VUID-VkGeometryTrianglesNV-commonparent");
+ skip |= ValidateObject(device, pCreateInfo->info.pGeometries[index2].geometry.triangles.transformData, kVulkanObjectTypeBuffer, true, "VUID-VkGeometryTrianglesNV-transformData-parameter", "VUID-VkGeometryTrianglesNV-commonparent");
+ skip |= ValidateObject(device, pCreateInfo->info.pGeometries[index2].geometry.aabbs.aabbData, kVulkanObjectTypeBuffer, true, "VUID-VkGeometryAABBNV-aabbData-parameter", kVUIDUndefined);
+ }
+ }
}
return skip;
@@ -4576,6 +4585,10 @@
if (pInfo) {
if (pInfo->pGeometries) {
for (uint32_t index1 = 0; index1 < pInfo->geometryCount; ++index1) {
+ skip |= ValidateObject(commandBuffer, pInfo->pGeometries[index1].geometry.triangles.vertexData, kVulkanObjectTypeBuffer, true, "VUID-VkGeometryTrianglesNV-vertexData-parameter", "VUID-VkGeometryTrianglesNV-commonparent");
+ skip |= ValidateObject(commandBuffer, pInfo->pGeometries[index1].geometry.triangles.indexData, kVulkanObjectTypeBuffer, true, "VUID-VkGeometryTrianglesNV-indexData-parameter", "VUID-VkGeometryTrianglesNV-commonparent");
+ skip |= ValidateObject(commandBuffer, pInfo->pGeometries[index1].geometry.triangles.transformData, kVulkanObjectTypeBuffer, true, "VUID-VkGeometryTrianglesNV-transformData-parameter", "VUID-VkGeometryTrianglesNV-commonparent");
+ skip |= ValidateObject(commandBuffer, pInfo->pGeometries[index1].geometry.aabbs.aabbData, kVulkanObjectTypeBuffer, true, "VUID-VkGeometryAABBNV-aabbData-parameter", kVUIDUndefined);
}
}
}
diff --git a/layers/parameter_validation_utils.cpp b/layers/parameter_validation_utils.cpp
index ac93008..3c8ac86 100644
--- a/layers/parameter_validation_utils.cpp
+++ b/layers/parameter_validation_utils.cpp
@@ -3019,35 +3019,123 @@
return skip;
}
-bool StatelessValidation::ValidateAccelerationStructureInfoNV(const VkAccelerationStructureInfoNV &info) {
+bool StatelessValidation::ValidateGeometryTrianglesNV(const VkGeometryTrianglesNV &triangles,
+ VkDebugReportObjectTypeEXT object_type, uint64_t object_handle,
+ const char *func_name) const {
+ bool skip = false;
+
+ if (triangles.vertexFormat != VK_FORMAT_R32G32B32_SFLOAT && triangles.vertexFormat != VK_FORMAT_R16G16B16_SFLOAT &&
+ triangles.vertexFormat != VK_FORMAT_R16G16B16_SNORM && triangles.vertexFormat != VK_FORMAT_R32G32_SFLOAT &&
+ triangles.vertexFormat != VK_FORMAT_R16G16_SFLOAT && triangles.vertexFormat != VK_FORMAT_R16G16_SNORM) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
+ "VUID-VkGeometryTrianglesNV-vertexFormat-02430", "%s", func_name);
+ } else {
+ uint32_t vertex_component_size = 0;
+ if (triangles.vertexFormat == VK_FORMAT_R32G32B32_SFLOAT || triangles.vertexFormat == VK_FORMAT_R32G32_SFLOAT) {
+ vertex_component_size = 4;
+ } else if (triangles.vertexFormat == VK_FORMAT_R16G16B16_SFLOAT || triangles.vertexFormat == VK_FORMAT_R16G16B16_SNORM ||
+ triangles.vertexFormat == VK_FORMAT_R16G16_SFLOAT || triangles.vertexFormat == VK_FORMAT_R16G16_SNORM) {
+ vertex_component_size = 2;
+ }
+ if (vertex_component_size > 0 && SafeModulo(triangles.vertexOffset, vertex_component_size) != 0) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
+ "VUID-VkGeometryTrianglesNV-vertexOffset-02429", "%s", func_name);
+ }
+ }
+
+ if (triangles.indexType != VK_INDEX_TYPE_UINT32 && triangles.indexType != VK_INDEX_TYPE_UINT16 &&
+ triangles.indexType != VK_INDEX_TYPE_NONE_NV) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
+ "VUID-VkGeometryTrianglesNV-indexType-02433", "%s", func_name);
+ } else {
+ uint32_t index_element_size = 0;
+ if (triangles.indexType == VK_INDEX_TYPE_UINT32) {
+ index_element_size = 4;
+ } else if (triangles.indexType == VK_INDEX_TYPE_UINT16) {
+ index_element_size = 2;
+ }
+ if (index_element_size > 0 && SafeModulo(triangles.indexOffset, index_element_size) != 0) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
+ "VUID-VkGeometryTrianglesNV-indexOffset-02432", "%s", func_name);
+ }
+ }
+ if (triangles.indexType == VK_INDEX_TYPE_NONE_NV) {
+ if (triangles.indexCount != 0) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
+ "VUID-VkGeometryTrianglesNV-indexCount-02436", "%s", func_name);
+ }
+ if (triangles.indexData != VK_NULL_HANDLE) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
+ "VUID-VkGeometryTrianglesNV-indexData-02434", "%s", func_name);
+ }
+ }
+
+ if (SafeModulo(triangles.transformOffset, 16) != 0) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
+ "VUID-VkGeometryTrianglesNV-transformOffset-02438", "%s", func_name);
+ }
+
+ return skip;
+}
+
+bool StatelessValidation::ValidateGeometryAABBNV(const VkGeometryAABBNV &aabbs, VkDebugReportObjectTypeEXT object_type,
+ uint64_t object_handle, const char *func_name) const {
+ bool skip = false;
+
+ if (SafeModulo(aabbs.offset, 8) != 0) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
+ "VUID-VkGeometryAABBNV-offset-02440", "%s", func_name);
+ }
+ if (SafeModulo(aabbs.stride, 8) != 0) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
+ "VUID-VkGeometryAABBNV-stride-02441", "%s", func_name);
+ }
+
+ return skip;
+}
+
+bool StatelessValidation::ValidateGeometryNV(const VkGeometryNV &geometry, VkDebugReportObjectTypeEXT object_type,
+ uint64_t object_handle, const char *func_name) const {
+ bool skip = false;
+ if (geometry.geometryType == VK_GEOMETRY_TYPE_TRIANGLES_NV) {
+ skip = ValidateGeometryTrianglesNV(geometry.geometry.triangles, object_type, object_handle, func_name);
+ } else if (geometry.geometryType == VK_GEOMETRY_TYPE_AABBS_NV) {
+ skip = ValidateGeometryAABBNV(geometry.geometry.aabbs, object_type, object_handle, func_name);
+ }
+ return skip;
+}
+
+bool StatelessValidation::ValidateAccelerationStructureInfoNV(const VkAccelerationStructureInfoNV &info,
+ VkDebugReportObjectTypeEXT object_type, uint64_t object_handle,
+ const char *func_name) const {
bool skip = false;
if (info.type == VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV && info.geometryCount != 0) {
- skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT, 0,
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
"VUID-VkAccelerationStructureInfoNV-type-02425",
"VkAccelerationStructureInfoNV: If type is VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV then "
"geometryCount must be 0.");
}
if (info.type == VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV && info.instanceCount != 0) {
- skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT, 0,
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
"VUID-VkAccelerationStructureInfoNV-type-02426",
"VkAccelerationStructureInfoNV: If type is VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV then "
"instanceCount must be 0.");
}
if (info.flags & VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV &&
info.flags & VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_NV) {
- skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT, 0,
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
"VUID-VkAccelerationStructureInfoNV-flags-02592",
"VkAccelerationStructureInfoNV: If flags has the VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV"
"bit set, then it must not have the VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_NV bit set.");
}
if (info.geometryCount > phys_dev_ext_props.ray_tracing_props.maxGeometryCount) {
- skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT, 0,
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
"VUID-VkAccelerationStructureInfoNV-geometryCount-02422",
"VkAccelerationStructureInfoNV: geometryCount must be less than or equal to "
"VkPhysicalDeviceRayTracingPropertiesNV::maxGeometryCount.");
}
if (info.instanceCount > phys_dev_ext_props.ray_tracing_props.maxInstanceCount) {
- skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT, 0,
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
"VUID-VkAccelerationStructureInfoNV-instanceCount-02423",
"VkAccelerationStructureInfoNV: instanceCount must be less than or equal to "
"VkPhysicalDeviceRayTracingPropertiesNV::maxInstanceCount.");
@@ -3056,14 +3144,17 @@
uint64_t total_triangle_count = 0;
for (uint32_t i = 0; i < info.geometryCount; i++) {
const VkGeometryNV &geometry = info.pGeometries[i];
+
+ skip |= ValidateGeometryNV(geometry, object_type, object_handle, func_name);
+
if (geometry.geometryType != VK_GEOMETRY_TYPE_TRIANGLES_NV) {
continue;
}
total_triangle_count += geometry.geometry.triangles.indexCount / 3;
}
if (total_triangle_count > phys_dev_ext_props.ray_tracing_props.maxTriangleCount) {
- skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT,
- 0, "VUID-VkAccelerationStructureInfoNV-maxTriangleCount-02424",
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, object_type, object_handle,
+ "VUID-VkAccelerationStructureInfoNV-maxTriangleCount-02424",
"VkAccelerationStructureInfoNV: The total number of triangles in all geometries must be less than "
"or equal to VkPhysicalDeviceRayTracingPropertiesNV::maxTriangleCount.");
}
@@ -3101,7 +3192,8 @@
pCreateInfo->compactedSize, pCreateInfo->info.geometryCount, pCreateInfo->info.instanceCount);
}
- skip |= ValidateAccelerationStructureInfoNV(pCreateInfo->info);
+ skip |= ValidateAccelerationStructureInfoNV(pCreateInfo->info, VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT, 0,
+ "vkCreateAccelerationStructureNV()");
}
return skip;
@@ -3113,7 +3205,8 @@
bool skip = false;
if (pInfo != nullptr) {
- skip |= ValidateAccelerationStructureInfoNV(*pInfo);
+ skip |= ValidateAccelerationStructureInfoNV(*pInfo, VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT,
+ HandleToUint64(dst), "vkCmdBuildAccelerationStructureNV()");
}
return skip;
diff --git a/layers/stateless_validation.h b/layers/stateless_validation.h
index 72a932b..023e7e1 100644
--- a/layers/stateless_validation.h
+++ b/layers/stateless_validation.h
@@ -953,7 +953,14 @@
bool ValidateDeviceQueueFamily(uint32_t queue_family, const char *cmd_name, const char *parameter_name,
const std::string &error_code, bool optional);
- bool ValidateAccelerationStructureInfoNV(const VkAccelerationStructureInfoNV &info);
+ bool ValidateGeometryTrianglesNV(const VkGeometryTrianglesNV &triangles, VkDebugReportObjectTypeEXT object_type,
+ uint64_t object_handle, const char *func_name) const;
+ bool ValidateGeometryAABBNV(const VkGeometryAABBNV &geometry, VkDebugReportObjectTypeEXT object_type, uint64_t object_handle,
+ const char *func_name) const;
+ bool ValidateGeometryNV(const VkGeometryNV &geometry, VkDebugReportObjectTypeEXT object_type, uint64_t object_handle,
+ const char *func_name) const;
+ bool ValidateAccelerationStructureInfoNV(const VkAccelerationStructureInfoNV &info, VkDebugReportObjectTypeEXT object_type,
+ uint64_t object_handle, const char *func_nam) const;
bool OutputExtensionError(const std::string &api_name, const std::string &extension_name);
diff --git a/scripts/object_tracker_generator.py b/scripts/object_tracker_generator.py
index d8d47ad..8295526 100644
--- a/scripts/object_tracker_generator.py
+++ b/scripts/object_tracker_generator.py
@@ -792,7 +792,7 @@
pre_code += '%s}\n' % indent
indent = self.decIndent(indent)
pre_code += '%s}\n' % indent
- # Single Struct
+ # Single Struct Pointer
elif ispointer:
# Update struct prefix
new_prefix = '%s%s->' % (prefix, member.name)
@@ -804,6 +804,13 @@
pre_code += tmp_pre
indent = self.decIndent(indent)
pre_code += '%s}\n' % indent
+ # Single Nested Struct
+ else:
+ # Update struct prefix
+ new_prefix = '%s%s.' % (prefix, member.name)
+ # Process sub-structs
+ tmp_pre = self.validate_objects(struct_info, indent, new_prefix, array_index, disp_name, member.type, False)
+ pre_code += tmp_pre
return pre_code
#
# For a particular API, generate the object handling code
@@ -838,7 +845,6 @@
#
# Capture command parameter info needed to create, destroy, and validate objects
def genCmd(self, cmdinfo, cmdname, alias):
-
# Add struct-member type information to command parameter information
OutputGenerator.genCmd(self, cmdinfo, cmdname, alias)
members = cmdinfo.elem.findall('.//param')
@@ -858,7 +864,6 @@
# Generate member info
membersInfo = []
- constains_extension_structs = False
allocator = 'nullptr'
for member in members:
# Get type and name of member