2019-12-16 03:28:01 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "d3d9_device_child.h"
|
|
|
|
#include "d3d9_device.h"
|
|
|
|
#include "d3d9_format.h"
|
|
|
|
|
|
|
|
#include "../dxvk/hud/dxvk_hud.h"
|
|
|
|
|
2021-02-27 15:00:39 +01:00
|
|
|
#include "../dxvk/dxvk_swapchain_blitter.h"
|
|
|
|
|
2019-12-16 03:28:01 +00:00
|
|
|
#include "../util/sync/sync_signal.h"
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
namespace dxvk {
|
|
|
|
|
|
|
|
class D3D9Surface;
|
|
|
|
|
|
|
|
using D3D9SwapChainExBase = D3D9DeviceChild<IDirect3DSwapChain9Ex>;
|
|
|
|
class D3D9SwapChainEx final : public D3D9SwapChainExBase {
|
|
|
|
static constexpr uint32_t NumControlPoints = 256;
|
|
|
|
public:
|
|
|
|
|
|
|
|
D3D9SwapChainEx(
|
|
|
|
D3D9DeviceEx* pDevice,
|
|
|
|
D3DPRESENT_PARAMETERS* pPresentParams,
|
|
|
|
const D3DDISPLAYMODEEX* pFullscreenDisplayMode);
|
|
|
|
|
|
|
|
~D3D9SwapChainEx();
|
|
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
|
|
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE Present(
|
|
|
|
const RECT* pSourceRect,
|
|
|
|
const RECT* pDestRect,
|
|
|
|
HWND hDestWindowOverride,
|
|
|
|
const RGNDATA* pDirtyRegion,
|
|
|
|
DWORD dwFlags);
|
|
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE GetFrontBufferData(IDirect3DSurface9* pDestSurface);
|
|
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE GetBackBuffer(
|
|
|
|
UINT iBackBuffer,
|
|
|
|
D3DBACKBUFFER_TYPE Type,
|
|
|
|
IDirect3DSurface9** ppBackBuffer);
|
|
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE GetRasterStatus(D3DRASTER_STATUS* pRasterStatus);
|
|
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE GetDisplayMode(D3DDISPLAYMODE* pMode);
|
|
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE GetPresentParameters(D3DPRESENT_PARAMETERS* pPresentationParameters);
|
|
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE GetLastPresentCount(UINT* pLastPresentCount);
|
|
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE GetPresentStats(D3DPRESENTSTATS* pPresentationStatistics);
|
|
|
|
|
|
|
|
HRESULT STDMETHODCALLTYPE GetDisplayModeEx(D3DDISPLAYMODEEX* pMode, D3DDISPLAYROTATION* pRotation);
|
|
|
|
|
|
|
|
void Reset(
|
|
|
|
D3DPRESENT_PARAMETERS* pPresentParams,
|
|
|
|
D3DDISPLAYMODEEX* pFullscreenDisplayMode);
|
|
|
|
|
|
|
|
HRESULT WaitForVBlank();
|
|
|
|
|
|
|
|
void SetGammaRamp(
|
|
|
|
DWORD Flags,
|
|
|
|
const D3DGAMMARAMP* pRamp);
|
|
|
|
|
|
|
|
void GetGammaRamp(D3DGAMMARAMP* pRamp);
|
|
|
|
|
|
|
|
void Invalidate(HWND hWindow);
|
|
|
|
|
|
|
|
HRESULT SetDialogBoxMode(bool bEnableDialogs);
|
|
|
|
|
|
|
|
D3D9Surface* GetBackBuffer(UINT iBackBuffer);
|
|
|
|
|
2020-02-28 01:43:07 +00:00
|
|
|
const D3DPRESENT_PARAMETERS* GetPresentParams() const { return &m_presentParams; }
|
|
|
|
|
2021-06-01 17:07:10 +01:00
|
|
|
void SyncFrameLatency();
|
|
|
|
|
2019-12-16 03:28:01 +00:00
|
|
|
private:
|
|
|
|
|
|
|
|
enum BindingIds : uint32_t {
|
|
|
|
Image = 0,
|
|
|
|
Gamma = 1,
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct WindowState {
|
|
|
|
LONG style = 0;
|
|
|
|
LONG exstyle = 0;
|
|
|
|
RECT rect = { 0, 0, 0, 0 };
|
|
|
|
};
|
|
|
|
|
2021-02-27 15:00:39 +01:00
|
|
|
D3DPRESENT_PARAMETERS m_presentParams;
|
|
|
|
D3DGAMMARAMP m_ramp;
|
2019-12-16 03:28:01 +00:00
|
|
|
|
2021-02-27 15:00:39 +01:00
|
|
|
Rc<DxvkDevice> m_device;
|
|
|
|
Rc<DxvkContext> m_context;
|
|
|
|
Rc<DxvkSwapchainBlitter> m_blitter;
|
2019-12-16 03:28:01 +00:00
|
|
|
|
2021-02-27 15:00:39 +01:00
|
|
|
Rc<vk::Presenter> m_presenter;
|
2019-12-16 03:28:01 +00:00
|
|
|
|
2021-02-27 15:00:39 +01:00
|
|
|
Rc<hud::Hud> m_hud;
|
2019-12-16 03:28:01 +00:00
|
|
|
|
2020-04-26 12:58:19 +01:00
|
|
|
std::vector<Com<D3D9Surface, false>> m_backBuffers;
|
2019-12-16 03:28:01 +00:00
|
|
|
|
2021-02-27 15:00:39 +01:00
|
|
|
RECT m_srcRect;
|
|
|
|
RECT m_dstRect;
|
2019-12-16 03:28:01 +00:00
|
|
|
|
2021-02-27 15:00:39 +01:00
|
|
|
DxvkSubmitStatus m_presentStatus;
|
2019-12-16 03:28:01 +00:00
|
|
|
|
|
|
|
std::vector<Rc<DxvkImageView>> m_imageViews;
|
|
|
|
|
|
|
|
|
2021-02-27 15:00:39 +01:00
|
|
|
uint64_t m_frameId = D3D9DeviceEx::MaxFrameLatency;
|
|
|
|
uint32_t m_frameLatencyCap = 0;
|
|
|
|
Rc<sync::Fence> m_frameLatencySignal;
|
2019-12-16 03:28:01 +00:00
|
|
|
|
2021-02-27 15:00:39 +01:00
|
|
|
bool m_dirty = true;
|
|
|
|
bool m_vsync = true;
|
2019-12-16 03:28:01 +00:00
|
|
|
|
2021-02-27 15:00:39 +01:00
|
|
|
bool m_dialog;
|
|
|
|
bool m_lastDialog = false;
|
2019-12-16 03:28:01 +00:00
|
|
|
|
2021-02-27 15:00:39 +01:00
|
|
|
HWND m_window = nullptr;
|
|
|
|
HMONITOR m_monitor = nullptr;
|
2019-12-16 03:28:01 +00:00
|
|
|
|
2021-02-27 15:00:39 +01:00
|
|
|
WindowState m_windowState;
|
2019-12-16 03:28:01 +00:00
|
|
|
|
2021-06-09 08:05:55 +02:00
|
|
|
double m_displayRefreshRate = 0.0;
|
|
|
|
|
2019-12-16 03:28:01 +00:00
|
|
|
void PresentImage(UINT PresentInterval);
|
|
|
|
|
|
|
|
void SubmitPresent(const vk::PresenterSync& Sync, uint32_t FrameId);
|
|
|
|
|
|
|
|
void SynchronizePresent();
|
|
|
|
|
|
|
|
void RecreateSwapChain(
|
|
|
|
BOOL Vsync);
|
|
|
|
|
|
|
|
void CreatePresenter();
|
|
|
|
|
|
|
|
void CreateRenderTargetViews();
|
|
|
|
|
2020-04-18 20:40:49 +01:00
|
|
|
void DestroyBackBuffers();
|
|
|
|
|
2020-01-15 01:03:02 +01:00
|
|
|
void CreateBackBuffers(
|
|
|
|
uint32_t NumBackBuffers);
|
2019-12-16 03:28:01 +00:00
|
|
|
|
2021-02-27 15:00:39 +01:00
|
|
|
void CreateBlitter();
|
2019-12-16 03:28:01 +00:00
|
|
|
|
|
|
|
void CreateHud();
|
|
|
|
|
|
|
|
void InitRamp();
|
|
|
|
|
|
|
|
uint32_t GetActualFrameLatency();
|
|
|
|
|
|
|
|
uint32_t PickFormats(
|
|
|
|
D3D9Format Format,
|
|
|
|
VkSurfaceFormatKHR* pDstFormats);
|
|
|
|
|
|
|
|
uint32_t PickPresentModes(
|
|
|
|
BOOL Vsync,
|
|
|
|
VkPresentModeKHR* pDstModes);
|
|
|
|
|
|
|
|
uint32_t PickImageCount(
|
|
|
|
UINT Preferred);
|
|
|
|
|
|
|
|
void NormalizePresentParameters(D3DPRESENT_PARAMETERS* pPresentParams);
|
|
|
|
|
2021-06-09 08:05:55 +02:00
|
|
|
void NotifyDisplayRefreshRate(
|
|
|
|
double RefreshRate);
|
|
|
|
|
2019-12-16 03:28:01 +00:00
|
|
|
HRESULT EnterFullscreenMode(
|
|
|
|
D3DPRESENT_PARAMETERS* pPresentParams,
|
|
|
|
const D3DDISPLAYMODEEX* pFullscreenDisplayMode);
|
|
|
|
|
|
|
|
HRESULT LeaveFullscreenMode();
|
|
|
|
|
|
|
|
HRESULT ChangeDisplayMode(
|
|
|
|
D3DPRESENT_PARAMETERS* pPresentParams,
|
|
|
|
const D3DDISPLAYMODEEX* pFullscreenDisplayMode);
|
|
|
|
|
|
|
|
HRESULT RestoreDisplayMode(HMONITOR hMonitor);
|
|
|
|
|
|
|
|
bool UpdatePresentRegion(const RECT* pSourceRect, const RECT* pDestRect);
|
|
|
|
|
|
|
|
VkExtent2D GetPresentExtent();
|
|
|
|
|
|
|
|
VkFullScreenExclusiveEXT PickFullscreenMode();
|
|
|
|
|
2020-01-28 13:15:02 +01:00
|
|
|
std::string GetApiName();
|
|
|
|
|
2019-12-16 03:28:01 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|