Switch to the D3DSWAPEFFECT_FLIPEX swap model

This commit is contained in:
Magnus Norddahl 2019-12-02 20:05:13 +01:00
parent 43139276d1
commit a9e6592feb
3 changed files with 19 additions and 18 deletions

View file

@ -49,12 +49,12 @@ extern FString gpuStatOutput;
#ifdef WIN32 #ifdef WIN32
void I_PolyPresentInit(); void I_PolyPresentInit();
uint8_t *I_PolyPresentLock(int w, int h, int &pitch); uint8_t *I_PolyPresentLock(int w, int h, bool vsync, int &pitch);
void I_PolyPresentUnlock(int x, int y, int w, int h); void I_PolyPresentUnlock(int x, int y, int w, int h);
void I_PolyPresentDeinit(); void I_PolyPresentDeinit();
#else #else
void I_PolyPresentInit() { } void I_PolyPresentInit() { }
uint8_t *I_PolyPresentLock(int w, int h, int &pitch) { pitch = 0; return nullptr; } uint8_t *I_PolyPresentLock(int w, int h, bool vsync, int &pitch) { pitch = 0; return nullptr; }
void I_PolyPresentUnlock(int x, int y, int w, int h) { } void I_PolyPresentUnlock(int x, int y, int w, int h) { }
void I_PolyPresentDeinit() { } void I_PolyPresentDeinit() { }
#endif #endif
@ -157,7 +157,7 @@ void PolyFrameBuffer::Update()
int pixelsize = 4; int pixelsize = 4;
const uint8_t *src = (const uint8_t*)mCanvas->GetPixels(); const uint8_t *src = (const uint8_t*)mCanvas->GetPixels();
int pitch = 0; int pitch = 0;
uint8_t *dst = I_PolyPresentLock(w, h, pitch); uint8_t *dst = I_PolyPresentLock(w, h, cur_vsync, pitch);
if (dst) if (dst)
{ {
#if 1 #if 1
@ -444,7 +444,7 @@ uint32_t PolyFrameBuffer::GetCaps()
void PolyFrameBuffer::SetVSync(bool vsync) void PolyFrameBuffer::SetVSync(bool vsync)
{ {
// This is handled in PolySwapChain::AcquireImage. cur_vsync = vsync;
} }
void PolyFrameBuffer::CleanForRestart() void PolyFrameBuffer::CleanForRestart()

View file

@ -83,6 +83,8 @@ private:
std::unique_ptr<PolyDepthStencil> mDepthStencil; std::unique_ptr<PolyDepthStencil> mDepthStencil;
std::shared_ptr<DrawerCommandQueue> mDrawCommands; std::shared_ptr<DrawerCommandQueue> mDrawCommands;
RenderMemory mFrameMemory; RenderMemory mFrameMemory;
bool cur_vsync = false;
}; };
inline PolyFrameBuffer *GetPolyFrameBuffer() { return static_cast<PolyFrameBuffer*>(screen); } inline PolyFrameBuffer *GetPolyFrameBuffer() { return static_cast<PolyFrameBuffer*>(screen); }

View file

