예제 #1
0
            public override ITextureFilter ScaleChroma(ICompositionFilter composition)
            {
                var lumaSize   = composition.Luma.Size();
                var chromaSize = composition.Chroma.Size();
                var targetSize = composition.TargetSize;

                float[] yuvConsts    = Renderer.Colorimetric.GetYuvConsts();
                var     chromaOffset = composition.ChromaOffset;

                // Fall back to default when downscaling is needed
                if ((chromaSize > targetSize).Any || chromaSize == targetSize)
                {
                    return(composition);
                }

                Vector2 adjointOffset = -(chromaOffset * lumaSize) / chromaSize;

                var crossBilateral = new Shader(FromFile((Mode == BilateralMode.Legacy) ? "CrossBilateral.hlsl" : "KrigBilateral.hlsl"));

                crossBilateral["chromaParams"] = new Vector4(chromaOffset.X, chromaOffset.Y, yuvConsts[0], yuvConsts[1]);
                crossBilateral["power"]        = Strength;

                var resizedLuma = composition.Luma.SetSize(composition.TargetSize, tagged: true);
                var lowresYuv   = DownscaleLuma(composition.Luma, composition.Chroma, chromaSize, adjointOffset);

                return(crossBilateral.ApplyTo(resizedLuma, lowresYuv).ConvertToRgb());
            }
            public ITextureFilter ScaleChroma(ICompositionFilter composition)
            {
                var chromaSize = composition.Chroma.Size();
                var targetSize = composition.TargetSize;

                // Fall back to default when downscaling is needed
                if (targetSize.Width < chromaSize.Width || targetSize.Height < chromaSize.Height)
                {
                    return(composition);
                }

                CreateWeights(chromaSize, targetSize);

                var offset = composition.ChromaOffset + new Vector2(0.5f, 0.5f);
                int lobes  = TapCount.ToInt() / 2;
                var shader = new Shader(FromFile("EwaScaler.hlsl",
                                                 compilerOptions:
                                                 string.Format("LOBES = {0}; AR = {1}; CHROMA = 1;", lobes, AntiRingingEnabled ? 1 : 0)))
                {
                    Transform      = size => targetSize,
                    Arguments      = new[] { AntiRingingStrength, offset.X, offset.Y },
                    LinearSampling = true
                };

                var resizedLuma = composition.Luma.SetSize(targetSize, tagged: true);

                return(GetEwaFilter(shader, new[] { resizedLuma, composition.Chroma }).ConvertToRgb());
            }
예제 #3
0
            public override ITextureFilter ScaleChroma(ICompositionFilter composition)
            {
                DisposeHelper.Dispose(ref m_Buffer1);
                DisposeHelper.Dispose(ref m_Buffer2);

                if (!Renderer.IsOpenClAvail || Renderer.RenderQuality.PerformanceMode())
                {
                    Renderer.FallbackOccurred = true; // Warn user via player stats OSD
                    return(composition);              // OpenCL is not available; fallback
                }

                var lumaSize   = composition.Luma.Size();
                var chromaSize = composition.Chroma.Size();

                if (lumaSize.Width != 2 * chromaSize.Width || lumaSize.Height != 2 * chromaSize.Height)
                {
                    return(composition); // Chroma shouldn't be doubled; fallback
                }
                Func <TextureSize, TextureSize> transformWidth  = s => new TextureSize(2 * s.Width, s.Height);
                Func <TextureSize, TextureSize> transformHeight = s => new TextureSize(s.Width, 2 * s.Height);

                var kernelU  = CompileKernel(true);
                var kernelV  = CompileKernel(false);
                var shaderUh = kernelU.Configure(transform: transformWidth);
                var shaderUv = kernelU.Configure(transform: transformHeight);
                var shaderVh = kernelV.Configure(transform: transformWidth);
                var shaderVv = kernelV.Configure(transform: transformHeight);

                var neuronCount1 = s_NeuronCount[(int)Neurons1];
                var neuronCount2 = s_NeuronCount[(int)Neurons2];
                var weights1     = s_Weights[(int)Neurons1];

                m_Buffer1 = Renderer.CreateClBuffer(weights1);
                var differentWeights = neuronCount1 != neuronCount2;

                if (differentWeights)
                {
                    var weights2 = s_Weights[(int)Neurons2];
                    m_Buffer2 = Renderer.CreateClBuffer(weights2);
                }

                var localWorkSizes = new[] { 8, 8 };
                var nnedi3Uh       = new NNedi3HKernelFilter(shaderUh, m_Buffer1, neuronCount1,
                                                             new TextureSize(chromaSize.Width, chromaSize.Height),
                                                             localWorkSizes, composition.Chroma);
                var nnedi3Uv = new NNedi3VKernelFilter(shaderUv, m_Buffer2, neuronCount2, differentWeights,
                                                       new TextureSize(nnedi3Uh.Size().Width, nnedi3Uh.Size().Height),
                                                       localWorkSizes, nnedi3Uh);

                var nnedi3Vh = new NNedi3HKernelFilter(shaderVh, m_Buffer1, neuronCount1,
                                                       new TextureSize(chromaSize.Width, chromaSize.Height),
                                                       localWorkSizes, composition.Chroma);
                var nnedi3Vv = new NNedi3VKernelFilter(shaderVv, m_Buffer2, neuronCount2, differentWeights,
                                                       new TextureSize(nnedi3Vh.Size().Width, nnedi3Vh.Size().Height),
                                                       localWorkSizes, nnedi3Vh);

                return(composition.Luma.MergeWith(nnedi3Uv, nnedi3Vv).ConvertToRgb());
            }
