utils.h

cross platform rendering playground

src/backend/vulkan/utils.h

1.6 KB
#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