vulkan_instance: Allow different Vulkan versions and enforce 1.1
For listing the available physical devices we can use Vulkan 1.0. Now that MoltenVK supports 1.1 we can require it for running games. Add missing documentation.
This commit is contained in:
parent
7344a7c447
commit
cdbee27692
7 changed files with 39 additions and 41 deletions
|
@ -127,8 +127,8 @@ void RendererVulkan::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) {
|
|||
|
||||
bool RendererVulkan::Init() try {
|
||||
library = OpenLibrary();
|
||||
std::tie(instance, instance_version) = CreateInstance(
|
||||
library, dld, render_window.GetWindowInfo().type, true, Settings::values.renderer_debug);
|
||||
instance = CreateInstance(library, dld, VK_API_VERSION_1_1, render_window.GetWindowInfo().type,
|
||||
true, Settings::values.renderer_debug);
|
||||
if (Settings::values.renderer_debug) {
|
||||
debug_callback = CreateDebugCallback(instance);
|
||||
}
|
||||
|
@ -184,8 +184,7 @@ void RendererVulkan::InitializeDevice() {
|
|||
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
|
||||
}
|
||||
const vk::PhysicalDevice physical_device(devices[static_cast<size_t>(device_index)], dld);
|
||||
device =
|
||||
std::make_unique<VKDevice>(*instance, instance_version, physical_device, *surface, dld);
|
||||
device = std::make_unique<VKDevice>(*instance, physical_device, *surface, dld);
|
||||
}
|
||||
|
||||
void RendererVulkan::Report() const {
|
||||
|
@ -213,7 +212,7 @@ void RendererVulkan::Report() const {
|
|||
std::vector<std::string> RendererVulkan::EnumerateDevices() try {
|
||||
vk::InstanceDispatch dld;
|
||||
const Common::DynamicLibrary library = OpenLibrary();
|
||||
const vk::Instance instance = CreateInstance(library, dld).first;
|
||||
const vk::Instance instance = CreateInstance(library, dld, VK_API_VERSION_1_0);
|
||||
const std::vector<VkPhysicalDevice> physical_devices = instance.EnumeratePhysicalDevices();
|
||||
std::vector<std::string> names;
|
||||
names.reserve(physical_devices.size());
|
||||
|
|
|
@ -68,7 +68,6 @@ private:
|
|||
vk::InstanceDispatch dld;
|
||||
|
||||
vk::Instance instance;
|
||||
u32 instance_version{};
|
||||
|
||||
vk::SurfaceKHR surface;
|
||||
|
||||
|
|
|
@ -206,10 +206,10 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(
|
|||
|
||||
} // Anonymous namespace
|
||||
|
||||
VKDevice::VKDevice(VkInstance instance_, u32 instance_version_, vk::PhysicalDevice physical_,
|
||||
VkSurfaceKHR surface, const vk::InstanceDispatch& dld_)
|
||||
VKDevice::VKDevice(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR surface,
|
||||
const vk::InstanceDispatch& dld_)
|
||||
: instance{instance_}, dld{dld_}, physical{physical_}, properties{physical.GetProperties()},
|
||||
instance_version{instance_version_}, format_properties{GetFormatProperties(physical, dld)} {
|
||||
format_properties{GetFormatProperties(physical, dld)} {
|
||||
CheckSuitability();
|
||||
SetupFamilies(surface);
|
||||
SetupFeatures();
|
||||
|
@ -653,9 +653,7 @@ std::vector<const char*> VKDevice::LoadExtensions() {
|
|||
test(has_ext_custom_border_color, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, false);
|
||||
test(has_ext_extended_dynamic_state, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, false);
|
||||
test(has_ext_robustness2, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, false);
|
||||
if (instance_version >= VK_API_VERSION_1_1) {
|
||||
test(has_ext_subgroup_size_control, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false);
|
||||
}
|
||||
test(has_ext_subgroup_size_control, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false);
|
||||
if (Settings::values.renderer_debug) {
|
||||
test(nv_device_diagnostics_config, VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME,
|
||||
true);
|
||||
|
|
|
@ -24,8 +24,8 @@ const u32 GuestWarpSize = 32;
|
|||
/// Handles data specific to a physical device.
|
||||
class VKDevice final {
|
||||
public:
|
||||
explicit VKDevice(VkInstance instance, u32 instance_version, vk::PhysicalDevice physical,
|
||||
VkSurfaceKHR surface, const vk::InstanceDispatch& dld);
|
||||
explicit VKDevice(VkInstance instance, vk::PhysicalDevice physical, VkSurfaceKHR surface,
|
||||
const vk::InstanceDispatch& dld);
|
||||
~VKDevice();
|
||||
|
||||
/**
|
||||
|
@ -79,11 +79,6 @@ public:
|
|||
return present_family;
|
||||
}
|
||||
|
||||
/// Returns the current instance Vulkan API version in Vulkan-formatted version numbers.
|
||||
u32 InstanceApiVersion() const {
|
||||
return instance_version;
|
||||
}
|
||||
|
||||
/// Returns the current Vulkan API version provided in Vulkan-formatted version numbers.
|
||||
u32 ApiVersion() const {
|
||||
return properties.apiVersion;
|
||||
|
|
|
@ -272,19 +272,12 @@ bool IsPrecise(Operation operand) {
|
|||
return false;
|
||||
}
|
||||
|
||||
u32 ShaderVersion(const VKDevice& device) {
|
||||
if (device.InstanceApiVersion() < VK_API_VERSION_1_1) {
|
||||
return 0x00010000;
|
||||
}
|
||||
return 0x00010300;
|
||||
}
|
||||
|
||||
class SPIRVDecompiler final : public Sirit::Module {
|
||||
public:
|
||||
explicit SPIRVDecompiler(const VKDevice& device_, const ShaderIR& ir_, ShaderType stage_,
|
||||
const Registry& registry_, const Specialization& specialization_)
|
||||
: Module(ShaderVersion(device_)), device{device_}, ir{ir_}, stage{stage_},
|
||||
header{ir_.GetHeader()}, registry{registry_}, specialization{specialization_} {
|
||||
: Module(0x00010300), device{device_}, ir{ir_}, stage{stage_}, header{ir_.GetHeader()},
|
||||
registry{registry_}, specialization{specialization_} {
|
||||
if (stage_ != ShaderType::Compute) {
|
||||
transform_feedback = BuildTransformFeedback(registry_.GetGraphicsInfo());
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue