aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/VulkanRenderer.cs')
-rw-r--r--Ryujinx.Graphics.Vulkan/VulkanRenderer.cs92
1 files changed, 44 insertions, 48 deletions
diff --git a/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs
index 81dec12e..193cdce3 100644
--- a/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs
+++ b/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs
@@ -17,9 +17,9 @@ namespace Ryujinx.Graphics.Vulkan
{
public sealed class VulkanRenderer : IRenderer
{
- private Instance _instance;
+ private VulkanInstance _instance;
private SurfaceKHR _surface;
- private PhysicalDevice _physicalDevice;
+ private VulkanPhysicalDevice _physicalDevice;
private Device _device;
private WindowBase _window;
@@ -106,33 +106,31 @@ namespace Ryujinx.Graphics.Vulkan
}
}
- private unsafe void LoadFeatures(string[] supportedExtensions, uint maxQueueCount, uint queueFamilyIndex)
+ private unsafe void LoadFeatures(uint maxQueueCount, uint queueFamilyIndex)
{
- FormatCapabilities = new FormatCapabilities(Api, _physicalDevice);
+ FormatCapabilities = new FormatCapabilities(Api, _physicalDevice.PhysicalDevice);
- var supportedFeatures = Api.GetPhysicalDeviceFeature(_physicalDevice);
-
- if (Api.TryGetDeviceExtension(_instance, _device, out ExtConditionalRendering conditionalRenderingApi))
+ if (Api.TryGetDeviceExtension(_instance.Instance, _device, out ExtConditionalRendering conditionalRenderingApi))
{
ConditionalRenderingApi = conditionalRenderingApi;
}
- if (Api.TryGetDeviceExtension(_instance, _device, out ExtExtendedDynamicState extendedDynamicStateApi))
+ if (Api.TryGetDeviceExtension(_instance.Instance, _device, out ExtExtendedDynamicState extendedDynamicStateApi))
{
ExtendedDynamicStateApi = extendedDynamicStateApi;
}
- if (Api.TryGetDeviceExtension(_instance, _device, out KhrPushDescriptor pushDescriptorApi))
+ if (Api.TryGetDeviceExtension(_instance.Instance, _device, out KhrPushDescriptor pushDescriptorApi))
{
PushDescriptorApi = pushDescriptorApi;
}
- if (Api.TryGetDeviceExtension(_instance, _device, out ExtTransformFeedback transformFeedbackApi))
+ if (Api.TryGetDeviceExtension(_instance.Instance, _device, out ExtTransformFeedback transformFeedbackApi))
{
TransformFeedbackApi = transformFeedbackApi;
}
- if (Api.TryGetDeviceExtension(_instance, _device, out KhrDrawIndirectCount drawIndirectCountApi))
+ if (Api.TryGetDeviceExtension(_instance.Instance, _device, out KhrDrawIndirectCount drawIndirectCountApi))
{
DrawIndirectCountApi = drawIndirectCountApi;
}
@@ -154,7 +152,7 @@ namespace Ryujinx.Graphics.Vulkan
SType = StructureType.PhysicalDeviceBlendOperationAdvancedPropertiesExt
};
- bool supportsBlendOperationAdvanced = supportedExtensions.Contains("VK_EXT_blend_operation_advanced");
+ bool supportsBlendOperationAdvanced = _physicalDevice.IsDeviceExtensionPresent("VK_EXT_blend_operation_advanced");
if (supportsBlendOperationAdvanced)
{
@@ -167,14 +165,14 @@ namespace Ryujinx.Graphics.Vulkan
SType = StructureType.PhysicalDeviceSubgroupSizeControlPropertiesExt
};
- bool supportsSubgroupSizeControl = supportedExtensions.Contains("VK_EXT_subgroup_size_control");
+ bool supportsSubgroupSizeControl = _physicalDevice.IsDeviceExtensionPresent("VK_EXT_subgroup_size_control");
if (supportsSubgroupSizeControl)
{
properties2.PNext = &propertiesSubgroupSizeControl;
}
- bool supportsTransformFeedback = supportedExtensions.Contains(ExtTransformFeedback.ExtensionName);
+ bool supportsTransformFeedback = _physicalDevice.IsDeviceExtensionPresent(ExtTransformFeedback.ExtensionName);
PhysicalDeviceTransformFeedbackPropertiesEXT propertiesTransformFeedback = new PhysicalDeviceTransformFeedbackPropertiesEXT()
{
@@ -222,30 +220,30 @@ namespace Ryujinx.Graphics.Vulkan
SType = StructureType.PhysicalDevicePortabilitySubsetFeaturesKhr
};
- if (supportedExtensions.Contains("VK_EXT_primitive_topology_list_restart"))
+ if (_physicalDevice.IsDeviceExtensionPresent("VK_EXT_primitive_topology_list_restart"))
{
features2.PNext = &featuresPrimitiveTopologyListRestart;
}
- if (supportedExtensions.Contains("VK_EXT_robustness2"))
+ if (_physicalDevice.IsDeviceExtensionPresent("VK_EXT_robustness2"))
{
featuresRobustness2.PNext = features2.PNext;
features2.PNext = &featuresRobustness2;
}
- if (supportedExtensions.Contains("VK_KHR_shader_float16_int8"))
+ if (_physicalDevice.IsDeviceExtensionPresent("VK_KHR_shader_float16_int8"))
{
featuresShaderInt8.PNext = features2.PNext;
features2.PNext = &featuresShaderInt8;
}
- if (supportedExtensions.Contains("VK_EXT_custom_border_color"))
+ if (_physicalDevice.IsDeviceExtensionPresent("VK_EXT_custom_border_color"))
{
featuresCustomBorderColor.PNext = features2.PNext;
features2.PNext = &featuresCustomBorderColor;
}
- bool usePortability = supportedExtensions.Contains("VK_KHR_portability_subset");
+ bool usePortability = _physicalDevice.IsDeviceExtensionPresent("VK_KHR_portability_subset");
if (usePortability)
{
@@ -256,8 +254,8 @@ namespace Ryujinx.Graphics.Vulkan
features2.PNext = &featuresPortabilitySubset;
}
- Api.GetPhysicalDeviceProperties2(_physicalDevice, &properties2);
- Api.GetPhysicalDeviceFeatures2(_physicalDevice, &features2);
+ Api.GetPhysicalDeviceProperties2(_physicalDevice.PhysicalDevice, &properties2);
+ Api.GetPhysicalDeviceFeatures2(_physicalDevice.PhysicalDevice, &features2);
var portabilityFlags = PortabilitySubsetFlags.None;
uint vertexBufferAlignment = 1;
@@ -272,7 +270,7 @@ namespace Ryujinx.Graphics.Vulkan
portabilityFlags |= featuresPortabilitySubset.SamplerMipLodBias ? 0 : PortabilitySubsetFlags.NoLodBias;
}
- bool supportsCustomBorderColor = supportedExtensions.Contains("VK_EXT_custom_border_color") &&
+ bool supportsCustomBorderColor = _physicalDevice.IsDeviceExtensionPresent("VK_EXT_custom_border_color") &&
featuresCustomBorderColor.CustomBorderColors &&
featuresCustomBorderColor.CustomBorderColorWithoutFormat;
@@ -284,30 +282,30 @@ namespace Ryujinx.Graphics.Vulkan
properties.Limits.FramebufferStencilSampleCounts;
Capabilities = new HardwareCapabilities(
- supportedExtensions.Contains("VK_EXT_index_type_uint8"),
+ _physicalDevice.IsDeviceExtensionPresent("VK_EXT_index_type_uint8"),
supportsCustomBorderColor,
supportsBlendOperationAdvanced,
propertiesBlendOperationAdvanced.AdvancedBlendCorrelatedOverlap,
propertiesBlendOperationAdvanced.AdvancedBlendNonPremultipliedSrcColor,
propertiesBlendOperationAdvanced.AdvancedBlendNonPremultipliedDstColor,
- supportedExtensions.Contains(KhrDrawIndirectCount.ExtensionName),
- supportedExtensions.Contains("VK_EXT_fragment_shader_interlock"),
- supportedExtensions.Contains("VK_NV_geometry_shader_passthrough"),
+ _physicalDevice.IsDeviceExtensionPresent(KhrDrawIndirectCount.ExtensionName),
+ _physicalDevice.IsDeviceExtensionPresent("VK_EXT_fragment_shader_interlock"),
+ _physicalDevice.IsDeviceExtensionPresent("VK_NV_geometry_shader_passthrough"),
supportsSubgroupSizeControl,
featuresShaderInt8.ShaderInt8,
- supportedExtensions.Contains("VK_EXT_shader_stencil_export"),
- supportedExtensions.Contains(ExtConditionalRendering.ExtensionName),
- supportedExtensions.Contains(ExtExtendedDynamicState.ExtensionName),
+ _physicalDevice.IsDeviceExtensionPresent("VK_EXT_shader_stencil_export"),
+ _physicalDevice.IsDeviceExtensionPresent(ExtConditionalRendering.ExtensionName),
+ _physicalDevice.IsDeviceExtensionPresent(ExtExtendedDynamicState.ExtensionName),
features2.Features.MultiViewport,
featuresRobustness2.NullDescriptor || IsMoltenVk,
- supportedExtensions.Contains(KhrPushDescriptor.ExtensionName),
+ _physicalDevice.IsDeviceExtensionPresent(KhrPushDescriptor.ExtensionName),
featuresPrimitiveTopologyListRestart.PrimitiveTopologyListRestart,
featuresPrimitiveTopologyListRestart.PrimitiveTopologyPatchListRestart,
supportsTransformFeedback,
propertiesTransformFeedback.TransformFeedbackQueries,
features2.Features.OcclusionQueryPrecise,
- supportedFeatures.PipelineStatisticsQuery,
- supportedFeatures.GeometryShader,
+ _physicalDevice.PhysicalDeviceFeatures.PipelineStatisticsQuery,
+ _physicalDevice.PhysicalDeviceFeatures.GeometryShader,
propertiesSubgroupSizeControl.MinSubgroupSize,
propertiesSubgroupSizeControl.MaxSubgroupSize,
propertiesSubgroupSizeControl.RequiredSubgroupSizeStages,
@@ -315,9 +313,9 @@ namespace Ryujinx.Graphics.Vulkan
portabilityFlags,
vertexBufferAlignment);
- IsSharedMemory = MemoryAllocator.IsDeviceMemoryShared(Api, _physicalDevice);
+ IsSharedMemory = MemoryAllocator.IsDeviceMemoryShared(_physicalDevice);
- MemoryAllocator = new MemoryAllocator(Api, _physicalDevice, _device, properties.Limits.MaxMemoryAllocationCount);
+ MemoryAllocator = new MemoryAllocator(Api, _physicalDevice, _device);
CommandBufferPool = new CommandBufferPool(Api, _device, Queue, QueueLock, queueFamilyIndex);
@@ -345,22 +343,21 @@ namespace Ryujinx.Graphics.Vulkan
Api = api;
_instance = VulkanInitialization.CreateInstance(api, logLevel, _getRequiredExtensions());
- _debugMessenger = new VulkanDebugMessenger(api, _instance, logLevel);
+ _debugMessenger = new VulkanDebugMessenger(api, _instance.Instance, logLevel);
- if (api.TryGetInstanceExtension(_instance, out KhrSurface surfaceApi))
+ if (api.TryGetInstanceExtension(_instance.Instance, out KhrSurface surfaceApi))
{
SurfaceApi = surfaceApi;
}
- _surface = _getSurface(_instance, api);
+ _surface = _getSurface(_instance.Instance, api);
_physicalDevice = VulkanInitialization.FindSuitablePhysicalDevice(api, _instance, _surface, _preferredGpuId);
var queueFamilyIndex = VulkanInitialization.FindSuitableQueueFamily(api, _physicalDevice, _surface, out uint maxQueueCount);
- var supportedExtensions = VulkanInitialization.GetSupportedExtensions(api, _physicalDevice);
- _device = VulkanInitialization.CreateDevice(api, _physicalDevice, queueFamilyIndex, supportedExtensions, maxQueueCount);
+ _device = VulkanInitialization.CreateDevice(api, _physicalDevice, queueFamilyIndex, maxQueueCount);
- if (api.TryGetDeviceExtension(_instance, _device, out KhrSwapchain swapchainApi))
+ if (api.TryGetDeviceExtension(_instance.Instance, _device, out KhrSwapchain swapchainApi))
{
SwapchainApi = swapchainApi;
}
@@ -369,9 +366,9 @@ namespace Ryujinx.Graphics.Vulkan
Queue = queue;
QueueLock = new object();
- LoadFeatures(supportedExtensions, maxQueueCount, queueFamilyIndex);
+ LoadFeatures(maxQueueCount, queueFamilyIndex);
- _window = new Window(this, _surface, _physicalDevice, _device);
+ _window = new Window(this, _surface, _physicalDevice.PhysicalDevice, _device);
_initialized = true;
}
@@ -536,10 +533,9 @@ namespace Ryujinx.Graphics.Vulkan
PNext = &featuresVk12
};
- Api.GetPhysicalDeviceFeatures2(_physicalDevice, &features2);
- Api.GetPhysicalDeviceProperties(_physicalDevice, out var properties);
+ Api.GetPhysicalDeviceFeatures2(_physicalDevice.PhysicalDevice, &features2);
- var limits = properties.Limits;
+ var limits = _physicalDevice.PhysicalDeviceProperties.Limits;
return new Capabilities(
api: TargetApi.Vulkan,
@@ -623,7 +619,7 @@ namespace Ryujinx.Graphics.Vulkan
private unsafe void PrintGpuInformation()
{
- Api.GetPhysicalDeviceProperties(_physicalDevice, out var properties);
+ var properties = _physicalDevice.PhysicalDeviceProperties;
string vendorName = VendorUtils.GetNameFromId(properties.VendorID);
@@ -807,14 +803,14 @@ namespace Ryujinx.Graphics.Vulkan
sampler.Dispose();
}
- SurfaceApi.DestroySurface(_instance, _surface, null);
+ SurfaceApi.DestroySurface(_instance.Instance, _surface, null);
Api.DestroyDevice(_device, null);
_debugMessenger.Dispose();
// Last step destroy the instance
- Api.DestroyInstance(_instance, null);
+ _instance.Dispose();
}
}
} \ No newline at end of file