Копия проекта с репозитория 06
This commit is contained in:
parent
1cbfc57a74
commit
167e46a506
|
@ -12,23 +12,14 @@
|
||||||
*.gch
|
*.gch
|
||||||
*.pch
|
*.pch
|
||||||
|
|
||||||
# Compiled Dynamic libraries
|
|
||||||
*.so
|
|
||||||
*.dylib
|
|
||||||
*.dll
|
|
||||||
|
|
||||||
# Fortran module files
|
# Fortran module files
|
||||||
*.mod
|
*.mod
|
||||||
*.smod
|
*.smod
|
||||||
|
|
||||||
# Compiled Static libraries
|
|
||||||
*.lai
|
|
||||||
*.la
|
|
||||||
*.a
|
|
||||||
*.lib
|
|
||||||
|
|
||||||
# Executables
|
# Executables
|
||||||
*.exe
|
*.exe
|
||||||
*.out
|
*.out
|
||||||
*.app
|
*.app
|
||||||
|
|
||||||
|
# SPIR-V shaders
|
||||||
|
*.spv
|
|
@ -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
|
||||||
|
}
|
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
|
@ -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"
|
||||||
|
}
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1 @@
|
||||||
|
#define CLAMP(min, value, max) (value > min) ? min : (max < value) ? max : value;
|
|
@ -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
|
|
@ -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);
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue