Skip to content

Commit

Permalink
test if renderer re-initialization is really necessary
Browse files Browse the repository at this point in the history
  • Loading branch information
lpkruger committed Oct 15, 2019
1 parent 6b64d92 commit dd9473f
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 4 deletions.
6 changes: 4 additions & 2 deletions app/src/scrcpy.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,10 @@ handle_event(SDL_Event *event, bool control) {
switch (event->window.event) {
case SDL_WINDOWEVENT_SIZE_CHANGED:
#ifdef HIDPI_SUPPORT
LOGD("Reinitializing renderer");
screen_init_renderer_and_texture(&screen);
if (!screen_test_correct_hidpi_ratio(&screen)) {
LOGW("Reinitializing renderer due to incorrect hidpi ratio");
screen_init_renderer_and_texture(&screen);
}
#endif
// fall-through no break
case SDL_WINDOWEVENT_EXPOSED:
Expand Down
28 changes: 26 additions & 2 deletions app/src/screen.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,10 @@ set_window_size(struct screen *screen, struct size new_size) {
} else {
SDL_SetWindowSize(screen->window, new_size.width, new_size.height);
#ifdef HIDPI_SUPPORT
screen_init_renderer_and_texture(screen);
if (!screen_test_correct_hidpi_ratio(screen)) {
LOGW("Reinitializing renderer due to incorrect hidpi ratio");
screen_init_renderer_and_texture(screen);
}
#endif
}
}
Expand Down Expand Up @@ -211,8 +214,29 @@ screen_init_rendering(struct screen *screen, const char *window_title,

LOGI("Initial texture: %" PRIu16 "x%" PRIu16, frame_size.width,
frame_size.height);
return screen_init_renderer_and_texture(screen);
int ret = screen_init_renderer_and_texture(screen);
#ifdef HIDPI_SUPPORT
int window_w, window_h, renderer_w, renderer_h;
SDL_GetWindowSize(screen->window, &window_w, &window_h);
SDL_GetRendererOutputSize(screen->renderer, &renderer_w, &renderer_h);
screen->expected_hidpi_w_factor = renderer_w * 1000 / window_w;
screen->expected_hidpi_h_factor = renderer_h * 1000 / window_h;
#endif
return ret;
}

#ifdef HIDPI_SUPPORT
bool
screen_test_correct_hidpi_ratio(struct screen *screen) {
int window_w, window_h, renderer_w, renderer_h;
SDL_GetWindowSize(screen->window, &window_w, &window_h);
SDL_GetRendererOutputSize(screen->renderer, &renderer_w, &renderer_h);
int current_hidpi_w_factor = renderer_w * 1000 / window_w;
int current_hidpi_h_factor = renderer_h * 1000 / window_h;
return current_hidpi_w_factor == screen->expected_hidpi_w_factor &&
current_hidpi_h_factor == screen->expected_hidpi_h_factor;
}
#endif

void
screen_show_window(struct screen *screen) {
Expand Down
13 changes: 13 additions & 0 deletions app/src/screen.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ struct screen {
bool has_frame;
bool fullscreen;
bool no_window;
#ifdef HIDPI_SUPPORT
int expected_hidpi_w_factor; // multiplied by 1000 to avoid float
int expected_hidpi_h_factor; // multiplied by 1000 to avoid float
#endif
};

#define SCREEN_INITIALIZER { \
Expand Down Expand Up @@ -48,6 +52,15 @@ bool
screen_init_rendering(struct screen *screen, const char *window_title,
struct size frame_size, bool always_on_top);

#ifdef HIDPI_SUPPORT
// test if the expected renderer to window ratio is correct
// used to work around SDL bugs
// returns true if correct.
// If it returns false the renderer state needs to be fixed
bool
screen_test_correct_hidpi_ratio(struct screen *screen);
#endif

// reinitialize the renderer (only used in some configurations
// if necessary to workaround SDL bugs)
bool
Expand Down

0 comments on commit dd9473f

Please sign in to comment.