[vlc-commits] [Git][videolan/vlc][master] 9 commits: direct3d11: fix initial position when using upscaler

Steve Lhomme (@robUx4) gitlab at videolan.org
Mon Feb 19 08:22:30 UTC 2024



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
0a55cd68 by Steve Lhomme at 2024-02-19T07:39:41+00:00
direct3d11: fix initial position when using upscaler

- - - - -
2a8d33da by Steve Lhomme at 2024-02-19T07:39:41+00:00
configure: assume d3dx9effect.h is always there

It's already true for mingw-w64 v5 and above.

- - - - -
fb93aaaf by Steve Lhomme at 2024-02-19T07:39:41+00:00
configure: assume d3d9.h is always there

It's already true for mingw-w64 v5 and above.

- - - - -
827b4e04 by Steve Lhomme at 2024-02-19T07:39:41+00:00
configure: assume d3d11.h is always there

It's already true for mingw-w64 v5 and above.

- - - - -
86c2cf55 by Steve Lhomme at 2024-02-19T07:39:41+00:00
contrib: amf: update to 1.4.33

It contains the HQScaler

- - - - -
d0c47046 by Steve Lhomme at 2024-02-19T07:39:41+00:00
contrib: amf: fix compilation errors and warnings

Patchsets sent upstream:

- https://github.com/GPUOpen-LibrariesAndSDKs/AMF/pull/448
- https://github.com/GPUOpen-LibrariesAndSDKs/AMF/pull/449
- https://github.com/GPUOpen-LibrariesAndSDKs/AMF/pull/450
- https://github.com/GPUOpen-LibrariesAndSDKs/AMF/pull/451
- https://github.com/GPUOpen-LibrariesAndSDKs/AMF/pull/452

- - - - -
803499c5 by Steve Lhomme at 2024-02-19T07:39:41+00:00
configure: detect AMD HQScaler

- - - - -
6f1ec768 by Steve Lhomme at 2024-02-19T07:39:41+00:00
hw/amf: add a helper to create an AMFContext

- - - - -
ffd3f0e7 by Steve Lhomme at 2024-02-19T07:39:41+00:00
d3d11_scaler: add AMD HQScaler support

- - - - -


16 changed files:

- configure.ac
- + contrib/src/amf/0001-Differentiate-the-AMF_NO_VTABLE-based-on-the-compile.patch
- + contrib/src/amf/0001-Don-t-cast-amf_int64-when-using-a-format-string.patch
- + contrib/src/amf/0001-Fix-const-on-return-by-value-AMF_DECLARE_IID.patch
- + contrib/src/amf/0001-Fix-warning-when-_MSC_VER-is-not-defined.patch
- + contrib/src/amf/0001-Move-AMF_UNICODE-into-Platform.h.patch
- + contrib/src/amf/0002-Define-LPRI-d-ud-x-64-as-Unicode-wide-versions-of-AM.patch
- + contrib/src/amf/0002-Fix-const-on-return-by-value-Variant-values.patch
- + contrib/src/amf/0003-Define-AMFPRI-d-ud-x-64-using-the-standard-C-format-.patch
- contrib/src/amf/rules.mak
- + modules/hw/amf/amf_helper.c
- + modules/hw/amf/amf_helper.h
- modules/video_output/Makefile.am
- modules/video_output/win32/d3d11_scaler.cpp
- modules/video_output/win32/direct3d11.cpp
- modules/video_output/win32/direct3d9.c


Changes:

=====================================
configure.ac
=====================================
@@ -2160,6 +2160,20 @@ AS_IF([test "$enable_nvdec" != "no"], [
 ])
 AM_CONDITIONAL([HAVE_NVDEC], [test "${have_nvdec}" != "no"])
 
+dnl
+dnl  AMD Advanced Media Framework API
+dnl
+AC_ARG_ENABLE([amf-scaler], AS_HELP_STRING([--disable-amf-scaler],
+  [disable AMD AMF API (default auto)]))
+have_amf_scaler="no"
+AS_IF([test "$enable_amf_scaler" != "no"], [
+  AC_CHECK_HEADERS([AMF/core/PropertyStorage.h AMF/components/HQScaler.h], [
+    have_amf_scaler="yes"
+    AC_DEFINE(HAVE_AMF_SCALER, 1, AMD HQScaler supported)
+  ])
+])
+AM_CONDITIONAL([HAVE_AMF_SCALER], [test "${have_amf_scaler}" != "no"])
+
 dnl
 dnl special access module for Blackmagic SDI cards
 dnl
@@ -3611,15 +3625,10 @@ AC_ARG_ENABLE([directx],
 ])
 AS_IF([test "${enable_directx}" != "no"], [
   dnl Direct3D11
-  AC_CHECK_HEADERS([d3d11.h], [
-    VLC_ADD_PLUGIN([direct3d11 direct3d11_filters])
-  ])
+  VLC_ADD_PLUGIN([direct3d11 direct3d11_filters])
 
   dnl Direct3D9
-  AC_CHECK_HEADERS([d3d9.h], [
-    VLC_ADD_PLUGIN([direct3d9 direct3d9_filters])
-    AC_CHECK_HEADERS([d3dx9effect.h])
-  ])
+  VLC_ADD_PLUGIN([direct3d9 direct3d9_filters])
 ])
 
 dnl


=====================================
contrib/src/amf/0001-Differentiate-the-AMF_NO_VTABLE-based-on-the-compile.patch
=====================================
@@ -0,0 +1,47 @@
+From cf190d084644d3d3e2ea1ffbb740ad8e7aede760 Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4 at videolabs.io>
+Date: Fri, 16 Feb 2024 08:18:19 +0100
+Subject: [PATCH] Differentiate the AMF_NO_VTABLE based on the compiler
+
+This is a Microsoft specific extension: https://learn.microsoft.com/en-us/cpp/cpp/novtable
+Clang and gcc can compile for Windows but don't support this.
+---
+ amf/public/include/core/Platform.h | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/amf/public/include/core/Platform.h b/amf/public/include/core/Platform.h
+index d6496d4..378f789 100644
+--- a/amf/public/include/core/Platform.h
++++ b/amf/public/include/core/Platform.h
+@@ -100,6 +100,12 @@ typedef signed int HRESULT;
+ #include <stdint.h>
+ #include <string.h>
+ 
++#if defined(_MSC_VER)
++    #define AMF_NO_VTABLE           __declspec(novtable)
++#else
++    #define AMF_NO_VTABLE
++#endif
++
+ #if defined(_WIN32)
+ 
+ 
+@@ -116,7 +122,6 @@ typedef signed int HRESULT;
+     #define AMF_INLINE              __inline
+     #define AMF_FORCEINLINE         __forceinline
+ #endif
+-    #define AMF_NO_VTABLE           __declspec(novtable)
+ 
+ #else // !WIN32 - Linux and Mac
+ 
+@@ -130,7 +135,6 @@ typedef signed int HRESULT;
+     #define AMF_INLINE              __inline__
+     #define AMF_FORCEINLINE         __inline__
+ #endif
+-    #define AMF_NO_VTABLE
+ 
+ #endif // WIN32
+ 
+-- 
+2.37.3.windows.1
+


