]> git.tdb.fi Git - libs/gl.git/blob - source/backends/vulkan/device_backend.cpp
cc94e967f03c5372b18211d96ac4a2557fe44aa5
[libs/gl.git] / source / backends / vulkan / device_backend.cpp
1 #include <msp/graphics/vulkancontext_platform.h>
2 #include "device.h"
3 #include "device_backend.h"
4 #include "vulkan.h"
5
6 namespace Msp {
7 namespace GL {
8
9 VulkanDevice::VulkanDevice(Graphics::Window &wnd, const Graphics::VulkanOptions &opts):
10         context(wnd, opts),
11         device(handle_cast<VkDevice>(context.get_private().device)),
12         graphics_queue(handle_cast<VkQueue>(context.get_private().graphics_queue)),
13         functions(new VulkanFunctions(context)),
14         allocator(*static_cast<Device *>(this)),
15         destroy_queue(*static_cast<Device *>(this)),
16         synchronizer(*static_cast<Device *>(this)),
17         transfer_queue(*static_cast<Device *>(this)),
18         pipeline_cache(*static_cast<Device *>(this))
19 { }
20
21 // Cause the destructor of RefPtr<VulkanFunctions> to be emitted here
22 VulkanDevice::~VulkanDevice()
23 { }
24
25 Graphics::VulkanOptions VulkanDevice::create_default_options()
26 {
27         Graphics::VulkanOptions opts;
28 #ifdef DEBUG
29         opts.enable_validation = true;
30         opts.enable_debug_report = true;
31 #endif
32         return opts;
33 }
34
35 void VulkanDevice::fill_info()
36 {
37         DeviceInfo &info = static_cast<Device *>(this)->info;
38
39         VkPhysicalDeviceProperties props;
40         functions->GetPhysicalDeviceProperties(props);
41
42         info.api_version.major = (props.apiVersion>>22)&0x7F;
43         info.api_version.minor = (props.apiVersion>>12)&0x3FF;
44
45         DeviceLimits &limits = info.limits;
46         limits.max_clip_planes = props.limits.maxClipDistances;
47         limits.max_vertex_attributes = props.limits.maxVertexInputAttributes;
48         limits.max_texture_bindings = props.limits.maxDescriptorSetSampledImages;
49         limits.max_color_attachments = props.limits.maxColorAttachments;
50         unsigned samples = props.limits.framebufferColorSampleCounts&props.limits.framebufferDepthSampleCounts&props.limits.framebufferStencilSampleCounts;
51         if(samples&VK_SAMPLE_COUNT_64_BIT)
52                 limits.max_samples = 64;
53         else if(samples&VK_SAMPLE_COUNT_32_BIT)
54                 limits.max_samples = 32;
55         else if(samples&VK_SAMPLE_COUNT_16_BIT)
56                 limits.max_samples = 16;
57         else if(samples&VK_SAMPLE_COUNT_8_BIT)
58                 limits.max_samples = 8;
59         limits.max_uniform_bindings = props.limits.maxDescriptorSetUniformBuffers;
60         limits.uniform_buffer_alignment = props.limits.minUniformBufferOffsetAlignment;
61         limits.max_anisotropy = props.limits.maxSamplerAnisotropy;
62
63         info.glsl_features = SL::Features::from_api_version(info.api, info.api_version);
64 }
65
66 } // namespace GL
67 } // namespace Msp