1 #include <msp/graphics/vulkancontext_platform.h>
3 #include "device_backend.h"
9 VulkanDevice::VulkanDevice(Graphics::Window &wnd, const Graphics::VulkanOptions &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))
21 // Cause the destructor of RefPtr<VulkanFunctions> to be emitted here
22 VulkanDevice::~VulkanDevice()
25 Graphics::VulkanOptions VulkanDevice::create_default_options()
27 Graphics::VulkanOptions opts;
29 opts.enable_validation = true;
30 opts.enable_debug_report = true;
35 void VulkanDevice::fill_info()
37 DeviceInfo &info = static_cast<Device *>(this)->info;
39 VkPhysicalDeviceProperties props;
40 functions->GetPhysicalDeviceProperties(props);
42 info.api_version.major = (props.apiVersion>>22)&0x7F;
43 info.api_version.minor = (props.apiVersion>>12)&0x3FF;
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;
63 info.glsl_features = SL::Features::from_api_version(info.api, info.api_version);