diff options
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/VulkanRenderer.cs')
-rw-r--r-- | Ryujinx.Graphics.Vulkan/VulkanRenderer.cs | 92 |
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 |