vkd3d: Fix broken debug_vk_memory_{property,heap}_flags.

C is fun, yo. Returned data from dead stack variable, also triggered
overflow in some cases.

Uncalled in release mode, but can crash debug builds.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2021-03-25 17:33:05 +01:00
parent fe28436c34
commit 2f60a3bf66
3 changed files with 12 additions and 15 deletions

View File

@ -1139,6 +1139,7 @@ static void vkd3d_trace_physical_device(VkPhysicalDevice device,
const struct vkd3d_physical_device_info *info, const struct vkd3d_physical_device_info *info,
const struct vkd3d_vk_instance_procs *vk_procs) const struct vkd3d_vk_instance_procs *vk_procs)
{ {
VKD3D_UNUSED char debug_buffer[VKD3D_DEBUG_FLAGS_BUFFER_SIZE];
VkPhysicalDeviceMemoryProperties memory_properties; VkPhysicalDeviceMemoryProperties memory_properties;
VkQueueFamilyProperties *queue_properties; VkQueueFamilyProperties *queue_properties;
unsigned int i, j; unsigned int i, j;
@ -1156,7 +1157,7 @@ static void vkd3d_trace_physical_device(VkPhysicalDevice device,
for (i = 0; i < count; ++i) for (i = 0; i < count; ++i)
{ {
TRACE(" Queue family [%u]: flags %s, count %u, timestamp bits %u, image transfer granularity %s.\n", TRACE(" Queue family [%u]: flags %s, count %u, timestamp bits %u, image transfer granularity %s.\n",
i, debug_vk_queue_flags(queue_properties[i].queueFlags), i, debug_vk_queue_flags(queue_properties[i].queueFlags, debug_buffer),
queue_properties[i].queueCount, queue_properties[i].timestampValidBits, queue_properties[i].queueCount, queue_properties[i].timestampValidBits,
debug_vk_extent_3d(queue_properties[i].minImageTransferGranularity)); debug_vk_extent_3d(queue_properties[i].minImageTransferGranularity));
} }
@ -1167,13 +1168,13 @@ static void vkd3d_trace_physical_device(VkPhysicalDevice device,
{ {
VKD3D_UNUSED const VkMemoryHeap *heap = &memory_properties.memoryHeaps[i]; VKD3D_UNUSED const VkMemoryHeap *heap = &memory_properties.memoryHeaps[i];
TRACE("Memory heap [%u]: size %#"PRIx64" (%"PRIu64" MiB), flags %s, memory types:\n", TRACE("Memory heap [%u]: size %#"PRIx64" (%"PRIu64" MiB), flags %s, memory types:\n",
i, heap->size, heap->size / 1024 / 1024, debug_vk_memory_heap_flags(heap->flags)); i, heap->size, heap->size / 1024 / 1024, debug_vk_memory_heap_flags(heap->flags, debug_buffer));
for (j = 0; j < memory_properties.memoryTypeCount; ++j) for (j = 0; j < memory_properties.memoryTypeCount; ++j)
{ {
const VkMemoryType *type = &memory_properties.memoryTypes[j]; const VkMemoryType *type = &memory_properties.memoryTypes[j];
if (type->heapIndex != i) if (type->heapIndex != i)
continue; continue;
TRACE(" Memory type [%u]: flags %s.\n", j, debug_vk_memory_property_flags(type->propertyFlags)); TRACE(" Memory type [%u]: flags %s.\n", j, debug_vk_memory_property_flags(type->propertyFlags, debug_buffer));
} }
} }
} }

View File

@ -822,10 +822,8 @@ const char *debug_vk_extent_3d(VkExtent3D extent)
(unsigned int)extent.depth); (unsigned int)extent.depth);
} }
const char *debug_vk_queue_flags(VkQueueFlags flags) const char *debug_vk_queue_flags(VkQueueFlags flags, char buffer[VKD3D_DEBUG_FLAGS_BUFFER_SIZE])
{ {
char buffer[120];
buffer[0] = '\0'; buffer[0] = '\0';
#define FLAG_TO_STR(f) if (flags & f) { strcat(buffer, " | "#f); flags &= ~f; } #define FLAG_TO_STR(f) if (flags & f) { strcat(buffer, " | "#f); flags &= ~f; }
FLAG_TO_STR(VK_QUEUE_GRAPHICS_BIT) FLAG_TO_STR(VK_QUEUE_GRAPHICS_BIT)
@ -842,10 +840,8 @@ const char *debug_vk_queue_flags(VkQueueFlags flags)
return vkd3d_dbg_sprintf("%s", &buffer[3]); return vkd3d_dbg_sprintf("%s", &buffer[3]);
} }
const char *debug_vk_memory_heap_flags(VkMemoryHeapFlags flags) const char *debug_vk_memory_heap_flags(VkMemoryHeapFlags flags, char buffer[VKD3D_DEBUG_FLAGS_BUFFER_SIZE])
{ {
char buffer[50];
buffer[0] = '\0'; buffer[0] = '\0';
#define FLAG_TO_STR(f) if (flags & f) { strcat(buffer, " | "#f); flags &= ~f; } #define FLAG_TO_STR(f) if (flags & f) { strcat(buffer, " | "#f); flags &= ~f; }
FLAG_TO_STR(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) FLAG_TO_STR(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)
@ -859,10 +855,8 @@ const char *debug_vk_memory_heap_flags(VkMemoryHeapFlags flags)
return vkd3d_dbg_sprintf("%s", &buffer[3]); return vkd3d_dbg_sprintf("%s", &buffer[3]);
} }
const char *debug_vk_memory_property_flags(VkMemoryPropertyFlags flags) const char *debug_vk_memory_property_flags(VkMemoryPropertyFlags flags, char buffer[VKD3D_DEBUG_FLAGS_BUFFER_SIZE])
{ {
char buffer[200];
buffer[0] = '\0'; buffer[0] = '\0';
#define FLAG_TO_STR(f) if (flags & f) { strcat(buffer, " | "#f); flags &= ~f; } #define FLAG_TO_STR(f) if (flags & f) { strcat(buffer, " | "#f); flags &= ~f; }
FLAG_TO_STR(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) FLAG_TO_STR(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)

View File

@ -2858,9 +2858,11 @@ const char *debug_dxgi_format(DXGI_FORMAT format);
const char *debug_d3d12_box(const D3D12_BOX *box); const char *debug_d3d12_box(const D3D12_BOX *box);
const char *debug_d3d12_shader_component_mapping(unsigned int mapping); const char *debug_d3d12_shader_component_mapping(unsigned int mapping);
const char *debug_vk_extent_3d(VkExtent3D extent); const char *debug_vk_extent_3d(VkExtent3D extent);
const char *debug_vk_memory_heap_flags(VkMemoryHeapFlags flags);
const char *debug_vk_memory_property_flags(VkMemoryPropertyFlags flags); #define VKD3D_DEBUG_FLAGS_BUFFER_SIZE 1024
const char *debug_vk_queue_flags(VkQueueFlags flags); const char *debug_vk_memory_heap_flags(VkMemoryHeapFlags flags, char buffer[VKD3D_DEBUG_FLAGS_BUFFER_SIZE]);
const char *debug_vk_memory_property_flags(VkMemoryPropertyFlags flags, char buffer[VKD3D_DEBUG_FLAGS_BUFFER_SIZE]);
const char *debug_vk_queue_flags(VkQueueFlags flags, char buffer[VKD3D_DEBUG_FLAGS_BUFFER_SIZE]);
static inline void debug_ignored_node_mask(unsigned int mask) static inline void debug_ignored_node_mask(unsigned int mask)
{ {