Browse Source

mac-syphon: Use opaque effect on non-OpenGL renderer

"DrawOpaque" only exists in the default_rect effect, in the normal cases
it's just "Draw" in the opaque default shader.
Sebastian Beckmann 2 months ago
parent
commit
5984faefe4
1 changed files with 17 additions and 7 deletions
  1. 17 7
      plugins/mac-syphon/syphon.m

+ 17 - 7
plugins/mac-syphon/syphon.m

@@ -15,7 +15,8 @@ struct syphon {
     IOSurfaceRef ref;
     IOSurfaceRef ref;
 
 
     gs_samplerstate_t *sampler;
     gs_samplerstate_t *sampler;
-    gs_effect_t *effect;
+    gs_effect_t *effect_default;
+    gs_effect_t *effect_opaque;
     gs_vertbuffer_t *vertbuffer;
     gs_vertbuffer_t *vertbuffer;
     gs_texture_t *tex;
     gs_texture_t *tex;
     uint32_t width, height;
     uint32_t width, height;
@@ -314,13 +315,15 @@ static inline bool init_obs_graphics_objects(syphon_t s)
     s->vertbuffer = create_vertbuffer();
     s->vertbuffer = create_vertbuffer();
 
 
     if (gs_get_device_type() == GS_DEVICE_OPENGL) {
     if (gs_get_device_type() == GS_DEVICE_OPENGL) {
-        s->effect = obs_get_base_effect(OBS_EFFECT_DEFAULT_RECT);
+        s->effect_default = obs_get_base_effect(OBS_EFFECT_DEFAULT_RECT);
+        s->effect_opaque = NULL;
     } else {
     } else {
-        s->effect = obs_get_base_effect(OBS_EFFECT_DEFAULT);
+        s->effect_default = obs_get_base_effect(OBS_EFFECT_DEFAULT);
+        s->effect_opaque = obs_get_base_effect(OBS_EFFECT_OPAQUE);
     }
     }
     obs_leave_graphics();
     obs_leave_graphics();
 
 
-    return s->sampler != NULL && s->vertbuffer != NULL && s->effect != NULL;
+    return s->sampler != NULL && s->vertbuffer != NULL && s->effect_default != NULL;
 }
 }
 
 
 static inline bool create_syphon_listeners(syphon_t s)
 static inline bool create_syphon_listeners(syphon_t s)
@@ -647,9 +650,16 @@ static void syphon_video_render(void *data, gs_effect_t *effect)
     gs_load_vertexbuffer(s->vertbuffer);
     gs_load_vertexbuffer(s->vertbuffer);
     gs_load_indexbuffer(NULL);
     gs_load_indexbuffer(NULL);
     gs_load_samplerstate(s->sampler, 0);
     gs_load_samplerstate(s->sampler, 0);
-    const char *tech_name = s->allow_transparency ? "Draw" : "DrawOpaque";
-    gs_technique_t *tech = gs_effect_get_technique(s->effect, tech_name);
-    gs_effect_set_texture(gs_effect_get_param_by_name(s->effect, "image"), s->tex);
+    gs_technique_t *tech;
+    if (gs_get_device_type() == GS_DEVICE_OPENGL) {
+        const char *tech_name = s->allow_transparency ? "Draw" : "DrawOpaque";
+        tech = gs_effect_get_technique(s->effect_default, tech_name);
+        gs_effect_set_texture(gs_effect_get_param_by_name(s->effect_default, "image"), s->tex);
+    } else {
+        gs_effect_t *draw_effect = s->allow_transparency ? s->effect_default : s->effect_opaque;
+        tech = gs_effect_get_technique(draw_effect, "Draw");
+        gs_effect_set_texture(gs_effect_get_param_by_name(draw_effect, "image"), s->tex);
+    }
     gs_technique_begin(tech);
     gs_technique_begin(tech);
     gs_technique_begin_pass(tech, 0);
     gs_technique_begin_pass(tech, 0);