2017-10-10 23:32:13 +02:00
|
|
|
#pragma once
|
|
|
|
|
2018-07-31 16:03:44 +02:00
|
|
|
#include "dxvk_device_info.h"
|
2018-07-23 20:07:21 +02:00
|
|
|
#include "dxvk_extensions.h"
|
2017-10-10 23:32:13 +02:00
|
|
|
#include "dxvk_include.h"
|
|
|
|
|
|
|
|
namespace dxvk {
|
|
|
|
|
|
|
|
class DxvkDevice;
|
|
|
|
class DxvkInstance;
|
|
|
|
class DxvkSurface;
|
|
|
|
|
2018-01-07 20:05:27 +01:00
|
|
|
/**
|
|
|
|
* \brief GPU vendors
|
|
|
|
* Based on PCIe IDs.
|
|
|
|
*/
|
|
|
|
enum class DxvkGpuVendor : uint16_t {
|
|
|
|
Amd = 0x1002,
|
|
|
|
Nvidia = 0x10de,
|
|
|
|
Intel = 0x8086,
|
|
|
|
};
|
|
|
|
|
2017-10-10 23:32:13 +02:00
|
|
|
/**
|
|
|
|
* \brief DXVK adapter
|
|
|
|
*
|
|
|
|
* Corresponds to a physical device in Vulkan. Provides
|
|
|
|
* all kinds of information about the device itself and
|
|
|
|
* the supported feature set.
|
|
|
|
*/
|
|
|
|
class DxvkAdapter : public RcObject {
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
DxvkAdapter(
|
|
|
|
const Rc<DxvkInstance>& instance,
|
|
|
|
VkPhysicalDevice handle);
|
|
|
|
~DxvkAdapter();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Vulkan instance functions
|
|
|
|
* \returns Vulkan instance functions
|
|
|
|
*/
|
|
|
|
Rc<vk::InstanceFn> vki() const {
|
|
|
|
return m_vki;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Physical device handle
|
|
|
|
* \returns The adapter handle
|
|
|
|
*/
|
|
|
|
VkPhysicalDevice handle() const {
|
|
|
|
return m_handle;
|
|
|
|
}
|
|
|
|
|
2018-04-20 00:19:03 +02:00
|
|
|
/**
|
|
|
|
* \brief Vulkan instance
|
|
|
|
* \returns Vulkan instance
|
|
|
|
*/
|
|
|
|
Rc<DxvkInstance> instance() const;
|
|
|
|
|
2017-10-10 23:32:13 +02:00
|
|
|
/**
|
|
|
|
* \brief Physical device properties
|
|
|
|
*
|
2018-07-31 16:03:44 +02:00
|
|
|
* Returns a read-only reference to the core
|
|
|
|
* properties of the Vulkan physical device.
|
|
|
|
* \returns Physical device core properties
|
2017-10-10 23:32:13 +02:00
|
|
|
*/
|
2018-07-31 16:03:44 +02:00
|
|
|
const VkPhysicalDeviceProperties& deviceProperties() const {
|
|
|
|
return m_deviceInfo.core.properties;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Device info
|
|
|
|
*
|
|
|
|
* Returns a read-only reference to the full
|
|
|
|
* device info structure, including extended
|
|
|
|
* properties.
|
|
|
|
* \returns Device info struct
|
|
|
|
*/
|
|
|
|
const DxvkDeviceInfo& devicePropertiesExt() const {
|
|
|
|
return m_deviceInfo;
|
|
|
|
}
|
2017-10-10 23:32:13 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Memory properties
|
|
|
|
*
|
|
|
|
* Queries the memory types and memory heaps of
|
|
|
|
* the device. This is useful for memory allocators.
|
|
|
|
* \returns Device memory properties
|
|
|
|
*/
|
|
|
|
VkPhysicalDeviceMemoryProperties memoryProperties() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Supportred device features
|
|
|
|
*
|
|
|
|
* Queries the supported device features.
|
|
|
|
* \returns Device features
|
|
|
|
*/
|
|
|
|
VkPhysicalDeviceFeatures features() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Queries format support
|
|
|
|
*
|
|
|
|
* \param [in] format The format to query
|
|
|
|
* \returns Format support info
|
|
|
|
*/
|
|
|
|
VkFormatProperties formatProperties(
|
|
|
|
VkFormat format) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Queries image format support
|
|
|
|
*
|
|
|
|
* \param [in] format Format to query
|
|
|
|
* \param [in] type Image type
|
|
|
|
* \param [in] tiling Image tiling
|
|
|
|
* \param [in] usage Image usage flags
|
|
|
|
* \param [in] flags Image create flags
|
2017-12-09 14:41:37 +01:00
|
|
|
* \param [out] properties Format properties
|
|
|
|
* \returns \c VK_SUCCESS or \c VK_ERROR_FORMAT_NOT_SUPPORTED
|
2017-10-10 23:32:13 +02:00
|
|
|
*/
|
2017-12-09 14:41:37 +01:00
|
|
|
VkResult imageFormatProperties(
|
|
|
|
VkFormat format,
|
|
|
|
VkImageType type,
|
|
|
|
VkImageTiling tiling,
|
|
|
|
VkImageUsageFlags usage,
|
|
|
|
VkImageCreateFlags flags,
|
|
|
|
VkImageFormatProperties& properties) const;
|
2017-10-10 23:32:13 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Graphics queue family index
|
|
|
|
* \returns Graphics queue family index
|
|
|
|
*/
|
|
|
|
uint32_t graphicsQueueFamily() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Presentation queue family index
|
|
|
|
* \returns Presentation queue family index
|
|
|
|
*/
|
|
|
|
uint32_t presentQueueFamily() const;
|
|
|
|
|
2017-12-02 16:47:06 +01:00
|
|
|
/**
|
|
|
|
* \brief Tests whether all required features are supported
|
|
|
|
*
|
|
|
|
* \param [in] features Required device features
|
|
|
|
* \returns \c true if all features are supported
|
|
|
|
*/
|
|
|
|
bool checkFeatureSupport(
|
|
|
|
const VkPhysicalDeviceFeatures& required) const;
|
|
|
|
|
2017-10-10 23:32:13 +02:00
|
|
|
/**
|
|
|
|
* \brief Creates a DXVK device
|
|
|
|
*
|
|
|
|
* Creates a logical device for this adapter.
|
2017-12-02 16:47:06 +01:00
|
|
|
* \param [in] enabledFeatures Device features
|
2017-10-10 23:32:13 +02:00
|
|
|
* \returns Device handle
|
|
|
|
*/
|
2017-12-02 16:47:06 +01:00
|
|
|
Rc<DxvkDevice> createDevice(
|
|
|
|
const VkPhysicalDeviceFeatures& enabledFeatures);
|
2017-10-10 23:32:13 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Creates a surface
|
|
|
|
*
|
|
|
|
* \param [in] instance Module instance
|
|
|
|
* \param [in] window Application window
|
|
|
|
* \returns Surface handle
|
|
|
|
*/
|
|
|
|
Rc<DxvkSurface> createSurface(
|
|
|
|
HINSTANCE instance,
|
|
|
|
HWND window);
|
|
|
|
|
2018-03-07 00:23:06 +01:00
|
|
|
/**
|
|
|
|
* \brief Logs DXVK adapter info
|
|
|
|
*
|
|
|
|
* May be useful for bug reports
|
|
|
|
* and general troubleshooting.
|
|
|
|
*/
|
|
|
|
void logAdapterInfo() const;
|
|
|
|
|
2017-10-10 23:32:13 +02:00
|
|
|
private:
|
|
|
|
|
|
|
|
Rc<DxvkInstance> m_instance;
|
|
|
|
Rc<vk::InstanceFn> m_vki;
|
|
|
|
VkPhysicalDevice m_handle;
|
2018-07-31 16:03:44 +02:00
|
|
|
|
|
|
|
DxvkNameSet m_deviceExtensions;
|
|
|
|
DxvkDeviceInfo m_deviceInfo;
|
2017-10-10 23:32:13 +02:00
|
|
|
|
|
|
|
std::vector<VkQueueFamilyProperties> m_queueFamilies;
|
2018-06-26 15:51:15 +02:00
|
|
|
|
2018-07-31 16:03:44 +02:00
|
|
|
void queryExtensions();
|
|
|
|
void queryDeviceInfo();
|
|
|
|
void queryDeviceQueues();
|
2017-10-10 23:32:13 +02:00
|
|
|
|
2018-07-31 16:03:44 +02:00
|
|
|
uint32_t getAdapterIndex() const;
|
|
|
|
|
2018-07-23 20:07:21 +02:00
|
|
|
static void logNameList(const DxvkNameList& names);
|
2017-12-27 14:31:38 +01:00
|
|
|
|
2017-10-10 23:32:13 +02:00
|
|
|
};
|
|
|
|
|
2018-03-10 09:05:32 -05:00
|
|
|
}
|