diff --git a/HelloTriangleApplication.cpp b/HelloTriangleApplication.cpp index 5123d3d..732ad87 100644 --- a/HelloTriangleApplication.cpp +++ b/HelloTriangleApplication.cpp @@ -98,4 +98,114 @@ VkShaderModule HelloTriangleApplication::createShaderModule(const std::vector queueFamilies(queueFamilyCount); + vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data()); + + int i = 0; + for (const auto &queueFamily : queueFamilies) + { + if (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) + { + indices.graphicsFamily = i; + } + + VkBool32 presentSupport = false; + vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport); + + if (presentSupport) + { + indices.presentFamily = i; + } + + if (indices.isComplete()) + { + break; + } + + i++; + } + + return indices; +} + +std::vector HelloTriangleApplication::getRequiredExtensions() +{ + uint32_t glfwExtensionCount = 0; + const char **glfwExtensions; + glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount); + + std::vector extensions(glfwExtensions, glfwExtensions + glfwExtensionCount); + + if (enableValidationLayers) + { + extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + } + + return extensions; +} + +bool HelloTriangleApplication::checkValidationLayerSupport() +{ + uint32_t layerCount; + vkEnumerateInstanceLayerProperties(&layerCount, nullptr); + + std::vector availableLayers(layerCount); + vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data()); + + for (const char *layerName : validationLayers) + { + bool layerFound = false; + + for (const auto &layerProperties : availableLayers) + { + if (strcmp(layerName, layerProperties.layerName) == 0) + { + layerFound = true; + break; + } + } + + if (!layerFound) + { + return false; + } + } + + return true; +} + + +std::vector HelloTriangleApplication::readFile(const std::string& filename) { + std::ifstream file(filename, std::ios::ate | std::ios::binary); + + if (!file.is_open()) { + throw std::runtime_error("failed to open file!"); + } + + size_t fileSize = (size_t) file.tellg(); + std::vector buffer(fileSize); + + file.seekg(0); + file.read(buffer.data(), fileSize); + + file.close(); + + return buffer; +} + +VKAPI_ATTR VkBool32 VKAPI_CALL HelloTriangleApplication::debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData) +{ + std::cerr << "validation layer: " << pCallbackData->pMessage << std::endl; + + return VK_FALSE; } \ No newline at end of file diff --git a/PhysicalDevice.cpp b/PhysicalDevice.cpp index 29937dc..0793eb6 100644 --- a/PhysicalDevice.cpp +++ b/PhysicalDevice.cpp @@ -40,4 +40,20 @@ bool HelloTriangleApplication::isDeviceSuitable(VkPhysicalDevice device) { } return indices.isComplete() && extensionsSupported && swapChainAdequate; +} + +bool HelloTriangleApplication::checkDeviceExtensionSupport(VkPhysicalDevice device) { + uint32_t extensionCount; + vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, nullptr); + + std::vector availableExtensions(extensionCount); + vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, availableExtensions.data()); + + std::set requiredExtensions(deviceExtensions.begin(), deviceExtensions.end()); + + for (const auto& extension : availableExtensions) { + requiredExtensions.erase(extension.extensionName); + } + + return requiredExtensions.empty(); } \ No newline at end of file diff --git a/main.cpp b/main.cpp index bf6e044..e84514a 100644 --- a/main.cpp +++ b/main.cpp @@ -1,5 +1,6 @@ #include "HelloTriangleApplication.h" + int main() { HelloTriangleApplication app;