public override IFilter CreateFilter(IFilter input) { 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(input); // OpenCL is not available, or UNORM8 textures used (not supported); 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 kernel = CompileKernel(); var shaderH = kernel.Configure(transform: transformWidth); var shaderV = kernel.Configure(transform: transformHeight); var combine = CompileShader("Combine.hlsl"); 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 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); var localWorkSizes = new[] { 8, 8 }; var nnedi3H = new NNedi3HKernelFilter(shaderH, m_Buffer1, neuronCount1, new TextureSize(yuv.OutputSize.Width, yuv.OutputSize.Height), localWorkSizes, yuv); var nnedi3V = new NNedi3VKernelFilter(shaderV, m_Buffer2, neuronCount2, differentWeights, new TextureSize(nnedi3H.OutputSize.Width, nnedi3H.OutputSize.Height), localWorkSizes, nnedi3H); var result = new ShaderFilter(combine, nnedi3V, chroma); return(new ResizeFilter(result.ConvertToRgb(), result.OutputSize, new Vector2(0.5f, 0.5f), Renderer.LumaUpscaler, Renderer.LumaDownscaler)); }
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()); }
protected override ITextureFilter CreateFilter(ITextureFilter input) { if (!Renderer.IsOpenClAvail || Renderer.RenderQuality.PerformanceMode()) { Renderer.FallbackOccurred = true; // Warn user via player stats OSD return(input); // OpenCL is not available, or UNORM8 textures used (not supported); 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 kernel = CompileKernel(); var shaderH = kernel.Configure(transform: transformWidth); var shaderV = kernel.Configure(transform: transformHeight); var neuronCount1 = s_NeuronCount[(int)Neurons1]; var neuronCount2 = s_NeuronCount[(int)Neurons2]; var weights1 = s_Weights[(int)Neurons1]; var buffer1 = Renderer.CreateClBuffer(weights1); var buffer2 = buffer1; var differentWeights = neuronCount1 != neuronCount2; if (differentWeights) { var weights2 = s_Weights[(int)Neurons2]; buffer2 = Renderer.CreateClBuffer(weights2); } var sourceSize = input.Output.Size; if (!IsUpscalingFrom(sourceSize)) { return(input); } var yuv = input.ConvertToYuv(); var localWorkSizes = new[] { 8, 8 }; var nnedi3H = new NNedi3HKernelFilter(shaderH, buffer1, neuronCount1, new TextureSize(yuv.Output.Size.Width, yuv.Output.Size.Height), localWorkSizes, yuv); var nnedi3V = new NNedi3VKernelFilter(shaderV, buffer2, neuronCount2, differentWeights, new TextureSize(nnedi3H.Output.Size.Width, nnedi3H.Output.Size.Height), localWorkSizes, nnedi3H); var result = ChromaScaler.MakeChromaFilter(nnedi3V, yuv, chromaOffset: new Vector2(-0.25f, -0.25f)); return(new ResizeFilter(result, result.Output.Size, new Vector2(0.5f, 0.5f), Renderer.LumaUpscaler, Renderer.LumaDownscaler)); }