|
@@ -35,9 +35,10 @@ typedef struct {
|
|
|
u32 width;
|
|
|
u32 height;
|
|
|
} VulkanData;
|
|
|
+
|
|
|
static VulkanData vk = {0};
|
|
|
|
|
|
-#define VK_ERROR_CASE(error) \
|
|
|
+#define VK_ERROR_CASE(error) \
|
|
|
case error: return #error
|
|
|
|
|
|
static const char* getVulkanErrorString(VkResult r) {
|
|
@@ -52,15 +53,15 @@ static const char* getVulkanErrorString(VkResult r) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#define VK_ASSERT(a) \
|
|
|
- do { \
|
|
|
- VkResult vkResult = (a); \
|
|
|
- if(vkResult != VK_SUCCESS) { \
|
|
|
- printf("Vulkan error at [%s:%d]: %s\n", \
|
|
|
- getShortFileName(__FILE__), __LINE__, \
|
|
|
- getVulkanErrorString(vkResult)); \
|
|
|
- return true; \
|
|
|
- } \
|
|
|
+#define VK_ASSERT(a) \
|
|
|
+ do { \
|
|
|
+ VkResult vkResult = (a); \
|
|
|
+ if(vkResult != VK_SUCCESS) { \
|
|
|
+ printf( \
|
|
|
+ "Vulkan error at [%s:%d]: %s\n", getShortFileName(__FILE__), \
|
|
|
+ __LINE__, getVulkanErrorString(vkResult)); \
|
|
|
+ return true; \
|
|
|
+ } \
|
|
|
} while(false)
|
|
|
|
|
|
static PFN_vkVoidFunction getVulkanFunction(const char* name) {
|
|
@@ -69,13 +70,18 @@ static PFN_vkVoidFunction getVulkanFunction(const char* name) {
|
|
|
|
|
|
#define GET_VULKAN_FUNCTION(name) ((PFN_##name)getVulkanFunction(#name))
|
|
|
|
|
|
+static int64_t someData[] = {10'000, 2, 3, 4, 5,
|
|
|
+ 6, 0xFFFF'FFFF, 'a', 0b1000'0001};
|
|
|
+
|
|
|
static bool initInstance() {
|
|
|
- VkApplicationInfo i = {.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
|
|
|
- .pApplicationName = "Vulkan",
|
|
|
- .applicationVersion = VK_MAKE_VERSION(1, 0, 0),
|
|
|
- .pEngineName = "Kajetan",
|
|
|
- .engineVersion = VK_MAKE_VERSION(0, 0, 1),
|
|
|
- .apiVersion = VK_API_VERSION_1_1};
|
|
|
+ (void)someData; // gusi
|
|
|
+ VkApplicationInfo i = {
|
|
|
+ .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
|
|
|
+ .pApplicationName = "Vulkan",
|
|
|
+ .applicationVersion = VK_MAKE_VERSION(1, 0, 0),
|
|
|
+ .pEngineName = "Kajetan",
|
|
|
+ .engineVersion = VK_MAKE_VERSION(0, 0, 1),
|
|
|
+ .apiVersion = VK_API_VERSION_1_1};
|
|
|
VkInstanceCreateInfo ci = {
|
|
|
.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
|
|
|
.pApplicationInfo = &i,
|
|
@@ -115,9 +121,9 @@ static bool initDebugMessenger() {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-static VKAPI_ATTR VkBool32 onVulkanDebugReport
|
|
|
-VKAPI_CALL(VkDebugReportFlagsEXT, VkDebugReportObjectTypeEXT, uint64_t, size_t,
|
|
|
- int32_t, const char* pLayerPrefix, const char* pMessage, void*) {
|
|
|
+static VKAPI_ATTR VkBool32 onVulkanDebugReport VKAPI_CALL(
|
|
|
+ VkDebugReportFlagsEXT, VkDebugReportObjectTypeEXT, uint64_t, size_t,
|
|
|
+ int32_t, const char* pLayerPrefix, const char* pMessage, void*) {
|
|
|
LOG_WARNING("Vulkan debug message '%s': %s", pLayerPrefix, pMessage);
|
|
|
return false;
|
|
|
}
|
|
@@ -238,8 +244,8 @@ static bool initDevice() {
|
|
|
.ppEnabledExtensionNames =
|
|
|
(const char*[]){VK_KHR_SWAPCHAIN_EXTENSION_NAME},
|
|
|
.pEnabledFeatures = &deviceFeatures};
|
|
|
- VK_ASSERT(vkCreateDevice(vk.physicalDevice, &deviceCreateInfo, nullptr,
|
|
|
- &vk.device));
|
|
|
+ VK_ASSERT(vkCreateDevice(
|
|
|
+ vk.physicalDevice, &deviceCreateInfo, nullptr, &vk.device));
|
|
|
vkGetDeviceQueue(vk.device, vk.graphicsFamily, 0, &vk.graphicsQueue);
|
|
|
if(vk.graphicsQueue == VK_NULL_HANDLE) {
|
|
|
LOG_ERROR("Cannot get device graphics queue");
|
|
@@ -249,8 +255,8 @@ static bool initDevice() {
|
|
|
}
|
|
|
|
|
|
static bool initSurface() {
|
|
|
- VK_ASSERT(glfwCreateWindowSurface(vk.instance, getWindow(), nullptr,
|
|
|
- &vk.surface));
|
|
|
+ VK_ASSERT(glfwCreateWindowSurface(
|
|
|
+ vk.instance, getWindow(), nullptr, &vk.surface));
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -266,11 +272,11 @@ static u32 getSwapImageCount(const VkSurfaceCapabilitiesKHR* caps) {
|
|
|
|
|
|
static bool getSurfaceFormat(VkSurfaceFormatKHR* sf) {
|
|
|
u32 c = 0;
|
|
|
- VK_ASSERT(vkGetPhysicalDeviceSurfaceFormatsKHR(vk.physicalDevice,
|
|
|
- vk.surface, &c, nullptr));
|
|
|
+ VK_ASSERT(vkGetPhysicalDeviceSurfaceFormatsKHR(
|
|
|
+ vk.physicalDevice, vk.surface, &c, nullptr));
|
|
|
VkSurfaceFormatKHR* formats = coreAllocate(sizeof(VkSurfaceFormatKHR) * c);
|
|
|
- VK_ASSERT(vkGetPhysicalDeviceSurfaceFormatsKHR(vk.physicalDevice,
|
|
|
- vk.surface, &c, formats));
|
|
|
+ VK_ASSERT(vkGetPhysicalDeviceSurfaceFormatsKHR(
|
|
|
+ vk.physicalDevice, vk.surface, &c, formats));
|
|
|
for(u32 i = 0; i < c; i++) {
|
|
|
if(formats[i].format == VK_FORMAT_B8G8R8A8_UNORM &&
|
|
|
formats[i].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) {
|
|
@@ -289,8 +295,8 @@ static bool getPresentMode(VkPresentModeKHR* pm) {
|
|
|
VK_ASSERT(vkGetPhysicalDeviceSurfacePresentModesKHR(
|
|
|
vk.physicalDevice, vk.surface, &c, nullptr));
|
|
|
VkPresentModeKHR* modes = coreAllocate(sizeof(VkPresentModeKHR) * c);
|
|
|
- VK_ASSERT(vkGetPhysicalDeviceSurfacePresentModesKHR(vk.physicalDevice,
|
|
|
- vk.surface, &c, modes));
|
|
|
+ VK_ASSERT(vkGetPhysicalDeviceSurfacePresentModesKHR(
|
|
|
+ vk.physicalDevice, vk.surface, &c, modes));
|
|
|
for(u32 i = 0; i < c; i++) {
|
|
|
if(modes[i] == VK_PRESENT_MODE_MAILBOX_KHR) {
|
|
|
*pm = modes[i];
|
|
@@ -305,8 +311,8 @@ static bool getPresentMode(VkPresentModeKHR* pm) {
|
|
|
|
|
|
static bool initSwapchain() {
|
|
|
VkSurfaceCapabilitiesKHR caps = {0};
|
|
|
- VK_ASSERT(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(vk.physicalDevice,
|
|
|
- vk.surface, &caps));
|
|
|
+ VK_ASSERT(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
|
|
|
+ vk.physicalDevice, vk.surface, &caps));
|
|
|
VkSurfaceFormatKHR sf = {0};
|
|
|
if(getSurfaceFormat(&sf)) {
|
|
|
return true;
|
|
@@ -345,11 +351,12 @@ static bool createImageView(VkImage image, VkImageView* view) {
|
|
|
.image = image,
|
|
|
.viewType = VK_IMAGE_VIEW_TYPE_2D,
|
|
|
.format = VK_FORMAT_B8G8R8A8_UNORM,
|
|
|
- .subresourceRange = {.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
|
|
|
- .baseMipLevel = 0,
|
|
|
- .levelCount = 1,
|
|
|
- .baseArrayLayer = 0,
|
|
|
- .layerCount = 1}};
|
|
|
+ .subresourceRange = {
|
|
|
+ .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
|
|
|
+ .baseMipLevel = 0,
|
|
|
+ .levelCount = 1,
|
|
|
+ .baseArrayLayer = 0,
|
|
|
+ .layerCount = 1}};
|
|
|
VK_ASSERT(vkCreateImageView(vk.device, &info, nullptr, view));
|
|
|
return false;
|
|
|
}
|
|
@@ -370,11 +377,11 @@ static bool initSwapchainImages() {
|
|
|
vk.swapchain.amount = c;
|
|
|
vk.swapchain.images = coreAllocate(sizeof(VkImage) * c);
|
|
|
vk.swapchain.imageViews = coreZeroAllocate(sizeof(VkImageView) * c);
|
|
|
- VK_ASSERT(vkGetSwapchainImagesKHR(vk.device, vk.swapchain.handle, &c,
|
|
|
- vk.swapchain.images));
|
|
|
+ VK_ASSERT(vkGetSwapchainImagesKHR(
|
|
|
+ vk.device, vk.swapchain.handle, &c, vk.swapchain.images));
|
|
|
for(u32 x = 0; x < c; x++) {
|
|
|
- if(createImageView(vk.swapchain.images[x],
|
|
|
- vk.swapchain.imageViews + x)) {
|
|
|
+ if(createImageView(
|
|
|
+ vk.swapchain.images[x], vk.swapchain.imageViews + x)) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
@@ -382,8 +389,8 @@ static bool initSwapchainImages() {
|
|
|
}
|
|
|
|
|
|
static bool initSemaphore(VkSemaphore* s) {
|
|
|
- VkSemaphoreCreateInfo info = {.sType =
|
|
|
- VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO};
|
|
|
+ VkSemaphoreCreateInfo info = {
|
|
|
+ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO};
|
|
|
VK_ASSERT(vkCreateSemaphore(vk.device, &info, nullptr, s));
|
|
|
return false;
|
|
|
}
|
|
@@ -407,8 +414,8 @@ static bool initCommandBuffers() {
|
|
|
VkCommandPoolCreateInfo info = {
|
|
|
.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
|
|
|
.queueFamilyIndex = vk.graphicsFamily};
|
|
|
- VK_ASSERT(vkCreateCommandPool(vk.device, &info, nullptr,
|
|
|
- &vk.swapchain.commandPool));
|
|
|
+ VK_ASSERT(vkCreateCommandPool(
|
|
|
+ vk.device, &info, nullptr, &vk.swapchain.commandPool));
|
|
|
vk.swapchain.commandsBuffers =
|
|
|
coreAllocate(sizeof(VkCommandBuffer) * vk.swapchain.amount);
|
|
|
VkCommandBufferAllocateInfo a = {
|
|
@@ -423,8 +430,9 @@ static bool initCommandBuffers() {
|
|
|
|
|
|
static void destroyCommandBuffers() {
|
|
|
if(vk.swapchain.commandPool != VK_NULL_HANDLE && vk.swapchain.amount > 0) {
|
|
|
- vkFreeCommandBuffers(vk.device, vk.swapchain.commandPool,
|
|
|
- vk.swapchain.amount, vk.swapchain.commandsBuffers);
|
|
|
+ vkFreeCommandBuffers(
|
|
|
+ vk.device, vk.swapchain.commandPool, vk.swapchain.amount,
|
|
|
+ vk.swapchain.commandsBuffers);
|
|
|
}
|
|
|
coreFree(vk.swapchain.commandsBuffers);
|
|
|
vkDestroyCommandPool(vk.device, vk.swapchain.commandPool, nullptr);
|
|
@@ -442,10 +450,10 @@ static bool initRenderPass() {
|
|
|
.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR};
|
|
|
VkAttachmentReference ca = {
|
|
|
.attachment = 0, .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
|
|
|
- VkSubpassDescription subpass = {.pipelineBindPoint =
|
|
|
- VK_PIPELINE_BIND_POINT_GRAPHICS,
|
|
|
- .colorAttachmentCount = 1,
|
|
|
- .pColorAttachments = &ca};
|
|
|
+ VkSubpassDescription subpass = {
|
|
|
+ .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,
|
|
|
+ .colorAttachmentCount = 1,
|
|
|
+ .pColorAttachments = &ca};
|
|
|
VkRenderPassCreateInfo info = {
|
|
|
.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
|
|
|
.attachmentCount = 1,
|
|
@@ -468,8 +476,8 @@ static bool initFramebuffers() {
|
|
|
.width = vk.width,
|
|
|
.height = vk.height,
|
|
|
.layers = 1};
|
|
|
- VK_ASSERT(vkCreateFramebuffer(vk.device, &info, nullptr,
|
|
|
- vk.swapchain.framebuffers + i));
|
|
|
+ VK_ASSERT(vkCreateFramebuffer(
|
|
|
+ vk.device, &info, nullptr, vk.swapchain.framebuffers + i));
|
|
|
}
|
|
|
printf("%u\n", vk.swapchain.amount);
|
|
|
return false;
|