libobs: Use 'can_bypass' func for filter bypassing

There are a few more conditions which need to be checked to ensure
whether we can actually bypass or not; in this particular case we are
using the YUV texture shaders, plus the image can also be flipped, so we
can't really use the bypass optimization in those situations.
master
jp9000 2015-02-26 17:47:10 -08:00
parent b9eef3c4f2
commit dfde8d4a63
1 changed files with 12 additions and 4 deletions

View File

@ -2005,6 +2005,16 @@ static inline void render_filter_tex(gs_texture_t *tex, gs_effect_t *effect,
gs_technique_end(tech);
}
static inline bool can_bypass(obs_source_t *target, obs_source_t *parent,
uint32_t parent_flags,
enum obs_allow_direct_render allow_direct)
{
return (target == parent) &&
(allow_direct == OBS_ALLOW_DIRECT_RENDERING) &&
((parent_flags & OBS_SOURCE_CUSTOM_DRAW) == 0) &&
((parent_flags & OBS_SOURCE_ASYNC) == 0);
}
void obs_source_process_filter(obs_source_t *filter, gs_effect_t *effect,
uint32_t width, uint32_t height, enum gs_color_format format,
enum obs_allow_direct_render allow_direct)
@ -2012,7 +2022,7 @@ void obs_source_process_filter(obs_source_t *filter, gs_effect_t *effect,
obs_source_t *target, *parent;
uint32_t target_flags, parent_flags;
int cx, cy;
bool use_matrix, expects_def, can_directly;
bool use_matrix;
if (!filter) return;
@ -2023,14 +2033,12 @@ void obs_source_process_filter(obs_source_t *filter, gs_effect_t *effect,
cx = get_base_width(target);
cy = get_base_height(target);
use_matrix = !!(target_flags & OBS_SOURCE_COLOR_MATRIX);
expects_def = !(parent_flags & OBS_SOURCE_CUSTOM_DRAW);
can_directly = allow_direct == OBS_ALLOW_DIRECT_RENDERING;
/* if the parent does not use any custom effects, and this is the last
* filter in the chain for the parent, then render the parent directly
* using the filter effect instead of rendering to texture to reduce
* the total number of passes */
if (can_directly && expects_def && target == parent) {
if (can_bypass(target, parent, parent_flags, allow_direct)) {
render_filter_bypass(target, effect, use_matrix);
return;
}