From 310f390e1ef5259ad73acdc5e8f44d360d842748 Mon Sep 17 00:00:00 2001 From: John Bradley Date: Fri, 22 May 2015 13:01:00 -0500 Subject: [PATCH] libobs: Allow filters to specify technique --- libobs/obs-source.c | 38 ++++++++++++++++++++++++++++++++------ libobs/obs.h | 11 +++++++++++ 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 08a6d00ed..1845cc328 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -2592,9 +2592,9 @@ const char *obs_source_get_id(const obs_source_t *source) } static inline void render_filter_bypass(obs_source_t *target, - gs_effect_t *effect) + gs_effect_t *effect, const char *tech_name) { - gs_technique_t *tech = gs_effect_get_technique(effect, "Draw"); + gs_technique_t *tech = gs_effect_get_technique(effect, tech_name); size_t passes, i; passes = gs_technique_begin(tech); @@ -2607,9 +2607,9 @@ static inline void render_filter_bypass(obs_source_t *target, } static inline void render_filter_tex(gs_texture_t *tex, gs_effect_t *effect, - uint32_t width, uint32_t height) + uint32_t width, uint32_t height, const char *tech_name) { - gs_technique_t *tech = gs_effect_get_technique(effect, "Draw"); + gs_technique_t *tech = gs_effect_get_technique(effect, tech_name); gs_eparam_t *image = gs_effect_get_param_by_name(effect, "image"); size_t passes, i; @@ -2694,6 +2694,31 @@ void obs_source_process_filter_begin(obs_source_t *filter, gs_blend_state_pop(); } +void obs_source_process_filter_tech_end(obs_source_t *filter, gs_effect_t *effect, + uint32_t width, uint32_t height, const char *tech_name) +{ + obs_source_t *target, *parent; + gs_texture_t *texture; + uint32_t target_flags, parent_flags; + + if (!filter) return; + + target = obs_filter_get_target(filter); + parent = obs_filter_get_parent(filter); + target_flags = target->info.output_flags; + parent_flags = parent->info.output_flags; + + const char *tech = tech_name ? tech_name : "Draw"; + + if (can_bypass(target, parent, parent_flags, filter->allow_direct)) { + render_filter_bypass(target, effect, tech); + } else { + texture = gs_texrender_get_texture(filter->filter_texrender); + render_filter_tex(texture, effect, width, height, tech); + } +} + + void obs_source_process_filter_end(obs_source_t *filter, gs_effect_t *effect, uint32_t width, uint32_t height) { @@ -2710,11 +2735,12 @@ void obs_source_process_filter_end(obs_source_t *filter, gs_effect_t *effect, parent_flags = parent->info.output_flags; if (can_bypass(target, parent, parent_flags, filter->allow_direct)) { - render_filter_bypass(target, effect); + render_filter_bypass(target, effect, "Draw"); } else { texture = gs_texrender_get_texture(filter->filter_texrender); if (texture) - render_filter_tex(texture, effect, width, height); + render_filter_tex(texture, effect, width, height, + "Draw"); } } diff --git a/libobs/obs.h b/libobs/obs.h index 47d7b4f30..7b7a8e03c 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -954,6 +954,17 @@ EXPORT void obs_source_process_filter_begin(obs_source_t *filter, EXPORT void obs_source_process_filter_end(obs_source_t *filter, gs_effect_t *effect, uint32_t width, uint32_t height); +/** + * Draws the filter with a specific technique. + * + * Before calling this function, first call obs_source_process_filter_begin and + * then set the effect parameters, and then call this function to finalize the + * filter. + */ +EXPORT void obs_source_process_filter_tech_end(obs_source_t *filter, + gs_effect_t *effect, uint32_t width, uint32_t height, + const char *tech_name); + /** Skips the filter if the filter is invalid and cannot be rendered */ EXPORT void obs_source_skip_video_filter(obs_source_t *filter);