From 19b3f8b205f32c86f0ca9a3b69d5c9fb226eec53 Mon Sep 17 00:00:00 2001 From: zeromus Date: Thu, 15 Oct 2015 20:10:58 -0500 Subject: [PATCH] retro shaders no longer need sampler to be named s_p --- .../DisplayManager/Filters/Retro.cs | 2 ++ .../IGL_TK.cs | 2 ++ .../IGL_SlimDX9.cs | 4 +++ Bizware/BizHawk.Bizware.BizwareGL/Pipeline.cs | 9 +++++ .../BizHawk.Bizware.BizwareGL/RetroShader.cs | 34 ++++++++++++++++--- .../BizHawk.Bizware.BizwareGL/UniformInfo.cs | 2 ++ 6 files changed, 49 insertions(+), 4 deletions(-) diff --git a/BizHawk.Client.EmuHawk/DisplayManager/Filters/Retro.cs b/BizHawk.Client.EmuHawk/DisplayManager/Filters/Retro.cs index d2691dc996..a7c2b8903d 100644 --- a/BizHawk.Client.EmuHawk/DisplayManager/Filters/Retro.cs +++ b/BizHawk.Client.EmuHawk/DisplayManager/Filters/Retro.cs @@ -51,6 +51,8 @@ namespace BizHawk.Client.EmuHawk.Filters Shaders[i] = shader; if (!shader.Pipeline.Available) ok = false; + if (!shader.Available) + ok = false; } Available = ok; diff --git a/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/IGL_TK.cs b/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/IGL_TK.cs index 5d2b7914a1..57854e91d2 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/IGL_TK.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/IGL_TK.cs @@ -311,6 +311,8 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.OpenTK if (type == ActiveUniformType.Sampler2D) { + ui.IsSampler = true; + ui.Index = loc; ui.Opaque = loc | (samplers.Count << 24); samplers.Add(loc); } diff --git a/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/IGL_SlimDX9.cs b/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/IGL_SlimDX9.cs index 20fca4c9b0..418e4a1c19 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/IGL_SlimDX9.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/IGL_SlimDX9.cs @@ -476,7 +476,11 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX uw.FS = (ct == fsct); uw.CT = ct; if (descr.Type == ParameterType.Sampler2D) + { + ui.IsSampler = true; + ui.Index = descr.RegisterIndex; uw.SamplerIndex = descr.RegisterIndex; + } uniforms.Add(ui); } } diff --git a/Bizware/BizHawk.Bizware.BizwareGL/Pipeline.cs b/Bizware/BizHawk.Bizware.BizwareGL/Pipeline.cs index efe3716d01..af26834732 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL/Pipeline.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL/Pipeline.cs @@ -69,6 +69,15 @@ namespace BizHawk.Bizware.BizwareGL SpecialWorkingDictionary UniformsDictionary; IDictionary Uniforms { get { return UniformsDictionary; } } + public IEnumerable GetUniforms() { return Uniforms.Values; } + + public PipelineUniform TryGetUniform(string name) + { + PipelineUniform ret = null; + Uniforms.TryGetValue(name,out ret); + return ret; + } + public PipelineUniform this[string key] { get { return UniformsDictionary[key]; } diff --git a/Bizware/BizHawk.Bizware.BizwareGL/RetroShader.cs b/Bizware/BizHawk.Bizware.BizwareGL/RetroShader.cs index 8cee625b14..92fe334844 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL/RetroShader.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL/RetroShader.cs @@ -30,7 +30,33 @@ namespace BizHawk.Bizware.BizwareGL var vs = owner.CreateVertexShader(true, vsSource, "main_vertex", debug); var ps = owner.CreateFragmentShader(true, psSource, "main_fragment", debug); Pipeline = Owner.CreatePipeline(VertexLayout, vs, ps, debug, "retro"); - } + + //retroarch shaders will sometimes not have the right sampler name + //it's unclear whether we should bind to s_p or sampler0 + //lets bind to sampler0 in case we dont have s_p + sampler0 = Pipeline.TryGetUniform("s_p"); + if (sampler0 == null) + { + //sampler wasn't named correctly. this can happen on some retroarch shaders + foreach (var u in Pipeline.GetUniforms()) + { + if (u.Sole.IsSampler && u.Sole.Index == 0) + { + sampler0 = u; + break; + } + } + } + + if (sampler0 == null) + return; + + Available = true; + } + + public bool Available { get; private set; } + + PipelineUniform sampler0; public void Dispose() { @@ -64,9 +90,9 @@ namespace BizHawk.Bizware.BizwareGL mat.Transpose(); Pipeline["modelViewProj"].Set(mat, true); - Owner.SetTextureWrapMode(tex, true); - - Pipeline["s_p"].Set(tex); + Owner.SetTextureWrapMode(tex, true); + + sampler0.Set(tex); Owner.SetViewport(OutputSize); int w = OutputSize.Width; diff --git a/Bizware/BizHawk.Bizware.BizwareGL/UniformInfo.cs b/Bizware/BizHawk.Bizware.BizwareGL/UniformInfo.cs index 80f11604af..3a0f50a955 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL/UniformInfo.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL/UniformInfo.cs @@ -7,5 +7,7 @@ namespace BizHawk.Bizware.BizwareGL { public object Opaque; public string Name; + public int Index; + public bool IsSampler; } } \ No newline at end of file