]> git.tdb.fi Git - libs/gl.git/blob - source/backends/vulkan/module_backend.cpp
Support compute shaders and compute operations
[libs/gl.git] / source / backends / vulkan / module_backend.cpp
1 #include <stdexcept>
2 #include "device.h"
3 #include "module.h"
4 #include "module_backend.h"
5 #include "vulkan.h"
6
7 using namespace std;
8
9 namespace Msp {
10 namespace GL {
11
12 VulkanSpirVModule::VulkanSpirVModule():
13         device(Device::get_current())
14 { }
15
16 VulkanSpirVModule::VulkanSpirVModule(VulkanSpirVModule &&other):
17         device(other.device),
18         handle(other.handle)
19 {
20         other.handle = 0;
21 }
22
23 VulkanSpirVModule::~VulkanSpirVModule()
24 {
25         const VulkanFunctions &vk = device.get_functions();
26
27         if(handle)
28                 vk.DestroyShaderModule(handle);
29 }
30
31 void VulkanSpirVModule::create()
32 {
33         const vector<uint32_t> &code = static_cast<const SpirVModule *>(this)->code;
34         const VulkanFunctions &vk = device.get_functions();
35
36         VkShaderModuleCreateInfo module_info = { };
37         module_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
38         module_info.codeSize = code.size()*4;
39         module_info.pCode = code.data();
40
41         vk.CreateShaderModule(module_info, handle);
42
43         if(!debug_name.empty())
44                 set_vulkan_object_name();
45 }
46
47 void VulkanSpirVModule::set_debug_name(const string &name)
48 {
49 #ifdef DEBUG
50         debug_name = name;
51         if(handle)
52                 set_vulkan_object_name();
53 #else
54         (void)name;
55 #endif
56 }
57
58 void VulkanSpirVModule::set_vulkan_object_name() const
59 {
60 #ifdef DEBUG
61         const VulkanFunctions &vk = device.get_functions();
62
63         VkDebugUtilsObjectNameInfoEXT name_info = { };
64         name_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;
65         name_info.objectType = VK_OBJECT_TYPE_SHADER_MODULE;
66         name_info.objectHandle = reinterpret_cast<uint64_t>(handle);
67         name_info.pObjectName = debug_name.c_str();
68         vk.SetDebugUtilsObjectName(name_info);
69 #endif
70 }
71
72
73 unsigned get_vulkan_stage(unsigned stage)
74 {
75         switch(stage)
76         {
77         case SpirVModule::VERTEX: return VK_SHADER_STAGE_VERTEX_BIT;
78         case SpirVModule::GEOMETRY: return VK_SHADER_STAGE_GEOMETRY_BIT;
79         case SpirVModule::FRAGMENT: return VK_SHADER_STAGE_FRAGMENT_BIT;
80         case SpirVModule::COMPUTE: return VK_SHADER_STAGE_COMPUTE_BIT;
81         default: throw invalid_argument("get_vulkan_stage");
82         }
83 }
84
85 } // namespace GL
86 } // namespace Msp