Direct3D 11.1 - Probleme mit SwapChain1

  • C#

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    Direct3D 11.1 - Probleme mit SwapChain1

    Hallo!

    Ich sitze gerade an nem neuen Renderer für GameUtils bzw. hab ihn eigentlich schon fertig. Er läuft mit Direct2D 1.1, welches mit Windows 8 ja neu rausgekommen ist.
    Nun ist es ja so, dass man bei Direct2D 1.1, im Gegensatzt zu Direct2D 1, zwignend nen Direct3D-Device erstellen muss. Soweit alles kein Problem, gab auf MSDN genug Samples. Ich hab den C++-Code auf SharpDX portiert und so sieht mein Code jetzt aus:

    C#-Quellcode

    1. d3dDevice = new D3D.Device(DriverType.Hardware, D3D.DeviceCreationFlags.BgraSupport);
    2. dxgiDevice = d3dDevice.QueryInterface<DXGI.Device1>();
    3. var desc = new DXGI.SwapChainDescription1()
    4. {
    5. Width = 0,
    6. Height = 0,
    7. Format = DXGI.Format.B8G8R8A8_UNorm,
    8. Stereo = false,
    9. SampleDescription = new DXGI.SampleDescription(1, 0),
    10. Usage = DXGI.Usage.RenderTargetOutput,
    11. BufferCount = 2,
    12. Scaling = DXGI.Scaling.None,
    13. SwapEffect = DXGI.SwapEffect.FlipSequential,
    14. Flags = DXGI.SwapChainFlags.None
    15. };
    16. DXGI.Factory2 dxgiFactory = dxgiDevice.Adapter.GetParent<DXGI.Factory2>();
    17. swapChain = dxgiFactory.CreateSwapChainForHwnd(d3dDevice, surface.Handle, ref desc, null, null);
    18. dxgiDevice.MaximumFrameLatency = 1;
    Das ist nur der Code für den Direct3D-Teil, weil der Direct2D-Teil funktioniert schon einwandfrei.
    So wie das jetzt dasteht, funktioniert das momentan auch. Allerdings hab ich ein Problem, Microsoft schein sich mit Direct2D 1.1 total auf Storeapps zu fixieren und bringt auch nur dafür Samples raus. Auch dieser Code hier war eigentlich für ne Storeapp, ich hab bloß die vorletzte Zeile (hier Zeile 17) geändert. Storeapps haben die Beschränkung, dass man als SwapEffect (Zeile 13) zwingend FlipSequential angeben muss. Dieses Modell hat aber leider den Nachteil, dass man VSync nicht ausschalten kann, auch wenn man beim Present einen SyncIntervall von 0 angibt (man kann Present zwar dann öfter aufrufen, aber die überschüssigen Frames werden einfach "verschluckt" und nicht angezeigt). Also dachte ich mir, da ich ja nicht mit Storeapps arbeite, nehm ich einfach wieder wie in guter alter Manier den SwappEffect Discard, aber zu früh gefreut, wenn ich das mache, dann bekomm ich in Zeile 17 nen DXGI_ERROR_INVALID_CALL geschmissen. Hat irgend wer ne Idee, was ich da noch falsch mache, ich hab mich mit Direct3D noch nie intensiv beschäftigt und auch nichts dazu gefunden?