Properly choose swapchain format
This commit is contained in:
parent
c6fd8e49c9
commit
0568c6e5d2
1 changed files with 72 additions and 72 deletions
144
src/renderer.cpp
144
src/renderer.cpp
|
@ -18,25 +18,25 @@ Renderer::Renderer() {
|
||||||
createLogicalDevice();
|
createLogicalDevice();
|
||||||
createCommandPool();
|
createCommandPool();
|
||||||
createPresentationRenderPass();
|
createPresentationRenderPass();
|
||||||
|
|
||||||
worldPass_ = new WorldPass(*this);
|
worldPass_ = new WorldPass(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Renderer::~Renderer() {
|
Renderer::~Renderer() {
|
||||||
vkDeviceWaitIdle(device_);
|
vkDeviceWaitIdle(device_);
|
||||||
|
|
||||||
delete worldPass_;
|
delete worldPass_;
|
||||||
|
|
||||||
vkDestroyRenderPass(device_, presentationRenderPass_, nullptr);
|
vkDestroyRenderPass(device_, presentationRenderPass_, nullptr);
|
||||||
|
|
||||||
vkDestroyCommandPool(device_, commandPool_, nullptr);
|
vkDestroyCommandPool(device_, commandPool_, nullptr);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
destroyMessenger_(instance_, messenger_, nullptr);
|
destroyMessenger_(instance_, messenger_, nullptr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
vkDestroyDevice(device_, nullptr);
|
vkDestroyDevice(device_, nullptr);
|
||||||
|
|
||||||
vkDestroyInstance(instance_, nullptr);
|
vkDestroyInstance(instance_, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ void Renderer::render(RenderTarget* target) {
|
||||||
|
|
||||||
vkWaitForFences(device_, 1, &target->fences[imageIndex], true, UINT64_MAX);
|
vkWaitForFences(device_, 1, &target->fences[imageIndex], true, UINT64_MAX);
|
||||||
vkResetFences(device_, 1, &target->fences[imageIndex]);
|
vkResetFences(device_, 1, &target->fences[imageIndex]);
|
||||||
|
|
||||||
const VkCommandBuffer commandBuffer = target->commandBuffers[imageIndex];
|
const VkCommandBuffer commandBuffer = target->commandBuffers[imageIndex];
|
||||||
|
|
||||||
VkCommandBufferBeginInfo beginInfo = {};
|
VkCommandBufferBeginInfo beginInfo = {};
|
||||||
|
@ -58,14 +58,14 @@ void Renderer::render(RenderTarget* target) {
|
||||||
viewport.width = target->extent.width;
|
viewport.width = target->extent.width;
|
||||||
viewport.height = target->extent.height;
|
viewport.height = target->extent.height;
|
||||||
viewport.maxDepth = 1.0f;
|
viewport.maxDepth = 1.0f;
|
||||||
|
|
||||||
vkCmdSetViewport(commandBuffer, 0, 1, &viewport);
|
vkCmdSetViewport(commandBuffer, 0, 1, &viewport);
|
||||||
|
|
||||||
VkRect2D scissor = {};
|
VkRect2D scissor = {};
|
||||||
scissor.extent = target->extent;
|
scissor.extent = target->extent;
|
||||||
|
|
||||||
vkCmdSetScissor(commandBuffer, 0, 1, &scissor);
|
vkCmdSetScissor(commandBuffer, 0, 1, &scissor);
|
||||||
|
|
||||||
VkClearValue clearColor = {};
|
VkClearValue clearColor = {};
|
||||||
clearColor.color.float32[0] = sin((platform::getTime() / 500.0f) * 0.2f) * 0.5f + 0.5f;
|
clearColor.color.float32[0] = sin((platform::getTime() / 500.0f) * 0.2f) * 0.5f + 0.5f;
|
||||||
clearColor.color.float32[1] = sin((platform::getTime() / 500.0f) * 0.4f) * 0.5f + 0.5f;
|
clearColor.color.float32[1] = sin((platform::getTime() / 500.0f) * 0.4f) * 0.5f + 0.5f;
|
||||||
|
@ -80,15 +80,15 @@ void Renderer::render(RenderTarget* target) {
|
||||||
renderPassBeginInfo.pClearValues = &clearColor;
|
renderPassBeginInfo.pClearValues = &clearColor;
|
||||||
|
|
||||||
vkCmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
|
vkCmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
|
||||||
|
|
||||||
worldPass_->render(commandBuffer);
|
worldPass_->render(commandBuffer);
|
||||||
|
|
||||||
vkCmdEndRenderPass(commandBuffer);
|
vkCmdEndRenderPass(commandBuffer);
|
||||||
|
|
||||||
vkEndCommandBuffer(commandBuffer);
|
vkEndCommandBuffer(commandBuffer);
|
||||||
|
|
||||||
const VkPipelineStageFlags waitStage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
const VkPipelineStageFlags waitStage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||||
|
|
||||||
VkSubmitInfo submitInfo = {};
|
VkSubmitInfo submitInfo = {};
|
||||||
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
|
||||||
submitInfo.waitSemaphoreCount = 1;
|
submitInfo.waitSemaphoreCount = 1;
|
||||||
|
@ -100,7 +100,7 @@ void Renderer::render(RenderTarget* target) {
|
||||||
submitInfo.pSignalSemaphores = &target->renderFinishedSemaphore;
|
submitInfo.pSignalSemaphores = &target->renderFinishedSemaphore;
|
||||||
|
|
||||||
vkQueueSubmit(graphicsQueue_, 1, &submitInfo, target->fences[imageIndex]);
|
vkQueueSubmit(graphicsQueue_, 1, &submitInfo, target->fences[imageIndex]);
|
||||||
|
|
||||||
VkPresentInfoKHR presentInfo = {};
|
VkPresentInfoKHR presentInfo = {};
|
||||||
presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
||||||
presentInfo.waitSemaphoreCount = 1;
|
presentInfo.waitSemaphoreCount = 1;
|
||||||
|
@ -114,30 +114,30 @@ void Renderer::render(RenderTarget* target) {
|
||||||
|
|
||||||
RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTarget* oldTarget) {
|
RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTarget* oldTarget) {
|
||||||
vkDeviceWaitIdle(device_);
|
vkDeviceWaitIdle(device_);
|
||||||
|
|
||||||
RenderTarget* target = new RenderTarget();
|
RenderTarget* target = new RenderTarget();
|
||||||
target->surface = surface;
|
target->surface = surface;
|
||||||
|
|
||||||
VkSurfaceCapabilitiesKHR surfaceCapabilities = {};
|
VkSurfaceCapabilitiesKHR surfaceCapabilities = {};
|
||||||
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice_, surface, &surfaceCapabilities);
|
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice_, surface, &surfaceCapabilities);
|
||||||
|
|
||||||
target->extent = surfaceCapabilities.currentExtent;
|
target->extent = surfaceCapabilities.currentExtent;
|
||||||
|
|
||||||
uint32_t surfaceFormatCount = 0;
|
uint32_t surfaceFormatCount = 0;
|
||||||
vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice_, surface, &surfaceFormatCount, nullptr);
|
vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice_, surface, &surfaceFormatCount, nullptr);
|
||||||
|
|
||||||
VkSurfaceFormatKHR* surfaceFormats = new VkSurfaceFormatKHR[surfaceFormatCount];
|
VkSurfaceFormatKHR* surfaceFormats = new VkSurfaceFormatKHR[surfaceFormatCount];
|
||||||
vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice_, surface, &surfaceFormatCount, surfaceFormats);
|
vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice_, surface, &surfaceFormatCount, surfaceFormats);
|
||||||
|
|
||||||
uint32_t chosenFormat = 0;
|
uint32_t chosenFormat = 0;
|
||||||
for(uint32_t i = 0; i < surfaceFormatCount; i++) {
|
for(uint32_t i = 0; i < surfaceFormatCount; i++) {
|
||||||
if(surfaceFormats[i].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR)
|
if(surfaceFormats[i].format == VK_FORMAT_R8G8B8_SRGB)
|
||||||
chosenFormat = i;
|
chosenFormat = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
VkBool32 supported = false;
|
VkBool32 supported = false;
|
||||||
vkGetPhysicalDeviceSurfaceSupportKHR(physicalDevice_, queueIndices.presentation, surface, &supported);
|
vkGetPhysicalDeviceSurfaceSupportKHR(physicalDevice_, queueIndices.presentation, surface, &supported);
|
||||||
|
|
||||||
VkSwapchainCreateInfoKHR swapchainCreateInfo = {};
|
VkSwapchainCreateInfoKHR swapchainCreateInfo = {};
|
||||||
swapchainCreateInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
|
swapchainCreateInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
|
||||||
swapchainCreateInfo.surface = surface;
|
swapchainCreateInfo.surface = surface;
|
||||||
|
@ -156,22 +156,22 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa
|
||||||
|
|
||||||
if(oldTarget)
|
if(oldTarget)
|
||||||
swapchainCreateInfo.oldSwapchain = oldTarget->swapchain;
|
swapchainCreateInfo.oldSwapchain = oldTarget->swapchain;
|
||||||
|
|
||||||
vkCreateSwapchainKHR(device_, &swapchainCreateInfo, nullptr, &target->swapchain);
|
vkCreateSwapchainKHR(device_, &swapchainCreateInfo, nullptr, &target->swapchain);
|
||||||
|
|
||||||
if(oldTarget)
|
if(oldTarget)
|
||||||
destroyRenderTarget(oldTarget);
|
destroyRenderTarget(oldTarget);
|
||||||
|
|
||||||
delete[] surfaceFormats;
|
delete[] surfaceFormats;
|
||||||
|
|
||||||
uint32_t swapchainImageCount = 0;
|
uint32_t swapchainImageCount = 0;
|
||||||
vkGetSwapchainImagesKHR(device_, target->swapchain, &swapchainImageCount, nullptr);
|
vkGetSwapchainImagesKHR(device_, target->swapchain, &swapchainImageCount, nullptr);
|
||||||
|
|
||||||
target->numImages = swapchainImageCount;
|
target->numImages = swapchainImageCount;
|
||||||
|
|
||||||
target->images = new VkImage[swapchainImageCount];
|
target->images = new VkImage[swapchainImageCount];
|
||||||
vkGetSwapchainImagesKHR(device_, target->swapchain, &swapchainImageCount, target->images);
|
vkGetSwapchainImagesKHR(device_, target->swapchain, &swapchainImageCount, target->images);
|
||||||
|
|
||||||
target->imageViews = new VkImageView[swapchainImageCount];
|
target->imageViews = new VkImageView[swapchainImageCount];
|
||||||
for(uint32_t i = 0; i < swapchainImageCount; i++) {
|
for(uint32_t i = 0; i < swapchainImageCount; i++) {
|
||||||
VkImageViewCreateInfo createInfo = {};
|
VkImageViewCreateInfo createInfo = {};
|
||||||
|
@ -205,23 +205,23 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa
|
||||||
allocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
|
allocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
|
||||||
allocateInfo.commandPool = commandPool_;
|
allocateInfo.commandPool = commandPool_;
|
||||||
allocateInfo.commandBufferCount = swapchainImageCount;
|
allocateInfo.commandBufferCount = swapchainImageCount;
|
||||||
|
|
||||||
target->commandBuffers = new VkCommandBuffer[swapchainImageCount];
|
target->commandBuffers = new VkCommandBuffer[swapchainImageCount];
|
||||||
|
|
||||||
vkAllocateCommandBuffers(device_, &allocateInfo, target->commandBuffers);
|
vkAllocateCommandBuffers(device_, &allocateInfo, target->commandBuffers);
|
||||||
|
|
||||||
VkSemaphoreCreateInfo semaphoreCreateInfo = {};
|
VkSemaphoreCreateInfo semaphoreCreateInfo = {};
|
||||||
semaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
|
semaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
|
||||||
|
|
||||||
vkCreateSemaphore(device_, &semaphoreCreateInfo, nullptr, &target->imageAvailableSemaphore);
|
vkCreateSemaphore(device_, &semaphoreCreateInfo, nullptr, &target->imageAvailableSemaphore);
|
||||||
vkCreateSemaphore(device_, &semaphoreCreateInfo, nullptr, &target->renderFinishedSemaphore);
|
vkCreateSemaphore(device_, &semaphoreCreateInfo, nullptr, &target->renderFinishedSemaphore);
|
||||||
|
|
||||||
VkFenceCreateInfo fenceCreateInfo = {};
|
VkFenceCreateInfo fenceCreateInfo = {};
|
||||||
fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
|
||||||
fenceCreateInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
|
fenceCreateInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
|
||||||
|
|
||||||
target->fences = new VkFence[swapchainImageCount];
|
target->fences = new VkFence[swapchainImageCount];
|
||||||
|
|
||||||
for(uint32_t i = 0; i < swapchainImageCount; i++)
|
for(uint32_t i = 0; i < swapchainImageCount; i++)
|
||||||
vkCreateFence(device_, &fenceCreateInfo, nullptr, &target->fences[i]);
|
vkCreateFence(device_, &fenceCreateInfo, nullptr, &target->fences[i]);
|
||||||
|
|
||||||
|
@ -230,36 +230,36 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTa
|
||||||
|
|
||||||
void Renderer::destroyRenderTarget(RenderTarget* target) {
|
void Renderer::destroyRenderTarget(RenderTarget* target) {
|
||||||
vkDeviceWaitIdle(device_);
|
vkDeviceWaitIdle(device_);
|
||||||
|
|
||||||
for(uint32_t i = 0; i < target->numImages; i++)
|
for(uint32_t i = 0; i < target->numImages; i++)
|
||||||
vkDestroyFence(device_, target->fences[i], nullptr);
|
vkDestroyFence(device_, target->fences[i], nullptr);
|
||||||
|
|
||||||
delete[] target->fences;
|
delete[] target->fences;
|
||||||
|
|
||||||
vkDestroySemaphore(device_, target->renderFinishedSemaphore, nullptr);
|
vkDestroySemaphore(device_, target->renderFinishedSemaphore, nullptr);
|
||||||
vkDestroySemaphore(device_, target->imageAvailableSemaphore, nullptr);
|
vkDestroySemaphore(device_, target->imageAvailableSemaphore, nullptr);
|
||||||
|
|
||||||
vkFreeCommandBuffers(device_, commandPool_, target->numImages, target->commandBuffers);
|
vkFreeCommandBuffers(device_, commandPool_, target->numImages, target->commandBuffers);
|
||||||
|
|
||||||
delete[] target->commandBuffers;
|
delete[] target->commandBuffers;
|
||||||
|
|
||||||
for(uint32_t i = 0; i < target->numImages; i++) {
|
for(uint32_t i = 0; i < target->numImages; i++) {
|
||||||
vkDestroyFramebuffer(device_, target->framebuffers[i], nullptr);
|
vkDestroyFramebuffer(device_, target->framebuffers[i], nullptr);
|
||||||
vkDestroyImageView(device_, target->imageViews[i], nullptr);
|
vkDestroyImageView(device_, target->imageViews[i], nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
delete[] target->framebuffers;
|
delete[] target->framebuffers;
|
||||||
delete[] target->imageViews;
|
delete[] target->imageViews;
|
||||||
delete[] target->images;
|
delete[] target->images;
|
||||||
|
|
||||||
vkDestroySwapchainKHR(device_, target->swapchain, nullptr);
|
vkDestroySwapchainKHR(device_, target->swapchain, nullptr);
|
||||||
|
|
||||||
delete target;
|
delete target;
|
||||||
}
|
}
|
||||||
|
|
||||||
VkShaderModule Renderer::createShader(const char* path) {
|
VkShaderModule Renderer::createShader(const char* path) {
|
||||||
std::ifstream file(path, std::ios::ate | std::ios::binary);
|
std::ifstream file(path, std::ios::ate | std::ios::binary);
|
||||||
|
|
||||||
size_t fileSize = (size_t) file.tellg();
|
size_t fileSize = (size_t) file.tellg();
|
||||||
std::vector<char> buffer(fileSize);
|
std::vector<char> buffer(fileSize);
|
||||||
file.seekg(0);
|
file.seekg(0);
|
||||||
|
@ -280,10 +280,10 @@ VkShaderModule Renderer::createShader(const char* path) {
|
||||||
void Renderer::createInstance() {
|
void Renderer::createInstance() {
|
||||||
uint32_t layerCount = 0;
|
uint32_t layerCount = 0;
|
||||||
vkEnumerateInstanceLayerProperties(&layerCount, nullptr);
|
vkEnumerateInstanceLayerProperties(&layerCount, nullptr);
|
||||||
|
|
||||||
VkLayerProperties* availableLayers = new VkLayerProperties[layerCount];
|
VkLayerProperties* availableLayers = new VkLayerProperties[layerCount];
|
||||||
vkEnumerateInstanceLayerProperties(&layerCount, availableLayers);
|
vkEnumerateInstanceLayerProperties(&layerCount, availableLayers);
|
||||||
|
|
||||||
std::vector<const char*> enabledLayers;
|
std::vector<const char*> enabledLayers;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
for(uint32_t i = 0; i < layerCount; i++) {
|
for(uint32_t i = 0; i < layerCount; i++) {
|
||||||
|
@ -293,10 +293,10 @@ void Renderer::createInstance() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
delete[] availableLayers;
|
delete[] availableLayers;
|
||||||
|
|
||||||
uint32_t extensionCount = 0;
|
uint32_t extensionCount = 0;
|
||||||
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
|
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
|
||||||
|
|
||||||
VkExtensionProperties* availableExtensions = new VkExtensionProperties[extensionCount];
|
VkExtensionProperties* availableExtensions = new VkExtensionProperties[extensionCount];
|
||||||
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, availableExtensions);
|
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, availableExtensions);
|
||||||
|
|
||||||
|
@ -311,7 +311,7 @@ void Renderer::createInstance() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
delete[] availableExtensions;
|
delete[] availableExtensions;
|
||||||
|
|
||||||
auto requiredExtensions = platform::getRequiredExtensions();
|
auto requiredExtensions = platform::getRequiredExtensions();
|
||||||
enabledExtensions.insert(enabledExtensions.end(), requiredExtensions.begin(), requiredExtensions.end());
|
enabledExtensions.insert(enabledExtensions.end(), requiredExtensions.begin(), requiredExtensions.end());
|
||||||
|
|
||||||
|
@ -321,7 +321,7 @@ void Renderer::createInstance() {
|
||||||
instanceCreateInfo.ppEnabledLayerNames = enabledLayers.data();
|
instanceCreateInfo.ppEnabledLayerNames = enabledLayers.data();
|
||||||
instanceCreateInfo.enabledExtensionCount = enabledExtensions.size();
|
instanceCreateInfo.enabledExtensionCount = enabledExtensions.size();
|
||||||
instanceCreateInfo.ppEnabledExtensionNames = enabledExtensions.data();
|
instanceCreateInfo.ppEnabledExtensionNames = enabledExtensions.data();
|
||||||
|
|
||||||
vkCreateInstance(&instanceCreateInfo, nullptr, &instance_);
|
vkCreateInstance(&instanceCreateInfo, nullptr, &instance_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,10 +336,10 @@ void Renderer::createDebugMessenger() {
|
||||||
messengerCreateInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
|
messengerCreateInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
|
||||||
messengerCreateInfo.pfnUserCallback = [](VkDebugUtilsMessageSeverityFlagBitsEXT, unsigned int, const VkDebugUtilsMessengerCallbackDataEXT* callback, void*) -> unsigned int {
|
messengerCreateInfo.pfnUserCallback = [](VkDebugUtilsMessageSeverityFlagBitsEXT, unsigned int, const VkDebugUtilsMessengerCallbackDataEXT* callback, void*) -> unsigned int {
|
||||||
std::cout << callback->pMessage << std::endl;
|
std::cout << callback->pMessage << std::endl;
|
||||||
|
|
||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
};
|
};
|
||||||
|
|
||||||
createMessenger_(instance_, &messengerCreateInfo, nullptr, &messenger_);
|
createMessenger_(instance_, &messengerCreateInfo, nullptr, &messenger_);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -347,59 +347,59 @@ void Renderer::createDebugMessenger() {
|
||||||
void Renderer::createLogicalDevice() {
|
void Renderer::createLogicalDevice() {
|
||||||
uint32_t physicalDeviceCount = 0;
|
uint32_t physicalDeviceCount = 0;
|
||||||
vkEnumeratePhysicalDevices(instance_, &physicalDeviceCount, nullptr);
|
vkEnumeratePhysicalDevices(instance_, &physicalDeviceCount, nullptr);
|
||||||
|
|
||||||
VkPhysicalDevice* physicalDevices = new VkPhysicalDevice[physicalDeviceCount];
|
VkPhysicalDevice* physicalDevices = new VkPhysicalDevice[physicalDeviceCount];
|
||||||
vkEnumeratePhysicalDevices(instance_, &physicalDeviceCount, physicalDevices);
|
vkEnumeratePhysicalDevices(instance_, &physicalDeviceCount, physicalDevices);
|
||||||
|
|
||||||
for(uint32_t i = 0; i < physicalDeviceCount; i++) {
|
for(uint32_t i = 0; i < physicalDeviceCount; i++) {
|
||||||
VkPhysicalDeviceProperties properties = {};
|
VkPhysicalDeviceProperties properties = {};
|
||||||
vkGetPhysicalDeviceProperties(physicalDevices[i], &properties);
|
vkGetPhysicalDeviceProperties(physicalDevices[i], &properties);
|
||||||
|
|
||||||
physicalDevice_ = physicalDevices[i];
|
physicalDevice_ = physicalDevices[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
delete[] physicalDevices;
|
delete[] physicalDevices;
|
||||||
|
|
||||||
uint32_t queueFamilyPropertiesCount = 0;
|
uint32_t queueFamilyPropertiesCount = 0;
|
||||||
vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice_, &queueFamilyPropertiesCount, nullptr);
|
vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice_, &queueFamilyPropertiesCount, nullptr);
|
||||||
|
|
||||||
VkQueueFamilyProperties* queueFamilyProperties = new VkQueueFamilyProperties[queueFamilyPropertiesCount];
|
VkQueueFamilyProperties* queueFamilyProperties = new VkQueueFamilyProperties[queueFamilyPropertiesCount];
|
||||||
vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice_, &queueFamilyPropertiesCount, queueFamilyProperties);
|
vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice_, &queueFamilyPropertiesCount, queueFamilyProperties);
|
||||||
|
|
||||||
for(uint32_t i = 0; i < queueFamilyPropertiesCount; i++) {
|
for(uint32_t i = 0; i < queueFamilyPropertiesCount; i++) {
|
||||||
if(queueFamilyProperties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT)
|
if(queueFamilyProperties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT)
|
||||||
queueIndices.graphics = i;
|
queueIndices.graphics = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete[] queueFamilyProperties;
|
delete[] queueFamilyProperties;
|
||||||
|
|
||||||
queueIndices.presentation = queueIndices.graphics; //FIXME: this may not always be true!!
|
queueIndices.presentation = queueIndices.graphics; //FIXME: this may not always be true!!
|
||||||
|
|
||||||
const std::set<uint32_t> queueFamilyIndices = {queueIndices.graphics};
|
const std::set<uint32_t> queueFamilyIndices = {queueIndices.graphics};
|
||||||
std::vector<VkDeviceQueueCreateInfo> deviceQueueCreateInfos;
|
std::vector<VkDeviceQueueCreateInfo> deviceQueueCreateInfos;
|
||||||
for(auto queueFamilyIndex : queueFamilyIndices) {
|
for(auto queueFamilyIndex : queueFamilyIndices) {
|
||||||
const float priority = 1.0f;
|
const float priority = 1.0f;
|
||||||
|
|
||||||
VkDeviceQueueCreateInfo queueCreateInfo = {};
|
VkDeviceQueueCreateInfo queueCreateInfo = {};
|
||||||
queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
|
queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
|
||||||
queueCreateInfo.queueFamilyIndex = queueFamilyIndex;
|
queueCreateInfo.queueFamilyIndex = queueFamilyIndex;
|
||||||
queueCreateInfo.queueCount = 1;
|
queueCreateInfo.queueCount = 1;
|
||||||
queueCreateInfo.pQueuePriorities = &priority;
|
queueCreateInfo.pQueuePriorities = &priority;
|
||||||
|
|
||||||
deviceQueueCreateInfos.push_back(queueCreateInfo);
|
deviceQueueCreateInfos.push_back(queueCreateInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<const char*> enabledExtensions = {"VK_KHR_swapchain"};
|
const std::vector<const char*> enabledExtensions = {"VK_KHR_swapchain"};
|
||||||
|
|
||||||
VkDeviceCreateInfo deviceCreateInfo = {};
|
VkDeviceCreateInfo deviceCreateInfo = {};
|
||||||
deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
|
deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
|
||||||
deviceCreateInfo.queueCreateInfoCount = deviceQueueCreateInfos.size();
|
deviceCreateInfo.queueCreateInfoCount = deviceQueueCreateInfos.size();
|
||||||
deviceCreateInfo.pQueueCreateInfos = deviceQueueCreateInfos.data();
|
deviceCreateInfo.pQueueCreateInfos = deviceQueueCreateInfos.data();
|
||||||
deviceCreateInfo.enabledExtensionCount = enabledExtensions.size();
|
deviceCreateInfo.enabledExtensionCount = enabledExtensions.size();
|
||||||
deviceCreateInfo.ppEnabledExtensionNames = enabledExtensions.data();
|
deviceCreateInfo.ppEnabledExtensionNames = enabledExtensions.data();
|
||||||
|
|
||||||
vkCreateDevice(physicalDevice_, &deviceCreateInfo, nullptr, &device_);
|
vkCreateDevice(physicalDevice_, &deviceCreateInfo, nullptr, &device_);
|
||||||
|
|
||||||
vkGetDeviceQueue(device_, queueIndices.graphics, 0, &graphicsQueue_);
|
vkGetDeviceQueue(device_, queueIndices.graphics, 0, &graphicsQueue_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -408,7 +408,7 @@ void Renderer::createCommandPool() {
|
||||||
poolCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
poolCreateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
||||||
poolCreateInfo.queueFamilyIndex = queueIndices.graphics;
|
poolCreateInfo.queueFamilyIndex = queueIndices.graphics;
|
||||||
poolCreateInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
|
poolCreateInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
|
||||||
|
|
||||||
vkCreateCommandPool(device_, &poolCreateInfo, nullptr, &commandPool_);
|
vkCreateCommandPool(device_, &poolCreateInfo, nullptr, &commandPool_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in a new issue