public ComputeShader(Vk vk, Instance instance, Device device, PhysicalDevice physicalDevice, PipelineLayout pipelineLayout, ReadOnlySpan <byte> data, string functionName, SpecializationInfo *specializationInfo) { var subgroupProperties = new PhysicalDeviceSubgroupProperties(pNext: null); var properties = new PhysicalDeviceProperties2(pNext: &subgroupProperties); vk.GetPhysicalDeviceProperties2(physicalDevice, &properties); var subgroupSize = subgroupProperties.SubgroupSize; Console.WriteLine($"Detected subgroup size {subgroupSize}"); var data2 = new byte[data.Length + 32]; data.CopyTo(data2); _vk = vk; _device = device; ShaderModule shaderModule; fixed(byte *pData = data2) _vk.CreateShaderModule(_device, new ShaderModuleCreateInfo(codeSize: (nuint)data.Length, pCode: (uint *)pData), null, out shaderModule).ThrowCode(); try { var pName = SilkMarshal.StringToPtr(functionName); try { PipelineCreateFlags flags = 0; _vk.CreateComputePipelines(_device, default, 1, new ComputePipelineCreateInfo(flags: flags , layout: pipelineLayout, stage: new PipelineShaderStageCreateInfo(stage: ShaderStageFlags.ShaderStageComputeBit, module: shaderModule, pName: (byte *)pName, pSpecializationInfo: specializationInfo)), null, out _pipeline).ThrowCode(); }
/// <summary>To be added.</summary> public unsafe PhysicalDeviceProperties2 GetPhysicalDeviceProperties2([Count(Count = 0)] PhysicalDevice physicalDevice) { // ReturnTypeOverloader PhysicalDeviceProperties2 ret = default; GetPhysicalDeviceProperties2(physicalDevice, &ret); return(ret); }
public unsafe RayTracingProperties(Api api) { _accelProps.Value.SType = StructureType.PhysicalDeviceAccelerationStructurePropertiesKhr; _pipelineProps.Value.SType = StructureType.PhysicalDeviceRayTracingPipelinePropertiesKhr; _pipelineProps.Value.PNext = _accelProps.Ptr; var props = new PhysicalDeviceProperties2(); props.SType = StructureType.PhysicalDeviceProperties2; props.PNext = _pipelineProps.Ptr; api.Vk.GetPhysicalDeviceProperties2(api.Device.PhysicalDevice, &props); }
public static void GetVkPhysicalDeviceProperties2(Vk vk, PhysicalDevice device, out PhysicalDeviceProperties2 deviceProperties, out PhysicalDeviceDriverProperties driverProperties) { driverProperties = new PhysicalDeviceDriverProperties { SType = StructureType.PhysicalDeviceDriverProperties, }; fixed(PhysicalDeviceDriverProperties *props = &driverProperties) { deviceProperties = new PhysicalDeviceProperties2 { PNext = props }; } fixed(PhysicalDeviceProperties2 *props = &deviceProperties) { vk.GetPhysicalDeviceProperties2(device, props); } }
private unsafe void LoadFeatures(string[] supportedExtensions, uint maxQueueCount, uint queueFamilyIndex) { FormatCapabilities = new FormatCapabilities(Api, _physicalDevice); var supportedFeatures = Api.GetPhysicalDeviceFeature(_physicalDevice); if (Api.TryGetDeviceExtension(_instance, _device, out ExtConditionalRendering conditionalRenderingApi)) { ConditionalRenderingApi = conditionalRenderingApi; } if (Api.TryGetDeviceExtension(_instance, _device, out ExtExtendedDynamicState extendedDynamicStateApi)) { ExtendedDynamicStateApi = extendedDynamicStateApi; } if (Api.TryGetDeviceExtension(_instance, _device, out KhrPushDescriptor pushDescriptorApi)) { PushDescriptorApi = pushDescriptorApi; } if (Api.TryGetDeviceExtension(_instance, _device, out ExtTransformFeedback transformFeedbackApi)) { TransformFeedbackApi = transformFeedbackApi; } if (Api.TryGetDeviceExtension(_instance, _device, out KhrDrawIndirectCount drawIndirectCountApi)) { DrawIndirectCountApi = drawIndirectCountApi; } if (maxQueueCount >= 2) { Api.GetDeviceQueue(_device, queueFamilyIndex, 1, out var backgroundQueue); BackgroundQueue = backgroundQueue; BackgroundQueueLock = new object(); } PhysicalDeviceProperties2 properties2 = new PhysicalDeviceProperties2() { SType = StructureType.PhysicalDeviceProperties2 }; PhysicalDeviceSubgroupSizeControlPropertiesEXT propertiesSubgroupSizeControl = new PhysicalDeviceSubgroupSizeControlPropertiesEXT() { SType = StructureType.PhysicalDeviceSubgroupSizeControlPropertiesExt }; if (Capabilities.SupportsSubgroupSizeControl) { properties2.PNext = &propertiesSubgroupSizeControl; } bool supportsTransformFeedback = supportedExtensions.Contains(ExtTransformFeedback.ExtensionName); PhysicalDeviceTransformFeedbackPropertiesEXT propertiesTransformFeedback = new PhysicalDeviceTransformFeedbackPropertiesEXT() { SType = StructureType.PhysicalDeviceTransformFeedbackPropertiesExt }; if (supportsTransformFeedback) { propertiesTransformFeedback.PNext = properties2.PNext; properties2.PNext = &propertiesTransformFeedback; } Api.GetPhysicalDeviceProperties2(_physicalDevice, &properties2); PhysicalDeviceFeatures2 features2 = new PhysicalDeviceFeatures2() { SType = StructureType.PhysicalDeviceFeatures2 }; PhysicalDeviceRobustness2FeaturesEXT featuresRobustness2 = new PhysicalDeviceRobustness2FeaturesEXT() { SType = StructureType.PhysicalDeviceRobustness2FeaturesExt }; if (supportedExtensions.Contains("VK_EXT_robustness2")) { features2.PNext = &featuresRobustness2; } Api.GetPhysicalDeviceFeatures2(_physicalDevice, &features2); Capabilities = new HardwareCapabilities( supportedExtensions.Contains("VK_EXT_index_type_uint8"), supportedExtensions.Contains("VK_EXT_custom_border_color"), supportedExtensions.Contains(KhrDrawIndirectCount.ExtensionName), supportedExtensions.Contains("VK_EXT_fragment_shader_interlock"), supportedExtensions.Contains("VK_NV_geometry_shader_passthrough"), supportedExtensions.Contains("VK_EXT_subgroup_size_control"), supportedExtensions.Contains(ExtConditionalRendering.ExtensionName), supportedExtensions.Contains(ExtExtendedDynamicState.ExtensionName), features2.Features.MultiViewport, featuresRobustness2.NullDescriptor, supportedExtensions.Contains(KhrPushDescriptor.ExtensionName), supportsTransformFeedback, propertiesTransformFeedback.TransformFeedbackQueries, supportedFeatures.GeometryShader, propertiesSubgroupSizeControl.MinSubgroupSize, propertiesSubgroupSizeControl.MaxSubgroupSize, propertiesSubgroupSizeControl.RequiredSubgroupSizeStages); ref var properties = ref properties2.Properties;
public abstract void GetPhysicalDeviceProperties2([Count(Count = 0)] PhysicalDevice physicalDevice, [Count(Count = 0), Flow(FlowDirection.Out)] out PhysicalDeviceProperties2 pProperties);
public unsafe VulkanRenderer(UserSettings userSettings, Window window, IScene scene, CameraInitialState cameraInitialState, ILogger logger, bool enableDebugLogging) { _userSettings = userSettings; _window = window; _api = new Api(enableDebugLogging, logger); _presentMode = _userSettings.VSync ? PresentModeKHR.PresentModeFifoKhr : PresentModeKHR.PresentModeImmediateKhr; _api.Instance = new Instance(_api, _window, new Version32(1, 2, 0)); _surface = new Surface(_api, _window, _api.Instance); // Find the vulkan device we want var physicalDevice = _api.Instance.PhysicalDevices.Where(d => { _api.Vk.GetPhysicalDeviceFeatures(d, out var deviceFeatures); if (deviceFeatures.GeometryShader == false) { return(false); } var queueFamilies = Enumerate.Get <PhysicalDevice, QueueFamilyProperties>(d, (device, count, values) => _api.Vk.GetPhysicalDeviceQueueFamilyProperties(device, (uint *)count, (QueueFamilyProperties *)values)); for (var i = 0; i < queueFamilies.Count; i++) { if (queueFamilies[i].QueueCount > 0 && queueFamilies[i].QueueFlags.HasFlag(QueueFlags.QueueGraphicsBit)) { return(true); } } return(false); }).FirstOrDefault(); if (physicalDevice.Handle == 0) { throw new Exception($"{nameof(VulkanRenderer)}: Could not find a suitable graphics device."); } var deviceProps = new PhysicalDeviceProperties2(); deviceProps.SType = StructureType.PhysicalDeviceProperties2; _api.Vk.GetPhysicalDeviceProperties2(physicalDevice, &deviceProps); _api.Logger.Debug($"{nameof(VulkanRenderer)}: Setting physical device: {deviceProps.Properties.DeviceID} ({Marshal.PtrToStringAnsi((nint)deviceProps.Properties.DeviceName)})"); // Opt-in into mandatory device features. var shaderClockFeatures = new PhysicalDeviceShaderClockFeaturesKHR(); shaderClockFeatures.SType = StructureType.PhysicalDeviceShaderClockFeaturesKhr; shaderClockFeatures.PNext = null; shaderClockFeatures.ShaderSubgroupClock = true; var deviceFeatures = new PhysicalDeviceFeatures(); deviceFeatures.FillModeNonSolid = true; deviceFeatures.SamplerAnisotropy = true; deviceFeatures.ShaderInt64 = true; // Required device features. var bufferDeviceAddressFeatures = new PhysicalDeviceBufferDeviceAddressFeatures(); bufferDeviceAddressFeatures.SType = StructureType.PhysicalDeviceBufferDeviceAddressFeatures; bufferDeviceAddressFeatures.PNext = &shaderClockFeatures; bufferDeviceAddressFeatures.BufferDeviceAddress = true; var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures(); indexingFeatures.SType = StructureType.PhysicalDeviceDescriptorIndexingFeatures; indexingFeatures.PNext = &bufferDeviceAddressFeatures; indexingFeatures.RuntimeDescriptorArray = true; indexingFeatures.ShaderSampledImageArrayNonUniformIndexing = true; var accelerationStructureFeatures = new PhysicalDeviceAccelerationStructureFeaturesKHR(); accelerationStructureFeatures.SType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr; accelerationStructureFeatures.PNext = &indexingFeatures; accelerationStructureFeatures.AccelerationStructure = true; var rayTracingFeatures = new PhysicalDeviceRayTracingPipelineFeaturesKHR(); rayTracingFeatures.SType = StructureType.PhysicalDeviceRayTracingPipelineFeaturesKhr; rayTracingFeatures.PNext = &accelerationStructureFeatures; rayTracingFeatures.RayTracingPipeline = true; _api.Device = new Device(_api, physicalDevice, _surface, deviceFeatures, Unsafe.AsPointer(ref rayTracingFeatures)); // Now that we have an instance and a device, load all of the extentions we need. _api.InitializeExtensions(); _commandPool = new CommandPool(_api, _api.Device.GraphicsFamilyIndex, true); _rayTracingProperties = new RayTracingProperties(_api); // Load the scene, and create the swap chain / command buffers LoadScene(scene, cameraInitialState); _currentFrame = 0; _api.Device.WaitIdle(); }