aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--layers/object_track.h46
-rwxr-xr-xvk-layer-generate.py49
2 files changed, 57 insertions, 38 deletions
diff --git a/layers/object_track.h b/layers/object_track.h
index f6455576..09c2f96c 100644
--- a/layers/object_track.h
+++ b/layers/object_track.h
@@ -397,14 +397,14 @@ initObjectTracker(
static void create_obj(VkInstance dispatchable_object, VkInstance object, VkDbgObjectType objType);
static void create_obj(VkDevice dispatchable_object, VkDevice object, VkDbgObjectType objType);
static void create_obj(VkDevice dispatchable_object, VkDescriptorSet object, VkDbgObjectType objType);
-static void validate_object(VkInstance dispatchable_object, VkInstance object);
-static void validate_object(VkDevice dispatchable_object, VkDevice object);
-static void validate_object(VkDevice dispatchable_object, VkDescriptorPool object);
+static VkBool32 validate_object(VkInstance dispatchable_object, VkInstance object);
+static VkBool32 validate_object(VkDevice dispatchable_object, VkDevice object);
+static VkBool32 validate_object(VkDevice dispatchable_object, VkDescriptorPool object);
static void destroy_obj(VkInstance dispatchable_object, VkInstance object);
static void destroy_obj(VkDevice dispatchable_object, VkDeviceMemory object);
static void destroy_obj(VkDevice dispatchable_object, VkDescriptorSet object);
-static void set_status(VkDevice dispatchable_object, VkDeviceMemory object, VkDbgObjectType objType, ObjectStatusFlags status_flag);
-static void reset_status(VkDevice dispatchable_object, VkDeviceMemory object, VkDbgObjectType objType, ObjectStatusFlags status_flag);
+static VkBool32 set_status(VkDevice dispatchable_object, VkDeviceMemory object, VkDbgObjectType objType, ObjectStatusFlags status_flag);
+static VkBool32 reset_status(VkDevice dispatchable_object, VkDeviceMemory object, VkDbgObjectType objType, ObjectStatusFlags status_flag);
#if 0
static VkBool32 validate_status(VkDevice dispatchable_object, VkFence object, VkDbgObjectType objType,
ObjectStatusFlags status_mask, ObjectStatusFlags status_flag, VkFlags msg_flags, OBJECT_TRACK_ERROR error_code,
@@ -416,45 +416,49 @@ extern unordered_map<const void*, OBJTRACK_NODE*> VkSemaphoreMap;
extern unordered_map<const void*, OBJTRACK_NODE*> VkCmdBufferMap;
extern unordered_map<const void*, OBJTRACK_NODE*> VkSwapchainKHRMap;
-static void validate_object(VkQueue dispatchable_object, VkBuffer object)
+static VkBool32 validate_object(VkQueue dispatchable_object, VkBuffer object)
{
if (VkBufferMap.find((void*)object.handle) != VkBufferMap.end()) {
- log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
+ return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
"Invalid VkBuffer Object %p", object.handle);
}
+ return VK_FALSE;
}
-static void set_status(VkQueue dispatchable_object, VkFence object, VkDbgObjectType objType, ObjectStatusFlags status_flag)
+static VkBool32 set_status(VkQueue dispatchable_object, VkFence object, VkDbgObjectType objType, ObjectStatusFlags status_flag)
{
+ VkBool32 skipCall = VK_FALSE;
if (object != VK_NULL_HANDLE) {
if (VkFenceMap.find((void*)object.handle) != VkFenceMap.end()) {
OBJTRACK_NODE* pNode = VkFenceMap[(void*)object.handle];
pNode->status |= status_flag;
- return;
}
else {
// If we do not find it print an error
- log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_NONE, "OBJTRACK",
+ skipCall |= log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_NONE, "OBJTRACK",
"Unable to set status for non-existent object 0x%" PRIxLEAST64 " of %s type",
object.handle, string_VkDbgObjectType(objType));
}
}
+ return skipCall;
}
-static void validate_object(VkQueue dispatchable_object, VkSemaphore object)
+static VkBool32 validate_object(VkQueue dispatchable_object, VkSemaphore object)
{
if (VkSemaphoreMap.find((void*)object.handle) == VkSemaphoreMap.end()) {
- log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
+ return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
"Invalid VkSemaphore Object %p", object.handle);
}
+ return VK_FALSE;
}
-static void validate_object(VkDevice dispatchable_object, VkCmdBuffer object)
+static VkBool32 validate_object(VkDevice dispatchable_object, VkCmdBuffer object)
{
if (VkCmdBufferMap.find(object) == VkCmdBufferMap.end()) {
- log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
+ return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",
"Invalid VkCmdBuffer Object %p",reinterpret_cast<uint64_t>(object));
}
+ return VK_FALSE;
}
static void create_obj(VkDevice dispatchable_object, VkCmdBuffer vkObj, VkDbgObjectType objType)
@@ -619,10 +623,13 @@ explicit_MapMemory(
VkFlags flags,
void **ppData)
{
+ VkBool32 skipCall = VK_FALSE;
loader_platform_thread_lock_mutex(&objLock);
- set_status(device, mem, VK_OBJECT_TYPE_DEVICE_MEMORY, OBJSTATUS_GPU_MEM_MAPPED);
- validate_object(device, device);
+ skipCall |= set_status(device, mem, VK_OBJECT_TYPE_DEVICE_MEMORY, OBJSTATUS_GPU_MEM_MAPPED);
+ skipCall |= validate_object(device, device);
loader_platform_thread_unlock_mutex(&objLock);
+ if (skipCall == VK_TRUE)
+ return VK_ERROR_VALIDATION_FAILED;
VkResult result = get_dispatch_table(ObjectTracker_device_table_map, device)->MapMemory(device, mem, offset, size, flags, ppData);
@@ -634,10 +641,13 @@ explicit_UnmapMemory(
VkDevice device,
VkDeviceMemory mem)
{
+ VkBool32 skipCall = VK_FALSE;
loader_platform_thread_lock_mutex(&objLock);
- reset_status(device, mem, VK_OBJECT_TYPE_DEVICE_MEMORY, OBJSTATUS_GPU_MEM_MAPPED);
- validate_object(device, device);
+ skipCall |= reset_status(device, mem, VK_OBJECT_TYPE_DEVICE_MEMORY, OBJSTATUS_GPU_MEM_MAPPED);
+ skipCall |= validate_object(device, device);
loader_platform_thread_unlock_mutex(&objLock);
+ if (skipCall == VK_TRUE)
+ return;
get_dispatch_table(ObjectTracker_device_table_map, device)->UnmapMemory(device, mem);
}
diff --git a/vk-layer-generate.py b/vk-layer-generate.py
index 6ac01637..a02e29d3 100755
--- a/vk-layer-generate.py
+++ b/vk-layer-generate.py
@@ -1167,19 +1167,20 @@ class ObjectTrackerSubcommand(Subcommand):
procs_txt.append('')
procs_txt.append('%s' % self.lineinfo.get())
if o in vulkan.object_dispatch_list:
- procs_txt.append('static void validate_object(%s dispatchable_object, %s object)' % (o, o))
+ procs_txt.append('static VkBool32 validate_object(%s dispatchable_object, %s object)' % (o, o))
else:
- procs_txt.append('static void validate_object(VkDevice dispatchable_object, %s object)' % (o))
+ procs_txt.append('static VkBool32 validate_object(VkDevice dispatchable_object, %s object)' % (o))
procs_txt.append('{')
if o in vulkan.object_dispatch_list:
procs_txt.append(' if (%sMap.find(object) == %sMap.end()) {' % (o, o))
- procs_txt.append(' log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",')
+ procs_txt.append(' return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",')
procs_txt.append(' "Invalid %s Object %%p",reinterpret_cast<uint64_t>(object));' % o)
else:
procs_txt.append(' if (%sMap.find((void*)object.handle) == %sMap.end()) {' % (o, o))
- procs_txt.append(' log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",')
+ procs_txt.append(' return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",')
procs_txt.append(' "Invalid %s Object %%p", object.handle);' % o)
procs_txt.append(' }')
+ procs_txt.append(' return VK_FALSE;')
procs_txt.append('}')
procs_txt.append('')
procs_txt.append('')
@@ -1228,32 +1229,32 @@ class ObjectTrackerSubcommand(Subcommand):
procs_txt.append('')
procs_txt.append('%s' % self.lineinfo.get())
if o in vulkan.object_dispatch_list:
- procs_txt.append('static void set_status(%s dispatchable_object, %s object, VkDbgObjectType objType, ObjectStatusFlags status_flag)' % (o, o))
+ procs_txt.append('static VkBool32 set_status(%s dispatchable_object, %s object, VkDbgObjectType objType, ObjectStatusFlags status_flag)' % (o, o))
procs_txt.append('{')
procs_txt.append(' if (object != VK_NULL_HANDLE) {')
procs_txt.append(' if (%sMap.find(object) != %sMap.end()) {' % (o, o))
procs_txt.append(' OBJTRACK_NODE* pNode = %sMap[object];' % (o))
else:
- procs_txt.append('static void set_status(VkDevice dispatchable_object, %s object, VkDbgObjectType objType, ObjectStatusFlags status_flag)' % (o))
+ procs_txt.append('static VkBool32 set_status(VkDevice dispatchable_object, %s object, VkDbgObjectType objType, ObjectStatusFlags status_flag)' % (o))
procs_txt.append('{')
procs_txt.append(' if (object != VK_NULL_HANDLE) {')
procs_txt.append(' if (%sMap.find((void*)object.handle) != %sMap.end()) {' % (o, o))
procs_txt.append(' OBJTRACK_NODE* pNode = %sMap[(void*)object.handle];' % (o))
procs_txt.append(' pNode->status |= status_flag;')
- procs_txt.append(' return;')
procs_txt.append(' }')
procs_txt.append(' else {')
procs_txt.append(' // If we do not find it print an error')
if o in vulkan.object_dispatch_list:
- procs_txt.append(' log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_NONE, "OBJTRACK",')
+ procs_txt.append(' return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_NONE, "OBJTRACK",')
procs_txt.append(' "Unable to set status for non-existent object 0x%" PRIxLEAST64 " of %s type",')
procs_txt.append(' reinterpret_cast<uint64_t>(object), string_VkDbgObjectType(objType));')
else:
- procs_txt.append(' log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_NONE, "OBJTRACK",')
+ procs_txt.append(' return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_NONE, "OBJTRACK",')
procs_txt.append(' "Unable to set status for non-existent object 0x%" PRIxLEAST64 " of %s type",')
procs_txt.append(' object.handle, string_VkDbgObjectType(objType));')
procs_txt.append(' }')
procs_txt.append(' }')
+ procs_txt.append(' return VK_FALSE;')
procs_txt.append('}')
procs_txt.append('')
procs_txt.append('%s' % self.lineinfo.get())
@@ -1304,29 +1305,29 @@ class ObjectTrackerSubcommand(Subcommand):
procs_txt.append('')
procs_txt.append('%s' % self.lineinfo.get())
if o in vulkan.object_dispatch_list:
- procs_txt.append('static void reset_status(%s dispatchable_object, %s object, VkDbgObjectType objType, ObjectStatusFlags status_flag)' % (o, o))
+ procs_txt.append('static VkBool32 reset_status(%s dispatchable_object, %s object, VkDbgObjectType objType, ObjectStatusFlags status_flag)' % (o, o))
procs_txt.append('{')
procs_txt.append(' if (%sMap.find(object) != %sMap.end()) {' % (o, o))
procs_txt.append(' OBJTRACK_NODE* pNode = %sMap[object];' % (o))
else:
- procs_txt.append('static void reset_status(VkDevice dispatchable_object, %s object, VkDbgObjectType objType, ObjectStatusFlags status_flag)' % (o))
+ procs_txt.append('static VkBool32 reset_status(VkDevice dispatchable_object, %s object, VkDbgObjectType objType, ObjectStatusFlags status_flag)' % (o))
procs_txt.append('{')
procs_txt.append(' if (%sMap.find((void*)object.handle) != %sMap.end()) {' % (o, o))
procs_txt.append(' OBJTRACK_NODE* pNode = %sMap[(void*)object.handle];' % (o))
procs_txt.append(' pNode->status &= ~status_flag;')
- procs_txt.append(' return;')
procs_txt.append(' }')
procs_txt.append(' else {')
procs_txt.append(' // If we do not find it print an error')
if o in vulkan.object_dispatch_list:
- procs_txt.append(' log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, objType, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK",')
+ procs_txt.append(' return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, objType, reinterpret_cast<uint64_t>(object), 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK",')
procs_txt.append(' "Unable to reset status for non-existent object 0x%" PRIxLEAST64 " of %s type",')
procs_txt.append(' reinterpret_cast<uint64_t>(object), string_VkDbgObjectType(objType));')
else:
- procs_txt.append(' log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, objType, object.handle, 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK",')
+ procs_txt.append(' return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, objType, object.handle, 0, OBJTRACK_UNKNOWN_OBJECT, "OBJTRACK",')
procs_txt.append(' "Unable to reset status for non-existent object 0x%" PRIxLEAST64 " of %s type",')
procs_txt.append(' object.handle, string_VkDbgObjectType(objType));')
procs_txt.append(' }')
+ procs_txt.append(' return VK_FALSE;')
procs_txt.append('}')
procs_txt.append('')
return "\n".join(procs_txt)
@@ -1414,12 +1415,13 @@ class ObjectTrackerSubcommand(Subcommand):
cbv_txt.append('%s' % self.lineinfo.get())
for o in ['VkPipeline', 'VkDynamicViewportState', 'VkDynamicLineWidthState', 'VkDynamicDepthBiasState', 'VkDynamicBlendState', 'VkDynamicDepthBoundsState', 'VkDynamicStencilState',
'VkPipelineLayout', 'VkBuffer', 'VkEvent', 'VkQueryPool', 'VkRenderPass', 'VkFramebuffer']:
- cbv_txt.append('static void validate_object(VkCmdBuffer dispatchable_object, %s object)' % (o))
+ cbv_txt.append('static VkBool32 validate_object(VkCmdBuffer dispatchable_object, %s object)' % (o))
cbv_txt.append('{')
cbv_txt.append(' if (%sMap.find((void*)object.handle) == %sMap.end()) {' % (o, o))
- cbv_txt.append(' log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",')
+ cbv_txt.append(' return log_msg(mdd(dispatchable_object), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType) 0, object.handle, 0, OBJTRACK_INVALID_OBJECT, "OBJTRACK",')
cbv_txt.append(' "Invalid %s Object %%p", object.handle);' % (o))
cbv_txt.append(' }')
+ cbv_txt.append(' return VK_FALSE;')
cbv_txt.append('}')
cbv_txt.append('')
return "\n".join(cbv_txt)
@@ -1528,6 +1530,7 @@ class ObjectTrackerSubcommand(Subcommand):
# destroy_line += ' }\n'
destroy_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
if len(loop_params) > 0:
+ using_line += ' VkBool32 skipCall = VK_FALSE;\n'
if not mutex_unlock:
using_line += ' loader_platform_thread_lock_mutex(&objLock);\n'
mutex_unlock = True
@@ -1536,22 +1539,28 @@ class ObjectTrackerSubcommand(Subcommand):
for opn in loop_params[lc]:
if '->' in opn:
using_line += ' if (%s)\n' % (opn.split('-')[0])
- using_line += ' validate_object(%s, %s);\n' % (param0_name, opn)
+ using_line += ' skipCall |= validate_object(%s, %s);\n' % (param0_name, opn)
else:
- using_line += ' validate_object(%s, %s);\n' % (param0_name, opn)
+ using_line += ' skipCall |= validate_object(%s, %s);\n' % (param0_name, opn)
else:
base_param = loop_params[lc][0].split('-')[0].split('[')[0]
using_line += ' if (%s) {\n' % base_param
using_line += ' for (uint32_t i=0; i<%s; i++) {\n' % lc
for opn in loop_params[lc]:
if '[' in opn: # API func param is array
- using_line += ' validate_object(%s, %s);\n' % (param0_name, opn)
+ using_line += ' skipCall |= validate_object(%s, %s);\n' % (param0_name, opn)
else: # struct element is array
- using_line += ' validate_object(%s, %s[i]);\n' % (param0_name, opn)
+ using_line += ' skipCall |= validate_object(%s, %s[i]);\n' % (param0_name, opn)
using_line += ' }\n'
using_line += ' }\n'
if mutex_unlock:
using_line += ' loader_platform_thread_unlock_mutex(&objLock);\n'
+ if len(loop_params) > 0:
+ using_line += ' if (skipCall)\n'
+ if proto.ret != "void":
+ using_line += ' return VK_ERROR_VALIDATION_FAILED;\n'
+ else:
+ using_line += ' return;\n'
ret_val = ''
stmt = ''
if proto.ret != "void":