summaryrefslogtreecommitdiffstats
path: root/src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_swapchain.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_swapchain.h164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_swapchain.h b/src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_swapchain.h
new file mode 100644
index 00000000..8fc9fe10
--- /dev/null
+++ b/src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_swapchain.h
@@ -0,0 +1,164 @@
+#pragma once
+
+#include "d3d11_texture.h"
+
+#include "../dxvk/hud/dxvk_hud.h"
+
+#include "../dxvk/dxvk_swapchain_blitter.h"
+
+#include "../util/sync/sync_signal.h"
+
+namespace dxvk {
+
+ class D3D11Device;
+ class D3D11DXGIDevice;
+
+ class D3D11SwapChain : public ComObject<IDXGIVkSwapChain> {
+ constexpr static uint32_t DefaultFrameLatency = 1;
+ public:
+
+ D3D11SwapChain(
+ D3D11DXGIDevice* pContainer,
+ D3D11Device* pDevice,
+ HWND hWnd,
+ const DXGI_SWAP_CHAIN_DESC1* pDesc);
+
+ ~D3D11SwapChain();
+
+ HRESULT STDMETHODCALLTYPE QueryInterface(
+ REFIID riid,
+ void** ppvObject);
+
+ HRESULT STDMETHODCALLTYPE GetDesc(
+ DXGI_SWAP_CHAIN_DESC1* pDesc);
+
+ HRESULT STDMETHODCALLTYPE GetAdapter(
+ REFIID riid,
+ void** ppvObject);
+
+ HRESULT STDMETHODCALLTYPE GetDevice(
+ REFIID riid,
+ void** ppDevice);
+
+ HRESULT STDMETHODCALLTYPE GetImage(
+ UINT BufferId,
+ REFIID riid,
+ void** ppBuffer);
+
+ UINT STDMETHODCALLTYPE GetImageIndex();
+
+ UINT STDMETHODCALLTYPE GetFrameLatency();
+
+ HANDLE STDMETHODCALLTYPE GetFrameLatencyEvent();
+
+ HRESULT STDMETHODCALLTYPE ChangeProperties(
+ const DXGI_SWAP_CHAIN_DESC1* pDesc);
+
+ HRESULT STDMETHODCALLTYPE SetPresentRegion(
+ const RECT* pRegion);
+
+ HRESULT STDMETHODCALLTYPE SetGammaControl(
+ UINT NumControlPoints,
+ const DXGI_RGB* pControlPoints);
+
+ HRESULT STDMETHODCALLTYPE SetFrameLatency(
+ UINT MaxLatency);
+
+ HRESULT STDMETHODCALLTYPE Present(
+ UINT SyncInterval,
+ UINT PresentFlags,
+ const DXGI_PRESENT_PARAMETERS* pPresentParameters);
+
+ void STDMETHODCALLTYPE NotifyModeChange(
+ BOOL Windowed,
+ const DXGI_MODE_DESC* pDisplayMode);
+
+ private:
+
+ enum BindingIds : uint32_t {
+ Image = 0,
+ Gamma = 1,
+ };
+
+ Com<D3D11DXGIDevice, false> m_dxgiDevice;
+
+ D3D11Device* m_parent;
+ HWND m_window;
+
+ DXGI_SWAP_CHAIN_DESC1 m_desc;
+
+ Rc<DxvkDevice> m_device;
+ Rc<DxvkContext> m_context;
+
+ Rc<vk::Presenter> m_presenter;
+
+ Rc<DxvkImage> m_swapImage;
+ Rc<DxvkImageView> m_swapImageView;
+ Rc<DxvkSwapchainBlitter> m_blitter;
+
+ Rc<hud::Hud> m_hud;
+
+ D3D11Texture2D* m_backBuffer = nullptr;
+ DxvkSubmitStatus m_presentStatus;
+
+ std::vector<Rc<DxvkImageView>> m_imageViews;
+
+ uint64_t m_frameId = DXGI_MAX_SWAP_CHAIN_BUFFERS;
+ uint32_t m_frameLatency = DefaultFrameLatency;
+ uint32_t m_frameLatencyCap = 0;
+ HANDLE m_frameLatencyEvent = nullptr;
+ Rc<sync::CallbackFence> m_frameLatencySignal;
+
+ bool m_dirty = true;
+ bool m_vsync = true;
+
+ double m_displayRefreshRate = 0.0;
+
+ HRESULT PresentImage(UINT SyncInterval);
+
+ void SubmitPresent(
+ D3D11ImmediateContext* pContext,
+ const vk::PresenterSync& Sync,
+ uint32_t FrameId);
+
+ void SynchronizePresent();
+
+ void RecreateSwapChain(
+ BOOL Vsync);
+
+ void CreateFrameLatencyEvent();
+
+ void CreatePresenter();
+
+ void CreateRenderTargetViews();
+
+ void CreateBackBuffer();
+
+ void CreateBlitter();
+
+ void CreateHud();
+
+ void DestroyFrameLatencyEvent();
+
+ void SyncFrameLatency();
+
+ uint32_t GetActualFrameLatency();
+
+ uint32_t PickFormats(
+ DXGI_FORMAT Format,
+ VkSurfaceFormatKHR* pDstFormats);
+
+ uint32_t PickPresentModes(
+ BOOL Vsync,
+ VkPresentModeKHR* pDstModes);
+
+ uint32_t PickImageCount(
+ UINT Preferred);
+
+ VkFullScreenExclusiveEXT PickFullscreenMode();
+
+ std::string GetApiName() const;
+
+ };
+
+} \ No newline at end of file