Browse Source
- Add part of vulkan 1.3 tutorial code - Clean the HelloTrinagle code - Duplicate HelloTriangle and continue for compute on the new filesmaster
AliMehrabani
2 weeks ago
42 changed files with 22358 additions and 1467 deletions
File diff suppressed because it is too large
@ -1,229 +0,0 @@ |
|||
#ifndef HELLOTRIANGLEAPPLICATION_H |
|||
#define HELLOTRIANGLEAPPLICATION_H |
|||
|
|||
#ifdef NDEBUG |
|||
const bool enableValidationLayers = false; |
|||
#else |
|||
const bool enableValidationLayers = true; |
|||
#endif |
|||
|
|||
#include <vulkan/vulkan.h> |
|||
|
|||
//#define VK_USE_PLATFORM_
|
|||
//#define GLFW_INCLUDE_VULKAN
|
|||
//#include <GLFW/glfw3.h>
|
|||
//#define GLFW_EXPOSE_NATIVE_
|
|||
//#include <GLFW/glfw3native.h>
|
|||
|
|||
#define GLM_FORCE_RADIANS |
|||
#define GLM_FORCE_DEFAULT_ALIGNED_GENTYPES |
|||
#include <glm/glm.hpp> |
|||
#include <glm/gtc/matrix_transform.hpp> |
|||
|
|||
#include <chrono> |
|||
|
|||
#include <QObject> |
|||
#include <QtQuick/QQuickWindow> |
|||
#include <iostream> |
|||
#include <optional> |
|||
#include <cstdint> // Necessary for uint32_t |
|||
#include <limits> // Necessary for std::numeric_limits |
|||
#include <algorithm> // Necessary for std::clamp |
|||
#include <fstream> |
|||
#include <array> |
|||
|
|||
#ifdef Q_OS_ANDROID |
|||
const QString TARGET_PLATFORM = "Android"; |
|||
#else |
|||
const QString TARGET_PLATFORM = "Linux"; |
|||
#endif |
|||
|
|||
const int MAX_FRAMES_IN_FLIGHT = 2; |
|||
|
|||
struct QueueFamilyIndices { |
|||
std::optional<uint32_t> graphicsFamily; |
|||
std::optional<uint32_t> presentFamily; |
|||
|
|||
bool isComplete() { |
|||
return graphicsFamily.has_value() && presentFamily.has_value(); |
|||
} |
|||
}; |
|||
|
|||
struct SwapChainSupportDetails { |
|||
VkSurfaceCapabilitiesKHR capabilities; |
|||
std::vector<VkSurfaceFormatKHR> formats; |
|||
std::vector<VkPresentModeKHR> presentModes; |
|||
}; |
|||
|
|||
struct Vertex { |
|||
alignas(16) glm::vec2 pos; |
|||
alignas(16) glm::vec3 color; |
|||
|
|||
static VkVertexInputBindingDescription getBindingDescription() { |
|||
VkVertexInputBindingDescription bindingDescription{}; |
|||
bindingDescription.binding = 0; |
|||
bindingDescription.stride = sizeof(Vertex); |
|||
bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; |
|||
|
|||
return bindingDescription; |
|||
} |
|||
|
|||
static std::array<VkVertexInputAttributeDescription, 2> getAttributeDescriptions() { |
|||
std::array<VkVertexInputAttributeDescription, 2> attributeDescriptions{}; |
|||
|
|||
attributeDescriptions[0].binding = 0; |
|||
attributeDescriptions[0].location = 0; |
|||
attributeDescriptions[0].format = VK_FORMAT_R32G32_SFLOAT; |
|||
attributeDescriptions[0].offset = offsetof(Vertex, pos); |
|||
|
|||
attributeDescriptions[1].binding = 0; |
|||
attributeDescriptions[1].location = 1; |
|||
attributeDescriptions[1].format = VK_FORMAT_R32G32B32_SFLOAT; |
|||
attributeDescriptions[1].offset = offsetof(Vertex, color); |
|||
|
|||
return attributeDescriptions; |
|||
} |
|||
}; |
|||
|
|||
struct UniformBufferObject { |
|||
alignas(16) glm::mat4 model; |
|||
alignas(16) glm::mat4 view; |
|||
alignas(16) glm::mat4 proj; |
|||
}; |
|||
|
|||
class HelloTriangleApplication |
|||
{ |
|||
public: |
|||
HelloTriangleApplication(); |
|||
void run(); |
|||
|
|||
// Message Callback
|
|||
static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT /*messageSeverity*/, |
|||
VkDebugUtilsMessageTypeFlagsEXT /*messageType*/,const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,void* /*pUserData*/) { |
|||
|
|||
std::cerr << "validation layer: " << pCallbackData->pMessage << std::endl; |
|||
|
|||
return VK_FALSE; |
|||
} |
|||
static std::vector<char> readFile(const std::string& filename); |
|||
|
|||
// static void framebufferResizeCallback(GLFWwindow* window, int width, int height);
|
|||
static void framebufferResizeCallback(QQuickWindow* window, int width, int height); |
|||
|
|||
private: |
|||
void initWindow(); |
|||
void initVulkan(); |
|||
void mainLoop(); |
|||
void cleanup(); |
|||
void createInstance(); |
|||
|
|||
// Enable Validation Layers
|
|||
bool checkValidationLayerSupport(); |
|||
|
|||
// Message Callback
|
|||
std::vector<const char*> getRequiredExtensions(); |
|||
void setupDebugMessenger(); |
|||
void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo); |
|||
|
|||
void pickPhysicalDevice(); |
|||
bool isDeviceSuitable(VkPhysicalDevice device); |
|||
|
|||
void createLogicalDevice(); |
|||
QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device); |
|||
|
|||
void createSurface(); |
|||
|
|||
bool checkDeviceExtensionSupport(VkPhysicalDevice device); |
|||
SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device); |
|||
VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR>& availableFormats); |
|||
VkPresentModeKHR chooseSwapPresentMode(const std::vector<VkPresentModeKHR>& availablePresentModes); |
|||
VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities); |
|||
void createSwapChain(); |
|||
|
|||
void createImageViews(); |
|||
|
|||
void createGraphicsPipeline(); |
|||
VkShaderModule createShaderModule(const std::vector<char>& code); |
|||
void createRenderPass(); |
|||
|
|||
void createFramebuffers(); |
|||
void createCommandPool(); |
|||
void createCommandBuffer(); |
|||
void recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex); |
|||
|
|||
void drawFrame(); |
|||
void createSyncObjects(); |
|||
|
|||
void recreateSwapChain(); |
|||
void cleanupSwapChain(); |
|||
|
|||
void createVertexBuffer(); |
|||
uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties); |
|||
void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory); |
|||
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); |
|||
void createIndexBuffer(); |
|||
|
|||
void createDescriptorSetLayout(); |
|||
void createUniformBuffers(); |
|||
void updateUniformBuffer(uint32_t currentImage); |
|||
void createDescriptorPool(); |
|||
void createDescriptorSets(); |
|||
|
|||
const int32_t WIDTH = 800; |
|||
const int32_t HEIGHT = 600; |
|||
const std::vector<const char*> validationLayers = { |
|||
"VK_LAYER_KHRONOS_validation" |
|||
}; |
|||
const std::vector<const char*> deviceExtensions = { |
|||
VK_KHR_SWAPCHAIN_EXTENSION_NAME |
|||
}; |
|||
const std::vector<Vertex> vertices = { |
|||
{{-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}}, |
|||
{{0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}}, |
|||
{{0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}}, |
|||
{{-0.5f, 0.5f}, {1.0f, 1.0f, 1.0f}} |
|||
}; |
|||
const std::vector<uint16_t> indices = { |
|||
0, 1, 2, 2, 3, 0 |
|||
}; |
|||
|
|||
uint32_t currentFrame = 0; |
|||
bool framebufferResized = false; |
|||
|
|||
// GLFWwindow *_window;
|
|||
QQuickWindow* _window; |
|||
VkInstance _instance; |
|||
VkDebugUtilsMessengerEXT _debugMessenger; |
|||
VkPhysicalDevice _physicalDevice; |
|||
VkDevice _device; |
|||
VkQueue _graphicsQueue; |
|||
VkSurfaceKHR _surface; |
|||
VkQueue _presentQueue; |
|||
VkSwapchainKHR _swapChain; |
|||
std::vector<VkImage> _swapChainImages; |
|||
VkFormat _swapChainImageFormat; |
|||
VkExtent2D _swapChainExtent; |
|||
std::vector<VkImageView> _swapChainImageViews; |
|||
VkRenderPass _renderPass; |
|||
VkDescriptorSetLayout _descriptorSetLayout; |
|||
VkPipelineLayout _pipelineLayout; |
|||
VkPipeline _graphicsPipeline; |
|||
std::vector<VkFramebuffer> _swapChainFramebuffers; |
|||
VkCommandPool _commandPool; |
|||
std::vector<VkCommandBuffer> _commandBuffers; |
|||
std::vector<VkSemaphore> _imageAvailableSemaphores; |
|||
std::vector<VkSemaphore> _renderFinishedSemaphores; |
|||
std::vector<VkFence> _inFlightFences; |
|||
VkBuffer _vertexBuffer; |
|||
VkDeviceMemory _vertexBufferMemory; |
|||
VkBuffer _indexBuffer; |
|||
VkDeviceMemory _indexBufferMemory; |
|||
|
|||
std::vector<VkBuffer> _uniformBuffers; |
|||
std::vector<VkDeviceMemory> _uniformBuffersMemory; |
|||
std::vector<void*> _uniformBuffersMapped; |
|||
VkDescriptorPool _descriptorPool; |
|||
std::vector<VkDescriptorSet> descriptorSets; |
|||
}; |
|||
|
|||
#endif // HELLOTRIANGLEAPPLICATION_H
|
@ -0,0 +1,652 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE QtCreatorProject> |
|||
<!-- Written by QtCreator 4.10.1, 2024-11-03T17:26:59. --> |
|||
<qtcreator> |
|||
<data> |
|||
<variable>EnvironmentId</variable> |
|||
<value type="QByteArray">{9e9cdaa4-317b-4f62-9b8d-2ca42fb59b56}</value> |
|||
</data> |
|||
<data> |
|||
<variable>ProjectExplorer.Project.ActiveTarget</variable> |
|||
<value type="int">0</value> |
|||
</data> |
|||
<data> |
|||
<variable>ProjectExplorer.Project.EditorSettings</variable> |
|||
<valuemap type="QVariantMap"> |
|||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value> |
|||
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value> |
|||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value> |
|||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0"> |
|||
<value type="QString" key="language">Cpp</value> |
|||
<valuemap type="QVariantMap" key="value"> |
|||
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value> |
|||
</valuemap> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1"> |
|||
<value type="QString" key="language">QmlJS</value> |
|||
<valuemap type="QVariantMap" key="value"> |
|||
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value> |
|||
</valuemap> |
|||
</valuemap> |
|||
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value> |
|||
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value> |
|||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value> |
|||
<value type="int" key="EditorConfiguration.IndentSize">4</value> |
|||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value> |
|||
<value type="int" key="EditorConfiguration.MarginColumn">80</value> |
|||
<value type="bool" key="EditorConfiguration.MouseHiding">true</value> |
|||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value> |
|||
<value type="int" key="EditorConfiguration.PaddingMode">1</value> |
|||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value> |
|||
<value type="bool" key="EditorConfiguration.ShowMargin">false</value> |
|||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value> |
|||
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value> |
|||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value> |
|||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value> |
|||
<value type="int" key="EditorConfiguration.TabSize">8</value> |
|||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value> |
|||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value> |
|||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value> |
|||
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value> |
|||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value> |
|||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value> |
|||
</valuemap> |
|||
</data> |
|||
<data> |
|||
<variable>ProjectExplorer.Project.PluginSettings</variable> |
|||
<valuemap type="QVariantMap"> |
|||
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"/> |
|||
<value type="bool" key="ClangCodeModel.UseGlobalConfig">false</value> |
|||
<value type="QString" key="ClangCodeModel.WarningConfigId">{afe80e93-8983-4e43-ba75-d87634bcd04b}</value> |
|||
</valuemap> |
|||
</data> |
|||
<data> |
|||
<variable>ProjectExplorer.Project.Target.0</variable> |
|||
<valuemap type="QVariantMap"> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.13.2 GCC 64bit</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.13.2 GCC 64bit</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5132.gcc_64_kit</value> |
|||
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value> |
|||
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> |
|||
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> |
|||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/ali-mehrabani/Qt_projects/build-VkTest-Desktop_Qt_5_13_2_GCC_64bit-Debug</value> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value> |
|||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
|||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
|||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> |
|||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> |
|||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> |
|||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value> |
|||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1"> |
|||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/ali-mehrabani/Qt_projects/build-VkTest-Desktop_Qt_5_13_2_GCC_64bit-Release</value> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value> |
|||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
|||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
|||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> |
|||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> |
|||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> |
|||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> |
|||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2"> |
|||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/ali-mehrabani/Qt_projects/build-VkTest-Desktop_Qt_5_13_2_GCC_64bit-Profile</value> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value> |
|||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
|||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
|||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> |
|||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> |
|||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> |
|||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> |
|||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> |
|||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy Configuration</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> |
|||
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value> |
|||
<valuelist type="QVariantList" key="Analyzer.Perf.Events"> |
|||
<value type="QString">cpu-cycles</value> |
|||
</valuelist> |
|||
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/> |
|||
<value type="int" key="Analyzer.Perf.Frequency">250</value> |
|||
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value> |
|||
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value> |
|||
<value type="int" key="Analyzer.Perf.StackSize">4096</value> |
|||
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value> |
|||
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value> |
|||
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value> |
|||
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value> |
|||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value> |
|||
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/> |
|||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value> |
|||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value> |
|||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value> |
|||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value> |
|||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value> |
|||
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value> |
|||
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value> |
|||
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value> |
|||
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value> |
|||
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value> |
|||
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value> |
|||
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/> |
|||
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value> |
|||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value> |
|||
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value> |
|||
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value> |
|||
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value> |
|||
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds"> |
|||
<value type="int">0</value> |
|||
<value type="int">1</value> |
|||
<value type="int">2</value> |
|||
<value type="int">3</value> |
|||
<value type="int">4</value> |
|||
<value type="int">5</value> |
|||
<value type="int">6</value> |
|||
<value type="int">7</value> |
|||
<value type="int">8</value> |
|||
<value type="int">9</value> |
|||
<value type="int">10</value> |
|||
<value type="int">11</value> |
|||
<value type="int">12</value> |
|||
<value type="int">13</value> |
|||
<value type="int">14</value> |
|||
</valuelist> |
|||
<value type="int" key="PE.EnvironmentAspect.Base">2</value> |
|||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">VkTest</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/ali-mehrabani/Qt_projects/VkTest/VkTest.pro</value> |
|||
<value type="QString" key="RunConfiguration.Arguments"></value> |
|||
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value> |
|||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value> |
|||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> |
|||
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value> |
|||
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value> |
|||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> |
|||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> |
|||
<value type="QString" key="RunConfiguration.WorkingDirectory"></value> |
|||
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/ali-mehrabani/Qt_projects/build-VkTest-Desktop_Qt_5_13_2_GCC_64bit-Debug</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value> |
|||
</valuemap> |
|||
</data> |
|||
<data> |
|||
<variable>ProjectExplorer.Project.Target.1</variable> |
|||
<valuemap type="QVariantMap"> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Android for arm64-v8a (Clang Qt 5.13.2 for Android ARM64-v8a)</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Android for arm64-v8a (Clang Qt 5.13.2 for Android ARM64-v8a)</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{81fbc123-4ee0-45a6-968a-bd5314a00c8f}</value> |
|||
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value> |
|||
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> |
|||
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> |
|||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/ali-mehrabani/Qt_projects/build-VkTest-Android_for_arm64_v8a_Clang_Qt_5_13_2_for_Android_ARM64_v8a-Debug</value> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value> |
|||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
|||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Copy application data</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.AndroidPackageInstallationStep</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.3"> |
|||
<value type="QString" key="BuildTargetSdk">android-29</value> |
|||
<value type="QString" key="KeystoreLocation"></value> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build Android APK</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QmakeProjectManager.AndroidBuildApkStep</value> |
|||
<value type="bool" key="UseMinistro">false</value> |
|||
<value type="bool" key="VerboseOutput">false</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">4</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
|||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> |
|||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> |
|||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> |
|||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value> |
|||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1"> |
|||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/ali-mehrabani/Qt_projects/build-VkTest-Android_for_arm64_v8a_Clang_Qt_5_13_2_for_Android_ARM64_v8a-Release</value> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value> |
|||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
|||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Copy application data</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.AndroidPackageInstallationStep</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.3"> |
|||
<value type="QString" key="BuildTargetSdk">android-30</value> |
|||
<value type="QString" key="KeystoreLocation"></value> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build Android APK</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QmakeProjectManager.AndroidBuildApkStep</value> |
|||
<value type="bool" key="UseMinistro">false</value> |
|||
<value type="bool" key="VerboseOutput">false</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">4</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
|||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> |
|||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> |
|||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> |
|||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> |
|||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2"> |
|||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/ali-mehrabani/Qt_projects/build-VkTest-Android_for_arm64_v8a_Clang_Qt_5_13_2_for_Android_ARM64_v8a-Profile</value> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value> |
|||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value> |
|||
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
|||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Copy application data</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.AndroidPackageInstallationStep</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.3"> |
|||
<value type="QString" key="BuildTargetSdk">android-30</value> |
|||
<value type="QString" key="KeystoreLocation"></value> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build Android APK</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QmakeProjectManager.AndroidBuildApkStep</value> |
|||
<value type="bool" key="UseMinistro">false</value> |
|||
<value type="bool" key="VerboseOutput">false</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">4</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value> |
|||
</valuemap> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value> |
|||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value> |
|||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value> |
|||
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value> |
|||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value> |
|||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value> |
|||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value> |
|||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0"> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0"> |
|||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy to Android device</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.AndroidDeployQtStep</value> |
|||
<value type="bool" key="UninstallPreviousPackage">false</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy to Android device</value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.AndroidDeployConfiguration2</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/> |
|||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0"> |
|||
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value> |
|||
<valuelist type="QVariantList" key="Analyzer.Perf.Events"> |
|||
<value type="QString">cpu-cycles</value> |
|||
</valuelist> |
|||
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/> |
|||
<value type="int" key="Analyzer.Perf.Frequency">250</value> |
|||
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value> |
|||
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value> |
|||
<value type="int" key="Analyzer.Perf.StackSize">4096</value> |
|||
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value> |
|||
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value> |
|||
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value> |
|||
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value> |
|||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value> |
|||
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/> |
|||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value> |
|||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value> |
|||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value> |
|||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value> |
|||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value> |
|||
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value> |
|||
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value> |
|||
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value> |
|||
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value> |
|||
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value> |
|||
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value> |
|||
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/> |
|||
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value> |
|||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value> |
|||
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value> |
|||
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value> |
|||
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value> |
|||
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds"> |
|||
<value type="int">0</value> |
|||
<value type="int">1</value> |
|||
<value type="int">2</value> |
|||
<value type="int">3</value> |
|||
<value type="int">4</value> |
|||
<value type="int">5</value> |
|||
<value type="int">6</value> |
|||
<value type="int">7</value> |
|||
<value type="int">8</value> |
|||
<value type="int">9</value> |
|||
<value type="int">10</value> |
|||
<value type="int">11</value> |
|||
<value type="int">12</value> |
|||
<value type="int">13</value> |
|||
<value type="int">14</value> |
|||
</valuelist> |
|||
<value type="QString" key="Android.AmStartArgsKey"></value> |
|||
<valuelist type="QVariantList" key="Android.PostStartShellCmdListKey"/> |
|||
<valuelist type="QVariantList" key="Android.PreStartShellCmdListKey"/> |
|||
<value type="int" key="PE.EnvironmentAspect.Base">0</value> |
|||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value> |
|||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.AndroidRunConfiguration:/home/ali-mehrabani/Qt_projects/VkTest/VkTest.pro</value> |
|||
<value type="QString" key="RunConfiguration.Arguments"></value> |
|||
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value> |
|||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value> |
|||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> |
|||
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value> |
|||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> |
|||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> |
|||
</valuemap> |
|||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value> |
|||
</valuemap> |
|||
</data> |
|||
<data> |
|||
<variable>ProjectExplorer.Project.TargetCount</variable> |
|||
<value type="int">2</value> |
|||
</data> |
|||
<data> |
|||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable> |
|||
<value type="int">22</value> |
|||
</data> |
|||
<data> |
|||
<variable>Version</variable> |
|||
<value type="int">22</value> |
|||
</data> |
|||
</qtcreator> |
File diff suppressed because it is too large
@ -0,0 +1,427 @@ |
|||
#ifndef COMPUTEANDGRAPHICS_H |
|||
#define COMPUTEANDGRAPHICS_H |
|||
|
|||
#pragma once |
|||
|
|||
#ifdef NDEBUG |
|||
const bool enableValidationLayers = false; |
|||
#else |
|||
const bool enableValidationLayers = true; |
|||
#endif |
|||
|
|||
#include "Types.h" |
|||
|
|||
#include <chrono> |
|||
|
|||
|
|||
#include <optional> |
|||
#include <cstdint> // Necessary for uint32_t |
|||
#include <limits> // Necessary for std::numeric_limits |
|||
#include <algorithm> // Necessary for std::clamp |
|||
#include <fstream> |
|||
#include <array> |
|||
|
|||
#ifdef Q_OS_ANDROID |
|||
const QString TARGET_PLATFORM = "Android"; |
|||
#else |
|||
const QString TARGET_PLATFORM = "Linux"; |
|||
#endif |
|||
|
|||
const int MAX_FRAMES_IN_FLIGHT = 2; |
|||
|
|||
const uint32_t PARTICLE_COUNT = 8192; |
|||
|
|||
struct Particle { |
|||
alignas(16) glm::vec2 position; |
|||
alignas(16) glm::vec2 velocity; |
|||
alignas(16) glm::vec4 color; |
|||
|
|||
static VkVertexInputBindingDescription getBindingDescription() { |
|||
VkVertexInputBindingDescription bindingDescription{}; |
|||
bindingDescription.binding = 0; |
|||
bindingDescription.stride = sizeof(Particle); |
|||
bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; |
|||
|
|||
return bindingDescription; |
|||
} |
|||
|
|||
static std::array<VkVertexInputAttributeDescription, 2> getAttributeDescriptions() { |
|||
std::array<VkVertexInputAttributeDescription, 2> attributeDescriptions{}; |
|||
|
|||
attributeDescriptions[0].binding = 0; |
|||
attributeDescriptions[0].location = 0; |
|||
attributeDescriptions[0].format = VK_FORMAT_R32G32_SFLOAT; |
|||
attributeDescriptions[0].offset = offsetof(Particle, position); |
|||
|
|||
attributeDescriptions[1].binding = 0; |
|||
attributeDescriptions[1].location = 1; |
|||
attributeDescriptions[1].format = VK_FORMAT_R32G32B32A32_SFLOAT; |
|||
attributeDescriptions[1].offset = offsetof(Particle, color); |
|||
|
|||
return attributeDescriptions; |
|||
} |
|||
}; |
|||
|
|||
struct QueueFamilyIndices { |
|||
std::optional<uint32_t> graphicsFamily; |
|||
std::optional<uint32_t> presentFamily; |
|||
|
|||
bool isComplete() { |
|||
return graphicsFamily.has_value() && presentFamily.has_value(); |
|||
} |
|||
}; |
|||
|
|||
struct Vertex { |
|||
alignas(16) glm::vec3 pos; |
|||
alignas(16) glm::vec3 color; |
|||
alignas(16) glm::vec2 texCoord; |
|||
|
|||
static VkVertexInputBindingDescription getBindingDescription() { |
|||
VkVertexInputBindingDescription bindingDescription{}; |
|||
bindingDescription.binding = 0; |
|||
bindingDescription.stride = sizeof(Vertex); |
|||
bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; |
|||
|
|||
return bindingDescription; |
|||
} |
|||
|
|||
static std::array<VkVertexInputAttributeDescription, 3> getAttributeDescriptions() { |
|||
std::array<VkVertexInputAttributeDescription, 3> attributeDescriptions{}; |
|||
|
|||
attributeDescriptions[0].binding = 0; |
|||
attributeDescriptions[0].location = 0; |
|||
attributeDescriptions[0].format = VK_FORMAT_R32G32B32_SFLOAT; |
|||
attributeDescriptions[0].offset = offsetof(Vertex, pos); |
|||
|
|||
attributeDescriptions[1].binding = 0; |
|||
attributeDescriptions[1].location = 1; |
|||
attributeDescriptions[1].format = VK_FORMAT_R32G32B32_SFLOAT; |
|||
attributeDescriptions[1].offset = offsetof(Vertex, color); |
|||
|
|||
attributeDescriptions[2].binding = 0; |
|||
attributeDescriptions[2].location = 2; |
|||
attributeDescriptions[2].format = VK_FORMAT_R32G32_SFLOAT; |
|||
attributeDescriptions[2].offset = offsetof(Vertex, texCoord); |
|||
|
|||
return attributeDescriptions; |
|||
} |
|||
|
|||
bool operator==(const Vertex& other) const { |
|||
return pos == other.pos && color == other.color && texCoord == other.texCoord; |
|||
} |
|||
}; |
|||
|
|||
namespace std { |
|||
template<> struct hash<Vertex> { |
|||
size_t operator()(Vertex const& vertex) const { |
|||
return ((hash<glm::vec3>()(vertex.pos) ^ |
|||
(hash<glm::vec3>()(vertex.color) << 1)) >> 1) ^ |
|||
(hash<glm::vec2>()(vertex.texCoord) << 1); |
|||
} |
|||
}; |
|||
} |
|||
|
|||
struct UniformBufferObject { |
|||
alignas(16) glm::mat4 model; |
|||
alignas(16) glm::mat4 view; |
|||
alignas(16) glm::mat4 proj; |
|||
}; |
|||
|
|||
class ComputeAndGraphics |
|||
{ |
|||
public: |
|||
ComputeAndGraphics(); |
|||
void run(); |
|||
|
|||
// Message Callback
|
|||
static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT /*messageSeverity*/, |
|||
VkDebugUtilsMessageTypeFlagsEXT /*messageType*/,const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,void* /*pUserData*/) { |
|||
|
|||
std::cerr << "validation layer: " << pCallbackData->pMessage << std::endl; |
|||
|
|||
return VK_FALSE; |
|||
} |
|||
static std::vector<char> readFile(const std::string& filename); |
|||
|
|||
static void framebufferResizeCallback(GLFWwindow* window, int width, int height); |
|||
// static void framebufferResizeCallback(QQuickWindow* window, int width, int height);
|
|||
|
|||
private: |
|||
void initWindow(); |
|||
void initVulkan(); |
|||
void mainLoop(); |
|||
void cleanup(); |
|||
void createInstance(); |
|||
|
|||
// Enable Validation Layers
|
|||
bool checkValidationLayerSupport(); |
|||
|
|||
// Message Callback
|
|||
std::vector<const char*> getRequiredExtensions(); |
|||
void setupDebugMessenger(); |
|||
|
|||
void pickPhysicalDevice(); |
|||
void chooseDevice(uint32_t deviceCount); |
|||
bool isDeviceSuitable(VkPhysicalDevice device); |
|||
|
|||
void createLogicalDevice(); |
|||
QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device); |
|||
|
|||
void createSurface(); |
|||
|
|||
bool checkDeviceExtensionSupport(VkPhysicalDevice device); |
|||
SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device); |
|||
VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR>& availableFormats); |
|||
VkPresentModeKHR chooseSwapPresentMode(const std::vector<VkPresentModeKHR>& availablePresentModes); |
|||
VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities); |
|||
void createSwapChain(); |
|||
|
|||
void createImageViews(); |
|||
|
|||
void createGraphicsPipeline(); |
|||
VkShaderModule createShaderModule(const std::vector<char>& code); |
|||
void createRenderPass(); |
|||
|
|||
void createFramebuffers(); |
|||
void createCommandPool(); |
|||
void createCommandBuffer(); |
|||
void recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex); |
|||
|
|||
void drawFrame(); |
|||
void createSyncObjects(); |
|||
|
|||
void recreateSwapChain(); |
|||
void cleanupSwapChain(); |
|||
|
|||
void createVertexBuffer(); |
|||
uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties); |
|||
void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory); |
|||
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); |
|||
void createIndexBuffer(); |
|||
|
|||
void createDescriptorSetLayout(); |
|||
void createUniformBuffers(); |
|||
void updateUniformBuffer(uint32_t currentImage); |
|||
void createDescriptorPool(); |
|||
void createDescriptorSets(); |
|||
|
|||
void createTextureImage(); |
|||
void createImage(uint32_t width, uint32_t height, uint32_t mipLevels, VkSampleCountFlagBits numSamples, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage |
|||
, VkMemoryPropertyFlags properties, VkImage& image, VkDeviceMemory& imageMemory); |
|||
VkCommandBuffer beginSingleTimeCommands(); |
|||
void endSingleTimeCommands(VkCommandBuffer commandBuffer); |
|||
void transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout, uint32_t mipLevels); |
|||
void copyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height); |
|||
void createTextureImageView(); |
|||
VkImageView createImageView(VkImage image, VkFormat format, VkImageAspectFlags aspectFlags, uint32_t mipLevels); |
|||
void createTextureSampler(); |
|||
|
|||
void createDepthResources(); |
|||
VkFormat findSupportedFormat(const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features); |
|||
VkFormat findDepthFormat(); |
|||
bool hasStencilComponent(VkFormat format); |
|||
|
|||
void loadModel(); |
|||
|
|||
void generateMipmaps(VkImage image, VkFormat imageFormat, int32_t texWidth, int32_t texHeight, uint32_t mipLevels); |
|||
|
|||
VkSampleCountFlagBits getMaxUsableSampleCount(); |
|||
void createColorResources(); |
|||
|
|||
void createShaderStorageBuffers(); |
|||
void createComputePipeline(); |
|||
void createComputeCommandBuffers(); |
|||
void recordComputeCommandBuffer(VkCommandBuffer commandBuffer); |
|||
void createComputeDescriptorSets(); |
|||
void createComputeDescriptorSetLayout(); |
|||
void createComputeDescriptorPool(); |
|||
|
|||
VkApplicationInfo createInstanceAppInfo(); |
|||
VkDebugUtilsMessengerCreateInfoEXT createInstanceDebugMessengerInfo(); |
|||
VkInstanceCreateInfo createInstanceInfo(VkApplicationInfo* appInfo, std::vector<const char*>& extensions |
|||
, VkDebugUtilsMessengerCreateInfoEXT& debugCreateInfo); |
|||
|
|||
VkDeviceQueueCreateInfo createQueueInfo(uint32_t queueFamily, uint32_t queueCount, float* queuePriority); |
|||
VkPhysicalDeviceFeatures createDeviceFeatures(); |
|||
VkDeviceCreateInfo createLogicalDeviceInfo(std::vector<VkDeviceQueueCreateInfo>& queueCreateInfos, VkPhysicalDeviceFeatures* deviceFeatures); |
|||
|
|||
VkSwapchainCreateInfoKHR createSwapChainInfo(SwapChainSupportDetails swapChainSupport, VkSurfaceKHR _surface, uint32_t imageCount |
|||
, VkSurfaceFormatKHR surfaceFormat, VkExtent2D extent, VkPresentModeKHR presentMode); |
|||
|
|||
VkAttachmentDescription createColorAttachmentInfo(VkFormat format, VkSampleCountFlagBits msaaSamples); |
|||
VkAttachmentDescription createDepthAttachmentInfo(VkFormat format, VkSampleCountFlagBits msaaSamples); |
|||
VkAttachmentDescription createColorAttachmentResolveInfo(VkFormat format, VkSampleCountFlagBits msaaSamples); |
|||
VkAttachmentReference createAttachmentRefInfo(uint32_t offset, VkImageLayout layout); |
|||
VkSubpassDescription createSubpassInfo(VkAttachmentReference* colorAttachRef, VkAttachmentReference* depthAttachRef |
|||
, VkAttachmentReference* colorAttachResolverRef); |
|||
VkRenderPassCreateInfo createRenderPassInfo(std::vector<VkAttachmentDescription>& attachments, VkSubpassDescription* subpass, VkSubpassDependency* dependency); |
|||
VkSubpassDependency createSubpassDependencyInfo(); |
|||
|
|||
VkDescriptorSetLayoutBinding createLayoutBindingInfo(uint32_t offset, VkDescriptorType descType, VkShaderStageFlagBits StageFlags); |
|||
|
|||
VkPipelineShaderStageCreateInfo createPipelineShaderInfo(VkShaderStageFlagBits stage, VkShaderModule module); |
|||
VkPipelineVertexInputStateCreateInfo createPipelineVertexInputInfo(); |
|||
VkPipelineInputAssemblyStateCreateInfo createPipelineInputAssemblyStateInfo(); |
|||
VkPipelineDynamicStateCreateInfo createPipelineDynamicStateInfo(std::vector<VkDynamicState>& dynamicStates); |
|||
VkPipelineViewportStateCreateInfo createPipelineViewportStateInfo(); |
|||
VkPipelineRasterizationStateCreateInfo createPipelineRasterizationStateInfo(); |
|||
VkPipelineMultisampleStateCreateInfo createPipelineMultisampleStateInfo(); |
|||
VkPipelineColorBlendAttachmentState colorPipelineBlendAttachmentStateInfo(); |
|||
VkPipelineColorBlendStateCreateInfo colorPipelineBlendStateInfo(VkPipelineColorBlendAttachmentState* colorBlendAttachment); |
|||
VkPipelineLayoutCreateInfo createPipelineLayoutInfo(); |
|||
VkPipelineDepthStencilStateCreateInfo createPipelineDepthStencilStateInfo(); |
|||
VkPipelineLayoutCreateInfo createComputePipelineLayoutInfo(); |
|||
|
|||
VkFramebufferCreateInfo createFramebufferInfo(std::vector<VkImageView>& attachments); |
|||
|
|||
void copyImageToStagingBuffer(VkBuffer& stagingBuffer, VkDeviceMemory& stagingBufferMemory, stbi_uc* pixels, VkDeviceSize imageSize); |
|||
|
|||
VkImageMemoryBarrier initMipmapBarrier(VkImage image); |
|||
void setFirstStepMipmapBarrierInfo(VkImageMemoryBarrier& barrier, uint32_t index); |
|||
void setSecondStepMipmapBarrierInfo(VkImageMemoryBarrier& barrier, uint32_t index); |
|||
void setLastStepMipmapBarrierInfo(VkImageMemoryBarrier& barrier, uint32_t index); |
|||
VkImageBlit createBlitMipMapInfo(int32_t mipWidth, int32_t mipHeight, uint32_t index); |
|||
|
|||
VkImageMemoryBarrier initTransitionLayoutBarrierInfo(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout, uint32_t mipLevels); |
|||
void setSrcAndDst(VkImageMemoryBarrier& barrier, VkPipelineStageFlags& sourceStage, VkPipelineStageFlags& destinationStage, VkImageLayout oldLayout |
|||
, VkImageLayout newLayout); |
|||
|
|||
void allocateAndBindImageMemory(VkImage& image, VkDeviceMemory& imageMemory, VkMemoryPropertyFlags properties); |
|||
|
|||
VkBufferImageCopy createBufferImageCopyInfo(uint32_t width, uint32_t height); |
|||
|
|||
Vertex createLoadModelVertex(tinyobj::attrib_t attrib, tinyobj::index_t index); |
|||
|
|||
void copyVerticesToStagingBuffer(VkBuffer& stagingBuffer, VkDeviceMemory& stagingBufferMemory); |
|||
void copyIndicesToStagingBuffer(VkBuffer& stagingBuffer, VkDeviceMemory& stagingBufferMemory); |
|||
|
|||
void allocateAndBindBufferMemory(VkBuffer& buffer, VkDeviceMemory& bufferMemory, VkMemoryPropertyFlags properties); |
|||
void copyParticlesToStagingBuffer(VkBuffer& stagingBuffer, VkDeviceMemory& stagingBufferMemory); |
|||
|
|||
std::vector<Particle> initParticles(); |
|||
void initShaderStorageBuffers(VkBuffer& stagingBuffer); |
|||
|
|||
void allocateDescriptorSets(); |
|||
VkDescriptorBufferInfo createDescriptorBufferInfo(VkBuffer buffer, VkDeviceSize range); |
|||
VkDescriptorImageInfo createDescriptorImageInfo(); |
|||
void addUniformBufferWriteDescriptor(VkWriteDescriptorSet& descriptorWrite, VkDescriptorBufferInfo* bufferInfo, size_t index, uint32_t dstBinding); |
|||
void addImageWriteDescriptor(VkWriteDescriptorSet& descriptorWrite, VkDescriptorImageInfo* imageInfo, size_t index, uint32_t dstBinding); |
|||
|
|||
void allocateComputeDescriptorSets(); |
|||
void addStorageBufferWriteDescriptor(VkWriteDescriptorSet& descriptorWrite, VkDescriptorBufferInfo* bufferInfo, size_t index, uint32_t dstBinding); |
|||
|
|||
void computeSubmission(); |
|||
VkSubmitInfo createComputeSubmitInfo(); |
|||
VkResult graphicsSubmission(); |
|||
void drawSubmission(uint32_t imageIndex, VkSemaphore* waitSemaphores, VkPipelineStageFlags* waitStages, VkSemaphore* signalSemaphores); |
|||
VkSubmitInfo createDrawSubmitInfo(VkSemaphore* waitSemaphores, VkPipelineStageFlags* waitStages, VkSemaphore* signalSemaphores); |
|||
VkResult presentSubmission(uint32_t imageIndex, VkSemaphore* signalSemaphores); |
|||
|
|||
VkViewport createViewportInfo(); |
|||
VkRect2D createScissorInfo(); |
|||
void beginPipelineCommands(VkCommandBuffer commandBuffer); |
|||
void beginRenderPass(VkCommandBuffer commandBuffer, uint32_t imageIndex); |
|||
|
|||
void cleanPipeline(); |
|||
void cleanBuffers(); |
|||
void cleanSyncObjects(); |
|||
void cleanBase(); |
|||
|
|||
const int32_t WIDTH = 800; |
|||
const int32_t HEIGHT = 600; |
|||
|
|||
const std::string MODEL_PATH = "/home/ali-mehrabani/Qt_projects/VkTest/models/viking_room.obj"; |
|||
const std::string TEXTURE_PATH = "/home/ali-mehrabani/Qt_projects/VkTest/textures/viking_room.png"; |
|||
|
|||
const std::vector<const char*> validationLayers = { |
|||
"VK_LAYER_KHRONOS_validation" |
|||
}; |
|||
const std::vector<const char*> deviceExtensions = { |
|||
VK_KHR_SWAPCHAIN_EXTENSION_NAME |
|||
}; |
|||
// const std::vector<Vertex> _vertices = {
|
|||
// {{-0.5f, -0.5f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f}},
|
|||
// {{0.5f, -0.5f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f}},
|
|||
// {{0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}},
|
|||
// {{-0.5f, 0.5f, 0.0f}, {1.0f, 1.0f, 1.0f}, {1.0f, 1.0f}},
|
|||
|
|||
// {{-0.5f, -0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
|
|||
// {{0.5f, -0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}},
|
|||
// {{0.5f, 0.5f, -0.5f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}},
|
|||
// {{-0.5f, 0.5f, -0.5f}, {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f}}
|
|||
// };
|
|||
// const std::vector<uint16_t> _indices = {
|
|||
// 0, 1, 2, 2, 3, 0,
|
|||
// 4, 5, 6, 6, 7, 4
|
|||
// };
|
|||
|
|||
std::vector<Vertex> _vertices; |
|||
std::vector<uint32_t> _indices; |
|||
|
|||
uint32_t currentFrame = 0; |
|||
bool framebufferResized = false; |
|||
|
|||
GLFWwindow *_window; |
|||
// QQuickWindow* _window;
|
|||
VkInstance _instance; |
|||
VkDebugUtilsMessengerEXT _debugMessenger; |
|||
VkPhysicalDevice _physicalDevice; |
|||
VkDevice _device; |
|||
VkQueue _graphicsQueue; |
|||
VkSurfaceKHR _surface; |
|||
VkQueue _presentQueue; |
|||
VkSwapchainKHR _swapChain; |
|||
std::vector<VkImage> _swapChainImages; |
|||
VkFormat _swapChainImageFormat; |
|||
VkExtent2D _swapChainExtent; |
|||
std::vector<VkImageView> _swapChainImageViews; |
|||
VkRenderPass _renderPass; |
|||
VkDescriptorSetLayout _descriptorSetLayout; |
|||
VkPipelineLayout _pipelineLayout; |
|||
VkPipeline _graphicsPipeline; |
|||
std::vector<VkFramebuffer> _swapChainFramebuffers; |
|||
VkCommandPool _commandPool; |
|||
std::vector<VkCommandBuffer> _commandBuffers; |
|||
std::vector<VkSemaphore> _imageAvailableSemaphores; |
|||
std::vector<VkSemaphore> _renderFinishedSemaphores; |
|||
std::vector<VkFence> _inFlightFences; |
|||
VkBuffer _vertexBuffer; |
|||
VkDeviceMemory _vertexBufferMemory; |
|||
VkBuffer _indexBuffer; |
|||
VkDeviceMemory _indexBufferMemory; |
|||
|
|||
std::vector<VkBuffer> _uniformBuffers; |
|||
std::vector<VkDeviceMemory> _uniformBuffersMemory; |
|||
std::vector<void*> _uniformBuffersMapped; |
|||
VkDescriptorPool _descriptorPool; |
|||
std::vector<VkDescriptorSet> _descriptorSets; |
|||
|
|||
uint32_t _mipLevels; |
|||
VkImage _textureImage; |
|||
VkDeviceMemory _textureImageMemory; |
|||
VkImageView _textureImageView; |
|||
VkSampler _textureSampler; |
|||
|
|||
VkImage _depthImage; |
|||
VkDeviceMemory _depthImageMemory; |
|||
VkImageView _depthImageView; |
|||
|
|||
VkSampleCountFlagBits _msaaSamples = VK_SAMPLE_COUNT_1_BIT; |
|||
VkImage _colorImage; |
|||
VkDeviceMemory _colorImageMemory; |
|||
VkImageView _colorImageView; |
|||
|
|||
std::vector<VkBuffer> _shaderStorageBuffers; |
|||
std::vector<VkDeviceMemory> _shaderStorageBuffersMemory; |
|||
VkPipelineLayout _computePipelineLayout; |
|||
VkPipeline _computePipeline; |
|||
VkDescriptorSetLayout _computeDescriptorSetLayout; |
|||
VkDescriptorPool _computeDescriptorPool; |
|||
std::vector<VkDescriptorSet> _computeDescriptorSets; |
|||
std::vector<VkCommandBuffer> _computeCommandBuffers; |
|||
std::vector<VkFence> _computeInFlightFences; |
|||
std::vector<VkSemaphore> _computeFinishedSemaphores; |
|||
|
|||
}; |
|||
|
|||
#endif // COMPUTEANDGRAPHICS_H
|
File diff suppressed because it is too large
@ -0,0 +1,427 @@ |
|||
#ifndef HELLOTRIANGLEAPPLICATION_H |
|||
#define HELLOTRIANGLEAPPLICATION_H |
|||
|
|||
#pragma once |
|||
|
|||
#ifdef NDEBUG |
|||
const bool enableValidationLayers = false; |
|||
#else |
|||
const bool enableValidationLayers = true; |
|||
#endif |
|||
|
|||
#include "Types.h" |
|||
|
|||
#include <chrono> |
|||
|
|||
|
|||
#include <optional> |
|||
#include <cstdint> // Necessary for uint32_t |
|||
#include <limits> // Necessary for std::numeric_limits |
|||
#include <algorithm> // Necessary for std::clamp |
|||
#include <fstream> |
|||
#include <array> |
|||
|
|||
#ifdef Q_OS_ANDROID |
|||
const QString TARGET_PLATFORM = "Android"; |
|||
#else |
|||
const QString TARGET_PLATFORM = "Linux"; |
|||
#endif |
|||
|
|||
const int MAX_FRAMES_IN_FLIGHT = 2; |
|||
|
|||
const uint32_t PARTICLE_COUNT = 8192; |
|||
|
|||
struct Particle { |
|||
alignas(16) glm::vec2 position; |
|||
alignas(16) glm::vec2 velocity; |
|||
alignas(16) glm::vec4 color; |
|||
|
|||
static VkVertexInputBindingDescription getBindingDescription() { |
|||
VkVertexInputBindingDescription bindingDescription{}; |
|||
bindingDescription.binding = 0; |
|||
bindingDescription.stride = sizeof(Particle); |
|||
bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; |
|||
|
|||
return bindingDescription; |
|||
} |
|||
|
|||
static std::array<VkVertexInputAttributeDescription, 2> getAttributeDescriptions() { |
|||
std::array<VkVertexInputAttributeDescription, 2> attributeDescriptions{}; |
|||
|
|||
attributeDescriptions[0].binding = 0; |
|||
attributeDescriptions[0].location = 0; |
|||
attributeDescriptions[0].format = VK_FORMAT_R32G32_SFLOAT; |
|||
attributeDescriptions[0].offset = offsetof(Particle, position); |
|||
|
|||
attributeDescriptions[1].binding = 0; |
|||
attributeDescriptions[1].location = 1; |
|||
attributeDescriptions[1].format = VK_FORMAT_R32G32B32A32_SFLOAT; |
|||
attributeDescriptions[1].offset = offsetof(Particle, color); |
|||
|
|||
return attributeDescriptions; |
|||
} |
|||
}; |
|||
|
|||
struct QueueFamilyIndices { |
|||
std::optional<uint32_t> graphicsFamily; |
|||
std::optional<uint32_t> presentFamily; |
|||
|
|||
bool isComplete() { |
|||
return graphicsFamily.has_value() && presentFamily.has_value(); |
|||
} |
|||
}; |
|||
|
|||
struct Vertex { |
|||
alignas(16) glm::vec3 pos; |
|||
alignas(16) glm::vec3 color; |
|||
alignas(16) glm::vec2 texCoord; |
|||
|
|||
static VkVertexInputBindingDescription getBindingDescription() { |
|||
VkVertexInputBindingDescription bindingDescription{}; |
|||
bindingDescription.binding = 0; |
|||
bindingDescription.stride = sizeof(Vertex); |
|||
bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; |
|||
|
|||
return bindingDescription; |
|||
} |
|||
|
|||
static std::array<VkVertexInputAttributeDescription, 3> getAttributeDescriptions() { |
|||
std::array<VkVertexInputAttributeDescription, 3> attributeDescriptions{}; |
|||
|
|||
attributeDescriptions[0].binding = 0; |
|||
attributeDescriptions[0].location = 0; |
|||
attributeDescriptions[0].format = VK_FORMAT_R32G32B32_SFLOAT; |
|||
attributeDescriptions[0].offset = offsetof(Vertex, pos); |
|||
|
|||
attributeDescriptions[1].binding = 0; |
|||
attributeDescriptions[1].location = 1; |
|||
attributeDescriptions[1].format = VK_FORMAT_R32G32B32_SFLOAT; |
|||
attributeDescriptions[1].offset = offsetof(Vertex, color); |
|||
|
|||
attributeDescriptions[2].binding = 0; |
|||
attributeDescriptions[2].location = 2; |
|||
attributeDescriptions[2].format = VK_FORMAT_R32G32_SFLOAT; |
|||
attributeDescriptions[2].offset = offsetof(Vertex, texCoord); |
|||
|
|||
return attributeDescriptions; |
|||
} |
|||
|
|||
bool operator==(const Vertex& other) const { |
|||
return pos == other.pos && color == other.color && texCoord == other.texCoord; |
|||
} |
|||
}; |
|||
|
|||
namespace std { |
|||
template<> struct hash<Vertex> { |
|||
size_t operator()(Vertex const& vertex) const { |
|||
return ((hash<glm::vec3>()(vertex.pos) ^ |
|||
(hash<glm::vec3>()(vertex.color) << 1)) >> 1) ^ |
|||
(hash<glm::vec2>()(vertex.texCoord) << 1); |
|||
} |
|||
}; |
|||
} |
|||
|
|||
struct UniformBufferObject { |
|||
alignas(16) glm::mat4 model; |
|||
alignas(16) glm::mat4 view; |
|||
alignas(16) glm::mat4 proj; |
|||
}; |
|||
|
|||
class HelloTriangleApplication |
|||
{ |
|||
public: |
|||
HelloTriangleApplication(); |
|||
void run(); |
|||
|
|||
// Message Callback
|
|||
static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT /*messageSeverity*/, |
|||
VkDebugUtilsMessageTypeFlagsEXT /*messageType*/,const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,void* /*pUserData*/) { |
|||
|
|||
std::cerr << "validation layer: " << pCallbackData->pMessage << std::endl; |
|||
|
|||
return VK_FALSE; |
|||
} |
|||
static std::vector<char> readFile(const std::string& filename); |
|||
|
|||
static void framebufferResizeCallback(GLFWwindow* window, int width, int height); |
|||
// static void framebufferResizeCallback(QQuickWindow* window, int width, int height);
|
|||
|
|||
private: |
|||
void initWindow(); |
|||
void initVulkan(); |
|||
void mainLoop(); |
|||
void cleanup(); |
|||
void createInstance(); |
|||
|
|||
// Enable Validation Layers
|
|||
bool checkValidationLayerSupport(); |
|||
|
|||
// Message Callback
|
|||
std::vector<const char*> getRequiredExtensions(); |
|||
void setupDebugMessenger(); |
|||
|
|||
void pickPhysicalDevice(); |
|||
void chooseDevice(uint32_t deviceCount); |
|||
bool isDeviceSuitable(VkPhysicalDevice device); |
|||
|
|||
void createLogicalDevice(); |
|||
QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device); |
|||
|
|||
void createSurface(); |
|||
|
|||
bool checkDeviceExtensionSupport(VkPhysicalDevice device); |
|||
SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device); |
|||
VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR>& availableFormats); |
|||
VkPresentModeKHR chooseSwapPresentMode(const std::vector<VkPresentModeKHR>& availablePresentModes); |
|||
VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities); |
|||
void createSwapChain(); |
|||
|
|||
void createImageViews(); |
|||
|
|||
void createGraphicsPipeline(); |
|||
VkShaderModule createShaderModule(const std::vector<char>& code); |
|||
void createRenderPass(); |
|||
|
|||
void createFramebuffers(); |
|||
void createCommandPool(); |
|||
void createCommandBuffer(); |
|||
void recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex); |
|||
|
|||
void drawFrame(); |
|||
void createSyncObjects(); |
|||
|
|||
void recreateSwapChain(); |
|||
void cleanupSwapChain(); |
|||
|
|||
void createVertexBuffer(); |
|||
uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties); |
|||
void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory); |
|||
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); |
|||
void createIndexBuffer(); |
|||
|
|||
void createDescriptorSetLayout(); |
|||
void createUniformBuffers(); |
|||
void updateUniformBuffer(uint32_t currentImage); |
|||
void createDescriptorPool(); |
|||
void createDescriptorSets(); |
|||
|
|||
void createTextureImage(); |
|||
void createImage(uint32_t width, uint32_t height, uint32_t mipLevels, VkSampleCountFlagBits numSamples, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage |
|||
, VkMemoryPropertyFlags properties, VkImage& image, VkDeviceMemory& imageMemory); |
|||
VkCommandBuffer beginSingleTimeCommands(); |
|||
void endSingleTimeCommands(VkCommandBuffer commandBuffer); |
|||
void transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout, uint32_t mipLevels); |
|||
void copyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height); |
|||
void createTextureImageView(); |
|||
VkImageView createImageView(VkImage image, VkFormat format, VkImageAspectFlags aspectFlags, uint32_t mipLevels); |
|||
void createTextureSampler(); |
|||
|
|||
void createDepthResources(); |
|||
VkFormat findSupportedFormat(const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features); |
|||
VkFormat findDepthFormat(); |
|||
bool hasStencilComponent(VkFormat format); |
|||
|
|||
void loadModel(); |
|||
|
|||
void generateMipmaps(VkImage image, VkFormat imageFormat, int32_t texWidth, int32_t texHeight, uint32_t mipLevels); |
|||
|
|||
VkSampleCountFlagBits getMaxUsableSampleCount(); |
|||
void createColorResources(); |
|||
|
|||
void createShaderStorageBuffers(); |
|||
void createComputePipeline(); |
|||
void createComputeCommandBuffers(); |
|||
void recordComputeCommandBuffer(VkCommandBuffer commandBuffer); |
|||
void createComputeDescriptorSets(); |
|||
void createComputeDescriptorSetLayout(); |
|||
void createComputeDescriptorPool(); |
|||
|
|||
VkApplicationInfo createInstanceAppInfo(); |
|||
VkDebugUtilsMessengerCreateInfoEXT createInstanceDebugMessengerInfo(); |
|||
VkInstanceCreateInfo createInstanceInfo(VkApplicationInfo* appInfo, std::vector<const char*>& extensions |
|||
, VkDebugUtilsMessengerCreateInfoEXT& debugCreateInfo); |
|||
|
|||
VkDeviceQueueCreateInfo createQueueInfo(uint32_t queueFamily, uint32_t queueCount, float* queuePriority); |
|||
VkPhysicalDeviceFeatures createDeviceFeatures(); |
|||
VkDeviceCreateInfo createLogicalDeviceInfo(std::vector<VkDeviceQueueCreateInfo>& queueCreateInfos, VkPhysicalDeviceFeatures* deviceFeatures); |
|||
|
|||
VkSwapchainCreateInfoKHR createSwapChainInfo(SwapChainSupportDetails swapChainSupport, VkSurfaceKHR _surface, uint32_t imageCount |
|||
, VkSurfaceFormatKHR surfaceFormat, VkExtent2D extent, VkPresentModeKHR presentMode); |
|||
|
|||
VkAttachmentDescription createColorAttachmentInfo(VkFormat format, VkSampleCountFlagBits msaaSamples); |
|||
VkAttachmentDescription createDepthAttachmentInfo(VkFormat format, VkSampleCountFlagBits msaaSamples); |
|||
VkAttachmentDescription createColorAttachmentResolveInfo(VkFormat format, VkSampleCountFlagBits msaaSamples); |
|||
VkAttachmentReference createAttachmentRefInfo(uint32_t offset, VkImageLayout layout); |
|||
VkSubpassDescription createSubpassInfo(VkAttachmentReference* colorAttachRef, VkAttachmentReference* depthAttachRef |
|||
, VkAttachmentReference* colorAttachResolverRef); |
|||
VkRenderPassCreateInfo createRenderPassInfo(std::vector<VkAttachmentDescription>& attachments, VkSubpassDescription* subpass, VkSubpassDependency* dependency); |
|||
VkSubpassDependency createSubpassDependencyInfo(); |
|||
|
|||
VkDescriptorSetLayoutBinding createLayoutBindingInfo(uint32_t offset, VkDescriptorType descType, VkShaderStageFlagBits StageFlags); |
|||
|
|||
VkPipelineShaderStageCreateInfo createPipelineShaderInfo(VkShaderStageFlagBits stage, VkShaderModule module); |
|||
VkPipelineVertexInputStateCreateInfo createPipelineVertexInputInfo(); |
|||
VkPipelineInputAssemblyStateCreateInfo createPipelineInputAssemblyStateInfo(); |
|||
VkPipelineDynamicStateCreateInfo createPipelineDynamicStateInfo(std::vector<VkDynamicState>& dynamicStates); |
|||
VkPipelineViewportStateCreateInfo createPipelineViewportStateInfo(); |
|||
VkPipelineRasterizationStateCreateInfo createPipelineRasterizationStateInfo(); |
|||
VkPipelineMultisampleStateCreateInfo createPipelineMultisampleStateInfo(); |
|||
VkPipelineColorBlendAttachmentState colorPipelineBlendAttachmentStateInfo(); |
|||
VkPipelineColorBlendStateCreateInfo colorPipelineBlendStateInfo(VkPipelineColorBlendAttachmentState* colorBlendAttachment); |
|||
VkPipelineLayoutCreateInfo createPipelineLayoutInfo(); |
|||
VkPipelineDepthStencilStateCreateInfo createPipelineDepthStencilStateInfo(); |
|||
VkPipelineLayoutCreateInfo createComputePipelineLayoutInfo(); |
|||
|
|||
VkFramebufferCreateInfo createFramebufferInfo(std::vector<VkImageView>& attachments); |
|||
|
|||
void copyImageToStagingBuffer(VkBuffer& stagingBuffer, VkDeviceMemory& stagingBufferMemory, stbi_uc* pixels, VkDeviceSize imageSize); |
|||
|
|||
VkImageMemoryBarrier initMipmapBarrier(VkImage image); |
|||
void setFirstStepMipmapBarrierInfo(VkImageMemoryBarrier& barrier, uint32_t index); |
|||
void setSecondStepMipmapBarrierInfo(VkImageMemoryBarrier& barrier, uint32_t index); |
|||
void setLastStepMipmapBarrierInfo(VkImageMemoryBarrier& barrier, uint32_t index); |
|||
VkImageBlit createBlitMipMapInfo(int32_t mipWidth, int32_t mipHeight, uint32_t index); |
|||
|
|||
VkImageMemoryBarrier initTransitionLayoutBarrierInfo(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout, uint32_t mipLevels); |
|||
void setSrcAndDst(VkImageMemoryBarrier& barrier, VkPipelineStageFlags& sourceStage, VkPipelineStageFlags& destinationStage, VkImageLayout oldLayout |
|||
, VkImageLayout newLayout); |
|||
|
|||
void allocateAndBindImageMemory(VkImage& image, VkDeviceMemory& imageMemory, VkMemoryPropertyFlags properties); |
|||
|
|||
VkBufferImageCopy createBufferImageCopyInfo(uint32_t width, uint32_t height); |
|||
|
|||
Vertex createLoadModelVertex(tinyobj::attrib_t attrib, tinyobj::index_t index); |
|||
|
|||
void copyVerticesToStagingBuffer(VkBuffer& stagingBuffer, VkDeviceMemory& stagingBufferMemory); |
|||
void copyIndicesToStagingBuffer(VkBuffer& stagingBuffer, VkDeviceMemory& stagingBufferMemory); |
|||
|
|||
void allocateAndBindBufferMemory(VkBuffer& buffer, VkDeviceMemory& bufferMemory, VkMemoryPropertyFlags properties); |
|||
void copyParticlesToStagingBuffer(VkBuffer& stagingBuffer, VkDeviceMemory& stagingBufferMemory); |
|||
|
|||
std::vector<Particle> initParticles(); |
|||
void initShaderStorageBuffers(VkBuffer& stagingBuffer); |
|||
|
|||
void allocateDescriptorSets(); |
|||
VkDescriptorBufferInfo createDescriptorBufferInfo(VkBuffer buffer, VkDeviceSize range); |
|||
VkDescriptorImageInfo createDescriptorImageInfo(); |
|||
void addUniformBufferWriteDescriptor(VkWriteDescriptorSet& descriptorWrite, VkDescriptorBufferInfo* bufferInfo, size_t index, uint32_t dstBinding); |
|||
void addImageWriteDescriptor(VkWriteDescriptorSet& descriptorWrite, VkDescriptorImageInfo* imageInfo, size_t index, uint32_t dstBinding); |
|||
|
|||
void allocateComputeDescriptorSets(); |
|||
void addStorageBufferWriteDescriptor(VkWriteDescriptorSet& descriptorWrite, VkDescriptorBufferInfo* bufferInfo, size_t index, uint32_t dstBinding); |
|||
|
|||
void computeSubmission(); |
|||
VkSubmitInfo createComputeSubmitInfo(); |
|||
VkResult graphicsSubmission(); |
|||
void drawSubmission(uint32_t imageIndex, VkSemaphore* waitSemaphores, VkPipelineStageFlags* waitStages, VkSemaphore* signalSemaphores); |
|||
VkSubmitInfo createDrawSubmitInfo(VkSemaphore* waitSemaphores, VkPipelineStageFlags* waitStages, VkSemaphore* signalSemaphores); |
|||
VkResult presentSubmission(uint32_t imageIndex, VkSemaphore* signalSemaphores); |
|||
|
|||
VkViewport createViewportInfo(); |
|||
VkRect2D createScissorInfo(); |
|||
void beginPipelineCommands(VkCommandBuffer commandBuffer); |
|||
void beginRenderPass(VkCommandBuffer commandBuffer, uint32_t imageIndex); |
|||
|
|||
void cleanPipeline(); |
|||
void cleanBuffers(); |
|||
void cleanSyncObjects(); |
|||
void cleanBase(); |
|||
|
|||
const int32_t WIDTH = 800; |
|||
const int32_t HEIGHT = 600; |
|||
|
|||
const std::string MODEL_PATH = "/home/ali-mehrabani/Qt_projects/VkTest/models/viking_room.obj"; |
|||
const std::string TEXTURE_PATH = "/home/ali-mehrabani/Qt_projects/VkTest/textures/viking_room.png"; |
|||
|
|||
const std::vector<const char*> validationLayers = { |
|||
"VK_LAYER_KHRONOS_validation" |
|||
}; |
|||
const std::vector<const char*> deviceExtensions = { |
|||
VK_KHR_SWAPCHAIN_EXTENSION_NAME |
|||
}; |
|||
// const std::vector<Vertex> _vertices = {
|
|||
// {{-0.5f, -0.5f, 0.0f}, {1.0f, 0.0f, 0.0f}, {1.0f, 0.0f}},
|
|||
// {{0.5f, -0.5f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f}},
|
|||
// {{0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 1.0f}},
|
|||
// {{-0.5f, 0.5f, 0.0f}, {1.0f, 1.0f, 1.0f}, {1.0f, 1.0f}},
|
|||
|
|||
// {{-0.5f, -0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}},
|
|||
// {{0.5f, -0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}},
|
|||
// {{0.5f, 0.5f, -0.5f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}},
|
|||
// {{-0.5f, 0.5f, -0.5f}, {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f}}
|
|||
// };
|
|||
// const std::vector<uint16_t> _indices = {
|
|||
// 0, 1, 2, 2, 3, 0,
|
|||
// 4, 5, 6, 6, 7, 4
|
|||
// };
|
|||
|
|||
std::vector<Vertex> _vertices; |
|||
std::vector<uint32_t> _indices; |
|||
|
|||
uint32_t currentFrame = 0; |
|||
bool framebufferResized = false; |
|||
|
|||
GLFWwindow *_window; |
|||
// QQuickWindow* _window;
|
|||
VkInstance _instance; |
|||
VkDebugUtilsMessengerEXT _debugMessenger; |
|||
VkPhysicalDevice _physicalDevice; |
|||
VkDevice _device; |
|||
VkQueue _graphicsQueue; |
|||
VkSurfaceKHR _surface; |
|||
VkQueue _presentQueue; |
|||
VkSwapchainKHR _swapChain; |
|||
std::vector<VkImage> _swapChainImages; |
|||
VkFormat _swapChainImageFormat; |
|||
VkExtent2D _swapChainExtent; |
|||
std::vector<VkImageView> _swapChainImageViews; |
|||
VkRenderPass _renderPass; |
|||
VkDescriptorSetLayout _descriptorSetLayout; |
|||
VkPipelineLayout _pipelineLayout; |
|||
VkPipeline _graphicsPipeline; |
|||
std::vector<VkFramebuffer> _swapChainFramebuffers; |
|||
VkCommandPool _commandPool; |
|||
std::vector<VkCommandBuffer> _commandBuffers; |
|||
std::vector<VkSemaphore> _imageAvailableSemaphores; |
|||
std::vector<VkSemaphore> _renderFinishedSemaphores; |
|||
std::vector<VkFence> _inFlightFences; |
|||
VkBuffer _vertexBuffer; |
|||
VkDeviceMemory _vertexBufferMemory; |
|||
VkBuffer _indexBuffer; |
|||
VkDeviceMemory _indexBufferMemory; |
|||
|
|||
std::vector<VkBuffer> _uniformBuffers; |
|||
std::vector<VkDeviceMemory> _uniformBuffersMemory; |
|||
std::vector<void*> _uniformBuffersMapped; |
|||
VkDescriptorPool _descriptorPool; |
|||
std::vector<VkDescriptorSet> _descriptorSets; |
|||
|
|||
uint32_t _mipLevels; |
|||
VkImage _textureImage; |
|||
VkDeviceMemory _textureImageMemory; |
|||
VkImageView _textureImageView; |
|||
VkSampler _textureSampler; |
|||
|
|||
VkImage _depthImage; |
|||
VkDeviceMemory _depthImageMemory; |
|||
VkImageView _depthImageView; |
|||
|
|||
VkSampleCountFlagBits _msaaSamples = VK_SAMPLE_COUNT_1_BIT; |
|||
VkImage _colorImage; |
|||
VkDeviceMemory _colorImageMemory; |
|||
VkImageView _colorImageView; |
|||
|
|||
std::vector<VkBuffer> _shaderStorageBuffers; |
|||
std::vector<VkDeviceMemory> _shaderStorageBuffersMemory; |
|||
VkPipelineLayout _computePipelineLayout; |
|||
VkPipeline _computePipeline; |
|||
VkDescriptorSetLayout _computeDescriptorSetLayout; |
|||
VkDescriptorPool _computeDescriptorPool; |
|||
std::vector<VkDescriptorSet> _computeDescriptorSets; |
|||
std::vector<VkCommandBuffer> _computeCommandBuffers; |
|||
std::vector<VkFence> _computeInFlightFences; |
|||
std::vector<VkSemaphore> _computeFinishedSemaphores; |
|||
|
|||
}; |
|||
|
|||
#endif // HELLOTRIANGLEAPPLICATION_H
|
@ -0,0 +1,36 @@ |
|||
#ifndef TYPES_H |
|||
#define TYPES_H |
|||
|
|||
#pragma once |
|||
|
|||
#include <vulkan/vulkan.h> |
|||
#include <iostream> |
|||
|
|||
#pragma once |
|||
|
|||
#define VK_USE_PLATFORM_ |
|||
#define GLFW_INCLUDE_VULKAN |
|||
#include <GLFW/glfw3.h> |
|||
#define GLFW_EXPOSE_NATIVE_ |
|||
#include <GLFW/glfw3native.h> |
|||
|
|||
#define GLM_FORCE_RADIANS |
|||
//#define GLM_FORCE_DEFAULT_ALIGNED_GENTYPES
|
|||
#define GLM_FORCE_DEPTH_ZERO_TO_ONE |
|||
#include <glm/glm.hpp> |
|||
#include <glm/gtc/matrix_transform.hpp> |
|||
#define GLM_ENABLE_EXPERIMENTAL |
|||
#include <glm/gtx/hash.hpp> |
|||
|
|||
#include <stb_image/stb_image.h> |
|||
#include <tiny_obj_loader/tiny_obj_loader.h> |
|||
|
|||
#include <QObject> |
|||
|
|||
struct SwapChainSupportDetails { |
|||
VkSurfaceCapabilitiesKHR capabilities; |
|||
std::vector<VkSurfaceFormatKHR> formats; |
|||
std::vector<VkPresentModeKHR> presentModes; |
|||
}; |
|||
|
|||
#endif // TYPES_H
|
@ -1,17 +0,0 @@ |
|||
{ |
|||
"description": "This file is generated by qmake to be read by androiddeployqt and should not be modified by hand.", |
|||
"qt": "/opt/Qt5.13.2/5.13.2/android_arm64_v8a", |
|||
"sdk": "/home/ali-mehrabani/host-projects/Android/Sdk", |
|||
"sdkBuildToolsRevision": "30.0.0", |
|||
"ndk": "/home/ali-mehrabani/host-projects/Android/Sdk/ndk/android-ndk-r20b", |
|||
"toolchain-prefix": "llvm", |
|||
"tool-prefix": "llvm", |
|||
"toolchain-version": "4.9", |
|||
"ndk-host": "linux-x86_64", |
|||
"target-architecture": "arm64-v8a", |
|||
"android-package-source-directory": "/home/ali-mehrabani/Qt_projects/VkTest/android", |
|||
"qml-root-path": "/home/ali-mehrabani/Qt_projects/VkTest", |
|||
"stdcpp-path": "/home/ali-mehrabani/host-projects/Android/Sdk/ndk/android-ndk-r20b/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_shared.so", |
|||
"useLLVM": true, |
|||
"application-binary": "/home/ali-mehrabani/Qt_projects/VkTest/libVkTest.so" |
|||
} |
File diff suppressed because it is too large
Binary file not shown.
Binary file not shown.
@ -1,2 +1,6 @@ |
|||
/usr/bin/glslc shader.vert -o vert.spv |
|||
/usr/bin/glslc shader.frag -o frag.spv |
|||
|
|||
/usr/bin/glslc shaderCompute.vert -o vertComp.spv |
|||
/usr/bin/glslc shaderCompute.frag -o fragComp.spv |
|||
/usr/bin/glslc shaderCompute.comp -o compComp.spv |
|||
|
Binary file not shown.
Binary file not shown.
@ -1,9 +1,15 @@ |
|||
#version 450 |
|||
|
|||
layout(binding = 1) uniform sampler2D texSampler; |
|||
|
|||
layout(location = 0) in vec3 fragColor; |
|||
layout(location = 1) in vec2 fragTexCoord; |
|||
|
|||
layout(location = 0) out vec4 outColor; |
|||
|
|||
void main() { |
|||
outColor = vec4(fragColor, 1.0); |
|||
outColor = texture(texSampler, fragTexCoord * 1.0); |
|||
|
|||
vec2 coord = gl_PointCoord - vec2(0.5); |
|||
// outColor = vec4(fragColor, 0.5 - length(coord)); |
|||
} |
|||
|
@ -0,0 +1,32 @@ |
|||
#version 450 |
|||
|
|||
struct Particle { |
|||
vec2 position; |
|||
vec2 velocity; |
|||
vec4 color; |
|||
}; |
|||
|
|||
layout (binding = 0) uniform ParameterUBO { |
|||
float deltaTime; |
|||
} ubo; |
|||
|
|||
|
|||
layout(std140, binding = 2) readonly buffer ParticleSSBOIn { |
|||
Particle particlesIn[ ]; |
|||
}; |
|||
|
|||
layout(std140, binding = 3) buffer ParticleSSBOOut { |
|||
Particle particlesOut[ ]; |
|||
}; |
|||
|
|||
layout (local_size_x = 256, local_size_y = 1, local_size_z = 1) in; |
|||
|
|||
void main() |
|||
{ |
|||
uint index = gl_GlobalInvocationID.x; |
|||
|
|||
Particle particleIn = particlesIn[index]; |
|||
|
|||
particlesOut[index].position = particleIn.position + particleIn.velocity.xy * ubo.deltaTime; |
|||
particlesOut[index].velocity = particleIn.velocity; |
|||
} |
@ -0,0 +1,15 @@ |
|||
#version 450 |
|||
|
|||
layout(binding = 1) uniform sampler2D texSampler; |
|||
|
|||
layout(location = 0) in vec3 fragColor; |
|||
layout(location = 1) in vec2 fragTexCoord; |
|||
|
|||
layout(location = 0) out vec4 outColor; |
|||
|
|||
void main() { |
|||
outColor = texture(texSampler, fragTexCoord * 1.0); |
|||
|
|||
vec2 coord = gl_PointCoord - vec2(0.5); |
|||
// outColor = vec4(fragColor, 0.5 - length(coord)); |
|||
} |
@ -0,0 +1,25 @@ |
|||
#version 450 |
|||
|
|||
layout(binding = 0) uniform UniformBufferObject { |
|||
mat4 model; |
|||
mat4 view; |
|||
mat4 proj; |
|||
} ubo; |
|||
|
|||
layout(location = 0) in vec3 inPosition; |
|||
layout(location = 1) in vec3 inColor; |
|||
layout(location = 2) in vec2 inTexCoord; |
|||
|
|||
layout(location = 0) out vec3 fragColor; |
|||
layout(location = 1) out vec2 fragTexCoord; |
|||
|
|||
void main() { |
|||
gl_Position = vec4(inPosition, 1.0); |
|||
gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 1.0); |
|||
|
|||
// gl_PointSize = 5.0; |
|||
// gl_Position = vec4(inPosition.xy, 1.0, 1.0); |
|||
|
|||
fragColor = inColor; |
|||
fragTexCoord = inTexCoord; |
|||
} |
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 248 KiB |
After Width: | Height: | Size: 940 KiB |
Loading…
Reference in new issue