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