mirror of
https://github.com/Karaka-Management/cOMS.git
synced 2026-02-14 09:28:41 +00:00
continue vulkan impl.
This commit is contained in:
parent
ca139cd632
commit
73dfa96c6a
|
|
@ -54,15 +54,14 @@ void change_viewport(Window* w, int32 offset_x = 0, int32 offset_y = 0)
|
||||||
// @todo implement
|
// @todo implement
|
||||||
}
|
}
|
||||||
|
|
||||||
// @todo Implement logging of if() conditions
|
int32 vulkan_check_validation_layer_support(const char** validation_layers, uint32 validation_layer_count, RingMemory* ring) {
|
||||||
bool vulkan_check_validation_layer_support(const char** validation_layers, uint32 validation_layer_count, RingMemory* ring) {
|
|
||||||
uint32 layer_count;
|
uint32 layer_count;
|
||||||
vkEnumerateInstanceLayerProperties(&layer_count, NULL);
|
vkEnumerateInstanceLayerProperties(&layer_count, NULL);
|
||||||
|
|
||||||
VkLayerProperties* available_layers = (VkLayerProperties *) ring_get_memory(ring, layer_count * sizeof(VkLayerProperties));
|
VkLayerProperties* available_layers = (VkLayerProperties *) ring_get_memory(ring, layer_count * sizeof(VkLayerProperties));
|
||||||
vkEnumerateInstanceLayerProperties(&layer_count, available_layers);
|
vkEnumerateInstanceLayerProperties(&layer_count, available_layers);
|
||||||
|
|
||||||
for (uint32 i = 0; i < validation_layer_count; ++i) {
|
for (int32 i = 0; i < validation_layer_count; ++i) {
|
||||||
bool layerFound = false;
|
bool layerFound = false;
|
||||||
|
|
||||||
for (uint32 j = 0; j < layer_count; ++j) {
|
for (uint32 j = 0; j < layer_count; ++j) {
|
||||||
|
|
@ -73,20 +72,47 @@ bool vulkan_check_validation_layer_support(const char** validation_layers, uint3
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!layerFound) {
|
if (!layerFound) {
|
||||||
LOG_FORMAT("Vulkan ValidationLayer: %s\n", LOG_DATA_CHAR_STR, &validation_layers[i], true, true);
|
return -(i + 1);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32 vulkan_check_extension_support(const char** extensions, uint32 extension_count, RingMemory* ring) {
|
||||||
|
uint32 ext_count;
|
||||||
|
vkEnumerateInstanceExtensionProperties(NULL, &ext_count, NULL);
|
||||||
|
|
||||||
|
VkExtensionProperties* available_extensions = (VkExtensionProperties *) ring_get_memory(ring, ext_count * sizeof(VkExtensionProperties));
|
||||||
|
vkEnumerateInstanceExtensionProperties(NULL, &ext_count, available_extensions);
|
||||||
|
|
||||||
|
for (int32 i = 0; i < extension_count; ++i) {
|
||||||
|
bool layerFound = false;
|
||||||
|
|
||||||
|
for (uint32 j = 0; j < ext_count; ++j) {
|
||||||
|
if (strcmp(extensions[i], available_extensions[j].extensionName) == 0) {
|
||||||
|
layerFound = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!layerFound) {
|
||||||
|
return -(i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VKAPI_ATTR VkBool32 VKAPI_CALL vulkan_debug_callback(
|
static VKAPI_ATTR VkBool32 VKAPI_CALL vulkan_debug_callback(
|
||||||
VkDebugUtilsMessageSeverityFlagBitsEXT, VkDebugUtilsMessageTypeFlagsEXT,
|
VkDebugUtilsMessageSeverityFlagBitsEXT severity, VkDebugUtilsMessageTypeFlagsEXT,
|
||||||
const VkDebugUtilsMessengerCallbackDataEXT* debug_callback_data, void*
|
const VkDebugUtilsMessengerCallbackDataEXT* debug_callback_data, void*
|
||||||
) {
|
) {
|
||||||
LOG(debug_callback_data->pMessage, true, true);
|
if ((severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT)
|
||||||
ASSERT_SIMPLE(false);
|
|| (severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT)
|
||||||
|
) {
|
||||||
|
LOG(debug_callback_data->pMessage, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
return VK_FALSE;
|
return VK_FALSE;
|
||||||
}
|
}
|
||||||
|
|
@ -128,9 +154,18 @@ void vulkan_instance_create(
|
||||||
const char** validation_layers = NULL, uint32 validation_layer_count = 0,
|
const char** validation_layers = NULL, uint32 validation_layer_count = 0,
|
||||||
RingMemory* ring = NULL
|
RingMemory* ring = NULL
|
||||||
) {
|
) {
|
||||||
|
int32 err;
|
||||||
if (validation_layer_count
|
if (validation_layer_count
|
||||||
&& !vulkan_check_validation_layer_support(validation_layers, validation_layer_count, ring)
|
&& (err = vulkan_check_validation_layer_support(validation_layers, validation_layer_count, ring))
|
||||||
) {
|
) {
|
||||||
|
LOG_FORMAT("Vulkan validation_layer missing: %d\n", LOG_DATA_CHAR_STR, (void *) validation_layers[-err - 1], true, true);
|
||||||
|
ASSERT_SIMPLE(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extension_count
|
||||||
|
&& (err = vulkan_check_extension_support(extensions, extension_count, ring))
|
||||||
|
) {
|
||||||
|
LOG_FORMAT("Vulkan extension missing: %d\n", LOG_DATA_CHAR_STR, (void *) extensions[-err - 1], true, true);
|
||||||
ASSERT_SIMPLE(false);
|
ASSERT_SIMPLE(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -145,7 +180,7 @@ void vulkan_instance_create(
|
||||||
VkInstanceCreateInfo create_info = {};
|
VkInstanceCreateInfo create_info = {};
|
||||||
create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
||||||
create_info.pApplicationInfo = &app_info;
|
create_info.pApplicationInfo = &app_info;
|
||||||
|
//create_info.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
|
||||||
create_info.enabledExtensionCount = extension_count;
|
create_info.enabledExtensionCount = extension_count;
|
||||||
create_info.ppEnabledExtensionNames = extensions;
|
create_info.ppEnabledExtensionNames = extensions;
|
||||||
|
|
||||||
|
|
@ -199,7 +234,6 @@ bool vulkan_device_supports_extensions(VkPhysicalDevice device, const char** dev
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
LOG_FORMAT("Vulkan DeviceExtensions: %s\n", LOG_DATA_CHAR_STR, &device_extensions[i], true, true);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -207,6 +241,24 @@ bool vulkan_device_supports_extensions(VkPhysicalDevice device, const char** dev
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @todo Allow to fill array
|
||||||
|
void vulkan_available_layers(RingMemory* ring) {
|
||||||
|
uint32 layer_count;
|
||||||
|
vkEnumerateInstanceLayerProperties(&layer_count, NULL);
|
||||||
|
|
||||||
|
VkLayerProperties* available_layers = (VkLayerProperties *) ring_get_memory(ring, layer_count * sizeof(VkLayerProperties));
|
||||||
|
vkEnumerateInstanceLayerProperties(&layer_count, available_layers);
|
||||||
|
}
|
||||||
|
|
||||||
|
// @todo Allow to fill array
|
||||||
|
void vulkan_available_extensions(RingMemory* ring) {
|
||||||
|
uint32 extension_count;
|
||||||
|
vkEnumerateInstanceExtensionProperties(NULL, &extension_count, NULL);
|
||||||
|
|
||||||
|
VkExtensionProperties* available_extensions = (VkExtensionProperties *) ring_get_memory(ring, extension_count * sizeof(VkExtensionProperties));
|
||||||
|
vkEnumerateInstanceExtensionProperties(NULL, &extension_count, available_extensions);
|
||||||
|
}
|
||||||
|
|
||||||
VulkanQueueFamilyIndices vulkan_find_queue_families(VkPhysicalDevice physical_device, VkSurfaceKHR surface, RingMemory* ring)
|
VulkanQueueFamilyIndices vulkan_find_queue_families(VkPhysicalDevice physical_device, VkSurfaceKHR surface, RingMemory* ring)
|
||||||
{
|
{
|
||||||
VulkanQueueFamilyIndices indices = {};
|
VulkanQueueFamilyIndices indices = {};
|
||||||
|
|
@ -350,10 +402,10 @@ void gpuapi_create_logical_device(
|
||||||
|
|
||||||
// WARNING: swapchain_images needs to already have reserved enough memory
|
// WARNING: swapchain_images needs to already have reserved enough memory
|
||||||
// @todo How can we ensure swapchain_images has enough but not too much space?
|
// @todo How can we ensure swapchain_images has enough but not too much space?
|
||||||
|
// @question Do we need to handle old swapchains?
|
||||||
void vulkan_swap_chain_create(
|
void vulkan_swap_chain_create(
|
||||||
VkDevice device, VkPhysicalDevice physical_device, VkSurfaceKHR surface,
|
VkDevice device, VkPhysicalDevice physical_device, VkSurfaceKHR surface,
|
||||||
VkSwapchainKHR* swapchain, VkImage* swapchain_images, uint32* swapchain_image_count,
|
VkSwapchainKHR* swapchain, VkFormat* swapchain_image_format, VkExtent2D* swapchain_extent,
|
||||||
VkFormat* swapchain_image_format, VkExtent2D* swapchain_extent,
|
|
||||||
Window* window, RingMemory* ring
|
Window* window, RingMemory* ring
|
||||||
) {
|
) {
|
||||||
VulkanSwapChainSupportDetails swap_chain_support = vulkan_query_swap_chain_support(physical_device, surface, ring);
|
VulkanSwapChainSupportDetails swap_chain_support = vulkan_query_swap_chain_support(physical_device, surface, ring);
|
||||||
|
|
@ -364,13 +416,16 @@ void vulkan_swap_chain_create(
|
||||||
&& swap_chain_support.formats[i].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR
|
&& swap_chain_support.formats[i].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR
|
||||||
) {
|
) {
|
||||||
surface_format = &swap_chain_support.formats[i];
|
surface_format = &swap_chain_support.formats[i];
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @todo switch from VK_PRESENT_MODE_MAILBOX_KHR to VK_PRESENT_MODE_FIFO_KHR
|
||||||
VkPresentModeKHR present_mode = VK_PRESENT_MODE_FIFO_KHR;
|
VkPresentModeKHR present_mode = VK_PRESENT_MODE_FIFO_KHR;
|
||||||
for (int32 i = 0; i < swap_chain_support.present_mode_size; ++i) {
|
for (int32 i = 0; i < swap_chain_support.present_mode_size; ++i) {
|
||||||
if (swap_chain_support.present_modes[i] == VK_PRESENT_MODE_MAILBOX_KHR) {
|
if (swap_chain_support.present_modes[i] == VK_PRESENT_MODE_MAILBOX_KHR) {
|
||||||
present_mode = swap_chain_support.present_modes[i];
|
present_mode = swap_chain_support.present_modes[i];
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -398,6 +453,8 @@ void vulkan_swap_chain_create(
|
||||||
}
|
}
|
||||||
|
|
||||||
VkSwapchainCreateInfoKHR create_info = {};
|
VkSwapchainCreateInfoKHR create_info = {};
|
||||||
|
create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
|
||||||
|
create_info.surface = surface;
|
||||||
create_info.minImageCount = image_count;
|
create_info.minImageCount = image_count;
|
||||||
create_info.imageFormat = surface_format->format;
|
create_info.imageFormat = surface_format->format;
|
||||||
create_info.imageColorSpace = surface_format->colorSpace;
|
create_info.imageColorSpace = surface_format->colorSpace;
|
||||||
|
|
@ -427,12 +484,21 @@ void vulkan_swap_chain_create(
|
||||||
ASSERT_SIMPLE(false);
|
ASSERT_SIMPLE(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
vkGetSwapchainImagesKHR(device, *swapchain, swapchain_image_count, NULL);
|
|
||||||
vkGetSwapchainImagesKHR(device, *swapchain, swapchain_image_count, swapchain_images);
|
|
||||||
|
|
||||||
memcpy(swapchain_image_format, &surface_format->format, sizeof(VkFormat));
|
memcpy(swapchain_image_format, &surface_format->format, sizeof(VkFormat));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vulkan_swap_chain_images_create(
|
||||||
|
VkDevice device, VkSwapchainKHR swapchain,
|
||||||
|
VkImage** swapchain_images, uint32* swapchain_image_count,
|
||||||
|
BufferMemory* buf
|
||||||
|
) {
|
||||||
|
vkGetSwapchainImagesKHR(device, swapchain, swapchain_image_count, NULL);
|
||||||
|
// @question Do we really want to allocate in here or should that be done by the caller
|
||||||
|
*swapchain_images = (VkImage *) buffer_get_memory(buf, *swapchain_image_count * sizeof(VkImage), 4);
|
||||||
|
|
||||||
|
vkGetSwapchainImagesKHR(device, swapchain, swapchain_image_count, *swapchain_images);
|
||||||
|
}
|
||||||
|
|
||||||
void vulkan_image_views_create(
|
void vulkan_image_views_create(
|
||||||
VkDevice device, VkImageView* swapchain_image_views,
|
VkDevice device, VkImageView* swapchain_image_views,
|
||||||
VkImage* swapchain_images, uint32 swapchain_image_count, VkFormat swapchain_image_format
|
VkImage* swapchain_images, uint32 swapchain_image_count, VkFormat swapchain_image_format
|
||||||
|
|
|
||||||
|
|
@ -343,7 +343,7 @@ void log(const char* str, bool should_log, bool save, const char* file, const ch
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t str_len = strlen(str);
|
size_t str_len = OMS_MIN(strlen(str), MAX_LOG_LENGTH - 128);
|
||||||
size_t file_len = strlen(file);
|
size_t file_len = strlen(file);
|
||||||
size_t function_len = strlen(function);
|
size_t function_len = strlen(function);
|
||||||
|
|
||||||
|
|
@ -370,8 +370,6 @@ void log(const char* str, bool should_log, bool save, const char* file, const ch
|
||||||
if (save || debug_container->log_memory.size - debug_container->log_memory.pos < MAX_LOG_LENGTH) {
|
if (save || debug_container->log_memory.size - debug_container->log_memory.pos < MAX_LOG_LENGTH) {
|
||||||
log_to_file();
|
log_to_file();
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT_SIMPLE(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void log(const char* format, LogDataType data_type, void* data, bool should_log, bool save, const char* file, const char* function, int32 line)
|
void log(const char* format, LogDataType data_type, void* data, bool should_log, bool save, const char* file, const char* function, int32 line)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user