Копия проекта с репозитория 06
This commit is contained in:
parent
1cbfc57a74
commit
167e46a506
|
@ -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
|
|
@ -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