aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2015-05-05 18:24:45 -0500
committerMark Lobodzinski <mark@lunarg.com>2015-05-05 18:24:45 -0500
commit358a2b56554af7d24eb1356db019f7c29de20309 (patch)
treec1f5b78817faea3eb98b9f9a2e35b7d1b1b2279e
parentca4025114f64009c9acef75403c473f85582a3ee (diff)
downloadusermoji-358a2b56554af7d24eb1356db019f7c29de20309.tar.xz
layers: Add object type validation to object tracker
Validate that objects match the objectType any time both are specified.
-rw-r--r--layers/object_track.h1
-rwxr-xr-xvk-layer-generate.py37
2 files changed, 36 insertions, 2 deletions
diff --git a/layers/object_track.h b/layers/object_track.h
index 7697d60a..9c45e2a7 100644
--- a/layers/object_track.h
+++ b/layers/object_track.h
@@ -31,6 +31,7 @@ typedef enum _OBJECT_TRACK_ERROR
OBJTRACK_INTERNAL_ERROR, // Bug with data tracking within the layer
OBJTRACK_DESTROY_OBJECT_FAILED, // Couldn't find object to be destroyed
OBJTRACK_MISSING_OBJECT, // Attempted look-up on object that isn't in global object list
+ OBJTRACK_OBJECT_TYPE_MISMATCH, // Object did not match corresponding Object Type
OBJTRACK_OBJECT_LEAK, // OBJECT was not correctly freed/destroyed
OBJTRACK_OBJCOUNT_MAX_EXCEEDED, // Request for Object data in excess of max obj count
OBJTRACK_INVALID_FENCE, // Requested status of unsubmitted fence object
diff --git a/vk-layer-generate.py b/vk-layer-generate.py
index 09593a17..5fa03d18 100755
--- a/vk-layer-generate.py
+++ b/vk-layer-generate.py
@@ -923,6 +923,27 @@ class ObjectTrackerSubcommand(Subcommand):
header_txt.append(' return index;')
header_txt.append('}')
header_txt.append('')
+ header_txt.append('// Validate that object parameter matches designated object type')
+ header_txt.append('static void validateObjectType(')
+ header_txt.append(' const char *apiName,')
+ header_txt.append(' VkObjectType objType,')
+ header_txt.append(' VkObject object)')
+ header_txt.append('{')
+ header_txt.append(' objNode *pObjNode = pGlobalHead;')
+ header_txt.append(' while ((pObjNode != NULL) && (pObjNode->obj.vkObj != object)) {')
+ header_txt.append(' pObjNode = pObjNode->pNextGlobal;')
+ header_txt.append(' }')
+ header_txt.append(' if (pObjNode != NULL) {')
+ header_txt.append(' // Found our object, check type')
+ header_txt.append(' if (strcmp(string_VkObjectType(pObjNode->obj.objType), string_VkObjectType(objType)) != 0) {')
+ header_txt.append(' char str[1024];')
+ header_txt.append(' sprintf(str, "ERROR: Object Parameter Type %s does not match designated type %s",')
+ header_txt.append(' string_VkObjectType(pObjNode->obj.objType), string_VkObjectType(objType));')
+ header_txt.append(' layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, object, 0, OBJTRACK_OBJECT_TYPE_MISMATCH, "OBJTRACK", str);')
+ header_txt.append(' }')
+ header_txt.append(' }')
+ header_txt.append('}')
+ header_txt.append('')
header_txt.append('// Add new queue to head of global queue list')
header_txt.append('static void addQueueInfo(uint32_t queueNodeIndex, VkQueue queue)')
header_txt.append('{')
@@ -1220,14 +1241,25 @@ class ObjectTrackerSubcommand(Subcommand):
using_line += ' // validate_memory_mapping_status(pMemRefs, memRefCount);\n'
using_line += ' // validate_mem_ref_count(memRefCount);\n'
using_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
- elif 'QueueBindObjectMemoryRange' in proto.name or 'QueueBindImageMemoryRange' in proto.name:
- using_line = ' loader_platform_thread_lock_mutex(&objLock);\n'
+ elif 'QueueBindObject' in proto.name:
+ using_line += ' loader_platform_thread_lock_mutex(&objLock);\n'
+ using_line += ' validateObjectType("vk%s", objType, object);\n' % (proto.name)
+ using_line += ' if (validateQueueFlags(queue) == VK_FALSE) {\n'
+ using_line += ' char str[1024];\n'
+ using_line += ' sprintf(str, "Attempting %s on a non-memory-management capable queue -- VK_QUEUE_MEMMGR_BIT not set");\n' % (proto.name)
+ using_line += ' layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, queue, 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK", str);\n'
+ using_line += ' }\n'
+ using_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
+ elif 'QueueBindImage' in proto.name:
+ using_line += ' loader_platform_thread_lock_mutex(&objLock);\n'
using_line += ' if (validateQueueFlags(queue) == VK_FALSE) {\n'
using_line += ' char str[1024];\n'
using_line += ' sprintf(str, "Attempting %s on a non-memory-management capable queue -- VK_QUEUE_MEMMGR_BIT not set");\n' % (proto.name)
using_line += ' layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, queue, 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK", str);\n'
using_line += ' }\n'
using_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
+ elif 'GetObjectInfo' in proto.name:
+ using_line += ' validateObjectType("vk%s", objType, object);\n' % (proto.name)
elif 'GetFenceStatus' in proto.name:
using_line += ' // Warn if submitted_flag is not set\n'
using_line += ' validate_status(fence, VK_OBJECT_TYPE_FENCE, OBJSTATUS_FENCE_IS_SUBMITTED, OBJSTATUS_FENCE_IS_SUBMITTED, VK_DBG_MSG_ERROR, OBJTRACK_INVALID_FENCE, "Status Requested for Unsubmitted Fence");\n'
@@ -1266,6 +1298,7 @@ class ObjectTrackerSubcommand(Subcommand):
using_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
if 'DestroyObject' in proto.name:
destroy_line = ' loader_platform_thread_lock_mutex(&objLock);\n'
+ destroy_line += ' validateObjectType("vk%s", objType, object);\n' % (proto.name)
destroy_line += ' ll_destroy_obj(%s);\n' % (proto.params[2].name)
destroy_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
using_line = ''