private void CustomTensorToRenderTexture(Tensor X, RenderTexture target, int batch, int fromChannel, Vector4 scale, Vector4 bias, Texture3D lut = null)
    {
        if (!internalSetup.shouldUseSRGBTensor)
        {
            X.ToRenderTexture(target, batch, fromChannel, scale, bias, lut);
            return;
        }

        //By default Barracuda work on Tensor containing value in linear color space.
        //Here we handle custom convertion from tensor to texture when tensor is in sRGB color space.
        //This is important for this demo as network was trained with data is sRGB color space.
        //Direct support for this will be added in a latter revision of Barracuda.
        if (!target.enableRandomWrite || !target.IsCreated())
        {
            target.Release();
            target.enableRandomWrite = true;
            target.Create();
        }

        var gpuBackend = new ReferenceComputeOps(ComputeShaderSingleton.Instance.referenceKernels);
        var fn         = new CustomComputeKernel(tensorToTextureSRGB, "TensorToTexture" + (lut == null?"NoLUT":"3DLUT"));
        var XonDevice  = gpuBackend.Pin(X);

        fn.SetTensor("X", X.shape, XonDevice.buffer, XonDevice.offset);
        fn.shader.SetTexture(fn.kernelIndex, "Otex2D", target);
        fn.shader.SetVector("_Scale", scale);
        fn.shader.SetVector("_Bias", bias);
        fn.shader.SetInts("_Pad", new int[] { batch, 0, 0, fromChannel });
        fn.shader.SetBool("_FlipY", true);
        if (lut != null)
        {
            fn.shader.SetTexture(fn.kernelIndex, "Otex3D", lut);
            fn.shader.SetVector("_LutParams", new Vector2(1f / lut.width, lut.width - 1f));
        }

        fn.Dispatch(target.width, target.height, 1);
    }