]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/device_backend.cpp
Initial implementation of Vulkan backend
[libs/gl.git] / source / backends / vulkan / device_backend.cpp
diff --git a/source/backends/vulkan/device_backend.cpp b/source/backends/vulkan/device_backend.cpp
new file mode 100644 (file)
index 0000000..b5d3db7
--- /dev/null
@@ -0,0 +1,66 @@
+#include <msp/graphics/vulkancontext_platform.h>
+#include "device.h"
+#include "device_backend.h"
+#include "vulkan.h"
+
+namespace Msp {
+namespace GL {
+
+VulkanDevice::VulkanDevice(Graphics::Window &wnd, const Graphics::VulkanOptions &opts):
+       context(wnd, opts),
+       device(handle_cast<VkDevice>(context.get_private().device)),
+       graphics_queue(handle_cast<VkQueue>(context.get_private().graphics_queue)),
+       functions(new VulkanFunctions(context)),
+       allocator(*static_cast<Device *>(this)),
+       destroy_queue(*static_cast<Device *>(this)),
+       transfer_queue(*static_cast<Device *>(this)),
+       pipeline_cache(*static_cast<Device *>(this))
+{ }
+
+// Cause the destructor of RefPtr<VulkanFunctions> to be emitted here
+VulkanDevice::~VulkanDevice()
+{ }
+
+Graphics::VulkanOptions VulkanDevice::create_default_options()
+{
+       Graphics::VulkanOptions opts;
+#ifdef DEBUG
+       opts.enable_validation = true;
+       opts.enable_debug_report = true;
+#endif
+       return opts;
+}
+
+void VulkanDevice::fill_info()
+{
+       DeviceInfo &info = static_cast<Device *>(this)->info;
+
+       VkPhysicalDeviceProperties props;
+       functions->GetPhysicalDeviceProperties(props);
+
+       info.api_version.major = (props.apiVersion>>22)&0x7F;
+       info.api_version.minor = (props.apiVersion>>12)&0x3FF;
+
+       DeviceLimits &limits = info.limits;
+       limits.max_clip_planes = props.limits.maxClipDistances;
+       limits.max_vertex_attributes = props.limits.maxVertexInputAttributes;
+       limits.max_texture_bindings = props.limits.maxDescriptorSetSampledImages;
+       limits.max_color_attachments = props.limits.maxColorAttachments;
+       unsigned samples = props.limits.framebufferColorSampleCounts&props.limits.framebufferDepthSampleCounts&props.limits.framebufferStencilSampleCounts;
+       if(samples&VK_SAMPLE_COUNT_64_BIT)
+               limits.max_samples = 64;
+       else if(samples&VK_SAMPLE_COUNT_32_BIT)
+               limits.max_samples = 32;
+       else if(samples&VK_SAMPLE_COUNT_16_BIT)
+               limits.max_samples = 16;
+       else if(samples&VK_SAMPLE_COUNT_8_BIT)
+               limits.max_samples = 8;
+       limits.max_uniform_bindings = props.limits.maxDescriptorSetUniformBuffers;
+       limits.uniform_buffer_alignment = props.limits.minUniformBufferOffsetAlignment;
+       limits.max_anisotropy = props.limits.maxSamplerAnisotropy;
+
+       info.glsl_features = SL::Features::from_api_version(info.api, info.api_version);
+}
+
+} // namespace GL
+} // namespace Msp