/// <summary> /// Parses OpenGL version strings with either of following formats: /// <list type="bullet"> /// <item> /// <description>major_number.minor_number</description> /// </item> /// <item> /// <description>major_number.minor_number.release_number</description> /// </item> /// </list> /// </summary> /// <param name="versionString">The OpenGL version string.</param> /// <param name="version">The parsed <see cref="GraphicsApiVersion"/>.</param> /// <returns>True whether the parse succeeded; otherwise false.</returns> public static bool TryParseGLVersion(string versionString, out GraphicsApiVersion version) { string[] versionParts = versionString.Split(' ')[0].Split('.'); if (!int.TryParse(versionParts[0], out int major) || !int.TryParse(versionParts[1], out int minor)) { version = default; return(false); } int releaseNumber = 0; if (versionParts.Length == 3) { if (!int.TryParse(versionParts[2], out releaseNumber)) { version = default; return(false); } } version = new GraphicsApiVersion(major, minor, 0, releaseNumber); return(true); }
public MTLGraphicsDevice( GraphicsDeviceOptions options, SwapchainDescription?swapchainDesc) { _device = MTLDevice.MTLCreateSystemDefaultDevice(); _deviceName = _device.name; MetalFeatures = new MTLFeatureSupport(_device); int major = (int)MetalFeatures.MaxFeatureSet / 10000; int minor = (int)MetalFeatures.MaxFeatureSet % 10000; _apiVersion = new GraphicsApiVersion(major, minor, 0, 0); Features = new GraphicsDeviceFeatures( computeShader: true, geometryShader: false, tessellationShaders: false, multipleViewports: MetalFeatures.IsSupported(MTLFeatureSet.macOS_GPUFamily1_v3), samplerLodBias: false, drawBaseVertex: MetalFeatures.IsDrawBaseVertexInstanceSupported(), drawBaseInstance: MetalFeatures.IsDrawBaseVertexInstanceSupported(), drawIndirect: true, drawIndirectBaseInstance: true, fillModeWireframe: true, samplerAnisotropy: true, depthClipDisable: true, texture1D: true, // TODO: Should be macOS 10.11+ and iOS 11.0+. independentBlend: true, structuredBuffer: true, subsetTextureView: true, commandListDebugMarkers: true, bufferRangeBinding: true, shaderFloat64: false); ResourceBindingModel = options.ResourceBindingModel; _libSystem = new NativeLibrary("libSystem.dylib"); _concreteGlobalBlock = _libSystem.LoadFunction("_NSConcreteGlobalBlock"); if (MetalFeatures.IsMacOS) { _completionHandler = OnCommandBufferCompleted; } else { _completionHandler = OnCommandBufferCompleted_Static; } _completionHandlerFuncPtr = Marshal.GetFunctionPointerForDelegate <MTLCommandBufferHandler>(_completionHandler); _completionBlockDescriptor = Marshal.AllocHGlobal(Unsafe.SizeOf <BlockDescriptor>()); BlockDescriptor *descriptorPtr = (BlockDescriptor *)_completionBlockDescriptor; descriptorPtr->reserved = 0; descriptorPtr->Block_size = (ulong)Unsafe.SizeOf <BlockDescriptor>(); _completionBlockLiteral = Marshal.AllocHGlobal(Unsafe.SizeOf <BlockLiteral>()); BlockLiteral *blockPtr = (BlockLiteral *)_completionBlockLiteral; blockPtr->isa = _concreteGlobalBlock; blockPtr->flags = 1 << 28 | 1 << 29; blockPtr->invoke = _completionHandlerFuncPtr; blockPtr->descriptor = descriptorPtr; if (!MetalFeatures.IsMacOS) { lock (s_aotRegisteredBlocks) { s_aotRegisteredBlocks.Add(_completionBlockLiteral, this); } } ResourceFactory = new MTLResourceFactory(this); _commandQueue = _device.newCommandQueue(); TextureSampleCount[] allSampleCounts = (TextureSampleCount[])Enum.GetValues(typeof(TextureSampleCount)); _supportedSampleCounts = new bool[allSampleCounts.Length]; for (int i = 0; i < allSampleCounts.Length; i++) { TextureSampleCount count = allSampleCounts[i]; uint uintValue = FormatHelpers.GetSampleCountUInt32(count); if (_device.supportsTextureSampleCount((UIntPtr)uintValue)) { _supportedSampleCounts[i] = true; } } if (swapchainDesc != null) { SwapchainDescription desc = swapchainDesc.Value; _mainSwapchain = new MTLSwapchain(this, ref desc); } _metalInfo = new BackendInfoMetal(this); PostDeviceCreated(); }
public D3D11GraphicsDevice(D3D11DeviceOptions options, SwapchainDescription?swapchainDesc) { var flags = (DeviceCreationFlags)options.DeviceCreationFlags; #if DEBUG flags |= DeviceCreationFlags.Debug; #endif // If debug flag set but SDK layers aren't available we can't enable debug. if (0 != (flags & DeviceCreationFlags.Debug) && !Vortice.Direct3D11.D3D11.SdkLayersAvailable()) { flags &= ~DeviceCreationFlags.Debug; } try { if (options.AdapterPtr != IntPtr.Zero) { VorticeD3D11.D3D11CreateDevice(options.AdapterPtr, Vortice.Direct3D.DriverType.Hardware, flags, new[] { Vortice.Direct3D.FeatureLevel.Level_11_1, Vortice.Direct3D.FeatureLevel.Level_11_0, }, out _device).CheckError(); } else { VorticeD3D11.D3D11CreateDevice(IntPtr.Zero, Vortice.Direct3D.DriverType.Hardware, flags, new[] { Vortice.Direct3D.FeatureLevel.Level_11_1, Vortice.Direct3D.FeatureLevel.Level_11_0, }, out _device).CheckError(); } } catch { VorticeD3D11.D3D11CreateDevice(IntPtr.Zero, Vortice.Direct3D.DriverType.Hardware, flags, null, out _device).CheckError(); } using (IDXGIDevice dxgiDevice = _device.QueryInterface <IDXGIDevice>()) { // Store a pointer to the DXGI adapter. // This is for the case of no preferred DXGI adapter, or fallback to WARP. dxgiDevice.GetAdapter(out _dxgiAdapter).CheckError(); AdapterDescription desc = _dxgiAdapter.Description; _deviceName = desc.Description; _vendorName = "id:" + ((uint)desc.VendorId).ToString("x8"); _deviceId = desc.DeviceId; } switch (_device.FeatureLevel) { case Vortice.Direct3D.FeatureLevel.Level_10_0: _apiVersion = new GraphicsApiVersion(10, 0, 0, 0); break; case Vortice.Direct3D.FeatureLevel.Level_10_1: _apiVersion = new GraphicsApiVersion(10, 1, 0, 0); break; case Vortice.Direct3D.FeatureLevel.Level_11_0: _apiVersion = new GraphicsApiVersion(11, 0, 0, 0); break; case Vortice.Direct3D.FeatureLevel.Level_11_1: _apiVersion = new GraphicsApiVersion(11, 1, 0, 0); break; case Vortice.Direct3D.FeatureLevel.Level_12_0: _apiVersion = new GraphicsApiVersion(12, 0, 0, 0); break; case Vortice.Direct3D.FeatureLevel.Level_12_1: _apiVersion = new GraphicsApiVersion(12, 1, 0, 0); break; case Vortice.Direct3D.FeatureLevel.Level_12_2: _apiVersion = new GraphicsApiVersion(12, 2, 0, 0); break; } if (swapchainDesc != null) { SwapchainDescription desc = swapchainDesc.Value; _mainSwapchain = new D3D11Swapchain(this, ref desc); } _immediateContext = _device.ImmediateContext; _device.CheckThreadingSupport(out _supportsConcurrentResources, out _supportsCommandLists); IsDebugEnabled = (flags & DeviceCreationFlags.Debug) != 0; Features = new GraphicsDeviceFeatures( computeShader: true, geometryShader: true, tessellationShaders: true, multipleViewports: true, samplerLodBias: true, drawBaseVertex: true, drawBaseInstance: true, drawIndirect: true, drawIndirectBaseInstance: true, fillModeWireframe: true, samplerAnisotropy: true, depthClipDisable: true, texture1D: true, independentBlend: true, structuredBuffer: true, subsetTextureView: true, commandListDebugMarkers: _device.FeatureLevel >= Vortice.Direct3D.FeatureLevel.Level_11_1, bufferRangeBinding: _device.FeatureLevel >= Vortice.Direct3D.FeatureLevel.Level_11_1, shaderFloat64: _device.CheckFeatureSupport <FeatureDataDoubles>(Vortice.Direct3D11.Feature.Doubles).DoublePrecisionFloatShaderOps); _d3d11ResourceFactory = new D3D11ResourceFactory(this); _d3d11Info = new BackendInfoD3D11(this); PostDeviceCreated(); }