diff options
Diffstat (limited to 'recipes-multimedia/vpl/files/0004-Fix-rDRM-DMA-methods.patch')
-rw-r--r-- | recipes-multimedia/vpl/files/0004-Fix-rDRM-DMA-methods.patch | 294 |
1 files changed, 0 insertions, 294 deletions
diff --git a/recipes-multimedia/vpl/files/0004-Fix-rDRM-DMA-methods.patch b/recipes-multimedia/vpl/files/0004-Fix-rDRM-DMA-methods.patch deleted file mode 100644 index de746a95..00000000 --- a/recipes-multimedia/vpl/files/0004-Fix-rDRM-DMA-methods.patch +++ /dev/null | |||
@@ -1,294 +0,0 @@ | |||
1 | From 61f75283da56105adca1d3034422ddac2bc88c18 Mon Sep 17 00:00:00 2001 | ||
2 | From: Vincent Cheah Beng Keat <vincent.beng.keat.cheah@intel.com> | ||
3 | Date: Wed, 19 Jun 2024 21:08:14 +0800 | ||
4 | Subject: [PATCH 4/9] Fix rDRM DMA methods | ||
5 | |||
6 | Upstream-Status: Backport [https://github.com/intel/libvpl-tools/commit/0c12ef0fed3d2e8c8f017e6fa5bf74e55ec51412] | ||
7 | |||
8 | The commits also remove out libDRM intel bufmgr (i915) dependency | ||
9 | where XE does not have the equivalent API. Tested i915 for both | ||
10 | DRM_PRIME and KERNEL_DRM, both methods could work correctly. | ||
11 | |||
12 | Signed-off-by: Lim Siew Hoon <siew.hoon.lim@intel.com> | ||
13 | --- | ||
14 | .../sample_common/include/vaapi_utils.h | 2 + | ||
15 | .../sample_common/include/vaapi_utils_drm.h | 2 + | ||
16 | .../legacy/sample_common/src/vaapi_utils.cpp | 3 +- | ||
17 | .../sample_common/src/vaapi_utils_drm.cpp | 159 ++++++++++-------- | ||
18 | 4 files changed, 93 insertions(+), 73 deletions(-) | ||
19 | |||
20 | diff --git a/tools/legacy/sample_common/include/vaapi_utils.h b/tools/legacy/sample_common/include/vaapi_utils.h | ||
21 | index a3a8544..868dd0e 100644 | ||
22 | --- a/tools/legacy/sample_common/include/vaapi_utils.h | ||
23 | +++ b/tools/legacy/sample_common/include/vaapi_utils.h | ||
24 | @@ -281,6 +281,7 @@ public: | ||
25 | typedef drm_intel_bufmgr* (*drm_intel_bufmgr_gem_init_type)(int fd, int batch_size); | ||
26 | typedef int (*drm_intel_bo_gem_export_to_prime_type)(drm_intel_bo*, int*); | ||
27 | typedef void (*drm_intel_bufmgr_destroy_type)(drm_intel_bufmgr*); | ||
28 | + typedef int (*drmPrimeFDToHandle_type)(int fd, int prime_fd, uint32_t* handle); | ||
29 | |||
30 | DrmIntel_Proxy(); | ||
31 | ~DrmIntel_Proxy(); | ||
32 | @@ -290,6 +291,7 @@ public: | ||
33 | __DECLARE(drm_intel_bo_unreference); | ||
34 | __DECLARE(drm_intel_bufmgr_gem_init); | ||
35 | __DECLARE(drm_intel_bufmgr_destroy); | ||
36 | + __DECLARE(drmPrimeFDToHandle); | ||
37 | #if defined(X11_DRI3_SUPPORT) | ||
38 | __DECLARE(drm_intel_bo_gem_export_to_prime); | ||
39 | #endif | ||
40 | diff --git a/tools/legacy/sample_common/include/vaapi_utils_drm.h b/tools/legacy/sample_common/include/vaapi_utils_drm.h | ||
41 | index 78109aa..1ba6ea8 100644 | ||
42 | --- a/tools/legacy/sample_common/include/vaapi_utils_drm.h | ||
43 | +++ b/tools/legacy/sample_common/include/vaapi_utils_drm.h | ||
44 | @@ -130,6 +130,8 @@ private: | ||
45 | mfxExtContentLightLevelInfo* contentLight, | ||
46 | bool enableHDR); | ||
47 | |||
48 | + uint32_t convertVaFourccToDrmFormat(uint32_t vaFourcc); | ||
49 | + | ||
50 | const MfxLoader::DRM_Proxy m_drmlib; | ||
51 | const MfxLoader::DrmIntel_Proxy m_drmintellib; | ||
52 | |||
53 | diff --git a/tools/legacy/sample_common/src/vaapi_utils.cpp b/tools/legacy/sample_common/src/vaapi_utils.cpp | ||
54 | index f01b07f..48a51b0 100644 | ||
55 | --- a/tools/legacy/sample_common/src/vaapi_utils.cpp | ||
56 | +++ b/tools/legacy/sample_common/src/vaapi_utils.cpp | ||
57 | @@ -136,7 +136,8 @@ DrmIntel_Proxy::DrmIntel_Proxy() | ||
58 | SIMPLE_LOADER_FUNCTION(drm_intel_bo_gem_create_from_prime), | ||
59 | SIMPLE_LOADER_FUNCTION(drm_intel_bo_unreference), | ||
60 | SIMPLE_LOADER_FUNCTION(drm_intel_bufmgr_gem_init), | ||
61 | - SIMPLE_LOADER_FUNCTION(drm_intel_bufmgr_destroy) | ||
62 | + SIMPLE_LOADER_FUNCTION(drm_intel_bufmgr_destroy), | ||
63 | + SIMPLE_LOADER_FUNCTION(drmPrimeFDToHandle) | ||
64 | #if defined(X11_DRI3_SUPPORT) | ||
65 | , | ||
66 | SIMPLE_LOADER_FUNCTION(drm_intel_bo_gem_export_to_prime) | ||
67 | diff --git a/tools/legacy/sample_common/src/vaapi_utils_drm.cpp b/tools/legacy/sample_common/src/vaapi_utils_drm.cpp | ||
68 | index 7227588..44bc693 100644 | ||
69 | --- a/tools/legacy/sample_common/src/vaapi_utils_drm.cpp | ||
70 | +++ b/tools/legacy/sample_common/src/vaapi_utils_drm.cpp | ||
71 | @@ -14,6 +14,7 @@ | ||
72 | #include <stdexcept> | ||
73 | |||
74 | #include <drm_fourcc.h> | ||
75 | + #include <xf86drm.h> | ||
76 | #include "i915_drm.h" | ||
77 | #include "vaapi_utils_drm.h" | ||
78 | |||
79 | @@ -211,7 +212,6 @@ drmRenderer::drmRenderer(int fd, mfxI32 monitorType) | ||
80 | m_crtc(), | ||
81 | m_connectorProperties(), | ||
82 | m_crtcProperties(), | ||
83 | - m_bufmgr(NULL), | ||
84 | m_overlay_wrn(true), | ||
85 | m_bSentHDR(false), | ||
86 | m_bHdrSupport(false), | ||
87 | @@ -257,11 +257,6 @@ drmRenderer::~drmRenderer() { | ||
88 | m_drmlib.drmModeFreeCrtc(m_crtc); | ||
89 | m_drmlib.drmModeFreeObjectProperties(m_connectorProperties); | ||
90 | m_drmlib.drmModeFreeObjectProperties(m_crtcProperties); | ||
91 | - | ||
92 | - if (m_bufmgr) { | ||
93 | - m_drmintellib.drm_intel_bufmgr_destroy(m_bufmgr); | ||
94 | - m_bufmgr = NULL; | ||
95 | - } | ||
96 | } | ||
97 | |||
98 | drmModeObjectPropertiesPtr drmRenderer::getProperties(int fd, int objectId, int32_t objectTypeId) { | ||
99 | @@ -752,36 +747,75 @@ int drmRenderer::drmSendHdrMetaData(mfxExtMasteringDisplayColourVolume* displayC | ||
100 | return 0; | ||
101 | } | ||
102 | |||
103 | +uint32_t drmRenderer::convertVaFourccToDrmFormat(uint32_t vaFourcc) { | ||
104 | + switch (vaFourcc) { | ||
105 | + case VA_FOURCC_ARGB: | ||
106 | + return DRM_FORMAT_ARGB8888; | ||
107 | + case VA_FOURCC_NV12: | ||
108 | + return DRM_FORMAT_NV12; | ||
109 | + #if defined(DRM_LINUX_P010_SUPPORT) | ||
110 | + case VA_FOURCC_P010: | ||
111 | + return DRM_FORMAT_P010; | ||
112 | + #endif | ||
113 | + | ||
114 | + default: | ||
115 | + printf("unsupported fourcc\n"); | ||
116 | + return 0; | ||
117 | + } | ||
118 | +} | ||
119 | + | ||
120 | void* drmRenderer::acquire(mfxMemId mid) { | ||
121 | - vaapiMemId* vmid = (vaapiMemId*)mid; | ||
122 | + vaapiMemId* vmid = (vaapiMemId*)mid; | ||
123 | + | ||
124 | uint32_t fbhandle = 0; | ||
125 | + uint32_t handles[4], pitches[4], offsets[4], flags = 0; | ||
126 | + uint64_t modifiers[4]; | ||
127 | + int ret; | ||
128 | + | ||
129 | + MSDK_ZERO_MEMORY(handles); | ||
130 | + MSDK_ZERO_MEMORY(pitches); | ||
131 | + MSDK_ZERO_MEMORY(offsets); | ||
132 | + MSDK_ZERO_MEMORY(modifiers); | ||
133 | |||
134 | if (vmid->m_buffer_info.mem_type == VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME) { | ||
135 | - if (!m_bufmgr) { | ||
136 | - m_bufmgr = m_drmintellib.drm_intel_bufmgr_gem_init(m_fd, 4096); | ||
137 | - if (!m_bufmgr) | ||
138 | - return NULL; | ||
139 | - } | ||
140 | + uint32_t bo_handle; | ||
141 | |||
142 | - drm_intel_bo* bo = | ||
143 | - m_drmintellib.drm_intel_bo_gem_create_from_prime(m_bufmgr, | ||
144 | - (int)vmid->m_buffer_info.handle, | ||
145 | - vmid->m_buffer_info.mem_size); | ||
146 | - if (!bo) | ||
147 | + ret = m_drmintellib.drmPrimeFDToHandle(m_fd, (int)vmid->m_buffer_info.handle, &bo_handle); | ||
148 | + if (ret) | ||
149 | return NULL; | ||
150 | |||
151 | - int ret = m_drmlib.drmModeAddFB(m_fd, | ||
152 | - vmid->m_image.width, | ||
153 | - vmid->m_image.height, | ||
154 | - 24, | ||
155 | - 32, | ||
156 | - vmid->m_image.pitches[0], | ||
157 | - bo->handle, | ||
158 | - &fbhandle); | ||
159 | - if (ret) { | ||
160 | - return NULL; | ||
161 | + for (uint32_t i = 0; i < vmid->m_image.num_planes; i++) { | ||
162 | + pitches[i] = vmid->m_image.pitches[i]; | ||
163 | + offsets[i] = vmid->m_image.offsets[i]; | ||
164 | + handles[i] = bo_handle; | ||
165 | + | ||
166 | + if (VA_FOURCC_NV12 == vmid->m_fourcc | ||
167 | + #if defined(DRM_LINUX_P010_SUPPORT) | ||
168 | + || VA_FOURCC_P010 == vmid->m_fourcc | ||
169 | + #endif | ||
170 | + ) { | ||
171 | + flags = DRM_MODE_FB_MODIFIERS; | ||
172 | + modifiers[i] = I915_FORMAT_MOD_Y_TILED; | ||
173 | + if (m_bRequiredTiled4) { | ||
174 | + #if defined(DRM_LINUX_MODIFIER_TILED4_SUPPORT) | ||
175 | + modifiers[i] = I915_FORMAT_MOD_4_TILED; | ||
176 | + #endif | ||
177 | + } | ||
178 | + } | ||
179 | } | ||
180 | - m_drmintellib.drm_intel_bo_unreference(bo); | ||
181 | + | ||
182 | + ret = m_drmlib.drmModeAddFB2WithModifiers(m_fd, | ||
183 | + vmid->m_image.width, | ||
184 | + vmid->m_image.height, | ||
185 | + convertVaFourccToDrmFormat(vmid->m_fourcc), | ||
186 | + handles, | ||
187 | + pitches, | ||
188 | + offsets, | ||
189 | + modifiers, | ||
190 | + &fbhandle, | ||
191 | + flags); | ||
192 | + if (ret) | ||
193 | + return NULL; | ||
194 | } | ||
195 | else if (vmid->m_buffer_info.mem_type == VA_SURFACE_ATTRIB_MEM_TYPE_KERNEL_DRM) { | ||
196 | struct drm_gem_open flink_open; | ||
197 | @@ -793,62 +827,42 @@ void* drmRenderer::acquire(mfxMemId mid) { | ||
198 | if (ret) | ||
199 | return NULL; | ||
200 | |||
201 | - uint32_t handles[4], pitches[4], offsets[4], pixel_format, flags = 0; | ||
202 | - uint64_t modifiers[4]; | ||
203 | - | ||
204 | - memset(&handles, 0, sizeof(handles)); | ||
205 | - memset(&pitches, 0, sizeof(pitches)); | ||
206 | - memset(&offsets, 0, sizeof(offsets)); | ||
207 | - memset(&modifiers, 0, sizeof(modifiers)); | ||
208 | - | ||
209 | - handles[0] = flink_open.handle; | ||
210 | - pitches[0] = vmid->m_image.pitches[0]; | ||
211 | - offsets[0] = vmid->m_image.offsets[0]; | ||
212 | + for (uint32_t i = 0; i < vmid->m_image.num_planes; i++) { | ||
213 | + pitches[i] = vmid->m_image.pitches[i]; | ||
214 | + offsets[i] = vmid->m_image.offsets[i]; | ||
215 | + handles[i] = flink_open.handle; | ||
216 | |||
217 | - if (VA_FOURCC_NV12 == vmid->m_fourcc | ||
218 | + if (VA_FOURCC_NV12 == vmid->m_fourcc | ||
219 | #if defined(DRM_LINUX_P010_SUPPORT) | ||
220 | - || VA_FOURCC_P010 == vmid->m_fourcc | ||
221 | + || VA_FOURCC_P010 == vmid->m_fourcc | ||
222 | #endif | ||
223 | - ) { | ||
224 | - pixel_format = DRM_FORMAT_NV12; | ||
225 | - #if defined(DRM_LINUX_P010_SUPPORT) | ||
226 | - if (VA_FOURCC_P010 == vmid->m_fourcc) | ||
227 | - pixel_format = DRM_FORMAT_P010; | ||
228 | - #endif | ||
229 | - handles[1] = flink_open.handle; | ||
230 | - pitches[1] = vmid->m_image.pitches[1]; | ||
231 | - offsets[1] = vmid->m_image.offsets[1]; | ||
232 | - modifiers[0] = modifiers[1] = I915_FORMAT_MOD_Y_TILED; | ||
233 | - flags = DRM_MODE_FB_MODIFIERS; | ||
234 | - | ||
235 | - if (m_bRequiredTiled4) { | ||
236 | + ) { | ||
237 | + flags = DRM_MODE_FB_MODIFIERS; | ||
238 | + modifiers[i] = I915_FORMAT_MOD_Y_TILED; | ||
239 | + if (m_bRequiredTiled4) { | ||
240 | #if defined(DRM_LINUX_MODIFIER_TILED4_SUPPORT) | ||
241 | - modifiers[0] = modifiers[1] = I915_FORMAT_MOD_4_TILED; | ||
242 | + modifiers[i] = I915_FORMAT_MOD_4_TILED; | ||
243 | #endif | ||
244 | - } | ||
245 | - else { | ||
246 | - modifiers[0] = modifiers[1] = I915_FORMAT_MOD_Y_TILED; | ||
247 | - | ||
248 | - struct drm_i915_gem_set_tiling set_tiling; | ||
249 | - memset(&set_tiling, 0, sizeof(set_tiling)); | ||
250 | - set_tiling.handle = flink_open.handle; | ||
251 | - set_tiling.tiling_mode = I915_TILING_Y; | ||
252 | - set_tiling.stride = vmid->m_image.pitches[0]; | ||
253 | - ret = m_drmlib.drmIoctl(m_fd, DRM_IOCTL_I915_GEM_SET_TILING, &set_tiling); | ||
254 | - if (ret) { | ||
255 | - printf("DRM_IOCTL_I915_GEM_SET_TILING Failed ret = %d\n", ret); | ||
256 | - return NULL; | ||
257 | + } | ||
258 | + else { | ||
259 | + struct drm_i915_gem_set_tiling set_tiling; | ||
260 | + memset(&set_tiling, 0, sizeof(set_tiling)); | ||
261 | + set_tiling.handle = flink_open.handle; | ||
262 | + set_tiling.tiling_mode = I915_TILING_Y; | ||
263 | + set_tiling.stride = vmid->m_image.pitches[0]; | ||
264 | + ret = m_drmlib.drmIoctl(m_fd, DRM_IOCTL_I915_GEM_SET_TILING, &set_tiling); | ||
265 | + if (ret) { | ||
266 | + printf("DRM_IOCTL_I915_GEM_SET_TILING Failed ret = %d\n", ret); | ||
267 | + return NULL; | ||
268 | + } | ||
269 | } | ||
270 | } | ||
271 | } | ||
272 | - else { | ||
273 | - pixel_format = DRM_FORMAT_XRGB8888; | ||
274 | - } | ||
275 | |||
276 | ret = m_drmlib.drmModeAddFB2WithModifiers(m_fd, | ||
277 | vmid->m_image.width, | ||
278 | vmid->m_image.height, | ||
279 | - pixel_format, | ||
280 | + convertVaFourccToDrmFormat(vmid->m_fourcc), | ||
281 | handles, | ||
282 | pitches, | ||
283 | offsets, | ||
284 | @@ -905,6 +919,7 @@ mfxStatus drmRenderer::render(mfxFrameSurface1* pSurface) { | ||
285 | if (!setMaster()) { | ||
286 | return MFX_ERR_UNKNOWN; | ||
287 | } | ||
288 | + | ||
289 | if ((m_mode.hdisplay == memid->m_image.width) && (m_mode.vdisplay == memid->m_image.height)) { | ||
290 | // surface in the framebuffer exactly matches crtc scanout port, so we | ||
291 | // can scanout from this framebuffer for the whole crtc | ||
292 | -- | ||
293 | 2.43.2 | ||
294 | |||