summaryrefslogtreecommitdiffstats
path: root/src/vulkan/overlay-layer
diff options
context:
space:
mode:
authorLionel Landwerlin <[email protected]>2019-03-19 12:34:51 +0000
committerLionel Landwerlin <[email protected]>2019-03-22 11:26:04 +0000
commit87dadbce5b6ba062c057ec7ee123ee17f6d96300 (patch)
treee77f6c61f67abe35b73b49f323f69f7dafc7a7e8 /src/vulkan/overlay-layer
parent9f3727351dd5d6670c54cca12ae03ccdf5b4f440 (diff)
vulkan/overlay: improve error reporting
We can show the actual command & line where the failure happened Signed-off-by: Lionel Landwerlin <[email protected]> Suggested-by: Tapani Pälli <[email protected]> Reviewed-by: Tapani Pälli <[email protected]>
Diffstat (limited to 'src/vulkan/overlay-layer')
-rw-r--r--src/vulkan/overlay-layer/overlay.cpp214
1 files changed, 89 insertions, 125 deletions
diff --git a/src/vulkan/overlay-layer/overlay.cpp b/src/vulkan/overlay-layer/overlay.cpp
index edaad969e20..8de22307e14 100644
--- a/src/vulkan/overlay-layer/overlay.cpp
+++ b/src/vulkan/overlay-layer/overlay.cpp
@@ -200,11 +200,14 @@ static void unmap_object(void *obj)
/**/
-static void check_vk_result(VkResult err)
-{
- if (err != VK_SUCCESS)
- printf("ERROR!\n");
-}
+#define VK_CHECK(expr) \
+ do { \
+ VkResult __result = (expr); \
+ if (__result != VK_SUCCESS) { \
+ fprintf(stderr, "'%s' line %i failed with %s\n", \
+ #expr, __LINE__, vk_Result_to_str(__result)); \
+ } \
+ } while (0)
/**/
@@ -327,8 +330,7 @@ static void device_map_queues(struct device_data *data,
pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex,
j, &queue);
- VkResult err = data->set_device_loader_data(data->device, queue);
- check_vk_result(err);
+ VK_CHECK(data->set_device_loader_data(data->device, queue));
data->queues[queue_index++] =
new_queue_data(queue, &family_props[pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex],
@@ -579,7 +581,6 @@ static void ensure_swapchain_fonts(struct swapchain_data *data,
data->font_uploaded = true;
struct device_data *device_data = data->device;
- VkResult err;
ImGuiIO& io = ImGui::GetIO();
unsigned char* pixels;
int width, height;
@@ -592,9 +593,8 @@ static void ensure_swapchain_fonts(struct swapchain_data *data,
buffer_info.size = upload_size;
buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
- err = device_data->vtable.CreateBuffer(device_data->device, &buffer_info,
- NULL, &data->upload_font_buffer);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.CreateBuffer(device_data->device, &buffer_info,
+ NULL, &data->upload_font_buffer));
VkMemoryRequirements upload_buffer_req;
device_data->vtable.GetBufferMemoryRequirements(device_data->device,
data->upload_font_buffer,
@@ -605,29 +605,25 @@ static void ensure_swapchain_fonts(struct swapchain_data *data,
upload_alloc_info.memoryTypeIndex = vk_memory_type(device_data,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
upload_buffer_req.memoryTypeBits);
- err = device_data->vtable.AllocateMemory(device_data->device,
- &upload_alloc_info,
- NULL,
- &data->upload_font_buffer_mem);
- check_vk_result(err);
- err = device_data->vtable.BindBufferMemory(device_data->device,
- data->upload_font_buffer,
- data->upload_font_buffer_mem, 0);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.AllocateMemory(device_data->device,
+ &upload_alloc_info,
+ NULL,
+ &data->upload_font_buffer_mem));
+ VK_CHECK(device_data->vtable.BindBufferMemory(device_data->device,
+ data->upload_font_buffer,
+ data->upload_font_buffer_mem, 0));
/* Upload to Buffer */
char* map = NULL;
- err = device_data->vtable.MapMemory(device_data->device,
- data->upload_font_buffer_mem,
- 0, upload_size, 0, (void**)(&map));
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.MapMemory(device_data->device,
+ data->upload_font_buffer_mem,
+ 0, upload_size, 0, (void**)(&map)));
memcpy(map, pixels, upload_size);
VkMappedMemoryRange range[1] = {};
range[0].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
range[0].memory = data->upload_font_buffer_mem;
range[0].size = upload_size;
- err = device_data->vtable.FlushMappedMemoryRanges(device_data->device, 1, range);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.FlushMappedMemoryRanges(device_data->device, 1, range));
device_data->vtable.UnmapMemory(device_data->device,
data->upload_font_buffer_mem);
@@ -691,7 +687,6 @@ static void CreateOrResizeBuffer(struct device_data *data,
VkDeviceSize *buffer_size,
size_t new_size, VkBufferUsageFlagBits usage)
{
- VkResult err;
if (*buffer != VK_NULL_HANDLE)
data->vtable.DestroyBuffer(data->device, *buffer, NULL);
if (*buffer_memory)
@@ -702,8 +697,7 @@ static void CreateOrResizeBuffer(struct device_data *data,
buffer_info.size = new_size;
buffer_info.usage = usage;
buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
- err = data->vtable.CreateBuffer(data->device, &buffer_info, NULL, buffer);
- check_vk_result(err);
+ VK_CHECK(data->vtable.CreateBuffer(data->device, &buffer_info, NULL, buffer));
VkMemoryRequirements req;
data->vtable.GetBufferMemoryRequirements(data->device, *buffer, &req);
@@ -712,11 +706,9 @@ static void CreateOrResizeBuffer(struct device_data *data,
alloc_info.allocationSize = req.size;
alloc_info.memoryTypeIndex =
vk_memory_type(data, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits);
- err = data->vtable.AllocateMemory(data->device, &alloc_info, NULL, buffer_memory);
- check_vk_result(err);
+ VK_CHECK(data->vtable.AllocateMemory(data->device, &alloc_info, NULL, buffer_memory));
- err = data->vtable.BindBufferMemory(data->device, *buffer, *buffer_memory, 0);
- check_vk_result(err);
+ VK_CHECK(data->vtable.BindBufferMemory(data->device, *buffer, *buffer_memory, 0));
*buffer_size = new_size;
}
@@ -729,7 +721,6 @@ static void render_swapchain_display(struct swapchain_data *data, unsigned image
struct device_data *device_data = data->device;
uint32_t idx = data->n_frames % ARRAY_SIZE(data->frame_data);
VkCommandBuffer command_buffer = data->frame_data[idx].command_buffer;
- VkResult err;
device_data->vtable.ResetCommandBuffer(command_buffer, 0);
@@ -801,12 +792,10 @@ static void render_swapchain_display(struct swapchain_data *data, unsigned image
VkDeviceMemory index_mem = data->frame_data[idx].index_buffer_mem;
ImDrawVert* vtx_dst = NULL;
ImDrawIdx* idx_dst = NULL;
- err = device_data->vtable.MapMemory(device_data->device, vertex_mem,
- 0, vertex_size, 0, (void**)(&vtx_dst));
- check_vk_result(err);
- err = device_data->vtable.MapMemory(device_data->device, index_mem,
- 0, index_size, 0, (void**)(&idx_dst));
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.MapMemory(device_data->device, vertex_mem,
+ 0, vertex_size, 0, (void**)(&vtx_dst)));
+ VK_CHECK(device_data->vtable.MapMemory(device_data->device, index_mem,
+ 0, index_size, 0, (void**)(&idx_dst)));
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* cmd_list = draw_data->CmdLists[n];
@@ -822,8 +811,7 @@ static void render_swapchain_display(struct swapchain_data *data, unsigned image
range[1].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
range[1].memory = index_mem;
range[1].size = VK_WHOLE_SIZE;
- err = device_data->vtable.FlushMappedMemoryRanges(device_data->device, 2, range);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.FlushMappedMemoryRanges(device_data->device, 2, range));
device_data->vtable.UnmapMemory(device_data->device, vertex_mem);
device_data->vtable.UnmapMemory(device_data->device, index_mem);
@@ -907,9 +895,8 @@ static void render_swapchain_display(struct swapchain_data *data, unsigned image
/* Submission semaphore */
VkSemaphoreCreateInfo semaphore_info = {};
semaphore_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
- err = device_data->vtable.CreateSemaphore(device_data->device, &semaphore_info,
- NULL, &data->submission_semaphore);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.CreateSemaphore(device_data->device, &semaphore_info,
+ NULL, &data->submission_semaphore));
VkSubmitInfo submit_info = {};
VkPipelineStageFlags stage_wait = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
@@ -936,23 +923,20 @@ static void setup_swapchain_data_pipeline(struct swapchain_data *data)
{
struct device_data *device_data = data->device;
VkShaderModule vert_module, frag_module;
- VkResult err;
/* Create shader modules */
VkShaderModuleCreateInfo vert_info = {};
vert_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
vert_info.codeSize = sizeof(overlay_vert_spv);
vert_info.pCode = overlay_vert_spv;
- err = device_data->vtable.CreateShaderModule(device_data->device,
- &vert_info, NULL, &vert_module);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.CreateShaderModule(device_data->device,
+ &vert_info, NULL, &vert_module));
VkShaderModuleCreateInfo frag_info = {};
frag_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
frag_info.codeSize = sizeof(overlay_frag_spv);
frag_info.pCode = (uint32_t*)overlay_frag_spv;
- err = device_data->vtable.CreateShaderModule(device_data->device,
- &frag_info, NULL, &frag_module);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.CreateShaderModule(device_data->device,
+ &frag_info, NULL, &frag_module));
/* Font sampler */
VkSamplerCreateInfo sampler_info = {};
@@ -966,9 +950,8 @@ static void setup_swapchain_data_pipeline(struct swapchain_data *data)
sampler_info.minLod = -1000;
sampler_info.maxLod = 1000;
sampler_info.maxAnisotropy = 1.0f;
- err = device_data->vtable.CreateSampler(device_data->device, &sampler_info,
- NULL, &data->font_sampler);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.CreateSampler(device_data->device, &sampler_info,
+ NULL, &data->font_sampler));
/* Descriptor pool */
VkDescriptorPoolSize sampler_pool_size = {};
@@ -979,10 +962,9 @@ static void setup_swapchain_data_pipeline(struct swapchain_data *data)
desc_pool_info.maxSets = 1;
desc_pool_info.poolSizeCount = 1;
desc_pool_info.pPoolSizes = &sampler_pool_size;
- err = device_data->vtable.CreateDescriptorPool(device_data->device,
- &desc_pool_info,
- NULL, &data->descriptor_pool);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.CreateDescriptorPool(device_data->device,
+ &desc_pool_info,
+ NULL, &data->descriptor_pool));
/* Descriptor layout */
VkSampler sampler[1] = { data->font_sampler };
@@ -995,10 +977,9 @@ static void setup_swapchain_data_pipeline(struct swapchain_data *data)
set_layout_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
set_layout_info.bindingCount = 1;
set_layout_info.pBindings = binding;
- err = device_data->vtable.CreateDescriptorSetLayout(device_data->device,
- &set_layout_info,
- NULL, &data->descriptor_layout);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.CreateDescriptorSetLayout(device_data->device,
+ &set_layout_info,
+ NULL, &data->descriptor_layout));
/* Descriptor set */
VkDescriptorSetAllocateInfo alloc_info = {};
@@ -1006,10 +987,9 @@ static void setup_swapchain_data_pipeline(struct swapchain_data *data)
alloc_info.descriptorPool = data->descriptor_pool;
alloc_info.descriptorSetCount = 1;
alloc_info.pSetLayouts = &data->descriptor_layout;
- err = device_data->vtable.AllocateDescriptorSets(device_data->device,
- &alloc_info,
- &data->descriptor_set);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.AllocateDescriptorSets(device_data->device,
+ &alloc_info,
+ &data->descriptor_set));
/* Constants: we are using 'vec2 offset' and 'vec2 scale' instead of a full
* 3d projection matrix
@@ -1024,11 +1004,9 @@ static void setup_swapchain_data_pipeline(struct swapchain_data *data)
layout_info.pSetLayouts = &data->descriptor_layout;
layout_info.pushConstantRangeCount = 1;
layout_info.pPushConstantRanges = push_constants;
- err = device_data->vtable.CreatePipelineLayout(device_data->device,
- &layout_info,
- NULL, &data->pipeline_layout);
- check_vk_result(err);
-
+ VK_CHECK(device_data->vtable.CreatePipelineLayout(device_data->device,
+ &layout_info,
+ NULL, &data->pipeline_layout));
VkPipelineShaderStageCreateInfo stage[2] = {};
stage[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
@@ -1125,10 +1103,10 @@ static void setup_swapchain_data_pipeline(struct swapchain_data *data)
info.pDynamicState = &dynamic_state;
info.layout = data->pipeline_layout;
info.renderPass = data->render_pass;
- err = device_data->vtable.CreateGraphicsPipelines(device_data->device, VK_NULL_HANDLE,
- 1, &info,
- NULL, &data->pipeline);
- check_vk_result(err);
+ VK_CHECK(
+ device_data->vtable.CreateGraphicsPipelines(device_data->device, VK_NULL_HANDLE,
+ 1, &info,
+ NULL, &data->pipeline));
device_data->vtable.DestroyShaderModule(device_data->device, vert_module, NULL);
device_data->vtable.DestroyShaderModule(device_data->device, frag_module, NULL);
@@ -1153,9 +1131,8 @@ static void setup_swapchain_data_pipeline(struct swapchain_data *data)
image_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
image_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- err = device_data->vtable.CreateImage(device_data->device, &image_info,
- NULL, &data->font_image);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.CreateImage(device_data->device, &image_info,
+ NULL, &data->font_image));
VkMemoryRequirements font_image_req;
device_data->vtable.GetImageMemoryRequirements(device_data->device,
data->font_image, &font_image_req);
@@ -1165,13 +1142,11 @@ static void setup_swapchain_data_pipeline(struct swapchain_data *data)
image_alloc_info.memoryTypeIndex = vk_memory_type(device_data,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
font_image_req.memoryTypeBits);
- err = device_data->vtable.AllocateMemory(device_data->device, &image_alloc_info,
- NULL, &data->font_mem);
- check_vk_result(err);
- err = device_data->vtable.BindImageMemory(device_data->device,
- data->font_image,
- data->font_mem, 0);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.AllocateMemory(device_data->device, &image_alloc_info,
+ NULL, &data->font_mem));
+ VK_CHECK(device_data->vtable.BindImageMemory(device_data->device,
+ data->font_image,
+ data->font_mem, 0));
/* Font image view */
VkImageViewCreateInfo view_info = {};
@@ -1182,9 +1157,8 @@ static void setup_swapchain_data_pipeline(struct swapchain_data *data)
view_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
view_info.subresourceRange.levelCount = 1;
view_info.subresourceRange.layerCount = 1;
- err = device_data->vtable.CreateImageView(device_data->device, &view_info,
- NULL, &data->font_image_view);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.CreateImageView(device_data->device, &view_info,
+ NULL, &data->font_image_view));
/* Descriptor set */
VkDescriptorImageInfo desc_image[1] = {};
@@ -1214,7 +1188,6 @@ static void setup_swapchain_data(struct swapchain_data *data,
ImGui::GetIO().DisplaySize = ImVec2((float)data->width, (float)data->height);
struct device_data *device_data = data->device;
- VkResult err;
/* Render pass */
VkAttachmentDescription attachment_desc = {};
@@ -1248,28 +1221,25 @@ static void setup_swapchain_data(struct swapchain_data *data,
render_pass_info.pSubpasses = &subpass;
render_pass_info.dependencyCount = 1;
render_pass_info.pDependencies = &dependency;
- err = device_data->vtable.CreateRenderPass(device_data->device,
- &render_pass_info,
- NULL, &data->render_pass);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.CreateRenderPass(device_data->device,
+ &render_pass_info,
+ NULL, &data->render_pass));
setup_swapchain_data_pipeline(data);
- err = device_data->vtable.GetSwapchainImagesKHR(device_data->device,
- data->swapchain,
- &data->n_images,
- NULL);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.GetSwapchainImagesKHR(device_data->device,
+ data->swapchain,
+ &data->n_images,
+ NULL));
data->images = ralloc_array(data, VkImage, data->n_images);
data->image_views = ralloc_array(data, VkImageView, data->n_images);
data->framebuffers = ralloc_array(data, VkFramebuffer, data->n_images);
- err = device_data->vtable.GetSwapchainImagesKHR(device_data->device,
- data->swapchain,
- &data->n_images,
- data->images);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.GetSwapchainImagesKHR(device_data->device,
+ data->swapchain,
+ &data->n_images,
+ data->images));
/* Image views */
VkImageViewCreateInfo view_info = {};
@@ -1283,9 +1253,9 @@ static void setup_swapchain_data(struct swapchain_data *data,
view_info.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
for (uint32_t i = 0; i < data->n_images; i++) {
view_info.image = data->images[i];
- err = device_data->vtable.CreateImageView(device_data->device, &view_info,
- NULL, &data->image_views[i]);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.CreateImageView(device_data->device,
+ &view_info, NULL,
+ &data->image_views[i]));
}
/* Framebuffers */
@@ -1300,9 +1270,8 @@ static void setup_swapchain_data(struct swapchain_data *data,
fb_info.layers = 1;
for (uint32_t i = 0; i < data->n_images; i++) {
attachment[0] = data->image_views[i];
- err = device_data->vtable.CreateFramebuffer(device_data->device, &fb_info,
- NULL, &data->framebuffers[i]);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.CreateFramebuffer(device_data->device, &fb_info,
+ NULL, &data->framebuffers[i]));
}
/* Command buffer */
@@ -1310,10 +1279,9 @@ static void setup_swapchain_data(struct swapchain_data *data,
cmd_buffer_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
cmd_buffer_pool_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
cmd_buffer_pool_info.queueFamilyIndex = device_data->graphic_queue->family_index;
- err = device_data->vtable.CreateCommandPool(device_data->device,
- &cmd_buffer_pool_info,
- NULL, &data->command_pool);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.CreateCommandPool(device_data->device,
+ &cmd_buffer_pool_info,
+ NULL, &data->command_pool));
VkCommandBuffer cmd_bufs[ARRAY_SIZE(data->frame_data)];
@@ -1322,15 +1290,12 @@ static void setup_swapchain_data(struct swapchain_data *data,
cmd_buffer_info.commandPool = data->command_pool;
cmd_buffer_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
cmd_buffer_info.commandBufferCount = 2;
- err = device_data->vtable.AllocateCommandBuffers(device_data->device,
- &cmd_buffer_info,
- cmd_bufs);
- check_vk_result(err);
-
+ VK_CHECK(device_data->vtable.AllocateCommandBuffers(device_data->device,
+ &cmd_buffer_info,
+ cmd_bufs));
for (uint32_t i = 0; i < ARRAY_SIZE(data->frame_data); i++) {
- err = device_data->set_device_loader_data(device_data->device,
- cmd_bufs[i]);
- check_vk_result(err);
+ VK_CHECK(device_data->set_device_loader_data(device_data->device,
+ cmd_bufs[i]));
data->frame_data[i].command_buffer = cmd_bufs[i];
}
@@ -1339,9 +1304,8 @@ static void setup_swapchain_data(struct swapchain_data *data,
VkFenceCreateInfo fence_info = {};
fence_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
fence_info.flags = VK_FENCE_CREATE_SIGNALED_BIT;
- err = device_data->vtable.CreateFence(device_data->device, &fence_info,
- NULL, &data->fence);
- check_vk_result(err);
+ VK_CHECK(device_data->vtable.CreateFence(device_data->device, &fence_info,
+ NULL, &data->fence));
}
static void shutdown_swapchain_data(struct swapchain_data *data)