예제 #1
0
        public ID3D11Device Create(CreateDeviceArguments arguments)
        {
            DxgiSwapChainDesc desc = default;

            //desc.BufferCount = 2;   // how do I use this with depth stencil?
            desc.BufferCount       = 1;
            desc.BufferDesc.Width  = (uint)arguments.Window.Width;
            desc.BufferDesc.Height = (uint)arguments.Window.Height;
            desc.BufferDesc.Format = DxgiFormat.R8G8B8A8Unorm;
            desc.BufferDesc.RefreshRate.Denominator = arguments.RefreshRate;
            desc.BufferDesc.Scaling          = DxgiModeScaling.Unspecified;
            desc.BufferDesc.ScanlineOrdering = DxgiModeScanlineOrder.Unspecified;

            //desc.SampleDesc.Count = 4;  // AA
            desc.SampleDesc.Count   = 1;
            desc.SampleDesc.Quality = 0;

            desc.Flags        = 0;
            desc.BufferUsage  = DxgiUsage.RenderTargetOutput;
            desc.OutputWindow = arguments.Window.Handle;
            desc.Windowed     = arguments.Window.Windowed ? 1 : 0;
            desc.SwapEffect   = DxgiSwapEffect.Discard;
            //desc.SwapEffect = DxgiSwapEffect.FlipDiscard;    // how do I use this with depth stencil?
            desc.Flags = DxgiSwapChainFlag.AllowModeSwitch;

            HRESULT         result;
            IntPtr          swapChain;
            IntPtr          device;
            D3DFeatureLevel featureLevel;
            IntPtr          context;
            var             flags = arguments.Debug ? D3D11CreateDeviceFlag.Debug : D3D11CreateDeviceFlag.Default;

            unsafe
            {
                result = D3D11DeviceBindings.D3D11CreateDeviceAndSwapChain_(
                    arguments.Adapter,
                    D3DDriverType.Hardware,
                    IntPtr.Zero,
                    flags,
                    null,
                    0,
                    D3D11CommonBindings.D3D11SdkVersion(),
                    in desc,
                    out swapChain,
                    out device,
                    out featureLevel,
                    out context);
            }
            if (result.Failed)
            {
                throw new Win32Exception($"D3D11CreateDeviceAndSwapChain failed with code : 0x{ result.Code.ToString("X")}");
            }

            return(new D3D11Device(device, featureLevel, new D3D11SwapChain(swapChain), new D3D11DeviceContext(context)));
        }
 public static extern void D3D11CreateDeviceAndSwapChain(
     [In, MarshalAs(UnmanagedType.IUnknown)] object adapter,
     [In] D3D11DriverType driverType,
     [In] IntPtr software,
     [In] D3D11CreateDeviceOptions options,
     [In, MarshalAs(UnmanagedType.LPArray)] D3D11FeatureLevel[] featureLevels,
     [In] uint numFeatureLevels,
     [In] uint sdkVersion,
     [In] ref DxgiSwapChainDesc swapChainDesc,
     [Out, MarshalAs(UnmanagedType.IUnknown)] out object swapChain,
     [Out] out ID3D11Device device,
     [Out] out D3D11FeatureLevel featureLevel,
     [Out] out ID3D11DeviceContext immediateContext);
 public DxgiSwapChain CreateSwapChain(object device, DxgiSwapChainDesc desc)
 {
     return new DxgiSwapChain(this.factory.CreateSwapChain(device, ref desc));
 }