Merge pull request #20894 from hrydgard/small-gfx-refactor

Remove unused "interval" concept from presentation mode
This commit is contained in:
Henrik Rydgård
2025-10-19 18:52:50 +02:00
committed by GitHub
12 changed files with 23 additions and 29 deletions
+3 -3
View File
@@ -160,7 +160,7 @@ public:
void BeginFrame(DebugFlags debugFlags) override;
void EndFrame() override;
void Present(PresentMode presentMode, int vblanks) override;
void Present(PresentMode presentMode) override;
int GetFrameCount() override { return frameCount_; }
@@ -478,12 +478,12 @@ void D3D11DrawContext::EndFrame() {
curPipeline_ = nullptr;
}
void D3D11DrawContext::Present(PresentMode presentMode, int vblanks) {
void D3D11DrawContext::Present(PresentMode presentMode) {
frameTimeHistory_[frameCount_].queuePresent = time_now_d();
// Safety for libretro
if (swapChain_) {
uint32_t interval = vblanks;
uint32_t interval = 1;
uint32_t flags = 0;
if (presentMode != PresentMode::FIFO) {
interval = 0;
+2 -2
View File
@@ -367,7 +367,7 @@ public:
void BeginFrame(DebugFlags debugFlags) override;
void EndFrame() override;
void Present(PresentMode mode, int vblanks) override;
void Present(PresentMode mode) override;
int GetFrameCount() override {
return frameCount_;
@@ -811,7 +811,7 @@ void OpenGLContext::EndFrame() {
Invalidate(InvalidationFlags::CACHED_RENDER_STATE);
}
void OpenGLContext::Present(PresentMode presentMode, int vblanks) {
void OpenGLContext::Present(PresentMode presentMode) {
renderManager_.Present();
frameCount_++;
}
+2 -5
View File
@@ -503,7 +503,7 @@ public:
void BeginFrame(DebugFlags debugFlags) override;
void EndFrame() override;
void Present(PresentMode presentMode, int vblanks) override;
void Present(PresentMode presentMode) override;
int GetFrameCount() override {
return frameCount_;
@@ -1141,10 +1141,7 @@ void VKContext::EndFrame() {
Invalidate(InvalidationFlags::CACHED_RENDER_STATE);
}
void VKContext::Present(PresentMode presentMode, int vblanks) {
if (presentMode == PresentMode::FIFO) {
_dbg_assert_(vblanks == 0 || vblanks == 1);
}
void VKContext::Present(PresentMode presentMode) {
renderManager_.Present();
frameCount_++;
}
+1 -1
View File
@@ -261,7 +261,7 @@ static const std::vector<ShaderSource> fsCol = {
"float4 main(PS_INPUT input) : SV_Target {\n"
" float4 col = input.color;\n"
" col.rgb *= input.color.a;\n"
" return input.color;\n"
" return col;\n"
"}\n"
},
{ ShaderLanguage::GLSL_VULKAN,
+6 -3
View File
@@ -587,6 +587,10 @@ enum class PresentMode {
};
ENUM_CLASS_BITOPS(PresentMode);
inline bool PresentationModeBlocks(PresentMode mode) {
return mode & (PresentMode::FIFO | PresentMode::FIFO_RELAXED | PresentMode::FIFO_LATEST_READY);
}
struct DeviceCaps {
GPUVendor vendor;
uint32_t deviceID; // use caution!
@@ -856,9 +860,8 @@ public:
virtual void BeginFrame(DebugFlags debugFlags) = 0;
virtual void EndFrame() = 0;
// vblanks is only relevant in FIFO present mode.
// NOTE: Not all backends support vblanks > 1. Some backends also can't change presentation mode immediately.
virtual void Present(PresentMode presentMode, int vblanks) = 0;
// Some backends also can't change presentation mode immediately.
virtual void Present(PresentMode presentMode) = 0;
// This should be avoided as much as possible, in favor of clearing when binding a render target, which is native
// on Vulkan.
+1 -4
View File
@@ -67,10 +67,8 @@ inline Draw::PresentMode GetBestImmediateMode(Draw::PresentMode supportedModes)
void FrameTiming::Reset(Draw::DrawContext *draw) {
if (g_Config.bVSync || !(draw->GetDeviceCaps().presentModesSupported & (Draw::PresentMode::MAILBOX | Draw::PresentMode::IMMEDIATE))) {
presentMode = Draw::PresentMode::FIFO;
presentInterval = 1;
} else {
presentMode = GetBestImmediateMode(draw->GetDeviceCaps().presentModesSupported);
presentInterval = 0;
}
}
@@ -91,7 +89,7 @@ void FrameTiming::PostSubmit() {
}
}
Draw::PresentMode ComputePresentMode(Draw::DrawContext *draw, int *interval) {
Draw::PresentMode ComputePresentMode(Draw::DrawContext *draw) {
_assert_(draw);
Draw::PresentMode mode = Draw::PresentMode::FIFO;
@@ -140,6 +138,5 @@ Draw::PresentMode ComputePresentMode(Draw::DrawContext *draw, int *interval) {
}
}
*interval = (mode == Draw::PresentMode::FIFO) ? 1 : 0;
return mode;
}
+1 -2
View File
@@ -16,7 +16,6 @@ public:
// Some backends won't allow changing this willy nilly.
Draw::PresentMode presentMode;
int presentInterval;
private:
double waitUntil_;
@@ -25,6 +24,6 @@ private:
extern FrameTiming g_frameTiming;
Draw::PresentMode ComputePresentMode(Draw::DrawContext *draw, int *interval);
Draw::PresentMode ComputePresentMode(Draw::DrawContext *draw);
void WaitUntil(double now, double timestamp, const char *reason);
+1 -2
View File
@@ -584,7 +584,7 @@ void __DisplayFlip(int cyclesLate) {
Draw::DrawContext *draw = gpu->GetDrawContext();
if (draw) {
g_frameTiming.presentMode = ComputePresentMode(draw, &g_frameTiming.presentInterval);
g_frameTiming.presentMode = ComputePresentMode(draw);
if (!draw->GetDeviceCaps().presentInstantModeChange && g_frameTiming.presentMode == Draw::PresentMode::FIFO) {
// Some backends can't just flip into MAILBOX/IMMEDIATE mode instantly.
// Vulkan doesn't support the interval setting, so we force skipping the flip.
@@ -594,7 +594,6 @@ void __DisplayFlip(int cyclesLate) {
} else {
// Surely can never get here?
g_frameTiming.presentMode = Draw::PresentMode::FIFO;
g_frameTiming.presentInterval = 1;
}
if (!g_Config.bSkipBufferEffects) {
+1
View File
@@ -3098,6 +3098,7 @@ bool GetOutputFramebuffer(Draw::DrawContext *draw, GPUDebugBuffer &buffer) {
draw->GetFramebufferDimensions(nullptr, &w, &h);
Draw::DataFormat fmt = draw->PreferredFramebufferReadbackFormat(nullptr);
// Ignore preferred formats other than BGRA.
_dbg_assert_(fmt == Draw::DataFormat::B8G8R8A8_UNORM || fmt == Draw::DataFormat::R8G8B8A8_UNORM);
if (fmt != Draw::DataFormat::B8G8R8A8_UNORM)
fmt = Draw::DataFormat::R8G8B8A8_UNORM;
+2 -3
View File
@@ -138,9 +138,8 @@ static void DrawFrameTiming(UIContext *ctx, const Bounds &bounds) {
// NOTE: This is not necessarily the same as the actual present mode.
snprintf(statBuf, sizeof(statBuf),
"Timing mode (interval): %s (%d)",
Draw::PresentModeToString(g_frameTiming.presentMode),
g_frameTiming.presentInterval);
"Timing mode (interval): %s",
Draw::PresentModeToString(g_frameTiming.presentMode));
ctx->Draw()->DrawTextRect(ubuntu24, statBuf, bounds.x + 10, bounds.y + 50, bounds.w - 20, bounds.h - 30, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII);
+2 -3
View File
@@ -1206,9 +1206,8 @@ void NativeFrame(GraphicsContext *graphicsContext) {
ClearFailedGPUBackends();
}
int interval;
Draw::PresentMode presentMode = ComputePresentMode(g_draw, &interval);
g_draw->Present(presentMode, interval);
Draw::PresentMode presentMode = ComputePresentMode(g_draw);
g_draw->Present(presentMode);
if (resized) {
INFO_LOG(Log::G3D, "Resized flag set - recalculating bounds");
+1 -1
View File
@@ -1388,7 +1388,7 @@ namespace Libretro
if (ctx->GetDrawContext()) {
ctx->GetDrawContext()->EndFrame();
ctx->GetDrawContext()->Present(Draw::PresentMode::FIFO, 1);
ctx->GetDrawContext()->Present(Draw::PresentMode::FIFO);
}
}