// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
#pragma once
#if GRAPHICS_API_VULKAN
#include "Engine/Graphics/GPUAdapter.h"
#include "VulkanPlatform.h"
#include "IncludeVulkanHeaders.h"
///
/// Graphics Device adapter implementation for Vulkan backend.
///
class GPUAdapterVulkan : public GPUAdapter
{
public:
///
/// Initializes a new instance of the class.
///
GPUAdapterVulkan()
: Gpu(VK_NULL_HANDLE)
{
}
GPUAdapterVulkan(const GPUAdapterVulkan& other)
: GPUAdapterVulkan()
{
*this = other;
}
GPUAdapterVulkan& operator=(const GPUAdapterVulkan& other)
{
Gpu = other.Gpu;
GpuProps = other.GpuProps;
Description = other.Description;
return *this;
}
public:
///
/// The GPU device handle.
///
VkPhysicalDevice Gpu;
///
/// The GPU device properties.
///
VkPhysicalDeviceProperties GpuProps;
///
/// The GPU description.
///
String Description;
public:
// [GPUAdapter]
bool IsValid() const override
{
return Gpu != VK_NULL_HANDLE;
}
void* GetNativePtr() const override
{
return (void*)Gpu;
}
uint32 GetVendorId() const override
{
return GpuProps.vendorID;
}
String GetDescription() const override
{
return Description;
}
Version GetDriverVersion() const override
{
Version version(VK_VERSION_MAJOR(GpuProps.driverVersion), VK_VERSION_MINOR(GpuProps.driverVersion), VK_VERSION_PATCH(GpuProps.driverVersion));
if (IsNVIDIA())
{
union NvidiaDriverVersion
{
struct
{
uint32 Tertiary : 6;
uint32 Secondary : 8;
uint32 Minor : 8;
uint32 Major : 10;
};
uint32 Packed;
} NvidiaVersion;
NvidiaVersion.Packed = GpuProps.driverVersion;
version = Version(NvidiaVersion.Major, NvidiaVersion.Minor);
}
return version;
}
};
#endif