intel/tools: Disassemble WAIT's argument as a destination
[mesa.git] / src / intel / vulkan / anv_util.c
index 22fd01c9495f83e05dbdbdf3b3402592fcda6d46..58d2efcc51f2d64b52ff650ff43a486c70c7c58a 100644 (file)
@@ -29,6 +29,7 @@
 #include <assert.h>
 
 #include "anv_private.h"
+#include "vk_enum_to_str.h"
 
 /** Log an error message.  */
 void anv_printflike(1, 2)
@@ -45,151 +46,81 @@ anv_loge(const char *format, ...)
 void
 anv_loge_v(const char *format, va_list va)
 {
-   fprintf(stderr, "vk: error: ");
-   vfprintf(stderr, format, va);
-   fprintf(stderr, "\n");
+   intel_loge_v(format, va);
 }
 
-void anv_printflike(3, 4)
-__anv_finishme(const char *file, int line, const char *format, ...)
+void anv_printflike(6, 7)
+__anv_perf_warn(struct anv_device *device, const void *object,
+                VkDebugReportObjectTypeEXT type,
+                const char *file, int line, const char *format, ...)
 {
    va_list ap;
    char buffer[256];
+   char report[512];
 
    va_start(ap, format);
    vsnprintf(buffer, sizeof(buffer), format, ap);
    va_end(ap);
 
-   fprintf(stderr, "%s:%d: FINISHME: %s\n", file, line, buffer);
-}
+   snprintf(report, sizeof(report), "%s: %s", file, buffer);
 
-void anv_noreturn anv_printflike(1, 2)
-anv_abortf(const char *format, ...)
-{
-   va_list va;
+   vk_debug_report(&device->physical->instance->debug_report_callbacks,
+                   VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
+                   type,
+                   (uint64_t) (uintptr_t) object,
+                   line,
+                   0,
+                   "anv",
+                   report);
 
-   va_start(va, format);
-   anv_abortfv(format, va);
-   va_end(va);
-}
-
-void anv_noreturn
-anv_abortfv(const char *format, va_list va)
-{
-   fprintf(stderr, "vk: error: ");
-   vfprintf(stderr, format, va);
-   fprintf(stderr, "\n");
-   abort();
+   intel_logw("%s:%d: PERF: %s", file, line, buffer);
 }
 
 VkResult
-__vk_errorf(VkResult error, const char *file, int line, const char *format, ...)
+__vk_errorv(struct anv_instance *instance, const void *object,
+            VkDebugReportObjectTypeEXT type, VkResult error,
+            const char *file, int line, const char *format, va_list ap)
 {
-   va_list ap;
    char buffer[256];
+   char report[512];
 
-#define ERROR_CASE(error) case error: error_str = #error; break;
-
-   const char *error_str;
-   switch ((int32_t)error) {
-
-   /* Core errors */
-   ERROR_CASE(VK_ERROR_OUT_OF_HOST_MEMORY)
-   ERROR_CASE(VK_ERROR_OUT_OF_DEVICE_MEMORY)
-   ERROR_CASE(VK_ERROR_INITIALIZATION_FAILED)
-   ERROR_CASE(VK_ERROR_DEVICE_LOST)
-   ERROR_CASE(VK_ERROR_MEMORY_MAP_FAILED)
-   ERROR_CASE(VK_ERROR_LAYER_NOT_PRESENT)
-   ERROR_CASE(VK_ERROR_EXTENSION_NOT_PRESENT)
-   ERROR_CASE(VK_ERROR_INCOMPATIBLE_DRIVER)
-
-   /* Extension errors */
-   ERROR_CASE(VK_ERROR_OUT_OF_DATE_KHR)
-
-   default:
-      assert(!"Unknown error");
-      error_str = "unknown error";
-   }
-
-#undef ERROR_CASE
+   const char *error_str = vk_Result_to_str(error);
 
    if (format) {
-      va_start(ap, format);
       vsnprintf(buffer, sizeof(buffer), format, ap);
-      va_end(ap);
 
-      fprintf(stderr, "%s:%d: %s (%s)\n", file, line, buffer, error_str);
+      snprintf(report, sizeof(report), "%s:%d: %s (%s)", file, line, buffer,
+               error_str);
    } else {
-      fprintf(stderr, "%s:%d: %s\n", file, line, error_str);
+      snprintf(report, sizeof(report), "%s:%d: %s", file, line, error_str);
    }
 
-   return error;
-}
-
-int
-anv_vector_init(struct anv_vector *vector, uint32_t element_size, uint32_t size)
-{
-   assert(util_is_power_of_two(size));
-   assert(element_size < size && util_is_power_of_two(element_size));
-
-   vector->head = 0;
-   vector->tail = 0;
-   vector->element_size = element_size;
-   vector->size = size;
-   vector->data = malloc(size);
-
-   return vector->data != NULL;
-}
-
-void *
-anv_vector_add(struct anv_vector *vector)
-{
-   uint32_t offset, size, split, tail;
-   void *data;
-
-   if (vector->head - vector->tail == vector->size) {
-      size = vector->size * 2;
-      data = malloc(size);
-      if (data == NULL)
-         return NULL;
-      split = align_u32(vector->tail, vector->size);
-      tail = vector->tail & (vector->size - 1);
-      if (vector->head - split < vector->size) {
-         memcpy(data + tail,
-                vector->data + tail,
-                split - vector->tail);
-         memcpy(data + vector->size,
-                vector->data, vector->head - split);
-      } else {
-         memcpy(data + tail,
-                vector->data + tail,
-                vector->head - vector->tail);
-      }
-      free(vector->data);
-      vector->data = data;
-      vector->size = size;
+   if (instance) {
+      vk_debug_report(&instance->debug_report_callbacks,
+                      VK_DEBUG_REPORT_ERROR_BIT_EXT,
+                      type,
+                      (uint64_t) (uintptr_t) object,
+                      line,
+                      0,
+                      "anv",
+                      report);
    }
 
-   assert(vector->head - vector->tail < vector->size);
-
-   offset = vector->head & (vector->size - 1);
-   vector->head += vector->element_size;
+   intel_loge("%s", report);
 
-   return vector->data + offset;
+   return error;
 }
 
-void *
-anv_vector_remove(struct anv_vector *vector)
+VkResult
+__vk_errorf(struct anv_instance *instance, const void *object,
+            VkDebugReportObjectTypeEXT type, VkResult error,
+            const char *file, int line, const char *format, ...)
 {
-   uint32_t offset;
-
-   if (vector->head == vector->tail)
-      return NULL;
-
-   assert(vector->head - vector->tail <= vector->size);
+   va_list ap;
 
-   offset = vector->tail & (vector->size - 1);
-   vector->tail += vector->element_size;
+   va_start(ap, format);
+   __vk_errorv(instance, object, type, error, file, line, format, ap);
+   va_end(ap);
 
-   return vector->data + offset;
+   return error;
 }