-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathVulkanCompute.h
More file actions
107 lines (86 loc) · 3.24 KB
/
VulkanCompute.h
File metadata and controls
107 lines (86 loc) · 3.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#ifndef VULKAN_COMPUTE_H
#define VULKAN_COMPUTE_H
#include <vulkan/vulkan.hpp>
#include <glm/glm.hpp>
#include "BufferExtension.h"
#include "Helpers.h"
std::vector<const char*> getRequiredExtensions();
static std::vector<char> readFile(const std::string& filename);
vk::ResultValue<uint32_t> findQueueFamilyIndex(vk::PhysicalDevice device);
bool checkValidationLayerSupport(const std::vector<const char*> &validationLayers);
vk::ResultValue<vk::ShaderModule> createShaderModule(const vk::Device &device, const std::vector<char>& code);
vk::ResultValue<vk::ShaderModule> createShaderModuleFromFile(const vk::Device &device, const std::string &file);
bool isDeviceSuitable(vk::PhysicalDevice device, std::vector<std::string> requiredExtensions);
bool checkDeviceExtensionSupport(vk::PhysicalDevice device, std::vector<std::string> requiredExtensions);
vk::ResultValue<uint32_t> findMemoryTypeIndex(vk::PhysicalDevice device, vk::DeviceSize size, vk::MemoryPropertyFlags flags = vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
class VulkanComputeApplication {
public:
vk::Result init() {
vk::Result res = vk::Result::eSuccess;
res = initInstance();
if (res != vk::Result::eSuccess) return res;
res = createDevice();
if (res != vk::Result::eSuccess) return res;
res = createBuffers();
if (res != vk::Result::eSuccess) return res;
res = createPipeline();
if (res != vk::Result::eSuccess) return res;
res = createCommandBuffer();
if (res == vk::Result::eSuccess) m_initialized = true;
return res;
}
void run() {
if (!m_initialized) {
TRACE_FULL("VulkanComputeApplication not fully initialized. aborting.");
return;
}
fillInputBuffersRandom();
vk::SubmitInfo submitInfo = vk::SubmitInfo()
.setCommandBufferCount(1)
.setPCommandBuffers(&m_commandBuffer);
m_queue.submit(submitInfo, nullptr);
m_queue.waitIdle();
}
std::vector<float> getResult();
~VulkanComputeApplication(){
cleanup();
}
private:
/* Members */
bool m_initialized;
std::vector<const char*> m_validationLayers = {
"VK_LAYER_LUNARG_standard_validation"
};
vk::Instance m_instance;
vk::PhysicalDevice m_physicalDevice;
vk::Device m_device;
uint32_t m_queueFamIndex;
vk::Queue m_queue;
vk::Pipeline m_pipeline;
vk::PipelineLayout m_pipelineLayout;
vk::CommandPool m_commandPool;
vk::CommandBuffer m_commandBuffer;
vk::DescriptorPool m_descriptorPool;
vk::DescriptorSet m_descriptorSet;
vk::DescriptorSetLayout m_descriptorSetLayout;
std::vector<std::string> m_requiredExtensions;
vk::DeviceMemory m_valuesBufferMemory;
vkExt::SharedMemory m_sharedBufferMemory;
vkExt::Buffer m_inputBufferA;
vkExt::Buffer m_inputBufferB;
vkExt::Buffer m_outputBuffer;
uint32_t m_numElements = 1024*1024;
uint32_t m_bufferSize = sizeof(float) * m_numElements;
uint32_t m_memorySize = m_bufferSize * 3;
uint32_t m_outputOffset = m_bufferSize * 2;
uint32_t m_numElemsPushConstantSize = sizeof(glm::vec4);
/* functions */
vk::Result initInstance();
vk::Result createDevice();
vk::Result createBuffers();
vk::Result createPipeline();
vk::Result createCommandBuffer();
void fillInputBuffersRandom();
void cleanup();
};
#endif