[vlc-commits] d3d11_shaders: handle RGBA rendering on NV12/P010

Steve Lhomme git at videolan.org
Mon May 28 13:25:56 CEST 2018


vlc | branch: master | Steve Lhomme <robux4 at ycbcr.xyz> | Mon Jan 15 15:24:48 2018 +0100| [00a8ab32c3f8d58b371d70bf698a5a7ea2aad1fd] | committer: Steve Lhomme

d3d11_shaders: handle RGBA rendering on NV12/P010

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=00a8ab32c3f8d58b371d70bf698a5a7ea2aad1fd
---

 modules/video_output/win32/d3d11_quad.c    | 67 ++++++++++++++++++++----------
 modules/video_output/win32/d3d11_shaders.c | 14 +++++++
 2 files changed, 59 insertions(+), 22 deletions(-)

diff --git a/modules/video_output/win32/d3d11_quad.c b/modules/video_output/win32/d3d11_quad.c
index 1ebc7d633d..458c2433e5 100644
--- a/modules/video_output/win32/d3d11_quad.c
+++ b/modules/video_output/win32/d3d11_quad.c
@@ -705,6 +705,14 @@ int D3D11_SetupQuad(vlc_object_t *o, d3d11_device_t *d3d_dev, const video_format
         1.164383561643836f,  2.017232142857142f,                 0.f, 0.f,
                        0.f,                 0.f,                 0.f, 1.f,
     };
+
+    static const FLOAT COLORSPACE_FULL_RGBA_TO_BT601_YUV[4*4] = {
+        0.299000f,  0.587000f,  0.114000f, 0.f,
+       -0.168736f, -0.331264f,  0.500000f, 0.f,
+        0.500000f, -0.418688f, -0.081312f, 0.f,
+              0.f,        0.f,        0.f, 1.f,
+    };
+
     /* see https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.709_conversion, in studio range */
     static const FLOAT COLORSPACE_BT709_YUV_TO_FULL_RGBA[4*4] = {
         1.164383561643836f,                 0.f,  1.792741071428571f, 0.f,
@@ -725,31 +733,46 @@ int D3D11_SetupQuad(vlc_object_t *o, d3d11_device_t *d3d_dev, const video_format
     memcpy(colorspace.WhitePoint, IDENTITY_4X4, sizeof(colorspace.WhitePoint));
 
     const FLOAT *ppColorspace;
-    if (RGB_shader)
-        ppColorspace = IDENTITY_4X4;
-    else {
-        switch (fmt->space){
-            case COLOR_SPACE_BT709:
-                ppColorspace = COLORSPACE_BT709_YUV_TO_FULL_RGBA;
-                break;
-            case COLOR_SPACE_BT2020:
-                ppColorspace = COLORSPACE_BT2020_YUV_TO_FULL_RGBA;
-                break;
-            case COLOR_SPACE_BT601:
-                ppColorspace = COLORSPACE_BT601_YUV_TO_FULL_RGBA;
-                break;
-            default:
-            case COLOR_SPACE_UNDEF:
-                if( fmt->i_height > 576 )
+    if (!IsRGBShader(displayFormat->pixelFormat))
+    {
+        if (!RGB_shader)
+            ppColorspace = IDENTITY_4X4;
+        else
+        {
+            ppColorspace = COLORSPACE_FULL_RGBA_TO_BT601_YUV;
+            colorspace.WhitePoint[0*4 + 3] = itu_black_level;
+            colorspace.WhitePoint[1*4 + 3] = itu_achromacy;
+            colorspace.WhitePoint[2*4 + 3] = itu_achromacy;
+        }
+    }
+    else
+    {
+        if (RGB_shader)
+            ppColorspace = IDENTITY_4X4;
+        else {
+            switch (fmt->space){
+                case COLOR_SPACE_BT709:
                     ppColorspace = COLORSPACE_BT709_YUV_TO_FULL_RGBA;
-                else
+                    break;
+                case COLOR_SPACE_BT2020:
+                    ppColorspace = COLORSPACE_BT2020_YUV_TO_FULL_RGBA;
+                    break;
+                case COLOR_SPACE_BT601:
                     ppColorspace = COLORSPACE_BT601_YUV_TO_FULL_RGBA;
-                break;
+                    break;
+                default:
+                case COLOR_SPACE_UNDEF:
+                    if( fmt->i_height > 576 )
+                        ppColorspace = COLORSPACE_BT709_YUV_TO_FULL_RGBA;
+                    else
+                        ppColorspace = COLORSPACE_BT601_YUV_TO_FULL_RGBA;
+                    break;
+            }
+            /* all matrices work in studio range and output in full range */
+            colorspace.WhitePoint[0*4 + 3] = -itu_black_level;
+            colorspace.WhitePoint[1*4 + 3] = -itu_achromacy;
+            colorspace.WhitePoint[2*4 + 3] = -itu_achromacy;
         }
-        /* all matrices work in studio range and output in full range */
-        colorspace.WhitePoint[0*4 + 3] = -itu_black_level;
-        colorspace.WhitePoint[1*4 + 3] = -itu_achromacy;
-        colorspace.WhitePoint[2*4 + 3] = -itu_achromacy;
     }
 
     memcpy(colorspace.Colorspace, ppColorspace, sizeof(colorspace.Colorspace));
diff --git a/modules/video_output/win32/d3d11_shaders.c b/modules/video_output/win32/d3d11_shaders.c
index 44e0053a72..5f73ff04bb 100644
--- a/modules/video_output/win32/d3d11_shaders.c
+++ b/modules/video_output/win32/d3d11_shaders.c
@@ -274,6 +274,20 @@ HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool leg
                      sample.z = 0.0;\
                      sample.a = 1;";
             break;
+        case DXGI_FORMAT_R8G8B8A8_UNORM:
+            /* Y */
+            psz_sampler[0] =
+                    "sample = shaderTexture[0].Sample(samplerState, coords);\n";
+            psz_move_planes[0] = "return rgb";
+            /* UV */
+            psz_sampler[1] =
+                    "sample = shaderTexture[0].Sample(samplerState, coords);\n";
+            psz_move_planes[1] =
+                    "rgb.x = rgb.y;\n"
+                    "rgb.y = rgb.z;\n"
+                    "rgb.z = 0;\n"
+                    "return rgb";
+            break;
         case DXGI_FORMAT_UNKNOWN:
             switch (format->fourcc)
             {



More information about the vlc-commits mailing list