1 | /* $Id: VBoxDXVideo.cpp 102505 2023-12-06 14:48:31Z vboxsync $ */
|
---|
2 | /** @file
|
---|
3 | * VirtualBox D3D user mode driver.
|
---|
4 | */
|
---|
5 |
|
---|
6 | /*
|
---|
7 | * Copyright (C) 2023 Oracle and/or its affiliates.
|
---|
8 | *
|
---|
9 | * This file is part of VirtualBox base platform packages, as
|
---|
10 | * available from https://www.virtualbox.org.
|
---|
11 | *
|
---|
12 | * This program is free software; you can redistribute it and/or
|
---|
13 | * modify it under the terms of the GNU General Public License
|
---|
14 | * as published by the Free Software Foundation, in version 3 of the
|
---|
15 | * License.
|
---|
16 | *
|
---|
17 | * This program is distributed in the hope that it will be useful, but
|
---|
18 | * WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
---|
20 | * General Public License for more details.
|
---|
21 | *
|
---|
22 | * You should have received a copy of the GNU General Public License
|
---|
23 | * along with this program; if not, see <https://www.gnu.org/licenses>.
|
---|
24 | *
|
---|
25 | * SPDX-License-Identifier: GPL-3.0-only
|
---|
26 | */
|
---|
27 |
|
---|
28 | #include <iprt/alloc.h>
|
---|
29 | #include <iprt/errcore.h>
|
---|
30 | #include <iprt/thread.h>
|
---|
31 | #include <VBox/log.h>
|
---|
32 |
|
---|
33 | #include <iprt/win/windows.h>
|
---|
34 | #include <iprt/win/d3dkmthk.h>
|
---|
35 |
|
---|
36 | #include <d3d10umddi.h>
|
---|
37 |
|
---|
38 | #include "VBoxDX.h"
|
---|
39 | #include "VBoxDXCmd.h"
|
---|
40 |
|
---|
41 |
|
---|
42 | static void vboxDXDestroyVideoDeviceAllocation(PVBOXDX_DEVICE pDevice)
|
---|
43 | {
|
---|
44 | if (pDevice->VideoDevice.hAllocation)
|
---|
45 | {
|
---|
46 | D3DDDICB_DEALLOCATE ddiDeallocate;
|
---|
47 | RT_ZERO(ddiDeallocate);
|
---|
48 | ddiDeallocate.NumAllocations = 1;
|
---|
49 | ddiDeallocate.HandleList = &pDevice->VideoDevice.hAllocation;
|
---|
50 |
|
---|
51 | HRESULT hr = pDevice->pRTCallbacks->pfnDeallocateCb(pDevice->hRTDevice.handle, &ddiDeallocate);
|
---|
52 | LogFlowFunc(("pfnDeallocateCb returned %d", hr));
|
---|
53 | AssertStmt(SUCCEEDED(hr), vboxDXDeviceSetError(pDevice, hr));
|
---|
54 |
|
---|
55 | pDevice->VideoDevice.hAllocation = 0;
|
---|
56 | pDevice->VideoDevice.cbAllocation = 0;
|
---|
57 | }
|
---|
58 | }
|
---|
59 |
|
---|
60 |
|
---|
61 | static bool vboxDXCreateVideoDeviceAllocation(PVBOXDX_DEVICE pDevice, uint32_t cbAllocation)
|
---|
62 | {
|
---|
63 | VBOXDXALLOCATIONDESC desc;
|
---|
64 | RT_ZERO(desc);
|
---|
65 | desc.enmAllocationType = VBOXDXALLOCATIONTYPE_CO; /* Context Object allocation. */
|
---|
66 | desc.cbAllocation = cbAllocation;
|
---|
67 |
|
---|
68 | D3DDDI_ALLOCATIONINFO2 ddiAllocationInfo;
|
---|
69 | RT_ZERO(ddiAllocationInfo);
|
---|
70 | ddiAllocationInfo.pPrivateDriverData = &desc;
|
---|
71 | ddiAllocationInfo.PrivateDriverDataSize = sizeof(desc);
|
---|
72 |
|
---|
73 | D3DDDICB_ALLOCATE ddiAllocate;
|
---|
74 | RT_ZERO(ddiAllocate);
|
---|
75 | ddiAllocate.NumAllocations = 1;
|
---|
76 | ddiAllocate.pAllocationInfo2 = &ddiAllocationInfo;
|
---|
77 |
|
---|
78 | HRESULT hr = pDevice->pRTCallbacks->pfnAllocateCb(pDevice->hRTDevice.handle, &ddiAllocate);
|
---|
79 | LogFlowFunc(("pfnAllocateCb returned %d, hKMResource 0x%X, hAllocation 0x%X", hr, ddiAllocate.hKMResource, ddiAllocationInfo.hAllocation));
|
---|
80 | AssertReturnStmt(SUCCEEDED(hr), vboxDXDeviceSetError(pDevice, hr), false);
|
---|
81 |
|
---|
82 | pDevice->VideoDevice.hAllocation = ddiAllocationInfo.hAllocation;
|
---|
83 | pDevice->VideoDevice.cbAllocation = cbAllocation;
|
---|
84 |
|
---|
85 | D3DDDICB_LOCK ddiLock;
|
---|
86 | RT_ZERO(ddiLock);
|
---|
87 | ddiLock.hAllocation = ddiAllocationInfo.hAllocation;
|
---|
88 | ddiLock.Flags.WriteOnly = 1;
|
---|
89 | hr = pDevice->pRTCallbacks->pfnLockCb(pDevice->hRTDevice.handle, &ddiLock);
|
---|
90 | if (SUCCEEDED(hr))
|
---|
91 | {
|
---|
92 | memset(ddiLock.pData, 0, cbAllocation);
|
---|
93 |
|
---|
94 | D3DDDICB_UNLOCK ddiUnlock;
|
---|
95 | ddiUnlock.NumAllocations = 1;
|
---|
96 | ddiUnlock.phAllocations = &ddiAllocationInfo.hAllocation;
|
---|
97 | hr = pDevice->pRTCallbacks->pfnUnlockCb(pDevice->hRTDevice.handle, &ddiUnlock);
|
---|
98 | }
|
---|
99 | AssertReturnStmt(SUCCEEDED(hr),
|
---|
100 | vboxDXDestroyVideoDeviceAllocation(pDevice); vboxDXDeviceSetError(pDevice, hr), false);
|
---|
101 | return true;
|
---|
102 | }
|
---|
103 |
|
---|
104 |
|
---|
105 | static bool vboxDXEnsureVideoDeviceAllocation(PVBOXDX_DEVICE pDevice)
|
---|
106 | {
|
---|
107 | if (!pDevice->VideoDevice.hAllocation)
|
---|
108 | return vboxDXCreateVideoDeviceAllocation(pDevice, _64K);
|
---|
109 | return true;
|
---|
110 | }
|
---|
111 |
|
---|
112 |
|
---|
113 | static void vboxDXQueryVideoCapability(PVBOXDX_DEVICE pDevice, VBSVGA3dVideoCapability cap,
|
---|
114 | void const *pvDataIn, uint32_t cbDataIn,
|
---|
115 | void **ppvDataOut, uint32_t *pcbDataOut)
|
---|
116 | {
|
---|
117 | bool fSuccess = vboxDXEnsureVideoDeviceAllocation(pDevice);
|
---|
118 | if (!fSuccess)
|
---|
119 | return;
|
---|
120 |
|
---|
121 | uint32 const offsetInBytes = 0;
|
---|
122 | uint32 const sizeInBytes = pDevice->VideoDevice.cbAllocation - offsetInBytes;
|
---|
123 | AssertReturnVoid(cbDataIn <= sizeInBytes - RT_UOFFSETOF(VBSVGA3dVideoCapabilityMobLayout, data));
|
---|
124 |
|
---|
125 | if (cbDataIn)
|
---|
126 | {
|
---|
127 | D3DDDICB_LOCK ddiLock;
|
---|
128 | RT_ZERO(ddiLock);
|
---|
129 | ddiLock.hAllocation = pDevice->VideoDevice.hAllocation;
|
---|
130 | ddiLock.Flags.ReadOnly = 1;
|
---|
131 | HRESULT hr = pDevice->pRTCallbacks->pfnLockCb(pDevice->hRTDevice.handle, &ddiLock);
|
---|
132 | if (SUCCEEDED(hr))
|
---|
133 | {
|
---|
134 | VBSVGA3dVideoCapabilityMobLayout *pCap = (VBSVGA3dVideoCapabilityMobLayout *)ddiLock.pData;
|
---|
135 | memcpy(&pCap->data, pvDataIn, cbDataIn);
|
---|
136 |
|
---|
137 | D3DDDICB_UNLOCK ddiUnlock;
|
---|
138 | ddiUnlock.NumAllocations = 1;
|
---|
139 | ddiUnlock.phAllocations = &pDevice->VideoDevice.hAllocation;
|
---|
140 | hr = pDevice->pRTCallbacks->pfnUnlockCb(pDevice->hRTDevice.handle, &ddiUnlock);
|
---|
141 | }
|
---|
142 | AssertReturnVoidStmt(SUCCEEDED(hr), vboxDXDeviceSetError(pDevice, hr));
|
---|
143 | }
|
---|
144 |
|
---|
145 | uint64_t const fenceValue = ASMAtomicIncU64(&pDevice->VideoDevice.u64MobFenceValue);
|
---|
146 | vgpu10GetVideoCapability(pDevice, cap, pDevice->VideoDevice.hAllocation, offsetInBytes, sizeInBytes, fenceValue);
|
---|
147 | vboxDXDeviceFlushCommands(pDevice);
|
---|
148 |
|
---|
149 | /** @todo Time limit? */
|
---|
150 | bool fDone = false;
|
---|
151 | for (;;)
|
---|
152 | {
|
---|
153 | RTThreadYield();
|
---|
154 |
|
---|
155 | D3DDDICB_LOCK ddiLock;
|
---|
156 | RT_ZERO(ddiLock);
|
---|
157 | ddiLock.hAllocation = pDevice->VideoDevice.hAllocation;
|
---|
158 | ddiLock.Flags.ReadOnly = 1;
|
---|
159 | HRESULT hr = pDevice->pRTCallbacks->pfnLockCb(pDevice->hRTDevice.handle, &ddiLock);
|
---|
160 | if (SUCCEEDED(hr))
|
---|
161 | {
|
---|
162 | VBSVGA3dVideoCapabilityMobLayout const *pCap = (VBSVGA3dVideoCapabilityMobLayout *)ddiLock.pData;
|
---|
163 | if (pCap->fenceValue >= fenceValue)
|
---|
164 | {
|
---|
165 | if (pCap->cbDataOut > 0)
|
---|
166 | {
|
---|
167 | void *pvData = RTMemAlloc(pCap->cbDataOut);
|
---|
168 | if (pvData)
|
---|
169 | {
|
---|
170 | memcpy(pvData, &pCap->data, pCap->cbDataOut);
|
---|
171 | *ppvDataOut = pvData;
|
---|
172 | *pcbDataOut = pCap->cbDataOut;
|
---|
173 | }
|
---|
174 | else
|
---|
175 | vboxDXDeviceSetError(pDevice, E_OUTOFMEMORY);
|
---|
176 | }
|
---|
177 |
|
---|
178 | fDone = true;
|
---|
179 | }
|
---|
180 |
|
---|
181 | D3DDDICB_UNLOCK ddiUnlock;
|
---|
182 | ddiUnlock.NumAllocations = 1;
|
---|
183 | ddiUnlock.phAllocations = &pDevice->VideoDevice.hAllocation;
|
---|
184 | hr = pDevice->pRTCallbacks->pfnUnlockCb(pDevice->hRTDevice.handle, &ddiUnlock);
|
---|
185 | }
|
---|
186 | AssertReturnVoidStmt(SUCCEEDED(hr), vboxDXDeviceSetError(pDevice, hr));
|
---|
187 |
|
---|
188 | if (fDone)
|
---|
189 | break;
|
---|
190 | }
|
---|
191 | }
|
---|
192 |
|
---|
193 |
|
---|
194 | static void vboxDXQueryVideoDecodeProfiles(PVBOXDX_DEVICE pDevice)
|
---|
195 | {
|
---|
196 | RTMemFree(pDevice->VideoDevice.paDecodeProfile);
|
---|
197 | pDevice->VideoDevice.cDecodeProfile = 0;
|
---|
198 |
|
---|
199 | /* On failure the pDevice->VideoDevice.cDecodeProfile value is 0, i.e. no decoding. */
|
---|
200 | pDevice->VideoDevice.fDecodeProfilesQueried = true;
|
---|
201 |
|
---|
202 | void *pvDataOut = 0;
|
---|
203 | uint32_t cbDataOut = 0;
|
---|
204 | vboxDXQueryVideoCapability(pDevice, VBSVGA3D_VIDEO_CAPABILITY_DECODE_PROFILE,
|
---|
205 | NULL, 0, &pvDataOut, &cbDataOut);
|
---|
206 | if (pvDataOut)
|
---|
207 | {
|
---|
208 | pDevice->VideoDevice.cDecodeProfile = cbDataOut / sizeof(VBSVGA3dDecodeProfileInfo);
|
---|
209 | pDevice->VideoDevice.paDecodeProfile = (VBSVGA3dDecodeProfileInfo *)pvDataOut;
|
---|
210 | }
|
---|
211 | }
|
---|
212 |
|
---|
213 |
|
---|
214 | static void vboxDXQueryVideoDecodeConfig(PVBOXDX_DEVICE pDevice, VBSVGA3dVideoDecoderDesc const &desc)
|
---|
215 | {
|
---|
216 | RTMemFree(pDevice->VideoDevice.config.pConfigInfo);
|
---|
217 | pDevice->VideoDevice.config.cConfig = 0;
|
---|
218 |
|
---|
219 | void *pvDataOut = 0;
|
---|
220 | uint32_t cbDataOut = 0;
|
---|
221 | vboxDXQueryVideoCapability(pDevice, VBSVGA3D_VIDEO_CAPABILITY_DECODE_CONFIG,
|
---|
222 | &desc, sizeof(desc), &pvDataOut, &cbDataOut);
|
---|
223 | if (pvDataOut)
|
---|
224 | {
|
---|
225 | AssertReturnVoidStmt(cbDataOut >= sizeof(desc), RTMemFree(pvDataOut));
|
---|
226 |
|
---|
227 | VBSVGA3dDecodeConfigInfo *pConfigInfo = (VBSVGA3dDecodeConfigInfo *)pvDataOut;
|
---|
228 | pDevice->VideoDevice.config.pConfigInfo = pConfigInfo;
|
---|
229 | pDevice->VideoDevice.config.cConfig = (cbDataOut - sizeof(pConfigInfo->desc)) / sizeof(pConfigInfo->aConfig[0]);
|
---|
230 | }
|
---|
231 | }
|
---|
232 |
|
---|
233 |
|
---|
234 | static void vboxDXQueryVideoProcessorEnumInfo(PVBOXDX_DEVICE pDevice, VBSVGA3dVideoProcessorDesc const &desc)
|
---|
235 | {
|
---|
236 | void *pvDataOut = 0;
|
---|
237 | uint32_t cbDataOut = 0;
|
---|
238 | vboxDXQueryVideoCapability(pDevice, VBSVGA3D_VIDEO_CAPABILITY_PROCESSOR_ENUM,
|
---|
239 | &desc, sizeof(desc), &pvDataOut, &cbDataOut);
|
---|
240 | if (pvDataOut)
|
---|
241 | {
|
---|
242 | AssertReturnVoidStmt(cbDataOut >= sizeof(VBSVGA3dProcessorEnumInfo), RTMemFree(pvDataOut));
|
---|
243 |
|
---|
244 | VBSVGA3dProcessorEnumInfo *pInfo = (VBSVGA3dProcessorEnumInfo *)pvDataOut;
|
---|
245 | pDevice->VideoDevice.videoProcessorEnum.desc = desc;
|
---|
246 | pDevice->VideoDevice.videoProcessorEnum.info = pInfo->info;
|
---|
247 |
|
---|
248 | RTMemFree(pvDataOut);
|
---|
249 | }
|
---|
250 | }
|
---|
251 |
|
---|
252 |
|
---|
253 | void vboxDXGetVideoDecoderProfileCount(PVBOXDX_DEVICE pDevice, UINT *pDecodeProfileCount)
|
---|
254 | {
|
---|
255 | if (!pDevice->VideoDevice.fDecodeProfilesQueried)
|
---|
256 | vboxDXQueryVideoDecodeProfiles(pDevice);
|
---|
257 |
|
---|
258 | *pDecodeProfileCount = pDevice->VideoDevice.cDecodeProfile;
|
---|
259 | }
|
---|
260 |
|
---|
261 |
|
---|
262 | void vboxDXGetVideoDecoderProfile(PVBOXDX_DEVICE pDevice, UINT Index, GUID *pGuid)
|
---|
263 | {
|
---|
264 | if (!pDevice->VideoDevice.fDecodeProfilesQueried)
|
---|
265 | vboxDXQueryVideoDecodeProfiles(pDevice);
|
---|
266 |
|
---|
267 | *pGuid = *(GUID *)&pDevice->VideoDevice.paDecodeProfile[Index].DecodeProfile;
|
---|
268 | }
|
---|
269 |
|
---|
270 |
|
---|
271 | void vboxDXCheckVideoDecoderFormat(PVBOXDX_DEVICE pDevice, GUID const *pDecodeProfile, DXGI_FORMAT Format, BOOL *pSupported)
|
---|
272 | {
|
---|
273 | if (!pDevice->VideoDevice.fDecodeProfilesQueried)
|
---|
274 | vboxDXQueryVideoDecodeProfiles(pDevice);
|
---|
275 |
|
---|
276 | for (unsigned i = 0; i < pDevice->VideoDevice.cDecodeProfile; ++i)
|
---|
277 | {
|
---|
278 | VBSVGA3dDecodeProfileInfo const *s = &pDevice->VideoDevice.paDecodeProfile[i];
|
---|
279 | if (memcmp(&s->DecodeProfile, pDecodeProfile, sizeof(s->DecodeProfile)) == 0)
|
---|
280 | {
|
---|
281 | switch (Format)
|
---|
282 | {
|
---|
283 | case DXGI_FORMAT_AYUV: *pSupported = RT_BOOL(s->fAYUV); break;
|
---|
284 | case DXGI_FORMAT_NV12: *pSupported = RT_BOOL(s->fNV12); break;
|
---|
285 | case DXGI_FORMAT_420_OPAQUE: *pSupported = RT_BOOL(s->fNV12); break;
|
---|
286 | case DXGI_FORMAT_YUY2: *pSupported = RT_BOOL(s->fYUY2); break;
|
---|
287 | default: *pSupported = false;
|
---|
288 | }
|
---|
289 | break;
|
---|
290 | }
|
---|
291 | }
|
---|
292 | }
|
---|
293 |
|
---|
294 |
|
---|
295 | static void vboxDXVideoDecoderDescToSvga(VBSVGA3dVideoDecoderDesc *pSvgaDecoderDesc, D3D11_1DDI_VIDEO_DECODER_DESC const &Desc)
|
---|
296 | {
|
---|
297 | memcpy(&pSvgaDecoderDesc->DecodeProfile, &Desc.Guid, sizeof(VBSVGA3dGuid));
|
---|
298 | pSvgaDecoderDesc->SampleWidth = Desc.SampleWidth;
|
---|
299 | pSvgaDecoderDesc->SampleHeight = Desc.SampleHeight;
|
---|
300 | pSvgaDecoderDesc->OutputFormat = vboxDXDxgiToSvgaFormat(Desc.OutputFormat);
|
---|
301 | }
|
---|
302 |
|
---|
303 |
|
---|
304 | void vboxDXGetVideoDecoderConfigCount(PVBOXDX_DEVICE pDevice, D3D11_1DDI_VIDEO_DECODER_DESC const *pDecodeDesc, UINT *pConfigCount)
|
---|
305 | {
|
---|
306 | VBSVGA3dVideoDecoderDesc svgaDesc;
|
---|
307 | vboxDXVideoDecoderDescToSvga(&svgaDesc, *pDecodeDesc);
|
---|
308 |
|
---|
309 | if ( !pDevice->VideoDevice.config.pConfigInfo
|
---|
310 | || memcmp(&svgaDesc, &pDevice->VideoDevice.config.pConfigInfo->desc, sizeof(VBSVGA3dVideoDecoderDesc)) != 0)
|
---|
311 | vboxDXQueryVideoDecodeConfig(pDevice, svgaDesc);
|
---|
312 |
|
---|
313 | *pConfigCount = pDevice->VideoDevice.config.cConfig;
|
---|
314 | }
|
---|
315 |
|
---|
316 |
|
---|
317 | void vboxDXGetVideoDecoderConfig(PVBOXDX_DEVICE pDevice, D3D11_1DDI_VIDEO_DECODER_DESC const *pDecodeDesc, UINT Index,
|
---|
318 | D3D11_1DDI_VIDEO_DECODER_CONFIG *pConfig)
|
---|
319 | {
|
---|
320 | VBSVGA3dVideoDecoderDesc svgaDesc;
|
---|
321 | vboxDXVideoDecoderDescToSvga(&svgaDesc, *pDecodeDesc);
|
---|
322 |
|
---|
323 | if ( !pDevice->VideoDevice.config.pConfigInfo
|
---|
324 | || memcmp(&svgaDesc, &pDevice->VideoDevice.config.pConfigInfo->desc, sizeof(VBSVGA3dVideoDecoderDesc)) != 0)
|
---|
325 | vboxDXQueryVideoDecodeConfig(pDevice, svgaDesc);
|
---|
326 |
|
---|
327 | AssertReturnVoidStmt(Index <= pDevice->VideoDevice.config.cConfig, vboxDXDeviceSetError(pDevice, E_INVALIDARG));
|
---|
328 |
|
---|
329 | VBSVGA3dVideoDecoderConfig const *s = &pDevice->VideoDevice.config.pConfigInfo->aConfig[Index];
|
---|
330 | memcpy(&pConfig->guidConfigBitstreamEncryption, &s->guidConfigBitstreamEncryption, sizeof(GUID));
|
---|
331 | memcpy(&pConfig->guidConfigMBcontrolEncryption, &s->guidConfigMBcontrolEncryption, sizeof(GUID));
|
---|
332 | memcpy(&pConfig->guidConfigResidDiffEncryption, &s->guidConfigResidDiffEncryption, sizeof(GUID));
|
---|
333 | pConfig->ConfigBitstreamRaw = s->ConfigBitstreamRaw;
|
---|
334 | pConfig->ConfigMBcontrolRasterOrder = s->ConfigMBcontrolRasterOrder;
|
---|
335 | pConfig->ConfigResidDiffHost = s->ConfigResidDiffHost;
|
---|
336 | pConfig->ConfigSpatialResid8 = s->ConfigSpatialResid8;
|
---|
337 | pConfig->ConfigResid8Subtraction = s->ConfigResid8Subtraction;
|
---|
338 | pConfig->ConfigSpatialHost8or9Clipping = s->ConfigSpatialHost8or9Clipping;
|
---|
339 | pConfig->ConfigSpatialResidInterleaved = s->ConfigSpatialResidInterleaved;
|
---|
340 | pConfig->ConfigIntraResidUnsigned = s->ConfigIntraResidUnsigned;
|
---|
341 | pConfig->ConfigResidDiffAccelerator = s->ConfigResidDiffAccelerator;
|
---|
342 | pConfig->ConfigHostInverseScan = s->ConfigHostInverseScan;
|
---|
343 | pConfig->ConfigSpecificIDCT = s->ConfigSpecificIDCT;
|
---|
344 | pConfig->Config4GroupedCoefs = s->Config4GroupedCoefs;
|
---|
345 | pConfig->ConfigMinRenderTargetBuffCount = s->ConfigMinRenderTargetBuffCount;
|
---|
346 | pConfig->ConfigDecoderSpecific = s->ConfigDecoderSpecific;
|
---|
347 | }
|
---|
348 |
|
---|
349 |
|
---|
350 | HRESULT vboxDXCreateVideoProcessorEnum(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSORENUM pVideoProcessorEnum,
|
---|
351 | D3D11_1DDI_VIDEO_PROCESSOR_CONTENT_DESC const *pDesc)
|
---|
352 | {
|
---|
353 | RT_NOREF(pDevice);
|
---|
354 |
|
---|
355 | pVideoProcessorEnum->svga.desc.InputFrameFormat = pDesc->InputFrameFormat;
|
---|
356 | pVideoProcessorEnum->svga.desc.InputFrameRate.numerator = pDesc->InputFrameRate.Numerator;
|
---|
357 | pVideoProcessorEnum->svga.desc.InputFrameRate.denominator = pDesc->InputFrameRate.Denominator;
|
---|
358 | pVideoProcessorEnum->svga.desc.InputWidth = pDesc->InputWidth;
|
---|
359 | pVideoProcessorEnum->svga.desc.InputHeight = pDesc->InputHeight;
|
---|
360 | pVideoProcessorEnum->svga.desc.OutputFrameRate.numerator = pDesc->OutputFrameRate.Numerator;
|
---|
361 | pVideoProcessorEnum->svga.desc.OutputFrameRate.denominator = pDesc->OutputFrameRate.Denominator;
|
---|
362 | pVideoProcessorEnum->svga.desc.OutputWidth = pDesc->OutputWidth;
|
---|
363 | pVideoProcessorEnum->svga.desc.OutputHeight = pDesc->OutputHeight;
|
---|
364 | pVideoProcessorEnum->svga.desc.Usage = pDesc->Usage;
|
---|
365 | return S_OK;
|
---|
366 | }
|
---|
367 |
|
---|
368 |
|
---|
369 | void vboxDXCheckVideoProcessorFormat(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSORENUM pVideoProcessorEnum,
|
---|
370 | DXGI_FORMAT Format, UINT *pSupported)
|
---|
371 | {
|
---|
372 | if (memcmp(&pVideoProcessorEnum->svga.desc,
|
---|
373 | &pDevice->VideoDevice.videoProcessorEnum.desc, sizeof(pVideoProcessorEnum->svga.desc)) != 0)
|
---|
374 | vboxDXQueryVideoProcessorEnumInfo(pDevice, pVideoProcessorEnum->svga.desc);
|
---|
375 |
|
---|
376 | AssertCompile(D3D11_1DDI_VIDEO_PROCESSOR_FORMAT_SUPPORT_INPUT == VBSVGA3D_VP_FORMAT_SUPPORT_INPUT);
|
---|
377 | AssertCompile(D3D11_1DDI_VIDEO_PROCESSOR_FORMAT_SUPPORT_OUTPUT == VBSVGA3D_VP_FORMAT_SUPPORT_OUTPUT);
|
---|
378 | VBSVGA3dVideoProcessorEnumInfo const *pInfo = &pDevice->VideoDevice.videoProcessorEnum.info;
|
---|
379 | switch (Format)
|
---|
380 | {
|
---|
381 | case DXGI_FORMAT_R8_UNORM: *pSupported = pInfo->fR8_UNORM; break;
|
---|
382 | case DXGI_FORMAT_R16_UNORM: *pSupported = pInfo->fR16_UNORM; break;
|
---|
383 | case DXGI_FORMAT_NV12: *pSupported = pInfo->fNV12; break;
|
---|
384 | case DXGI_FORMAT_YUY2: *pSupported = pInfo->fYUY2; break;
|
---|
385 | case DXGI_FORMAT_R16G16B16A16_FLOAT: *pSupported = pInfo->fR16G16B16A16_FLOAT; break;
|
---|
386 | case DXGI_FORMAT_B8G8R8X8_UNORM: *pSupported = pInfo->fB8G8R8X8_UNORM; break;
|
---|
387 | case DXGI_FORMAT_B8G8R8A8_UNORM: *pSupported = pInfo->fB8G8R8A8_UNORM; break;
|
---|
388 | case DXGI_FORMAT_R8G8B8A8_UNORM: *pSupported = pInfo->fR8G8B8A8_UNORM; break;
|
---|
389 | case DXGI_FORMAT_R10G10B10A2_UNORM: *pSupported = pInfo->fR10G10B10A2_UNORM; break;
|
---|
390 | case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: *pSupported = pInfo->fR10G10B10_XR_BIAS_A2_UNORM; break;
|
---|
391 | case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: *pSupported = pInfo->fR8G8B8A8_UNORM_SRGB; break;
|
---|
392 | case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: *pSupported = pInfo->fB8G8R8A8_UNORM_SRGB; break;
|
---|
393 | default: *pSupported = 0;
|
---|
394 | }
|
---|
395 | }
|
---|
396 |
|
---|
397 |
|
---|
398 | void vboxDXGetVideoProcessorCaps(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSORENUM pVideoProcessorEnum,
|
---|
399 | D3D11_1DDI_VIDEO_PROCESSOR_CAPS *pCaps)
|
---|
400 | {
|
---|
401 | if (memcmp(&pVideoProcessorEnum->svga.desc,
|
---|
402 | &pDevice->VideoDevice.videoProcessorEnum.desc, sizeof(pVideoProcessorEnum->svga.desc)) != 0)
|
---|
403 | vboxDXQueryVideoProcessorEnumInfo(pDevice, pVideoProcessorEnum->svga.desc);
|
---|
404 |
|
---|
405 | VBSVGA3dVideoProcessorEnumInfo const *pInfo = &pDevice->VideoDevice.videoProcessorEnum.info;
|
---|
406 | pCaps->DeviceCaps = pInfo->Caps.DeviceCaps;
|
---|
407 | pCaps->FeatureCaps = pInfo->Caps.FeatureCaps;
|
---|
408 | pCaps->FilterCaps = pInfo->Caps.FilterCaps;
|
---|
409 | pCaps->InputFormatCaps = pInfo->Caps.InputFormatCaps;
|
---|
410 | pCaps->AutoStreamCaps = pInfo->Caps.AutoStreamCaps;
|
---|
411 | pCaps->StereoCaps = pInfo->Caps.StereoCaps;
|
---|
412 | pCaps->RateConversionCapsCount = RT_MIN(pInfo->Caps.RateConversionCapsCount, VBSVGA3D_MAX_VIDEO_RATE_CONVERSION_CAPS);
|
---|
413 | pCaps->MaxInputStreams = RT_MIN(pInfo->Caps.MaxInputStreams, VBSVGA3D_MAX_VIDEO_STREAMS);
|
---|
414 | pCaps->MaxStreamStates = RT_MIN(pInfo->Caps.MaxStreamStates, VBSVGA3D_MAX_VIDEO_STREAMS);
|
---|
415 | }
|
---|
416 |
|
---|
417 |
|
---|
418 | void vboxDXGetVideoProcessorRateConversionCaps(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSORENUM pVideoProcessorEnum,
|
---|
419 | D3D11_1DDI_VIDEO_PROCESSOR_RATE_CONVERSION_CAPS *pCaps)
|
---|
420 | {
|
---|
421 | if (memcmp(&pVideoProcessorEnum->svga.desc,
|
---|
422 | &pDevice->VideoDevice.videoProcessorEnum.desc, sizeof(pVideoProcessorEnum->svga.desc)) != 0)
|
---|
423 | vboxDXQueryVideoProcessorEnumInfo(pDevice, pVideoProcessorEnum->svga.desc);
|
---|
424 |
|
---|
425 | VBSVGA3dVideoProcessorEnumInfo const *pInfo = &pDevice->VideoDevice.videoProcessorEnum.info;
|
---|
426 | pCaps->PastFrames = pInfo->RateCaps.PastFrames;
|
---|
427 | pCaps->FutureFrames = pInfo->RateCaps.FutureFrames;
|
---|
428 | pCaps->ConversionCaps = pInfo->RateCaps.ProcessorCaps;
|
---|
429 | pCaps->ITelecineCaps = pInfo->RateCaps.ITelecineCaps;
|
---|
430 | pCaps->CustomRateCount = RT_MIN(pInfo->RateCaps.CustomRateCount, VBSVGA3D_MAX_VIDEO_CUSTOM_RATE_CAPS);;
|
---|
431 | }
|
---|
432 |
|
---|
433 |
|
---|
434 | void vboxDXGetVideoProcessorCustomRate(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSORENUM pVideoProcessorEnum,
|
---|
435 | UINT CustomRateIndex, D3D11_1DDI_VIDEO_PROCESSOR_CUSTOM_RATE *pRate)
|
---|
436 | {
|
---|
437 | if (memcmp(&pVideoProcessorEnum->svga.desc,
|
---|
438 | &pDevice->VideoDevice.videoProcessorEnum.desc, sizeof(pVideoProcessorEnum->svga.desc)) != 0)
|
---|
439 | vboxDXQueryVideoProcessorEnumInfo(pDevice, pVideoProcessorEnum->svga.desc);
|
---|
440 |
|
---|
441 | VBSVGA3dVideoProcessorEnumInfo const *pInfo = &pDevice->VideoDevice.videoProcessorEnum.info;
|
---|
442 | VBSVGA3dVideoProcessorCustomRateCaps const *pCustomRateCaps = &pInfo->aCustomRateCaps[CustomRateIndex];
|
---|
443 | pRate->CustomRate.Numerator = pCustomRateCaps->CustomRate.numerator;
|
---|
444 | pRate->CustomRate.Denominator = pCustomRateCaps->CustomRate.denominator;
|
---|
445 | pRate->OutputFrames = pCustomRateCaps->OutputFrames;
|
---|
446 | pRate->InputInterlaced = RT_BOOL(pCustomRateCaps->InputInterlaced);
|
---|
447 | pRate->InputFramesOrFields = pCustomRateCaps->InputFramesOrFields;
|
---|
448 | }
|
---|
449 |
|
---|
450 |
|
---|
451 | void vboxDXGetVideoProcessorFilterRange(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSORENUM pVideoProcessorEnum,
|
---|
452 | D3D11_1DDI_VIDEO_PROCESSOR_FILTER Filter, D3D11_1DDI_VIDEO_PROCESSOR_FILTER_RANGE *pFilterRange)
|
---|
453 | {
|
---|
454 | if (memcmp(&pVideoProcessorEnum->svga.desc,
|
---|
455 | &pDevice->VideoDevice.videoProcessorEnum.desc, sizeof(pVideoProcessorEnum->svga.desc)) != 0)
|
---|
456 | vboxDXQueryVideoProcessorEnumInfo(pDevice, pVideoProcessorEnum->svga.desc);
|
---|
457 |
|
---|
458 | VBSVGA3dVideoProcessorEnumInfo const *pInfo = &pDevice->VideoDevice.videoProcessorEnum.info;
|
---|
459 | pFilterRange->Minimum = pInfo->aFilterRange[Filter].Minimum;
|
---|
460 | pFilterRange->Maximum = pInfo->aFilterRange[Filter].Maximum;
|
---|
461 | pFilterRange->Default = pInfo->aFilterRange[Filter].Default;
|
---|
462 | pFilterRange->Multiplier = pInfo->aFilterRange[Filter].Multiplier;
|
---|
463 | }
|
---|
464 |
|
---|
465 |
|
---|
466 | HRESULT vboxDXCreateVideoProcessor(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor,
|
---|
467 | PVBOXDXVIDEOPROCESSORENUM pVideoProcessorEnum, UINT RateConversionCapsIndex)
|
---|
468 | {
|
---|
469 | AssertReturnStmt(RateConversionCapsIndex < VBSVGA3D_MAX_VIDEO_RATE_CONVERSION_CAPS, vboxDXDeviceSetError(pDevice, E_INVALIDARG), E_INVALIDARG);
|
---|
470 |
|
---|
471 | int rc = RTHandleTableAlloc(pDevice->hHTVideoProcessor, pVideoProcessor, &pVideoProcessor->uVideoProcessorId);
|
---|
472 | AssertRCReturnStmt(rc, vboxDXDeviceSetError(pDevice, E_OUTOFMEMORY), E_OUTOFMEMORY);
|
---|
473 |
|
---|
474 | pVideoProcessor->svga.desc = pVideoProcessorEnum->svga.desc;
|
---|
475 |
|
---|
476 | vgpu10DefineVideoProcessor(pDevice, pVideoProcessor->uVideoProcessorId,
|
---|
477 | pVideoProcessor->svga.desc);
|
---|
478 | return S_OK;
|
---|
479 | }
|
---|
480 |
|
---|
481 |
|
---|
482 | HRESULT vboxDXCreateVideoDecoderOutputView(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEODECODEROUTPUTVIEW pVideoDecoderOutputView, PVBOXDX_RESOURCE pResource,
|
---|
483 | GUID const &DecodeProfile, UINT MipSlice, UINT FirstArraySlice, UINT ArraySize)
|
---|
484 | {
|
---|
485 | /* The host API does not have these parameters. */
|
---|
486 | RT_NOREF(MipSlice, ArraySize);
|
---|
487 | Assert(MipSlice == 0 && ArraySize == 1);
|
---|
488 |
|
---|
489 | int rc = RTHandleTableAlloc(pDevice->hHTVideoDecoderOutputView, pVideoDecoderOutputView, &pVideoDecoderOutputView->uVideoDecoderOutputViewId);
|
---|
490 | AssertRCReturnStmt(rc, vboxDXDeviceSetError(pDevice, E_OUTOFMEMORY), E_OUTOFMEMORY);
|
---|
491 |
|
---|
492 | pVideoDecoderOutputView->pResource = pResource;
|
---|
493 |
|
---|
494 | VBSVGA3dVDOVDesc *pDesc = &pVideoDecoderOutputView->svga.desc;
|
---|
495 | memcpy(&pDesc->DecodeProfile, &DecodeProfile, sizeof(pDesc->DecodeProfile));
|
---|
496 | pDesc->ViewDimension = VBSVGA3D_VDOV_DIMENSION_TEXTURE2D;
|
---|
497 | pDesc->Texture2D.ArraySlice = FirstArraySlice;
|
---|
498 |
|
---|
499 | vgpu10DefineVideoDecoderOutputView(pDevice, pVideoDecoderOutputView->uVideoDecoderOutputViewId,
|
---|
500 | vboxDXGetAllocation(pVideoDecoderOutputView->pResource),
|
---|
501 | pVideoDecoderOutputView->svga.desc);
|
---|
502 |
|
---|
503 | pVideoDecoderOutputView->fDefined = true;
|
---|
504 | RTListAppend(&pVideoDecoderOutputView->pResource->listVDOV, &pVideoDecoderOutputView->nodeView);
|
---|
505 | return S_OK;
|
---|
506 | }
|
---|
507 |
|
---|
508 |
|
---|
509 | HRESULT vboxDXCreateVideoDecoder(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEODECODER pVideoDecoder,
|
---|
510 | D3D11_1DDI_VIDEO_DECODER_DESC const &Desc,
|
---|
511 | D3D11_1DDI_VIDEO_DECODER_CONFIG const &Config)
|
---|
512 | {
|
---|
513 | int rc = RTHandleTableAlloc(pDevice->hHTVideoDecoder, pVideoDecoder, &pVideoDecoder->uVideoDecoderId);
|
---|
514 | AssertRCReturnStmt(rc, vboxDXDeviceSetError(pDevice, E_OUTOFMEMORY), E_OUTOFMEMORY);
|
---|
515 |
|
---|
516 | vboxDXVideoDecoderDescToSvga(&pVideoDecoder->svga.Desc, Desc);
|
---|
517 |
|
---|
518 | memcpy(&pVideoDecoder->svga.Config.guidConfigBitstreamEncryption, &Config.guidConfigBitstreamEncryption, sizeof(VBSVGA3dGuid));
|
---|
519 | memcpy(&pVideoDecoder->svga.Config.guidConfigMBcontrolEncryption, &Config.guidConfigMBcontrolEncryption, sizeof(VBSVGA3dGuid));
|
---|
520 | memcpy(&pVideoDecoder->svga.Config.guidConfigResidDiffEncryption, &Config.guidConfigResidDiffEncryption, sizeof(VBSVGA3dGuid));
|
---|
521 | pVideoDecoder->svga.Config.ConfigBitstreamRaw = Config.ConfigBitstreamRaw;
|
---|
522 | pVideoDecoder->svga.Config.ConfigMBcontrolRasterOrder = Config.ConfigMBcontrolRasterOrder;
|
---|
523 | pVideoDecoder->svga.Config.ConfigResidDiffHost = Config.ConfigResidDiffHost;
|
---|
524 | pVideoDecoder->svga.Config.ConfigSpatialResid8 = Config.ConfigSpatialResid8;
|
---|
525 | pVideoDecoder->svga.Config.ConfigResid8Subtraction = Config.ConfigResid8Subtraction;
|
---|
526 | pVideoDecoder->svga.Config.ConfigSpatialHost8or9Clipping = Config.ConfigSpatialHost8or9Clipping;
|
---|
527 | pVideoDecoder->svga.Config.ConfigSpatialResidInterleaved = Config.ConfigSpatialResidInterleaved;
|
---|
528 | pVideoDecoder->svga.Config.ConfigIntraResidUnsigned = Config.ConfigIntraResidUnsigned;
|
---|
529 | pVideoDecoder->svga.Config.ConfigResidDiffAccelerator = Config.ConfigResidDiffAccelerator;
|
---|
530 | pVideoDecoder->svga.Config.ConfigHostInverseScan = Config.ConfigHostInverseScan;
|
---|
531 | pVideoDecoder->svga.Config.ConfigSpecificIDCT = Config.ConfigSpecificIDCT;
|
---|
532 | pVideoDecoder->svga.Config.Config4GroupedCoefs = Config.Config4GroupedCoefs;
|
---|
533 | pVideoDecoder->svga.Config.ConfigMinRenderTargetBuffCount = Config.ConfigMinRenderTargetBuffCount;
|
---|
534 | pVideoDecoder->svga.Config.ConfigDecoderSpecific = Config.ConfigDecoderSpecific;
|
---|
535 |
|
---|
536 | vgpu10DefineVideoDecoder(pDevice, pVideoDecoder->uVideoDecoderId,
|
---|
537 | pVideoDecoder->svga.Desc, pVideoDecoder->svga.Config);
|
---|
538 | return S_OK;
|
---|
539 | }
|
---|
540 |
|
---|
541 |
|
---|
542 | HRESULT vboxDXVideoDecoderBeginFrame(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEODECODER pVideoDecoder,
|
---|
543 | PVBOXDXVIDEODECODEROUTPUTVIEW pVideoDecoderOutputView,
|
---|
544 | void const *pContentKey, UINT ContentKeySize)
|
---|
545 | {
|
---|
546 | RT_NOREF(pContentKey, ContentKeySize); /** @todo vgpu10VideoDecoderBeginFrame2 */
|
---|
547 |
|
---|
548 | vgpu10VideoDecoderBeginFrame(pDevice, pVideoDecoder->uVideoDecoderId,
|
---|
549 | pVideoDecoderOutputView->uVideoDecoderOutputViewId);
|
---|
550 | return S_OK;
|
---|
551 | }
|
---|
552 |
|
---|
553 |
|
---|
554 | HRESULT vboxDXVideoDecoderSubmitBuffers(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEODECODER pVideoDecoder,
|
---|
555 | UINT BufferCount, D3D11_1DDI_VIDEO_DECODER_BUFFER_DESC const *pBufferDesc)
|
---|
556 | {
|
---|
557 | void *pvTmpBuffer = RTMemTmpAlloc(BufferCount * (sizeof(D3DKMT_HANDLE) + sizeof(VBSVGA3dVideoDecoderBufferDesc)));
|
---|
558 | if (!pvTmpBuffer)
|
---|
559 | return E_OUTOFMEMORY;
|
---|
560 |
|
---|
561 | D3DKMT_HANDLE *pahAllocation = (D3DKMT_HANDLE *)pvTmpBuffer;
|
---|
562 | VBSVGA3dVideoDecoderBufferDesc *paBD = (VBSVGA3dVideoDecoderBufferDesc *)((uint8_t *)pvTmpBuffer + BufferCount * sizeof(D3DKMT_HANDLE));
|
---|
563 |
|
---|
564 | for (UINT i = 0; i < BufferCount; ++i)
|
---|
565 | {
|
---|
566 | D3D11_1DDI_VIDEO_DECODER_BUFFER_DESC const *s = &pBufferDesc[i];
|
---|
567 |
|
---|
568 | PVBOXDX_RESOURCE pBuffer = (PVBOXDX_RESOURCE)s->hResource.pDrvPrivate;
|
---|
569 | pahAllocation[i] = vboxDXGetAllocation(pBuffer);
|
---|
570 |
|
---|
571 | VBSVGA3dVideoDecoderBufferDesc *d = &paBD[i];
|
---|
572 | d->sidBuffer = SVGA3D_INVALID_ID;
|
---|
573 | switch(s->BufferType)
|
---|
574 | {
|
---|
575 | default:
|
---|
576 | case D3D11_1DDI_VIDEO_DECODER_BUFFER_UNKNOWN:
|
---|
577 | AssertFailedReturnStmt(RTMemTmpFree(pvTmpBuffer), E_INVALIDARG);
|
---|
578 | case D3D11_1DDI_VIDEO_DECODER_BUFFER_PICTURE_PARAMETERS:
|
---|
579 | d->bufferType = VBSVGA3D_VD_BUFFER_PICTURE_PARAMETERS; break;
|
---|
580 | case D3D11_1DDI_VIDEO_DECODER_BUFFER_MACROBLOCK_CONTROL:
|
---|
581 | d->bufferType = VBSVGA3D_VD_BUFFER_MACROBLOCK_CONTROL; break;
|
---|
582 | case D3D11_1DDI_VIDEO_DECODER_BUFFER_RESIDUAL_DIFFERENCE:
|
---|
583 | d->bufferType = VBSVGA3D_VD_BUFFER_RESIDUAL_DIFFERENCE; break;
|
---|
584 | case D3D11_1DDI_VIDEO_DECODER_BUFFER_DEBLOCKING_CONTROL:
|
---|
585 | d->bufferType = VBSVGA3D_VD_BUFFER_DEBLOCKING_CONTROL; break;
|
---|
586 | case D3D11_1DDI_VIDEO_DECODER_BUFFER_INVERSE_QUANTIZATION_MATRIX:
|
---|
587 | d->bufferType = VBSVGA3D_VD_BUFFER_INVERSE_QUANTIZATION_MATRIX; break;
|
---|
588 | case D3D11_1DDI_VIDEO_DECODER_BUFFER_SLICE_CONTROL:
|
---|
589 | d->bufferType = VBSVGA3D_VD_BUFFER_SLICE_CONTROL; break;
|
---|
590 | case D3D11_1DDI_VIDEO_DECODER_BUFFER_BITSTREAM:
|
---|
591 | d->bufferType = VBSVGA3D_VD_BUFFER_BITSTREAM; break;
|
---|
592 | case D3D11_1DDI_VIDEO_DECODER_BUFFER_MOTION_VECTOR:
|
---|
593 | d->bufferType = VBSVGA3D_VD_BUFFER_MOTION_VECTOR; break;
|
---|
594 | case D3D11_1DDI_VIDEO_DECODER_BUFFER_FILM_GRAIN:
|
---|
595 | d->bufferType = VBSVGA3D_VD_BUFFER_FILM_GRAIN; break;
|
---|
596 | }
|
---|
597 | d->dataOffset = s->DataOffset;
|
---|
598 | d->dataSize = s->DataSize;
|
---|
599 | d->firstMBaddress = s->FirstMBaddress;
|
---|
600 | d->numMBsInBuffer = s->NumMBsInBuffer;
|
---|
601 | }
|
---|
602 |
|
---|
603 | vgpu10VideoDecoderSubmitBuffers(pDevice, pVideoDecoder->uVideoDecoderId, BufferCount, pahAllocation, paBD);
|
---|
604 | RTMemTmpFree(pvTmpBuffer);
|
---|
605 | return S_OK;
|
---|
606 | }
|
---|
607 |
|
---|
608 |
|
---|
609 | HRESULT vboxDXVideoDecoderEndFrame(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEODECODER pVideoDecoder)
|
---|
610 | {
|
---|
611 | vgpu10VideoDecoderEndFrame(pDevice, pVideoDecoder->uVideoDecoderId);
|
---|
612 | return S_OK;
|
---|
613 | }
|
---|
614 |
|
---|
615 |
|
---|
616 | HRESULT vboxDXCreateVideoProcessorInputView(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSORINPUTVIEW pVideoProcessorInputView,
|
---|
617 | PVBOXDX_RESOURCE pResource, PVBOXDXVIDEOPROCESSORENUM pVideoProcessorEnum,
|
---|
618 | UINT FourCC, UINT MipSlice, UINT FirstArraySlice, UINT ArraySize)
|
---|
619 | {
|
---|
620 | RT_NOREF(ArraySize);
|
---|
621 | Assert(ArraySize == 1); /** @todo D3D11 API does use this. */
|
---|
622 |
|
---|
623 | int rc = RTHandleTableAlloc(pDevice->hHTVideoProcessorInputView, pVideoProcessorInputView, &pVideoProcessorInputView->uVideoProcessorInputViewId);
|
---|
624 | AssertRCReturnStmt(rc, vboxDXDeviceSetError(pDevice, E_OUTOFMEMORY), E_OUTOFMEMORY);
|
---|
625 |
|
---|
626 | pVideoProcessorInputView->pResource = pResource;
|
---|
627 | pVideoProcessorInputView->svga.ContentDesc = pVideoProcessorEnum->svga.desc;
|
---|
628 |
|
---|
629 | VBSVGA3dVPIVDesc *pDesc= &pVideoProcessorInputView->svga.VPIVDesc;
|
---|
630 | RT_ZERO(*pDesc);
|
---|
631 | pDesc->FourCC = FourCC;
|
---|
632 | pDesc->ViewDimension = VBSVGA3D_VPIV_DIMENSION_TEXTURE2D;
|
---|
633 | pDesc->Texture2D.MipSlice = MipSlice;
|
---|
634 | pDesc->Texture2D.ArraySlice = FirstArraySlice;
|
---|
635 |
|
---|
636 | vgpu10DefineVideoProcessorInputView(pDevice, pVideoProcessorInputView->uVideoProcessorInputViewId,
|
---|
637 | vboxDXGetAllocation(pVideoProcessorInputView->pResource),
|
---|
638 | pVideoProcessorInputView->svga.ContentDesc, *pDesc);
|
---|
639 |
|
---|
640 | pVideoProcessorInputView->fDefined = true;
|
---|
641 | RTListAppend(&pVideoProcessorInputView->pResource->listVPIV, &pVideoProcessorInputView->nodeView);
|
---|
642 | return S_OK;
|
---|
643 | }
|
---|
644 |
|
---|
645 |
|
---|
646 | HRESULT vboxDXCreateVideoProcessorOutputView(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOROUTPUTVIEW pVideoProcessorOutputView,
|
---|
647 | PVBOXDX_RESOURCE pResource, PVBOXDXVIDEOPROCESSORENUM pVideoProcessorEnum,
|
---|
648 | UINT MipSlice, UINT FirstArraySlice, UINT ArraySize)
|
---|
649 | {
|
---|
650 | int rc = RTHandleTableAlloc(pDevice->hHTVideoProcessorOutputView, pVideoProcessorOutputView, &pVideoProcessorOutputView->uVideoProcessorOutputViewId);
|
---|
651 | AssertRCReturnStmt(rc, vboxDXDeviceSetError(pDevice, E_OUTOFMEMORY), E_OUTOFMEMORY);
|
---|
652 |
|
---|
653 | pVideoProcessorOutputView->pResource = pResource;
|
---|
654 | pVideoProcessorOutputView->svga.ContentDesc = pVideoProcessorEnum->svga.desc;
|
---|
655 |
|
---|
656 | VBSVGA3dVPOVDesc *pDesc= &pVideoProcessorOutputView->svga.VPOVDesc;
|
---|
657 | RT_ZERO(*pDesc);
|
---|
658 | if (ArraySize <= 1) /** @todo Or from pResource? */
|
---|
659 | {
|
---|
660 | pDesc->ViewDimension = VBSVGA3D_VPOV_DIMENSION_TEXTURE2D;
|
---|
661 | pDesc->Texture2D.MipSlice = MipSlice;
|
---|
662 | }
|
---|
663 | else
|
---|
664 | {
|
---|
665 | pDesc->ViewDimension = VBSVGA3D_VPOV_DIMENSION_TEXTURE2DARRAY;
|
---|
666 | pDesc->Texture2DArray.MipSlice = MipSlice;
|
---|
667 | pDesc->Texture2DArray.FirstArraySlice = FirstArraySlice;
|
---|
668 | pDesc->Texture2DArray.ArraySize = ArraySize;
|
---|
669 | }
|
---|
670 |
|
---|
671 | vgpu10DefineVideoProcessorOutputView(pDevice, pVideoProcessorOutputView->uVideoProcessorOutputViewId,
|
---|
672 | vboxDXGetAllocation(pVideoProcessorOutputView->pResource),
|
---|
673 | pVideoProcessorOutputView->svga.ContentDesc, *pDesc);
|
---|
674 |
|
---|
675 | pVideoProcessorOutputView->fDefined = true;
|
---|
676 | RTListAppend(&pVideoProcessorOutputView->pResource->listVPOV, &pVideoProcessorOutputView->nodeView);
|
---|
677 | return S_OK;
|
---|
678 | }
|
---|
679 |
|
---|
680 |
|
---|
681 | HRESULT vboxDXVideoProcessorBlt(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, PVBOXDXVIDEOPROCESSOROUTPUTVIEW pVideoProcessorOutputView,
|
---|
682 | UINT OutputFrame, UINT StreamCount, D3D11_1DDI_VIDEO_PROCESSOR_STREAM const *paStream)
|
---|
683 | {
|
---|
684 | uint32_t cbVideoProcessorStreams = StreamCount * sizeof(VBSVGA3dVideoProcessorStream);
|
---|
685 | for (UINT i = 0; i < StreamCount; ++i)
|
---|
686 | {
|
---|
687 | D3D11_1DDI_VIDEO_PROCESSOR_STREAM const *s = &paStream[i];
|
---|
688 | uint32_t cbIds = (s->PastFrames + 1 + s->FutureFrames) * sizeof(VBSVGA3dVideoProcessorInputViewId);
|
---|
689 | if (pVideoProcessor->aStreams[i].FrameFormat == D3D11_1DDI_VIDEO_PROCESSOR_STEREO_FORMAT_SEPARATE)
|
---|
690 | cbIds *= 2;
|
---|
691 | cbVideoProcessorStreams += cbIds;
|
---|
692 | }
|
---|
693 |
|
---|
694 | void *pvTmpBuffer = RTMemTmpAlloc(cbVideoProcessorStreams);
|
---|
695 | if (!pvTmpBuffer)
|
---|
696 | return E_OUTOFMEMORY;
|
---|
697 |
|
---|
698 | VBSVGA3dVideoProcessorStream *paVideoProcessorStreams = (VBSVGA3dVideoProcessorStream *)pvTmpBuffer;
|
---|
699 | for (UINT i = 0; i < StreamCount; ++i)
|
---|
700 | {
|
---|
701 | D3D11_1DDI_VIDEO_PROCESSOR_STREAM const *s = &paStream[i];
|
---|
702 | VBSVGA3dVideoProcessorStream *d = &paVideoProcessorStreams[i];
|
---|
703 |
|
---|
704 | d->Enable = s->Enable;
|
---|
705 | d->StereoFormatSeparate = pVideoProcessor->aStreams[i].StereoFormat.Format == D3D11_1DDI_VIDEO_PROCESSOR_STEREO_FORMAT_SEPARATE;
|
---|
706 | d->pad = 0;
|
---|
707 | d->OutputIndex = s->OutputIndex;
|
---|
708 | d->InputFrameOrField = s->InputFrameOrField;
|
---|
709 | d->PastFrames = s->PastFrames;
|
---|
710 | d->FutureFrames = s->FutureFrames;
|
---|
711 |
|
---|
712 | PVBOXDXVIDEOPROCESSORINPUTVIEW pVideoProcessorInputView;
|
---|
713 | VBSVGA3dVideoProcessorInputViewId *pVPIVId = (VBSVGA3dVideoProcessorInputViewId *)&d[1];
|
---|
714 |
|
---|
715 | for (UINT j = 0; j < s->PastFrames; ++j)
|
---|
716 | {
|
---|
717 | pVideoProcessorInputView = (PVBOXDXVIDEOPROCESSORINPUTVIEW)s->pPastSurfaces[j].pDrvPrivate;
|
---|
718 | *pVPIVId++ = pVideoProcessorInputView->uVideoProcessorInputViewId;
|
---|
719 | }
|
---|
720 |
|
---|
721 | pVideoProcessorInputView = (PVBOXDXVIDEOPROCESSORINPUTVIEW)s->hInputSurface.pDrvPrivate;
|
---|
722 | *pVPIVId++ = pVideoProcessorInputView->uVideoProcessorInputViewId;
|
---|
723 |
|
---|
724 | for (UINT j = 0; j < s->FutureFrames; ++j)
|
---|
725 | {
|
---|
726 | pVideoProcessorInputView = (PVBOXDXVIDEOPROCESSORINPUTVIEW)s->pFutureSurfaces[j].pDrvPrivate;
|
---|
727 | *pVPIVId++ = pVideoProcessorInputView->uVideoProcessorInputViewId;
|
---|
728 | }
|
---|
729 |
|
---|
730 | if (d->StereoFormatSeparate)
|
---|
731 | {
|
---|
732 | for (UINT j = 0; j < s->PastFrames; ++j)
|
---|
733 | {
|
---|
734 | pVideoProcessorInputView = (PVBOXDXVIDEOPROCESSORINPUTVIEW)s->pPastSurfacesRight[j].pDrvPrivate;
|
---|
735 | *pVPIVId++ = pVideoProcessorInputView->uVideoProcessorInputViewId;
|
---|
736 | }
|
---|
737 |
|
---|
738 | pVideoProcessorInputView = (PVBOXDXVIDEOPROCESSORINPUTVIEW)s->hInputSurfaceRight.pDrvPrivate;
|
---|
739 | *pVPIVId++ = pVideoProcessorInputView->uVideoProcessorInputViewId;
|
---|
740 |
|
---|
741 | for (UINT j = 0; j < s->FutureFrames; ++j)
|
---|
742 | {
|
---|
743 | pVideoProcessorInputView = (PVBOXDXVIDEOPROCESSORINPUTVIEW)s->pFutureSurfacesRight[j].pDrvPrivate;
|
---|
744 | *pVPIVId++ = pVideoProcessorInputView->uVideoProcessorInputViewId;
|
---|
745 | }
|
---|
746 | }
|
---|
747 | }
|
---|
748 |
|
---|
749 | vgpu10VideoProcessorBlt(pDevice, pVideoProcessor->uVideoProcessorId, pVideoProcessorOutputView->uVideoProcessorOutputViewId,
|
---|
750 | OutputFrame, StreamCount, cbVideoProcessorStreams, paVideoProcessorStreams);
|
---|
751 | RTMemTmpFree(pvTmpBuffer);
|
---|
752 | return S_OK;
|
---|
753 | }
|
---|
754 |
|
---|
755 |
|
---|
756 | void vboxDXDestroyVideoDecoder(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEODECODER pVideoDecoder)
|
---|
757 | {
|
---|
758 | vgpu10DestroyVideoDecoder(pDevice, pVideoDecoder->uVideoDecoderId);
|
---|
759 | RTHandleTableFree(pDevice->hHTVideoDecoder, pVideoDecoder->uVideoDecoderId);
|
---|
760 | }
|
---|
761 |
|
---|
762 |
|
---|
763 | void vboxDXDestroyVideoDecoderOutputView(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEODECODEROUTPUTVIEW pVideoDecoderOutputView)
|
---|
764 | {
|
---|
765 | RTListNodeRemove(&pVideoDecoderOutputView->nodeView);
|
---|
766 |
|
---|
767 | vgpu10DestroyVideoDecoderOutputView(pDevice, pVideoDecoderOutputView->uVideoDecoderOutputViewId);
|
---|
768 | RTHandleTableFree(pDevice->hHTVideoDecoderOutputView, pVideoDecoderOutputView->uVideoDecoderOutputViewId);
|
---|
769 | }
|
---|
770 |
|
---|
771 |
|
---|
772 | void vboxDXDestroyVideoProcessor(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor)
|
---|
773 | {
|
---|
774 | vgpu10DestroyVideoProcessor(pDevice, pVideoProcessor->uVideoProcessorId);
|
---|
775 | RTHandleTableFree(pDevice->hHTVideoProcessor, pVideoProcessor->uVideoProcessorId);
|
---|
776 | }
|
---|
777 |
|
---|
778 |
|
---|
779 | void vboxDXDestroyVideoProcessorInputView(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSORINPUTVIEW pVideoProcessorInputView)
|
---|
780 | {
|
---|
781 | RTListNodeRemove(&pVideoProcessorInputView->nodeView);
|
---|
782 |
|
---|
783 | vgpu10DestroyVideoProcessorInputView(pDevice, pVideoProcessorInputView->uVideoProcessorInputViewId);
|
---|
784 | RTHandleTableFree(pDevice->hHTVideoProcessorInputView, pVideoProcessorInputView->uVideoProcessorInputViewId);
|
---|
785 | }
|
---|
786 |
|
---|
787 |
|
---|
788 | void vboxDXDestroyVideoProcessorOutputView(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOROUTPUTVIEW pVideoProcessorOutputView)
|
---|
789 | {
|
---|
790 | RTListNodeRemove(&pVideoProcessorOutputView->nodeView);
|
---|
791 |
|
---|
792 | vgpu10DestroyVideoProcessorOutputView(pDevice, pVideoProcessorOutputView->uVideoProcessorOutputViewId);
|
---|
793 | RTHandleTableFree(pDevice->hHTVideoProcessorOutputView, pVideoProcessorOutputView->uVideoProcessorOutputViewId);
|
---|
794 | }
|
---|
795 |
|
---|
796 |
|
---|
797 | void vboxDXVideoProcessorSetOutputTargetRect(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, BOOL Enable, RECT const *pOutputRect)
|
---|
798 | {
|
---|
799 | pVideoProcessor->OutputRect.Enable = Enable;
|
---|
800 | pVideoProcessor->OutputRect.Rect = *pOutputRect;
|
---|
801 |
|
---|
802 | vgpu10VideoProcessorSetOutputTargetRect(pDevice, pVideoProcessor->uVideoProcessorId, Enable, *pOutputRect);
|
---|
803 | }
|
---|
804 |
|
---|
805 |
|
---|
806 | void vboxDXVideoProcessorSetOutputBackgroundColor(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, BOOL YCbCr, D3D11_1DDI_VIDEO_COLOR const *pColor)
|
---|
807 | {
|
---|
808 | pVideoProcessor->OutputBackgroundColor.YCbCr = YCbCr;
|
---|
809 | pVideoProcessor->OutputBackgroundColor.Color = *pColor;
|
---|
810 |
|
---|
811 | vgpu10VideoProcessorSetOutputBackgroundColor(pDevice, pVideoProcessor->uVideoProcessorId, YCbCr, *pColor);
|
---|
812 | }
|
---|
813 |
|
---|
814 |
|
---|
815 | void vboxDXVideoProcessorSetOutputColorSpace(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, D3D11_1DDI_VIDEO_PROCESSOR_COLOR_SPACE const *pColorSpace)
|
---|
816 | {
|
---|
817 | pVideoProcessor->Colorspace = *pColorSpace;
|
---|
818 |
|
---|
819 | VBSVGA3dVideoProcessorColorSpace svgaColorSpace;
|
---|
820 | svgaColorSpace.Usage = pColorSpace->Usage;
|
---|
821 | svgaColorSpace.RGB_Range = pColorSpace->RGB_Range;
|
---|
822 | svgaColorSpace.YCbCr_Matrix = pColorSpace->YCbCr_Matrix;
|
---|
823 | svgaColorSpace.YCbCr_xvYCC = pColorSpace->YCbCr_xvYCC;
|
---|
824 | svgaColorSpace.Nominal_Range = pColorSpace->Nominal_Range;
|
---|
825 | svgaColorSpace.Reserved = 0;
|
---|
826 |
|
---|
827 | vgpu10VideoProcessorSetOutputColorSpace(pDevice, pVideoProcessor->uVideoProcessorId, svgaColorSpace);
|
---|
828 | }
|
---|
829 |
|
---|
830 |
|
---|
831 | void vboxDXVideoProcessorSetOutputAlphaFillMode(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, D3D11_1DDI_VIDEO_PROCESSOR_ALPHA_FILL_MODE FillMode, UINT StreamIndex)
|
---|
832 | {
|
---|
833 | pVideoProcessor->AlphaFillMode.FillMode = FillMode;
|
---|
834 | pVideoProcessor->AlphaFillMode.StreamIndex = StreamIndex;
|
---|
835 |
|
---|
836 | VBSVGA3dVideoProcessorAlphaFillMode svgaFillMode = (VBSVGA3dVideoProcessorAlphaFillMode)FillMode;
|
---|
837 | vgpu10VideoProcessorSetOutputAlphaFillMode(pDevice, pVideoProcessor->uVideoProcessorId, svgaFillMode, StreamIndex);
|
---|
838 | }
|
---|
839 |
|
---|
840 |
|
---|
841 | void vboxDXVideoProcessorSetOutputConstriction(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, BOOL Enabled, SIZE ConstrictonSize)
|
---|
842 | {
|
---|
843 | pVideoProcessor->OutputConstriction.Enabled = Enabled;
|
---|
844 | pVideoProcessor->OutputConstriction.ConstrictonSize = ConstrictonSize;
|
---|
845 |
|
---|
846 | vgpu10VideoProcessorSetOutputConstriction(pDevice, pVideoProcessor->uVideoProcessorId, Enabled, ConstrictonSize);
|
---|
847 | }
|
---|
848 |
|
---|
849 |
|
---|
850 | void vboxDXVideoProcessorSetOutputStereoMode(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, BOOL Enable)
|
---|
851 | {
|
---|
852 | pVideoProcessor->StereoMode.Enable = Enable;
|
---|
853 |
|
---|
854 | vgpu10VideoProcessorSetOutputStereoMode(pDevice, pVideoProcessor->uVideoProcessorId, Enable);
|
---|
855 | }
|
---|
856 |
|
---|
857 |
|
---|
858 | void vboxDXVideoProcessorSetStreamFrameFormat(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, UINT StreamIndex, D3D11_1DDI_VIDEO_FRAME_FORMAT Format)
|
---|
859 | {
|
---|
860 | pVideoProcessor->aStreams[StreamIndex].FrameFormat = Format;
|
---|
861 |
|
---|
862 | VBSVGA3dVideoFrameFormat svgaFormat = (VBSVGA3dVideoFrameFormat)Format;
|
---|
863 | vgpu10VideoProcessorSetStreamFrameFormat(pDevice, pVideoProcessor->uVideoProcessorId, StreamIndex, svgaFormat);
|
---|
864 | }
|
---|
865 |
|
---|
866 |
|
---|
867 | void vboxDXVideoProcessorSetStreamColorSpace(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, UINT StreamIndex, D3D11_1DDI_VIDEO_PROCESSOR_COLOR_SPACE const *pColorSpace)
|
---|
868 | {
|
---|
869 | pVideoProcessor->aStreams[StreamIndex].ColorSpace = *pColorSpace;
|
---|
870 |
|
---|
871 | VBSVGA3dVideoProcessorColorSpace svgaColorSpace;
|
---|
872 | svgaColorSpace.Usage = pColorSpace->Usage;
|
---|
873 | svgaColorSpace.RGB_Range = pColorSpace->RGB_Range;
|
---|
874 | svgaColorSpace.YCbCr_Matrix = pColorSpace->YCbCr_Matrix;
|
---|
875 | svgaColorSpace.YCbCr_xvYCC = pColorSpace->YCbCr_xvYCC;
|
---|
876 | svgaColorSpace.Nominal_Range = pColorSpace->Nominal_Range;
|
---|
877 | svgaColorSpace.Reserved = 0;
|
---|
878 |
|
---|
879 | vgpu10VideoProcessorSetStreamColorSpace(pDevice, pVideoProcessor->uVideoProcessorId, StreamIndex, svgaColorSpace);
|
---|
880 | }
|
---|
881 |
|
---|
882 |
|
---|
883 | void vboxDXVideoProcessorSetStreamOutputRate(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, UINT StreamIndex,
|
---|
884 | D3D11_1DDI_VIDEO_PROCESSOR_OUTPUT_RATE OutputRate, BOOL RepeatFrame, DXGI_RATIONAL const *pCustomRate)
|
---|
885 | {
|
---|
886 | pVideoProcessor->aStreams[StreamIndex].OutputRate.OutputRate = OutputRate;
|
---|
887 | pVideoProcessor->aStreams[StreamIndex].OutputRate.RepeatFrame = RepeatFrame;
|
---|
888 | pVideoProcessor->aStreams[StreamIndex].OutputRate.CustomRate = *pCustomRate;
|
---|
889 |
|
---|
890 | VBSVGA3dVideoProcessorOutputRate svgaOutputRate = (VBSVGA3dVideoProcessorOutputRate)OutputRate;
|
---|
891 | SVGA3dFraction64 svgaCustomRate;
|
---|
892 | svgaCustomRate.numerator = pCustomRate->Numerator;
|
---|
893 | svgaCustomRate.denominator = pCustomRate->Denominator;
|
---|
894 |
|
---|
895 | vgpu10VideoProcessorSetStreamOutputRate(pDevice, pVideoProcessor->uVideoProcessorId, StreamIndex, svgaOutputRate, RepeatFrame, svgaCustomRate);
|
---|
896 | }
|
---|
897 |
|
---|
898 |
|
---|
899 | void vboxDXVideoProcessorSetStreamSourceRect(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, UINT StreamIndex,
|
---|
900 | BOOL Enable, RECT const *pSourceRect)
|
---|
901 | {
|
---|
902 | pVideoProcessor->aStreams[StreamIndex].SourceRect.Enable = Enable;
|
---|
903 | pVideoProcessor->aStreams[StreamIndex].SourceRect.SourceRect = *pSourceRect;
|
---|
904 |
|
---|
905 | vgpu10VideoProcessorSetStreamSourceRect(pDevice, pVideoProcessor->uVideoProcessorId, StreamIndex, Enable, pSourceRect);
|
---|
906 | }
|
---|
907 |
|
---|
908 |
|
---|
909 | void vboxDXVideoProcessorSetStreamDestRect(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, UINT StreamIndex,
|
---|
910 | BOOL Enable, RECT const *pDestRect)
|
---|
911 | {
|
---|
912 | pVideoProcessor->aStreams[StreamIndex].DestRect.Enable = Enable;
|
---|
913 | pVideoProcessor->aStreams[StreamIndex].DestRect.DestRect = *pDestRect;
|
---|
914 |
|
---|
915 | vgpu10VideoProcessorSetStreamDestRect(pDevice, pVideoProcessor->uVideoProcessorId, StreamIndex, Enable, pDestRect);
|
---|
916 | }
|
---|
917 |
|
---|
918 |
|
---|
919 | void vboxDXVideoProcessorSetStreamAlpha(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, UINT StreamIndex,
|
---|
920 | BOOL Enable, FLOAT Alpha)
|
---|
921 | {
|
---|
922 | vgpu10VideoProcessorSetStreamAlpha(pDevice, pVideoProcessor->uVideoProcessorId, StreamIndex, Enable, Alpha);
|
---|
923 | }
|
---|
924 |
|
---|
925 |
|
---|
926 | void vboxDXVideoProcessorSetStreamPalette(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, UINT StreamIndex,
|
---|
927 | UINT Count, UINT const *pEntries)
|
---|
928 | {
|
---|
929 | vgpu10VideoProcessorSetStreamPalette(pDevice, pVideoProcessor->uVideoProcessorId, StreamIndex,
|
---|
930 | RT_MIN(Count, VBSVGA3D_MAX_VIDEO_PALETTE_ENTRIES), pEntries);
|
---|
931 | }
|
---|
932 |
|
---|
933 |
|
---|
934 | void vboxDXVideoProcessorSetStreamPixelAspectRatio(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, UINT StreamIndex,
|
---|
935 | BOOL Enable, DXGI_RATIONAL const *pSourceRatio, DXGI_RATIONAL const *pDestRatio)
|
---|
936 | {
|
---|
937 | SVGA3dFraction64 svgaSourceRatio;
|
---|
938 | svgaSourceRatio.numerator = pSourceRatio->Numerator;
|
---|
939 | svgaSourceRatio.denominator = pSourceRatio->Denominator;
|
---|
940 |
|
---|
941 | SVGA3dFraction64 svgaDestRatio;
|
---|
942 | svgaDestRatio.numerator = pDestRatio->Numerator;
|
---|
943 | svgaDestRatio.denominator = pDestRatio->Denominator;
|
---|
944 |
|
---|
945 | vgpu10VideoProcessorSetStreamPixelAspectRatio(pDevice, pVideoProcessor->uVideoProcessorId, StreamIndex, Enable, svgaSourceRatio, svgaDestRatio);
|
---|
946 | }
|
---|
947 |
|
---|
948 |
|
---|
949 | void vboxDXVideoProcessorSetStreamLumaKey(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, UINT StreamIndex,
|
---|
950 | BOOL Enable, FLOAT Lower, FLOAT Upper)
|
---|
951 | {
|
---|
952 | pVideoProcessor->aStreams[StreamIndex].LumaKey.Enable = Enable;
|
---|
953 | pVideoProcessor->aStreams[StreamIndex].LumaKey.Lower = Lower;
|
---|
954 | pVideoProcessor->aStreams[StreamIndex].LumaKey.Upper = Upper;
|
---|
955 |
|
---|
956 | vgpu10VideoProcessorSetStreamLumaKey(pDevice, pVideoProcessor->uVideoProcessorId, StreamIndex, Enable, Lower, Upper);
|
---|
957 | }
|
---|
958 |
|
---|
959 |
|
---|
960 | void vboxDXVideoProcessorSetStreamStereoFormat(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, UINT StreamIndex, BOOL Enable,
|
---|
961 | D3D11_1DDI_VIDEO_PROCESSOR_STEREO_FORMAT StereoFormat, BOOL LeftViewFrame0, BOOL BaseViewFrame0,
|
---|
962 | D3D11_1DDI_VIDEO_PROCESSOR_STEREO_FLIP_MODE FlipMode, int MonoOffset)
|
---|
963 | {
|
---|
964 | pVideoProcessor->aStreams[StreamIndex].StereoFormat.Enable = Enable;
|
---|
965 | pVideoProcessor->aStreams[StreamIndex].StereoFormat.Format = StereoFormat;
|
---|
966 |
|
---|
967 | VBSVGA3dVideoProcessorStereoFormat svgaStereoFormat = (VBSVGA3dVideoProcessorStereoFormat)StereoFormat;
|
---|
968 | VBSVGA3dVideoProcessorStereoFlipMode svgaFlipMode = (VBSVGA3dVideoProcessorStereoFlipMode)FlipMode;
|
---|
969 |
|
---|
970 | vgpu10VideoProcessorSetStreamStereoFormat(pDevice, pVideoProcessor->uVideoProcessorId, StreamIndex, Enable,
|
---|
971 | svgaStereoFormat, LeftViewFrame0, BaseViewFrame0, svgaFlipMode, MonoOffset);
|
---|
972 | }
|
---|
973 |
|
---|
974 |
|
---|
975 | void vboxDXVideoProcessorSetStreamAutoProcessingMode(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, UINT StreamIndex, BOOL Enable)
|
---|
976 | {
|
---|
977 | pVideoProcessor->aStreams[StreamIndex].AutoProcessingMode.Enable = Enable;
|
---|
978 |
|
---|
979 | vgpu10VideoProcessorSetStreamAutoProcessingMode(pDevice, pVideoProcessor->uVideoProcessorId, StreamIndex, Enable);
|
---|
980 | }
|
---|
981 |
|
---|
982 |
|
---|
983 | void vboxDXVideoProcessorSetStreamFilter(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, UINT StreamIndex, BOOL Enable,
|
---|
984 | D3D11_1DDI_VIDEO_PROCESSOR_FILTER Filter, int Level)
|
---|
985 | {
|
---|
986 | pVideoProcessor->aStreams[StreamIndex].aFilters[Filter].Enable = Enable;
|
---|
987 | pVideoProcessor->aStreams[StreamIndex].aFilters[Filter].Level = Level;
|
---|
988 |
|
---|
989 | VBSVGA3dVideoProcessorFilter svgaFilter = (VBSVGA3dVideoProcessorFilter)Filter;
|
---|
990 |
|
---|
991 | vgpu10VideoProcessorSetStreamFilter(pDevice, pVideoProcessor->uVideoProcessorId, StreamIndex, Enable, svgaFilter, Level);
|
---|
992 | }
|
---|
993 |
|
---|
994 |
|
---|
995 | void vboxDXVideoProcessorSetStreamRotation(PVBOXDX_DEVICE pDevice, PVBOXDXVIDEOPROCESSOR pVideoProcessor, UINT StreamIndex, BOOL Enable,
|
---|
996 | D3D11_1DDI_VIDEO_PROCESSOR_ROTATION Rotation)
|
---|
997 | {
|
---|
998 | pVideoProcessor->aStreams[StreamIndex].Rotation.Enable = Enable;
|
---|
999 | pVideoProcessor->aStreams[StreamIndex].Rotation.Rotation = Rotation;
|
---|
1000 |
|
---|
1001 | VBSVGA3dVideoProcessorRotation svgaRotation = (VBSVGA3dVideoProcessorRotation)Rotation;
|
---|
1002 |
|
---|
1003 | vgpu10VideoProcessorSetStreamRotation(pDevice, pVideoProcessor->uVideoProcessorId, StreamIndex, Enable, svgaRotation);
|
---|
1004 | }
|
---|