#pragma once
#include <string>
#include "Common/Log.h"
#include "Common/GPU/thin3d.h"
#include "Common/TimeUtil.h"
class GraphicsContext {
public:
virtual ~GraphicsContext() = default;
virtual bool InitFromRenderThread(std::string *errorMessage) { return true; }
virtual void ShutdownFromRenderThread() {}
virtual void Shutdown() = 0;
virtual void Pause() {}
virtual void Resume() {}
virtual void Resize() = 0;
virtual void NotifyWindowRestored() {}
virtual void *GetAPIContext() { return nullptr; }
virtual void ThreadStart() {}
virtual bool ThreadFrame(bool waitIfEmpty) { return true; }
virtual void ThreadEnd() {}
virtual void Poll() {}
virtual Draw::DrawContext *GetDrawContext() = 0;
void ThreadFrameUntilCondition(std::function<bool()> conditionStopped) {
bool exitOnEmpty = false;
INFO_LOG(Log::System, "Executing graphicsContext->ThreadFrame to clear buffers");
while (true) {
if (!exitOnEmpty && conditionStopped()) {
INFO_LOG(Log::System, "Found out that the thread is done.");
exitOnEmpty = true;
}
bool retval = ThreadFrame(false);
if (!retval && exitOnEmpty) {
INFO_LOG(Log::System, "ThreadFrame returned false and emu thread is done, breaking.");
break;
} else {
sleep_ms(5, "exit poll");
}
}
}
};