@ -19,14 +19,14 @@ namespace
int ClientHeight = 0; int ClientHeight = 0;
bool CurrentVSync = false; bool CurrentVSync = false;
IDirect3D9 *d3d9 = nullptr; IDirect3D9Ex *d3d9 = nullptr;
IDirect3DDevice9 *device = nullptr; IDirect3DDevice9Ex *device = nullptr;
IDirect3DSurface9 *surface = nullptr; IDirect3DSurface9* surface = nullptr;
} }
void I_PolyPresentInit() void I_PolyPresentInit()
{ {
d3d9 = Direct3DCreate9(D3D_SDK_VERSION); Direct3DCreate9Ex(D3D_SDK_VERSION, &d3d9);
if (!d3d9) if (!d3d9)
{ {
I_FatalError("Direct3DCreate9 failed"); I_FatalError("Direct3DCreate9 failed");
@ -35,33 +35,32 @@ void I_PolyPresentInit()
RECT rect = {}; RECT rect = {};
GetClientRect(Window, &rect); GetClientRect(Window, &rect);
CurrentVSync = vid_vsync;
ClientWidth = rect.right; ClientWidth = rect.right;
ClientHeight = rect.bottom; ClientHeight = rect.bottom;
D3DPRESENT_PARAMETERS pp = {}; D3DPRESENT_PARAMETERS pp = {};
pp.Windowed = true; pp.Windowed = true;
pp.SwapEffect = D3DSWAPEFFECT_DISCARD; pp.SwapEffect = D3DSWAPEFFECT_FLIPEX;
pp.BackBufferWidth = ClientWidth; pp.BackBufferWidth = ClientWidth;
pp.BackBufferHeight = ClientHeight; pp.BackBufferHeight = ClientHeight;
pp.BackBufferCount = 1; pp.BackBufferCount = 1;
pp.hDeviceWindow = Window; pp.hDeviceWindow = Window;
pp.PresentationInterval = CurrentVSync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; pp.PresentationInterval = CurrentVSync ? D3DPRESENT_INTERVAL_DEFAULT : D3DPRESENT_INTERVAL_IMMEDIATE;
HRESULT result = d3d9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Window, D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, &device); HRESULT result = d3d9->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Window, D3DCREATE_HARDWARE_VERTEXPROCESSING, &pp, nullptr, &device);
if (FAILED(result)) if (FAILED(result))
{ {
I_FatalError("IDirect3D9.CreateDevice failed"); I_FatalError("IDirect3D9.CreateDevice failed");
} }
} }
uint8_t *I_PolyPresentLock(int w, int h, int &pitch) uint8_t *I_PolyPresentLock(int w, int h, bool vsync, int &pitch)
{ {
HRESULT result; HRESULT result;
RECT rect = {}; RECT rect = {};
GetClientRect(Window, &rect); GetClientRect(Window, &rect);
if (rect.right != ClientWidth || rect.bottom != ClientHeight || CurrentVSync != vid_vsync) if (rect.right != ClientWidth || rect.bottom != ClientHeight || CurrentVSync != vsync)
{ {
if (surface) if (surface)
{ {
@ -69,18 +68,18 @@ uint8_t *I_PolyPresentLock(int w, int h, int &pitch)
surface = nullptr; surface = nullptr;
} }
CurrentVSync = vid_vsync; CurrentVSync = vsync;
ClientWidth = rect.right; ClientWidth = rect.right;
ClientHeight = rect.bottom; ClientHeight = rect.bottom;
D3DPRESENT_PARAMETERS pp = {}; D3DPRESENT_PARAMETERS pp = {};
pp.Windowed = true; pp.Windowed = true;
pp.SwapEffect = D3DSWAPEFFECT_DISCARD; pp.SwapEffect = D3DSWAPEFFECT_FLIPEX;
pp.BackBufferWidth = ClientWidth; pp.BackBufferWidth = ClientWidth;
pp.BackBufferHeight = ClientHeight; pp.BackBufferHeight = ClientHeight;
pp.BackBufferCount = 1; pp.BackBufferCount = 1;
pp.hDeviceWindow = Window; pp.hDeviceWindow = Window;
pp.PresentationInterval = CurrentVSync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; pp.PresentationInterval = CurrentVSync ? D3DPRESENT_INTERVAL_DEFAULT : D3DPRESENT_INTERVAL_IMMEDIATE;
device->Reset(&pp); device->Reset(&pp);
} }
@ -173,7 +172,7 @@ void I_PolyPresentUnlock(int x, int y, int width, int height)
result = device->EndScene(); result = device->EndScene();
if (SUCCEEDED(result)) if (SUCCEEDED(result))
device->Present(nullptr, nullptr, 0, nullptr); device->PresentEx(nullptr, nullptr, 0, nullptr, CurrentVSync ? 0 : D3DPRESENT_FORCEIMMEDIATE);
} }
backbuffer->Release(); backbuffer->Release();