From 73638be11f4fbb016f6c6d2934134c0d2455d798 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tapani=20P=C3=A4lli?= Date: Fri, 25 Aug 2017 09:50:11 +0300 Subject: [PATCH] anv: wire up anv_perf_warn macro to do debug reporting MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Tapani Pälli Reviewed-by: Jason Ekstrand --- src/intel/vulkan/anv_device.c | 3 +- src/intel/vulkan/anv_image.c | 12 ++-- src/intel/vulkan/anv_private.h | 112 +++++++++++++++++++++++++++-- src/intel/vulkan/anv_util.c | 18 ++++- src/intel/vulkan/genX_cmd_buffer.c | 12 ++-- 5 files changed, 141 insertions(+), 16 deletions(-) diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 1a6ed8c919c..f246e0ee6b4 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -64,7 +64,8 @@ anv_compute_heap_size(int fd, uint64_t *heap_size) /* If, for whatever reason, we can't actually get the GTT size from the * kernel (too old?) fall back to the aperture size. */ - anv_perf_warn("Failed to get I915_CONTEXT_PARAM_GTT_SIZE: %m"); + anv_perf_warn(NULL, NULL, + "Failed to get I915_CONTEXT_PARAM_GTT_SIZE: %m"); if (anv_gem_get_aperture(fd, >t_size) == -1) { return vk_errorf(VK_ERROR_INITIALIZATION_FAILED, diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index 4f0a818b086..492b341303a 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -269,13 +269,14 @@ make_surface(const struct anv_device *dev, if (!(image->usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)) { /* It will never be used as an attachment, HiZ is pointless. */ } else if (dev->info.gen == 7) { - anv_perf_warn("Implement gen7 HiZ"); + anv_perf_warn(dev->instance, image, "Implement gen7 HiZ"); } else if (vk_info->mipLevels > 1) { - anv_perf_warn("Enable multi-LOD HiZ"); + anv_perf_warn(dev->instance, image, "Enable multi-LOD HiZ"); } else if (vk_info->arrayLayers > 1) { - anv_perf_warn("Implement multi-arrayLayer HiZ clears and resolves"); + anv_perf_warn(dev->instance, image, + "Implement multi-arrayLayer HiZ clears and resolves"); } else if (dev->info.gen == 8 && vk_info->samples > 1) { - anv_perf_warn("Enable gen8 multisampled HiZ"); + anv_perf_warn(dev->instance, image, "Enable gen8 multisampled HiZ"); } else if (!unlikely(INTEL_DEBUG & DEBUG_NO_HIZ)) { assert(image->aux_surface.isl.size == 0); ok = isl_surf_get_hiz_surf(&dev->isl_dev, &image->depth_surface.isl, @@ -299,7 +300,8 @@ make_surface(const struct anv_device *dev, * image, we currently don't have things hooked up to get it * working. */ - anv_perf_warn("This image format doesn't support rendering. " + anv_perf_warn(dev->instance, image, + "This image format doesn't support rendering. " "Not allocating an CCS buffer."); image->aux_surface.isl.size = 0; return VK_SUCCESS; diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 1b71093f949..141712232da 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -197,6 +197,107 @@ vk_to_isl_color(VkClearColorValue color) memcpy((dest), (src), (count) * sizeof(*(src))); \ }) +/* Mapping from anv object to VkDebugReportObjectTypeEXT. New types need + * to be added here in order to utilize mapping in debug/error/perf macros. + */ +#define REPORT_OBJECT_TYPE(o) \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_instance*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_physical_device*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_device*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), const struct anv_device*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_queue*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_semaphore*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_cmd_buffer*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_fence*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_device_memory*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_buffer*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_image*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), const struct anv_image*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_event*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_query_pool*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_buffer_view*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_image_view*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_shader_module*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_pipeline_cache*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_pipeline_layout*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_render_pass*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_pipeline*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_descriptor_set_layout*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_sampler*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_descriptor_pool*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_descriptor_set*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_framebuffer*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_cmd_pool*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_surface*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct wsi_swapchain*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), struct anv_debug_callback*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT, \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (__typeof (o), void*), \ + VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, \ + /* The void expression results in a compile-time error \ + when assigning the result to something. */ \ + (void)0))))))))))))))))))))))))))))))) + /* Whenever we generate an error, pass it through this function. Useful for * debugging, where we can break on it. Only call at error site, not when * propagating errors. Might be useful to plug in a stack trace here. @@ -234,8 +335,10 @@ VkResult __vk_errorf(VkResult error, const char *file, int line, const char *for void __anv_finishme(const char *file, int line, const char *format, ...) anv_printflike(3, 4); -void __anv_perf_warn(const char *file, int line, const char *format, ...) - anv_printflike(3, 4); +void __anv_perf_warn(struct anv_instance *instance, const void *object, + VkDebugReportObjectTypeEXT type, const char *file, + int line, const char *format, ...) + anv_printflike(6, 7); void anv_loge(const char *format, ...) anv_printflike(1, 2); void anv_loge_v(const char *format, va_list va); @@ -263,11 +366,12 @@ void anv_debug_report(struct anv_instance *instance, /** * Print a perf warning message. Set INTEL_DEBUG=perf to see these. */ -#define anv_perf_warn(format, ...) \ +#define anv_perf_warn(instance, obj, format, ...) \ do { \ static bool reported = false; \ if (!reported && unlikely(INTEL_DEBUG & DEBUG_PERF)) { \ - __anv_perf_warn(__FILE__, __LINE__, format, ##__VA_ARGS__); \ + __anv_perf_warn(instance, obj, REPORT_OBJECT_TYPE(obj), __FILE__, __LINE__,\ + format, ##__VA_ARGS__); \ reported = true; \ } \ } while (0) diff --git a/src/intel/vulkan/anv_util.c b/src/intel/vulkan/anv_util.c index 4b916e27f2c..45ce0a3aa0e 100644 --- a/src/intel/vulkan/anv_util.c +++ b/src/intel/vulkan/anv_util.c @@ -65,16 +65,30 @@ __anv_finishme(const char *file, int line, const char *format, ...) fprintf(stderr, "%s:%d: FINISHME: %s\n", file, line, buffer); } -void anv_printflike(3, 4) -__anv_perf_warn(const char *file, int line, const char *format, ...) +void anv_printflike(6, 7) +__anv_perf_warn(struct anv_instance *instance, const void *object, + VkDebugReportObjectTypeEXT type, + const char *file, int line, const char *format, ...) { va_list ap; char buffer[256]; + char report[256]; va_start(ap, format); vsnprintf(buffer, sizeof(buffer), format, ap); va_end(ap); + snprintf(report, sizeof(report), "%s: %s", file, buffer); + + anv_debug_report(instance, + VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, + type, + (uint64_t) (uintptr_t) object, + line, + 0, + "anv", + report); + fprintf(stderr, "%s:%d: PERF: %s\n", file, line, buffer); } diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index db40b45c29a..67fc3f33df6 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -280,7 +280,8 @@ color_attachment_compute_aux_usage(struct anv_device * device, */ if (cmd_state->pass->attachments[att].first_subpass_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) { - anv_perf_warn("Not temporarily enabling CCS_E."); + anv_perf_warn(device->instance, iview->image, + "Not temporarily enabling CCS_E."); } } else { att_state->input_aux_usage = ISL_AUX_USAGE_NONE; @@ -325,7 +326,8 @@ color_attachment_compute_aux_usage(struct anv_device * device, anv_image_aux_layers(iview->image, iview->isl.base_level)) { att_state->fast_clear = false; if (GEN_GEN == 7) { - anv_perf_warn("Not fast-clearing the first layer in " + anv_perf_warn(device->instance, iview->image, + "Not fast-clearing the first layer in " "a multi-layer fast clear."); } } @@ -692,7 +694,8 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer, */ if ((GEN_GEN >= 9 && image->samples == 1) || image->samples > 1) { if (image->samples == 4 || image->samples == 16) { - anv_perf_warn("Doing a potentially unnecessary fast-clear to " + anv_perf_warn(cmd_buffer->device->instance, image, + "Doing a potentially unnecessary fast-clear to " "define an MCS buffer."); } @@ -713,7 +716,8 @@ transition_color_buffer(struct anv_cmd_buffer *cmd_buffer, /* The CCS_D buffer may not be enabled in the final layout. Continue * executing this function to perform a resolve. */ - anv_perf_warn("Performing an additional resolve for CCS_D layout " + anv_perf_warn(cmd_buffer->device->instance, image, + "Performing an additional resolve for CCS_D layout " "transition. Consider always leaving it on or " "performing an ambiguation pass."); } else { -- 2.30.2