Копия проекта с репозитория 06

This commit is contained in:
parent 1cbfc57a74
commit 167e46a506
15 changed files with 1396 additions and 11 deletions

13
.gitignore vendored
View File

@ -12,23 +12,14 @@
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
*.smod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
# SPIR-V shaders
*.spv

18
.vscode/c_cpp_properties.json vendored Normal file
View File

@ -0,0 +1,18 @@
{
"configurations": [
{
"name": "some_name",
"includePath": [
"${workspaceFolder}/include",
"C:/VulkanSDK/1.2.189.2/Include",
"${workspaceFolder}/../dependencies/GLFW/include",
"${workspaceFolder}/../dependencies/glm"
],
"compilerPath": "C:/MinGW/bin/g++.exe",
"cStandard": "c11",
"cppStandard": "c++11",
"intelliSenseMode": "gcc-x86"
}
],
"version": 4
}

50
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,50 @@
{
"files.associations": {
"vector": "cpp",
"array": "cpp",
"atomic": "cpp",
"*.tcc": "cpp",
"cctype": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"unordered_map": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"iterator": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"random": "cpp",
"string": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"fstream": "cpp",
"initializer_list": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"istream": "cpp",
"limits": "cpp",
"new": "cpp",
"ostream": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"typeinfo": "cpp",
"cstring": "cpp",
"list": "cpp",
"unordered_set": "cpp",
"map": "cpp",
"set": "cpp"
}
}

41
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,41 @@
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe сборка активного файла",
"command": "C:/MinGW/bin/g++.exe",
"args": [
"-fdiagnostics-color=always",
"${workspaceRoot}/src/*.cpp",
"-I${workspaceRoot}/include",
"--std=c++11",
"-IC:/VulkanSDK/1.2.189.2/Include",
"-LC:/VulkanSDK/1.2.189.2/Lib32",
"-I${workspaceRoot}/../dependencies/GLFW/include",
"-I${workspaceRoot}/../dependencies/glm",
"-L${workspaceRoot}/../dependencies/GLFW/lib-mingw",
"-static",
"-lvulkan-1",
"-lglfw3dll",
"-o",
"${workspaceRoot}/${workspaceFolderBasename}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Задача создана отладчиком."
}
],
"version": "2.0.0"
}

BIN
glfw3.dll Normal file

Binary file not shown.

17
include/PhysicalDevice.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef PHYSICALDEVICE_H
#define PHYSICALDEVICE_H
#include <vulkan/vulkan.h>
#include <vector>
typedef struct _PhysicalDevice
{
VkPhysicalDevice device; // устройство
VkPhysicalDeviceProperties properties; // параметры
VkPhysicalDeviceFeatures features; // функции
VkPhysicalDeviceMemoryProperties memory; // память
std::vector<VkQueueFamilyProperties> queueFamilyProperties; // семейства очередей
} PhysicalDevice;
#endif // PHYSICALDEVICE_H

13
include/Queue.h Normal file
View File

@ -0,0 +1,13 @@
#ifndef QUEUE_H
#define QUEUE_H
#include <vulkan/vulkan.h>
typedef struct _Queue
{
uint32_t index;
VkQueue descriptor;
VkQueueFamilyProperties properties;
} Queue;
#endif // QUEUE_H

21
include/Surface.h Normal file
View File

@ -0,0 +1,21 @@
#ifndef SURFACE_H
#define SURFACE_H
#include <vulkan/vulkan.h>
#include <vector>
typedef struct _Surface
{
VkSurfaceKHR surface; // Поверхность окна
VkSurfaceCapabilitiesKHR capabilities; // общая информация
std::vector<VkSurfaceFormatKHR> formats; // формат поверхности
std::vector<VkPresentModeKHR> presentModes; // режим показа
// Данные о списке показа
VkSurfaceFormatKHR selectedFormat; // выбранный формат поверхности
VkPresentModeKHR selectedPresentMode; // выбранный режим показа
VkExtent2D selectedExtent; // выбранное разрешение
uint32_t imageCount; // количество изображений
} Surface;
#endif // SURFACE_H

12
include/Vertex.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef VERTEX_H
#define VERTEX_H
#include <GLM/glm.hpp>
typedef struct _Vertex
{
glm::vec2 position;
glm::vec3 color;
} Vertex;
#endif // VERTEX_H

1
include/macroses.h Normal file
View File

@ -0,0 +1 @@
#define CLAMP(min, value, max) (value > min) ? min : (max < value) ? max : value;

66
include/vk.h Normal file
View File

