Fiddling with interrupt triggering - still not right.
This commit is contained in:
parent
daa8a24173
commit
8337820500
|
@ -20,28 +20,11 @@ using namespace xe::gpu;
|
||||||
using namespace xe::gpu::d3d11;
|
using namespace xe::gpu::d3d11;
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
D3D11GraphicsSystem::D3D11GraphicsSystem(Emulator* emulator)
|
||||||
|
: GraphicsSystem(emulator),
|
||||||
void __stdcall D3D11GraphicsSystemVsyncCallback(
|
window_(nullptr), dxgi_factory_(nullptr), device_(nullptr),
|
||||||
D3D11GraphicsSystem* gs, BOOLEAN) {
|
timer_queue_(nullptr), vsync_timer_(nullptr),
|
||||||
static bool thread_name_set = false;
|
interrupt_pending_(true) {
|
||||||
if (!thread_name_set) {
|
|
||||||
thread_name_set = true;
|
|
||||||
Profiler::ThreadEnter("VsyncTimer");
|
|
||||||
}
|
|
||||||
SCOPE_profile_cpu_f("gpu");
|
|
||||||
|
|
||||||
gs->MarkVblank();
|
|
||||||
gs->DispatchInterruptCallback(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
D3D11GraphicsSystem::D3D11GraphicsSystem(Emulator* emulator) :
|
|
||||||
window_(0), dxgi_factory_(0), device_(0),
|
|
||||||
timer_queue_(NULL), vsync_timer_(NULL),
|
|
||||||
GraphicsSystem(emulator) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D11GraphicsSystem::~D3D11GraphicsSystem() {
|
D3D11GraphicsSystem::~D3D11GraphicsSystem() {
|
||||||
|
@ -57,7 +40,7 @@ void D3D11GraphicsSystem::Initialize() {
|
||||||
CreateTimerQueueTimer(
|
CreateTimerQueueTimer(
|
||||||
&vsync_timer_,
|
&vsync_timer_,
|
||||||
timer_queue_,
|
timer_queue_,
|
||||||
(WAITORTIMERCALLBACK)D3D11GraphicsSystemVsyncCallback,
|
(WAITORTIMERCALLBACK)VsyncCallback,
|
||||||
this,
|
this,
|
||||||
16,
|
16,
|
||||||
16,
|
16,
|
||||||
|
@ -169,6 +152,10 @@ void D3D11GraphicsSystem::Pump() {
|
||||||
window_->Swap();
|
window_->Swap();
|
||||||
|
|
||||||
DispatchInterruptCallback(0);
|
DispatchInterruptCallback(0);
|
||||||
|
interrupt_pending_ = false;
|
||||||
|
} else if (interrupt_pending_) {
|
||||||
|
DispatchInterruptCallback(0);
|
||||||
|
interrupt_pending_ = false;
|
||||||
} else {
|
} else {
|
||||||
double time_since_last_interrupt = xe_pal_now() - last_interrupt_time_;
|
double time_since_last_interrupt = xe_pal_now() - last_interrupt_time_;
|
||||||
if (time_since_last_interrupt > 0.5) {
|
if (time_since_last_interrupt > 0.5) {
|
||||||
|
@ -184,6 +171,24 @@ void D3D11GraphicsSystem::Pump() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __stdcall D3D11GraphicsSystem::VsyncCallback(D3D11GraphicsSystem* gs,
|
||||||
|
BOOLEAN) {
|
||||||
|
static bool thread_name_set = false;
|
||||||
|
if (!thread_name_set) {
|
||||||
|
thread_name_set = true;
|
||||||
|
Profiler::ThreadEnter("VsyncTimer");
|
||||||
|
}
|
||||||
|
SCOPE_profile_cpu_f("gpu");
|
||||||
|
|
||||||
|
gs->MarkVblank();
|
||||||
|
|
||||||
|
// TODO(benvanik): we shouldn't need to do the dispatch here, but there's
|
||||||
|
// something wrong and the CP will block waiting for code that
|
||||||
|
// needs to be run in the interrupt.
|
||||||
|
// gs->interrupt_pending_ = true;
|
||||||
|
gs->DispatchInterruptCallback(0);
|
||||||
|
}
|
||||||
|
|
||||||
void D3D11GraphicsSystem::Shutdown() {
|
void D3D11GraphicsSystem::Shutdown() {
|
||||||
GraphicsSystem::Shutdown();
|
GraphicsSystem::Shutdown();
|
||||||
|
|
||||||
|
|
|
@ -40,12 +40,16 @@ protected:
|
||||||
virtual void Pump();
|
virtual void Pump();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static void __stdcall VsyncCallback(D3D11GraphicsSystem* gs, BOOLEAN);
|
||||||
|
|
||||||
IDXGIFactory1* dxgi_factory_;
|
IDXGIFactory1* dxgi_factory_;
|
||||||
ID3D11Device* device_;
|
ID3D11Device* device_;
|
||||||
D3D11Window* window_;
|
D3D11Window* window_;
|
||||||
|
|
||||||
HANDLE timer_queue_;
|
HANDLE timer_queue_;
|
||||||
HANDLE vsync_timer_;
|
HANDLE vsync_timer_;
|
||||||
|
|
||||||
|
bool interrupt_pending_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue