#pragma once
#include <volk.h>
#include <cstdint>
#include <cstdlib>
#include "core/globals.h"
#include "core/logger.h"
#define PNEXTCHAIN_DECLARE(next) const void **_pnxt = (const void **)&(next)
#define PNEXTCHAIN_APPEND_STRUCT(desc) \
do { \
*_pnxt = &(desc); \
_pnxt = (const void **)&(desc).pNext; \
} while (0)
namespace vk {
const char *vk_result_to_string(VkResult res);
static inline void chk(VkResult res, const char *what, const char *file, int line) {
if (res != VK_SUCCESS) {
const char *res_str = vk_result_to_string(res);
VEL_CRITICAL(
"\n--- VULKAN ERROR ---\n"
"Result: {} ({})\n"
"Call: {}\n"
"At: {}:{}\n"
"--------------------\n",
res_str,
static_cast<int>(res),
what,
file,
line
);
std::abort();
}
}
#define VK_CHECK(x) vk::chk((x), #x, __FILE__, __LINE__)
static inline VkDeviceOrHostAddressKHR device_address_to_vk(u64 addr) {
return VkDeviceOrHostAddressKHR{.deviceAddress = addr};
}
static inline VkDeviceOrHostAddressConstKHR device_address_const_to_vk(u64 addr) {
return VkDeviceOrHostAddressConstKHR{.deviceAddress = addr};
}
} // namespace vk