@ -0,0 +1,66 @@
#ifndef VK_H
#define VK_H
#include <vulkan/vulkan.h>
#include <GLFW/glfw3.h>
#include "PhysicalDevice.h"
#include "Surface.h"
#include "Queue.h"
class Vulkan
{
public:
void init(GLFWwindow* window); // инициализация
void destroy(); // завершение работы
void renderFrame(); // рендер кадра
private:
VkInstance instance; // Экземпляр Vulkan
PhysicalDevice physicalDevice; // Физическое устройство
VkDevice logicalDevice; // логическое устройство
Queue queue; // очередь
Surface surface; // Поверхность окна
VkSwapchainKHR swapChain; // Список показа
std::vector<VkImage> swapChainImages; // Изображения из списка показа
std::vector<VkImageView> swapChainImageViews; // Информация об изображениях из списка показа
std::vector<VkFramebuffer> swapChainFramebuffers; // Буферы кадра из списка показа
VkRenderPass renderPass; // Проходы рендера
VkPipelineLayout pipelineLayout; // Раскладка конвейера
VkPipeline graphicsPipeline; // Графический конвейер
VkCommandPool commandPool; // Пул команд
std::vector<VkCommandBuffer> commandBuffers; // Буферы команд
VkBuffer vertexBuffer; // Буфер вершин
VkDeviceMemory vertexBufferMemory; // Память буфера вершин
VkBuffer indexBuffer; // Буфер индексов
VkDeviceMemory indexBufferMemory; // Память буфера индексов
std::vector<VkSemaphore> imageAvailableSemaphores; // семафор доступности изображения
std::vector<VkSemaphore> renderFinishedSemaphores; // семафор окончания рендера
std::vector<VkFence> inWorkFences; // барьер кадра в работе
uint32_t currentFrame = 0; // Текущий кадр рендера
// Структура для хранения флагов
struct
{
const bool VALIDATION = true; // Использование слоев проверки
} states;
void createInstance(); // Создание экземпяра Vulkan
void selectPhysicalDevice(std::vector<const char*> &deviceExtensions); // Выбор физического устройства
void pickQueues(); // Выбор очередей
void createLogicalDevice(std::vector<const char*> &deviceExtensions); // Создание логического устройства
void createWindowSurface(GLFWwindow* window); // Создание поверхности окна
void createSwapchain(GLFWwindow* window); // Создание цепочки показа
void createRenderpass(); // Создание проходов рендера
VkShaderModule createShaderModule(const char * filename); // Создание шейдерного модуля
void createGraphicPipeline(); // Создание графического конвеера
void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory); // Создание произвольного буфера данных
void createCommandPool(); // Создание пула команд
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); // Копирование между буферами данных
void createVertexBuffer(); // Создание буфера вершин
void createIndexBuffer(); // Создание буфера индексов
void createSyncObjects(); // Создание объектов синхронизации
void createFramebuffers(); // Создание буферов кадра
};
#endif // VK_H

9
shaders/shader.frag Normal file
View File

@ -0,0 +1,9 @@
#version 450
layout(location = 0) in vec3 fragColor;
layout(location = 0) out vec4 outColor;
void main() {
outColor = vec4(fragColor, 1.0);
}

11
shaders/shader.vert Normal file
View File

@ -0,0 +1,11 @@
#version 450
layout(location = 0) in vec2 inPosition;
layout(location = 1) in vec3 inColor;
layout(location = 0) out vec3 fragColor;
void main() {
gl_Position = vec4(inPosition, 0.0, 1.0);
fragColor = inColor;
}

54
src/main.cpp Normal file
View File

@ -0,0 +1,54 @@
#include "vk.h"
#include <iostream>
void vkInit();
int main(int argc, char* argv[]) {
// Инициализация GLFW
glfwInit();
// Проверка доступности Vulkan
if (glfwVulkanSupported())
{
// объект класса-обертки Vulkan API
Vulkan vulkan;
// Отключим создание контекста
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
// Отключим возможность изменения размеров окна
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
// Создание окна
GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);
// Инициализация Vulkan API
vulkan.init(window);
// Жизненный цикл
while(!glfwWindowShouldClose(window)) {
// Обработка событий
glfwPollEvents();
vulkan.renderFrame();
}
// Уничтожение окна
glfwDestroyWindow(window);
// Завершение работы с Vulkan
vulkan.destroy();
}
else
std::cout << "There is no Vulkan Supported\n";
// Завершение работы с GLFW
glfwTerminate();
return 0;
}

1081
src/vk.cpp Normal file

File diff suppressed because it is too large Load Diff