mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-01-31 23:52:20 +01:00
a3fa9c26dc
This reverts commit 79f6239df36a697ec79a1782d1df3b10607afcd1. Some engines use SEQUENTIAL presentation despite not making use of it, and sparse binding is much slower than expected on Nvidia drivers, which leads to massive performance regressions across the board.
179 lines
4.8 KiB
C++
179 lines
4.8 KiB
C++
#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<IDXGIVkSwapChain1> {
|
|
constexpr static uint32_t DefaultFrameLatency = 1;
|
|
public:
|
|
|
|
D3D11SwapChain(
|
|
D3D11DXGIDevice* pContainer,
|
|
D3D11Device* pDevice,
|
|
IDXGIVkSurfaceFactory* pSurfaceFactory,
|
|
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,
|
|
const UINT* pNodeMasks,
|
|
IUnknown* const* ppPresentQueues);
|
|
|
|
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);
|
|
|
|
UINT STDMETHODCALLTYPE CheckColorSpaceSupport(
|
|
DXGI_COLOR_SPACE_TYPE ColorSpace);
|
|
|
|
HRESULT STDMETHODCALLTYPE SetColorSpace(
|
|
DXGI_COLOR_SPACE_TYPE ColorSpace);
|
|
|
|
HRESULT STDMETHODCALLTYPE SetHDRMetaData(
|
|
const DXGI_VK_HDR_METADATA* pMetaData);
|
|
|
|
void STDMETHODCALLTYPE GetLastPresentCount(
|
|
UINT64* pLastPresentCount);
|
|
|
|
void STDMETHODCALLTYPE GetFrameStatistics(
|
|
DXGI_VK_FRAME_STATISTICS* pFrameStatistics);
|
|
|
|
private:
|
|
|
|
enum BindingIds : uint32_t {
|
|
Image = 0,
|
|
Gamma = 1,
|
|
};
|
|
|
|
Com<D3D11DXGIDevice, false> m_dxgiDevice;
|
|
|
|
D3D11Device* m_parent;
|
|
Com<IDXGIVkSurfaceFactory> m_surfaceFactory;
|
|
|
|
DXGI_SWAP_CHAIN_DESC1 m_desc;
|
|
|
|
Rc<DxvkDevice> m_device;
|
|
Rc<DxvkContext> m_context;
|
|
|
|
Rc<Presenter> m_presenter;
|
|
|
|
Rc<DxvkImage> m_swapImage;
|
|
Rc<DxvkImageView> m_swapImageView;
|
|
Rc<DxvkSwapchainBlitter> m_blitter;
|
|
|
|
Rc<hud::Hud> m_hud;
|
|
|
|
Com<D3D11Texture2D, false> m_backBuffer;
|
|
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;
|
|
|
|
VkColorSpaceKHR m_colorspace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
|
|
|
|
std::optional<VkHdrMetadataEXT> m_hdrMetadata;
|
|
bool m_dirtyHdrMetadata = true;
|
|
|
|
dxvk::mutex m_frameStatisticsLock;
|
|
DXGI_VK_FRAME_STATISTICS m_frameStatistics = { };
|
|
|
|
HRESULT PresentImage(UINT SyncInterval);
|
|
|
|
void SubmitPresent(
|
|
D3D11ImmediateContext* pContext,
|
|
const PresenterSync& Sync,
|
|
uint32_t Repeat);
|
|
|
|
void SynchronizePresent();
|
|
|
|
void RecreateSwapChain();
|
|
|
|
void CreateFrameLatencyEvent();
|
|
|
|
void CreatePresenter();
|
|
|
|
VkResult CreateSurface(VkSurfaceKHR* pSurface);
|
|
|
|
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 PickImageCount(
|
|
UINT Preferred);
|
|
|
|
VkFullScreenExclusiveEXT PickFullscreenMode();
|
|
|
|
std::string GetApiName() const;
|
|
|
|
};
|
|
|
|
} |