=====================================
contrib/src/amf/0001-Don-t-cast-amf_int64-when-using-a-format-string.patch
=====================================
@@ -0,0 +1,34 @@
+From e5498eb5e82c54c93fdd56127a8bb6dc96961e46 Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4 at videolabs.io>
+Date: Fri, 16 Feb 2024 08:05:13 +0100
+Subject: [PATCH] Don't cast amf_int64 when using a format string
+
+The format string is designed to match amf_int64.
+---
+ amf/public/include/core/Variant.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/amf/public/include/core/Variant.h b/amf/public/include/core/Variant.h
+index edf14ae..a44fbf5 100644
+--- a/amf/public/include/core/Variant.h
++++ b/amf/public/include/core/Variant.h
+@@ -872,14 +872,14 @@ namespace amf
+     {
+         res = AMF_OK;
+         char buff[0xFF];
+-        sprintf(buff, "%" AMFPRId64, (long long)value);
++        sprintf(buff, "%" AMFPRId64, value);
+         return buff;
+     }
+     static AMF_INLINE AMFVariant::WString AMFConvertInt64ToWString(amf_int64 value, AMF_RESULT& res)
+     {
+         res = AMF_OK;
+         wchar_t buff[0xFF];
+-        swprintf(buff, 0xFF, L"%" LPRId64, (long long)value);
++        swprintf(buff, 0xFF, L"%" LPRId64, value);
+         return buff;
+     }
+ 
+-- 
+2.37.3.windows.1
+


