protected override ITextureFilter CreateFilter(ITextureFilter input) { if (!Renderer.IsDx11Avail) { Renderer.FallbackOccurred = true; // Warn user via player stats OSD return(input); // DX11 is not available; fallback } Func <TextureSize, TextureSize> transform = s => new TextureSize(2 * s.Height, s.Width); var shaderPass1 = LoadShader11(GetShaderFileName(Neurons1)); var shaderPass2 = LoadShader11(GetShaderFileName(Neurons2)); var interleave = CompileShader("Interleave.hlsl").Configure(transform: transform); var sourceSize = input.Size(); if ((Renderer.TargetSize <= sourceSize).Any) { return(input); } var yuv = input.ConvertToYuv(); m_Filter1 = NNedi3Helpers.CreateFilter(shaderPass1, yuv, Neurons1, Structured); var resultY = interleave.ApplyTo(yuv, m_Filter1); m_Filter2 = NNedi3Helpers.CreateFilter(shaderPass2, resultY, Neurons2, Structured); var luma = interleave.ApplyTo(resultY, m_Filter2); var result = ChromaScaler.ScaleChroma( new CompositionFilter(luma, yuv, targetSize: luma.Size(), chromaOffset: new Vector2(-0.25f, -0.25f))); return(result.Convolve(null, offset: new Vector2(0.5f, 0.5f))); }
public override IFilter CreateFilter(IFilter input) { if (!Renderer.IsDx11Avail) { Renderer.FallbackOccurred = true; // Warn user via player stats OSD return(input); // DX11 is not available; fallback } Func <TextureSize, TextureSize> Transformation = s => new TextureSize(2 * s.Height, s.Width); var NNEDI3 = LoadShader11(string.Format("NNEDI3_{0}_{1}.cso", s_NeuronCount[(int)Neurons], s_CodePath[(int)CodePath])); var Interleave = CompileShader("Interleave.hlsl").Configure(transform: Transformation); var Combine = CompileShader("Combine.hlsl").Configure(transform: Transformation); var sourceSize = input.OutputSize; if (!IsUpscalingFrom(sourceSize)) { return(input); } var yuv = input.ConvertToYuv(); var chroma = new ResizeFilter(yuv, new TextureSize(sourceSize.Width * 2, sourceSize.Height * 2), TextureChannels.ChromaOnly, new Vector2(-0.25f, -0.25f), Renderer.ChromaUpscaler, Renderer.ChromaDownscaler); IFilter resultY, result; var pass1 = NNedi3Helpers.CreateFilter(NNEDI3, yuv, Neurons); resultY = new ShaderFilter(Interleave, yuv, pass1); var pass2 = NNedi3Helpers.CreateFilter(NNEDI3, resultY, Neurons); result = new ShaderFilter(Combine, resultY, pass2, chroma); return(new ResizeFilter(result.ConvertToRgb(), result.OutputSize, new Vector2(0.5f, 0.5f), Renderer.LumaUpscaler, Renderer.LumaDownscaler)); }
public override IFilter CreateFilter(IFilter input) { Cleanup(); if (!Renderer.IsDx11Avail) { Renderer.FallbackOccurred = true; // Warn user via player stats OSD return(input); // DX11 is not available; fallback } Func <TextureSize, TextureSize> transform = s => new TextureSize(2 * s.Height, s.Width); var shaderPass1 = LoadShader11(GetShaderFileName(Neurons1)); var shaderPass2 = LoadShader11(GetShaderFileName(Neurons2)); var interleave = CompileShader("Interleave.hlsl").Configure(transform: transform); var combine = CompileShader("Combine.hlsl").Configure(transform: transform); var sourceSize = input.OutputSize; if (!IsUpscalingFrom(sourceSize)) { return(input); } var yuv = input.ConvertToYuv(); var chroma = new ResizeFilter(yuv, new TextureSize(sourceSize.Width * 2, sourceSize.Height * 2), TextureChannels.ChromaOnly, new Vector2(-0.25f, -0.25f), Renderer.ChromaUpscaler, Renderer.ChromaDownscaler); m_Filter1 = NNedi3Helpers.CreateFilter(shaderPass1, yuv, Neurons1, Structured); var resultY = new ShaderFilter(interleave, yuv, m_Filter1); m_Filter2 = NNedi3Helpers.CreateFilter(shaderPass2, resultY, Neurons2, Structured); var result = new ShaderFilter(combine, resultY, m_Filter2, chroma); return(new ResizeFilter(result.ConvertToRgb(), result.OutputSize, new Vector2(0.5f, 0.5f), Renderer.LumaUpscaler, Renderer.LumaDownscaler)); }
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()); }