예제 #4
0
        public ITextureFilter ScaleChroma(ICompositionFilter composition)
        {
            var fullSizeChroma = new ResizeFilter(composition.Chroma, composition.TargetSize, TextureChannels.ChromaOnly,
                                                  composition.ChromaOffset, Renderer.ChromaUpscaler, Renderer.ChromaDownscaler);

            return(new MergeFilter(composition.Luma.SetSize(composition.TargetSize, tagged: true), fullSizeChroma)
                   .ConvertToRgb()
                   .Labeled(fullSizeChroma.Description().PrependToDescription("Chroma: ")));
        }
예제 #5
0
            public override ITextureFilter ScaleChroma(ICompositionFilter composition)
            {
                var chromaSize = composition.Chroma.Size();
                var targetSize = composition.TargetSize;

                // Fall back to default when downscaling is needed
                if ((chromaSize > targetSize).Any || chromaSize == targetSize)
                {
                    return(composition);
                }

                Vector2 offset       = composition.ChromaOffset + new Vector2(0.5f, 0.5f);
                var     chromaShader = CompileShader("Chroma.hlsl").Configure(arguments: new[] { B, C, offset[0], offset[1] });

                var resizedLuma = composition.Luma.SetSize(targetSize, tagged: true);

                return(chromaShader.ApplyTo(resizedLuma, composition.Chroma).ConvertToRgb());
            }
예제 #6
0
            public override ITextureFilter ScaleChroma(ICompositionFilter composition)
            {
                if (!Renderer.IsDx11Avail)
                {
                    Renderer.FallbackOccurred = true; // Warn user via player stats OSD
                    return(composition);              // DX11 is not available; fallback
                }

                var luma   = composition.Luma;
                var chroma = composition.Chroma;

                var lumaSize   = luma.Size();
                var chromaSize = chroma.Size();

                if (lumaSize.Width != 2 * chromaSize.Width || lumaSize.Height != 2 * chromaSize.Height)
                {
                    return(composition); // Chroma shouldn't be doubled; fallback
                }
                Func <TextureSize, TextureSize> transform = s => new TextureSize(2 * s.Height, s.Width);

                var shaderUPass1 = GetShader(Neurons1, true);
                var shaderUPass2 = GetShader(Neurons2, true);
                var shaderVPass1 = GetShader(Neurons1, false);
                var shaderVPass2 = GetShader(Neurons2, false);

                var interleaveU = new Shader(FromFile("Interleave.hlsl", compilerOptions: "CHROMA_U=1"))
                {
                    Transform = transform
                };
                var interleaveV = new Shader(FromFile("Interleave.hlsl", compilerOptions: "CHROMA_V=1"))
                {
                    Transform = transform
                };

                var resultU = interleaveU.ApplyTo(chroma, chroma.Apply(shaderUPass1));
                var u       = interleaveU.ApplyTo(resultU, resultU.Apply(shaderUPass2));

                var resultV = interleaveV.ApplyTo(chroma, chroma.Apply(shaderVPass1));
                var v       = interleaveV.ApplyTo(resultV, resultU.Apply(shaderVPass2));

                return(luma.MergeWith(u, v).ConvertToRgb());
            }
            public override ITextureFilter ScaleChroma(ICompositionFilter composition)
            {
                if (!Renderer.IsDx11Avail)
                {
                    Renderer.FallbackOccurred = true; // Warn user via player stats OSD
                    return(composition);              // DX11 is not available; fallback
                }

                var lumaSize   = composition.Luma.Size();
                var chromaSize = composition.Chroma.Size();

                if (lumaSize.Width != 2 * chromaSize.Width || lumaSize.Height != 2 * chromaSize.Height)
                {
                    return(composition); // Chroma shouldn't be doubled; fallback
                }
                Func <TextureSize, TextureSize> transform = s => new TextureSize(2 * s.Height, s.Width);

                var shaderUPass1 = LoadShader11(GetShaderFileName(Neurons1, true));
                var shaderUPass2 = LoadShader11(GetShaderFileName(Neurons2, true));
                var shaderVPass1 = LoadShader11(GetShaderFileName(Neurons1, false));
                var shaderVPass2 = LoadShader11(GetShaderFileName(Neurons2, false));
                var interleaveU  = CompileShader("Interleave.hlsl", macroDefinitions: "CHROMA_U=1").Configure(transform: transform);
                var interleaveV  = CompileShader("Interleave.hlsl", macroDefinitions: "CHROMA_V=1").Configure(transform: transform);

                var uFilter1 = NNedi3Helpers.CreateFilter(shaderUPass1, composition.Chroma, Neurons1, Structured);
                var resultU  = interleaveU.ApplyTo(composition.Chroma, uFilter1);
                var uFilter2 = NNedi3Helpers.CreateFilter(shaderUPass2, resultU, Neurons2, Structured);
                var u        = interleaveU.ApplyTo(resultU, uFilter2);

                var vFilter1 = NNedi3Helpers.CreateFilter(shaderVPass1, composition.Chroma, Neurons1, Structured);
                var resultV  = interleaveV.ApplyTo(composition.Chroma, vFilter1);
                var vFilter2 = NNedi3Helpers.CreateFilter(shaderVPass2, resultV, Neurons2, Structured);
                var v        = interleaveV.ApplyTo(resultV, vFilter2);

                return(composition.Luma.MergeWith(u, v).ConvertToRgb());
            }
            public override ITextureFilter ScaleChroma(ICompositionFilter composition)
            {
                DisposeHelper.Dispose(ref m_Buffer1);
                DisposeHelper.Dispose(ref m_Buffer2);

                if (!Renderer.IsOpenClAvail || Renderer.RenderQuality.PerformanceMode())
                {
                    Renderer.FallbackOccurred = true; // Warn user via player stats OSD
                    return(composition);              // OpenCL is not available; fallback
                }

                var lumaSize   = composition.Luma.Size();
                var chromaSize = composition.Chroma.Size();

                if (lumaSize.Width != 2 * chromaSize.Width || lumaSize.Height != 2 * chromaSize.Height)
                {
                    return(composition); // Chroma shouldn't be doubled; fallback
                }
                Func <TextureSize, TextureSize> transformWidth  = s => new TextureSize(2 * s.Width, s.Height);
                Func <TextureSize, TextureSize> transformHeight = s => new TextureSize(s.Width, 2 * s.Height);

                var neuronCount1 = s_NeuronCount[(int)Neurons1];
                var neuronCount2 = s_NeuronCount[(int)Neurons2];

                var weights1 = s_Weights[(int)Neurons1];

                m_Buffer1 = Renderer.CreateClBuffer(weights1);
                var differentWeights = neuronCount1 != neuronCount2;

                if (differentWeights)
                {
                    var weights2 = s_Weights[(int)Neurons2];
                    m_Buffer2 = Renderer.CreateClBuffer(weights2);
                }

                var kernelU = CompileKernel(true);  // Note: compiled shader is shared between filters
                var kernelV = CompileKernel(false); // Note: compiled shader is shared between filters

                var shaderUh = new NNedi3Kernel(kernelU)
                {
                    Horizontal = true, Buffer = m_Buffer1, NeuronCount = neuronCount1, Transform = transformWidth
                };
                var shaderUv = new NNedi3Kernel(kernelU)
                {
                    Horizontal = false, Buffer = m_Buffer2, ReloadWeights = differentWeights, NeuronCount = neuronCount2, Transform = transformHeight
                };
                var shaderVh = new NNedi3Kernel(kernelV)
                {
                    Horizontal = true, Buffer = m_Buffer1, NeuronCount = neuronCount1, Transform = transformWidth
                };
                var shaderVv = new NNedi3Kernel(kernelV)
                {
                    Horizontal = false, Buffer = m_Buffer2, ReloadWeights = differentWeights, NeuronCount = neuronCount2, Transform = transformHeight
                };

                var nnedi3Uh = composition.Chroma.Apply(shaderUh);
                var nnedi3Uv = nnedi3Uh.Apply(shaderUv);

                var nnedi3Vh = composition.Chroma.Apply(shaderVh);
                var nnedi3Vv = nnedi3Vh.Apply(shaderVv);

                return(composition.Luma.MergeWith(nnedi3Uv, nnedi3Vv).ConvertToRgb());
            }
예제 #9
0
            public override ITextureFilter ScaleChroma(ICompositionFilter composition)
            {
                ITextureFilter input = composition;

                if (Prescaler)
                {
                    input = composition + (new Bilateral.Bilateral());
                }

                var chromaSize   = composition.Chroma.Size();
                var lumaSize     = composition.Luma.Size();
                var chromaOffset = composition.ChromaOffset;

                var downscaler = new Bicubic(0.75f, false);

                float[] yuvConsts = Renderer.Colorimetric.GetYuvConsts();
                int     bitdepth  = Renderer.InputFormat.GetBitDepth();
                bool    limited   = Renderer.Colorimetric.IsLimitedRange();

                Vector2 adjointOffset = -chromaOffset * lumaSize / chromaSize;

                string superResMacros = "";

                if (Softness == 0.0f)
                {
                    superResMacros += "SkipSoftening = 1;";
                }
                string diffMacros = string.Format("LimitedRange = {0}; Range = {1}", limited ? 1 : 0, (1 << bitdepth) - 1);

                var configArgs = yuvConsts.Concat(new[] { chromaOffset.X, chromaOffset.Y }).ToArray();

                var Diff = new Shader(FromFile("Diff.hlsl", compilerOptions: diffMacros))
                {
                    Arguments = configArgs, Format = TextureFormat.Float16
                };
                var SuperRes = new Shader(FromFile("SuperRes.hlsl", compilerOptions: superResMacros))
                {
                    Arguments = (new[] { Strength, Softness }).Concat(configArgs).ToArray()
                };

                if (Passes == 0 || Strength == 0.0f)
                {
                    return(input);
                }

                var hiRes = input.SetSize(lumaSize).ConvertToYuv();

                for (int i = 1; i <= Passes; i++)
                {
                    // Downscale and Subtract
                    ITextureFilter diff;
                    if (LegacyDownscaling)
                    {
                        var lores = hiRes.Resize(chromaSize, TextureChannels.ChromaOnly, adjointOffset, null, downscaler);
                        diff = Diff.ApplyTo(lores, composition.Chroma);
                    }
                    else
                    {
                        diff = DownscaleAndDiff(hiRes, composition.Chroma, chromaSize, adjointOffset);
                    }

                    // Update result
                    hiRes = SuperRes.ApplyTo(hiRes, diff);
                }

                return(hiRes.ConvertToRgb());
            }
예제 #10
0
 public ITextureFilter ScaleChroma(ICompositionFilter composition)
 {
     return(composition + Chain);
 }
예제 #11
0
 public ITextureFilter ScaleChroma(ICompositionFilter composition)
 {
     return(ScaleChroma(composition.Luma, composition.Chroma, composition.TargetSize, composition.ChromaOffset));
 }
예제 #12
0
 public abstract ITextureFilter ScaleChroma(ICompositionFilter composition);
예제 #13
0
        public static ICompositionFilter ComposeWith(this ITextureFilter luma, ITextureFilter chroma, ICompositionFilter copyParametersFrom = null, TextureSize?targetSize = null, Vector2?chromaOffset = null)
        {
            if (copyParametersFrom != null)
            {
                return(new CompositionFilter(luma, chroma, targetSize ?? copyParametersFrom.TargetSize, chromaOffset ?? copyParametersFrom.ChromaOffset));
            }

            return(new CompositionFilter(luma, chroma, targetSize, chromaOffset));
        }