Better force redraw, better debug overlay

This commit is contained in:
Niellune
2026-03-28 23:24:24 +02:00
parent 74f039e36f
commit 525d8168b6
6 changed files with 50 additions and 24 deletions
+2 -2
View File
@@ -40,8 +40,8 @@ else
endif
release: BUILD_TYPE := release
release: CXXFLAGS := -O2 -ffast-math -march=native -fno-plt -fno-rtti -flto -fdata-sections -ffunction-sections -ffunction-sections -fomit-frame-pointer -fvisibility=hidden -pipe -DNDEBUG
release: LDFLAGS += -O2 -ffast-math -march=native -flto -Wl,-O1 $(PLATFORM_LDFLAGS)
release: CXXFLAGS := -O2 -ffast-math -march=native -fno-plt -fno-rtti -flto=jobserver -fdata-sections -ffunction-sections -ffunction-sections -fomit-frame-pointer -fvisibility=hidden -pipe -DNDEBUG
release: LDFLAGS += -O2 -ffast-math -march=native -flto=jobserver -Wl,-O1 $(PLATFORM_LDFLAGS)
release: TARGET := $(TARGET_NAME)
release: prepare
+1 -3
View File
@@ -110,10 +110,8 @@
# Request extra frames onevery key press. Usefull if you do not see last updates after key press
# Enable for RPI hardware decoding and other systems where hardware decoder tends to buffer frames
# 0 - disabled, enter number of frames to request (find minimal value that get all screen updates)
# Combine with force-redraw-timeout to request not imideately but with delay (also find minimal one)
# 0 - disabled, enter number of frames after which the request is made (find minimal value that get all screen updates)
#force-redraw = 0
#force-redraw-timeout = 0
# Corrects aspect of UI
#aspect-correction = 1
+34 -12
View File
@@ -195,11 +195,18 @@ bool Application::processSystemEvent(const SDL_Event &e)
_active = false;
return true;
}
#ifndef NDEBUG
case SDLK_d:
{
_debug = !_debug;
return true;
}
#endif
case SDLK_r:
{
_state.dirty = true;
_state.requestFrame = 1;
}
}
}
@@ -323,9 +330,11 @@ void Application::loop()
uint32_t frameId = 0;
uint32_t dropframes = 0;
int skipEvents = 0;
#ifndef NDEBUG
Uint32 debugLast = SDL_GetTicks();
int debugSpeed = 0;
int debugLastCount = 0;
#endif
while (_active)
{
bool newFrame = false;
@@ -370,11 +379,11 @@ void Application::loop()
}
}
if (_state.requestFrame > 0 && Settings::forceRedraw > 0 && ++_state.requestFrame - Settings::forceRedrawTimeout > 0)
if (_state.requestFrame > 0 && Settings::forceRedraw > 0 && _state.requestFrame++ % Settings::forceRedraw == 0)
{
log_d("Request screen update");
protocol.send(Message::Control(BTN_SCREEN_REFRESH));
if (_state.requestFrame > Settings::forceRedrawTimeout + Settings::forceRedraw)
if (_state.requestFrame > Settings::forceRedraw*2)
_state.requestFrame = 0;
}
}
@@ -399,6 +408,7 @@ void Application::loop()
}
}
#ifndef NDEBUG
if (_debug)
{
if (SDL_GetTicks() - debugLast >= 1000)
@@ -410,7 +420,7 @@ void Application::loop()
char debugBuffer[2048];
std::snprintf(debugBuffer, sizeof(debugBuffer),
"%s\n"
"FRAME: %u / %u [%d] dropped: %d render: %uus / %uus\n"
"FRAME: %u / %u [%d] dropped: %d render: %dus / %dus\n"
"USB: %s ~%dKB/s\n"
"BUFF: video [%u] audio[main %u aux %u] out [%u]",
status().c_str(),
@@ -428,13 +438,14 @@ void Application::loop()
protocol.writeQueue.count());
interface.debug(debugBuffer);
}
#endif
std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
frameTime = (int32_t)std::chrono::duration_cast<std::chrono::microseconds>(now - frameStart).count();
frameStart = now;
if (_active && !Settings::vsync && !_state.dirty)
{
std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
frameTime = (int32_t)std::chrono::duration_cast<std::chrono::microseconds>(now - frameStart).count();
frameDelay = (frameTarget - frameTime) * ((decoder.buffer.latestId() == frameId) ? 1.0 : 0.9);
frameStart = now;
if (frameDelay > 0)
{
std::this_thread::sleep_for(std::chrono::microseconds(frameDelay));
@@ -463,6 +474,7 @@ const std::string Application::status() const
<< SDL_GetCurrentVideoDriver();
SDL_Window *window = SDL_GetKeyboardFocus();
SDL_RendererInfo cr{};
if (window)
{
int width = 0;
@@ -472,16 +484,26 @@ const std::string Application::status() const
SDL_Renderer *renderer = SDL_GetRenderer(window);
if (renderer)
{
SDL_RendererInfo info{};
if (SDL_GetRendererInfo(renderer, &info) == 0)
if (SDL_GetRendererInfo(renderer, &cr) == 0)
{
out << " " << info.name
<< ((info.flags & SDL_RENDERER_ACCELERATED) != 0 ? " accelerated" : "")
<< ((info.flags & SDL_RENDERER_PRESENTVSYNC) != 0 ? " vsync" : "");
out << ((cr.flags & SDL_RENDERER_ACCELERATED) != 0 ? " accelerated" : "")
<< ((cr.flags & SDL_RENDERER_PRESENTVSYNC) != 0 ? " vsync" : "");
}
}
}
out << " " << SDL_GetCurrentAudioDriver();
out << " audio: " << SDL_GetCurrentAudioDriver();
out << "\nBACKENDS:";
for (int i = 0; i < SDL_GetNumRenderDrivers(); ++i)
{
SDL_RendererInfo info;
SDL_GetRenderDriverInfo(i, &info);
out << " ";
if(cr.name == info.name)
out << "[" << info.name << "]";
else
out << info.name;
}
int displayIndex = SDL_GetWindowDisplayIndex(window);
if (displayIndex >= 0)
+11 -3
View File
@@ -10,7 +10,7 @@ Interface::Interface(SDL_Renderer *renderer)
_state(0),
_debug(false),
_textStatus(font, font_len, Settings::fontSize),
_textDebug(font, font_len, 15),
_textDebug(font, font_len, 16),
_mainImage(background, background_len)
{
}
@@ -34,11 +34,13 @@ bool Interface::render(AVFrame *frame)
(this->*_render)(frame);
SDL_RenderCopy(_renderer, _texture, &_sourceRect, nullptr);
#ifndef NDEBUG
if (_debug)
{
drawDebug();
_debug = false;
}
#endif
SDL_RenderPresent(_renderer);
return true;
@@ -85,7 +87,13 @@ bool Interface::drawHome(bool force, int state, std::string name)
}
if (drawText)
_textStatus.draw(_renderer, (width - _textStatus.width) / 2, height * 0.85 - _textStatus.height);
_textStatus.draw(_renderer, (width - _textStatus.width * Settings::aspectCorrection) / 2, height * 0.85 - _textStatus.height);
if (_debug)
{
drawDebug();
_debug = false;
}
SDL_RenderPresent(_renderer);
return true;
@@ -104,7 +112,7 @@ void Interface::drawDebug()
constexpr int padding = 8;
constexpr int lineSpacing = 2;
const SDL_Color debugColor = {0, 255, 255, 255};
const SDL_Color debugColor = {255, 255, 255, 255};
SDL_BlendMode previousBlendMode;
Uint8 previousR, previousG, previousB, previousA;
SDL_GetRenderDrawBlendMode(_renderer, &previousBlendMode);
+2 -3
View File
@@ -132,10 +132,9 @@ SDL_Rect RendererImage::draw(SDL_Renderer *renderer, int w, int h)
SDL_GetRendererOutputSize(renderer, &width, &height);
}
float scale = 1.0 * h / height;
int imgw = width * scale * Settings::aspectCorrection;
float scale = 1.0 * w / width;
SDL_Rect dst = {w - imgw, 0, imgw, h};
SDL_Rect dst = {0, 0, w, (int)(height*scale)};
SDL_RenderCopy(renderer, _texture, nullptr, &dst);
return dst;
}
-1
View File
@@ -41,7 +41,6 @@ public:
static inline Setting<int> renderingBuffer{"rendering-buffer", 5};
static inline Setting<int> eventsSkip{"draw-skip-events", 3};
static inline Setting<int> forceRedraw{"force-redraw", 0};
static inline Setting<int> forceRedrawTimeout{"force-redraw-timeout", 0};
static inline Setting<float> aspectCorrection{"aspect-correction", 1};
static inline Setting<std::string> renderDriver{"renderer-driver", ""};
static inline Setting<bool> alternativeRendering{"alternative-rendering", false};