Dispatch interrupt outside of main pump.
This commit is contained in:
parent
562c86f76d
commit
a63db2b7fd
|
@ -21,11 +21,16 @@ using namespace xe::gpu::d3d11;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
void __stdcall D3D11GraphicsSystemVsyncCallback(D3D11GraphicsSystem* gs, BOOLEAN) {
|
||||||
|
gs->DispatchInterruptCallback();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
D3D11GraphicsSystem::D3D11GraphicsSystem(const CreationParams* params) :
|
D3D11GraphicsSystem::D3D11GraphicsSystem(const CreationParams* params) :
|
||||||
window_(0), dxgi_factory_(0), device_(0),
|
window_(0), dxgi_factory_(0), device_(0),
|
||||||
|
timer_queue_(NULL), vsync_timer_(NULL),
|
||||||
GraphicsSystem(params) {
|
GraphicsSystem(params) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,6 +43,19 @@ D3D11GraphicsSystem::~D3D11GraphicsSystem() {
|
||||||
void D3D11GraphicsSystem::Initialize() {
|
void D3D11GraphicsSystem::Initialize() {
|
||||||
GraphicsSystem::Initialize();
|
GraphicsSystem::Initialize();
|
||||||
|
|
||||||
|
XEASSERTNULL(timer_queue_);
|
||||||
|
XEASSERTNULL(vsync_timer_);
|
||||||
|
|
||||||
|
timer_queue_ = CreateTimerQueue();
|
||||||
|
CreateTimerQueueTimer(
|
||||||
|
&vsync_timer_,
|
||||||
|
timer_queue_,
|
||||||
|
(WAITORTIMERCALLBACK)D3D11GraphicsSystemVsyncCallback,
|
||||||
|
this,
|
||||||
|
16,
|
||||||
|
100,
|
||||||
|
WT_EXECUTEINTIMERTHREAD);
|
||||||
|
|
||||||
// Create DXGI factory so we can get a swap chain/etc.
|
// Create DXGI factory so we can get a swap chain/etc.
|
||||||
HRESULT hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1),
|
HRESULT hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1),
|
||||||
(void**)&dxgi_factory_);
|
(void**)&dxgi_factory_);
|
||||||
|
@ -127,9 +145,6 @@ void D3D11GraphicsSystem::Pump() {
|
||||||
// Swap window.
|
// Swap window.
|
||||||
// If we are set to vsync this will block.
|
// If we are set to vsync this will block.
|
||||||
window_->Swap();
|
window_->Swap();
|
||||||
|
|
||||||
// Dispatch interrupt callback to let the game know it can keep drawing.
|
|
||||||
DispatchInterruptCallback();
|
|
||||||
} else {
|
} else {
|
||||||
// If we have gone too long without an interrupt, fire one.
|
// If we have gone too long without an interrupt, fire one.
|
||||||
if (xe_pal_now() - last_interrupt_time_ > 16 / 1000.0) {
|
if (xe_pal_now() - last_interrupt_time_ > 16 / 1000.0) {
|
||||||
|
@ -139,5 +154,14 @@ void D3D11GraphicsSystem::Pump() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void D3D11GraphicsSystem::Shutdown() {
|
void D3D11GraphicsSystem::Shutdown() {
|
||||||
|
if (vsync_timer_) {
|
||||||
|
DeleteTimerQueueTimer(timer_queue_, vsync_timer_, NULL);
|
||||||
|
}
|
||||||
|
if (timer_queue_) {
|
||||||
|
DeleteTimerQueueEx(timer_queue_, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(benvanik): release D3D stuff here?
|
||||||
|
|
||||||
GraphicsSystem::Shutdown();
|
GraphicsSystem::Shutdown();
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,9 @@ private:
|
||||||
IDXGIFactory1* dxgi_factory_;
|
IDXGIFactory1* dxgi_factory_;
|
||||||
ID3D11Device* device_;
|
ID3D11Device* device_;
|
||||||
D3D11Window* window_;
|
D3D11Window* window_;
|
||||||
|
|
||||||
|
HANDLE timer_queue_;
|
||||||
|
HANDLE vsync_timer_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -391,8 +391,25 @@ SHIM_CALL VdRetrainEDRAM_shim(
|
||||||
|
|
||||||
SHIM_CALL VdSwap_shim(
|
SHIM_CALL VdSwap_shim(
|
||||||
xe_ppc_state_t* ppc_state, KernelState* state) {
|
xe_ppc_state_t* ppc_state, KernelState* state) {
|
||||||
|
uint32_t unk0 = SHIM_GET_ARG_32(0);
|
||||||
|
uint32_t unk1 = SHIM_GET_ARG_32(1);
|
||||||
|
uint32_t unk2 = SHIM_GET_ARG_32(2);
|
||||||
|
uint32_t unk3 = SHIM_GET_ARG_32(3);
|
||||||
|
uint32_t unk4 = SHIM_GET_ARG_32(4);
|
||||||
|
uint32_t unk5 = SHIM_GET_ARG_32(5);
|
||||||
|
uint32_t unk6 = SHIM_GET_ARG_32(6);
|
||||||
|
uint32_t unk7 = SHIM_GET_ARG_32(7);
|
||||||
|
|
||||||
XELOGD(
|
XELOGD(
|
||||||
"VdSwap(?)");
|
"VdSwap(%.8X, %.8X, %.8X, %.8X, %.8X, %.8X, %.8X, %.8X)",
|
||||||
|
unk0,
|
||||||
|
unk1,
|
||||||
|
unk2,
|
||||||
|
unk3,
|
||||||
|
unk4,
|
||||||
|
unk5,
|
||||||
|
unk6,
|
||||||
|
unk7);
|
||||||
|
|
||||||
KernelState* kernel_state = shared_kernel_state_;
|
KernelState* kernel_state = shared_kernel_state_;
|
||||||
XEASSERTNOTNULL(kernel_state);
|
XEASSERTNOTNULL(kernel_state);
|
||||||
|
|
Loading…
Reference in New Issue