[vlc-commits] direct3d9: use point interpolation rather than none
    Steve Lhomme 
    git at videolan.org
       
    Thu Mar 23 14:21:38 CET 2017
    
    
  
vlc | branch: master | Steve Lhomme <robUx4 at videolabs.io> | Wed Mar 22 16:50:51 2017 +0100| [d0b92b9b4d35a39589a6c58247f307e95cc78140] | committer: Hugo Beauzée-Luyssen
direct3d9: use point interpolation rather than none
We could use linear interpolation but in software decoding the decoder pool is
not initialized with black so we would interpolate with uninitialized (green)
lines/colons.
Signed-off-by: Hugo Beauzée-Luyssen <hugo at beauzee.fr>
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d0b92b9b4d35a39589a6c58247f307e95cc78140
---
 modules/video_output/win32/direct3d9.c | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)
diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c
index ae0c693..16b0678 100644
--- a/modules/video_output/win32/direct3d9.c
+++ b/modules/video_output/win32/direct3d9.c
@@ -127,6 +127,9 @@ struct vout_display_sys_t
     D3DPRESENT_PARAMETERS   d3dpp;
     bool                    use_d3d9ex;
 
+    D3DTEXTUREFILTERTYPE    minFilter;
+    D3DTEXTUREFILTERTYPE    magFilter;
+
     // scene objects
     LPDIRECT3DTEXTURE9      d3dtex;
     LPDIRECT3DVERTEXBUFFER9 d3dvtc;
@@ -1294,19 +1297,27 @@ static int Direct3D9CreateScene(vout_display_t *vd, const video_format_t *fmt)
     IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
 
     // Set linear filtering quality
-    if (sys->d3dcaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFLINEAR) {
+    /* we can't use linear interpolation in software decoding, the pictures
+     * are not initialized to black */
+    if ( is_d3d9_opaque(vd->source.i_chroma) &&
+         sys->d3dcaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFLINEAR ) {
         //msg_Dbg(vd, "Using D3DTEXF_LINEAR for minification");
         IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
+        sys->minFilter = D3DTEXF_LINEAR;
     } else {
         //msg_Dbg(vd, "Using D3DTEXF_POINT for minification");
         IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
+        sys->minFilter = D3DTEXF_POINT;
     }
-    if (sys->d3dcaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR) {
+    if ( is_d3d9_opaque(vd->source.i_chroma) &&
+         sys->d3dcaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR ) {
         //msg_Dbg(vd, "Using D3DTEXF_LINEAR for magnification");
         IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
+        sys->magFilter = D3DTEXF_LINEAR;
     } else {
         //msg_Dbg(vd, "Using D3DTEXF_POINT for magnification");
         IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
+        sys->magFilter = D3DTEXF_POINT;
     }
 
     // set maximum ambient light
@@ -1658,7 +1669,14 @@ static int Direct3D9ImportPicture(vout_display_t *vd,
 
     /* Copy picture surface into texture surface
      * color space conversion happen here */
-    hr = IDirect3DDevice9_StretchRect(sys->d3ddev, source, &vd->sys->sys.rect_src_clipped, destination, NULL, D3DTEXF_NONE );
+    D3DTEXTUREFILTERTYPE filterType;
+    if (sys->sys.rect_src_clipped.right < sys->sys.rect_dest_clipped.right)
+        filterType = sys->magFilter;
+    else if (sys->sys.rect_src_clipped.right > sys->sys.rect_dest_clipped.right)
+        filterType = sys->minFilter;
+    else
+        filterType = D3DTEXF_NONE;
+    hr = IDirect3DDevice9_StretchRect(sys->d3ddev, source, &sys->sys.rect_src_clipped, destination, NULL, filterType );
     IDirect3DSurface9_Release(destination);
     if (FAILED(hr)) {
         msg_Dbg(vd, "Failed IDirect3DDevice9_StretchRect: source 0x%p 0x%0lx",
    
    
More information about the vlc-commits
mailing list