|
@@ -166,7 +166,7 @@ void obs_display_remove_draw_callback(obs_display_t *display,
|
|
|
pthread_mutex_unlock(&display->draw_callbacks_mutex);
|
|
|
}
|
|
|
|
|
|
-static inline void render_display_begin(struct obs_display *display,
|
|
|
+static inline bool render_display_begin(struct obs_display *display,
|
|
|
uint32_t cx, uint32_t cy,
|
|
|
bool update_color_space)
|
|
|
{
|
|
@@ -182,23 +182,29 @@ static inline void render_display_begin(struct obs_display *display,
|
|
|
gs_update_color_space();
|
|
|
}
|
|
|
|
|
|
- gs_begin_scene();
|
|
|
+ const bool success = gs_is_present_ready();
|
|
|
+ if (success) {
|
|
|
+ gs_begin_scene();
|
|
|
|
|
|
- if (gs_get_color_space() == GS_CS_SRGB)
|
|
|
- vec4_from_rgba(&clear_color, display->background_color);
|
|
|
- else
|
|
|
- vec4_from_rgba_srgb(&clear_color, display->background_color);
|
|
|
- clear_color.w = 1.0f;
|
|
|
+ if (gs_get_color_space() == GS_CS_SRGB)
|
|
|
+ vec4_from_rgba(&clear_color, display->background_color);
|
|
|
+ else
|
|
|
+ vec4_from_rgba_srgb(&clear_color,
|
|
|
+ display->background_color);
|
|
|
+ clear_color.w = 1.0f;
|
|
|
|
|
|
- gs_clear(GS_CLEAR_COLOR | GS_CLEAR_DEPTH | GS_CLEAR_STENCIL,
|
|
|
- &clear_color, 1.0f, 0);
|
|
|
+ gs_clear(GS_CLEAR_COLOR | GS_CLEAR_DEPTH | GS_CLEAR_STENCIL,
|
|
|
+ &clear_color, 1.0f, 0);
|
|
|
|
|
|
- gs_enable_depth_test(false);
|
|
|
- /* gs_enable_blending(false); */
|
|
|
- gs_set_cull_mode(GS_NEITHER);
|
|
|
+ gs_enable_depth_test(false);
|
|
|
+ /* gs_enable_blending(false); */
|
|
|
+ gs_set_cull_mode(GS_NEITHER);
|
|
|
|
|
|
- gs_ortho(0.0f, (float)cx, 0.0f, (float)cy, -100.0f, 100.0f);
|
|
|
- gs_set_viewport(0, 0, cx, cy);
|
|
|
+ gs_ortho(0.0f, (float)cx, 0.0f, (float)cy, -100.0f, 100.0f);
|
|
|
+ gs_set_viewport(0, 0, cx, cy);
|
|
|
+ }
|
|
|
+
|
|
|
+ return success;
|
|
|
}
|
|
|
|
|
|
static inline void render_display_end()
|
|
@@ -230,24 +236,24 @@ void render_display(struct obs_display *display)
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
|
- render_display_begin(display, cx, cy, update_color_space);
|
|
|
-
|
|
|
- pthread_mutex_lock(&display->draw_callbacks_mutex);
|
|
|
+ if (render_display_begin(display, cx, cy, update_color_space)) {
|
|
|
+ pthread_mutex_lock(&display->draw_callbacks_mutex);
|
|
|
|
|
|
- for (size_t i = 0; i < display->draw_callbacks.num; i++) {
|
|
|
- struct draw_callback *callback;
|
|
|
- callback = display->draw_callbacks.array + i;
|
|
|
+ for (size_t i = 0; i < display->draw_callbacks.num; i++) {
|
|
|
+ struct draw_callback *callback;
|
|
|
+ callback = display->draw_callbacks.array + i;
|
|
|
|
|
|
- callback->draw(callback->param, cx, cy);
|
|
|
- }
|
|
|
+ callback->draw(callback->param, cx, cy);
|
|
|
+ }
|
|
|
|
|
|
- pthread_mutex_unlock(&display->draw_callbacks_mutex);
|
|
|
+ pthread_mutex_unlock(&display->draw_callbacks_mutex);
|
|
|
|
|
|
- render_display_end();
|
|
|
+ render_display_end();
|
|
|
|
|
|
- GS_DEBUG_MARKER_END();
|
|
|
+ GS_DEBUG_MARKER_END();
|
|
|
|
|
|
- gs_present();
|
|
|
+ gs_present();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void obs_display_set_enabled(obs_display_t *display, bool enable)
|