diff --git a/src/main.cpp b/src/main.cpp index 64b2354..5cc2842 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,8 @@ #define TINYGLTF_IMPLEMENTATION #define STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_WRITE_IMPLEMENTATION +#define GLM_FORCE_RADIANS +#define GLM_FORCE_DEPTH_ZERO_TO_ONE #include @@ -14,10 +16,6 @@ #include #include #include -#define TINYGLTF_IMPLEMENTATION -#define STB_IMAGE_IMPLEMENTATION -#define GLM_FORCE_RADIANS -#define GLM_FORCE_DEPTH_ZERO_TO_ONE #include #include #include "tiny_gltf.h" @@ -84,33 +82,6 @@ void loadModel() { } } -void createVertexBuffer() { - VkBufferCreateInfo bufferInfo{}; - bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; - bufferInfo.size = sizeof(vertices[0]) * vertices.size(); - bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; - bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - - vkCreateBuffer(device, &bufferInfo, nullptr, &vertexBuffer); - - VkMemoryRequirements memRequirements; - vkGetBufferMemoryRequirements(device, vertexBuffer, &memRequirements); - - VkMemoryAllocateInfo allocInfo{}; - allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - allocInfo.allocationSize = memRequirements.size; - allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); - - vkAllocateMemory(device, &allocInfo, nullptr, &vertexBufferMemory); - vkBindBufferMemory(device, vertexBuffer, vertexBufferMemory, 0); - - void* data; - vkMapMemory(device, vertexBufferMemory, 0, bufferInfo.size, 0, &data); - memcpy(data, vertices.data(), bufferInfo.size); - vkUnmapMemory(device, vertexBufferMemory); -} - VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pDebugMessenger) { @@ -230,6 +201,13 @@ private: const std::vector validationLayers = { "VK_LAYER_KHRONOS_validation" }; + std::vector vertices; + VkBuffer vertexBuffer; + VkDeviceMemory vertexBufferMemory; + Model model; + VkPhysicalDevice physicalDevice; + VkDevice device; + #ifdef NDEBUG const bool enableValidationLayers = false; @@ -288,10 +266,10 @@ private: setupDebugMessenger(); createSurface(); pickPhysicalDevice(); + createLogicalDevice(); loadModel(); createVertexBuffer(); createIndexBuffer(); - createLogicalDevice(); createSwapChain(); createImageViews(); createRenderPass(); @@ -322,6 +300,51 @@ private: } return true; } + private: + void createVertexBuffer() { + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = sizeof(vertices[0]) * vertices.size(); + bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; + bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + // Убрать this->, так как device уже член класса + if (vkCreateBuffer(device, &bufferInfo, nullptr, &vertexBuffer) != VK_SUCCESS) { + throw std::runtime_error("failed to create vertex buffer!"); + } + + VkMemoryRequirements memRequirements; + vkGetBufferMemoryRequirements(device, vertexBuffer, &memRequirements); + + VkMemoryAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + + if (vkAllocateMemory(device, &allocInfo, nullptr, &vertexBufferMemory) != VK_SUCCESS) { + throw std::runtime_error("failed to allocate vertex buffer memory!"); + } + + vkBindBufferMemory(device, vertexBuffer, vertexBufferMemory, 0); + + void* data; + vkMapMemory(device, vertexBufferMemory, 0, bufferInfo.size, 0, &data); + memcpy(data, vertices.data(), bufferInfo.size); + vkUnmapMemory(device, vertexBufferMemory); + } + uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties) { + VkPhysicalDeviceMemoryProperties memProperties; + vkGetPhysicalDeviceMemoryProperties(physicalDevice, &memProperties); + + for (uint32_t i = 0; i < memProperties.memoryTypeCount; i++) { + if ((typeFilter & (1 << i)) && + (memProperties.memoryTypes[i].propertyFlags & properties) == properties) { + return i; + } + } + throw std::runtime_error("failed to find suitable memory type!"); + } std::vector getRequiredExtensions() const { uint32_t glfwExtensionCount = 0; @@ -571,6 +594,38 @@ private: vkGetDeviceQueue(device, indices.presentFamily.value(), 0, &presentQueue); } + void createIndexBuffer() { + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = sizeof(indices[0]) * indices.size(); + bufferInfo.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT; + bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + if (vkCreateBuffer(device, &bufferInfo, nullptr, &indexBuffer) != VK_SUCCESS) { + throw std::runtime_error("failed to create index buffer!"); + } + + VkMemoryRequirements memRequirements; + vkGetBufferMemoryRequirements(device, indexBuffer, &memRequirements); + + VkMemoryAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + + if (vkAllocateMemory(device, &allocInfo, nullptr, &indexBufferMemory) != VK_SUCCESS) { + throw std::runtime_error("failed to allocate index buffer memory!"); + } + + vkBindBufferMemory(device, indexBuffer, indexBufferMemory, 0); + + void* data; + vkMapMemory(device, indexBufferMemory, 0, bufferInfo.size, 0, &data); + memcpy(data, indices.data(), bufferInfo.size); + vkUnmapMemory(device, indexBufferMemory); + } + void createSwapChain() { auto swapChinSupport = querySwapChainSupport(physicalDevice); @@ -718,10 +773,12 @@ private: }; // Vertex input configuration + VkVertexInputBindingDescription bindingDescription{}; bindingDescription.binding = 0; bindingDescription.stride = sizeof(Vertex); bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; + std::array attributeDescriptions{}; attributeDescriptions[0].binding = 0; attributeDescriptions[0].location = 0; attributeDescriptions[0].format = VK_FORMAT_R32G32B32_SFLOAT;