aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Stroyan <mike@LunarG.com>2015-05-05 16:33:08 -0600
committerMike Stroyan <mike@LunarG.com>2015-05-06 17:20:55 -0600
commitcdaa4fd95aa802abed46837ff3b297fba1844ea0 (patch)
tree314f44b853e8b57806488642314e96ed4a7dea4a
parent358a2b56554af7d24eb1356db019f7c29de20309 (diff)
downloadusermoji-cdaa4fd95aa802abed46837ff3b297fba1844ea0.tar.xz
layers: update object tracker memory ref validation
Allocate enough space for queueInfo. Record queueNodeIndex to allow setGpuQueueInfoState between addQueueInfo and validateQueueFlags. Report case when queue flags remain unknown to application and layer. Move expanded common code into validateQueueFlags. Initialize g_pQueueInfo to NULL. Handle case when it is NULL. Handle when malloc or realloc fails.
-rwxr-xr-xvk-layer-generate.py47
1 files changed, 24 insertions, 23 deletions
diff --git a/vk-layer-generate.py b/vk-layer-generate.py
index 5fa03d18..cdd9be54 100755
--- a/vk-layer-generate.py
+++ b/vk-layer-generate.py
@@ -904,13 +904,13 @@ class ObjectTrackerSubcommand(Subcommand):
header_txt.append('typedef struct _OT_QUEUE_INFO {')
header_txt.append(' OT_MEM_INFO *pMemRefList;')
header_txt.append(' struct _OT_QUEUE_INFO *pNextQI;')
- header_txt.append(' VkPhysicalDeviceQueueProperties *pQueueProps;')
+ header_txt.append(' uint32_t queueNodeIndex;')
header_txt.append(' VkQueue queue;')
header_txt.append(' uint32_t refCount;')
header_txt.append('} OT_QUEUE_INFO;')
header_txt.append('')
header_txt.append('// Global list of QueueInfo structures, one per queue')
- header_txt.append('static OT_QUEUE_INFO *g_pQueueInfo;')
+ header_txt.append('static OT_QUEUE_INFO *g_pQueueInfo = NULL;')
header_txt.append('')
header_txt.append('// Convert an object type enum to an object type array index')
header_txt.append('static uint32_t objTypeToIndex(uint32_t objType)')
@@ -948,11 +948,11 @@ class ObjectTrackerSubcommand(Subcommand):
header_txt.append('static void addQueueInfo(uint32_t queueNodeIndex, VkQueue queue)')
header_txt.append('{')
header_txt.append(' OT_QUEUE_INFO *pQueueInfo = malloc(sizeof(OT_QUEUE_INFO));')
- header_txt.append(' memset(pQueueInfo, 0, sizeof(OT_QUEUE_INFO));')
- header_txt.append(' pQueueInfo->queue = queue;')
- header_txt.append(' pQueueInfo->pQueueProps = &queueInfo[queueNodeIndex];')
header_txt.append('')
header_txt.append(' if (pQueueInfo != NULL) {')
+ header_txt.append(' memset(pQueueInfo, 0, sizeof(OT_QUEUE_INFO));')
+ header_txt.append(' pQueueInfo->queue = queue;')
+ header_txt.append(' pQueueInfo->queueNodeIndex = queueNodeIndex;')
header_txt.append(' pQueueInfo->pNextQI = g_pQueueInfo;')
header_txt.append(' g_pQueueInfo = pQueueInfo;')
header_txt.append(' }')
@@ -1158,23 +1158,28 @@ class ObjectTrackerSubcommand(Subcommand):
header_txt.append('')
header_txt.append('static void setGpuQueueInfoState(size_t* pDataSize, void *pData) {')
header_txt.append(' queueCount = ((uint32_t)*pDataSize / sizeof(VkPhysicalDeviceQueueProperties));')
- header_txt.append(' queueInfo = (VkPhysicalDeviceQueueProperties*)malloc(sizeof(pDataSize));')
- header_txt.append(' memcpy(queueInfo, pData, *pDataSize);')
+ header_txt.append(' queueInfo = (VkPhysicalDeviceQueueProperties*)realloc((void*)queueInfo, *pDataSize);')
+ header_txt.append(' if (queueInfo != NULL) {')
+ header_txt.append(' memcpy(queueInfo, pData, *pDataSize);')
+ header_txt.append(' }')
header_txt.append('}')
header_txt.append('')
header_txt.append('// Check object status for selected flag state')
- header_txt.append('static bool32_t validateQueueFlags(VkQueue queue) {')
- header_txt.append(' bool32_t result = VK_TRUE;')
+ header_txt.append('static void validateQueueFlags(VkQueue queue, const char *function) {')
header_txt.append(' OT_QUEUE_INFO *pQueueInfo = g_pQueueInfo;')
- header_txt.append(' while (pQueueInfo->queue != queue) {')
+ header_txt.append(' while ((pQueueInfo != NULL) && (pQueueInfo->queue != queue)) {')
header_txt.append(' pQueueInfo = pQueueInfo->pNextQI;')
header_txt.append(' }')
header_txt.append(' if (pQueueInfo != NULL) {')
- header_txt.append(' if ((pQueueInfo->pQueueProps->queueFlags & VK_QUEUE_MEMMGR_BIT) == 0) {')
- header_txt.append(' result = VK_FALSE;')
+ header_txt.append(' char str[1024];\n')
+ header_txt.append(' if ((queueInfo != NULL) && (queueInfo[pQueueInfo->queueNodeIndex].queueFlags & VK_QUEUE_MEMMGR_BIT) == 0) {')
+ header_txt.append(' sprintf(str, "Attempting %s on a non-memory-management capable queue -- VK_QUEUE_MEMMGR_BIT not set", function);')
+ header_txt.append(' layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, queue, 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK", str);')
+ header_txt.append(' } else {')
+ header_txt.append(' sprintf(str, "Attempting %s on a possibly non-memory-management capable queue -- VK_QUEUE_MEMMGR_BIT not known", function);')
+ header_txt.append(' layerCbMsg(VK_DBG_MSG_ERROR, VK_VALIDATION_LEVEL_0, queue, 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK", str);')
header_txt.append(' }')
header_txt.append(' }')
- header_txt.append(' return result;')
header_txt.append('}')
header_txt.append('')
header_txt.append('// Check object status for selected flag state')
@@ -1241,22 +1246,18 @@ 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:
+ using_line += ' loader_platform_thread_lock_mutex(&objLock);\n'
+ using_line += ' validateObjectType("vk%s", objType, object);\n' % (proto.name)
+ using_line += ' validateQueueFlags(queue, "%s");\n' % (proto.name)
+ using_line += ' loader_platform_thread_unlock_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 += ' validateQueueFlags(queue, "%s");\n' % (proto.name)
using_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
elif 'GetObjectInfo' in proto.name:
using_line += ' validateObjectType("vk%s", objType, object);\n' % (proto.name)