mirror of
https://github.com/w23/xash3d-fwgs
synced 2024-12-17 14:59:57 +01:00
add VK_EXT_debug_utils labels
This extension allows adding labels to vulkan objects and insert string labels into command buffers. This is visible in tools like RenderDoc and helps with debugging a lot. When running with -vkdebug: - mark all texture VkImages and VkImageViews with corresponding names - label brush model draw calls accordingly
This commit is contained in:
parent
12c8f00885
commit
e848e312d3
@ -27,10 +27,6 @@
|
|||||||
X(vkEnumerateInstanceVersion) \
|
X(vkEnumerateInstanceVersion) \
|
||||||
X(vkCreateInstance) \
|
X(vkCreateInstance) \
|
||||||
|
|
||||||
#define INSTANCE_DEBUG_FUNCS(X) \
|
|
||||||
X(vkCreateDebugUtilsMessengerEXT) \
|
|
||||||
X(vkDestroyDebugUtilsMessengerEXT) \
|
|
||||||
|
|
||||||
static PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
|
static PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
|
||||||
|
|
||||||
#define X(f) PFN_##f f = NULL;
|
#define X(f) PFN_##f f = NULL;
|
||||||
|
@ -121,6 +121,14 @@ const char *resultName(VkResult result);
|
|||||||
X(vkDestroyDevice) \
|
X(vkDestroyDevice) \
|
||||||
X(vkDestroySurfaceKHR) \
|
X(vkDestroySurfaceKHR) \
|
||||||
|
|
||||||
|
#define INSTANCE_DEBUG_FUNCS(X) \
|
||||||
|
X(vkCreateDebugUtilsMessengerEXT) \
|
||||||
|
X(vkDestroyDebugUtilsMessengerEXT) \
|
||||||
|
X(vkCmdBeginDebugUtilsLabelEXT) \
|
||||||
|
X(vkCmdEndDebugUtilsLabelEXT) \
|
||||||
|
X(vkCmdInsertDebugUtilsLabelEXT) \
|
||||||
|
X(vkSetDebugUtilsObjectNameEXT) \
|
||||||
|
|
||||||
#define DEVICE_FUNCS(X) \
|
#define DEVICE_FUNCS(X) \
|
||||||
X(vkGetDeviceQueue) \
|
X(vkGetDeviceQueue) \
|
||||||
X(vkCreateSwapchainKHR) \
|
X(vkCreateSwapchainKHR) \
|
||||||
@ -191,4 +199,5 @@ const char *resultName(VkResult result);
|
|||||||
#define X(f) extern PFN_##f f;
|
#define X(f) extern PFN_##f f;
|
||||||
DEVICE_FUNCS(X)
|
DEVICE_FUNCS(X)
|
||||||
INSTANCE_FUNCS(X)
|
INSTANCE_FUNCS(X)
|
||||||
|
INSTANCE_DEBUG_FUNCS(X)
|
||||||
#undef X
|
#undef X
|
||||||
|
@ -313,8 +313,18 @@ static void drawBrushModel( const model_t *mod )
|
|||||||
int index_count = 0;
|
int index_count = 0;
|
||||||
int index_offset = -1;
|
int index_offset = -1;
|
||||||
|
|
||||||
if (!bmodel) // TODO complain
|
if (!bmodel) {
|
||||||
|
gEngine.Con_Printf( S_ERROR "Model %s wasn't loaded\n", mod->name);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vk_core.debug) {
|
||||||
|
VkDebugUtilsLabelEXT label = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
|
||||||
|
.pLabelName = mod->name,
|
||||||
|
};
|
||||||
|
vkCmdBeginDebugUtilsLabelEXT(vk_core.cb, &label);
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < bmodel->num_surfaces; ++i) {
|
for (int i = 0; i < bmodel->num_surfaces; ++i) {
|
||||||
const vk_brush_model_surface_t *bsurf = bmodel->surfaces + i;
|
const vk_brush_model_surface_t *bsurf = bmodel->surfaces + i;
|
||||||
@ -343,6 +353,9 @@ static void drawBrushModel( const model_t *mod )
|
|||||||
|
|
||||||
if (index_count)
|
if (index_count)
|
||||||
vkCmdDrawIndexed(vk_core.cb, index_count, 1, index_offset, bmodel->vertex_offset, 0);
|
vkCmdDrawIndexed(vk_core.cb, index_count, 1, index_offset, bmodel->vertex_offset, 0);
|
||||||
|
|
||||||
|
if (vk_core.debug)
|
||||||
|
vkCmdEndDebugUtilsLabelEXT(vk_core.cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
void R_RotateForEntity( matrix4x4 out, const cl_entity_t *e )
|
void R_RotateForEntity( matrix4x4 out, const cl_entity_t *e )
|
||||||
|
@ -329,6 +329,16 @@ static qboolean VK_UploadTexture(vk_texture_t *tex, rgbdata_t *pic)
|
|||||||
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
||||||
};
|
};
|
||||||
XVK_CHECK(vkCreateImage(vk_core.device, &image_create_info, NULL, &tex->vk.image));
|
XVK_CHECK(vkCreateImage(vk_core.device, &image_create_info, NULL, &tex->vk.image));
|
||||||
|
|
||||||
|
if (vk_core.debug) {
|
||||||
|
VkDebugUtilsObjectNameInfoEXT debug_name = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT,
|
||||||
|
.objectHandle = (uint64_t)tex->vk.image,
|
||||||
|
.objectType = VK_OBJECT_TYPE_IMAGE,
|
||||||
|
.pObjectName = tex->name,
|
||||||
|
};
|
||||||
|
XVK_CHECK(vkSetDebugUtilsObjectNameEXT(vk_core.device, &debug_name));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. Alloc mem for VkImage and bind it (DEV_LOCAL)
|
// 2. Alloc mem for VkImage and bind it (DEV_LOCAL)
|
||||||
@ -434,6 +444,15 @@ static qboolean VK_UploadTexture(vk_texture_t *tex, rgbdata_t *pic)
|
|||||||
ivci.components = (VkComponentMapping){0, 0, 0, (pic->flags & IMAGE_HAS_ALPHA) ? 0 : VK_COMPONENT_SWIZZLE_ONE};
|
ivci.components = (VkComponentMapping){0, 0, 0, (pic->flags & IMAGE_HAS_ALPHA) ? 0 : VK_COMPONENT_SWIZZLE_ONE};
|
||||||
XVK_CHECK(vkCreateImageView(vk_core.device, &ivci, NULL, &tex->vk.image_view));
|
XVK_CHECK(vkCreateImageView(vk_core.device, &ivci, NULL, &tex->vk.image_view));
|
||||||
}
|
}
|
||||||
|
if (vk_core.debug) {
|
||||||
|
VkDebugUtilsObjectNameInfoEXT debug_name = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT,
|
||||||
|
.objectHandle = (uint64_t)tex->vk.image_view,
|
||||||
|
.objectType = VK_OBJECT_TYPE_IMAGE_VIEW,
|
||||||
|
.pObjectName = tex->name,
|
||||||
|
};
|
||||||
|
XVK_CHECK(vkSetDebugUtilsObjectNameEXT(vk_core.device, &debug_name));
|
||||||
|
}
|
||||||
|
|
||||||
// TODO how should we approach this:
|
// TODO how should we approach this:
|
||||||
// - per-texture desc sets can be inconvenient if texture is used in different incompatible contexts
|
// - per-texture desc sets can be inconvenient if texture is used in different incompatible contexts
|
||||||
|
Loading…
Reference in New Issue
Block a user