=====================================
contrib/src/amf/0001-Fix-const-on-return-by-value-AMF_DECLARE_IID.patch
=====================================
@@ -0,0 +1,29 @@
+From 17cc77f3185ca562c7c0aa4e439c8f4bace1360a Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4 at videolabs.io>
+Date: Fri, 16 Feb 2024 08:12:20 +0100
+Subject: [PATCH 1/2] Fix const on return by value AMF_DECLARE_IID()
+
+The returned value won't be const in C.
+
+Fixes this kind of warning:
+include/AMF/core/../components/Component.h:326:5: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
+---
+ amf/public/include/core/Interface.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/amf/public/include/core/Interface.h b/amf/public/include/core/Interface.h
+index 9ac7e41..96117f0 100644
+--- a/amf/public/include/core/Interface.h
++++ b/amf/public/include/core/Interface.h
+@@ -49,7 +49,7 @@ namespace amf
+         }
+ #else
+ #define AMF_DECLARE_IID(name, _data1, _data2, _data3, _data41, _data42, _data43, _data44, _data45, _data46, _data47, _data48) \
+-        AMF_INLINE static const AMFGuid IID_##name(void) \
++        AMF_INLINE static AMFGuid IID_##name(void) \
+         { \
+             AMFGuid uid = {_data1, _data2, _data3, _data41, _data42, _data43, _data44, _data45, _data46, _data47, _data48}; \
+             return uid; \
+-- 
+2.37.3.windows.1
+


=====================================
contrib/src/amf/0001-Fix-warning-when-_MSC_VER-is-not-defined.patch
=====================================
@@ -0,0 +1,52 @@
+From 6c26950f67fb07550b86f3064fb0f7b7b53eec5d Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4 at videolabs.io>
+Date: Fri, 16 Feb 2024 08:57:46 +0100
+Subject: [PATCH] Fix warning when _MSC_VER is not defined
+
+---
+ amf/public/include/core/Variant.h | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/amf/public/include/core/Variant.h b/amf/public/include/core/Variant.h
+index edf14ae..879f092 100644
+--- a/amf/public/include/core/Variant.h
++++ b/amf/public/include/core/Variant.h
+@@ -365,7 +365,7 @@ namespace amf
+             operator=(p_other);
+         }
+ 
+-#if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600)
++#if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (defined(_MSC_VER) && _MSC_VER >= 1600)
+ #pragma warning (push)
+ #pragma warning (disable : 26439) //This kind of function may not throw. Declare it 'noexcept'.
+         String(String&& p_other) : m_Str(nullptr)
+@@ -393,7 +393,7 @@ namespace amf
+             m_Str = AMFVariantDuplicateString(p_other.m_Str);
+             return *this;
+         }
+-#if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600)
++#if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (defined(_MSC_VER) && _MSC_VER >= 1600)
+         String& operator=(String&& p_other)
+         {
+             Free();
+@@ -475,7 +475,7 @@ namespace amf
+         {
+             operator=(p_other);
+         }
+-#if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600)
++#if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (defined(_MSC_VER) && _MSC_VER >= 1600)
+         WString(WString&& p_other) : m_Str(nullptr)
+         {
+             operator=(p_other);
+@@ -492,7 +492,7 @@ namespace amf
+             m_Str = AMFVariantDuplicateWString(p_other.m_Str);
+             return *this;
+         }
+-#if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600)
++#if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (defined(_MSC_VER) && _MSC_VER >= 1600)
+         WString& operator=(WString&& p_other)
+         {
+             Free();
+-- 
+2.37.3.windows.1
+


=====================================
contrib/src/amf/0001-Move-AMF_UNICODE-into-Platform.h.patch
=====================================
@@ -0,0 +1,38 @@
+From a9ee7691cf2535f58695769893e92a634f810523 Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4 at videolabs.io>
+Date: Fri, 16 Feb 2024 07:43:32 +0100
+Subject: [PATCH 1/4] Move AMF_UNICODE into Platform.h
+
+It's a common macro that can be used in other places.
+---
+ amf/public/include/core/Platform.h | 14 ++++++++++++++
+ 2 files changed, 14 insertions(+), 14 deletions(-)
+
+diff --git a/amf/public/include/core/Platform.h b/amf/public/include/core/Platform.h
+index 3f997fe..cdab1b2 100644
+--- a/amf/public/include/core/Platform.h
++++ b/amf/public/include/core/Platform.h
+@@ -66,6 +66,20 @@
+ 
+ #define AMF_TODO(_todo) (__FILE__ "(" AMF_MACRO_STRING(__LINE__) "): TODO: "_todo)
+ 
++/**
++*******************************************************************************
++*   AMF_UNICODE
++*
++*   @brief
++*       Macro to convert string constant into wide char string constant
++*
++*   Auxilary AMF_UNICODE_ macro is needed as otherwise it is not possible to use AMF_UNICODE(__FILE__)
++*   Microsoft macro _T also uses 2 passes to accomplish that
++*******************************************************************************
++*/
++#define AMF_UNICODE(s) AMF_UNICODE_(s)
++#define AMF_UNICODE_(s) L ## s
++
+ 
+  #if defined(__GNUC__) || defined(__clang__)
+      #define AMF_ALIGN(n) __attribute__((aligned(n)))
+-- 
+2.37.3.windows.1
+


=====================================
contrib/src/amf/0002-Define-LPRI-d-ud-x-64-as-Unicode-wide-versions-of-AM.patch
=====================================
@@ -0,0 +1,54 @@
+From 7a0df0c174dce8d383be26e7b96d410865c62cf1 Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4 at videolabs.io>
+Date: Fri, 16 Feb 2024 07:45:25 +0100
+Subject: [PATCH 2/4] Define LPRI(d|ud|x)64 as Unicode (wide) versions of
+ AMFPRI(d|ud|x)64
+
+It's always true for all platforms.
+---
+ amf/public/include/core/Platform.h | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+diff --git a/amf/public/include/core/Platform.h b/amf/public/include/core/Platform.h
+index cdab1b2..12ee75c 100644
+--- a/amf/public/include/core/Platform.h
++++ b/amf/public/include/core/Platform.h
+@@ -119,13 +119,10 @@ typedef signed int HRESULT;
+     #define AMF_NO_VTABLE           __declspec(novtable)
+ 
+     #define AMFPRId64   "I64d"
+-    #define LPRId64    L"I64d"
+ 
+     #define AMFPRIud64   "Iu64d"
+-    #define LPRIud64    L"Iu64d"
+ 
+     #define AMFPRIx64   "I64x"
+-    #define LPRIx64    L"I64x"
+ 
+ #else // !WIN32 - Linux and Mac
+ 
+@@ -143,17 +140,18 @@ typedef signed int HRESULT;
+ 
+     #if !defined(AMFPRId64)
+         #define AMFPRId64    "lld"
+-        #define LPRId64     L"lld"
+ 
+         #define AMFPRIud64    "ulld"
+-        #define LPRIud64     L"ulld"
+ 
+         #define AMFPRIx64    "llx"
+-        #define LPRIx64     L"llx"
+     #endif
+ 
+ #endif // WIN32
+ 
++#define LPRId64   AMF_UNICODE(AMFPRId64)
++#define LPRIud64  AMF_UNICODE(AMFPRIud64)
++#define LPRIx64   AMF_UNICODE(AMFPRIx64)
++
+ 
+ #if defined(_WIN32)
+ #define AMF_WEAK __declspec( selectany )
+-- 
+2.37.3.windows.1
+


=====================================
contrib/src/amf/0002-Fix-const-on-return-by-value-Variant-values.patch
=====================================
@@ -0,0 +1,49 @@
+From 18c87b557f7d5b9f1850a66705b551ac482e47e3 Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4 at videolabs.io>
+Date: Fri, 16 Feb 2024 08:50:28 +0100
+Subject: [PATCH 2/2] Fix const on return by value Variant values
+
+Fix const on return by value AMF_DECLARE_IID()
+
+The returned value won't be const in C.
+
+Fixes this kind of warning:
+include/AMF/core/Variant.h:135:23: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
+---
+ amf/public/include/core/Variant.h | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/amf/public/include/core/Variant.h b/amf/public/include/core/Variant.h
+index edf14ae..a0a7eb8 100644
+--- a/amf/public/include/core/Variant.h
++++ b/amf/public/include/core/Variant.h
+@@ -132,16 +132,16 @@ namespace amf
+     static AMF_INLINE const AMFRatio&      AMF_STD_CALL AMFVariantGetRatio(const AMFVariantStruct* _variant) { return (_variant)->ratioValue; }
+     static AMF_INLINE const AMFColor&      AMF_STD_CALL AMFVariantGetColor(const AMFVariantStruct* _variant) { return (_variant)->colorValue; }
+ #else // #if defined(__cplusplus)
+-    static AMF_INLINE const AMFRect        AMF_STD_CALL AMFVariantGetRect (const AMFVariantStruct* _variant) { return (_variant)->rectValue; }
+-    static AMF_INLINE const AMFSize        AMF_STD_CALL AMFVariantGetSize (const AMFVariantStruct* _variant) { return (_variant)->sizeValue; }
+-    static AMF_INLINE const AMFPoint       AMF_STD_CALL AMFVariantGetPoint(const AMFVariantStruct* _variant) { return (_variant)->pointValue; }
+-    static AMF_INLINE const AMFFloatSize  AMF_STD_CALL AMFVariantGetFloatSize(const AMFVariantStruct* _variant) { return (_variant)->floatSizeValue; }
+-    static AMF_INLINE const AMFFloatPoint2D  AMF_STD_CALL AMFVariantGetFloatPoint2D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint2DValue; }
+-    static AMF_INLINE const AMFFloatPoint3D  AMF_STD_CALL AMFVariantGetFloatPoint3D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint3DValue; }
+-    static AMF_INLINE const AMFFloatVector4D  AMF_STD_CALL AMFVariantGetFloatVector4D(const AMFVariantStruct* _variant) { return (_variant)->floatVector4DValue; }
+-    static AMF_INLINE const AMFRate        AMF_STD_CALL AMFVariantGetRate (const AMFVariantStruct* _variant) { return (_variant)->rateValue; }
+-    static AMF_INLINE const AMFRatio       AMF_STD_CALL AMFVariantGetRatio(const AMFVariantStruct* _variant) { return (_variant)->ratioValue; }
+-    static AMF_INLINE const AMFColor       AMF_STD_CALL AMFVariantGetColor(const AMFVariantStruct* _variant) { return (_variant)->colorValue; }
++    static AMF_INLINE AMFRect        AMF_STD_CALL AMFVariantGetRect (const AMFVariantStruct* _variant) { return (_variant)->rectValue; }
++    static AMF_INLINE AMFSize        AMF_STD_CALL AMFVariantGetSize (const AMFVariantStruct* _variant) { return (_variant)->sizeValue; }
++    static AMF_INLINE AMFPoint       AMF_STD_CALL AMFVariantGetPoint(const AMFVariantStruct* _variant) { return (_variant)->pointValue; }
++    static AMF_INLINE AMFFloatSize  AMF_STD_CALL AMFVariantGetFloatSize(const AMFVariantStruct* _variant) { return (_variant)->floatSizeValue; }
++    static AMF_INLINE AMFFloatPoint2D  AMF_STD_CALL AMFVariantGetFloatPoint2D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint2DValue; }
++    static AMF_INLINE AMFFloatPoint3D  AMF_STD_CALL AMFVariantGetFloatPoint3D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint3DValue; }
++    static AMF_INLINE AMFFloatVector4D  AMF_STD_CALL AMFVariantGetFloatVector4D(const AMFVariantStruct* _variant) { return (_variant)->floatVector4DValue; }
++    static AMF_INLINE AMFRate        AMF_STD_CALL AMFVariantGetRate (const AMFVariantStruct* _variant) { return (_variant)->rateValue; }
++    static AMF_INLINE AMFRatio       AMF_STD_CALL AMFVariantGetRatio(const AMFVariantStruct* _variant) { return (_variant)->ratioValue; }
++    static AMF_INLINE AMFColor       AMF_STD_CALL AMFVariantGetColor(const AMFVariantStruct* _variant) { return (_variant)->colorValue; }
+ #endif // #if defined(__cplusplus)
+ 
+ 
+-- 
+2.37.3.windows.1
+


=====================================
contrib/src/amf/0003-Define-AMFPRI-d-ud-x-64-using-the-standard-C-format-.patch
=====================================
@@ -0,0 +1,70 @@
+From 4069f86effdc36ba3f12d120212c8f077b96cdb0 Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <robux4 at videolabs.io>
+Date: Fri, 16 Feb 2024 07:50:03 +0100
+Subject: [PATCH 3/4] Define AMFPRI(d|ud|x)64 using the standard C++ format for
+ C+11 and up
+
+See https://en.cppreference.com/w/cpp/types/integer
+
+When compiled in C, it depends whether it's the Microsoft flavor or the standard C format. Not
+whether it's Win32 or not. Clang or GCC use the proper string formats on windows.
+---
+ amf/public/include/core/Platform.h | 29 ++++++++++++++++++++---------
+ 1 file changed, 20 insertions(+), 9 deletions(-)
+
+diff --git a/amf/public/include/core/Platform.h b/amf/public/include/core/Platform.h
+index 12ee75c..d6496d4 100644
+--- a/amf/public/include/core/Platform.h
++++ b/amf/public/include/core/Platform.h
+@@ -118,12 +118,6 @@ typedef signed int HRESULT;
+ #endif
+     #define AMF_NO_VTABLE           __declspec(novtable)
+ 
+-    #define AMFPRId64   "I64d"
+-
+-    #define AMFPRIud64   "Iu64d"
+-
+-    #define AMFPRIx64   "I64x"
+-
+ #else // !WIN32 - Linux and Mac
+ 
+     #define AMF_STD_CALL
+@@ -138,15 +132,32 @@ typedef signed int HRESULT;
+ #endif
+     #define AMF_NO_VTABLE
+ 
++#endif // WIN32
++
++#if defined(__cplusplus) && (__cplusplus >= 201103L)
++    #include <cinttypes>
++    #define AMFPRId64   PRId64
++
++    #define AMFPRIud64  PRIu64
++
++    #define AMFPRIx64   PRIx64
++#else
++#if defined(_MSC_VER)
++    #define AMFPRId64   "I64d"
++
++    #define AMFPRIud64  "Iu64d"
++
++    #define AMFPRIx64   "I64x"
++#else
+     #if !defined(AMFPRId64)
+         #define AMFPRId64    "lld"
+ 
+-        #define AMFPRIud64    "ulld"
++        #define AMFPRIud64   "ulld"
+ 
+         #define AMFPRIx64    "llx"
+     #endif
+-
+-#endif // WIN32
++#endif
++#endif
+ 
+ #define LPRId64   AMF_UNICODE(AMFPRId64)
+ #define LPRIud64  AMF_UNICODE(AMFPRIud64)
+-- 
+2.37.3.windows.1
+


=====================================
contrib/src/amf/rules.mak
=====================================
@@ -1,10 +1,10 @@
 # AMF
 
-AMF_VERSION := 1.4.30
+AMF_VERSION := 1.4.33
 AMF_URL := $(GITHUB)/GPUOpen-LibrariesAndSDKs/AMF/archive/refs/tags/v$(AMF_VERSION).tar.gz
 AMF_GITURL := $(GITHUB)/GPUOpen-LibrariesAndSDKs/AMF.git
 AMF_BRANCH := v$(AMF_VERSION)
-AMF_GITVERSION := a118570647cfa579af8875c3955a314c3ddd7058
+AMF_GITVERSION := e8c7cd7c10d4e05c1913aa8dfd2be9f9dbdb03d6
 
 ifeq ($(ARCH),x86_64)
 ifdef HAVE_WIN32
@@ -37,6 +37,14 @@ $(TARBALLS)/AMF-$(AMF_GITVERSION).tar.xz:
 # amf: AMF-$(AMF_VERSION).tar.gz .sum-amf
 amf: AMF-$(AMF_GITVERSION).tar.xz .sum-amf
 	$(UNPACK)
+	$(APPLY) $(SRC)/amf/0001-Move-AMF_UNICODE-into-Platform.h.patch
+	$(APPLY) $(SRC)/amf/0002-Define-LPRI-d-ud-x-64-as-Unicode-wide-versions-of-AM.patch
+	$(APPLY) $(SRC)/amf/0003-Define-AMFPRI-d-ud-x-64-using-the-standard-C-format-.patch
+	$(APPLY) $(SRC)/amf/0001-Don-t-cast-amf_int64-when-using-a-format-string.patch
+	$(APPLY) $(SRC)/amf/0001-Differentiate-the-AMF_NO_VTABLE-based-on-the-compile.patch
+	$(APPLY) $(SRC)/amf/0001-Fix-const-on-return-by-value-AMF_DECLARE_IID.patch
+	$(APPLY) $(SRC)/amf/0002-Fix-const-on-return-by-value-Variant-values.patch
+	$(APPLY) $(SRC)/amf/0001-Fix-warning-when-_MSC_VER-is-not-defined.patch
 	$(MOVE)
 
 .amf: amf


=====================================
modules/hw/amf/amf_helper.c
=====================================
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+// amf_helper.c: AMD Advanced Media Framework helper
+// Copyright © 2024 VideoLabs, VLC authors and VideoLAN
+
+// Authors: Steve Lhomme <robux4 at videolabs.io>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "amf_helper.h"
+
+#include <vlc_common.h>
+
+int vlc_AMFCreateContext(struct vlc_amf_context *c)
+{
+#ifdef _WIN32
+# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+    HMODULE hLib = LoadLibraryA(AMF_DLL_NAMEA);
+    if (hLib == NULL)
+        return VLC_ENOTSUP;
+
+    amf_uint64 version = 0;
+    AMF_RESULT res;
+    AMFQueryVersion_Fn queryVersion = (AMFQueryVersion_Fn)GetProcAddress(hLib, AMF_QUERY_VERSION_FUNCTION_NAME);
+    if (unlikely(queryVersion == NULL))
+        goto error;
+    res = queryVersion(&version);
+    if (unlikely(res != AMF_OK))
+        goto error;
+
+    c->pFactory = NULL;
+    c->Context = NULL;
+
+    AMFInit_Fn init = (AMFInit_Fn)GetProcAddress(hLib, AMF_INIT_FUNCTION_NAME);
+    res = init(version, &c->pFactory);
+    if (unlikely(res != AMF_OK))
+        goto error;
+
+    res = c->pFactory->pVtbl->CreateContext(c->pFactory, &c->Context);
+    if (res != AMF_OK || c->Context == NULL)
+        goto error;
+
+    c->Private = hLib;
+    return VLC_SUCCESS;
+
+error:
+    FreeLibrary(hLib);
+    return VLC_ENOTSUP;
+
+# else // !WINAPI_PARTITION_DESKTOP
+    // we can't load external DLLs in UWP
+    return VLC_ENOTSUP;
+# endif // !WINAPI_PARTITION_DESKTOP
+
+#else
+    return NULL; // TODO
+#endif
+}
+
+void vlc_AMFReleaseContext(struct vlc_amf_context *c)
+{
+    c->Context->pVtbl->Terminate(c->Context);
+    c->Context->pVtbl->Release(c->Context);
+#ifdef _WIN32
+    FreeLibrary(c->Private);
+#endif
+}


=====================================
modules/hw/amf/amf_helper.h
=====================================
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+// amf_helper.h: AMD Advanced Media Framework helper
+// Copyright © 2024 VideoLabs, VLC authors and VideoLAN
+
+// Authors: Steve Lhomme <robux4 at videolabs.io>
+
+#ifndef VLC_AMF_HELPER_H
+#define VLC_AMF_HELPER_H
+
+#include <AMF/core/Context.h>
+#include <AMF/core/Factory.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct vlc_amf_context
+{
+#ifdef __cplusplus
+    amf::AMFFactory *pFactory;
+    amf::AMFContext *Context;
+#else
+    AMFFactory      *pFactory;
+    AMFContext      *Context;
+#endif
+    void            *Private;
+};
+
+int vlc_AMFCreateContext(struct vlc_amf_context *);
+void vlc_AMFReleaseContext(struct vlc_amf_context *);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // VLC_AMF_HELPER_H


=====================================
modules/video_output/Makefile.am
=====================================
@@ -223,6 +223,9 @@ endif
 if HAVE_NVDEC
 libdirect3d11_plugin_la_SOURCES += hw/nvdec/nvdec_fmt.h
 endif
+if HAVE_AMF_SCALER
+libdirect3d11_plugin_la_SOURCES += hw/amf/amf_helper.c hw/amf/amf_helper.h
+endif
 libdirect3d11_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(voutdir)'
 vout_LTLIBRARIES += $(LTLIBdirect3d11)
 EXTRA_LTLIBRARIES += libdirect3d11_plugin.la


=====================================
modules/video_output/win32/d3d11_scaler.cpp
=====================================
@@ -15,6 +15,24 @@
 #include <vlc_common.h>
 
 #include "d3d11_scaler.h"
+#ifdef HAVE_AMF_SCALER
+#include "../../hw/amf/amf_helper.h"
+#include <AMF/components/HQScaler.h>
+
+amf::AMF_SURFACE_FORMAT DXGIToAMF(DXGI_FORMAT fmt)
+{
+    switch (fmt)
+    {
+        case DXGI_FORMAT_NV12: return amf::AMF_SURFACE_NV12;
+        case DXGI_FORMAT_P010: return amf::AMF_SURFACE_P010;
+        case DXGI_FORMAT_P016: return amf::AMF_SURFACE_P016;
+        case DXGI_FORMAT_B8G8R8A8_UNORM: return amf::AMF_SURFACE_BGRA;
+        case DXGI_FORMAT_R8G8B8A8_UNORM: return amf::AMF_SURFACE_RGBA;
+        case DXGI_FORMAT_R10G10B10A2_UNORM: return amf::AMF_SURFACE_R10G10B10A2;
+        default: return amf::AMF_SURFACE_UNKNOWN;
+    }
+}
+#endif
 
 #include <new>
 #include <wrl/client.h>
@@ -35,6 +53,13 @@ struct d3d11_scaler
     ComPtr<ID3D11VideoProcessor>            processor;
     ComPtr<ID3D11VideoProcessorOutputView>  outputView;
     ID3D11ShaderResourceView                *SRVs[DXGI_MAX_SHADER_VIEW] = {};
+#ifdef HAVE_AMF_SCALER
+    vlc_amf_context                 amf = {};
+    amf::AMFComponent               *amf_scaler = nullptr;
+    amf::AMFSurface                 *amfInput = nullptr;
+    ComPtr<ID3D11Texture2D>         amfStaging;
+    d3d11_device_t                  *d3d_dev = nullptr;
+#endif
 };
 
 static const d3d_format_t *GetDirectRenderingFormat(vlc_object_t *vd, d3d11_device_t *d3d_dev, vlc_fourcc_t i_src_chroma)
