VirtualBox

source: vbox/trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx.cpp@ 102714

Last change on this file since 102714 was 102714, checked in by vboxsync, 17 months ago

Devices/Graphics: simplified vertex and index buffers tracking.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 185.2 KB
Line 
1/* $Id: DevVGA-SVGA3d-dx.cpp 102714 2023-12-27 15:34:25Z vboxsync $ */
2/** @file
3 * DevSVGA3d - VMWare SVGA device, 3D parts - Common code for DX backend interface.
4 */
5
6/*
7 * Copyright (C) 2020-2023 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.215389.xyz.
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
29/*********************************************************************************************************************************
30* Header Files *
31*********************************************************************************************************************************/
32#define LOG_GROUP LOG_GROUP_DEV_VMSVGA
33#include <VBox/AssertGuest.h>
34#include <iprt/errcore.h>
35#include <VBox/log.h>
36#include <VBox/vmm/pdmdev.h>
37
38#include <iprt/assert.h>
39#include <iprt/mem.h>
40
41#include <VBoxVideo.h> /* required by DevVGA.h */
42
43/* should go BEFORE any other DevVGA include to make all DevVGA.h config defines be visible */
44#include "DevVGA.h"
45
46#include "DevVGA-SVGA.h"
47#include "DevVGA-SVGA3d.h"
48#include "DevVGA-SVGA3d-internal.h"
49#include "DevVGA-SVGA-internal.h"
50
51
52/*
53 * Helpers.
54 */
55
56static int dxMobWrite(PVMSVGAR3STATE pSvgaR3State, SVGAMobId mobid, uint32_t off, void const *pvData, uint32_t cbData)
57{
58 PVMSVGAMOB pMob = vmsvgaR3MobGet(pSvgaR3State, mobid);
59 ASSERT_GUEST_RETURN(pMob, VERR_INVALID_STATE);
60
61 return vmsvgaR3MobWrite(pSvgaR3State, pMob, off, pvData, cbData);
62}
63
64void vmsvga3dDXInitContextMobData(SVGADXContextMobFormat *p)
65{
66 /* 0xFFFFFFFF (SVGA_ID_INVALID) is a better initial value than 0 for most of svgaDXContext fields. */
67 memset(p, 0xFF, sizeof(*p));
68
69 p->inputAssembly.layoutId = SVGA3D_INVALID_ID;
70 for (uint32_t i = 0; i < RT_ELEMENTS(p->inputAssembly.vertexBuffers); ++i)
71 {
72 p->inputAssembly.vertexBuffers[i].bufferId = SVGA3D_INVALID_ID;
73 p->inputAssembly.vertexBuffers[i].stride = 0;
74 p->inputAssembly.vertexBuffers[i].offset = 0;
75 }
76 p->inputAssembly.indexBufferSid = SVGA3D_INVALID_ID;
77 p->inputAssembly.indexBufferOffset = 0;
78 p->inputAssembly.indexBufferFormat = SVGA3D_FORMAT_INVALID;
79 p->inputAssembly.topology = SVGA3D_PRIMITIVE_INVALID;
80
81 p->renderState.blendStateId = SVGA3D_INVALID_ID;
82 RT_ZERO(p->renderState.blendFactor);
83 p->renderState.sampleMask = 0;
84 p->renderState.depthStencilStateId = SVGA3D_INVALID_ID;
85 p->renderState.stencilRef = 0;
86 p->renderState.rasterizerStateId = SVGA3D_INVALID_ID;
87 p->renderState.depthStencilViewId = SVGA3D_INVALID_ID;
88 for (uint32_t i = 0; i < RT_ELEMENTS(p->renderState.renderTargetViewIds); ++i)
89 p->renderState.renderTargetViewIds[i] = SVGA3D_INVALID_ID;
90
91 for (uint32_t i = 0; i < RT_ELEMENTS(p->streamOut.targets); ++i)
92 p->streamOut.targets[i] = SVGA3D_INVALID_ID;
93 p->streamOut.soid = SVGA3D_INVALID_ID;
94
95 p->uavSpliceIndex = 0;
96 p->numViewports = 0;
97 p->numScissorRects = 0;
98
99 RT_ZERO(p->viewports);
100 RT_ZERO(p->scissorRects);
101
102 p->predication.queryID = SVGA3D_INVALID_ID;
103 p->predication.value = 0;
104
105 p->shaderIfaceMobid = SVGA3D_INVALID_ID;
106 p->shaderIfaceOffset = 0;
107
108 for (uint32_t i = 0; i < RT_ELEMENTS(p->shaderState); ++i)
109 {
110 p->shaderState[i].shaderId = SVGA3D_INVALID_ID;
111 for (uint32_t j = 0; j < RT_ELEMENTS(p->shaderState[0].constantBuffers); ++j)
112 {
113 SVGA3dConstantBufferBinding *cbb = &p->shaderState[i].constantBuffers[j];
114 cbb->sid = SVGA3D_INVALID_ID;
115 cbb->offsetInBytes = 0;
116 cbb->sizeInBytes = 0;
117 }
118 for (uint32_t j = 0; j < RT_ELEMENTS(p->shaderState[0].shaderResources); ++j)
119 p->shaderState[i].shaderResources[j] = SVGA3D_INVALID_ID;
120 for (uint32_t j = 0; j < RT_ELEMENTS(p->shaderState[0].samplers); ++j)
121 p->shaderState[i].samplers[j] = SVGA3D_INVALID_ID;
122 }
123
124 for (uint32_t i = 0; i < RT_ELEMENTS(p->queryID); ++i)
125 p->queryID[i] = SVGA3D_INVALID_ID;
126
127 for (uint32_t i = 0; i < RT_ELEMENTS(p->cotables); ++i)
128 p->cotables[i].mobid = SVGA3D_INVALID_ID;
129
130 for (uint32_t i = 0; i < RT_ELEMENTS(p->uaViewIds); ++i)
131 p->uaViewIds[i] = SVGA3D_INVALID_ID;
132
133 for (uint32_t i = 0; i < RT_ELEMENTS(p->csuaViewIds); ++i)
134 p->csuaViewIds[i] = SVGA3D_INVALID_ID;
135}
136
137/*
138 *
139 * Command handlers.
140 *
141 */
142
143int vmsvga3dDXUnbindContext(PVGASTATECC pThisCC, uint32_t cid, SVGADXContextMobFormat *pSvgaDXContext)
144{
145 int rc;
146 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
147 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindContext, VERR_INVALID_STATE);
148 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
149 AssertReturn(p3dState, VERR_INVALID_STATE);
150
151 PVMSVGA3DDXCONTEXT pDXContext;
152 rc = vmsvga3dDXContextFromCid(p3dState, cid, &pDXContext);
153 AssertRCReturn(rc, rc);
154
155 /* Copy the host structure back to the guest memory. */
156 memcpy(pSvgaDXContext, &pDXContext->svgaDXContext, sizeof(*pSvgaDXContext));
157
158 return rc;
159}
160
161
162int vmsvga3dDXSwitchContext(PVGASTATECC pThisCC, uint32_t cid)
163{
164 int rc;
165 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
166 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSwitchContext, VERR_INVALID_STATE);
167 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
168 AssertReturn(p3dState, VERR_INVALID_STATE);
169
170 PVMSVGA3DDXCONTEXT pDXContext;
171 rc = vmsvga3dDXContextFromCid(p3dState, cid, &pDXContext);
172 AssertRCReturn(rc, rc);
173
174 /* Notify the host backend that context is about to be switched. */
175 rc = pSvgaR3State->pFuncsDX->pfnDXSwitchContext(pThisCC, pDXContext);
176 if (rc == VINF_NOT_IMPLEMENTED || RT_FAILURE(rc))
177 return rc;
178
179 /** @todo Keep track of changes in the pipeline and apply only modified state. */
180 /* It is not necessary to restore SVGADXContextMobFormat::shaderState::shaderResources
181 * because they are applied by the backend before each Draw call.
182 */
183 #define DX_STATE_SAMPLERS 0x00000004
184 #define DX_STATE_INPUTLAYOUT 0x00000008
185 #define DX_STATE_TOPOLOGY 0x00000010
186 #define DX_STATE_BLENDSTATE 0x00000080
187 #define DX_STATE_DEPTHSTENCILSTATE 0x00000100
188 #define DX_STATE_SOTARGETS 0x00000200
189 #define DX_STATE_VIEWPORTS 0x00000400
190 #define DX_STATE_SCISSORRECTS 0x00000800
191 #define DX_STATE_RASTERIZERSTATE 0x00001000
192 uint32_t u32TrackedState = 0
193 | DX_STATE_SAMPLERS
194 | DX_STATE_INPUTLAYOUT
195 | DX_STATE_TOPOLOGY
196 | DX_STATE_BLENDSTATE
197 | DX_STATE_DEPTHSTENCILSTATE
198 | DX_STATE_SOTARGETS
199 | DX_STATE_VIEWPORTS
200 | DX_STATE_SCISSORRECTS
201 | DX_STATE_RASTERIZERSTATE
202 ;
203
204 LogFunc(("cid = %d, state = 0x%08X\n", cid, u32TrackedState));
205
206 if (u32TrackedState & DX_STATE_SAMPLERS)
207 {
208 u32TrackedState &= ~DX_STATE_SAMPLERS;
209
210 for (int i = SVGA3D_SHADERTYPE_MIN; i < SVGA3D_SHADERTYPE_MAX; ++i)
211 {
212 SVGA3dShaderType const shaderType = (SVGA3dShaderType)i;
213 uint32_t const idxShaderState = shaderType - SVGA3D_SHADERTYPE_MIN;
214
215 uint32_t startSampler = 0;
216 uint32_t cSamplerId = SVGA3D_DX_MAX_SAMPLERS;
217 SVGA3dSamplerId *paSamplerId = &pDXContext->svgaDXContext.shaderState[idxShaderState].samplers[0];
218
219 rc = pSvgaR3State->pFuncsDX->pfnDXSetSamplers(pThisCC, pDXContext, startSampler, shaderType, cSamplerId, paSamplerId);
220 AssertRC(rc);
221 }
222 }
223
224
225 if (u32TrackedState & DX_STATE_INPUTLAYOUT)
226 {
227 u32TrackedState &= ~DX_STATE_INPUTLAYOUT;
228
229 SVGA3dElementLayoutId const elementLayoutId = pDXContext->svgaDXContext.inputAssembly.layoutId;
230
231 rc = pSvgaR3State->pFuncsDX->pfnDXSetInputLayout(pThisCC, pDXContext, elementLayoutId);
232 AssertRC(rc);
233 }
234
235
236 if (u32TrackedState & DX_STATE_TOPOLOGY)
237 {
238 u32TrackedState &= ~DX_STATE_TOPOLOGY;
239
240 SVGA3dPrimitiveType const topology = (SVGA3dPrimitiveType)pDXContext->svgaDXContext.inputAssembly.topology;
241
242 if (topology != SVGA3D_PRIMITIVE_INVALID)
243 rc = pSvgaR3State->pFuncsDX->pfnDXSetTopology(pThisCC, pDXContext, topology);
244 AssertRC(rc);
245 }
246
247
248 if (u32TrackedState & DX_STATE_BLENDSTATE)
249 {
250 u32TrackedState &= ~DX_STATE_BLENDSTATE;
251
252 SVGA3dBlendStateId const blendId = pDXContext->svgaDXContext.renderState.blendStateId;
253 /* SVGADXContextMobFormat uses uint32_t array to store the blend factors, however they are in fact 32 bit floats. */
254 float const *paBlendFactor = (float *)&pDXContext->svgaDXContext.renderState.blendFactor[0];
255 uint32_t const sampleMask = pDXContext->svgaDXContext.renderState.sampleMask;
256
257 rc = pSvgaR3State->pFuncsDX->pfnDXSetBlendState(pThisCC, pDXContext, blendId, paBlendFactor, sampleMask);
258 AssertRC(rc);
259 }
260
261
262 if (u32TrackedState & DX_STATE_DEPTHSTENCILSTATE)
263 {
264 u32TrackedState &= ~DX_STATE_DEPTHSTENCILSTATE;
265
266 SVGA3dDepthStencilStateId const depthStencilId = pDXContext->svgaDXContext.renderState.depthStencilStateId;
267 uint32_t const stencilRef = pDXContext->svgaDXContext.renderState.stencilRef;
268
269 rc = pSvgaR3State->pFuncsDX->pfnDXSetDepthStencilState(pThisCC, pDXContext, depthStencilId, stencilRef);
270 AssertRC(rc);
271 }
272
273
274 if (u32TrackedState & DX_STATE_SOTARGETS)
275 {
276 u32TrackedState &= ~DX_STATE_SOTARGETS;
277
278 uint32_t cSoTarget = SVGA3D_DX_MAX_SOTARGETS;
279 SVGA3dSoTarget aSoTarget[SVGA3D_DX_MAX_SOTARGETS];
280 for (uint32_t i = 0; i < SVGA3D_DX_MAX_SOTARGETS; ++i)
281 {
282 aSoTarget[i].sid = pDXContext->svgaDXContext.streamOut.targets[i];
283 /** @todo Offset is not stored in svgaDXContext. Should it be stored elsewhere by the host? */
284 aSoTarget[i].offset = 0;
285 aSoTarget[i].sizeInBytes = 0;
286 }
287
288 rc = pSvgaR3State->pFuncsDX->pfnDXSetSOTargets(pThisCC, pDXContext, cSoTarget, aSoTarget);
289 AssertRC(rc);
290 }
291
292
293 if (u32TrackedState & DX_STATE_VIEWPORTS)
294 {
295 u32TrackedState &= ~DX_STATE_VIEWPORTS;
296
297 uint32_t const cViewport = pDXContext->svgaDXContext.numViewports;
298 SVGA3dViewport const *paViewport = &pDXContext->svgaDXContext.viewports[0];
299
300 rc = pSvgaR3State->pFuncsDX->pfnDXSetViewports(pThisCC, pDXContext, cViewport, paViewport);
301 AssertRC(rc);
302 }
303
304
305 if (u32TrackedState & DX_STATE_SCISSORRECTS)
306 {
307 u32TrackedState &= ~DX_STATE_SCISSORRECTS;
308
309 uint32_t const cRect = pDXContext->svgaDXContext.numScissorRects;
310 SVGASignedRect const *paRect = &pDXContext->svgaDXContext.scissorRects[0];
311
312 rc = pSvgaR3State->pFuncsDX->pfnDXSetScissorRects(pThisCC, pDXContext, cRect, paRect);
313 AssertRC(rc);
314 }
315
316
317 if (u32TrackedState & DX_STATE_RASTERIZERSTATE)
318 {
319 u32TrackedState &= ~DX_STATE_RASTERIZERSTATE;
320
321 SVGA3dRasterizerStateId const rasterizerId = pDXContext->svgaDXContext.renderState.rasterizerStateId;
322
323 rc = pSvgaR3State->pFuncsDX->pfnDXSetRasterizerState(pThisCC, pDXContext, rasterizerId);
324 AssertRC(rc);
325 }
326
327 Assert(u32TrackedState == 0);
328
329 return rc;
330}
331
332
333/**
334 * Create a new 3D DX context.
335 *
336 * @returns VBox status code.
337 * @param pThisCC The VGA/VMSVGA state for ring-3.
338 * @param cid Context id to be created.
339 */
340int vmsvga3dDXDefineContext(PVGASTATECC pThisCC, uint32_t cid)
341{
342 int rc;
343 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
344 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineContext, VERR_INVALID_STATE);
345 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
346 AssertReturn(p3dState, VERR_INVALID_STATE);
347
348 PVMSVGA3DDXCONTEXT pDXContext;
349
350 LogFunc(("cid %d\n", cid));
351
352 AssertReturn(cid < SVGA3D_MAX_CONTEXT_IDS, VERR_INVALID_PARAMETER);
353
354 if (cid >= p3dState->cDXContexts)
355 {
356 /* Grow the array. */
357 uint32_t cNew = RT_ALIGN(cid + 15, 16);
358 void *pvNew = RTMemRealloc(p3dState->papDXContexts, sizeof(p3dState->papDXContexts[0]) * cNew);
359 AssertReturn(pvNew, VERR_NO_MEMORY);
360 p3dState->papDXContexts = (PVMSVGA3DDXCONTEXT *)pvNew;
361 while (p3dState->cDXContexts < cNew)
362 {
363 pDXContext = (PVMSVGA3DDXCONTEXT)RTMemAllocZ(sizeof(*pDXContext));
364 AssertReturn(pDXContext, VERR_NO_MEMORY);
365 pDXContext->cid = SVGA3D_INVALID_ID;
366 p3dState->papDXContexts[p3dState->cDXContexts++] = pDXContext;
367 }
368 }
369 /* If one already exists with this id, then destroy it now. */
370 if (p3dState->papDXContexts[cid]->cid != SVGA3D_INVALID_ID)
371 vmsvga3dDXDestroyContext(pThisCC, cid);
372
373 pDXContext = p3dState->papDXContexts[cid];
374 memset(pDXContext, 0, sizeof(*pDXContext));
375
376 vmsvga3dDXInitContextMobData(&pDXContext->svgaDXContext);
377 pDXContext->cid = cid;
378
379 /* Init the backend specific data. */
380 rc = pSvgaR3State->pFuncsDX->pfnDXDefineContext(pThisCC, pDXContext);
381
382 /* Cleanup on failure. */
383 if (RT_FAILURE(rc))
384 vmsvga3dDXDestroyContext(pThisCC, cid);
385
386 return rc;
387}
388
389
390int vmsvga3dDXDestroyContext(PVGASTATECC pThisCC, uint32_t cid)
391{
392 int rc;
393 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
394 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyContext, VERR_INVALID_STATE);
395 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
396 AssertReturn(p3dState, VERR_INVALID_STATE);
397
398 PVMSVGA3DDXCONTEXT pDXContext;
399 rc = vmsvga3dDXContextFromCid(p3dState, cid, &pDXContext);
400 AssertRCReturn(rc, rc);
401
402 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyContext(pThisCC, pDXContext);
403
404 RT_ZERO(*pDXContext);
405 pDXContext->cid = SVGA3D_INVALID_ID;
406
407 return rc;
408}
409
410
411int vmsvga3dDXBindContext(PVGASTATECC pThisCC, uint32_t cid, SVGADXContextMobFormat *pSvgaDXContext)
412{
413 int rc;
414 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
415 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindContext, VERR_INVALID_STATE);
416 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
417 AssertReturn(p3dState, VERR_INVALID_STATE);
418
419 PVMSVGA3DDXCONTEXT pDXContext;
420 rc = vmsvga3dDXContextFromCid(p3dState, cid, &pDXContext);
421 AssertRCReturn(rc, rc);
422
423 if (pSvgaDXContext)
424 memcpy(&pDXContext->svgaDXContext, pSvgaDXContext, sizeof(*pSvgaDXContext));
425
426 rc = pSvgaR3State->pFuncsDX->pfnDXBindContext(pThisCC, pDXContext);
427 return rc;
428}
429
430
431int vmsvga3dDXReadbackContext(PVGASTATECC pThisCC, uint32_t idDXContext, SVGADXContextMobFormat *pSvgaDXContext)
432{
433 int rc;
434 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
435 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXReadbackContext, VERR_INVALID_STATE);
436 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
437 AssertReturn(p3dState, VERR_INVALID_STATE);
438
439 PVMSVGA3DDXCONTEXT pDXContext;
440 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
441 AssertRCReturn(rc, rc);
442
443 rc = pSvgaR3State->pFuncsDX->pfnDXReadbackContext(pThisCC, pDXContext);
444 if (RT_SUCCESS(rc))
445 memcpy(pSvgaDXContext, &pDXContext->svgaDXContext, sizeof(*pSvgaDXContext));
446 return rc;
447}
448
449
450int vmsvga3dDXInvalidateContext(PVGASTATECC pThisCC, uint32_t idDXContext)
451{
452 int rc;
453 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
454 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXInvalidateContext, VERR_INVALID_STATE);
455 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
456 AssertReturn(p3dState, VERR_INVALID_STATE);
457
458 PVMSVGA3DDXCONTEXT pDXContext;
459 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
460 AssertRCReturn(rc, rc);
461
462 rc = pSvgaR3State->pFuncsDX->pfnDXInvalidateContext(pThisCC, pDXContext);
463 return rc;
464}
465
466
467int vmsvga3dDXSetSingleConstantBuffer(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetSingleConstantBuffer const *pCmd)
468{
469 int rc;
470 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
471 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetSingleConstantBuffer, VERR_INVALID_STATE);
472 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
473 AssertReturn(p3dState, VERR_INVALID_STATE);
474
475 PVMSVGA3DDXCONTEXT pDXContext;
476 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
477 AssertRCReturn(rc, rc);
478
479 ASSERT_GUEST_RETURN(pCmd->slot < SVGA3D_DX_MAX_CONSTBUFFERS, VERR_INVALID_PARAMETER);
480 ASSERT_GUEST_RETURN(pCmd->type >= SVGA3D_SHADERTYPE_MIN && pCmd->type < SVGA3D_SHADERTYPE_MAX, VERR_INVALID_PARAMETER);
481 RT_UNTRUSTED_VALIDATED_FENCE();
482
483 uint32_t const idxShaderState = pCmd->type - SVGA3D_SHADERTYPE_MIN;
484 SVGA3dConstantBufferBinding *pCBB = &pDXContext->svgaDXContext.shaderState[idxShaderState].constantBuffers[pCmd->slot];
485 pCBB->sid = pCmd->sid;
486 pCBB->offsetInBytes = pCmd->offsetInBytes;
487 pCBB->sizeInBytes = pCmd->sizeInBytes;
488
489 rc = pSvgaR3State->pFuncsDX->pfnDXSetSingleConstantBuffer(pThisCC, pDXContext, pCmd->slot, pCmd->type, pCmd->sid, pCmd->offsetInBytes, pCmd->sizeInBytes);
490 return rc;
491}
492
493
494int vmsvga3dDXSetShaderResources(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetShaderResources const *pCmd, uint32_t cShaderResourceViewId, SVGA3dShaderResourceViewId const *paShaderResourceViewId)
495{
496 int rc;
497 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
498 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetShaderResources, VERR_INVALID_STATE);
499 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
500 AssertReturn(p3dState, VERR_INVALID_STATE);
501
502 PVMSVGA3DDXCONTEXT pDXContext;
503 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
504 AssertRCReturn(rc, rc);
505
506 ASSERT_GUEST_RETURN(pCmd->startView < SVGA3D_DX_MAX_SRVIEWS, VERR_INVALID_PARAMETER);
507 ASSERT_GUEST_RETURN(cShaderResourceViewId <= SVGA3D_DX_MAX_SRVIEWS - pCmd->startView, VERR_INVALID_PARAMETER);
508 ASSERT_GUEST_RETURN(pCmd->type >= SVGA3D_SHADERTYPE_MIN && pCmd->type < SVGA3D_SHADERTYPE_MAX, VERR_INVALID_PARAMETER);
509 for (uint32_t i = 0; i < cShaderResourceViewId; ++i)
510 ASSERT_GUEST_RETURN( paShaderResourceViewId[i] < pDXContext->cot.cSRView
511 || paShaderResourceViewId[i] == SVGA3D_INVALID_ID, VERR_INVALID_PARAMETER);
512 RT_UNTRUSTED_VALIDATED_FENCE();
513
514 uint32_t const idxShaderState = pCmd->type - SVGA3D_SHADERTYPE_MIN;
515 for (uint32_t i = 0; i < cShaderResourceViewId; ++i)
516 {
517 SVGA3dShaderResourceViewId const shaderResourceViewId = paShaderResourceViewId[i];
518 pDXContext->svgaDXContext.shaderState[idxShaderState].shaderResources[pCmd->startView + i] = shaderResourceViewId;
519 }
520
521 rc = pSvgaR3State->pFuncsDX->pfnDXSetShaderResources(pThisCC, pDXContext, pCmd->startView, pCmd->type, cShaderResourceViewId, paShaderResourceViewId);
522 return rc;
523}
524
525
526int vmsvga3dDXSetShader(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetShader const *pCmd)
527{
528 int rc;
529 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
530 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetShader, VERR_INVALID_STATE);
531 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
532 AssertReturn(p3dState, VERR_INVALID_STATE);
533
534 PVMSVGA3DDXCONTEXT pDXContext;
535 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
536 AssertRCReturn(rc, rc);
537
538 ASSERT_GUEST_RETURN( pCmd->shaderId < pDXContext->cot.cShader
539 || pCmd->shaderId == SVGA_ID_INVALID, VERR_INVALID_PARAMETER);
540 ASSERT_GUEST_RETURN(pCmd->type >= SVGA3D_SHADERTYPE_MIN && pCmd->type < SVGA3D_SHADERTYPE_MAX, VERR_INVALID_PARAMETER);
541 RT_UNTRUSTED_VALIDATED_FENCE();
542
543 uint32_t const idxShaderState = pCmd->type - SVGA3D_SHADERTYPE_MIN;
544 pDXContext->svgaDXContext.shaderState[idxShaderState].shaderId = pCmd->shaderId;
545
546 rc = pSvgaR3State->pFuncsDX->pfnDXSetShader(pThisCC, pDXContext, pCmd->shaderId, pCmd->type);
547 return rc;
548}
549
550
551int vmsvga3dDXSetSamplers(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetSamplers const *pCmd, uint32_t cSamplerId, SVGA3dSamplerId const *paSamplerId)
552{
553 int rc;
554 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
555 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetSamplers, VERR_INVALID_STATE);
556 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
557 AssertReturn(p3dState, VERR_INVALID_STATE);
558
559 PVMSVGA3DDXCONTEXT pDXContext;
560 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
561 AssertRCReturn(rc, rc);
562
563 ASSERT_GUEST_RETURN(pCmd->startSampler < SVGA3D_DX_MAX_SAMPLERS, VERR_INVALID_PARAMETER);
564 ASSERT_GUEST_RETURN(cSamplerId <= SVGA3D_DX_MAX_SAMPLERS - pCmd->startSampler, VERR_INVALID_PARAMETER);
565 ASSERT_GUEST_RETURN(pCmd->type >= SVGA3D_SHADERTYPE_MIN && pCmd->type < SVGA3D_SHADERTYPE_MAX, VERR_INVALID_PARAMETER);
566 RT_UNTRUSTED_VALIDATED_FENCE();
567
568 uint32_t const idxShaderState = pCmd->type - SVGA3D_SHADERTYPE_MIN;
569 for (uint32_t i = 0; i < cSamplerId; ++i)
570 {
571 SVGA3dSamplerId const samplerId = paSamplerId[i];
572 ASSERT_GUEST_RETURN( samplerId < pDXContext->cot.cSampler
573 || samplerId == SVGA_ID_INVALID, VERR_INVALID_PARAMETER);
574 pDXContext->svgaDXContext.shaderState[idxShaderState].samplers[pCmd->startSampler + i] = samplerId;
575 }
576 RT_UNTRUSTED_VALIDATED_FENCE();
577
578 rc = pSvgaR3State->pFuncsDX->pfnDXSetSamplers(pThisCC, pDXContext, pCmd->startSampler, pCmd->type, cSamplerId, paSamplerId);
579 return rc;
580}
581
582
583#ifdef DUMP_BITMAPS
584static void vmsvga3dDXDrawDumpRenderTargets(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, const char *pszPrefix = NULL)
585{
586 for (uint32_t i = 0; i < SVGA3D_MAX_SIMULTANEOUS_RENDER_TARGETS; ++i)
587 {
588 if (pDXContext->svgaDXContext.renderState.renderTargetViewIds[i] != SVGA3D_INVALID_ID)
589 {
590 SVGACOTableDXRTViewEntry *pRTViewEntry = &pDXContext->cot.paRTView[pDXContext->svgaDXContext.renderState.renderTargetViewIds[i]];
591 Log(("Dump RT[%u] sid = %u rtvid = %u\n", i, pRTViewEntry->sid, pDXContext->svgaDXContext.renderState.renderTargetViewIds[i]));
592
593 SVGA3dSurfaceImageId image;
594 image.sid = pRTViewEntry->sid;
595 image.face = 0;
596 image.mipmap = 0;
597 VMSVGA3D_MAPPED_SURFACE map;
598 int rc = vmsvga3dSurfaceMap(pThisCC, &image, NULL, VMSVGA3D_SURFACE_MAP_READ, &map);
599 if (RT_SUCCESS(rc))
600 {
601 vmsvga3dMapWriteBmpFile(&map, pszPrefix ? pszPrefix : "rt-");
602 vmsvga3dSurfaceUnmap(pThisCC, &image, &map, /* fWritten = */ false);
603 }
604 else
605 Log(("Map failed %Rrc\n", rc));
606 }
607 }
608}
609#endif
610
611int vmsvga3dDXDraw(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDraw const *pCmd)
612{
613 int rc;
614 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
615 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDraw, VERR_INVALID_STATE);
616 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
617 AssertReturn(p3dState, VERR_INVALID_STATE);
618
619 PVMSVGA3DDXCONTEXT pDXContext;
620 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
621 AssertRCReturn(rc, rc);
622
623 rc = pSvgaR3State->pFuncsDX->pfnDXDraw(pThisCC, pDXContext, pCmd->vertexCount, pCmd->startVertexLocation);
624#ifdef DUMP_BITMAPS
625 vmsvga3dDXDrawDumpRenderTargets(pThisCC, pDXContext);
626#endif
627 return rc;
628}
629
630
631int vmsvga3dDXDrawIndexed(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDrawIndexed const *pCmd)
632{
633 int rc;
634 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
635 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDrawIndexed, VERR_INVALID_STATE);
636 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
637 AssertReturn(p3dState, VERR_INVALID_STATE);
638
639 PVMSVGA3DDXCONTEXT pDXContext;
640 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
641 AssertRCReturn(rc, rc);
642
643 rc = pSvgaR3State->pFuncsDX->pfnDXDrawIndexed(pThisCC, pDXContext, pCmd->indexCount, pCmd->startIndexLocation, pCmd->baseVertexLocation);
644#ifdef DUMP_BITMAPS
645 vmsvga3dDXDrawDumpRenderTargets(pThisCC, pDXContext);
646#endif
647 return rc;
648}
649
650
651int vmsvga3dDXDrawInstanced(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDrawInstanced const *pCmd)
652{
653 int rc;
654 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
655 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDrawInstanced, VERR_INVALID_STATE);
656 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
657 AssertReturn(p3dState, VERR_INVALID_STATE);
658
659 PVMSVGA3DDXCONTEXT pDXContext;
660 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
661 AssertRCReturn(rc, rc);
662
663 rc = pSvgaR3State->pFuncsDX->pfnDXDrawInstanced(pThisCC, pDXContext,
664 pCmd->vertexCountPerInstance, pCmd->instanceCount, pCmd->startVertexLocation, pCmd->startInstanceLocation);
665#ifdef DUMP_BITMAPS
666 vmsvga3dDXDrawDumpRenderTargets(pThisCC, pDXContext);
667#endif
668 return rc;
669}
670
671
672int vmsvga3dDXDrawIndexedInstanced(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDrawIndexedInstanced const *pCmd)
673{
674 int rc;
675 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
676 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDrawIndexedInstanced, VERR_INVALID_STATE);
677 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
678 AssertReturn(p3dState, VERR_INVALID_STATE);
679
680 PVMSVGA3DDXCONTEXT pDXContext;
681 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
682 AssertRCReturn(rc, rc);
683
684 rc = pSvgaR3State->pFuncsDX->pfnDXDrawIndexedInstanced(pThisCC, pDXContext,
685 pCmd->indexCountPerInstance, pCmd->instanceCount, pCmd->startIndexLocation, pCmd->baseVertexLocation, pCmd->startInstanceLocation);
686#ifdef DUMP_BITMAPS
687 vmsvga3dDXDrawDumpRenderTargets(pThisCC, pDXContext);
688#endif
689 return rc;
690}
691
692
693int vmsvga3dDXDrawAuto(PVGASTATECC pThisCC, uint32_t idDXContext)
694{
695 int rc;
696 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
697 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDrawAuto, VERR_INVALID_STATE);
698 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
699 AssertReturn(p3dState, VERR_INVALID_STATE);
700
701 PVMSVGA3DDXCONTEXT pDXContext;
702 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
703 AssertRCReturn(rc, rc);
704
705 rc = pSvgaR3State->pFuncsDX->pfnDXDrawAuto(pThisCC, pDXContext);
706#ifdef DUMP_BITMAPS
707 vmsvga3dDXDrawDumpRenderTargets(pThisCC, pDXContext);
708#endif
709 return rc;
710}
711
712
713int vmsvga3dDXSetInputLayout(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dElementLayoutId elementLayoutId)
714{
715 int rc;
716 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
717 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetInputLayout, VERR_INVALID_STATE);
718 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
719 AssertReturn(p3dState, VERR_INVALID_STATE);
720
721 PVMSVGA3DDXCONTEXT pDXContext;
722 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
723 AssertRCReturn(rc, rc);
724
725 ASSERT_GUEST_RETURN( elementLayoutId == SVGA3D_INVALID_ID
726 || elementLayoutId < pDXContext->cot.cElementLayout, VERR_INVALID_PARAMETER);
727 RT_UNTRUSTED_VALIDATED_FENCE();
728
729 pDXContext->svgaDXContext.inputAssembly.layoutId = elementLayoutId;
730
731 rc = pSvgaR3State->pFuncsDX->pfnDXSetInputLayout(pThisCC, pDXContext, elementLayoutId);
732 return rc;
733}
734
735
736int vmsvga3dDXSetVertexBuffers(PVGASTATECC pThisCC, uint32_t idDXContext, uint32_t startBuffer, uint32_t cVertexBuffer, SVGA3dVertexBuffer const *paVertexBuffer)
737{
738 int rc;
739 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
740 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetVertexBuffers, VERR_INVALID_STATE);
741 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
742 AssertReturn(p3dState, VERR_INVALID_STATE);
743
744 PVMSVGA3DDXCONTEXT pDXContext;
745 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
746 AssertRCReturn(rc, rc);
747
748 ASSERT_GUEST_RETURN(startBuffer < SVGA3D_DX_MAX_VERTEXBUFFERS, VERR_INVALID_PARAMETER);
749 ASSERT_GUEST_RETURN(cVertexBuffer <= SVGA3D_DX_MAX_VERTEXBUFFERS - startBuffer, VERR_INVALID_PARAMETER);
750 RT_UNTRUSTED_VALIDATED_FENCE();
751
752 for (uint32_t i = 0; i < cVertexBuffer; ++i)
753 {
754 uint32_t const idxVertexBuffer = startBuffer + i;
755
756 pDXContext->svgaDXContext.inputAssembly.vertexBuffers[idxVertexBuffer].bufferId = paVertexBuffer[i].sid;
757 pDXContext->svgaDXContext.inputAssembly.vertexBuffers[idxVertexBuffer].stride = paVertexBuffer[i].stride;
758 pDXContext->svgaDXContext.inputAssembly.vertexBuffers[idxVertexBuffer].offset = paVertexBuffer[i].offset;
759 }
760
761 rc = pSvgaR3State->pFuncsDX->pfnDXSetVertexBuffers(pThisCC, pDXContext, startBuffer, cVertexBuffer, paVertexBuffer);
762 return rc;
763}
764
765
766int vmsvga3dDXSetIndexBuffer(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetIndexBuffer const *pCmd)
767{
768 int rc;
769 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
770 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetIndexBuffer, VERR_INVALID_STATE);
771 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
772 AssertReturn(p3dState, VERR_INVALID_STATE);
773
774 PVMSVGA3DDXCONTEXT pDXContext;
775 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
776 AssertRCReturn(rc, rc);
777
778 pDXContext->svgaDXContext.inputAssembly.indexBufferSid = pCmd->sid;
779 pDXContext->svgaDXContext.inputAssembly.indexBufferOffset = pCmd->offset;
780 pDXContext->svgaDXContext.inputAssembly.indexBufferFormat = pCmd->format;
781
782 rc = pSvgaR3State->pFuncsDX->pfnDXSetIndexBuffer(pThisCC, pDXContext, pCmd->sid, pCmd->format, pCmd->offset);
783 return rc;
784}
785
786
787int vmsvga3dDXSetTopology(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dPrimitiveType topology)
788{
789 int rc;
790 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
791 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetTopology, VERR_INVALID_STATE);
792 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
793 AssertReturn(p3dState, VERR_INVALID_STATE);
794
795 PVMSVGA3DDXCONTEXT pDXContext;
796 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
797 AssertRCReturn(rc, rc);
798
799 ASSERT_GUEST_RETURN(topology >= SVGA3D_PRIMITIVE_MIN && topology < SVGA3D_PRIMITIVE_MAX, VERR_INVALID_PARAMETER);
800
801 pDXContext->svgaDXContext.inputAssembly.topology = topology;
802
803 rc = pSvgaR3State->pFuncsDX->pfnDXSetTopology(pThisCC, pDXContext, topology);
804 return rc;
805}
806
807
808int vmsvga3dDXSetRenderTargets(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dDepthStencilViewId depthStencilViewId, uint32_t cRenderTargetViewId, SVGA3dRenderTargetViewId const *paRenderTargetViewId)
809{
810 int rc;
811 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
812 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetRenderTargets, VERR_INVALID_STATE);
813 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
814 AssertReturn(p3dState, VERR_INVALID_STATE);
815
816 PVMSVGA3DDXCONTEXT pDXContext;
817 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
818 AssertRCReturn(rc, rc);
819
820 ASSERT_GUEST_RETURN( depthStencilViewId < pDXContext->cot.cDSView
821 || depthStencilViewId == SVGA_ID_INVALID, VERR_INVALID_PARAMETER);
822 ASSERT_GUEST_RETURN(cRenderTargetViewId <= SVGA3D_MAX_RENDER_TARGETS, VERR_INVALID_PARAMETER);
823 for (uint32_t i = 0; i < cRenderTargetViewId; ++i)
824 ASSERT_GUEST_RETURN( paRenderTargetViewId[i] < pDXContext->cot.cRTView
825 || paRenderTargetViewId[i] == SVGA_ID_INVALID, VERR_INVALID_PARAMETER);
826 RT_UNTRUSTED_VALIDATED_FENCE();
827
828 pDXContext->svgaDXContext.renderState.depthStencilViewId = depthStencilViewId;
829 for (uint32_t i = 0; i < cRenderTargetViewId; ++i)
830 pDXContext->svgaDXContext.renderState.renderTargetViewIds[i] = paRenderTargetViewId[i];
831
832 /* Remember how many render target slots must be set. */
833 pDXContext->cRenderTargets = RT_MAX(pDXContext->cRenderTargets, cRenderTargetViewId);
834
835 rc = pSvgaR3State->pFuncsDX->pfnDXSetRenderTargets(pThisCC, pDXContext, depthStencilViewId, cRenderTargetViewId, paRenderTargetViewId);
836 return rc;
837}
838
839
840int vmsvga3dDXSetBlendState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetBlendState const *pCmd)
841{
842 int rc;
843 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
844 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetBlendState, VERR_INVALID_STATE);
845 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
846 AssertReturn(p3dState, VERR_INVALID_STATE);
847
848 PVMSVGA3DDXCONTEXT pDXContext;
849 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
850 AssertRCReturn(rc, rc);
851
852 SVGA3dBlendStateId const blendId = pCmd->blendId;
853
854 ASSERT_GUEST_RETURN( blendId == SVGA3D_INVALID_ID
855 || blendId < pDXContext->cot.cBlendState, VERR_INVALID_PARAMETER);
856 RT_UNTRUSTED_VALIDATED_FENCE();
857
858 pDXContext->svgaDXContext.renderState.blendStateId = blendId;
859 /* SVGADXContextMobFormat uses uint32_t array to store the blend factors, however they are in fact 32 bit floats. */
860 memcpy(pDXContext->svgaDXContext.renderState.blendFactor, pCmd->blendFactor, sizeof(pDXContext->svgaDXContext.renderState.blendFactor));
861 pDXContext->svgaDXContext.renderState.sampleMask = pCmd->sampleMask;
862
863 rc = pSvgaR3State->pFuncsDX->pfnDXSetBlendState(pThisCC, pDXContext, blendId, pCmd->blendFactor, pCmd->sampleMask);
864 return rc;
865}
866
867
868int vmsvga3dDXSetDepthStencilState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetDepthStencilState const *pCmd)
869{
870 int rc;
871 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
872 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetDepthStencilState, VERR_INVALID_STATE);
873 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
874 AssertReturn(p3dState, VERR_INVALID_STATE);
875
876 PVMSVGA3DDXCONTEXT pDXContext;
877 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
878 AssertRCReturn(rc, rc);
879
880 SVGA3dDepthStencilStateId const depthStencilId = pCmd->depthStencilId;
881
882 ASSERT_GUEST_RETURN( depthStencilId == SVGA3D_INVALID_ID
883 || depthStencilId < pDXContext->cot.cDepthStencil, VERR_INVALID_PARAMETER);
884 RT_UNTRUSTED_VALIDATED_FENCE();
885
886 pDXContext->svgaDXContext.renderState.depthStencilStateId = depthStencilId;
887 pDXContext->svgaDXContext.renderState.stencilRef = pCmd->stencilRef;
888
889 rc = pSvgaR3State->pFuncsDX->pfnDXSetDepthStencilState(pThisCC, pDXContext, depthStencilId, pCmd->stencilRef);
890 return rc;
891}
892
893
894int vmsvga3dDXSetRasterizerState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dRasterizerStateId rasterizerId)
895{
896 int rc;
897 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
898 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetRasterizerState, VERR_INVALID_STATE);
899 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
900 AssertReturn(p3dState, VERR_INVALID_STATE);
901
902 PVMSVGA3DDXCONTEXT pDXContext;
903 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
904 AssertRCReturn(rc, rc);
905
906 ASSERT_GUEST_RETURN( rasterizerId == SVGA3D_INVALID_ID
907 || rasterizerId < pDXContext->cot.cRasterizerState, VERR_INVALID_PARAMETER);
908 RT_UNTRUSTED_VALIDATED_FENCE();
909
910 pDXContext->svgaDXContext.renderState.rasterizerStateId = rasterizerId;
911
912 rc = pSvgaR3State->pFuncsDX->pfnDXSetRasterizerState(pThisCC, pDXContext, rasterizerId);
913 return rc;
914}
915
916
917int vmsvga3dDXDefineQuery(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineQuery const *pCmd)
918{
919 int rc;
920 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
921 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineQuery, VERR_INVALID_STATE);
922 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
923 AssertReturn(p3dState, VERR_INVALID_STATE);
924
925 PVMSVGA3DDXCONTEXT pDXContext;
926 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
927 AssertRCReturn(rc, rc);
928
929 SVGA3dQueryId const queryId = pCmd->queryId;
930
931 ASSERT_GUEST_RETURN(pDXContext->cot.paQuery, VERR_INVALID_STATE);
932 ASSERT_GUEST_RETURN(queryId < pDXContext->cot.cQuery, VERR_INVALID_PARAMETER);
933 ASSERT_GUEST_RETURN(pCmd->type >= SVGA3D_QUERYTYPE_MIN && pCmd->type < SVGA3D_QUERYTYPE_MAX, VERR_INVALID_PARAMETER);
934 RT_UNTRUSTED_VALIDATED_FENCE();
935
936 /* Cleanup the current query. */
937 pSvgaR3State->pFuncsDX->pfnDXDestroyQuery(pThisCC, pDXContext, queryId);
938
939 SVGACOTableDXQueryEntry *pEntry = &pDXContext->cot.paQuery[queryId];
940 pEntry->type = pCmd->type;
941 pEntry->state = SVGADX_QDSTATE_IDLE;
942 pEntry->flags = pCmd->flags;
943 pEntry->mobid = SVGA_ID_INVALID;
944 pEntry->offset = 0;
945
946 rc = pSvgaR3State->pFuncsDX->pfnDXDefineQuery(pThisCC, pDXContext, queryId, pEntry);
947 return rc;
948}
949
950
951int vmsvga3dDXDestroyQuery(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyQuery const *pCmd)
952{
953 int rc;
954 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
955 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyQuery, VERR_INVALID_STATE);
956 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
957 AssertReturn(p3dState, VERR_INVALID_STATE);
958
959 PVMSVGA3DDXCONTEXT pDXContext;
960 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
961 AssertRCReturn(rc, rc);
962
963 SVGA3dQueryId const queryId = pCmd->queryId;
964
965 ASSERT_GUEST_RETURN(pDXContext->cot.paQuery, VERR_INVALID_STATE);
966 ASSERT_GUEST_RETURN(queryId < pDXContext->cot.cQuery, VERR_INVALID_PARAMETER);
967 RT_UNTRUSTED_VALIDATED_FENCE();
968
969 pSvgaR3State->pFuncsDX->pfnDXDestroyQuery(pThisCC, pDXContext, queryId);
970
971 /* Cleanup COTable entry.*/
972 SVGACOTableDXQueryEntry *pEntry = &pDXContext->cot.paQuery[queryId];
973 pEntry->type = SVGA3D_QUERYTYPE_INVALID;
974 pEntry->state = SVGADX_QDSTATE_INVALID;
975 pEntry->flags = 0;
976 pEntry->mobid = SVGA_ID_INVALID;
977 pEntry->offset = 0;
978
979 return rc;
980}
981
982
983int vmsvga3dDXBindQuery(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXBindQuery const *pCmd, PVMSVGAMOB pMob)
984{
985 int rc;
986 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
987 AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE);
988 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
989 AssertReturn(p3dState, VERR_INVALID_STATE);
990
991 PVMSVGA3DDXCONTEXT pDXContext;
992 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
993 AssertRCReturn(rc, rc);
994
995 SVGA3dQueryId const queryId = pCmd->queryId;
996
997 ASSERT_GUEST_RETURN(pDXContext->cot.paQuery, VERR_INVALID_STATE);
998 ASSERT_GUEST_RETURN(queryId < pDXContext->cot.cQuery, VERR_INVALID_PARAMETER);
999 RT_UNTRUSTED_VALIDATED_FENCE();
1000
1001 SVGACOTableDXQueryEntry *pEntry = &pDXContext->cot.paQuery[queryId];
1002 pEntry->mobid = vmsvgaR3MobId(pMob);
1003
1004 return rc;
1005}
1006
1007
1008int vmsvga3dDXSetQueryOffset(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetQueryOffset const *pCmd)
1009{
1010 int rc;
1011 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1012 AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE);
1013 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1014 AssertReturn(p3dState, VERR_INVALID_STATE);
1015
1016 PVMSVGA3DDXCONTEXT pDXContext;
1017 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1018 AssertRCReturn(rc, rc);
1019
1020 SVGA3dQueryId const queryId = pCmd->queryId;
1021
1022 ASSERT_GUEST_RETURN(pDXContext->cot.paQuery, VERR_INVALID_STATE);
1023 ASSERT_GUEST_RETURN(queryId < pDXContext->cot.cQuery, VERR_INVALID_PARAMETER);
1024 RT_UNTRUSTED_VALIDATED_FENCE();
1025
1026 SVGACOTableDXQueryEntry *pEntry = &pDXContext->cot.paQuery[queryId];
1027 pEntry->offset = pCmd->mobOffset;
1028
1029 return rc;
1030}
1031
1032
1033int vmsvga3dDXBeginQuery(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXBeginQuery const *pCmd)
1034{
1035 int rc;
1036 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1037 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBeginQuery, VERR_INVALID_STATE);
1038 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1039 AssertReturn(p3dState, VERR_INVALID_STATE);
1040
1041 PVMSVGA3DDXCONTEXT pDXContext;
1042 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1043 AssertRCReturn(rc, rc);
1044
1045 SVGA3dQueryId const queryId = pCmd->queryId;
1046
1047 ASSERT_GUEST_RETURN(pDXContext->cot.paQuery, VERR_INVALID_STATE);
1048 ASSERT_GUEST_RETURN(queryId < pDXContext->cot.cQuery, VERR_INVALID_PARAMETER);
1049 RT_UNTRUSTED_VALIDATED_FENCE();
1050
1051 SVGACOTableDXQueryEntry *pEntry = &pDXContext->cot.paQuery[queryId];
1052 Assert(pEntry->state == SVGADX_QDSTATE_IDLE || pEntry->state == SVGADX_QDSTATE_PENDING || pEntry->state == SVGADX_QDSTATE_FINISHED);
1053 if (pEntry->state != SVGADX_QDSTATE_ACTIVE)
1054 {
1055 rc = pSvgaR3State->pFuncsDX->pfnDXBeginQuery(pThisCC, pDXContext, queryId);
1056 if (RT_SUCCESS(rc))
1057 {
1058 pEntry->state = SVGADX_QDSTATE_ACTIVE;
1059
1060 /* Update the guest status of the query. */
1061 uint32_t const u32 = SVGA3D_QUERYSTATE_PENDING;
1062 dxMobWrite(pSvgaR3State, pEntry->mobid, pEntry->offset, &u32, sizeof(u32));
1063 }
1064 else
1065 {
1066 uint32_t const u32 = SVGA3D_QUERYSTATE_FAILED;
1067 dxMobWrite(pSvgaR3State, pEntry->mobid, pEntry->offset, &u32, sizeof(u32));
1068 }
1069 }
1070 return rc;
1071}
1072
1073
1074static int dxEndQuery(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, SVGA3dQueryId queryId, SVGACOTableDXQueryEntry *pEntry)
1075{
1076 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1077
1078 int rc = VINF_SUCCESS;
1079 if (pEntry->state == SVGADX_QDSTATE_ACTIVE || pEntry->state == SVGADX_QDSTATE_IDLE)
1080 {
1081 pEntry->state = SVGADX_QDSTATE_PENDING;
1082
1083 uint32_t u32QueryState;
1084 SVGADXQueryResultUnion queryResult;
1085 uint32_t cbQuery = 0; /* Actual size of query data returned by backend. */
1086 rc = pSvgaR3State->pFuncsDX->pfnDXEndQuery(pThisCC, pDXContext, queryId, &queryResult, &cbQuery);
1087 if (RT_SUCCESS(rc))
1088 {
1089 /* Write the result after SVGA3dQueryState. */
1090 dxMobWrite(pSvgaR3State, pEntry->mobid, pEntry->offset + sizeof(uint32_t), &queryResult, cbQuery);
1091
1092 u32QueryState = SVGA3D_QUERYSTATE_SUCCEEDED;
1093 }
1094 else
1095 u32QueryState = SVGA3D_QUERYSTATE_FAILED;
1096
1097 dxMobWrite(pSvgaR3State, pEntry->mobid, pEntry->offset, &u32QueryState, sizeof(u32QueryState));
1098
1099 if (RT_SUCCESS(rc))
1100 pEntry->state = SVGADX_QDSTATE_FINISHED;
1101 }
1102 else
1103 AssertStmt(pEntry->state == SVGADX_QDSTATE_FINISHED, rc = VERR_INVALID_STATE);
1104
1105 return rc;
1106}
1107
1108
1109int vmsvga3dDXEndQuery(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXEndQuery const *pCmd)
1110{
1111 int rc;
1112 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1113 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXEndQuery, VERR_INVALID_STATE);
1114 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1115 AssertReturn(p3dState, VERR_INVALID_STATE);
1116
1117 PVMSVGA3DDXCONTEXT pDXContext;
1118 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1119 AssertRCReturn(rc, rc);
1120
1121 SVGA3dQueryId const queryId = pCmd->queryId;
1122
1123 ASSERT_GUEST_RETURN(pDXContext->cot.paQuery, VERR_INVALID_STATE);
1124 ASSERT_GUEST_RETURN(queryId < pDXContext->cot.cQuery, VERR_INVALID_PARAMETER);
1125 RT_UNTRUSTED_VALIDATED_FENCE();
1126
1127 SVGACOTableDXQueryEntry *pEntry = &pDXContext->cot.paQuery[queryId];
1128 rc = dxEndQuery(pThisCC, pDXContext, queryId, pEntry);
1129 return rc;
1130}
1131
1132
1133int vmsvga3dDXReadbackQuery(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXReadbackQuery const *pCmd)
1134{
1135 int rc;
1136 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1137 AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE);
1138 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1139 AssertReturn(p3dState, VERR_INVALID_STATE);
1140
1141 PVMSVGA3DDXCONTEXT pDXContext;
1142 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1143 AssertRCReturn(rc, rc);
1144
1145 SVGA3dQueryId const queryId = pCmd->queryId;
1146
1147 ASSERT_GUEST_RETURN(pDXContext->cot.paQuery, VERR_INVALID_STATE);
1148 ASSERT_GUEST_RETURN(queryId < pDXContext->cot.cQuery, VERR_INVALID_PARAMETER);
1149 RT_UNTRUSTED_VALIDATED_FENCE();
1150
1151 /* The device does not cache queries. So this is a NOP. */
1152
1153 return rc;
1154}
1155
1156
1157int vmsvga3dDXSetPredication(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetPredication const *pCmd)
1158{
1159 int rc;
1160 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1161 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetPredication, VERR_INVALID_STATE);
1162 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1163 AssertReturn(p3dState, VERR_INVALID_STATE);
1164
1165 PVMSVGA3DDXCONTEXT pDXContext;
1166 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1167 AssertRCReturn(rc, rc);
1168
1169 SVGA3dQueryId const queryId = pCmd->queryId;
1170
1171 ASSERT_GUEST_RETURN( queryId == SVGA3D_INVALID_ID
1172 || queryId < pDXContext->cot.cQuery, VERR_INVALID_PARAMETER);
1173 RT_UNTRUSTED_VALIDATED_FENCE();
1174
1175 pDXContext->svgaDXContext.predication.queryID = queryId;
1176 pDXContext->svgaDXContext.predication.value = pCmd->predicateValue;
1177
1178 rc = pSvgaR3State->pFuncsDX->pfnDXSetPredication(pThisCC, pDXContext, queryId, pCmd->predicateValue);
1179 return rc;
1180}
1181
1182
1183int vmsvga3dDXSetSOTargets(PVGASTATECC pThisCC, uint32_t idDXContext, uint32_t cSoTarget, SVGA3dSoTarget const *paSoTarget)
1184{
1185 int rc;
1186 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1187 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetSOTargets, VERR_INVALID_STATE);
1188 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1189 AssertReturn(p3dState, VERR_INVALID_STATE);
1190
1191 PVMSVGA3DDXCONTEXT pDXContext;
1192 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1193 AssertRCReturn(rc, rc);
1194
1195 ASSERT_GUEST_RETURN(cSoTarget <= SVGA3D_DX_MAX_SOTARGETS, VERR_INVALID_PARAMETER);
1196 RT_UNTRUSTED_VALIDATED_FENCE();
1197
1198 /** @todo Offset is not stored in svgaDXContext. Should it be stored elsewhere? */
1199 for (uint32_t i = 0; i < SVGA3D_DX_MAX_SOTARGETS; ++i)
1200 pDXContext->svgaDXContext.streamOut.targets[i] = i < cSoTarget ? paSoTarget[i].sid : SVGA3D_INVALID_ID;
1201
1202 rc = pSvgaR3State->pFuncsDX->pfnDXSetSOTargets(pThisCC, pDXContext, cSoTarget, paSoTarget);
1203 return rc;
1204}
1205
1206
1207int vmsvga3dDXSetViewports(PVGASTATECC pThisCC, uint32_t idDXContext, uint32_t cViewport, SVGA3dViewport const *paViewport)
1208{
1209 int rc;
1210 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1211 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetViewports, VERR_INVALID_STATE);
1212 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1213 AssertReturn(p3dState, VERR_INVALID_STATE);
1214
1215 PVMSVGA3DDXCONTEXT pDXContext;
1216 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1217 AssertRCReturn(rc, rc);
1218
1219 ASSERT_GUEST_RETURN(cViewport <= SVGA3D_DX_MAX_VIEWPORTS, VERR_INVALID_PARAMETER);
1220 RT_UNTRUSTED_VALIDATED_FENCE();
1221
1222 pDXContext->svgaDXContext.numViewports = (uint8_t)cViewport;
1223 for (uint32_t i = 0; i < cViewport; ++i)
1224 pDXContext->svgaDXContext.viewports[i] = paViewport[i];
1225
1226 rc = pSvgaR3State->pFuncsDX->pfnDXSetViewports(pThisCC, pDXContext, cViewport, paViewport);
1227 return rc;
1228}
1229
1230
1231int vmsvga3dDXSetScissorRects(PVGASTATECC pThisCC, uint32_t idDXContext, uint32_t cRect, SVGASignedRect const *paRect)
1232{
1233 int rc;
1234 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1235 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetScissorRects, VERR_INVALID_STATE);
1236 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1237 AssertReturn(p3dState, VERR_INVALID_STATE);
1238
1239 PVMSVGA3DDXCONTEXT pDXContext;
1240 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1241 AssertRCReturn(rc, rc);
1242
1243 ASSERT_GUEST_RETURN(cRect <= SVGA3D_DX_MAX_SCISSORRECTS, VERR_INVALID_PARAMETER);
1244 RT_UNTRUSTED_VALIDATED_FENCE();
1245
1246 pDXContext->svgaDXContext.numScissorRects = (uint8_t)cRect;
1247 for (uint32_t i = 0; i < cRect; ++i)
1248 pDXContext->svgaDXContext.scissorRects[i] = paRect[i];
1249
1250 rc = pSvgaR3State->pFuncsDX->pfnDXSetScissorRects(pThisCC, pDXContext, cRect, paRect);
1251 return rc;
1252}
1253
1254
1255int vmsvga3dDXClearRenderTargetView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXClearRenderTargetView const *pCmd)
1256{
1257 int rc;
1258 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1259 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXClearRenderTargetView, VERR_INVALID_STATE);
1260 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1261 AssertReturn(p3dState, VERR_INVALID_STATE);
1262
1263 PVMSVGA3DDXCONTEXT pDXContext;
1264 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1265 AssertRCReturn(rc, rc);
1266
1267 SVGA3dRenderTargetViewId const renderTargetViewId = pCmd->renderTargetViewId;
1268
1269 ASSERT_GUEST_RETURN(pDXContext->cot.paRTView, VERR_INVALID_STATE);
1270 ASSERT_GUEST_RETURN(renderTargetViewId < pDXContext->cot.cRTView, VERR_INVALID_PARAMETER);
1271 RT_UNTRUSTED_VALIDATED_FENCE();
1272
1273 rc = pSvgaR3State->pFuncsDX->pfnDXClearRenderTargetView(pThisCC, pDXContext, renderTargetViewId, &pCmd->rgba);
1274 return rc;
1275}
1276
1277
1278int vmsvga3dDXClearDepthStencilView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXClearDepthStencilView const *pCmd)
1279{
1280 int rc;
1281 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1282 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXClearDepthStencilView, VERR_INVALID_STATE);
1283 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1284 AssertReturn(p3dState, VERR_INVALID_STATE);
1285
1286 PVMSVGA3DDXCONTEXT pDXContext;
1287 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1288 AssertRCReturn(rc, rc);
1289
1290 SVGA3dDepthStencilViewId const depthStencilViewId = pCmd->depthStencilViewId;
1291
1292 ASSERT_GUEST_RETURN(pDXContext->cot.paDSView, VERR_INVALID_STATE);
1293 ASSERT_GUEST_RETURN(depthStencilViewId < pDXContext->cot.cDSView, VERR_INVALID_PARAMETER);
1294 RT_UNTRUSTED_VALIDATED_FENCE();
1295
1296 rc = pSvgaR3State->pFuncsDX->pfnDXClearDepthStencilView(pThisCC, pDXContext, pCmd->flags, depthStencilViewId, pCmd->depth, (uint8_t)pCmd->stencil);
1297 return rc;
1298}
1299
1300
1301int vmsvga3dDXPredCopyRegion(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXPredCopyRegion const *pCmd)
1302{
1303 int rc;
1304 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1305 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXPredCopyRegion, VERR_INVALID_STATE);
1306 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1307 AssertReturn(p3dState, VERR_INVALID_STATE);
1308
1309 PVMSVGA3DDXCONTEXT pDXContext;
1310 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1311 AssertRCReturn(rc, rc);
1312
1313 /** @todo Memcpy if both resources do not have the hardware resource. */
1314
1315 rc = pSvgaR3State->pFuncsDX->pfnDXPredCopyRegion(pThisCC, pDXContext, pCmd->dstSid, pCmd->dstSubResource, pCmd->srcSid, pCmd->srcSubResource, &pCmd->box);
1316 return rc;
1317}
1318
1319
1320int vmsvga3dDXPredCopy(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXPredCopy const *pCmd)
1321{
1322 int rc;
1323 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1324 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXPredCopy, VERR_INVALID_STATE);
1325 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1326 AssertReturn(p3dState, VERR_INVALID_STATE);
1327
1328 PVMSVGA3DDXCONTEXT pDXContext;
1329 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1330 AssertRCReturn(rc, rc);
1331
1332 rc = pSvgaR3State->pFuncsDX->pfnDXPredCopy(pThisCC, pDXContext, pCmd->dstSid, pCmd->srcSid);
1333 return rc;
1334}
1335
1336
1337int vmsvga3dDXPresentBlt(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXPresentBlt const *pCmd)
1338{
1339 int rc;
1340 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1341 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXPresentBlt, VERR_INVALID_STATE);
1342 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1343 AssertReturn(p3dState, VERR_INVALID_STATE);
1344
1345 PVMSVGA3DDXCONTEXT pDXContext;
1346 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1347 AssertRCReturn(rc, rc);
1348
1349 rc = pSvgaR3State->pFuncsDX->pfnDXPresentBlt(pThisCC, pDXContext,
1350 pCmd->dstSid, pCmd->destSubResource, &pCmd->boxDest,
1351 pCmd->srcSid, pCmd->srcSubResource, &pCmd->boxSrc, pCmd->mode);
1352 return rc;
1353}
1354
1355
1356int vmsvga3dDXGenMips(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXGenMips const *pCmd)
1357{
1358 int rc;
1359 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1360 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXGenMips, VERR_INVALID_STATE);
1361 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1362 AssertReturn(p3dState, VERR_INVALID_STATE);
1363
1364 PVMSVGA3DDXCONTEXT pDXContext;
1365 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1366 AssertRCReturn(rc, rc);
1367
1368 SVGA3dShaderResourceViewId const shaderResourceViewId = pCmd->shaderResourceViewId;
1369
1370 ASSERT_GUEST_RETURN(pDXContext->cot.paSRView, VERR_INVALID_STATE);
1371 ASSERT_GUEST_RETURN(shaderResourceViewId < pDXContext->cot.cSRView, VERR_INVALID_PARAMETER);
1372 RT_UNTRUSTED_VALIDATED_FENCE();
1373
1374 rc = pSvgaR3State->pFuncsDX->pfnDXGenMips(pThisCC, pDXContext, shaderResourceViewId);
1375 return rc;
1376}
1377
1378
1379int vmsvga3dDXDefineShaderResourceView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineShaderResourceView const *pCmd)
1380{
1381 int rc;
1382 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1383 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineShaderResourceView, VERR_INVALID_STATE);
1384 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1385 AssertReturn(p3dState, VERR_INVALID_STATE);
1386
1387 PVMSVGA3DDXCONTEXT pDXContext;
1388 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1389 AssertRCReturn(rc, rc);
1390
1391 SVGA3dShaderResourceViewId const shaderResourceViewId = pCmd->shaderResourceViewId;
1392
1393 ASSERT_GUEST_RETURN(pDXContext->cot.paSRView, VERR_INVALID_STATE);
1394 ASSERT_GUEST_RETURN(shaderResourceViewId < pDXContext->cot.cSRView, VERR_INVALID_PARAMETER);
1395 RT_UNTRUSTED_VALIDATED_FENCE();
1396
1397 SVGACOTableDXSRViewEntry *pEntry = &pDXContext->cot.paSRView[shaderResourceViewId];
1398 pEntry->sid = pCmd->sid;
1399 pEntry->format = pCmd->format;
1400 pEntry->resourceDimension = pCmd->resourceDimension;
1401 pEntry->desc = pCmd->desc;
1402
1403 rc = pSvgaR3State->pFuncsDX->pfnDXDefineShaderResourceView(pThisCC, pDXContext, shaderResourceViewId, pEntry);
1404 return rc;
1405}
1406
1407
1408int vmsvga3dDXDestroyShaderResourceView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyShaderResourceView const *pCmd)
1409{
1410 int rc;
1411 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1412 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyShaderResourceView, VERR_INVALID_STATE);
1413 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1414 AssertReturn(p3dState, VERR_INVALID_STATE);
1415
1416 PVMSVGA3DDXCONTEXT pDXContext;
1417 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1418 AssertRCReturn(rc, rc);
1419
1420 SVGA3dShaderResourceViewId const shaderResourceViewId = pCmd->shaderResourceViewId;
1421
1422 ASSERT_GUEST_RETURN(pDXContext->cot.paSRView, VERR_INVALID_STATE);
1423 ASSERT_GUEST_RETURN(shaderResourceViewId < pDXContext->cot.cSRView, VERR_INVALID_PARAMETER);
1424 RT_UNTRUSTED_VALIDATED_FENCE();
1425
1426 SVGACOTableDXSRViewEntry *pEntry = &pDXContext->cot.paSRView[shaderResourceViewId];
1427 RT_ZERO(*pEntry);
1428
1429 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyShaderResourceView(pThisCC, pDXContext, shaderResourceViewId);
1430 return rc;
1431}
1432
1433
1434int vmsvga3dDXDefineRenderTargetView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineRenderTargetView const *pCmd)
1435{
1436 int rc;
1437 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1438 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineRenderTargetView, VERR_INVALID_STATE);
1439 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1440 AssertReturn(p3dState, VERR_INVALID_STATE);
1441
1442 PVMSVGA3DDXCONTEXT pDXContext;
1443 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1444 AssertRCReturn(rc, rc);
1445
1446 SVGA3dRenderTargetViewId const renderTargetViewId = pCmd->renderTargetViewId;
1447
1448 ASSERT_GUEST_RETURN(pDXContext->cot.paRTView, VERR_INVALID_STATE);
1449 ASSERT_GUEST_RETURN(renderTargetViewId < pDXContext->cot.cRTView, VERR_INVALID_PARAMETER);
1450 RT_UNTRUSTED_VALIDATED_FENCE();
1451
1452 SVGACOTableDXRTViewEntry *pEntry = &pDXContext->cot.paRTView[renderTargetViewId];
1453 pEntry->sid = pCmd->sid;
1454 pEntry->format = pCmd->format;
1455 pEntry->resourceDimension = pCmd->resourceDimension;
1456 pEntry->desc = pCmd->desc;
1457
1458 rc = pSvgaR3State->pFuncsDX->pfnDXDefineRenderTargetView(pThisCC, pDXContext, renderTargetViewId, pEntry);
1459 return rc;
1460}
1461
1462
1463int vmsvga3dDXDestroyRenderTargetView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyRenderTargetView const *pCmd)
1464{
1465 int rc;
1466 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1467 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyRenderTargetView, VERR_INVALID_STATE);
1468 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1469 AssertReturn(p3dState, VERR_INVALID_STATE);
1470
1471 PVMSVGA3DDXCONTEXT pDXContext;
1472 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1473 AssertRCReturn(rc, rc);
1474
1475 SVGA3dRenderTargetViewId const renderTargetViewId = pCmd->renderTargetViewId;
1476
1477 ASSERT_GUEST_RETURN(pDXContext->cot.paRTView, VERR_INVALID_STATE);
1478 ASSERT_GUEST_RETURN(renderTargetViewId < pDXContext->cot.cRTView, VERR_INVALID_PARAMETER);
1479 RT_UNTRUSTED_VALIDATED_FENCE();
1480
1481 SVGACOTableDXRTViewEntry *pEntry = &pDXContext->cot.paRTView[renderTargetViewId];
1482 RT_ZERO(*pEntry);
1483
1484 for (uint32_t i = 0; i < SVGA3D_MAX_SIMULTANEOUS_RENDER_TARGETS; ++i)
1485 {
1486 if (pDXContext->svgaDXContext.renderState.renderTargetViewIds[i] == renderTargetViewId)
1487 pDXContext->svgaDXContext.renderState.renderTargetViewIds[i] = SVGA_ID_INVALID;
1488 }
1489
1490 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyRenderTargetView(pThisCC, pDXContext, renderTargetViewId);
1491 return rc;
1492}
1493
1494
1495int vmsvga3dDXDefineDepthStencilView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineDepthStencilView_v2 const *pCmd)
1496{
1497 int rc;
1498 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1499 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineDepthStencilView, VERR_INVALID_STATE);
1500 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1501 AssertReturn(p3dState, VERR_INVALID_STATE);
1502
1503 PVMSVGA3DDXCONTEXT pDXContext;
1504 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1505 AssertRCReturn(rc, rc);
1506
1507 SVGA3dDepthStencilViewId const depthStencilViewId = pCmd->depthStencilViewId;
1508
1509 ASSERT_GUEST_RETURN(pDXContext->cot.paDSView, VERR_INVALID_STATE);
1510 ASSERT_GUEST_RETURN(depthStencilViewId < pDXContext->cot.cDSView, VERR_INVALID_PARAMETER);
1511 RT_UNTRUSTED_VALIDATED_FENCE();
1512
1513 SVGACOTableDXDSViewEntry *pEntry = &pDXContext->cot.paDSView[depthStencilViewId];
1514 pEntry->sid = pCmd->sid;
1515 pEntry->format = pCmd->format;
1516 pEntry->resourceDimension = pCmd->resourceDimension;
1517 pEntry->mipSlice = pCmd->mipSlice;
1518 pEntry->firstArraySlice = pCmd->firstArraySlice;
1519 pEntry->arraySize = pCmd->arraySize;
1520 pEntry->flags = pCmd->flags;
1521
1522 rc = pSvgaR3State->pFuncsDX->pfnDXDefineDepthStencilView(pThisCC, pDXContext, depthStencilViewId, pEntry);
1523 return rc;
1524}
1525
1526
1527int vmsvga3dDXDestroyDepthStencilView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyDepthStencilView const *pCmd)
1528{
1529 int rc;
1530 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1531 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyDepthStencilView, VERR_INVALID_STATE);
1532 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1533 AssertReturn(p3dState, VERR_INVALID_STATE);
1534
1535 PVMSVGA3DDXCONTEXT pDXContext;
1536 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1537 AssertRCReturn(rc, rc);
1538
1539 SVGA3dDepthStencilViewId const depthStencilViewId = pCmd->depthStencilViewId;
1540
1541 ASSERT_GUEST_RETURN(pDXContext->cot.paDSView, VERR_INVALID_STATE);
1542 ASSERT_GUEST_RETURN(depthStencilViewId < pDXContext->cot.cDSView, VERR_INVALID_PARAMETER);
1543 RT_UNTRUSTED_VALIDATED_FENCE();
1544
1545 SVGACOTableDXDSViewEntry *pEntry = &pDXContext->cot.paDSView[depthStencilViewId];
1546 RT_ZERO(*pEntry);
1547
1548 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyDepthStencilView(pThisCC, pDXContext, depthStencilViewId);
1549 return rc;
1550}
1551
1552
1553int vmsvga3dDXDefineElementLayout(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dElementLayoutId elementLayoutId, uint32_t cDesc, SVGA3dInputElementDesc const *paDesc)
1554{
1555 int rc;
1556 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1557 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineElementLayout, VERR_INVALID_STATE);
1558 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1559 AssertReturn(p3dState, VERR_INVALID_STATE);
1560
1561 PVMSVGA3DDXCONTEXT pDXContext;
1562 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1563 AssertRCReturn(rc, rc);
1564
1565 ASSERT_GUEST_RETURN(pDXContext->cot.paElementLayout, VERR_INVALID_STATE);
1566 ASSERT_GUEST_RETURN(elementLayoutId < pDXContext->cot.cElementLayout, VERR_INVALID_PARAMETER);
1567 RT_UNTRUSTED_VALIDATED_FENCE();
1568
1569 SVGACOTableDXElementLayoutEntry *pEntry = &pDXContext->cot.paElementLayout[elementLayoutId];
1570 pEntry->elid = elementLayoutId;
1571 pEntry->numDescs = RT_MIN(cDesc, RT_ELEMENTS(pEntry->descs));
1572 memcpy(pEntry->descs, paDesc, pEntry->numDescs * sizeof(pEntry->descs[0]));
1573
1574#ifdef LOG_ENABLED
1575 Log6(("Element layout %d: slot off fmt class step reg\n", pEntry->elid));
1576 for (uint32_t i = 0; i < pEntry->numDescs; ++i)
1577 {
1578 Log6((" [%u]: %u 0x%02X %d %u %u %u\n",
1579 i,
1580 pEntry->descs[i].inputSlot,
1581 pEntry->descs[i].alignedByteOffset,
1582 pEntry->descs[i].format,
1583 pEntry->descs[i].inputSlotClass,
1584 pEntry->descs[i].instanceDataStepRate,
1585 pEntry->descs[i].inputRegister
1586 ));
1587 }
1588#endif
1589
1590 rc = pSvgaR3State->pFuncsDX->pfnDXDefineElementLayout(pThisCC, pDXContext, elementLayoutId, pEntry);
1591 return rc;
1592}
1593
1594
1595int vmsvga3dDXDestroyElementLayout(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyElementLayout const *pCmd)
1596{
1597 int rc;
1598 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1599 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyElementLayout, VERR_INVALID_STATE);
1600 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1601 AssertReturn(p3dState, VERR_INVALID_STATE);
1602
1603 PVMSVGA3DDXCONTEXT pDXContext;
1604 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1605 AssertRCReturn(rc, rc);
1606
1607 SVGA3dElementLayoutId const elementLayoutId = pCmd->elementLayoutId;
1608
1609 ASSERT_GUEST_RETURN(pDXContext->cot.paElementLayout, VERR_INVALID_STATE);
1610 ASSERT_GUEST_RETURN(elementLayoutId < pDXContext->cot.cElementLayout, VERR_INVALID_PARAMETER);
1611 RT_UNTRUSTED_VALIDATED_FENCE();
1612
1613 pSvgaR3State->pFuncsDX->pfnDXDestroyElementLayout(pThisCC, pDXContext, elementLayoutId);
1614
1615 SVGACOTableDXElementLayoutEntry *pEntry = &pDXContext->cot.paElementLayout[elementLayoutId];
1616 RT_ZERO(*pEntry);
1617 pEntry->elid = SVGA3D_INVALID_ID;
1618
1619 return rc;
1620}
1621
1622
1623int vmsvga3dDXDefineBlendState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineBlendState const *pCmd)
1624{
1625 int rc;
1626 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1627 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineBlendState, VERR_INVALID_STATE);
1628 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1629 AssertReturn(p3dState, VERR_INVALID_STATE);
1630
1631 PVMSVGA3DDXCONTEXT pDXContext;
1632 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1633 AssertRCReturn(rc, rc);
1634
1635 SVGA3dBlendStateId const blendId = pCmd->blendId;
1636
1637 ASSERT_GUEST_RETURN(pDXContext->cot.paBlendState, VERR_INVALID_STATE);
1638 ASSERT_GUEST_RETURN(blendId < pDXContext->cot.cBlendState, VERR_INVALID_PARAMETER);
1639 RT_UNTRUSTED_VALIDATED_FENCE();
1640
1641 SVGACOTableDXBlendStateEntry *pEntry = &pDXContext->cot.paBlendState[blendId];
1642 pEntry->alphaToCoverageEnable = pCmd->alphaToCoverageEnable;
1643 pEntry->independentBlendEnable = pCmd->independentBlendEnable;
1644 memcpy(pEntry->perRT, pCmd->perRT, sizeof(pEntry->perRT));
1645
1646 rc = pSvgaR3State->pFuncsDX->pfnDXDefineBlendState(pThisCC, pDXContext, blendId, pEntry);
1647 return rc;
1648}
1649
1650
1651int vmsvga3dDXDestroyBlendState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyBlendState const *pCmd)
1652{
1653 int rc;
1654 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1655 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyBlendState, VERR_INVALID_STATE);
1656 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1657 AssertReturn(p3dState, VERR_INVALID_STATE);
1658
1659 PVMSVGA3DDXCONTEXT pDXContext;
1660 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1661 AssertRCReturn(rc, rc);
1662
1663 SVGA3dBlendStateId const blendId = pCmd->blendId;
1664
1665 ASSERT_GUEST_RETURN(pDXContext->cot.paBlendState, VERR_INVALID_STATE);
1666 ASSERT_GUEST_RETURN(blendId < pDXContext->cot.cBlendState, VERR_INVALID_PARAMETER);
1667 RT_UNTRUSTED_VALIDATED_FENCE();
1668
1669 pSvgaR3State->pFuncsDX->pfnDXDestroyBlendState(pThisCC, pDXContext, blendId);
1670
1671 SVGACOTableDXBlendStateEntry *pEntry = &pDXContext->cot.paBlendState[blendId];
1672 RT_ZERO(*pEntry);
1673
1674 return rc;
1675}
1676
1677
1678int vmsvga3dDXDefineDepthStencilState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineDepthStencilState const *pCmd)
1679{
1680 int rc;
1681 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1682 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineDepthStencilState, VERR_INVALID_STATE);
1683 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1684 AssertReturn(p3dState, VERR_INVALID_STATE);
1685
1686 PVMSVGA3DDXCONTEXT pDXContext;
1687 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1688 AssertRCReturn(rc, rc);
1689
1690 SVGA3dDepthStencilStateId const depthStencilId = pCmd->depthStencilId;
1691
1692 ASSERT_GUEST_RETURN(pDXContext->cot.paDepthStencil, VERR_INVALID_STATE);
1693 ASSERT_GUEST_RETURN(depthStencilId < pDXContext->cot.cDepthStencil, VERR_INVALID_PARAMETER);
1694 RT_UNTRUSTED_VALIDATED_FENCE();
1695
1696 SVGACOTableDXDepthStencilEntry *pEntry = &pDXContext->cot.paDepthStencil[depthStencilId];
1697 pEntry->depthEnable = pCmd->depthEnable;
1698 pEntry->depthWriteMask = pCmd->depthWriteMask;
1699 pEntry->depthFunc = pCmd->depthFunc;
1700 pEntry->stencilEnable = pCmd->stencilEnable;
1701 pEntry->frontEnable = pCmd->frontEnable;
1702 pEntry->backEnable = pCmd->backEnable;
1703 pEntry->stencilReadMask = pCmd->stencilReadMask;
1704 pEntry->stencilWriteMask = pCmd->stencilWriteMask;
1705
1706 pEntry->frontStencilFailOp = pCmd->frontStencilFailOp;
1707 pEntry->frontStencilDepthFailOp = pCmd->frontStencilDepthFailOp;
1708 pEntry->frontStencilPassOp = pCmd->frontStencilPassOp;
1709 pEntry->frontStencilFunc = pCmd->frontStencilFunc;
1710
1711 pEntry->backStencilFailOp = pCmd->backStencilFailOp;
1712 pEntry->backStencilDepthFailOp = pCmd->backStencilDepthFailOp;
1713 pEntry->backStencilPassOp = pCmd->backStencilPassOp;
1714 pEntry->backStencilFunc = pCmd->backStencilFunc;
1715
1716 rc = pSvgaR3State->pFuncsDX->pfnDXDefineDepthStencilState(pThisCC, pDXContext, depthStencilId, pEntry);
1717 return rc;
1718}
1719
1720
1721int vmsvga3dDXDestroyDepthStencilState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyDepthStencilState const *pCmd)
1722{
1723 int rc;
1724 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1725 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyDepthStencilState, VERR_INVALID_STATE);
1726 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1727 AssertReturn(p3dState, VERR_INVALID_STATE);
1728
1729 PVMSVGA3DDXCONTEXT pDXContext;
1730 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1731 AssertRCReturn(rc, rc);
1732
1733 SVGA3dDepthStencilStateId const depthStencilId = pCmd->depthStencilId;
1734
1735 ASSERT_GUEST_RETURN(pDXContext->cot.paDepthStencil, VERR_INVALID_STATE);
1736 ASSERT_GUEST_RETURN(depthStencilId < pDXContext->cot.cDepthStencil, VERR_INVALID_PARAMETER);
1737 RT_UNTRUSTED_VALIDATED_FENCE();
1738
1739 pSvgaR3State->pFuncsDX->pfnDXDestroyDepthStencilState(pThisCC, pDXContext, depthStencilId);
1740
1741 SVGACOTableDXDepthStencilEntry *pEntry = &pDXContext->cot.paDepthStencil[depthStencilId];
1742 RT_ZERO(*pEntry);
1743
1744 return rc;
1745}
1746
1747
1748int vmsvga3dDXDefineRasterizerState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineRasterizerState const *pCmd)
1749{
1750 int rc;
1751 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1752 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineRasterizerState, VERR_INVALID_STATE);
1753 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1754 AssertReturn(p3dState, VERR_INVALID_STATE);
1755
1756 PVMSVGA3DDXCONTEXT pDXContext;
1757 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1758 AssertRCReturn(rc, rc);
1759
1760 SVGA3dRasterizerStateId const rasterizerId = pCmd->rasterizerId;
1761
1762 ASSERT_GUEST_RETURN(pDXContext->cot.paRasterizerState, VERR_INVALID_STATE);
1763 ASSERT_GUEST_RETURN(rasterizerId < pDXContext->cot.cRasterizerState, VERR_INVALID_PARAMETER);
1764 RT_UNTRUSTED_VALIDATED_FENCE();
1765
1766 SVGACOTableDXRasterizerStateEntry *pEntry = &pDXContext->cot.paRasterizerState[rasterizerId];
1767 pEntry->fillMode = pCmd->fillMode;
1768 pEntry->cullMode = pCmd->cullMode;
1769 pEntry->frontCounterClockwise = pCmd->frontCounterClockwise;
1770 pEntry->provokingVertexLast = pCmd->provokingVertexLast;
1771 pEntry->depthBias = pCmd->depthBias;
1772 pEntry->depthBiasClamp = pCmd->depthBiasClamp;
1773 pEntry->slopeScaledDepthBias = pCmd->slopeScaledDepthBias;
1774 pEntry->depthClipEnable = pCmd->depthClipEnable;
1775 pEntry->scissorEnable = pCmd->scissorEnable;
1776 pEntry->multisampleEnable = pCmd->multisampleEnable;
1777 pEntry->antialiasedLineEnable = pCmd->antialiasedLineEnable;
1778 pEntry->lineWidth = pCmd->lineWidth;
1779 pEntry->lineStippleEnable = pCmd->lineStippleEnable;
1780 pEntry->lineStippleFactor = pCmd->lineStippleFactor;
1781 pEntry->lineStipplePattern = pCmd->lineStipplePattern;
1782 pEntry->forcedSampleCount = 0; /** @todo Not in pCmd. */
1783 RT_ZERO(pEntry->mustBeZero);
1784
1785 rc = pSvgaR3State->pFuncsDX->pfnDXDefineRasterizerState(pThisCC, pDXContext, rasterizerId, pEntry);
1786 return rc;
1787}
1788
1789
1790int vmsvga3dDXDestroyRasterizerState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyRasterizerState const *pCmd)
1791{
1792 int rc;
1793 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1794 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyRasterizerState, VERR_INVALID_STATE);
1795 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1796 AssertReturn(p3dState, VERR_INVALID_STATE);
1797
1798 PVMSVGA3DDXCONTEXT pDXContext;
1799 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1800 AssertRCReturn(rc, rc);
1801
1802 SVGA3dRasterizerStateId const rasterizerId = pCmd->rasterizerId;
1803
1804 ASSERT_GUEST_RETURN(pDXContext->cot.paRasterizerState, VERR_INVALID_STATE);
1805 ASSERT_GUEST_RETURN(rasterizerId < pDXContext->cot.cRasterizerState, VERR_INVALID_PARAMETER);
1806 RT_UNTRUSTED_VALIDATED_FENCE();
1807
1808 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyRasterizerState(pThisCC, pDXContext, rasterizerId);
1809
1810 SVGACOTableDXRasterizerStateEntry *pEntry = &pDXContext->cot.paRasterizerState[rasterizerId];
1811 RT_ZERO(*pEntry);
1812
1813 return rc;
1814}
1815
1816
1817int vmsvga3dDXDefineSamplerState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineSamplerState const *pCmd)
1818{
1819 int rc;
1820 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1821 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineSamplerState, VERR_INVALID_STATE);
1822 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1823 AssertReturn(p3dState, VERR_INVALID_STATE);
1824
1825 PVMSVGA3DDXCONTEXT pDXContext;
1826 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1827 AssertRCReturn(rc, rc);
1828
1829 SVGA3dSamplerId const samplerId = pCmd->samplerId;
1830
1831 ASSERT_GUEST_RETURN(pDXContext->cot.paSampler, VERR_INVALID_STATE);
1832 ASSERT_GUEST_RETURN(samplerId < pDXContext->cot.cSampler, VERR_INVALID_PARAMETER);
1833 RT_UNTRUSTED_VALIDATED_FENCE();
1834
1835 SVGACOTableDXSamplerEntry *pEntry = &pDXContext->cot.paSampler[samplerId];
1836 pEntry->filter = pCmd->filter;
1837 pEntry->addressU = pCmd->addressU;
1838 pEntry->addressV = pCmd->addressV;
1839 pEntry->addressW = pCmd->addressW;
1840 pEntry->mipLODBias = pCmd->mipLODBias;
1841 pEntry->maxAnisotropy = pCmd->maxAnisotropy;
1842 pEntry->comparisonFunc = pCmd->comparisonFunc;
1843 pEntry->borderColor = pCmd->borderColor;
1844 pEntry->minLOD = pCmd->minLOD;
1845 pEntry->maxLOD = pCmd->maxLOD;
1846
1847 rc = pSvgaR3State->pFuncsDX->pfnDXDefineSamplerState(pThisCC, pDXContext, samplerId, pEntry);
1848 return rc;
1849}
1850
1851
1852int vmsvga3dDXDestroySamplerState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroySamplerState const *pCmd)
1853{
1854 int rc;
1855 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1856 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroySamplerState, VERR_INVALID_STATE);
1857 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1858 AssertReturn(p3dState, VERR_INVALID_STATE);
1859
1860 PVMSVGA3DDXCONTEXT pDXContext;
1861 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1862 AssertRCReturn(rc, rc);
1863
1864 SVGA3dSamplerId const samplerId = pCmd->samplerId;
1865
1866 ASSERT_GUEST_RETURN(pDXContext->cot.paSampler, VERR_INVALID_STATE);
1867 ASSERT_GUEST_RETURN(samplerId < pDXContext->cot.cSampler, VERR_INVALID_PARAMETER);
1868 RT_UNTRUSTED_VALIDATED_FENCE();
1869
1870 pSvgaR3State->pFuncsDX->pfnDXDestroySamplerState(pThisCC, pDXContext, samplerId);
1871
1872 SVGACOTableDXSamplerEntry *pEntry = &pDXContext->cot.paSampler[samplerId];
1873 RT_ZERO(*pEntry);
1874
1875 return rc;
1876}
1877
1878
1879int vmsvga3dDXDefineShader(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineShader const *pCmd)
1880{
1881 int rc;
1882 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1883 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineShader, VERR_INVALID_STATE);
1884 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1885 AssertReturn(p3dState, VERR_INVALID_STATE);
1886
1887 PVMSVGA3DDXCONTEXT pDXContext;
1888 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1889 AssertRCReturn(rc, rc);
1890
1891 SVGA3dShaderId const shaderId = pCmd->shaderId;
1892
1893 ASSERT_GUEST_RETURN(pDXContext->cot.paShader, VERR_INVALID_STATE);
1894 ASSERT_GUEST_RETURN(shaderId < pDXContext->cot.cShader, VERR_INVALID_PARAMETER);
1895 ASSERT_GUEST_RETURN(pCmd->type >= SVGA3D_SHADERTYPE_MIN && pCmd->type < SVGA3D_SHADERTYPE_MAX, VERR_INVALID_PARAMETER);
1896 ASSERT_GUEST_RETURN(pCmd->sizeInBytes >= 8, VERR_INVALID_PARAMETER); /* Version Token + Length Token. */
1897 RT_UNTRUSTED_VALIDATED_FENCE();
1898
1899 /* Cleanup the current shader. */
1900 pSvgaR3State->pFuncsDX->pfnDXDestroyShader(pThisCC, pDXContext, shaderId);
1901
1902 SVGACOTableDXShaderEntry *pEntry = &pDXContext->cot.paShader[shaderId];
1903 pEntry->type = pCmd->type;
1904 pEntry->sizeInBytes = pCmd->sizeInBytes;
1905 pEntry->offsetInBytes = 0;
1906 pEntry->mobid = SVGA_ID_INVALID;
1907
1908 rc = pSvgaR3State->pFuncsDX->pfnDXDefineShader(pThisCC, pDXContext, shaderId, pEntry);
1909 return rc;
1910}
1911
1912
1913int vmsvga3dDXDestroyShader(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyShader const *pCmd)
1914{
1915 int rc;
1916 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1917 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyShader, VERR_INVALID_STATE);
1918 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1919 AssertReturn(p3dState, VERR_INVALID_STATE);
1920
1921 PVMSVGA3DDXCONTEXT pDXContext;
1922 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1923 AssertRCReturn(rc, rc);
1924
1925 SVGA3dShaderId const shaderId = pCmd->shaderId;
1926
1927 ASSERT_GUEST_RETURN(pDXContext->cot.paShader, VERR_INVALID_STATE);
1928 ASSERT_GUEST_RETURN(shaderId < pDXContext->cot.cShader, VERR_INVALID_PARAMETER);
1929 RT_UNTRUSTED_VALIDATED_FENCE();
1930
1931 pSvgaR3State->pFuncsDX->pfnDXDestroyShader(pThisCC, pDXContext, shaderId);
1932
1933 /* Cleanup COTable entries.*/
1934 SVGACOTableDXShaderEntry *pEntry = &pDXContext->cot.paShader[shaderId];
1935 pEntry->type = SVGA3D_SHADERTYPE_INVALID;
1936 pEntry->sizeInBytes = 0;
1937 pEntry->offsetInBytes = 0;
1938 pEntry->mobid = SVGA_ID_INVALID;
1939
1940 /** @todo Destroy shaders on context and backend deletion. */
1941 return rc;
1942}
1943
1944
1945static int dxBindShader(DXShaderInfo *pShaderInfo, PVMSVGAMOB pMob, SVGACOTableDXShaderEntry const *pEntry, void const *pvShaderBytecode)
1946{
1947 /* How many bytes the MOB can hold. */
1948 uint32_t const cbMob = vmsvgaR3MobSize(pMob) - pEntry->offsetInBytes;
1949 ASSERT_GUEST_RETURN(cbMob >= pEntry->sizeInBytes, VERR_INVALID_PARAMETER);
1950 AssertReturn(pEntry->sizeInBytes >= 8, VERR_INTERNAL_ERROR); /* Host ensures this in DefineShader. */
1951
1952 int rc = DXShaderParse(pvShaderBytecode, pEntry->sizeInBytes, pShaderInfo);
1953 if (RT_SUCCESS(rc))
1954 {
1955 /* Get the length of the shader bytecode. */
1956 uint32_t const *pau32Token = (uint32_t *)pvShaderBytecode; /* Tokens */
1957 uint32_t const cToken = pau32Token[1]; /* Length of the shader in tokens. */
1958 ASSERT_GUEST_RETURN(cToken <= pEntry->sizeInBytes / 4, VERR_INVALID_PARAMETER);
1959
1960 /* Check if the shader contains SVGA3dDXSignatureHeader and signature entries after the bytecode.
1961 * If they are not there (Linux guest driver does not provide them), then it is fine
1962 * and the signatures generated by DXShaderParse will be used.
1963 */
1964 uint32_t cbSignaturesAvail = pEntry->sizeInBytes - cToken * 4; /* How many bytes for signatures are available. */
1965 if (cbSignaturesAvail >= sizeof(SVGA3dDXSignatureHeader))
1966 {
1967 cbSignaturesAvail -= sizeof(SVGA3dDXSignatureHeader);
1968
1969 SVGA3dDXSignatureHeader const *pSignatureHeader = (SVGA3dDXSignatureHeader *)((uint8_t *)pvShaderBytecode + cToken * 4);
1970 if (pSignatureHeader->headerVersion == SVGADX_SIGNATURE_HEADER_VERSION_0)
1971 {
1972 ASSERT_GUEST_RETURN( pSignatureHeader->numInputSignatures <= RT_ELEMENTS(pShaderInfo->aInputSignature)
1973 && pSignatureHeader->numOutputSignatures <= RT_ELEMENTS(pShaderInfo->aOutputSignature)
1974 && pSignatureHeader->numPatchConstantSignatures <= RT_ELEMENTS(pShaderInfo->aPatchConstantSignature),
1975 VERR_INVALID_PARAMETER);
1976
1977 uint32_t const cSignature = pSignatureHeader->numInputSignatures
1978 + pSignatureHeader->numOutputSignatures
1979 + pSignatureHeader->numPatchConstantSignatures;
1980 uint32_t const cbSignature = cSignature * sizeof(SVGA3dDXSignatureEntry);
1981 ASSERT_GUEST_RETURN(cbSignaturesAvail >= cbSignature, VERR_INVALID_PARAMETER);
1982
1983 /* The shader does not need guesswork. */
1984 pShaderInfo->fGuestSignatures = true;
1985
1986 /* Copy to DXShaderInfo. */
1987 uint8_t const *pu8Signatures = (uint8_t *)&pSignatureHeader[1];
1988 pShaderInfo->cInputSignature = pSignatureHeader->numInputSignatures;
1989 memcpy(pShaderInfo->aInputSignature, pu8Signatures, pSignatureHeader->numInputSignatures * sizeof(SVGA3dDXSignatureEntry));
1990
1991 pu8Signatures += pSignatureHeader->numInputSignatures * sizeof(SVGA3dDXSignatureEntry);
1992 pShaderInfo->cOutputSignature = pSignatureHeader->numOutputSignatures;
1993 memcpy(pShaderInfo->aOutputSignature, pu8Signatures, pSignatureHeader->numOutputSignatures * sizeof(SVGA3dDXSignatureEntry));
1994
1995 pu8Signatures += pSignatureHeader->numOutputSignatures * sizeof(SVGA3dDXSignatureEntry);
1996 pShaderInfo->cPatchConstantSignature = pSignatureHeader->numPatchConstantSignatures;
1997 memcpy(pShaderInfo->aPatchConstantSignature, pu8Signatures, pSignatureHeader->numPatchConstantSignatures * sizeof(SVGA3dDXSignatureEntry));
1998
1999 /* Sort must be called before GenerateSemantics which assigns attribute indices
2000 * based on the order of attributes.
2001 */
2002 DXShaderSortSignatures(pShaderInfo);
2003 DXShaderGenerateSemantics(pShaderInfo);
2004 }
2005 }
2006 }
2007
2008 return rc;
2009}
2010
2011
2012int vmsvga3dDXBindShader(PVGASTATECC pThisCC, SVGA3dCmdDXBindShader const *pCmd, PVMSVGAMOB pMob)
2013{
2014 int rc;
2015 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2016 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindShader, VERR_INVALID_STATE);
2017 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2018 AssertReturn(p3dState, VERR_INVALID_STATE);
2019
2020 PVMSVGA3DDXCONTEXT pDXContext;
2021 rc = vmsvga3dDXContextFromCid(p3dState, pCmd->cid, &pDXContext);
2022 AssertRCReturn(rc, rc);
2023
2024 ASSERT_GUEST_RETURN(pCmd->shid < pDXContext->cot.cShader, VERR_INVALID_PARAMETER);
2025 RT_UNTRUSTED_VALIDATED_FENCE();
2026
2027 /* 'type' and 'sizeInBytes' has been already initialized by DefineShader. */
2028 SVGACOTableDXShaderEntry *pEntry = &pDXContext->cot.paShader[pCmd->shid];
2029 //pEntry->type;
2030 //pEntry->sizeInBytes;
2031 pEntry->offsetInBytes = pCmd->offsetInBytes;
2032 pEntry->mobid = vmsvgaR3MobId(pMob);
2033
2034 if (pMob)
2035 {
2036 /* Bind a mob to the shader. */
2037
2038 /* Create a memory pointer for the MOB, which is accessible by host. */
2039 rc = vmsvgaR3MobBackingStoreCreate(pSvgaR3State, pMob, vmsvgaR3MobSize(pMob));
2040 if (RT_SUCCESS(rc))
2041 {
2042 /* Get pointer to the shader bytecode. This will also verify the offset. */
2043 void const *pvShaderBytecode = vmsvgaR3MobBackingStorePtr(pMob, pEntry->offsetInBytes);
2044 ASSERT_GUEST_RETURN(pvShaderBytecode, VERR_INVALID_PARAMETER);
2045
2046 /* Get the shader and optional signatures from the MOB. */
2047 DXShaderInfo shaderInfo;
2048 RT_ZERO(shaderInfo);
2049 rc = dxBindShader(&shaderInfo, pMob, pEntry, pvShaderBytecode);
2050 if (RT_SUCCESS(rc))
2051 {
2052 /* pfnDXBindShader makes a copy of shaderInfo on success. */
2053 rc = pSvgaR3State->pFuncsDX->pfnDXBindShader(pThisCC, pDXContext, pCmd->shid, &shaderInfo);
2054 }
2055 AssertRC(rc);
2056
2057 /** @todo Backing store is not needed anymore in any case? */
2058 if (RT_FAILURE(rc))
2059 {
2060 DXShaderFree(&shaderInfo);
2061
2062 vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pMob);
2063 }
2064 }
2065 }
2066 else
2067 {
2068 /* Unbind. */
2069 /** @todo Nothing to do here but release the MOB? */
2070 vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pMob);
2071 }
2072
2073 return rc;
2074}
2075
2076
2077int vmsvga3dDXDefineStreamOutput(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineStreamOutput const *pCmd)
2078{
2079 int rc;
2080 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2081 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineStreamOutput, VERR_INVALID_STATE);
2082 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2083 AssertReturn(p3dState, VERR_INVALID_STATE);
2084
2085 PVMSVGA3DDXCONTEXT pDXContext;
2086 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2087 AssertRCReturn(rc, rc);
2088
2089 SVGA3dStreamOutputId const soid = pCmd->soid;
2090
2091 ASSERT_GUEST_RETURN(pDXContext->cot.paStreamOutput, VERR_INVALID_STATE);
2092 ASSERT_GUEST_RETURN(soid < pDXContext->cot.cStreamOutput, VERR_INVALID_PARAMETER);
2093 ASSERT_GUEST_RETURN(pCmd->numOutputStreamEntries < SVGA3D_MAX_DX10_STREAMOUT_DECLS, VERR_INVALID_PARAMETER);
2094 RT_UNTRUSTED_VALIDATED_FENCE();
2095
2096 SVGACOTableDXStreamOutputEntry *pEntry = &pDXContext->cot.paStreamOutput[soid];
2097 pEntry->numOutputStreamEntries = pCmd->numOutputStreamEntries;
2098 memcpy(pEntry->decl, pCmd->decl, sizeof(pEntry->decl));
2099 memcpy(pEntry->streamOutputStrideInBytes, pCmd->streamOutputStrideInBytes, sizeof(pEntry->streamOutputStrideInBytes));
2100 pEntry->rasterizedStream = 0; // Apparently invalid in this command: pCmd->rasterizedStream;
2101 pEntry->numOutputStreamStrides = 0;
2102 pEntry->mobid = SVGA_ID_INVALID;
2103 pEntry->offsetInBytes = 0;
2104 pEntry->usesMob = 0;
2105 pEntry->pad0 = 0;
2106 pEntry->pad1 = 0;
2107 RT_ZERO(pEntry->pad2);
2108
2109 rc = pSvgaR3State->pFuncsDX->pfnDXDefineStreamOutput(pThisCC, pDXContext, soid, pEntry);
2110 return rc;
2111}
2112
2113
2114int vmsvga3dDXDestroyStreamOutput(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyStreamOutput const *pCmd)
2115{
2116 int rc;
2117 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2118 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyStreamOutput, VERR_INVALID_STATE);
2119 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2120 AssertReturn(p3dState, VERR_INVALID_STATE);
2121
2122 PVMSVGA3DDXCONTEXT pDXContext;
2123 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2124 AssertRCReturn(rc, rc);
2125
2126 SVGA3dStreamOutputId const soid = pCmd->soid;
2127
2128 ASSERT_GUEST_RETURN(pDXContext->cot.paStreamOutput, VERR_INVALID_STATE);
2129 ASSERT_GUEST_RETURN(soid < pDXContext->cot.cStreamOutput, VERR_INVALID_PARAMETER);
2130 RT_UNTRUSTED_VALIDATED_FENCE();
2131
2132 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyStreamOutput(pThisCC, pDXContext, soid);
2133
2134 SVGACOTableDXStreamOutputEntry *pEntry = &pDXContext->cot.paStreamOutput[soid];
2135 RT_ZERO(*pEntry);
2136 pEntry->mobid = SVGA_ID_INVALID;
2137
2138 return rc;
2139}
2140
2141
2142int vmsvga3dDXSetStreamOutput(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetStreamOutput const *pCmd)
2143{
2144 int rc;
2145 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2146 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetStreamOutput, VERR_INVALID_STATE);
2147 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2148 AssertReturn(p3dState, VERR_INVALID_STATE);
2149
2150 PVMSVGA3DDXCONTEXT pDXContext;
2151 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2152 AssertRCReturn(rc, rc);
2153
2154 SVGA3dStreamOutputId const soid = pCmd->soid;
2155
2156 ASSERT_GUEST_RETURN( soid == SVGA_ID_INVALID
2157 || soid < pDXContext->cot.cStreamOutput, VERR_INVALID_PARAMETER);
2158 RT_UNTRUSTED_VALIDATED_FENCE();
2159
2160 pDXContext->svgaDXContext.streamOut.soid = soid;
2161
2162 rc = pSvgaR3State->pFuncsDX->pfnDXSetStreamOutput(pThisCC, pDXContext, soid);
2163 return rc;
2164}
2165
2166
2167static int dxSetOrGrowCOTable(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext, PVMSVGAMOB pMob,
2168 SVGACOTableType enmType, uint32_t validSizeInBytes, bool fGrow)
2169{
2170 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2171 int rc = VINF_SUCCESS;
2172
2173 uint32_t idxCOTable;
2174 if (enmType < SVGA_COTABLE_MAX)
2175 idxCOTable = enmType;
2176 else if (enmType >= VBSVGA_COTABLE_MIN && enmType < VBSVGA_COTABLE_MAX)
2177 idxCOTable = SVGA_COTABLE_MAX + (enmType - VBSVGA_COTABLE_MIN);
2178 else
2179 ASSERT_GUEST_FAILED_RETURN(VERR_INVALID_PARAMETER);
2180 RT_UNTRUSTED_VALIDATED_FENCE();
2181
2182 uint32_t cbCOT;
2183 if (pMob)
2184 {
2185 /* Bind a new mob to the COTable. */
2186 cbCOT = vmsvgaR3MobSize(pMob);
2187
2188 ASSERT_GUEST_RETURN(validSizeInBytes <= cbCOT, VERR_INVALID_PARAMETER);
2189 RT_UNTRUSTED_VALIDATED_FENCE();
2190
2191 /* Create a memory pointer, which is accessible by host. */
2192 rc = vmsvgaR3MobBackingStoreCreate(pSvgaR3State, pMob, validSizeInBytes);
2193 }
2194 else
2195 {
2196 /* Unbind. */
2197 validSizeInBytes = 0;
2198 cbCOT = 0;
2199 vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pDXContext->aCOTMobs[idxCOTable]);
2200 }
2201
2202 uint32_t cEntries = 0;
2203 uint32_t cValidEntries = 0;
2204 if (RT_SUCCESS(rc))
2205 {
2206 static uint32_t const s_acbEntry[] =
2207 {
2208 sizeof(SVGACOTableDXRTViewEntry),
2209 sizeof(SVGACOTableDXDSViewEntry),
2210 sizeof(SVGACOTableDXSRViewEntry),
2211 sizeof(SVGACOTableDXElementLayoutEntry),
2212 sizeof(SVGACOTableDXBlendStateEntry),
2213 sizeof(SVGACOTableDXDepthStencilEntry),
2214 sizeof(SVGACOTableDXRasterizerStateEntry),
2215 sizeof(SVGACOTableDXSamplerEntry),
2216 sizeof(SVGACOTableDXStreamOutputEntry),
2217 sizeof(SVGACOTableDXQueryEntry),
2218 sizeof(SVGACOTableDXShaderEntry),
2219 sizeof(SVGACOTableDXUAViewEntry),
2220 sizeof(VBSVGACOTableDXVideoProcessorEntry),
2221 sizeof(VBSVGACOTableDXVideoDecoderOutputViewEntry),
2222 sizeof(VBSVGACOTableDXVideoDecoderEntry),
2223 sizeof(VBSVGACOTableDXVideoProcessorInputViewEntry),
2224 sizeof(VBSVGACOTableDXVideoProcessorOutputViewEntry),
2225 };
2226 AssertCompile(RT_ELEMENTS(s_acbEntry) == VBSVGA_NUM_COTABLES);
2227
2228 cEntries = cbCOT / s_acbEntry[idxCOTable];
2229 cValidEntries = validSizeInBytes / s_acbEntry[idxCOTable];
2230 }
2231
2232 if (RT_SUCCESS(rc))
2233 {
2234 if ( fGrow
2235 && pDXContext->aCOTMobs[idxCOTable]
2236 && cValidEntries)
2237 {
2238 /* Copy entries from the current mob to the new mob. */
2239 void const *pvSrc = vmsvgaR3MobBackingStorePtr(pDXContext->aCOTMobs[idxCOTable], 0);
2240 void *pvDst = vmsvgaR3MobBackingStorePtr(pMob, 0);
2241 if (pvSrc && pvDst)
2242 memcpy(pvDst, pvSrc, validSizeInBytes);
2243 else
2244 AssertFailedStmt(rc = VERR_INVALID_STATE);
2245 }
2246 }
2247
2248 if (RT_SUCCESS(rc))
2249 {
2250 pDXContext->aCOTMobs[idxCOTable] = pMob;
2251
2252 void *pvCOT = vmsvgaR3MobBackingStorePtr(pMob, 0);
2253 switch (enmType)
2254 {
2255 case SVGA_COTABLE_RTVIEW:
2256 pDXContext->cot.paRTView = (SVGACOTableDXRTViewEntry *)pvCOT;
2257 pDXContext->cot.cRTView = cEntries;
2258 break;
2259 case SVGA_COTABLE_DSVIEW:
2260 pDXContext->cot.paDSView = (SVGACOTableDXDSViewEntry *)pvCOT;
2261 pDXContext->cot.cDSView = cEntries;
2262 break;
2263 case SVGA_COTABLE_SRVIEW:
2264 pDXContext->cot.paSRView = (SVGACOTableDXSRViewEntry *)pvCOT;
2265 pDXContext->cot.cSRView = cEntries;
2266 break;
2267 case SVGA_COTABLE_ELEMENTLAYOUT:
2268 pDXContext->cot.paElementLayout = (SVGACOTableDXElementLayoutEntry *)pvCOT;
2269 pDXContext->cot.cElementLayout = cEntries;
2270 break;
2271 case SVGA_COTABLE_BLENDSTATE:
2272 pDXContext->cot.paBlendState = (SVGACOTableDXBlendStateEntry *)pvCOT;
2273 pDXContext->cot.cBlendState = cEntries;
2274 break;
2275 case SVGA_COTABLE_DEPTHSTENCIL:
2276 pDXContext->cot.paDepthStencil = (SVGACOTableDXDepthStencilEntry *)pvCOT;
2277 pDXContext->cot.cDepthStencil = cEntries;
2278 break;
2279 case SVGA_COTABLE_RASTERIZERSTATE:
2280 pDXContext->cot.paRasterizerState = (SVGACOTableDXRasterizerStateEntry *)pvCOT;
2281 pDXContext->cot.cRasterizerState = cEntries;
2282 break;
2283 case SVGA_COTABLE_SAMPLER:
2284 pDXContext->cot.paSampler = (SVGACOTableDXSamplerEntry *)pvCOT;
2285 pDXContext->cot.cSampler = cEntries;
2286 break;
2287 case SVGA_COTABLE_STREAMOUTPUT:
2288 pDXContext->cot.paStreamOutput = (SVGACOTableDXStreamOutputEntry *)pvCOT;
2289 pDXContext->cot.cStreamOutput = cEntries;
2290 break;
2291 case SVGA_COTABLE_DXQUERY:
2292 pDXContext->cot.paQuery = (SVGACOTableDXQueryEntry *)pvCOT;
2293 pDXContext->cot.cQuery = cEntries;
2294 break;
2295 case SVGA_COTABLE_DXSHADER:
2296 pDXContext->cot.paShader = (SVGACOTableDXShaderEntry *)pvCOT;
2297 pDXContext->cot.cShader = cEntries;
2298 break;
2299 case SVGA_COTABLE_UAVIEW:
2300 pDXContext->cot.paUAView = (SVGACOTableDXUAViewEntry *)pvCOT;
2301 pDXContext->cot.cUAView = cEntries;
2302 break;
2303 case SVGA_COTABLE_MAX: break; /* Compiler warning */
2304 case VBSVGA_COTABLE_VIDEOPROCESSOR:
2305 pDXContext->cot.paVideoProcessor = (VBSVGACOTableDXVideoProcessorEntry *)pvCOT;
2306 pDXContext->cot.cVideoProcessor = cEntries;
2307 break;
2308 case VBSVGA_COTABLE_VDOV:
2309 pDXContext->cot.paVideoDecoderOutputView = (VBSVGACOTableDXVideoDecoderOutputViewEntry *)pvCOT;
2310 pDXContext->cot.cVideoDecoderOutputView = cEntries;
2311 break;
2312 case VBSVGA_COTABLE_VIDEODECODER:
2313 pDXContext->cot.paVideoDecoder = (VBSVGACOTableDXVideoDecoderEntry *)pvCOT;
2314 pDXContext->cot.cVideoDecoder = cEntries;
2315 break;
2316 case VBSVGA_COTABLE_VPIV:
2317 pDXContext->cot.paVideoProcessorInputView = (VBSVGACOTableDXVideoProcessorInputViewEntry *)pvCOT;
2318 pDXContext->cot.cVideoProcessorInputView = cEntries;
2319 break;
2320 case VBSVGA_COTABLE_VPOV:
2321 pDXContext->cot.paVideoProcessorOutputView = (VBSVGACOTableDXVideoProcessorOutputViewEntry *)pvCOT;
2322 pDXContext->cot.cVideoProcessorOutputView = cEntries;
2323 break;
2324 case VBSVGA_COTABLE_MAX: break; /* Compiler warning */
2325#ifndef DEBUG_sunlover
2326 default: break; /* Compiler warning. */
2327#endif
2328 }
2329 }
2330 else
2331 vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pMob);
2332
2333 /* Notify the backend. */
2334 if (RT_SUCCESS(rc))
2335 rc = pSvgaR3State->pFuncsDX->pfnDXSetCOTable(pThisCC, pDXContext, enmType, cValidEntries);
2336
2337 return rc;
2338}
2339
2340
2341int vmsvga3dDXSetCOTable(PVGASTATECC pThisCC, SVGA3dCmdDXSetCOTable const *pCmd, PVMSVGAMOB pMob)
2342{
2343 int rc;
2344 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2345 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetCOTable, VERR_INVALID_STATE);
2346 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2347 AssertReturn(p3dState, VERR_INVALID_STATE);
2348
2349 PVMSVGA3DDXCONTEXT pDXContext;
2350 rc = vmsvga3dDXContextFromCid(p3dState, pCmd->cid, &pDXContext);
2351 AssertRCReturn(rc, rc);
2352 RT_UNTRUSTED_VALIDATED_FENCE();
2353
2354 return dxSetOrGrowCOTable(pThisCC, pDXContext, pMob, pCmd->type, pCmd->validSizeInBytes, false);
2355}
2356
2357
2358int vmsvga3dDXReadbackCOTable(PVGASTATECC pThisCC, SVGA3dCmdDXReadbackCOTable const *pCmd)
2359{
2360 int rc;
2361 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2362 AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE);
2363 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2364 AssertReturn(p3dState, VERR_INVALID_STATE);
2365
2366 PVMSVGA3DDXCONTEXT pDXContext;
2367 rc = vmsvga3dDXContextFromCid(p3dState, pCmd->cid, &pDXContext);
2368 AssertRCReturn(rc, rc);
2369 RT_UNTRUSTED_VALIDATED_FENCE();
2370
2371 ASSERT_GUEST_RETURN(pCmd->type < RT_ELEMENTS(pDXContext->aCOTMobs), VERR_INVALID_PARAMETER);
2372 RT_UNTRUSTED_VALIDATED_FENCE();
2373
2374 PVMSVGAMOB pMob = pDXContext->aCOTMobs[pCmd->type];
2375 rc = vmsvgaR3MobBackingStoreWriteToGuest(pSvgaR3State, pMob);
2376 return rc;
2377}
2378
2379
2380int vmsvga3dDXBufferCopy(PVGASTATECC pThisCC, uint32_t idDXContext)
2381{
2382 int rc;
2383 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2384 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBufferCopy, VERR_INVALID_STATE);
2385 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2386 AssertReturn(p3dState, VERR_INVALID_STATE);
2387
2388 PVMSVGA3DDXCONTEXT pDXContext;
2389 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2390 AssertRCReturn(rc, rc);
2391
2392 rc = pSvgaR3State->pFuncsDX->pfnDXBufferCopy(pThisCC, pDXContext);
2393 return rc;
2394}
2395
2396
2397int vmsvga3dDXSurfaceCopyAndReadback(PVGASTATECC pThisCC, uint32_t idDXContext)
2398{
2399 int rc;
2400 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2401 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSurfaceCopyAndReadback, VERR_INVALID_STATE);
2402 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2403 AssertReturn(p3dState, VERR_INVALID_STATE);
2404
2405 PVMSVGA3DDXCONTEXT pDXContext;
2406 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2407 AssertRCReturn(rc, rc);
2408
2409 rc = pSvgaR3State->pFuncsDX->pfnDXSurfaceCopyAndReadback(pThisCC, pDXContext);
2410 return rc;
2411}
2412
2413
2414int vmsvga3dDXMoveQuery(PVGASTATECC pThisCC, uint32_t idDXContext)
2415{
2416 int rc;
2417 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2418 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXMoveQuery, VERR_INVALID_STATE);
2419 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2420 AssertReturn(p3dState, VERR_INVALID_STATE);
2421
2422 PVMSVGA3DDXCONTEXT pDXContext;
2423 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2424 AssertRCReturn(rc, rc);
2425
2426 rc = pSvgaR3State->pFuncsDX->pfnDXMoveQuery(pThisCC, pDXContext);
2427 return rc;
2428}
2429
2430
2431int vmsvga3dDXBindAllQuery(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXBindAllQuery const *pCmd)
2432{
2433 int rc;
2434 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2435 AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE);
2436 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2437 AssertReturn(p3dState, VERR_INVALID_STATE);
2438
2439 RT_NOREF(idDXContext);
2440
2441 PVMSVGA3DDXCONTEXT pDXContext;
2442 rc = vmsvga3dDXContextFromCid(p3dState, pCmd->cid, &pDXContext);
2443 AssertRCReturn(rc, rc);
2444
2445 for (uint32_t i = 0; i < pDXContext->cot.cQuery; ++i)
2446 {
2447 SVGACOTableDXQueryEntry *pEntry = &pDXContext->cot.paQuery[i];
2448 if (pEntry->type != SVGA3D_QUERYTYPE_INVALID)
2449 pEntry->mobid = pCmd->mobid;
2450 }
2451
2452 return rc;
2453}
2454
2455
2456int vmsvga3dDXReadbackAllQuery(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXReadbackAllQuery const *pCmd)
2457{
2458 int rc;
2459 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2460 AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE);
2461 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2462 AssertReturn(p3dState, VERR_INVALID_STATE);
2463
2464 RT_NOREF(idDXContext);
2465
2466 PVMSVGA3DDXCONTEXT pDXContext;
2467 rc = vmsvga3dDXContextFromCid(p3dState, pCmd->cid, &pDXContext);
2468 AssertRCReturn(rc, rc);
2469
2470 /* "Read back cached states from the device if they exist."
2471 * The device does not cache queries. So this is a NOP.
2472 */
2473 RT_NOREF(pDXContext);
2474
2475 return rc;
2476}
2477
2478
2479int vmsvga3dDXBindAllShader(PVGASTATECC pThisCC, uint32_t idDXContext)
2480{
2481 int rc;
2482 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2483 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindAllShader, VERR_INVALID_STATE);
2484 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2485 AssertReturn(p3dState, VERR_INVALID_STATE);
2486
2487 PVMSVGA3DDXCONTEXT pDXContext;
2488 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2489 AssertRCReturn(rc, rc);
2490
2491 rc = pSvgaR3State->pFuncsDX->pfnDXBindAllShader(pThisCC, pDXContext);
2492 return rc;
2493}
2494
2495
2496int vmsvga3dDXHint(PVGASTATECC pThisCC, uint32_t idDXContext)
2497{
2498 int rc;
2499 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2500 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXHint, VERR_INVALID_STATE);
2501 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2502 AssertReturn(p3dState, VERR_INVALID_STATE);
2503
2504 PVMSVGA3DDXCONTEXT pDXContext;
2505 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2506 AssertRCReturn(rc, rc);
2507
2508 rc = pSvgaR3State->pFuncsDX->pfnDXHint(pThisCC, pDXContext);
2509 return rc;
2510}
2511
2512
2513int vmsvga3dDXBufferUpdate(PVGASTATECC pThisCC, uint32_t idDXContext)
2514{
2515 int rc;
2516 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2517 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBufferUpdate, VERR_INVALID_STATE);
2518 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2519 AssertReturn(p3dState, VERR_INVALID_STATE);
2520
2521 PVMSVGA3DDXCONTEXT pDXContext;
2522 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2523 AssertRCReturn(rc, rc);
2524
2525 rc = pSvgaR3State->pFuncsDX->pfnDXBufferUpdate(pThisCC, pDXContext);
2526 return rc;
2527}
2528
2529
2530int vmsvga3dDXSetConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetConstantBufferOffset const *pCmd, SVGA3dShaderType type)
2531{
2532 int rc;
2533 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2534 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetSingleConstantBuffer, VERR_INVALID_STATE);
2535 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2536 AssertReturn(p3dState, VERR_INVALID_STATE);
2537
2538 PVMSVGA3DDXCONTEXT pDXContext;
2539 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2540 AssertRCReturn(rc, rc);
2541
2542 ASSERT_GUEST_RETURN(pCmd->slot < SVGA3D_DX_MAX_CONSTBUFFERS, VERR_INVALID_PARAMETER);
2543 RT_UNTRUSTED_VALIDATED_FENCE();
2544
2545 uint32_t const idxShaderState = type - SVGA3D_SHADERTYPE_MIN;
2546 SVGA3dConstantBufferBinding *pCBB = &pDXContext->svgaDXContext.shaderState[idxShaderState].constantBuffers[pCmd->slot];
2547
2548 /* Only 'offsetInBytes' is updated. */
2549 // pCBB->sid;
2550 pCBB->offsetInBytes = pCmd->offsetInBytes;
2551 // pCBB->sizeInBytes;
2552
2553 rc = pSvgaR3State->pFuncsDX->pfnDXSetSingleConstantBuffer(pThisCC, pDXContext, pCmd->slot, type, pCBB->sid, pCBB->offsetInBytes, pCBB->sizeInBytes);
2554 return rc;
2555}
2556
2557
2558int vmsvga3dDXCondBindAllShader(PVGASTATECC pThisCC, uint32_t idDXContext)
2559{
2560 int rc;
2561 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2562 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXCondBindAllShader, VERR_INVALID_STATE);
2563 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2564 AssertReturn(p3dState, VERR_INVALID_STATE);
2565
2566 PVMSVGA3DDXCONTEXT pDXContext;
2567 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2568 AssertRCReturn(rc, rc);
2569
2570 rc = pSvgaR3State->pFuncsDX->pfnDXCondBindAllShader(pThisCC, pDXContext);
2571 return rc;
2572}
2573
2574
2575int vmsvga3dScreenCopy(PVGASTATECC pThisCC, uint32_t idDXContext)
2576{
2577 int rc;
2578 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2579 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnScreenCopy, VERR_INVALID_STATE);
2580 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2581 AssertReturn(p3dState, VERR_INVALID_STATE);
2582
2583 PVMSVGA3DDXCONTEXT pDXContext;
2584 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2585 AssertRCReturn(rc, rc);
2586
2587 rc = pSvgaR3State->pFuncsDX->pfnScreenCopy(pThisCC, pDXContext);
2588 return rc;
2589}
2590
2591
2592int vmsvga3dDXGrowCOTable(PVGASTATECC pThisCC, SVGA3dCmdDXGrowCOTable const *pCmd)
2593{
2594 int rc;
2595 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2596 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetCOTable, VERR_INVALID_STATE);
2597 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2598 AssertReturn(p3dState, VERR_INVALID_STATE);
2599
2600 PVMSVGA3DDXCONTEXT pDXContext;
2601 rc = vmsvga3dDXContextFromCid(p3dState, pCmd->cid, &pDXContext);
2602 AssertRCReturn(rc, rc);
2603
2604 PVMSVGAMOB pMob = vmsvgaR3MobGet(pSvgaR3State, pCmd->mobid);
2605 return dxSetOrGrowCOTable(pThisCC, pDXContext, pMob, pCmd->type, pCmd->validSizeInBytes, true);
2606}
2607
2608
2609int vmsvga3dIntraSurfaceCopy(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdIntraSurfaceCopy const *pCmd)
2610{
2611 int rc;
2612 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2613 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnIntraSurfaceCopy, VERR_INVALID_STATE);
2614 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2615 AssertReturn(p3dState, VERR_INVALID_STATE);
2616
2617 PVMSVGA3DDXCONTEXT pDXContext;
2618 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2619 AssertRCReturn(rc, rc);
2620
2621 rc = pSvgaR3State->pFuncsDX->pfnIntraSurfaceCopy(pThisCC, pDXContext, pCmd->surface, pCmd->box);
2622 return rc;
2623}
2624
2625
2626int vmsvga3dDXResolveCopy(PVGASTATECC pThisCC, uint32_t idDXContext)
2627{
2628 int rc;
2629 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2630 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXResolveCopy, VERR_INVALID_STATE);
2631 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2632 AssertReturn(p3dState, VERR_INVALID_STATE);
2633
2634 PVMSVGA3DDXCONTEXT pDXContext;
2635 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2636 AssertRCReturn(rc, rc);
2637
2638 rc = pSvgaR3State->pFuncsDX->pfnDXResolveCopy(pThisCC, pDXContext);
2639 return rc;
2640}
2641
2642
2643int vmsvga3dDXPredResolveCopy(PVGASTATECC pThisCC, uint32_t idDXContext)
2644{
2645 int rc;
2646 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2647 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXPredResolveCopy, VERR_INVALID_STATE);
2648 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2649 AssertReturn(p3dState, VERR_INVALID_STATE);
2650
2651 PVMSVGA3DDXCONTEXT pDXContext;
2652 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2653 AssertRCReturn(rc, rc);
2654
2655 rc = pSvgaR3State->pFuncsDX->pfnDXPredResolveCopy(pThisCC, pDXContext);
2656 return rc;
2657}
2658
2659
2660int vmsvga3dDXPredConvertRegion(PVGASTATECC pThisCC, uint32_t idDXContext)
2661{
2662 int rc;
2663 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2664 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXPredConvertRegion, VERR_INVALID_STATE);
2665 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2666 AssertReturn(p3dState, VERR_INVALID_STATE);
2667
2668 PVMSVGA3DDXCONTEXT pDXContext;
2669 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2670 AssertRCReturn(rc, rc);
2671
2672 rc = pSvgaR3State->pFuncsDX->pfnDXPredConvertRegion(pThisCC, pDXContext);
2673 return rc;
2674}
2675
2676
2677int vmsvga3dDXPredConvert(PVGASTATECC pThisCC, uint32_t idDXContext)
2678{
2679 int rc;
2680 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2681 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXPredConvert, VERR_INVALID_STATE);
2682 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2683 AssertReturn(p3dState, VERR_INVALID_STATE);
2684
2685 PVMSVGA3DDXCONTEXT pDXContext;
2686 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2687 AssertRCReturn(rc, rc);
2688
2689 rc = pSvgaR3State->pFuncsDX->pfnDXPredConvert(pThisCC, pDXContext);
2690 return rc;
2691}
2692
2693
2694int vmsvga3dWholeSurfaceCopy(PVGASTATECC pThisCC, uint32_t idDXContext)
2695{
2696 int rc;
2697 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2698 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnWholeSurfaceCopy, VERR_INVALID_STATE);
2699 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2700 AssertReturn(p3dState, VERR_INVALID_STATE);
2701
2702 PVMSVGA3DDXCONTEXT pDXContext;
2703 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2704 AssertRCReturn(rc, rc);
2705
2706 rc = pSvgaR3State->pFuncsDX->pfnWholeSurfaceCopy(pThisCC, pDXContext);
2707 return rc;
2708}
2709
2710
2711int vmsvga3dDXDefineUAView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineUAView const *pCmd)
2712{
2713 int rc;
2714 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2715 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineUAView, VERR_INVALID_STATE);
2716 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2717 AssertReturn(p3dState, VERR_INVALID_STATE);
2718
2719 PVMSVGA3DDXCONTEXT pDXContext;
2720 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2721 AssertRCReturn(rc, rc);
2722
2723 SVGA3dUAViewId const uaViewId = pCmd->uaViewId;
2724
2725 ASSERT_GUEST_RETURN(pDXContext->cot.paUAView, VERR_INVALID_STATE);
2726 ASSERT_GUEST_RETURN(uaViewId < pDXContext->cot.cUAView, VERR_INVALID_PARAMETER);
2727 RT_UNTRUSTED_VALIDATED_FENCE();
2728
2729 SVGACOTableDXUAViewEntry *pEntry = &pDXContext->cot.paUAView[uaViewId];
2730 pEntry->sid = pCmd->sid;
2731 pEntry->format = pCmd->format;
2732 pEntry->resourceDimension = pCmd->resourceDimension;
2733 pEntry->desc = pCmd->desc;
2734 pEntry->structureCount = 0;
2735
2736 rc = pSvgaR3State->pFuncsDX->pfnDXDefineUAView(pThisCC, pDXContext, uaViewId, pEntry);
2737 return rc;
2738}
2739
2740
2741int vmsvga3dDXDestroyUAView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyUAView const *pCmd)
2742{
2743 int rc;
2744 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2745 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyUAView, VERR_INVALID_STATE);
2746 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2747 AssertReturn(p3dState, VERR_INVALID_STATE);
2748
2749 PVMSVGA3DDXCONTEXT pDXContext;
2750 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2751 AssertRCReturn(rc, rc);
2752
2753 SVGA3dUAViewId const uaViewId = pCmd->uaViewId;
2754
2755 ASSERT_GUEST_RETURN(pDXContext->cot.paUAView, VERR_INVALID_STATE);
2756 ASSERT_GUEST_RETURN(uaViewId < pDXContext->cot.cUAView, VERR_INVALID_PARAMETER);
2757 RT_UNTRUSTED_VALIDATED_FENCE();
2758
2759 SVGACOTableDXUAViewEntry *pEntry = &pDXContext->cot.paUAView[uaViewId];
2760 RT_ZERO(*pEntry);
2761
2762 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyUAView(pThisCC, pDXContext, uaViewId);
2763 return rc;
2764}
2765
2766
2767int vmsvga3dDXClearUAViewUint(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXClearUAViewUint const *pCmd)
2768{
2769 int rc;
2770 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2771 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXClearUAViewUint, VERR_INVALID_STATE);
2772 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2773 AssertReturn(p3dState, VERR_INVALID_STATE);
2774
2775 PVMSVGA3DDXCONTEXT pDXContext;
2776 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2777 AssertRCReturn(rc, rc);
2778
2779 SVGA3dUAViewId const uaViewId = pCmd->uaViewId;
2780
2781 ASSERT_GUEST_RETURN(pDXContext->cot.paUAView, VERR_INVALID_STATE);
2782 ASSERT_GUEST_RETURN(uaViewId < pDXContext->cot.cUAView, VERR_INVALID_PARAMETER);
2783 RT_UNTRUSTED_VALIDATED_FENCE();
2784
2785 rc = pSvgaR3State->pFuncsDX->pfnDXClearUAViewUint(pThisCC, pDXContext, uaViewId, pCmd->value.value);
2786 return rc;
2787}
2788
2789
2790int vmsvga3dDXClearUAViewFloat(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXClearUAViewFloat const *pCmd)
2791{
2792 int rc;
2793 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2794 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXClearUAViewFloat, VERR_INVALID_STATE);
2795 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2796 AssertReturn(p3dState, VERR_INVALID_STATE);
2797
2798 PVMSVGA3DDXCONTEXT pDXContext;
2799 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2800 AssertRCReturn(rc, rc);
2801
2802 SVGA3dUAViewId const uaViewId = pCmd->uaViewId;
2803
2804 ASSERT_GUEST_RETURN(pDXContext->cot.paUAView, VERR_INVALID_STATE);
2805 ASSERT_GUEST_RETURN(uaViewId < pDXContext->cot.cUAView, VERR_INVALID_PARAMETER);
2806 RT_UNTRUSTED_VALIDATED_FENCE();
2807
2808 rc = pSvgaR3State->pFuncsDX->pfnDXClearUAViewFloat(pThisCC, pDXContext, uaViewId, pCmd->value.value);
2809 return rc;
2810}
2811
2812
2813int vmsvga3dDXCopyStructureCount(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXCopyStructureCount const *pCmd)
2814{
2815 int rc;
2816 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2817 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXCopyStructureCount, VERR_INVALID_STATE);
2818 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2819 AssertReturn(p3dState, VERR_INVALID_STATE);
2820
2821 PVMSVGA3DDXCONTEXT pDXContext;
2822 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2823 AssertRCReturn(rc, rc);
2824
2825 SVGA3dUAViewId const uaViewId = pCmd->srcUAViewId;
2826
2827 ASSERT_GUEST_RETURN(pDXContext->cot.paUAView, VERR_INVALID_STATE);
2828 ASSERT_GUEST_RETURN(uaViewId < pDXContext->cot.cUAView, VERR_INVALID_PARAMETER);
2829 RT_UNTRUSTED_VALIDATED_FENCE();
2830
2831 rc = pSvgaR3State->pFuncsDX->pfnDXCopyStructureCount(pThisCC, pDXContext, uaViewId, pCmd->destSid, pCmd->destByteOffset);
2832 return rc;
2833}
2834
2835
2836int vmsvga3dDXSetUAViews(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetUAViews const *pCmd, uint32_t cUAViewId, SVGA3dUAViewId const *paUAViewId)
2837{
2838 int rc;
2839 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2840 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetUAViews, VERR_INVALID_STATE);
2841 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2842 AssertReturn(p3dState, VERR_INVALID_STATE);
2843
2844 PVMSVGA3DDXCONTEXT pDXContext;
2845 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2846 AssertRCReturn(rc, rc);
2847
2848 ASSERT_GUEST_RETURN(pCmd->uavSpliceIndex <= SVGA3D_MAX_SIMULTANEOUS_RENDER_TARGETS, VERR_INVALID_PARAMETER);
2849 ASSERT_GUEST_RETURN(cUAViewId <= SVGA3D_DX11_1_MAX_UAVIEWS, VERR_INVALID_PARAMETER);
2850 for (uint32_t i = 0; i < cUAViewId; ++i)
2851 ASSERT_GUEST_RETURN( paUAViewId[i] < pDXContext->cot.cUAView
2852 || paUAViewId[i] == SVGA3D_INVALID_ID, VERR_INVALID_PARAMETER);
2853 RT_UNTRUSTED_VALIDATED_FENCE();
2854
2855 for (uint32_t i = 0; i < cUAViewId; ++i)
2856 {
2857 SVGA3dUAViewId const uaViewId = paUAViewId[i];
2858 pDXContext->svgaDXContext.uaViewIds[i] = uaViewId;
2859 }
2860 pDXContext->svgaDXContext.uavSpliceIndex = pCmd->uavSpliceIndex;
2861
2862 rc = pSvgaR3State->pFuncsDX->pfnDXSetUAViews(pThisCC, pDXContext, pCmd->uavSpliceIndex, cUAViewId, paUAViewId);
2863 return rc;
2864}
2865
2866
2867int vmsvga3dDXDrawIndexedInstancedIndirect(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDrawIndexedInstancedIndirect const *pCmd)
2868{
2869 int rc;
2870 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2871 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDrawIndexedInstancedIndirect, VERR_INVALID_STATE);
2872 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2873 AssertReturn(p3dState, VERR_INVALID_STATE);
2874
2875 PVMSVGA3DDXCONTEXT pDXContext;
2876 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2877 AssertRCReturn(rc, rc);
2878
2879 rc = pSvgaR3State->pFuncsDX->pfnDXDrawIndexedInstancedIndirect(pThisCC, pDXContext, pCmd->argsBufferSid, pCmd->byteOffsetForArgs);
2880 return rc;
2881}
2882
2883
2884int vmsvga3dDXDrawInstancedIndirect(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDrawInstancedIndirect const *pCmd)
2885{
2886 int rc;
2887 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2888 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDrawInstancedIndirect, VERR_INVALID_STATE);
2889 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2890 AssertReturn(p3dState, VERR_INVALID_STATE);
2891
2892 PVMSVGA3DDXCONTEXT pDXContext;
2893 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2894 AssertRCReturn(rc, rc);
2895
2896 rc = pSvgaR3State->pFuncsDX->pfnDXDrawInstancedIndirect(pThisCC, pDXContext, pCmd->argsBufferSid, pCmd->byteOffsetForArgs);
2897 return rc;
2898}
2899
2900
2901int vmsvga3dDXDispatch(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDispatch const *pCmd)
2902{
2903 int rc;
2904 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2905 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDispatch, VERR_INVALID_STATE);
2906 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2907 AssertReturn(p3dState, VERR_INVALID_STATE);
2908
2909 PVMSVGA3DDXCONTEXT pDXContext;
2910 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2911 AssertRCReturn(rc, rc);
2912
2913 rc = pSvgaR3State->pFuncsDX->pfnDXDispatch(pThisCC, pDXContext, pCmd->threadGroupCountX, pCmd->threadGroupCountY, pCmd->threadGroupCountZ);
2914 return rc;
2915}
2916
2917
2918int vmsvga3dDXDispatchIndirect(PVGASTATECC pThisCC, uint32_t idDXContext)
2919{
2920 int rc;
2921 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2922 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDispatchIndirect, VERR_INVALID_STATE);
2923 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2924 AssertReturn(p3dState, VERR_INVALID_STATE);
2925
2926 PVMSVGA3DDXCONTEXT pDXContext;
2927 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2928 AssertRCReturn(rc, rc);
2929
2930 rc = pSvgaR3State->pFuncsDX->pfnDXDispatchIndirect(pThisCC, pDXContext);
2931 return rc;
2932}
2933
2934
2935int vmsvga3dWriteZeroSurface(PVGASTATECC pThisCC, uint32_t idDXContext)
2936{
2937 int rc;
2938 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2939 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnWriteZeroSurface, VERR_INVALID_STATE);
2940 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2941 AssertReturn(p3dState, VERR_INVALID_STATE);
2942
2943 PVMSVGA3DDXCONTEXT pDXContext;
2944 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2945 AssertRCReturn(rc, rc);
2946
2947 rc = pSvgaR3State->pFuncsDX->pfnWriteZeroSurface(pThisCC, pDXContext);
2948 return rc;
2949}
2950
2951
2952int vmsvga3dHintZeroSurface(PVGASTATECC pThisCC, uint32_t idDXContext)
2953{
2954 int rc;
2955 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2956 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnHintZeroSurface, VERR_INVALID_STATE);
2957 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2958 AssertReturn(p3dState, VERR_INVALID_STATE);
2959
2960 PVMSVGA3DDXCONTEXT pDXContext;
2961 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2962 AssertRCReturn(rc, rc);
2963
2964 rc = pSvgaR3State->pFuncsDX->pfnHintZeroSurface(pThisCC, pDXContext);
2965 return rc;
2966}
2967
2968
2969int vmsvga3dDXTransferToBuffer(PVGASTATECC pThisCC, uint32_t idDXContext)
2970{
2971 int rc;
2972 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2973 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXTransferToBuffer, VERR_INVALID_STATE);
2974 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2975 AssertReturn(p3dState, VERR_INVALID_STATE);
2976
2977 PVMSVGA3DDXCONTEXT pDXContext;
2978 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2979 AssertRCReturn(rc, rc);
2980
2981 rc = pSvgaR3State->pFuncsDX->pfnDXTransferToBuffer(pThisCC, pDXContext);
2982 return rc;
2983}
2984
2985
2986int vmsvga3dDXSetStructureCount(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetStructureCount const *pCmd)
2987{
2988 int rc;
2989 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2990 AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE);
2991 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2992 AssertReturn(p3dState, VERR_INVALID_STATE);
2993
2994 PVMSVGA3DDXCONTEXT pDXContext;
2995 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2996 AssertRCReturn(rc, rc);
2997
2998 SVGA3dUAViewId const uaViewId = pCmd->uaViewId;
2999
3000 ASSERT_GUEST_RETURN(pDXContext->cot.paUAView, VERR_INVALID_STATE);
3001 ASSERT_GUEST_RETURN(uaViewId < pDXContext->cot.cUAView, VERR_INVALID_PARAMETER);
3002 RT_UNTRUSTED_VALIDATED_FENCE();
3003
3004 SVGACOTableDXUAViewEntry *pEntry = &pDXContext->cot.paUAView[uaViewId];
3005 pEntry->structureCount = pCmd->structureCount;
3006
3007 return VINF_SUCCESS;
3008}
3009
3010
3011int vmsvga3dLogicOpsBitBlt(PVGASTATECC pThisCC, uint32_t idDXContext)
3012{
3013 int rc;
3014 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3015 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnLogicOpsBitBlt, VERR_INVALID_STATE);
3016 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3017 AssertReturn(p3dState, VERR_INVALID_STATE);
3018
3019 PVMSVGA3DDXCONTEXT pDXContext;
3020 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3021 AssertRCReturn(rc, rc);
3022
3023 rc = pSvgaR3State->pFuncsDX->pfnLogicOpsBitBlt(pThisCC, pDXContext);
3024 return rc;
3025}
3026
3027
3028int vmsvga3dLogicOpsTransBlt(PVGASTATECC pThisCC, uint32_t idDXContext)
3029{
3030 int rc;
3031 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3032 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnLogicOpsTransBlt, VERR_INVALID_STATE);
3033 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3034 AssertReturn(p3dState, VERR_INVALID_STATE);
3035
3036 PVMSVGA3DDXCONTEXT pDXContext;
3037 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3038 AssertRCReturn(rc, rc);
3039
3040 rc = pSvgaR3State->pFuncsDX->pfnLogicOpsTransBlt(pThisCC, pDXContext);
3041 return rc;
3042}
3043
3044
3045int vmsvga3dLogicOpsStretchBlt(PVGASTATECC pThisCC, uint32_t idDXContext)
3046{
3047 int rc;
3048 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3049 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnLogicOpsStretchBlt, VERR_INVALID_STATE);
3050 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3051 AssertReturn(p3dState, VERR_INVALID_STATE);
3052
3053 PVMSVGA3DDXCONTEXT pDXContext;
3054 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3055 AssertRCReturn(rc, rc);
3056
3057 rc = pSvgaR3State->pFuncsDX->pfnLogicOpsStretchBlt(pThisCC, pDXContext);
3058 return rc;
3059}
3060
3061
3062int vmsvga3dLogicOpsColorFill(PVGASTATECC pThisCC, uint32_t idDXContext)
3063{
3064 int rc;
3065 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3066 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnLogicOpsColorFill, VERR_INVALID_STATE);
3067 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3068 AssertReturn(p3dState, VERR_INVALID_STATE);
3069
3070 PVMSVGA3DDXCONTEXT pDXContext;
3071 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3072 AssertRCReturn(rc, rc);
3073
3074 rc = pSvgaR3State->pFuncsDX->pfnLogicOpsColorFill(pThisCC, pDXContext);
3075 return rc;
3076}
3077
3078
3079int vmsvga3dLogicOpsAlphaBlend(PVGASTATECC pThisCC, uint32_t idDXContext)
3080{
3081 int rc;
3082 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3083 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnLogicOpsAlphaBlend, VERR_INVALID_STATE);
3084 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3085 AssertReturn(p3dState, VERR_INVALID_STATE);
3086
3087 PVMSVGA3DDXCONTEXT pDXContext;
3088 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3089 AssertRCReturn(rc, rc);
3090
3091 rc = pSvgaR3State->pFuncsDX->pfnLogicOpsAlphaBlend(pThisCC, pDXContext);
3092 return rc;
3093}
3094
3095
3096int vmsvga3dLogicOpsClearTypeBlend(PVGASTATECC pThisCC, uint32_t idDXContext)
3097{
3098 int rc;
3099 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3100 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnLogicOpsClearTypeBlend, VERR_INVALID_STATE);
3101 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3102 AssertReturn(p3dState, VERR_INVALID_STATE);
3103
3104 PVMSVGA3DDXCONTEXT pDXContext;
3105 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3106 AssertRCReturn(rc, rc);
3107
3108 rc = pSvgaR3State->pFuncsDX->pfnLogicOpsClearTypeBlend(pThisCC, pDXContext);
3109 return rc;
3110}
3111
3112
3113int vmsvga3dDXSetCSUAViews(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetCSUAViews const *pCmd, uint32_t cUAViewId, SVGA3dUAViewId const *paUAViewId)
3114{
3115 int rc;
3116 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3117 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetCSUAViews, VERR_INVALID_STATE);
3118 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3119 AssertReturn(p3dState, VERR_INVALID_STATE);
3120
3121 PVMSVGA3DDXCONTEXT pDXContext;
3122 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3123 AssertRCReturn(rc, rc);
3124
3125 ASSERT_GUEST_RETURN(pCmd->startIndex < SVGA3D_DX11_1_MAX_UAVIEWS, VERR_INVALID_PARAMETER);
3126 ASSERT_GUEST_RETURN(cUAViewId <= SVGA3D_DX11_1_MAX_UAVIEWS - pCmd->startIndex, VERR_INVALID_PARAMETER);
3127 for (uint32_t i = 0; i < cUAViewId; ++i)
3128 ASSERT_GUEST_RETURN( paUAViewId[i] < pDXContext->cot.cUAView
3129 || paUAViewId[i] == SVGA3D_INVALID_ID, VERR_INVALID_PARAMETER);
3130 RT_UNTRUSTED_VALIDATED_FENCE();
3131
3132 for (uint32_t i = 0; i < cUAViewId; ++i)
3133 {
3134 SVGA3dUAViewId const uaViewId = paUAViewId[i];
3135 pDXContext->svgaDXContext.csuaViewIds[pCmd->startIndex + i] = uaViewId;
3136 }
3137
3138 rc = pSvgaR3State->pFuncsDX->pfnDXSetCSUAViews(pThisCC, pDXContext, pCmd->startIndex, cUAViewId, paUAViewId);
3139 return rc;
3140}
3141
3142
3143int vmsvga3dDXSetMinLOD(PVGASTATECC pThisCC, uint32_t idDXContext)
3144{
3145 int rc;
3146 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3147 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetMinLOD, VERR_INVALID_STATE);
3148 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3149 AssertReturn(p3dState, VERR_INVALID_STATE);
3150
3151 PVMSVGA3DDXCONTEXT pDXContext;
3152 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3153 AssertRCReturn(rc, rc);
3154
3155 rc = pSvgaR3State->pFuncsDX->pfnDXSetMinLOD(pThisCC, pDXContext);
3156 return rc;
3157}
3158
3159
3160int vmsvga3dDXDefineStreamOutputWithMob(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineStreamOutputWithMob const *pCmd)
3161{
3162 int rc;
3163 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3164 AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE);
3165 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3166 AssertReturn(p3dState, VERR_INVALID_STATE);
3167
3168 PVMSVGA3DDXCONTEXT pDXContext;
3169 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3170 AssertRCReturn(rc, rc);
3171
3172 SVGA3dStreamOutputId const soid = pCmd->soid;
3173
3174 ASSERT_GUEST_RETURN(pDXContext->cot.paStreamOutput, VERR_INVALID_STATE);
3175 ASSERT_GUEST_RETURN(soid < pDXContext->cot.cStreamOutput, VERR_INVALID_PARAMETER);
3176 ASSERT_GUEST_RETURN(pCmd->numOutputStreamEntries < SVGA3D_MAX_STREAMOUT_DECLS, VERR_INVALID_PARAMETER);
3177 RT_UNTRUSTED_VALIDATED_FENCE();
3178
3179 SVGACOTableDXStreamOutputEntry *pEntry = &pDXContext->cot.paStreamOutput[soid];
3180 pEntry->numOutputStreamEntries = pCmd->numOutputStreamEntries;
3181 RT_ZERO(pEntry->decl);
3182 memcpy(pEntry->streamOutputStrideInBytes, pCmd->streamOutputStrideInBytes, sizeof(pEntry->streamOutputStrideInBytes));
3183 pEntry->rasterizedStream = pCmd->rasterizedStream;
3184 pEntry->numOutputStreamStrides = pCmd->numOutputStreamStrides;
3185 pEntry->mobid = SVGA_ID_INVALID;
3186 pEntry->offsetInBytes = 0;
3187 pEntry->usesMob = 1;
3188 pEntry->pad0 = 0;
3189 pEntry->pad1 = 0;
3190 RT_ZERO(pEntry->pad2);
3191
3192 rc = pSvgaR3State->pFuncsDX->pfnDXDefineStreamOutput(pThisCC, pDXContext, soid, pEntry);
3193 return rc;
3194}
3195
3196
3197int vmsvga3dDXSetShaderIface(PVGASTATECC pThisCC, uint32_t idDXContext)
3198{
3199 int rc;
3200 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3201 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetShaderIface, VERR_INVALID_STATE);
3202 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3203 AssertReturn(p3dState, VERR_INVALID_STATE);
3204
3205 PVMSVGA3DDXCONTEXT pDXContext;
3206 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3207 AssertRCReturn(rc, rc);
3208
3209 rc = pSvgaR3State->pFuncsDX->pfnDXSetShaderIface(pThisCC, pDXContext);
3210 return rc;
3211}
3212
3213
3214int vmsvga3dDXBindStreamOutput(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXBindStreamOutput const *pCmd)
3215{
3216 int rc;
3217 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3218 AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE);
3219 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3220 AssertReturn(p3dState, VERR_INVALID_STATE);
3221
3222 PVMSVGA3DDXCONTEXT pDXContext;
3223 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3224 AssertRCReturn(rc, rc);
3225 SVGA3dStreamOutputId const soid = pCmd->soid;
3226
3227 ASSERT_GUEST_RETURN(pDXContext->cot.paStreamOutput, VERR_INVALID_STATE);
3228 ASSERT_GUEST_RETURN(soid < pDXContext->cot.cStreamOutput, VERR_INVALID_PARAMETER);
3229 RT_UNTRUSTED_VALIDATED_FENCE();
3230
3231 SVGACOTableDXStreamOutputEntry *pEntry = &pDXContext->cot.paStreamOutput[soid];
3232
3233 ASSERT_GUEST_RETURN(pCmd->sizeInBytes >= pEntry->numOutputStreamEntries * sizeof(SVGA3dStreamOutputDeclarationEntry), VERR_INVALID_PARAMETER);
3234 ASSERT_GUEST(pEntry->usesMob);
3235
3236 pEntry->mobid = pCmd->mobid;
3237 pEntry->offsetInBytes = pCmd->offsetInBytes;
3238 pEntry->usesMob = 1;
3239
3240 return VINF_SUCCESS;
3241}
3242
3243
3244int vmsvga3dSurfaceStretchBltNonMSToMS(PVGASTATECC pThisCC, uint32_t idDXContext)
3245{
3246 int rc;
3247 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3248 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnSurfaceStretchBltNonMSToMS, VERR_INVALID_STATE);
3249 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3250 AssertReturn(p3dState, VERR_INVALID_STATE);
3251
3252 PVMSVGA3DDXCONTEXT pDXContext;
3253 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3254 AssertRCReturn(rc, rc);
3255
3256 rc = pSvgaR3State->pFuncsDX->pfnSurfaceStretchBltNonMSToMS(pThisCC, pDXContext);
3257 return rc;
3258}
3259
3260
3261int vmsvga3dDXBindShaderIface(PVGASTATECC pThisCC, uint32_t idDXContext)
3262{
3263 int rc;
3264 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3265 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindShaderIface, VERR_INVALID_STATE);
3266 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3267 AssertReturn(p3dState, VERR_INVALID_STATE);
3268
3269 PVMSVGA3DDXCONTEXT pDXContext;
3270 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3271 AssertRCReturn(rc, rc);
3272
3273 rc = pSvgaR3State->pFuncsDX->pfnDXBindShaderIface(pThisCC, pDXContext);
3274 return rc;
3275}
3276
3277
3278int vmsvga3dVBDXClearRenderTargetViewRegion(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdVBDXClearRenderTargetViewRegion const *pCmd, uint32_t cRect, SVGASignedRect const *paRect)
3279{
3280 int rc;
3281 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3282 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnVBDXClearRenderTargetViewRegion, VERR_INVALID_STATE);
3283 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3284 AssertReturn(p3dState, VERR_INVALID_STATE);
3285
3286 PVMSVGA3DDXCONTEXT pDXContext;
3287 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3288 AssertRCReturn(rc, rc);
3289
3290 SVGA3dRenderTargetViewId const renderTargetViewId = pCmd->viewId;
3291
3292 ASSERT_GUEST_RETURN(pDXContext->cot.paRTView, VERR_INVALID_STATE);
3293 ASSERT_GUEST_RETURN(renderTargetViewId < pDXContext->cot.cRTView, VERR_INVALID_PARAMETER);
3294 ASSERT_GUEST_RETURN(cRect <= 65536, VERR_INVALID_PARAMETER); /* Arbitrary limit. */
3295 RT_UNTRUSTED_VALIDATED_FENCE();
3296
3297 rc = pSvgaR3State->pFuncsDX->pfnVBDXClearRenderTargetViewRegion(pThisCC, pDXContext, renderTargetViewId, &pCmd->color, cRect, paRect);
3298 return rc;
3299}
3300
3301
3302int vmsvga3dVBDXDefineVideoProcessor(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXDefineVideoProcessor const *pCmd)
3303{
3304 int rc;
3305 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3306 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXDefineVideoProcessor, VERR_INVALID_STATE);
3307 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3308 AssertReturn(p3dState, VERR_INVALID_STATE);
3309
3310 PVMSVGA3DDXCONTEXT pDXContext;
3311 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3312 AssertRCReturn(rc, rc);
3313
3314 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
3315
3316 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
3317 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
3318 RT_UNTRUSTED_VALIDATED_FENCE();
3319
3320 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
3321 pEntry->desc = pCmd->desc;
3322
3323 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXDefineVideoProcessor(pThisCC, pDXContext, videoProcessorId, pEntry);
3324 return rc;
3325}
3326
3327
3328int vmsvga3dVBDXDefineVideoDecoderOutputView(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXDefineVideoDecoderOutputView const *pCmd)
3329{
3330 int rc;
3331 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3332 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXDefineVideoDecoderOutputView, VERR_INVALID_STATE);
3333 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3334 AssertReturn(p3dState, VERR_INVALID_STATE);
3335
3336 PVMSVGA3DDXCONTEXT pDXContext;
3337 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3338 AssertRCReturn(rc, rc);
3339
3340 VBSVGA3dVideoDecoderOutputViewId const videoDecoderOutputViewId = pCmd->videoDecoderOutputViewId;
3341
3342 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoDecoderOutputView, VERR_INVALID_STATE);
3343 ASSERT_GUEST_RETURN(videoDecoderOutputViewId < pDXContext->cot.cVideoDecoderOutputView, VERR_INVALID_PARAMETER);
3344 RT_UNTRUSTED_VALIDATED_FENCE();
3345
3346 VBSVGACOTableDXVideoDecoderOutputViewEntry *pEntry = &pDXContext->cot.paVideoDecoderOutputView[videoDecoderOutputViewId];
3347 pEntry->sid = pCmd->sid;
3348 pEntry->desc = pCmd->desc;
3349
3350 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXDefineVideoDecoderOutputView(pThisCC, pDXContext, videoDecoderOutputViewId, pEntry);
3351 return rc;
3352}
3353
3354
3355int vmsvga3dVBDXDefineVideoDecoder(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXDefineVideoDecoder const *pCmd)
3356{
3357 int rc;
3358 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3359 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXDefineVideoDecoder, VERR_INVALID_STATE);
3360 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3361 AssertReturn(p3dState, VERR_INVALID_STATE);
3362
3363 PVMSVGA3DDXCONTEXT pDXContext;
3364 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3365 AssertRCReturn(rc, rc);
3366
3367 VBSVGA3dVideoDecoderId const videoDecoderId = pCmd->videoDecoderId;
3368
3369 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoDecoder, VERR_INVALID_STATE);
3370 ASSERT_GUEST_RETURN(videoDecoderId < pDXContext->cot.cVideoDecoder, VERR_INVALID_PARAMETER);
3371 RT_UNTRUSTED_VALIDATED_FENCE();
3372
3373 VBSVGACOTableDXVideoDecoderEntry *pEntry = &pDXContext->cot.paVideoDecoder[videoDecoderId];
3374 pEntry->desc = pCmd->desc;
3375 pEntry->config = pCmd->config;
3376 pEntry->vdovId = SVGA3D_INVALID_ID;
3377
3378 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXDefineVideoDecoder(pThisCC, pDXContext, videoDecoderId, pEntry);
3379 return rc;
3380}
3381
3382
3383int vmsvga3dVBDXVideoDecoderBeginFrame(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoDecoderBeginFrame const *pCmd)
3384{
3385 int rc;
3386 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3387 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoDecoderBeginFrame, VERR_INVALID_STATE);
3388 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3389 AssertReturn(p3dState, VERR_INVALID_STATE);
3390
3391 PVMSVGA3DDXCONTEXT pDXContext;
3392 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3393 AssertRCReturn(rc, rc);
3394
3395 VBSVGA3dVideoDecoderId const videoDecoderId = pCmd->videoDecoderId;
3396
3397 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoDecoder, VERR_INVALID_STATE);
3398 ASSERT_GUEST_RETURN(videoDecoderId < pDXContext->cot.cVideoDecoder, VERR_INVALID_PARAMETER);
3399
3400 VBSVGA3dVideoDecoderOutputViewId const videoDecoderOutputViewId = pCmd->videoDecoderOutputViewId;
3401
3402 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoDecoderOutputView, VERR_INVALID_STATE);
3403 ASSERT_GUEST_RETURN(videoDecoderOutputViewId < pDXContext->cot.cVideoDecoderOutputView, VERR_INVALID_PARAMETER);
3404 RT_UNTRUSTED_VALIDATED_FENCE();
3405
3406 VBSVGACOTableDXVideoDecoderEntry *pEntry = &pDXContext->cot.paVideoDecoder[videoDecoderId];
3407 pEntry->vdovId = videoDecoderOutputViewId;
3408
3409 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoDecoderBeginFrame(pThisCC, pDXContext, videoDecoderId, videoDecoderOutputViewId);
3410 return rc;
3411}
3412
3413
3414int vmsvga3dVBDXVideoDecoderSubmitBuffers(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoDecoderSubmitBuffers const *pCmd, uint32_t cBuffer, VBSVGA3dVideoDecoderBufferDesc const *paBufferDesc)
3415{
3416 int rc;
3417 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3418 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoDecoderSubmitBuffers, VERR_INVALID_STATE);
3419 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3420 AssertReturn(p3dState, VERR_INVALID_STATE);
3421
3422 PVMSVGA3DDXCONTEXT pDXContext;
3423 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3424 AssertRCReturn(rc, rc);
3425
3426 VBSVGA3dVideoDecoderId const videoDecoderId = pCmd->videoDecoderId;
3427
3428 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoDecoder, VERR_INVALID_STATE);
3429 ASSERT_GUEST_RETURN(videoDecoderId < pDXContext->cot.cVideoDecoder, VERR_INVALID_PARAMETER);
3430 RT_UNTRUSTED_VALIDATED_FENCE();
3431
3432 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoDecoderSubmitBuffers(pThisCC, pDXContext, videoDecoderId, cBuffer, paBufferDesc);
3433 return rc;
3434}
3435
3436
3437int vmsvga3dVBDXVideoDecoderEndFrame(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoDecoderEndFrame const *pCmd)
3438{
3439 int rc;
3440 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3441 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoDecoderEndFrame, VERR_INVALID_STATE);
3442 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3443 AssertReturn(p3dState, VERR_INVALID_STATE);
3444
3445 PVMSVGA3DDXCONTEXT pDXContext;
3446 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3447 AssertRCReturn(rc, rc);
3448
3449 VBSVGA3dVideoDecoderId const videoDecoderId = pCmd->videoDecoderId;
3450
3451 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoDecoder, VERR_INVALID_STATE);
3452 ASSERT_GUEST_RETURN(videoDecoderId < pDXContext->cot.cVideoDecoder, VERR_INVALID_PARAMETER);
3453 RT_UNTRUSTED_VALIDATED_FENCE();
3454
3455 VBSVGACOTableDXVideoDecoderEntry *pEntry = &pDXContext->cot.paVideoDecoder[videoDecoderId];
3456 pEntry->vdovId = SVGA3D_INVALID_ID;
3457
3458 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoDecoderEndFrame(pThisCC, pDXContext, videoDecoderId);
3459 return rc;
3460}
3461
3462
3463int vmsvga3dVBDXDefineVideoProcessorInputView(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXDefineVideoProcessorInputView const *pCmd)
3464{
3465 int rc;
3466 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3467 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXDefineVideoProcessorInputView, VERR_INVALID_STATE);
3468 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3469 AssertReturn(p3dState, VERR_INVALID_STATE);
3470
3471 PVMSVGA3DDXCONTEXT pDXContext;
3472 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3473 AssertRCReturn(rc, rc);
3474
3475 VBSVGA3dVideoProcessorInputViewId const videoProcessorInputViewId = pCmd->videoProcessorInputViewId;
3476
3477 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessorInputView, VERR_INVALID_STATE);
3478 ASSERT_GUEST_RETURN(videoProcessorInputViewId < pDXContext->cot.cVideoProcessorInputView, VERR_INVALID_PARAMETER);
3479 RT_UNTRUSTED_VALIDATED_FENCE();
3480
3481 VBSVGACOTableDXVideoProcessorInputViewEntry *pEntry = &pDXContext->cot.paVideoProcessorInputView[videoProcessorInputViewId];
3482 pEntry->sid = pCmd->sid;
3483 pEntry->contentDesc = pCmd->contentDesc;
3484 pEntry->desc = pCmd->desc;
3485
3486 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXDefineVideoProcessorInputView(pThisCC, pDXContext, videoProcessorInputViewId, pEntry);
3487 return rc;
3488}
3489
3490
3491int vmsvga3dVBDXDefineVideoProcessorOutputView(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXDefineVideoProcessorOutputView const *pCmd)
3492{
3493 int rc;
3494 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3495 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXDefineVideoProcessorOutputView, VERR_INVALID_STATE);
3496 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3497 AssertReturn(p3dState, VERR_INVALID_STATE);
3498
3499 PVMSVGA3DDXCONTEXT pDXContext;
3500 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3501 AssertRCReturn(rc, rc);
3502
3503 VBSVGA3dVideoProcessorOutputViewId const videoProcessorOutputViewId = pCmd->videoProcessorOutputViewId;
3504
3505 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessorOutputView, VERR_INVALID_STATE);
3506 ASSERT_GUEST_RETURN(videoProcessorOutputViewId < pDXContext->cot.cVideoProcessorOutputView, VERR_INVALID_PARAMETER);
3507 RT_UNTRUSTED_VALIDATED_FENCE();
3508
3509 VBSVGACOTableDXVideoProcessorOutputViewEntry *pEntry = &pDXContext->cot.paVideoProcessorOutputView[videoProcessorOutputViewId];
3510 pEntry->sid = pCmd->sid;
3511 pEntry->contentDesc = pCmd->contentDesc;
3512 pEntry->desc = pCmd->desc;
3513
3514 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXDefineVideoProcessorOutputView(pThisCC, pDXContext, videoProcessorOutputViewId, pEntry);
3515 return rc;
3516}
3517
3518
3519int vmsvga3dVBDXVideoProcessorBlt(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorBlt const *pCmd, uint32_t cbCmd)
3520{
3521 int rc;
3522 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3523 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorBlt, VERR_INVALID_STATE);
3524 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3525 AssertReturn(p3dState, VERR_INVALID_STATE);
3526
3527 PVMSVGA3DDXCONTEXT pDXContext;
3528 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3529 AssertRCReturn(rc, rc);
3530
3531 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
3532
3533 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
3534 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
3535
3536 VBSVGA3dVideoProcessorOutputViewId const videoProcessorOutputViewId = pCmd->videoProcessorOutputViewId;
3537
3538 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessorOutputView, VERR_INVALID_STATE);
3539 ASSERT_GUEST_RETURN(videoProcessorOutputViewId < pDXContext->cot.cVideoProcessorOutputView, VERR_INVALID_PARAMETER);
3540
3541 ASSERT_GUEST_RETURN(pCmd->streamCount < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
3542 RT_UNTRUSTED_VALIDATED_FENCE();
3543
3544 VBSVGA3dVideoProcessorStream const *pVPS = (VBSVGA3dVideoProcessorStream *)&pCmd[1];
3545 uint32_t cbLeft = cbCmd - sizeof(*pCmd);
3546 for (uint32_t i = 0; i < pCmd->streamCount; ++i)
3547 {
3548 ASSERT_GUEST_RETURN(cbLeft >= sizeof(VBSVGA3dVideoProcessorStream), VERR_INVALID_PARAMETER);
3549 RT_UNTRUSTED_VALIDATED_FENCE();
3550 cbLeft -= sizeof(VBSVGA3dVideoProcessorStream);
3551
3552 uint32_t const cMaxIds = cbLeft / sizeof(VBSVGA3dVideoProcessorInputViewId);
3553 ASSERT_GUEST_RETURN(pVPS->PastFrames < cMaxIds, VERR_INVALID_PARAMETER);
3554 ASSERT_GUEST_RETURN(pVPS->FutureFrames < cMaxIds, VERR_INVALID_PARAMETER);
3555 RT_UNTRUSTED_VALIDATED_FENCE();
3556
3557 uint32_t const cIds = (pVPS->StereoFormatSeparate == 0 ? 1 : 2) * (pVPS->PastFrames + 1 + pVPS->FutureFrames);
3558 ASSERT_GUEST_RETURN(cIds <= cMaxIds, VERR_INVALID_PARAMETER);
3559 RT_UNTRUSTED_VALIDATED_FENCE();
3560
3561 VBSVGA3dVideoProcessorInputViewId const *pId = (VBSVGA3dVideoProcessorInputViewId *)&pVPS[1];
3562 for (uint32_t j = 0; j < cIds; ++j)
3563 {
3564 VBSVGA3dVideoProcessorInputViewId const videoProcessorInputViewId = pId[j];
3565
3566 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessorInputView, VERR_INVALID_STATE);
3567 ASSERT_GUEST_RETURN(videoProcessorInputViewId < pDXContext->cot.cVideoProcessorInputView, VERR_INVALID_PARAMETER);
3568 RT_UNTRUSTED_VALIDATED_FENCE();
3569 }
3570
3571 pVPS = (VBSVGA3dVideoProcessorStream *)((uint8_t *)&pVPS[1] + cIds * sizeof(VBSVGA3dVideoProcessorInputViewId));
3572 cbLeft -= cIds * sizeof(VBSVGA3dVideoProcessorInputViewId);
3573 }
3574
3575 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorBlt(pThisCC, pDXContext,
3576 videoProcessorId, videoProcessorOutputViewId,
3577 pCmd->outputFrame, pCmd->streamCount,
3578 (VBSVGA3dVideoProcessorStream *)&pCmd[1]);
3579 return rc;
3580}
3581
3582
3583int vmsvga3dVBDXDestroyVideoDecoder(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXDestroyVideoDecoder const *pCmd)
3584{
3585 int rc;
3586 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3587 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXDestroyVideoDecoder, VERR_INVALID_STATE);
3588 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3589 AssertReturn(p3dState, VERR_INVALID_STATE);
3590
3591 PVMSVGA3DDXCONTEXT pDXContext;
3592 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3593 AssertRCReturn(rc, rc);
3594
3595 VBSVGA3dVideoDecoderId const videoDecoderId = pCmd->videoDecoderId;
3596
3597 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoDecoder, VERR_INVALID_STATE);
3598 ASSERT_GUEST_RETURN(videoDecoderId < pDXContext->cot.cVideoDecoder, VERR_INVALID_PARAMETER);
3599 RT_UNTRUSTED_VALIDATED_FENCE();
3600
3601 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXDestroyVideoDecoder(pThisCC, pDXContext, videoDecoderId);
3602
3603 VBSVGACOTableDXVideoDecoderEntry *pEntry = &pDXContext->cot.paVideoDecoder[videoDecoderId];
3604 RT_ZERO(*pEntry);
3605
3606 return rc;
3607}
3608
3609
3610int vmsvga3dVBDXDestroyVideoDecoderOutputView(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXDestroyVideoDecoderOutputView const *pCmd)
3611{
3612 int rc;
3613 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3614 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXDestroyVideoDecoderOutputView, VERR_INVALID_STATE);
3615 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3616 AssertReturn(p3dState, VERR_INVALID_STATE);
3617
3618 PVMSVGA3DDXCONTEXT pDXContext;
3619 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3620 AssertRCReturn(rc, rc);
3621
3622 VBSVGA3dVideoDecoderOutputViewId const videoDecoderOutputViewId = pCmd->videoDecoderOutputViewId;
3623
3624 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoDecoderOutputView, VERR_INVALID_STATE);
3625 ASSERT_GUEST_RETURN(videoDecoderOutputViewId < pDXContext->cot.cVideoDecoderOutputView, VERR_INVALID_PARAMETER);
3626 RT_UNTRUSTED_VALIDATED_FENCE();
3627
3628 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXDestroyVideoDecoderOutputView(pThisCC, pDXContext, videoDecoderOutputViewId);
3629
3630 VBSVGACOTableDXVideoDecoderOutputViewEntry *pEntry = &pDXContext->cot.paVideoDecoderOutputView[videoDecoderOutputViewId];
3631 RT_ZERO(*pEntry);
3632
3633 return rc;
3634}
3635
3636
3637int vmsvga3dVBDXDestroyVideoProcessor(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXDestroyVideoProcessor const *pCmd)
3638{
3639 int rc;
3640 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3641 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXDestroyVideoProcessor, VERR_INVALID_STATE);
3642 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3643 AssertReturn(p3dState, VERR_INVALID_STATE);
3644
3645 PVMSVGA3DDXCONTEXT pDXContext;
3646 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3647 AssertRCReturn(rc, rc);
3648
3649 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
3650
3651 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
3652 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
3653 RT_UNTRUSTED_VALIDATED_FENCE();
3654
3655 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXDestroyVideoProcessor(pThisCC, pDXContext, videoProcessorId);
3656
3657 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
3658 RT_ZERO(*pEntry);
3659
3660 return rc;
3661}
3662
3663
3664int vmsvga3dVBDXDestroyVideoProcessorInputView(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXDestroyVideoProcessorInputView const *pCmd)
3665{
3666 int rc;
3667 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3668 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXDestroyVideoProcessorInputView, VERR_INVALID_STATE);
3669 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3670 AssertReturn(p3dState, VERR_INVALID_STATE);
3671
3672 PVMSVGA3DDXCONTEXT pDXContext;
3673 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3674 AssertRCReturn(rc, rc);
3675
3676 VBSVGA3dVideoProcessorInputViewId const videoProcessorInputViewId = pCmd->videoProcessorInputViewId;
3677
3678 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessorInputView, VERR_INVALID_STATE);
3679 ASSERT_GUEST_RETURN(videoProcessorInputViewId < pDXContext->cot.cVideoProcessorInputView, VERR_INVALID_PARAMETER);
3680 RT_UNTRUSTED_VALIDATED_FENCE();
3681
3682 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXDestroyVideoProcessorInputView(pThisCC, pDXContext, videoProcessorInputViewId);
3683
3684 VBSVGACOTableDXVideoProcessorInputViewEntry *pEntry = &pDXContext->cot.paVideoProcessorInputView[videoProcessorInputViewId];
3685 RT_ZERO(*pEntry);
3686
3687 return rc;
3688}
3689
3690
3691int vmsvga3dVBDXDestroyVideoProcessorOutputView(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXDestroyVideoProcessorOutputView const *pCmd)
3692{
3693 int rc;
3694 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3695 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXDestroyVideoProcessorOutputView, VERR_INVALID_STATE);
3696 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3697 AssertReturn(p3dState, VERR_INVALID_STATE);
3698
3699 PVMSVGA3DDXCONTEXT pDXContext;
3700 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3701 AssertRCReturn(rc, rc);
3702
3703 VBSVGA3dVideoProcessorOutputViewId const videoProcessorOutputViewId = pCmd->videoProcessorOutputViewId;
3704
3705 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessorOutputView, VERR_INVALID_STATE);
3706 ASSERT_GUEST_RETURN(videoProcessorOutputViewId < pDXContext->cot.cVideoProcessorOutputView, VERR_INVALID_PARAMETER);
3707 RT_UNTRUSTED_VALIDATED_FENCE();
3708
3709 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXDestroyVideoProcessorOutputView(pThisCC, pDXContext, videoProcessorOutputViewId);
3710
3711 VBSVGACOTableDXVideoProcessorOutputViewEntry *pEntry = &pDXContext->cot.paVideoProcessorOutputView[videoProcessorOutputViewId];
3712 RT_ZERO(*pEntry);
3713
3714 return rc;
3715}
3716
3717
3718int vmsvga3dVBDXVideoProcessorSetOutputTargetRect(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetOutputTargetRect const *pCmd)
3719{
3720 int rc;
3721 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3722 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetOutputTargetRect, VERR_INVALID_STATE);
3723 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3724 AssertReturn(p3dState, VERR_INVALID_STATE);
3725
3726 PVMSVGA3DDXCONTEXT pDXContext;
3727 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3728 AssertRCReturn(rc, rc);
3729
3730 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
3731
3732 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
3733 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
3734 RT_UNTRUSTED_VALIDATED_FENCE();
3735
3736 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
3737 pEntry->output.SetMask |= VBSVGA3D_VP_SET_OUTPUT_TARGET_RECT;
3738 pEntry->output.TargetRectEnable = RT_BOOL(pCmd->enable);
3739 pEntry->output.TargetRect = pCmd->outputRect;
3740
3741 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetOutputTargetRect(pThisCC, pDXContext, videoProcessorId,
3742 pCmd->enable, pCmd->outputRect);
3743 return rc;
3744}
3745
3746
3747int vmsvga3dVBDXVideoProcessorSetOutputBackgroundColor(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetOutputBackgroundColor const *pCmd)
3748{
3749 int rc;
3750 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3751 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetOutputBackgroundColor, VERR_INVALID_STATE);
3752 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3753 AssertReturn(p3dState, VERR_INVALID_STATE);
3754
3755 PVMSVGA3DDXCONTEXT pDXContext;
3756 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3757 AssertRCReturn(rc, rc);
3758
3759 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
3760
3761 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
3762 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
3763 RT_UNTRUSTED_VALIDATED_FENCE();
3764
3765 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
3766 pEntry->output.SetMask |= VBSVGA3D_VP_SET_OUTPUT_BACKGROUND_COLOR;
3767 pEntry->output.BackgroundColorYCbCr = pCmd->ycbcr;
3768 pEntry->output.BackgroundColor = pCmd->color;
3769
3770 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetOutputBackgroundColor(pThisCC, pDXContext, videoProcessorId, pCmd->ycbcr, pCmd->color);
3771 return rc;
3772}
3773
3774
3775int vmsvga3dVBDXVideoProcessorSetOutputColorSpace(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetOutputColorSpace const *pCmd)
3776{
3777 int rc;
3778 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3779 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetOutputColorSpace, VERR_INVALID_STATE);
3780 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3781 AssertReturn(p3dState, VERR_INVALID_STATE);
3782
3783 PVMSVGA3DDXCONTEXT pDXContext;
3784 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3785 AssertRCReturn(rc, rc);
3786
3787 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
3788
3789 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
3790 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
3791 RT_UNTRUSTED_VALIDATED_FENCE();
3792
3793 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
3794 pEntry->output.SetMask |= VBSVGA3D_VP_SET_OUTPUT_COLOR_SPACE;
3795 pEntry->output.ColorSpace = pCmd->colorSpace;
3796
3797 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetOutputColorSpace(pThisCC, pDXContext, videoProcessorId, pCmd->colorSpace);
3798 return rc;
3799}
3800
3801
3802int vmsvga3dVBDXVideoProcessorSetOutputAlphaFillMode(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetOutputAlphaFillMode const *pCmd)
3803{
3804 int rc;
3805 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3806 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetOutputAlphaFillMode, VERR_INVALID_STATE);
3807 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3808 AssertReturn(p3dState, VERR_INVALID_STATE);
3809
3810 PVMSVGA3DDXCONTEXT pDXContext;
3811 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3812 AssertRCReturn(rc, rc);
3813
3814 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
3815
3816 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
3817 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
3818 ASSERT_GUEST_RETURN(pCmd->streamIndex < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
3819 RT_UNTRUSTED_VALIDATED_FENCE();
3820
3821 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
3822 pEntry->output.SetMask |= VBSVGA3D_VP_SET_OUTPUT_ALPHA_FILL_MODE;
3823 pEntry->output.AlphaFillMode = pCmd->fillMode;
3824 pEntry->output.AlphaFillStreamIndex = pCmd->streamIndex;
3825
3826 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetOutputAlphaFillMode(pThisCC, pDXContext, videoProcessorId, pCmd->fillMode, pCmd->streamIndex);
3827 return rc;
3828}
3829
3830
3831int vmsvga3dVBDXVideoProcessorSetOutputConstriction(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetOutputConstriction const *pCmd)
3832{
3833 int rc;
3834 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3835 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetOutputConstriction, VERR_INVALID_STATE);
3836 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3837 AssertReturn(p3dState, VERR_INVALID_STATE);
3838
3839 PVMSVGA3DDXCONTEXT pDXContext;
3840 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3841 AssertRCReturn(rc, rc);
3842
3843 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
3844
3845 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
3846 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
3847 RT_UNTRUSTED_VALIDATED_FENCE();
3848
3849 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
3850 pEntry->output.SetMask |= VBSVGA3D_VP_SET_OUTPUT_CONSTRICTION;
3851 pEntry->output.ConstrictionEnable = RT_BOOL(pCmd->enabled);
3852 pEntry->output.ConstrictionWidth = pCmd->width;
3853 pEntry->output.ConstrictionHeight = pCmd->height;
3854
3855 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetOutputConstriction(pThisCC, pDXContext, videoProcessorId, pCmd->enabled, pCmd->width, pCmd->height);
3856 return rc;
3857}
3858
3859
3860int vmsvga3dVBDXVideoProcessorSetOutputStereoMode(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetOutputStereoMode const *pCmd)
3861{
3862 int rc;
3863 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3864 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetOutputStereoMode, VERR_INVALID_STATE);
3865 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3866 AssertReturn(p3dState, VERR_INVALID_STATE);
3867
3868 PVMSVGA3DDXCONTEXT pDXContext;
3869 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3870 AssertRCReturn(rc, rc);
3871
3872 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
3873
3874 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
3875 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
3876 RT_UNTRUSTED_VALIDATED_FENCE();
3877
3878 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
3879 pEntry->output.SetMask |= VBSVGA3D_VP_SET_OUTPUT_STEREO_MODE;
3880 pEntry->output.StereoModeEnable = RT_BOOL(pCmd->enable);
3881
3882 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetOutputStereoMode(pThisCC, pDXContext, videoProcessorId, pCmd->enable);
3883 return rc;
3884}
3885
3886
3887int vmsvga3dVBDXVideoProcessorSetStreamFrameFormat(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetStreamFrameFormat const *pCmd)
3888{
3889 int rc;
3890 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3891 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamFrameFormat, VERR_INVALID_STATE);
3892 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3893 AssertReturn(p3dState, VERR_INVALID_STATE);
3894
3895 PVMSVGA3DDXCONTEXT pDXContext;
3896 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3897 AssertRCReturn(rc, rc);
3898
3899 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
3900
3901 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
3902 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
3903 ASSERT_GUEST_RETURN(pCmd->streamIndex < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
3904 RT_UNTRUSTED_VALIDATED_FENCE();
3905
3906 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
3907 VBSVGA3dVideoProcessorStreamState *pStreamState = &pEntry->aStreamState[pCmd->streamIndex];
3908 pStreamState->SetMask |= VBSVGA3D_VP_SET_STREAM_FRAME_FORMAT;
3909 pStreamState->FrameFormat = pCmd->format;
3910
3911 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamFrameFormat(pThisCC, pDXContext, videoProcessorId, pCmd->streamIndex, pCmd->format);
3912 return rc;
3913}
3914
3915
3916int vmsvga3dVBDXVideoProcessorSetStreamColorSpace(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetStreamColorSpace const *pCmd)
3917{
3918 int rc;
3919 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3920 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamColorSpace, VERR_INVALID_STATE);
3921 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3922 AssertReturn(p3dState, VERR_INVALID_STATE);
3923
3924 PVMSVGA3DDXCONTEXT pDXContext;
3925 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3926 AssertRCReturn(rc, rc);
3927
3928 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
3929
3930 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
3931 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
3932 ASSERT_GUEST_RETURN(pCmd->streamIndex < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
3933 RT_UNTRUSTED_VALIDATED_FENCE();
3934
3935 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
3936 VBSVGA3dVideoProcessorStreamState *pStreamState = &pEntry->aStreamState[pCmd->streamIndex];
3937 pStreamState->SetMask |= VBSVGA3D_VP_SET_STREAM_COLOR_SPACE;
3938 pStreamState->ColorSpace = pCmd->colorSpace;
3939
3940 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamColorSpace(pThisCC, pDXContext, videoProcessorId, pCmd->streamIndex, pCmd->colorSpace);
3941 return rc;
3942}
3943
3944
3945int vmsvga3dVBDXVideoProcessorSetStreamOutputRate(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetStreamOutputRate const *pCmd)
3946{
3947 int rc;
3948 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3949 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamOutputRate, VERR_INVALID_STATE);
3950 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3951 AssertReturn(p3dState, VERR_INVALID_STATE);
3952
3953 PVMSVGA3DDXCONTEXT pDXContext;
3954 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3955 AssertRCReturn(rc, rc);
3956
3957 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
3958
3959 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
3960 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
3961 ASSERT_GUEST_RETURN(pCmd->streamIndex < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
3962 RT_UNTRUSTED_VALIDATED_FENCE();
3963
3964 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
3965 VBSVGA3dVideoProcessorStreamState *pStreamState = &pEntry->aStreamState[pCmd->streamIndex];
3966 pStreamState->SetMask |= VBSVGA3D_VP_SET_STREAM_OUTPUT_RATE;
3967 pStreamState->OutputRate = pCmd->outputRate;
3968 pStreamState->RepeatFrame = pCmd->repeatFrame;
3969 pStreamState->CustomRate = pCmd->customRate;
3970
3971 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamOutputRate(pThisCC, pDXContext, videoProcessorId,
3972 pCmd->streamIndex, pCmd->outputRate, pCmd->repeatFrame, pCmd->customRate);
3973 return rc;
3974}
3975
3976
3977int vmsvga3dVBDXVideoProcessorSetStreamSourceRect(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetStreamSourceRect const *pCmd)
3978{
3979 int rc;
3980 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3981 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamSourceRect, VERR_INVALID_STATE);
3982 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3983 AssertReturn(p3dState, VERR_INVALID_STATE);
3984
3985 PVMSVGA3DDXCONTEXT pDXContext;
3986 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3987 AssertRCReturn(rc, rc);
3988
3989 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
3990
3991 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
3992 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
3993 ASSERT_GUEST_RETURN(pCmd->streamIndex < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
3994 RT_UNTRUSTED_VALIDATED_FENCE();
3995
3996 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
3997 VBSVGA3dVideoProcessorStreamState *pStreamState = &pEntry->aStreamState[pCmd->streamIndex];
3998 pStreamState->SetMask |= VBSVGA3D_VP_SET_STREAM_SOURCE_RECT;
3999 pStreamState->SourceRectEnable = RT_BOOL(pCmd->enable);
4000 pStreamState->SourceRect = pCmd->sourceRect;
4001
4002 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamSourceRect(pThisCC, pDXContext, videoProcessorId,
4003 pCmd->streamIndex, pCmd->enable, pCmd->sourceRect);
4004 return rc;
4005}
4006
4007
4008int vmsvga3dVBDXVideoProcessorSetStreamDestRect(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetStreamDestRect const *pCmd)
4009{
4010 int rc;
4011 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4012 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamDestRect, VERR_INVALID_STATE);
4013 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4014 AssertReturn(p3dState, VERR_INVALID_STATE);
4015
4016 PVMSVGA3DDXCONTEXT pDXContext;
4017 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4018 AssertRCReturn(rc, rc);
4019
4020 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
4021
4022 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
4023 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
4024 ASSERT_GUEST_RETURN(pCmd->streamIndex < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
4025 RT_UNTRUSTED_VALIDATED_FENCE();
4026
4027 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
4028 VBSVGA3dVideoProcessorStreamState *pStreamState = &pEntry->aStreamState[pCmd->streamIndex];
4029 pStreamState->SetMask |= VBSVGA3D_VP_SET_STREAM_DEST_RECT;
4030 pStreamState->DestRectEnable = RT_BOOL(pCmd->enable);
4031 pStreamState->DestRect = pCmd->destRect;
4032
4033 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamDestRect(pThisCC, pDXContext, videoProcessorId,
4034 pCmd->streamIndex, pCmd->enable, pCmd->destRect);
4035 return rc;
4036}
4037
4038
4039int vmsvga3dVBDXVideoProcessorSetStreamAlpha(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetStreamAlpha const *pCmd)
4040{
4041 int rc;
4042 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4043 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamAlpha, VERR_INVALID_STATE);
4044 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4045 AssertReturn(p3dState, VERR_INVALID_STATE);
4046
4047 PVMSVGA3DDXCONTEXT pDXContext;
4048 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4049 AssertRCReturn(rc, rc);
4050
4051 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
4052
4053 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
4054 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
4055 ASSERT_GUEST_RETURN(pCmd->streamIndex < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
4056 RT_UNTRUSTED_VALIDATED_FENCE();
4057
4058 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
4059 VBSVGA3dVideoProcessorStreamState *pStreamState = &pEntry->aStreamState[pCmd->streamIndex];
4060 pStreamState->SetMask |= VBSVGA3D_VP_SET_STREAM_ALPHA;
4061 pStreamState->AlphaEnable = RT_BOOL(pCmd->enable);
4062 pStreamState->Alpha = pCmd->alpha;
4063
4064 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamAlpha(pThisCC, pDXContext, videoProcessorId,
4065 pCmd->streamIndex, pCmd->enable, pCmd->alpha);
4066 return rc;
4067}
4068
4069
4070int vmsvga3dVBDXVideoProcessorSetStreamPalette(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetStreamPalette const *pCmd, uint32_t cEntries, uint32_t const *paEntries)
4071{
4072 int rc;
4073 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4074 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamPalette, VERR_INVALID_STATE);
4075 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4076 AssertReturn(p3dState, VERR_INVALID_STATE);
4077
4078 PVMSVGA3DDXCONTEXT pDXContext;
4079 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4080 AssertRCReturn(rc, rc);
4081
4082 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
4083
4084 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
4085 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
4086 ASSERT_GUEST_RETURN(cEntries <= VBSVGA3D_MAX_VIDEO_PALETTE_ENTRIES, VERR_INVALID_PARAMETER);
4087 ASSERT_GUEST_RETURN(pCmd->streamIndex < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
4088 RT_UNTRUSTED_VALIDATED_FENCE();
4089
4090 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
4091 VBSVGA3dVideoProcessorStreamState *pStreamState = &pEntry->aStreamState[pCmd->streamIndex];
4092 pStreamState->SetMask |= VBSVGA3D_VP_SET_STREAM_PALETTE;
4093 pStreamState->PaletteCount = cEntries;
4094 memcpy(pStreamState->aPalette, paEntries, cEntries * sizeof(paEntries[0]));
4095
4096 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamPalette(pThisCC, pDXContext, videoProcessorId,
4097 pCmd->streamIndex, cEntries, paEntries);
4098 return rc;
4099}
4100
4101
4102int vmsvga3dVBDXVideoProcessorSetStreamPixelAspectRatio(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetStreamPixelAspectRatio const *pCmd)
4103{
4104 int rc;
4105 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4106 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamPixelAspectRatio, VERR_INVALID_STATE);
4107 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4108 AssertReturn(p3dState, VERR_INVALID_STATE);
4109
4110 PVMSVGA3DDXCONTEXT pDXContext;
4111 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4112 AssertRCReturn(rc, rc);
4113
4114 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
4115
4116 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
4117 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
4118 ASSERT_GUEST_RETURN(pCmd->streamIndex < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
4119 RT_UNTRUSTED_VALIDATED_FENCE();
4120
4121 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
4122 VBSVGA3dVideoProcessorStreamState *pStreamState = &pEntry->aStreamState[pCmd->streamIndex];
4123 pStreamState->SetMask |= VBSVGA3D_VP_SET_STREAM_ASPECT_RATIO;
4124 pStreamState->AspectRatioEnable = RT_BOOL(pCmd->enable);
4125 pStreamState->AspectSourceRatio = pCmd->sourceRatio;
4126 pStreamState->AspectDestRatio = pCmd->destRatio;
4127
4128 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamPixelAspectRatio(pThisCC, pDXContext, videoProcessorId,
4129 pCmd->streamIndex, pCmd->enable, pCmd->sourceRatio, pCmd->destRatio);
4130 return rc;
4131}
4132
4133
4134int vmsvga3dVBDXVideoProcessorSetStreamLumaKey(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetStreamLumaKey const *pCmd)
4135{
4136 int rc;
4137 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4138 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamLumaKey, VERR_INVALID_STATE);
4139 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4140 AssertReturn(p3dState, VERR_INVALID_STATE);
4141
4142 PVMSVGA3DDXCONTEXT pDXContext;
4143 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4144 AssertRCReturn(rc, rc);
4145
4146 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
4147
4148 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
4149 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
4150 ASSERT_GUEST_RETURN(pCmd->streamIndex < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
4151 RT_UNTRUSTED_VALIDATED_FENCE();
4152
4153 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
4154 VBSVGA3dVideoProcessorStreamState *pStreamState = &pEntry->aStreamState[pCmd->streamIndex];
4155 pStreamState->SetMask |= VBSVGA3D_VP_SET_STREAM_LUMA_KEY;
4156 pStreamState->LumaKeyEnable = RT_BOOL(pCmd->enable);
4157 pStreamState->LumaKeyLower = pCmd->lower;
4158 pStreamState->LumaKeyUpper = pCmd->upper;
4159
4160 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamLumaKey(pThisCC, pDXContext, videoProcessorId,
4161 pCmd->streamIndex, pCmd->enable, pCmd->lower, pCmd->upper);
4162 return rc;
4163}
4164
4165
4166int vmsvga3dVBDXVideoProcessorSetStreamStereoFormat(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetStreamStereoFormat const *pCmd)
4167{
4168 int rc;
4169 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4170 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamStereoFormat, VERR_INVALID_STATE);
4171 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4172 AssertReturn(p3dState, VERR_INVALID_STATE);
4173
4174 PVMSVGA3DDXCONTEXT pDXContext;
4175 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4176 AssertRCReturn(rc, rc);
4177
4178 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
4179
4180 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
4181 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
4182 ASSERT_GUEST_RETURN(pCmd->streamIndex < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
4183 RT_UNTRUSTED_VALIDATED_FENCE();
4184
4185 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
4186 VBSVGA3dVideoProcessorStreamState *pStreamState = &pEntry->aStreamState[pCmd->streamIndex];
4187 pStreamState->SetMask |= VBSVGA3D_VP_SET_STREAM_STEREO_FORMAT;
4188 pStreamState->StereoFormatEnable = RT_BOOL(pCmd->enable);
4189 pStreamState->StereoFormat = pCmd->stereoFormat;
4190 pStreamState->LeftViewFrame0 = pCmd->leftViewFrame0;
4191 pStreamState->BaseViewFrame0 = pCmd->baseViewFrame0;
4192 pStreamState->FlipMode = pCmd->flipMode;
4193 pStreamState->MonoOffset = pCmd->monoOffset;
4194
4195 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamStereoFormat(pThisCC, pDXContext, videoProcessorId,
4196 pCmd->streamIndex, pCmd->enable, pCmd->stereoFormat,
4197 pCmd->leftViewFrame0, pCmd->baseViewFrame0, pCmd->flipMode, pCmd->monoOffset);
4198 return rc;
4199}
4200
4201
4202int vmsvga3dVBDXVideoProcessorSetStreamAutoProcessingMode(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetStreamAutoProcessingMode const *pCmd)
4203{
4204 int rc;
4205 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4206 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamAutoProcessingMode, VERR_INVALID_STATE);
4207 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4208 AssertReturn(p3dState, VERR_INVALID_STATE);
4209
4210 PVMSVGA3DDXCONTEXT pDXContext;
4211 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4212 AssertRCReturn(rc, rc);
4213
4214 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
4215
4216 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
4217 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
4218 ASSERT_GUEST_RETURN(pCmd->streamIndex < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
4219 RT_UNTRUSTED_VALIDATED_FENCE();
4220
4221 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
4222 VBSVGA3dVideoProcessorStreamState *pStreamState = &pEntry->aStreamState[pCmd->streamIndex];
4223 pStreamState->SetMask |= VBSVGA3D_VP_SET_STREAM_AUTO_PROCESSING_MODE;
4224 pStreamState->AutoProcessingModeEnable = RT_BOOL(pCmd->enable);
4225
4226 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamAutoProcessingMode(pThisCC, pDXContext, videoProcessorId,
4227 pCmd->streamIndex, pCmd->enable);
4228 return rc;
4229}
4230
4231
4232int vmsvga3dVBDXVideoProcessorSetStreamFilter(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetStreamFilter const *pCmd)
4233{
4234 int rc;
4235 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4236 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamFilter, VERR_INVALID_STATE);
4237 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4238 AssertReturn(p3dState, VERR_INVALID_STATE);
4239
4240 PVMSVGA3DDXCONTEXT pDXContext;
4241 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4242 AssertRCReturn(rc, rc);
4243
4244 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
4245
4246 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
4247 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
4248 ASSERT_GUEST_RETURN(pCmd->streamIndex < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
4249 ASSERT_GUEST_RETURN(pCmd->filter < VBSVGA3D_VP_MAX_FILTER_COUNT, VERR_INVALID_PARAMETER);
4250 RT_UNTRUSTED_VALIDATED_FENCE();
4251
4252 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
4253 VBSVGA3dVideoProcessorStreamState *pStreamState = &pEntry->aStreamState[pCmd->streamIndex];
4254 pStreamState->SetMask |= VBSVGA3D_VP_SET_STREAM_FILTER;
4255 if (pCmd->enable)
4256 pStreamState->FilterEnableMask |= 1 << pCmd->filter;
4257 else
4258 pStreamState->FilterEnableMask &= ~(1 << pCmd->filter);
4259 pStreamState->aFilter[pCmd->filter].Level = pCmd->level;
4260
4261 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamFilter(pThisCC, pDXContext, videoProcessorId,
4262 pCmd->streamIndex, pCmd->enable, pCmd->filter, pCmd->level);
4263 return rc;
4264}
4265
4266
4267int vmsvga3dVBDXVideoProcessorSetStreamRotation(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXVideoProcessorSetStreamRotation const *pCmd)
4268{
4269 int rc;
4270 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4271 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamFilter, VERR_INVALID_STATE);
4272 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4273 AssertReturn(p3dState, VERR_INVALID_STATE);
4274
4275 PVMSVGA3DDXCONTEXT pDXContext;
4276 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4277 AssertRCReturn(rc, rc);
4278
4279 VBSVGA3dVideoProcessorId const videoProcessorId = pCmd->videoProcessorId;
4280
4281 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessor, VERR_INVALID_STATE);
4282 ASSERT_GUEST_RETURN(videoProcessorId < pDXContext->cot.cVideoProcessor, VERR_INVALID_PARAMETER);
4283 ASSERT_GUEST_RETURN(pCmd->streamIndex < VBSVGA3D_MAX_VIDEO_STREAMS, VERR_INVALID_PARAMETER);
4284 RT_UNTRUSTED_VALIDATED_FENCE();
4285
4286 VBSVGACOTableDXVideoProcessorEntry *pEntry = &pDXContext->cot.paVideoProcessor[videoProcessorId];
4287 VBSVGA3dVideoProcessorStreamState *pStreamState = &pEntry->aStreamState[pCmd->streamIndex];
4288 pStreamState->SetMask |= VBSVGA3D_VP_SET_STREAM_ROTATION;
4289 pStreamState->RotationEnable = RT_BOOL(pCmd->enable);
4290 pStreamState->Rotation = pCmd->rotation;
4291
4292 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXVideoProcessorSetStreamRotation(pThisCC, pDXContext, videoProcessorId,
4293 pCmd->streamIndex, pCmd->enable, pCmd->rotation);
4294 return rc;
4295}
4296
4297
4298int vmsvga3dVBDXGetVideoCapability(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXGetVideoCapability const *pCmd)
4299{
4300 int rc;
4301 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4302 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXGetVideoCapability, VERR_INVALID_STATE);
4303 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4304 AssertReturn(p3dState, VERR_INVALID_STATE);
4305
4306 PVMSVGA3DDXCONTEXT pDXContext;
4307 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4308 AssertRCReturn(rc, rc);
4309
4310 PVMSVGAMOB pMob = vmsvgaR3MobGet(pSvgaR3State, pCmd->mobid);
4311 ASSERT_GUEST_RETURN(pMob, VERR_INVALID_PARAMETER);
4312
4313 uint32_t const cbMob = vmsvgaR3MobSize(pMob);
4314 ASSERT_GUEST_RETURN( pCmd->offsetInBytes < cbMob
4315 && pCmd->sizeInBytes <= cbMob - pCmd->offsetInBytes, VERR_INVALID_PARAMETER);
4316
4317 ASSERT_GUEST_RETURN(pCmd->sizeInBytes >= RT_UOFFSETOF(VBSVGA3dVideoCapabilityMobLayout, data), VERR_INVALID_PARAMETER);
4318 RT_UNTRUSTED_VALIDATED_FENCE();
4319
4320 /* Create a memory pointer for the MOB, which is accessible by host. */
4321 rc = vmsvgaR3MobBackingStoreCreate(pSvgaR3State, pMob, cbMob);
4322 AssertReturn(RT_SUCCESS(rc), rc);
4323
4324 /* Get pointer to the data. This will also verify the offset. */
4325 VBSVGA3dVideoCapabilityMobLayout *pCap = (VBSVGA3dVideoCapabilityMobLayout *)vmsvgaR3MobBackingStorePtr(pMob, pCmd->offsetInBytes);
4326 AssertReturnStmt(pCap, vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pMob), VERR_INTERNAL_ERROR);
4327
4328 pCap->cbDataOut = 0;
4329 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXGetVideoCapability(pThisCC, pDXContext, pCmd->capability, &pCap->data,
4330 pCmd->sizeInBytes - RT_UOFFSETOF(VBSVGA3dVideoCapabilityMobLayout, data),
4331 &pCap->cbDataOut);
4332
4333 pCap->fenceValue = pCmd->fenceValue;
4334 if (RT_SUCCESS(rc))
4335 vmsvgaR3MobBackingStoreWriteToGuest(pSvgaR3State, pMob);
4336
4337 vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pMob);
4338 return rc;
4339}
4340
4341
4342int vmsvga3dVBDXClearRTV(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXClearView const *pCmd, uint32_t cRect, SVGASignedRect const *paRect)
4343{
4344 int rc;
4345 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4346 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnVBDXClearRenderTargetViewRegion, VERR_INVALID_STATE);
4347 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4348 AssertReturn(p3dState, VERR_INVALID_STATE);
4349
4350 PVMSVGA3DDXCONTEXT pDXContext;
4351 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4352 AssertRCReturn(rc, rc);
4353
4354 SVGA3dRenderTargetViewId const renderTargetViewId = pCmd->viewId;
4355
4356 ASSERT_GUEST_RETURN(pDXContext->cot.paRTView, VERR_INVALID_STATE);
4357 ASSERT_GUEST_RETURN(renderTargetViewId < pDXContext->cot.cRTView, VERR_INVALID_PARAMETER);
4358 ASSERT_GUEST_RETURN(cRect <= 65536, VERR_INVALID_PARAMETER); /* Arbitrary limit. */
4359 RT_UNTRUSTED_VALIDATED_FENCE();
4360
4361 rc = pSvgaR3State->pFuncsDX->pfnVBDXClearRenderTargetViewRegion(pThisCC, pDXContext, renderTargetViewId, &pCmd->color, cRect, paRect);
4362 return rc;
4363}
4364
4365
4366int vmsvga3dVBDXClearUAV(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXClearView const *pCmd, uint32_t cRect, SVGASignedRect const *paRect)
4367{
4368 int rc;
4369 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4370 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnVBDXClearUAV, VERR_INVALID_STATE);
4371 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4372 AssertReturn(p3dState, VERR_INVALID_STATE);
4373
4374 PVMSVGA3DDXCONTEXT pDXContext;
4375 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4376 AssertRCReturn(rc, rc);
4377
4378 SVGA3dUAViewId const viewId = pCmd->viewId;
4379
4380 ASSERT_GUEST_RETURN(pDXContext->cot.paUAView, VERR_INVALID_STATE);
4381 ASSERT_GUEST_RETURN(viewId < pDXContext->cot.cUAView, VERR_INVALID_PARAMETER);
4382 ASSERT_GUEST_RETURN(cRect <= 65536, VERR_INVALID_PARAMETER); /* Arbitrary limit. */
4383 RT_UNTRUSTED_VALIDATED_FENCE();
4384
4385 rc = pSvgaR3State->pFuncsDX->pfnVBDXClearUAV(pThisCC, pDXContext, viewId, &pCmd->color, cRect, paRect);
4386 return rc;
4387}
4388
4389
4390int vmsvga3dVBDXClearVDOV(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXClearView const *pCmd, uint32_t cRect, SVGASignedRect const *paRect)
4391{
4392 int rc;
4393 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4394 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXClearVDOV, VERR_INVALID_STATE);
4395 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4396 AssertReturn(p3dState, VERR_INVALID_STATE);
4397
4398 PVMSVGA3DDXCONTEXT pDXContext;
4399 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4400 AssertRCReturn(rc, rc);
4401
4402 VBSVGA3dVideoDecoderOutputViewId const viewId = pCmd->viewId;
4403
4404 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoDecoderOutputView, VERR_INVALID_STATE);
4405 ASSERT_GUEST_RETURN(viewId < pDXContext->cot.cVideoDecoderOutputView, VERR_INVALID_PARAMETER);
4406 ASSERT_GUEST_RETURN(cRect <= 65536, VERR_INVALID_PARAMETER); /* Arbitrary limit. */
4407 RT_UNTRUSTED_VALIDATED_FENCE();
4408
4409 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXClearVDOV(pThisCC, pDXContext, viewId, &pCmd->color, cRect, paRect);
4410 return rc;
4411}
4412
4413
4414int vmsvga3dVBDXClearVPIV(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXClearView const *pCmd, uint32_t cRect, SVGASignedRect const *paRect)
4415{
4416 int rc;
4417 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4418 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXClearVPIV, VERR_INVALID_STATE);
4419 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4420 AssertReturn(p3dState, VERR_INVALID_STATE);
4421
4422 PVMSVGA3DDXCONTEXT pDXContext;
4423 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4424 AssertRCReturn(rc, rc);
4425
4426 VBSVGA3dVideoProcessorInputViewId const viewId = pCmd->viewId;
4427
4428 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessorInputView, VERR_INVALID_STATE);
4429 ASSERT_GUEST_RETURN(viewId < pDXContext->cot.cVideoProcessorInputView, VERR_INVALID_PARAMETER);
4430 ASSERT_GUEST_RETURN(cRect <= 65536, VERR_INVALID_PARAMETER); /* Arbitrary limit. */
4431 RT_UNTRUSTED_VALIDATED_FENCE();
4432
4433 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXClearVPIV(pThisCC, pDXContext, viewId, &pCmd->color, cRect, paRect);
4434 return rc;
4435}
4436
4437
4438int vmsvga3dVBDXClearVPOV(PVGASTATECC pThisCC, uint32_t idDXContext, VBSVGA3dCmdDXClearView const *pCmd, uint32_t cRect, SVGASignedRect const *paRect)
4439{
4440 int rc;
4441 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
4442 AssertReturn(pSvgaR3State->pFuncsDXVideo && pSvgaR3State->pFuncsDXVideo->pfnVBDXClearVPOV, VERR_INVALID_STATE);
4443 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
4444 AssertReturn(p3dState, VERR_INVALID_STATE);
4445
4446 PVMSVGA3DDXCONTEXT pDXContext;
4447 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
4448 AssertRCReturn(rc, rc);
4449
4450 VBSVGA3dVideoProcessorOutputViewId const viewId = pCmd->viewId;
4451
4452 ASSERT_GUEST_RETURN(pDXContext->cot.paVideoProcessorOutputView, VERR_INVALID_STATE);
4453 ASSERT_GUEST_RETURN(viewId < pDXContext->cot.cVideoProcessorOutputView, VERR_INVALID_PARAMETER);
4454 ASSERT_GUEST_RETURN(cRect <= 65536, VERR_INVALID_PARAMETER); /* Arbitrary limit. */
4455 RT_UNTRUSTED_VALIDATED_FENCE();
4456
4457 rc = pSvgaR3State->pFuncsDXVideo->pfnVBDXClearVPOV(pThisCC, pDXContext, viewId, &pCmd->color, cRect, paRect);
4458 return rc;
4459}
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette