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()); }
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()); }
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: "))); }
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()); }
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()); }
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()); }
public ITextureFilter ScaleChroma(ICompositionFilter composition) { return(composition + Chain); }
public ITextureFilter ScaleChroma(ICompositionFilter composition) { return(ScaleChroma(composition.Luma, composition.Chroma, composition.TargetSize, composition.ChromaOffset)); }
public abstract ITextureFilter ScaleChroma(ICompositionFilter composition);
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)); }