@@ -47,7 +72,17 @@ static const d3d_format_t *GetDirectRenderingFormat(vlc_object_t *vd, d3d11_devi
 d3d11_scaler *D3D11_UpscalerCreate(vlc_object_t *vd, d3d11_device_t *d3d_dev, vlc_fourcc_t i_chroma,
                                    bool super_res, const d3d_format_t **out_fmt)
 {
+    if ((*out_fmt)->formatTexture == DXGI_FORMAT_UNKNOWN)
+    {
+        msg_Warn(vd, "chroma upscale of %4.4s not supported", (char*)&i_chroma);
+        return nullptr;
+    }
+
     bool canProcess = !super_res;
+#ifdef HAVE_AMF_SCALER
+    struct vlc_amf_context amf = {};
+    amf::AMFComponent *amf_scaler = nullptr;
+#endif
     // NVIDIA 530+ driver
     if (d3d_dev->adapterDesc.VendorId == GPU_MANUFACTURER_NVIDIA &&
         (d3d_dev->WDDM.revision * 10000 + d3d_dev->WDDM.build) > 153000)
@@ -60,20 +95,43 @@ d3d11_scaler *D3D11_UpscalerCreate(vlc_object_t *vd, d3d11_device_t *d3d_dev, vl
         // TODO refine which GPU and drivers can do it
         canProcess = true;
     }
+#ifdef HAVE_AMF_SCALER
+    else if (d3d_dev->adapterDesc.VendorId == GPU_MANUFACTURER_AMD && !canProcess)
+    {
+        int res = vlc_AMFCreateContext(&amf);
+        if (res == VLC_SUCCESS)
+        {
+            AMF_RESULT res = amf.pFactory->CreateComponent(amf.Context, AMFHQScaler, &amf_scaler);
+            if (res == AMF_OK && amf_scaler)
+            {
+                res = amf.Context->InitDX11(d3d_dev->d3ddevice);
+                canProcess = res == AMF_OK;
+            }
+        }
+    }
+#endif
 
+    d3d11_scaler *scaleProc = nullptr;
+    const d3d_format_t *fmt = nullptr;
     if (!canProcess)
     {
         msg_Err(vd, "Super Resolution filter not supported");
-        return nullptr;
+        goto error;
     }
 
-    if ((*out_fmt)->formatTexture == DXGI_FORMAT_UNKNOWN)
+#ifdef HAVE_AMF_SCALER
+    if (amf_scaler != nullptr)
     {
-        msg_Warn(vd, "chroma upscale of %4.4s not supported", (char*)&i_chroma);
-        return nullptr;
+        auto amf_fmt = DXGIToAMF((*out_fmt)->formatTexture);
+        if (amf_fmt == amf::AMF_SURFACE_UNKNOWN)
+        {
+            msg_Warn(vd, "upscale of DXGI %s not supported", DxgiFormatToStr((*out_fmt)->formatTexture));
+            goto error;
+        }
+        fmt = *out_fmt;
     }
-    const d3d_format_t *fmt = nullptr;
-    if ((*out_fmt)->bitsPerChannel > 10)
+#endif
+    if (fmt == nullptr && (*out_fmt)->bitsPerChannel > 10)
         fmt = GetDirectRenderingFormat(vd, d3d_dev, VLC_CODEC_RGBA64);
     if (fmt == nullptr && (*out_fmt)->bitsPerChannel > 8)
         fmt = GetDirectRenderingFormat(vd, d3d_dev, VLC_CODEC_RGBA10LE);
@@ -84,13 +142,23 @@ d3d11_scaler *D3D11_UpscalerCreate(vlc_object_t *vd, d3d11_device_t *d3d_dev, vl
     if (fmt == nullptr || fmt->formatTexture == DXGI_FORMAT_UNKNOWN)
     {
         msg_Warn(vd, "chroma upscale of %4.4s not supported", (char*)&i_chroma);
-        return nullptr;
+        goto error;
     }
 
-    d3d11_scaler *scaleProc = new (std::nothrow) d3d11_scaler;
+    scaleProc = new (std::nothrow) d3d11_scaler;
     if (unlikely(scaleProc == nullptr))
-        return nullptr;
+        goto error;
 
+#ifdef HAVE_AMF_SCALER
+    if (amf_scaler != nullptr)
+    {
+        scaleProc->amf = amf;
+        scaleProc->amf_scaler = amf_scaler;
+        scaleProc->d3d_dev = d3d_dev;
+    }
+    else
+    {
+#endif
     HRESULT hr;
     hr = d3d_dev->d3ddevice->QueryInterface(IID_GRAPHICS_PPV_ARGS(&scaleProc->d3dviddev));
     if (unlikely(FAILED(hr)))
@@ -105,12 +173,21 @@ d3d11_scaler *D3D11_UpscalerCreate(vlc_object_t *vd, d3d11_device_t *d3d_dev, vl
         msg_Err(vd, "Could not Query ID3D11VideoContext Interface. (hr=0x%lX)", hr);
         goto error;
     }
+#ifdef HAVE_AMF_SCALER
+    }
+#endif
 
     scaleProc->d3d_fmt = fmt;
     scaleProc->super_res = super_res;
     *out_fmt = scaleProc->d3d_fmt;
     return scaleProc;
 error:
+#ifdef HAVE_AMF_SCALER
+    if (amf_scaler)
+        amf_scaler->Release();
+    if (amf.Context)
+        vlc_AMFReleaseContext(&amf);
+#endif
     delete scaleProc;
     return nullptr;
 }
@@ -163,6 +240,9 @@ int D3D11_UpscalerUpdate(vlc_object_t *vd, d3d11_scaler *scaleProc, d3d11_device
 
     scaleProc->usable = false;
 
+#ifdef HAVE_AMF_SCALER
+    if (!scaleProc->amf_scaler)
+#endif
     if (scaleProc->enumerator.Get() == nullptr)
     {
         d3d11_device_lock(d3d_dev);
@@ -207,7 +287,6 @@ int D3D11_UpscalerUpdate(vlc_object_t *vd, d3d11_scaler *scaleProc, d3d11_device
         ZeroMemory(&texDesc, sizeof(texDesc));
         texDesc.MipLevels = 1;
         texDesc.SampleDesc.Count = 1;
-        texDesc.MiscFlags = 0;
         texDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
         texDesc.Usage = D3D11_USAGE_DEFAULT;
         texDesc.CPUAccessFlags = 0;
@@ -215,6 +294,11 @@ int D3D11_UpscalerUpdate(vlc_object_t *vd, d3d11_scaler *scaleProc, d3d11_device
         texDesc.Format = scaleProc->d3d_fmt->formatTexture;
         texDesc.Width = scaleProc->Width;
         texDesc.Height = scaleProc->Height;
+        texDesc.MiscFlags = 0;
+#ifdef HAVE_AMF_SCALER
+        if (scaleProc->amf_scaler)
+            texDesc.MiscFlags |= D3D11_RESOURCE_MISC_SHARED;
+#endif
         hr = d3d_dev->d3ddevice->CreateTexture2D(&texDesc, nullptr, upscaled.GetAddressOf());
         if (FAILED(hr))
         {
@@ -226,6 +310,37 @@ int D3D11_UpscalerUpdate(vlc_object_t *vd, d3d11_scaler *scaleProc, d3d11_device
         outDesc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2D;
         outDesc.Texture2D.MipSlice = 0;
 
+#ifdef HAVE_AMF_SCALER
+        if (scaleProc->amf_scaler)
+        {
+            AMF_RESULT res;
+
+            if (scaleProc->amfInput != nullptr)
+            {
+                scaleProc->amfInput->Release();
+                scaleProc->amfInput = nullptr;
+            }
+
+            texDesc.Width  = fmt->i_x_offset + fmt->i_visible_width;
+            texDesc.Height = fmt->i_y_offset + fmt->i_visible_height;
+            hr = d3d_dev->d3ddevice->CreateTexture2D(&texDesc, nullptr, scaleProc->amfStaging.ReleaseAndGetAddressOf());
+            if (FAILED(hr))
+            {
+                msg_Err(vd, "Failed to create the staging texture. (hr=0x%lX)", hr);
+                goto done_super;
+            }
+            res = scaleProc->amf.Context->CreateSurfaceFromDX11Native(scaleProc->amfStaging.Get(),
+                                                                      &scaleProc->amfInput,
+                                                                      nullptr);
+            if (unlikely(res != AMF_OK || scaleProc->amfInput == nullptr))
+            {
+                msg_Err(vd, "Failed to wrap D3D11 output texture. %d", res);
+                goto done_super;
+            }
+        }
+        else
+        {
+#endif
         hr = scaleProc->d3dviddev->CreateVideoProcessorOutputView(
                                                                 upscaled.Get(),
                                                                 scaleProc->enumerator.Get(),
@@ -236,6 +351,9 @@ int D3D11_UpscalerUpdate(vlc_object_t *vd, d3d11_scaler *scaleProc, d3d11_device
             msg_Dbg(vd,"Failed to create processor output. (hr=0x%lX)", hr);
             goto done_super;
         }
+#ifdef HAVE_AMF_SCALER
+        }
+#endif
 
         ReleaseSRVs(scaleProc);
         _upscaled[0] = upscaled.Get();
@@ -247,6 +365,29 @@ int D3D11_UpscalerUpdate(vlc_object_t *vd, d3d11_scaler *scaleProc, d3d11_device
             goto done_super;
     }
 
+#ifdef HAVE_AMF_SCALER
+    if (scaleProc->amf_scaler)
+    {
+        AMF_RESULT res;
+        res = scaleProc->amf_scaler->SetProperty(AMF_HQ_SCALER_OUTPUT_SIZE, ::AMFConstructSize(out_width, out_height));
+        res = scaleProc->amf_scaler->SetProperty(AMF_HQ_SCALER_ENGINE_TYPE, amf::AMF_MEMORY_DX11);
+        res = scaleProc->amf_scaler->SetProperty(AMF_HQ_SCALER_ALGORITHM, AMF_HQ_SCALER_ALGORITHM_VIDEOSR1_0);
+        res = scaleProc->amf_scaler->SetProperty(AMF_HQ_SCALER_FROM_SRGB, 0);
+        res = scaleProc->amf_scaler->SetProperty(AMF_HQ_SCALER_SHARPNESS, 0.5);
+        res = scaleProc->amf_scaler->SetProperty(AMF_HQ_SCALER_FILL, 1);
+        AMFColor black{0,0,0,255};
+        res = scaleProc->amf_scaler->SetProperty(AMF_HQ_SCALER_FILL_COLOR, black);
+        // res = scaleProc->amf_scaler->SetProperty(AMF_HQ_SCALER_FRAME_RATE, oFrameRate);
+        auto amf_fmt = DXGIToAMF(scaleProc->d3d_fmt->formatTexture);
+        res = scaleProc->amf_scaler->Init(amf_fmt,
+            fmt->i_x_offset + fmt->i_visible_width,
+            fmt->i_y_offset + fmt->i_visible_height);
+        if (res != AMF_OK)
+            return false;
+    }
+    else
+    {
+#endif
     RECT srcRect;
     srcRect.left   = fmt->i_x_offset;
     srcRect.top    = fmt->i_y_offset;
@@ -365,6 +506,9 @@ int D3D11_UpscalerUpdate(vlc_object_t *vd, d3d11_scaler *scaleProc, d3d11_device
         }
     }
     d3d11_device_unlock(d3d_dev);
+#ifdef HAVE_AMF_SCALER
+    }
+#endif
 
     if (scaleProc->upscaling != upscale)
     {
@@ -384,6 +528,20 @@ done_super:
 void D3D11_UpscalerDestroy(d3d11_scaler *scaleProc)
 {
     ReleaseSRVs(scaleProc);
+#ifdef HAVE_AMF_SCALER
+    if (scaleProc->amfInput != nullptr)
+    {
+        scaleProc->amfInput->Release();
+        scaleProc->amfInput = nullptr;
+    }
+    if (scaleProc->amf_scaler)
+    {
+        scaleProc->amf_scaler->Terminate();
+        scaleProc->amf_scaler->Release();
+    }
+    if (scaleProc->amf.Context)
+        vlc_AMFReleaseContext(&scaleProc->amf);
+#endif
     delete scaleProc;
 }
 
@@ -420,6 +578,62 @@ int D3D11_UpscalerScale(vlc_object_t *vd, d3d11_scaler *scaleProc, picture_sys_d
 {
     HRESULT hr;
 
+#ifdef HAVE_AMF_SCALER
+    if (scaleProc->amf_scaler)
+    {
+        AMF_RESULT res;
+        amf::AMFSurface *submitSurface;
+
+        D3D11_TEXTURE2D_DESC texDesc;
+        p_sys->texture[0]->GetDesc(&texDesc);
+        // copy source into staging as it may not be shared
+        d3d11_device_lock( scaleProc->d3d_dev );
+        scaleProc->d3d_dev->d3dcontext->CopySubresourceRegion(scaleProc->amfStaging.Get(),
+                                                0,
+                                                0, 0, 0,
+                                                p_sys->resource[KNOWN_DXGI_INDEX],
+                                                p_sys->slice_index,
+                                                NULL);
+        d3d11_device_unlock( scaleProc->d3d_dev );
+        submitSurface = scaleProc->amfInput;
+
+        res = scaleProc->amf_scaler->SubmitInput(submitSurface);
+        if (res == AMF_INPUT_FULL)
+        {
+            msg_Dbg(vd, "scaler input full, skip this frame");
+            return VLC_SUCCESS;
+        }
+        if (res != AMF_OK)
+            return VLC_EGENERIC;
+
+        amf::AMFData *amfOutput = nullptr;
+        res = scaleProc->amf_scaler->QueryOutput(&amfOutput);
+        if (res != AMF_OK)
+            return VLC_EGENERIC;
+
+        assert(amfOutput->GetMemoryType() == amf::AMF_MEMORY_DX11);
+        amf::AMFSurface *amfOutputSurface = reinterpret_cast<amf::AMFSurface*>(amfOutput);
+        auto packed = amfOutputSurface->GetPlane(amf::AMF_PLANE_PACKED);
+
+        ID3D11Texture2D *out = reinterpret_cast<ID3D11Texture2D *>(packed->GetNative());
+
+        ReleaseSRVs(scaleProc);
+        ID3D11Texture2D *_upscaled[DXGI_MAX_SHADER_VIEW];
+        _upscaled[0] = out;
+        _upscaled[1] = out;
+        _upscaled[2] = out;
+        _upscaled[3] = out;
+        if (D3D11_AllocateResourceView(vlc_object_logger(vd), scaleProc->d3d_dev->d3ddevice, scaleProc->d3d_fmt,
+                                    _upscaled, 0, scaleProc->SRVs) != VLC_SUCCESS)
+        {
+            return VLC_ENOTSUP;
+        }
+
+        amfOutput->Release();
+
+        return VLC_SUCCESS;
+    }
+#endif
     if (assert_ProcessorInput(vd, scaleProc, p_sys) != VLC_SUCCESS)
     {
         msg_Err(vd, "fail to create upscaler input");


=====================================
modules/video_output/win32/direct3d11.cpp
=====================================
@@ -212,6 +212,21 @@ static int UpdateDisplayFormat(vout_display_t *vd, const video_format_t *fmt)
     {
         D3D11_UpscalerUpdate(VLC_OBJECT(vd), sys->scaleProc, sys->d3d_dev,
                              vd->source, &sys->picQuad.quad_fmt, &vd->cfg->display);
+
+        if (D3D11_UpscalerUsed(sys->scaleProc))
+        {
+            D3D11_UpscalerGetSize(sys->scaleProc, &sys->picQuad.quad_fmt.i_width, &sys->picQuad.quad_fmt.i_height);
+
+            sys->picQuad.quad_fmt.i_x_offset       = 0;
+            sys->picQuad.quad_fmt.i_y_offset       = 0;
+            sys->picQuad.quad_fmt.i_visible_width  = sys->picQuad.quad_fmt.i_width;
+            sys->picQuad.quad_fmt.i_visible_height = sys->picQuad.quad_fmt.i_height;
+
+            sys->picQuad.generic.i_width = sys->picQuad.quad_fmt.i_width;
+            sys->picQuad.generic.i_height = sys->picQuad.quad_fmt.i_height;
+
+            CommonPlacePicture(vd, &sys->area);
+        }
     }
 
     display_info_t new_display = { };
@@ -1127,10 +1142,10 @@ static int Direct3D11CreateFormatResources(vout_display_t *vd, const video_forma
     }
 
     RECT source_rect;
-    source_rect.left   = fmt->i_x_offset;
-    source_rect.right  = fmt->i_x_offset + fmt->i_visible_width;
-    source_rect.top    = fmt->i_y_offset;
-    source_rect.bottom = fmt->i_y_offset + fmt->i_visible_height;
+    source_rect.left   = sys->picQuad.quad_fmt.i_x_offset;
+    source_rect.right  = sys->picQuad.quad_fmt.i_x_offset + sys->picQuad.quad_fmt.i_visible_width;
+    source_rect.top    = sys->picQuad.quad_fmt.i_y_offset;
+    source_rect.bottom = sys->picQuad.quad_fmt.i_y_offset + sys->picQuad.quad_fmt.i_visible_height;
     if (!D3D11_UpdateQuadPosition(vd, sys->d3d_dev, &sys->picQuad, &source_rect,
                                   video_format_GetTransform(sys->picQuad.quad_fmt.orientation, sys->display.orientation)))
     {


=====================================
modules/video_output/win32/direct3d9.c
=====================================
@@ -52,9 +52,7 @@
 
 #include <windows.h>
 #include <d3d9.h>
-#ifdef HAVE_D3DX9EFFECT_H
 #include <d3dx9effect.h>
-#endif
 #include "../../video_chroma/d3d9_fmt.h"
 #include <dxvahd.h>
 
@@ -657,7 +655,6 @@ static int Direct3D9CreateScene(vout_display_t *vd, const video_format_t *fmt)
     return VLC_SUCCESS;
 }
 
-#ifdef HAVE_D3DX9EFFECT_H
 static int Direct3D9CompileShader(vout_display_t *vd, const char *shader_source, size_t source_length)
 {
     vout_display_sys_t *sys = vd->sys;
@@ -711,9 +708,6 @@ static int Direct3D9CompileShader(vout_display_t *vd, const char *shader_source,
     }
     return VLC_SUCCESS;
 }
-#else
-# define Direct3D9CompileShader(a,b,c)  VLC_EGENERIC
-#endif
 
 #define MAX_SHADER_FILE_SIZE  (1024*1024)
 



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/a04b04197e0b7b4ff3c7f5a23af668373dc4c374...ffd3f0e70a1b61d9d919387fa14558c1d4bf7881

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/a04b04197e0b7b4ff3c7f5a23af668373dc4c374...ffd3f0e70a1b61d9d919387fa14558c1d4bf7881
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list