VirtualBox

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

最後變更 在這個檔案從94113是 94113,由 vboxsync 提交於 3 年 前

Devices/Graphics: single device mode: bugref:9830

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Author Date Id Revision
檔案大小: 121.6 KB
 
1/* $Id: DevVGA-SVGA3d-dx.cpp 94113 2022-03-07 15:19:29Z vboxsync $ */
2/** @file
3 * DevSVGA3d - VMWare SVGA device, 3D parts - Common code for DX backend interface.
4 */
5
6/*
7 * Copyright (C) 2020-2022 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.alldomusa.eu.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19/*********************************************************************************************************************************
20* Header Files *
21*********************************************************************************************************************************/
22#define LOG_GROUP LOG_GROUP_DEV_VMSVGA
23#include <VBox/AssertGuest.h>
24#include <iprt/errcore.h>
25#include <VBox/log.h>
26#include <VBox/vmm/pdmdev.h>
27
28#include <iprt/assert.h>
29#include <iprt/mem.h>
30
31#include <VBoxVideo.h> /* required by DevVGA.h */
32
33/* should go BEFORE any other DevVGA include to make all DevVGA.h config defines be visible */
34#include "DevVGA.h"
35
36#include "DevVGA-SVGA.h"
37#include "DevVGA-SVGA3d.h"
38#include "DevVGA-SVGA3d-internal.h"
39#include "DevVGA-SVGA-internal.h"
40
41
42/*
43 *
44 * 3D backend entry points. These functions are used from vmsvga3dDXSwitchContext and command handlers.
45 *
46 */
47
48static int dxSetShader(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext,
49 SVGA3dShaderType shaderType, SVGA3dShaderId shaderId)
50{
51 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
52
53 PVMSVGA3DSHADER pShader;
54 if (shaderId != SVGA_ID_INVALID)
55 {
56 SVGACOTableDXShaderEntry *pEntry = &pDXContext->cot.paShader[shaderId];
57 ASSERT_GUEST_RETURN(pEntry->type == shaderType, VERR_INVALID_PARAMETER);
58 RT_UNTRUSTED_VALIDATED_FENCE();
59
60 pShader = &pDXContext->paShader[shaderId];
61 }
62 else
63 pShader = NULL;
64
65 return pSvgaR3State->pFuncsDX->pfnDXSetShader(pThisCC, pDXContext, shaderType, pShader);
66}
67
68
69/*
70 *
71 * Command handlers.
72 *
73 */
74
75int vmsvga3dDXUnbindContext(PVGASTATECC pThisCC, uint32_t cid, SVGADXContextMobFormat *pSvgaDXContext)
76{
77 int rc;
78 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
79 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindContext, VERR_INVALID_STATE);
80 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
81 AssertReturn(p3dState, VERR_INVALID_STATE);
82
83 PVMSVGA3DDXCONTEXT pDXContext;
84 rc = vmsvga3dDXContextFromCid(p3dState, cid, &pDXContext);
85 AssertRCReturn(rc, rc);
86
87 /* Copy the host structure back to the guest memory. */
88 memcpy(pSvgaDXContext, &pDXContext->svgaDXContext, sizeof(*pSvgaDXContext));
89
90 return rc;
91}
92
93
94int vmsvga3dDXSwitchContext(PVGASTATECC pThisCC, uint32_t cid)
95{
96 int rc;
97 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
98 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSwitchContext, VERR_INVALID_STATE);
99 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
100 AssertReturn(p3dState, VERR_INVALID_STATE);
101
102 PVMSVGA3DDXCONTEXT pDXContext;
103 rc = vmsvga3dDXContextFromCid(p3dState, cid, &pDXContext);
104 AssertRCReturn(rc, rc);
105
106 /* Notify the host backend that context is about to be switched. */
107 rc = pSvgaR3State->pFuncsDX->pfnDXSwitchContext(pThisCC, pDXContext);
108 if (rc == VINF_NOT_IMPLEMENTED || RT_FAILURE(rc))
109 return rc;
110
111 /** @todo Keep track of changes in the pipeline and apply only modified state. */
112 /* It is not necessary to restore SVGADXContextMobFormat::shaderState::shaderResources
113 * because they are applied by the backend before each Draw call.
114 */
115 #define DX_STATE_VS 0x00000001
116 #define DX_STATE_PS 0x00000002
117 #define DX_STATE_SAMPLERS 0x00000004
118 #define DX_STATE_INPUTLAYOUT 0x00000008
119 #define DX_STATE_TOPOLOGY 0x00000010
120 #define DX_STATE_VERTEXBUFFER 0x00000020
121 #define DX_STATE_INDEXBUFFER 0x00000040
122 #define DX_STATE_BLENDSTATE 0x00000080
123 #define DX_STATE_DEPTHSTENCILSTATE 0x00000100
124 #define DX_STATE_SOTARGETS 0x00000200
125 #define DX_STATE_VIEWPORTS 0x00000400
126 #define DX_STATE_SCISSORRECTS 0x00000800
127 #define DX_STATE_RASTERIZERSTATE 0x00001000
128 #define DX_STATE_RENDERTARGETS 0x00002000
129 #define DX_STATE_GS 0x00004000
130 #define DX_STATE_CONSTANTBUFFERS 0x00008000
131 uint32_t u32TrackedState = 0
132 | DX_STATE_VS
133 | DX_STATE_PS
134 | DX_STATE_SAMPLERS
135 | DX_STATE_INPUTLAYOUT
136 | DX_STATE_TOPOLOGY
137 | DX_STATE_VERTEXBUFFER
138 | DX_STATE_INDEXBUFFER
139 | DX_STATE_BLENDSTATE
140 | DX_STATE_DEPTHSTENCILSTATE
141 | DX_STATE_SOTARGETS
142 | DX_STATE_VIEWPORTS
143 | DX_STATE_SCISSORRECTS
144 | DX_STATE_RASTERIZERSTATE
145 | DX_STATE_RENDERTARGETS
146 | DX_STATE_GS
147 | DX_STATE_CONSTANTBUFFERS
148 ;
149
150
151 if (u32TrackedState & DX_STATE_VS)
152 {
153 u32TrackedState &= ~DX_STATE_VS;
154
155 SVGA3dShaderType const shaderType = SVGA3D_SHADERTYPE_VS;
156
157 uint32_t const idxShaderState = shaderType - SVGA3D_SHADERTYPE_MIN;
158 SVGA3dShaderId shaderId = pDXContext->svgaDXContext.shaderState[idxShaderState].shaderId;
159
160 rc = dxSetShader(pThisCC, pDXContext, shaderType, shaderId);
161 AssertRC(rc);
162 }
163
164
165 if (u32TrackedState & DX_STATE_PS)
166 {
167 u32TrackedState &= ~DX_STATE_PS;
168
169 SVGA3dShaderType const shaderType = SVGA3D_SHADERTYPE_PS;
170
171 uint32_t const idxShaderState = shaderType - SVGA3D_SHADERTYPE_MIN;
172 SVGA3dShaderId shaderId = pDXContext->svgaDXContext.shaderState[idxShaderState].shaderId;
173
174 rc = dxSetShader(pThisCC, pDXContext, shaderType, shaderId);
175 AssertRC(rc);
176 }
177
178
179 if (u32TrackedState & DX_STATE_GS)
180 {
181 u32TrackedState &= ~DX_STATE_GS;
182
183 SVGA3dShaderType const shaderType = SVGA3D_SHADERTYPE_GS;
184
185 uint32_t const idxShaderState = shaderType - SVGA3D_SHADERTYPE_MIN;
186 SVGA3dShaderId shaderId = pDXContext->svgaDXContext.shaderState[idxShaderState].shaderId;
187
188 rc = dxSetShader(pThisCC, pDXContext, shaderType, shaderId);
189 AssertRC(rc);
190 }
191
192
193 if (u32TrackedState & DX_STATE_SAMPLERS)
194 {
195 u32TrackedState &= ~DX_STATE_SAMPLERS;
196
197 for (int i = SVGA3D_SHADERTYPE_MIN; i < SVGA3D_SHADERTYPE_DX10_MAX; ++i) /** @todo SVGA3D_SHADERTYPE_MAX */
198 {
199 SVGA3dShaderType const shaderType = (SVGA3dShaderType)i;
200 uint32_t const idxShaderState = shaderType - SVGA3D_SHADERTYPE_MIN;
201
202 uint32_t startSampler = 0;
203 uint32_t cSamplerId = SVGA3D_DX_MAX_SAMPLERS;
204 SVGA3dSamplerId *paSamplerId = &pDXContext->svgaDXContext.shaderState[idxShaderState].samplers[0];
205
206 rc = pSvgaR3State->pFuncsDX->pfnDXSetSamplers(pThisCC, pDXContext, startSampler, shaderType, cSamplerId, paSamplerId);
207 AssertRC(rc);
208 }
209 }
210
211
212 if (u32TrackedState & DX_STATE_INPUTLAYOUT)
213 {
214 u32TrackedState &= ~DX_STATE_INPUTLAYOUT;
215
216 SVGA3dElementLayoutId const elementLayoutId = pDXContext->svgaDXContext.inputAssembly.layoutId;
217
218 rc = pSvgaR3State->pFuncsDX->pfnDXSetInputLayout(pThisCC, pDXContext, elementLayoutId);
219 AssertRC(rc);
220 }
221
222
223 if (u32TrackedState & DX_STATE_TOPOLOGY)
224 {
225 u32TrackedState &= ~DX_STATE_TOPOLOGY;
226
227 SVGA3dPrimitiveType const topology = (SVGA3dPrimitiveType)pDXContext->svgaDXContext.inputAssembly.topology;
228
229 if (topology != SVGA3D_PRIMITIVE_INVALID)
230 rc = pSvgaR3State->pFuncsDX->pfnDXSetTopology(pThisCC, pDXContext, topology);
231 AssertRC(rc);
232 }
233
234
235 if (u32TrackedState & DX_STATE_VERTEXBUFFER)
236 {
237 u32TrackedState &= ~DX_STATE_VERTEXBUFFER;
238
239 /** @todo Track which vertex buffers were modified and update only the corresponding slots.
240 * 32 bits mask is enough.
241 */
242 uint32_t startBuffer = 0;
243 uint32_t cVertexBuffer = SVGA3D_DX_MAX_VERTEXBUFFERS;
244 SVGA3dVertexBuffer aVertexBuffer[SVGA3D_DX_MAX_VERTEXBUFFERS];
245 for (uint32_t i = 0; i < SVGA3D_DX_MAX_VERTEXBUFFERS; ++i)
246 {
247 aVertexBuffer[i].sid = pDXContext->svgaDXContext.inputAssembly.vertexBuffers[i].bufferId;
248 aVertexBuffer[i].stride = pDXContext->svgaDXContext.inputAssembly.vertexBuffers[i].stride;
249 aVertexBuffer[i].offset = pDXContext->svgaDXContext.inputAssembly.vertexBuffers[i].offset;
250 }
251
252 rc = pSvgaR3State->pFuncsDX->pfnDXSetVertexBuffers(pThisCC, pDXContext, startBuffer, cVertexBuffer, aVertexBuffer);
253 AssertRC(rc);
254 }
255
256
257 if (u32TrackedState & DX_STATE_INDEXBUFFER)
258 {
259 u32TrackedState &= ~DX_STATE_INDEXBUFFER;
260
261 SVGA3dSurfaceId const sid = pDXContext->svgaDXContext.inputAssembly.indexBufferSid;
262 SVGA3dSurfaceFormat const format = (SVGA3dSurfaceFormat)pDXContext->svgaDXContext.inputAssembly.indexBufferFormat;
263 uint32_t const offset = pDXContext->svgaDXContext.inputAssembly.indexBufferOffset;
264
265 rc = pSvgaR3State->pFuncsDX->pfnDXSetIndexBuffer(pThisCC, pDXContext, sid, format, offset);
266 AssertRC(rc);
267 }
268
269
270 if (u32TrackedState & DX_STATE_BLENDSTATE)
271 {
272 u32TrackedState &= ~DX_STATE_BLENDSTATE;
273
274 SVGA3dBlendStateId const blendId = pDXContext->svgaDXContext.renderState.blendStateId;
275 /* SVGADXContextMobFormat uses uint32_t array to store the blend factors, however they are in fact 32 bit floats. */
276 float const *paBlendFactor = (float *)&pDXContext->svgaDXContext.renderState.blendFactor[0];
277 uint32_t const sampleMask = pDXContext->svgaDXContext.renderState.sampleMask;
278
279 rc = pSvgaR3State->pFuncsDX->pfnDXSetBlendState(pThisCC, pDXContext, blendId, paBlendFactor, sampleMask);
280 AssertRC(rc);
281 }
282
283
284 if (u32TrackedState & DX_STATE_DEPTHSTENCILSTATE)
285 {
286 u32TrackedState &= ~DX_STATE_DEPTHSTENCILSTATE;
287
288 SVGA3dDepthStencilStateId const depthStencilId = pDXContext->svgaDXContext.renderState.depthStencilStateId;
289 uint32_t const stencilRef = pDXContext->svgaDXContext.renderState.stencilRef;
290
291 rc = pSvgaR3State->pFuncsDX->pfnDXSetDepthStencilState(pThisCC, pDXContext, depthStencilId, stencilRef);
292 AssertRC(rc);
293 }
294
295
296 if (u32TrackedState & DX_STATE_SOTARGETS)
297 {
298 u32TrackedState &= ~DX_STATE_SOTARGETS;
299
300 uint32_t cSoTarget = SVGA3D_DX_MAX_SOTARGETS;
301 SVGA3dSoTarget aSoTarget[SVGA3D_DX_MAX_SOTARGETS];
302 for (uint32_t i = 0; i < SVGA3D_DX_MAX_SOTARGETS; ++i)
303 {
304 aSoTarget[i].sid = pDXContext->svgaDXContext.streamOut.targets[i];
305 /** @todo Offset is not stored in svgaDXContext. Should it be stored elsewhere by the host? */
306 aSoTarget[i].offset = 0;
307 aSoTarget[i].sizeInBytes = 0;
308 }
309
310 rc = pSvgaR3State->pFuncsDX->pfnDXSetSOTargets(pThisCC, pDXContext, cSoTarget, aSoTarget);
311 AssertRC(rc);
312 }
313
314
315 if (u32TrackedState & DX_STATE_VIEWPORTS)
316 {
317 u32TrackedState &= ~DX_STATE_VIEWPORTS;
318
319 uint32_t const cViewport = pDXContext->svgaDXContext.numViewports;
320 SVGA3dViewport const *paViewport = &pDXContext->svgaDXContext.viewports[0];
321
322 rc = pSvgaR3State->pFuncsDX->pfnDXSetViewports(pThisCC, pDXContext, cViewport, paViewport);
323 AssertRC(rc);
324 }
325
326
327 if (u32TrackedState & DX_STATE_SCISSORRECTS)
328 {
329 u32TrackedState &= ~DX_STATE_SCISSORRECTS;
330
331 uint32_t const cRect = pDXContext->svgaDXContext.numScissorRects;
332 SVGASignedRect const *paRect = &pDXContext->svgaDXContext.scissorRects[0];
333
334 rc = pSvgaR3State->pFuncsDX->pfnDXSetScissorRects(pThisCC, pDXContext, cRect, paRect);
335 AssertRC(rc);
336 }
337
338
339 if (u32TrackedState & DX_STATE_RASTERIZERSTATE)
340 {
341 u32TrackedState &= ~DX_STATE_RASTERIZERSTATE;
342
343 SVGA3dRasterizerStateId const rasterizerId = pDXContext->svgaDXContext.renderState.rasterizerStateId;
344
345 rc = pSvgaR3State->pFuncsDX->pfnDXSetRasterizerState(pThisCC, pDXContext, rasterizerId);
346 AssertRC(rc);
347 }
348
349
350 if (u32TrackedState & DX_STATE_RENDERTARGETS)
351 {
352 u32TrackedState &= ~DX_STATE_RENDERTARGETS;
353
354 SVGA3dDepthStencilViewId const depthStencilViewId = (SVGA3dRenderTargetViewId)pDXContext->svgaDXContext.renderState.depthStencilViewId;
355 uint32_t const cRenderTargetViewId = SVGA3D_MAX_SIMULTANEOUS_RENDER_TARGETS;
356 SVGA3dRenderTargetViewId const *paRenderTargetViewId = (SVGA3dRenderTargetViewId *)&pDXContext->svgaDXContext.renderState.renderTargetViewIds[0];
357
358 rc = pSvgaR3State->pFuncsDX->pfnDXSetRenderTargets(pThisCC, pDXContext, depthStencilViewId, cRenderTargetViewId, paRenderTargetViewId);
359 AssertRC(rc);
360 }
361
362
363 if (u32TrackedState & DX_STATE_CONSTANTBUFFERS)
364 {
365 u32TrackedState &= ~DX_STATE_CONSTANTBUFFERS;
366
367 for (int i = SVGA3D_SHADERTYPE_MIN; i < SVGA3D_SHADERTYPE_DX10_MAX; ++i) /** @todo SVGA3D_SHADERTYPE_MAX */
368 {
369 SVGA3dShaderType const shaderType = (SVGA3dShaderType)i;
370 uint32_t const idxShaderState = shaderType - SVGA3D_SHADERTYPE_MIN;
371
372 /** @todo Track which constant buffers were modified and update only the corresponding slots.
373 * 32 bit mask is enough.
374 */
375 for (int iSlot = 0; iSlot < SVGA3D_DX_MAX_CONSTBUFFERS; ++iSlot)
376 {
377 SVGA3dConstantBufferBinding *pCBB = &pDXContext->svgaDXContext.shaderState[idxShaderState].constantBuffers[iSlot];
378 if (pCBB->sid == SVGA3D_INVALID_ID) // This will not be necessary when constant buffers slots will be tracked.
379 continue;
380
381 rc = pSvgaR3State->pFuncsDX->pfnDXSetSingleConstantBuffer(pThisCC, pDXContext, iSlot, shaderType, pCBB->sid, pCBB->offsetInBytes, pCBB->sizeInBytes);
382 AssertRC(rc);
383 }
384 }
385 }
386
387 Assert(u32TrackedState == 0);
388
389 return rc;
390}
391
392
393/**
394 * Create a new 3D DX context.
395 *
396 * @returns VBox status code.
397 * @param pThisCC The VGA/VMSVGA state for ring-3.
398 * @param cid Context id to be created.
399 */
400int vmsvga3dDXDefineContext(PVGASTATECC pThisCC, uint32_t cid)
401{
402 int rc;
403 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
404 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineContext, VERR_INVALID_STATE);
405 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
406 AssertReturn(p3dState, VERR_INVALID_STATE);
407
408 PVMSVGA3DDXCONTEXT pDXContext;
409
410 LogFunc(("cid %d\n", cid));
411
412 AssertReturn(cid < SVGA3D_MAX_CONTEXT_IDS, VERR_INVALID_PARAMETER);
413
414 if (cid >= p3dState->cDXContexts)
415 {
416 /* Grow the array. */
417 uint32_t cNew = RT_ALIGN(cid + 15, 16);
418 void *pvNew = RTMemRealloc(p3dState->papDXContexts, sizeof(p3dState->papDXContexts[0]) * cNew);
419 AssertReturn(pvNew, VERR_NO_MEMORY);
420 p3dState->papDXContexts = (PVMSVGA3DDXCONTEXT *)pvNew;
421 while (p3dState->cDXContexts < cNew)
422 {
423 pDXContext = (PVMSVGA3DDXCONTEXT)RTMemAllocZ(sizeof(*pDXContext));
424 AssertReturn(pDXContext, VERR_NO_MEMORY);
425 pDXContext->cid = SVGA3D_INVALID_ID;
426 p3dState->papDXContexts[p3dState->cDXContexts++] = pDXContext;
427 }
428 }
429 /* If one already exists with this id, then destroy it now. */
430 if (p3dState->papDXContexts[cid]->cid != SVGA3D_INVALID_ID)
431 vmsvga3dDXDestroyContext(pThisCC, cid);
432
433 pDXContext = p3dState->papDXContexts[cid];
434 memset(pDXContext, 0, sizeof(*pDXContext));
435
436 /* 0xFFFFFFFF (SVGA_ID_INVALID) is a better initial value than 0 for most of svgaDXContext fields. */
437 memset(&pDXContext->svgaDXContext, 0xFF, sizeof(pDXContext->svgaDXContext));
438 pDXContext->svgaDXContext.inputAssembly.topology = SVGA3D_PRIMITIVE_INVALID;
439 pDXContext->svgaDXContext.numViewports = 0;
440 pDXContext->svgaDXContext.numScissorRects = 0;
441 pDXContext->cid = cid;
442
443 /* Init the backend specific data. */
444 rc = pSvgaR3State->pFuncsDX->pfnDXDefineContext(pThisCC, pDXContext);
445
446 /* Cleanup on failure. */
447 if (RT_FAILURE(rc))
448 vmsvga3dDXDestroyContext(pThisCC, cid);
449
450 return rc;
451}
452
453
454int vmsvga3dDXDestroyContext(PVGASTATECC pThisCC, uint32_t cid)
455{
456 int rc;
457 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
458 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyContext, VERR_INVALID_STATE);
459 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
460 AssertReturn(p3dState, VERR_INVALID_STATE);
461
462 PVMSVGA3DDXCONTEXT pDXContext;
463 rc = vmsvga3dDXContextFromCid(p3dState, cid, &pDXContext);
464 AssertRCReturn(rc, rc);
465
466 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyContext(pThisCC, pDXContext);
467 return rc;
468}
469
470
471int vmsvga3dDXBindContext(PVGASTATECC pThisCC, uint32_t cid, SVGADXContextMobFormat *pSvgaDXContext)
472{
473 int rc;
474 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
475 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindContext, VERR_INVALID_STATE);
476 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
477 AssertReturn(p3dState, VERR_INVALID_STATE);
478
479 PVMSVGA3DDXCONTEXT pDXContext;
480 rc = vmsvga3dDXContextFromCid(p3dState, cid, &pDXContext);
481 AssertRCReturn(rc, rc);
482
483 if (pSvgaDXContext)
484 memcpy(&pDXContext->svgaDXContext, pSvgaDXContext, sizeof(*pSvgaDXContext));
485
486 rc = pSvgaR3State->pFuncsDX->pfnDXBindContext(pThisCC, pDXContext);
487 return rc;
488}
489
490
491int vmsvga3dDXReadbackContext(PVGASTATECC pThisCC, uint32_t idDXContext, SVGADXContextMobFormat *pSvgaDXContext)
492{
493 int rc;
494 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
495 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXReadbackContext, VERR_INVALID_STATE);
496 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
497 AssertReturn(p3dState, VERR_INVALID_STATE);
498
499 PVMSVGA3DDXCONTEXT pDXContext;
500 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
501 AssertRCReturn(rc, rc);
502
503 rc = pSvgaR3State->pFuncsDX->pfnDXReadbackContext(pThisCC, pDXContext);
504 if (RT_SUCCESS(rc))
505 memcpy(pSvgaDXContext, &pDXContext->svgaDXContext, sizeof(*pSvgaDXContext));
506 return rc;
507}
508
509
510int vmsvga3dDXInvalidateContext(PVGASTATECC pThisCC, uint32_t idDXContext)
511{
512 int rc;
513 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
514 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXInvalidateContext, VERR_INVALID_STATE);
515 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
516 AssertReturn(p3dState, VERR_INVALID_STATE);
517
518 PVMSVGA3DDXCONTEXT pDXContext;
519 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
520 AssertRCReturn(rc, rc);
521
522 rc = pSvgaR3State->pFuncsDX->pfnDXInvalidateContext(pThisCC, pDXContext);
523 return rc;
524}
525
526
527int vmsvga3dDXSetSingleConstantBuffer(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetSingleConstantBuffer const *pCmd)
528{
529 int rc;
530 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
531 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetSingleConstantBuffer, VERR_INVALID_STATE);
532 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
533 AssertReturn(p3dState, VERR_INVALID_STATE);
534
535 PVMSVGA3DDXCONTEXT pDXContext;
536 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
537 AssertRCReturn(rc, rc);
538
539 ASSERT_GUEST_RETURN(pCmd->slot < SVGA3D_DX_MAX_CONSTBUFFERS, 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 SVGA3dConstantBufferBinding *pCBB = &pDXContext->svgaDXContext.shaderState[idxShaderState].constantBuffers[pCmd->slot];
545 pCBB->sid = pCmd->sid;
546 pCBB->offsetInBytes = pCmd->offsetInBytes;
547 pCBB->sizeInBytes = pCmd->sizeInBytes;
548
549 rc = pSvgaR3State->pFuncsDX->pfnDXSetSingleConstantBuffer(pThisCC, pDXContext, pCmd->slot, pCmd->type, pCmd->sid, pCmd->offsetInBytes, pCmd->sizeInBytes);
550 return rc;
551}
552
553
554int vmsvga3dDXSetShaderResources(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetShaderResources const *pCmd, uint32_t cShaderResourceViewId, SVGA3dShaderResourceViewId const *paShaderResourceViewId)
555{
556 int rc;
557 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
558 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetShaderResources, VERR_INVALID_STATE);
559 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
560 AssertReturn(p3dState, VERR_INVALID_STATE);
561
562 PVMSVGA3DDXCONTEXT pDXContext;
563 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
564 AssertRCReturn(rc, rc);
565
566 ASSERT_GUEST_RETURN(pCmd->startView < SVGA3D_DX_MAX_SRVIEWS, VERR_INVALID_PARAMETER);
567 ASSERT_GUEST_RETURN(cShaderResourceViewId <= SVGA3D_DX_MAX_SRVIEWS - pCmd->startView, VERR_INVALID_PARAMETER);
568 ASSERT_GUEST_RETURN(pCmd->type >= SVGA3D_SHADERTYPE_MIN && pCmd->type < SVGA3D_SHADERTYPE_MAX, VERR_INVALID_PARAMETER);
569 ASSERT_GUEST_RETURN(pDXContext->cot.paSRView, VERR_INVALID_STATE);
570 for (uint32_t i = 0; i < cShaderResourceViewId; ++i)
571 ASSERT_GUEST_RETURN( paShaderResourceViewId[i] < pDXContext->cot.cSRView
572 || paShaderResourceViewId[i] == SVGA3D_INVALID_ID, VERR_INVALID_PARAMETER);
573 RT_UNTRUSTED_VALIDATED_FENCE();
574
575 uint32_t const idxShaderState = pCmd->type - SVGA3D_SHADERTYPE_MIN;
576 for (uint32_t i = 0; i < cShaderResourceViewId; ++i)
577 {
578 SVGA3dShaderResourceViewId const shaderResourceViewId = paShaderResourceViewId[i];
579 pDXContext->svgaDXContext.shaderState[idxShaderState].shaderResources[pCmd->startView + i] = shaderResourceViewId;
580 }
581
582 rc = pSvgaR3State->pFuncsDX->pfnDXSetShaderResources(pThisCC, pDXContext, pCmd->startView, pCmd->type, cShaderResourceViewId, paShaderResourceViewId);
583 return rc;
584}
585
586
587int vmsvga3dDXSetShader(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetShader const *pCmd)
588{
589 int rc;
590 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
591 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetShader, VERR_INVALID_STATE);
592 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
593 AssertReturn(p3dState, VERR_INVALID_STATE);
594
595 PVMSVGA3DDXCONTEXT pDXContext;
596 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
597 AssertRCReturn(rc, rc);
598
599 ASSERT_GUEST_RETURN( pCmd->shaderId < pDXContext->cot.cShader
600 || pCmd->shaderId == SVGA_ID_INVALID, VERR_INVALID_PARAMETER);
601 ASSERT_GUEST_RETURN(pCmd->type >= SVGA3D_SHADERTYPE_MIN && pCmd->type < SVGA3D_SHADERTYPE_MAX, VERR_INVALID_PARAMETER);
602 RT_UNTRUSTED_VALIDATED_FENCE();
603
604 uint32_t const idxShaderState = pCmd->type - SVGA3D_SHADERTYPE_MIN;
605 pDXContext->svgaDXContext.shaderState[idxShaderState].shaderId = pCmd->shaderId;
606
607 rc = dxSetShader(pThisCC, pDXContext, pCmd->type, pCmd->shaderId);
608 return rc;
609}
610
611
612int vmsvga3dDXSetSamplers(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetSamplers const *pCmd, uint32_t cSamplerId, SVGA3dSamplerId const *paSamplerId)
613{
614 int rc;
615 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
616 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetSamplers, VERR_INVALID_STATE);
617 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
618 AssertReturn(p3dState, VERR_INVALID_STATE);
619
620 PVMSVGA3DDXCONTEXT pDXContext;
621 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
622 AssertRCReturn(rc, rc);
623
624 ASSERT_GUEST_RETURN(pCmd->startSampler < SVGA3D_DX_MAX_SAMPLERS, VERR_INVALID_PARAMETER);
625 ASSERT_GUEST_RETURN(cSamplerId <= SVGA3D_DX_MAX_SAMPLERS - pCmd->startSampler, VERR_INVALID_PARAMETER);
626 ASSERT_GUEST_RETURN(pCmd->type >= SVGA3D_SHADERTYPE_MIN && pCmd->type < SVGA3D_SHADERTYPE_MAX, VERR_INVALID_PARAMETER);
627 ASSERT_GUEST_RETURN(pDXContext->cot.paSampler, VERR_INVALID_STATE);
628 RT_UNTRUSTED_VALIDATED_FENCE();
629
630 uint32_t const idxShaderState = pCmd->type - SVGA3D_SHADERTYPE_MIN;
631 for (uint32_t i = 0; i < cSamplerId; ++i)
632 {
633 SVGA3dSamplerId const samplerId = paSamplerId[i];
634 ASSERT_GUEST_RETURN( samplerId < pDXContext->cot.cSampler
635 || samplerId == SVGA_ID_INVALID, VERR_INVALID_PARAMETER);
636 pDXContext->svgaDXContext.shaderState[idxShaderState].samplers[pCmd->startSampler + i] = samplerId;
637 }
638 RT_UNTRUSTED_VALIDATED_FENCE();
639
640 rc = pSvgaR3State->pFuncsDX->pfnDXSetSamplers(pThisCC, pDXContext, pCmd->startSampler, pCmd->type, cSamplerId, paSamplerId);
641 return rc;
642}
643
644
645int vmsvga3dDXDraw(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDraw const *pCmd)
646{
647 int rc;
648 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
649 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDraw, VERR_INVALID_STATE);
650 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
651 AssertReturn(p3dState, VERR_INVALID_STATE);
652
653 PVMSVGA3DDXCONTEXT pDXContext;
654 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
655 AssertRCReturn(rc, rc);
656
657 rc = pSvgaR3State->pFuncsDX->pfnDXDraw(pThisCC, pDXContext, pCmd->vertexCount, pCmd->startVertexLocation);
658#ifdef DUMP_BITMAPS
659 SVGACOTableDXRTViewEntry *pRTViewEntry = &pDXContext->cot.paRTView[pDXContext->svgaDXContext.renderState.renderTargetViewIds[0]];
660 SVGA3dSurfaceImageId image;
661 image.sid = pRTViewEntry->sid;
662 image.face = 0;
663 image.mipmap = 0;
664 VMSVGA3D_MAPPED_SURFACE map;
665 int rc2 = vmsvga3dSurfaceMap(pThisCC, &image, NULL, VMSVGA3D_SURFACE_MAP_READ, &map);
666 if (RT_SUCCESS(rc2))
667 {
668 vmsvga3dMapWriteBmpFile(&map, "rt-");
669 vmsvga3dSurfaceUnmap(pThisCC, &image, &map, /* fWritten = */ false);
670 }
671#endif
672 return rc;
673}
674
675
676int vmsvga3dDXDrawIndexed(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDrawIndexed const *pCmd)
677{
678 int rc;
679 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
680 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDrawIndexed, VERR_INVALID_STATE);
681 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
682 AssertReturn(p3dState, VERR_INVALID_STATE);
683
684 PVMSVGA3DDXCONTEXT pDXContext;
685 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
686 AssertRCReturn(rc, rc);
687
688 rc = pSvgaR3State->pFuncsDX->pfnDXDrawIndexed(pThisCC, pDXContext, pCmd->indexCount, pCmd->startIndexLocation, pCmd->baseVertexLocation);
689#ifdef DUMP_BITMAPS
690 SVGACOTableDXRTViewEntry *pRTViewEntry = &pDXContext->cot.paRTView[pDXContext->svgaDXContext.renderState.renderTargetViewIds[0]];
691 SVGA3dSurfaceImageId image;
692 image.sid = pRTViewEntry->sid;
693 image.face = 0;
694 image.mipmap = 0;
695 VMSVGA3D_MAPPED_SURFACE map;
696 int rc2 = vmsvga3dSurfaceMap(pThisCC, &image, NULL, VMSVGA3D_SURFACE_MAP_READ, &map);
697 if (RT_SUCCESS(rc2))
698 {
699 vmsvga3dMapWriteBmpFile(&map, "rt-");
700 vmsvga3dSurfaceUnmap(pThisCC, &image, &map, /* fWritten = */ false);
701 }
702#endif
703 return rc;
704}
705
706
707int vmsvga3dDXDrawInstanced(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDrawInstanced const *pCmd)
708{
709 int rc;
710 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
711 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDrawInstanced, VERR_INVALID_STATE);
712 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
713 AssertReturn(p3dState, VERR_INVALID_STATE);
714
715 PVMSVGA3DDXCONTEXT pDXContext;
716 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
717 AssertRCReturn(rc, rc);
718
719 rc = pSvgaR3State->pFuncsDX->pfnDXDrawInstanced(pThisCC, pDXContext,
720 pCmd->vertexCountPerInstance, pCmd->instanceCount, pCmd->startVertexLocation, pCmd->startInstanceLocation);
721#ifdef DUMP_BITMAPS
722 SVGACOTableDXRTViewEntry *pRTViewEntry = &pDXContext->cot.paRTView[pDXContext->svgaDXContext.renderState.renderTargetViewIds[0]];
723 SVGA3dSurfaceImageId image;
724 image.sid = pRTViewEntry->sid;
725 image.face = 0;
726 image.mipmap = 0;
727 VMSVGA3D_MAPPED_SURFACE map;
728 int rc2 = vmsvga3dSurfaceMap(pThisCC, &image, NULL, VMSVGA3D_SURFACE_MAP_READ, &map);
729 if (RT_SUCCESS(rc2))
730 {
731 vmsvga3dMapWriteBmpFile(&map, "rt-");
732 vmsvga3dSurfaceUnmap(pThisCC, &image, &map, /* fWritten = */ false);
733 }
734#endif
735 return rc;
736}
737
738
739int vmsvga3dDXDrawIndexedInstanced(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDrawIndexedInstanced const *pCmd)
740{
741 int rc;
742 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
743 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDrawIndexedInstanced, VERR_INVALID_STATE);
744 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
745 AssertReturn(p3dState, VERR_INVALID_STATE);
746
747 PVMSVGA3DDXCONTEXT pDXContext;
748 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
749 AssertRCReturn(rc, rc);
750
751 rc = pSvgaR3State->pFuncsDX->pfnDXDrawIndexedInstanced(pThisCC, pDXContext,
752 pCmd->indexCountPerInstance, pCmd->instanceCount, pCmd->startIndexLocation, pCmd->baseVertexLocation, pCmd->startInstanceLocation);
753#ifdef DUMP_BITMAPS
754 SVGACOTableDXRTViewEntry *pRTViewEntry = &pDXContext->cot.paRTView[pDXContext->svgaDXContext.renderState.renderTargetViewIds[0]];
755 SVGA3dSurfaceImageId image;
756 image.sid = pRTViewEntry->sid;
757 image.face = 0;
758 image.mipmap = 0;
759 VMSVGA3D_MAPPED_SURFACE map;
760 int rc2 = vmsvga3dSurfaceMap(pThisCC, &image, NULL, VMSVGA3D_SURFACE_MAP_READ, &map);
761 if (RT_SUCCESS(rc2))
762 {
763 vmsvga3dMapWriteBmpFile(&map, "rt-");
764 vmsvga3dSurfaceUnmap(pThisCC, &image, &map, /* fWritten = */ false);
765 }
766#endif
767 return rc;
768}
769
770
771int vmsvga3dDXDrawAuto(PVGASTATECC pThisCC, uint32_t idDXContext)
772{
773 int rc;
774 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
775 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDrawAuto, VERR_INVALID_STATE);
776 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
777 AssertReturn(p3dState, VERR_INVALID_STATE);
778
779 PVMSVGA3DDXCONTEXT pDXContext;
780 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
781 AssertRCReturn(rc, rc);
782
783 rc = pSvgaR3State->pFuncsDX->pfnDXDrawAuto(pThisCC, pDXContext);
784#ifdef DUMP_BITMAPS
785 SVGACOTableDXRTViewEntry *pRTViewEntry = &pDXContext->cot.paRTView[pDXContext->svgaDXContext.renderState.renderTargetViewIds[0]];
786 SVGA3dSurfaceImageId image;
787 image.sid = pRTViewEntry->sid;
788 image.face = 0;
789 image.mipmap = 0;
790 VMSVGA3D_MAPPED_SURFACE map;
791 int rc2 = vmsvga3dSurfaceMap(pThisCC, &image, NULL, VMSVGA3D_SURFACE_MAP_READ, &map);
792 if (RT_SUCCESS(rc2))
793 {
794 vmsvga3dMapWriteBmpFile(&map, "rt-");
795 vmsvga3dSurfaceUnmap(pThisCC, &image, &map, /* fWritten = */ false);
796 }
797#endif
798 return rc;
799}
800
801
802int vmsvga3dDXSetInputLayout(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dElementLayoutId elementLayoutId)
803{
804 int rc;
805 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
806 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetInputLayout, VERR_INVALID_STATE);
807 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
808 AssertReturn(p3dState, VERR_INVALID_STATE);
809
810 PVMSVGA3DDXCONTEXT pDXContext;
811 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
812 AssertRCReturn(rc, rc);
813
814 ASSERT_GUEST_RETURN(pDXContext->cot.paElementLayout, VERR_INVALID_STATE);
815 ASSERT_GUEST_RETURN(elementLayoutId < pDXContext->cot.cElementLayout, VERR_INVALID_PARAMETER);
816 RT_UNTRUSTED_VALIDATED_FENCE();
817
818 pDXContext->svgaDXContext.inputAssembly.layoutId = elementLayoutId;
819
820 rc = pSvgaR3State->pFuncsDX->pfnDXSetInputLayout(pThisCC, pDXContext, elementLayoutId);
821 return rc;
822}
823
824
825int vmsvga3dDXSetVertexBuffers(PVGASTATECC pThisCC, uint32_t idDXContext, uint32_t startBuffer, uint32_t cVertexBuffer, SVGA3dVertexBuffer const *paVertexBuffer)
826{
827 int rc;
828 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
829 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetVertexBuffers, VERR_INVALID_STATE);
830 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
831 AssertReturn(p3dState, VERR_INVALID_STATE);
832
833 PVMSVGA3DDXCONTEXT pDXContext;
834 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
835 AssertRCReturn(rc, rc);
836
837 ASSERT_GUEST_RETURN(startBuffer < SVGA3D_DX_MAX_VERTEXBUFFERS, VERR_INVALID_PARAMETER);
838 ASSERT_GUEST_RETURN(cVertexBuffer <= SVGA3D_DX_MAX_VERTEXBUFFERS - startBuffer, VERR_INVALID_PARAMETER);
839 RT_UNTRUSTED_VALIDATED_FENCE();
840
841 for (uint32_t i = 0; i < cVertexBuffer; ++i)
842 {
843 uint32_t const idxVertexBuffer = startBuffer + i;
844
845 pDXContext->svgaDXContext.inputAssembly.vertexBuffers[idxVertexBuffer].bufferId = paVertexBuffer[i].sid;
846 pDXContext->svgaDXContext.inputAssembly.vertexBuffers[idxVertexBuffer].stride = paVertexBuffer[i].stride;
847 pDXContext->svgaDXContext.inputAssembly.vertexBuffers[idxVertexBuffer].offset = paVertexBuffer[i].offset;
848 }
849
850 rc = pSvgaR3State->pFuncsDX->pfnDXSetVertexBuffers(pThisCC, pDXContext, startBuffer, cVertexBuffer, paVertexBuffer);
851 return rc;
852}
853
854
855int vmsvga3dDXSetIndexBuffer(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetIndexBuffer const *pCmd)
856{
857 int rc;
858 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
859 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetIndexBuffer, VERR_INVALID_STATE);
860 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
861 AssertReturn(p3dState, VERR_INVALID_STATE);
862
863 PVMSVGA3DDXCONTEXT pDXContext;
864 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
865 AssertRCReturn(rc, rc);
866
867 pDXContext->svgaDXContext.inputAssembly.indexBufferSid = pCmd->sid;
868 pDXContext->svgaDXContext.inputAssembly.indexBufferOffset = pCmd->offset;
869 pDXContext->svgaDXContext.inputAssembly.indexBufferFormat = pCmd->format;
870
871 rc = pSvgaR3State->pFuncsDX->pfnDXSetIndexBuffer(pThisCC, pDXContext, pCmd->sid, pCmd->format, pCmd->offset);
872 return rc;
873}
874
875
876int vmsvga3dDXSetTopology(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dPrimitiveType topology)
877{
878 int rc;
879 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
880 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetTopology, VERR_INVALID_STATE);
881 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
882 AssertReturn(p3dState, VERR_INVALID_STATE);
883
884 PVMSVGA3DDXCONTEXT pDXContext;
885 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
886 AssertRCReturn(rc, rc);
887
888 ASSERT_GUEST_RETURN(topology >= SVGA3D_PRIMITIVE_MIN && topology < SVGA3D_PRIMITIVE_MAX, VERR_INVALID_PARAMETER);
889
890 pDXContext->svgaDXContext.inputAssembly.topology = topology;
891
892 rc = pSvgaR3State->pFuncsDX->pfnDXSetTopology(pThisCC, pDXContext, topology);
893 return rc;
894}
895
896
897int vmsvga3dDXSetRenderTargets(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dDepthStencilViewId depthStencilViewId, uint32_t cRenderTargetViewId, SVGA3dRenderTargetViewId const *paRenderTargetViewId)
898{
899 int rc;
900 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
901 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetRenderTargets, VERR_INVALID_STATE);
902 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
903 AssertReturn(p3dState, VERR_INVALID_STATE);
904
905 PVMSVGA3DDXCONTEXT pDXContext;
906 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
907 AssertRCReturn(rc, rc);
908
909 ASSERT_GUEST_RETURN( depthStencilViewId < pDXContext->cot.cDSView
910 || depthStencilViewId == SVGA_ID_INVALID, VERR_INVALID_PARAMETER);
911 ASSERT_GUEST_RETURN(cRenderTargetViewId < SVGA3D_MAX_RENDER_TARGETS, VERR_INVALID_PARAMETER);
912 for (uint32_t i = 0; i < cRenderTargetViewId; ++i)
913 ASSERT_GUEST_RETURN( paRenderTargetViewId[i] < pDXContext->cot.cRTView
914 || paRenderTargetViewId[i] == SVGA_ID_INVALID, VERR_INVALID_PARAMETER);
915 RT_UNTRUSTED_VALIDATED_FENCE();
916
917 pDXContext->svgaDXContext.renderState.depthStencilViewId = depthStencilViewId;
918 for (uint32_t i = 0; i < cRenderTargetViewId; ++i)
919 pDXContext->svgaDXContext.renderState.renderTargetViewIds[i] = paRenderTargetViewId[i];
920
921 rc = pSvgaR3State->pFuncsDX->pfnDXSetRenderTargets(pThisCC, pDXContext, depthStencilViewId, cRenderTargetViewId, paRenderTargetViewId);
922 return rc;
923}
924
925
926int vmsvga3dDXSetBlendState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetBlendState const *pCmd)
927{
928 int rc;
929 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
930 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetBlendState, VERR_INVALID_STATE);
931 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
932 AssertReturn(p3dState, VERR_INVALID_STATE);
933
934 PVMSVGA3DDXCONTEXT pDXContext;
935 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
936 AssertRCReturn(rc, rc);
937
938 SVGA3dBlendStateId const blendId = pCmd->blendId;
939
940 ASSERT_GUEST_RETURN(pDXContext->cot.paBlendState, VERR_INVALID_STATE);
941 ASSERT_GUEST_RETURN(blendId < pDXContext->cot.cBlendState, VERR_INVALID_PARAMETER);
942 RT_UNTRUSTED_VALIDATED_FENCE();
943
944 pDXContext->svgaDXContext.renderState.blendStateId = blendId;
945 /* SVGADXContextMobFormat uses uint32_t array to store the blend factors, however they are in fact 32 bit floats. */
946 memcpy(pDXContext->svgaDXContext.renderState.blendFactor, pCmd->blendFactor, sizeof(pDXContext->svgaDXContext.renderState.blendFactor));
947 pDXContext->svgaDXContext.renderState.sampleMask = pCmd->sampleMask;
948
949 rc = pSvgaR3State->pFuncsDX->pfnDXSetBlendState(pThisCC, pDXContext, blendId, pCmd->blendFactor, pCmd->sampleMask);
950 return rc;
951}
952
953
954int vmsvga3dDXSetDepthStencilState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetDepthStencilState const *pCmd)
955{
956 int rc;
957 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
958 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetDepthStencilState, VERR_INVALID_STATE);
959 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
960 AssertReturn(p3dState, VERR_INVALID_STATE);
961
962 PVMSVGA3DDXCONTEXT pDXContext;
963 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
964 AssertRCReturn(rc, rc);
965
966 SVGA3dDepthStencilStateId const depthStencilId = pCmd->depthStencilId;
967
968 ASSERT_GUEST_RETURN(pDXContext->cot.paDepthStencil, VERR_INVALID_STATE);
969 ASSERT_GUEST_RETURN(depthStencilId < pDXContext->cot.cDepthStencil, VERR_INVALID_PARAMETER);
970 RT_UNTRUSTED_VALIDATED_FENCE();
971
972 pDXContext->svgaDXContext.renderState.depthStencilStateId = depthStencilId;
973 pDXContext->svgaDXContext.renderState.stencilRef = pCmd->stencilRef;
974
975 rc = pSvgaR3State->pFuncsDX->pfnDXSetDepthStencilState(pThisCC, pDXContext, depthStencilId, pCmd->stencilRef);
976 return rc;
977}
978
979
980int vmsvga3dDXSetRasterizerState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dRasterizerStateId rasterizerId)
981{
982 int rc;
983 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
984 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetRasterizerState, VERR_INVALID_STATE);
985 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
986 AssertReturn(p3dState, VERR_INVALID_STATE);
987
988 PVMSVGA3DDXCONTEXT pDXContext;
989 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
990 AssertRCReturn(rc, rc);
991
992 ASSERT_GUEST_RETURN(rasterizerId < pDXContext->cot.cRasterizerState, VERR_INVALID_PARAMETER);
993 RT_UNTRUSTED_VALIDATED_FENCE();
994
995 pDXContext->svgaDXContext.renderState.rasterizerStateId = rasterizerId;
996
997 rc = pSvgaR3State->pFuncsDX->pfnDXSetRasterizerState(pThisCC, pDXContext, rasterizerId);
998 return rc;
999}
1000
1001
1002int vmsvga3dDXDefineQuery(PVGASTATECC pThisCC, uint32_t idDXContext)
1003{
1004 int rc;
1005 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1006 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineQuery, VERR_INVALID_STATE);
1007 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1008 AssertReturn(p3dState, VERR_INVALID_STATE);
1009
1010 PVMSVGA3DDXCONTEXT pDXContext;
1011 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1012 AssertRCReturn(rc, rc);
1013
1014 rc = pSvgaR3State->pFuncsDX->pfnDXDefineQuery(pThisCC, pDXContext);
1015 return rc;
1016}
1017
1018
1019int vmsvga3dDXDestroyQuery(PVGASTATECC pThisCC, uint32_t idDXContext)
1020{
1021 int rc;
1022 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1023 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyQuery, VERR_INVALID_STATE);
1024 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1025 AssertReturn(p3dState, VERR_INVALID_STATE);
1026
1027 PVMSVGA3DDXCONTEXT pDXContext;
1028 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1029 AssertRCReturn(rc, rc);
1030
1031 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyQuery(pThisCC, pDXContext);
1032 return rc;
1033}
1034
1035
1036int vmsvga3dDXBindQuery(PVGASTATECC pThisCC, uint32_t idDXContext)
1037{
1038 int rc;
1039 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1040 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindQuery, VERR_INVALID_STATE);
1041 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1042 AssertReturn(p3dState, VERR_INVALID_STATE);
1043
1044 PVMSVGA3DDXCONTEXT pDXContext;
1045 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1046 AssertRCReturn(rc, rc);
1047
1048 rc = pSvgaR3State->pFuncsDX->pfnDXBindQuery(pThisCC, pDXContext);
1049 return rc;
1050}
1051
1052
1053int vmsvga3dDXSetQueryOffset(PVGASTATECC pThisCC, uint32_t idDXContext)
1054{
1055 int rc;
1056 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1057 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetQueryOffset, VERR_INVALID_STATE);
1058 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1059 AssertReturn(p3dState, VERR_INVALID_STATE);
1060
1061 PVMSVGA3DDXCONTEXT pDXContext;
1062 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1063 AssertRCReturn(rc, rc);
1064
1065 rc = pSvgaR3State->pFuncsDX->pfnDXSetQueryOffset(pThisCC, pDXContext);
1066 return rc;
1067}
1068
1069
1070int vmsvga3dDXBeginQuery(PVGASTATECC pThisCC, uint32_t idDXContext)
1071{
1072 int rc;
1073 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1074 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBeginQuery, VERR_INVALID_STATE);
1075 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1076 AssertReturn(p3dState, VERR_INVALID_STATE);
1077
1078 PVMSVGA3DDXCONTEXT pDXContext;
1079 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1080 AssertRCReturn(rc, rc);
1081
1082 rc = pSvgaR3State->pFuncsDX->pfnDXBeginQuery(pThisCC, pDXContext);
1083 return rc;
1084}
1085
1086
1087int vmsvga3dDXEndQuery(PVGASTATECC pThisCC, uint32_t idDXContext)
1088{
1089 int rc;
1090 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1091 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXEndQuery, VERR_INVALID_STATE);
1092 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1093 AssertReturn(p3dState, VERR_INVALID_STATE);
1094
1095 PVMSVGA3DDXCONTEXT pDXContext;
1096 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1097 AssertRCReturn(rc, rc);
1098
1099 rc = pSvgaR3State->pFuncsDX->pfnDXEndQuery(pThisCC, pDXContext);
1100 return rc;
1101}
1102
1103
1104int vmsvga3dDXReadbackQuery(PVGASTATECC pThisCC, uint32_t idDXContext)
1105{
1106 int rc;
1107 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1108 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXReadbackQuery, VERR_INVALID_STATE);
1109 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1110 AssertReturn(p3dState, VERR_INVALID_STATE);
1111
1112 PVMSVGA3DDXCONTEXT pDXContext;
1113 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1114 AssertRCReturn(rc, rc);
1115
1116 rc = pSvgaR3State->pFuncsDX->pfnDXReadbackQuery(pThisCC, pDXContext);
1117 return rc;
1118}
1119
1120
1121int vmsvga3dDXSetPredication(PVGASTATECC pThisCC, uint32_t idDXContext)
1122{
1123 int rc;
1124 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1125 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetPredication, VERR_INVALID_STATE);
1126 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1127 AssertReturn(p3dState, VERR_INVALID_STATE);
1128
1129 PVMSVGA3DDXCONTEXT pDXContext;
1130 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1131 AssertRCReturn(rc, rc);
1132
1133 rc = pSvgaR3State->pFuncsDX->pfnDXSetPredication(pThisCC, pDXContext);
1134 return rc;
1135}
1136
1137
1138int vmsvga3dDXSetSOTargets(PVGASTATECC pThisCC, uint32_t idDXContext, uint32_t cSoTarget, SVGA3dSoTarget const *paSoTarget)
1139{
1140 int rc;
1141 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1142 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetSOTargets, VERR_INVALID_STATE);
1143 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1144 AssertReturn(p3dState, VERR_INVALID_STATE);
1145
1146 PVMSVGA3DDXCONTEXT pDXContext;
1147 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1148 AssertRCReturn(rc, rc);
1149
1150 ASSERT_GUEST_RETURN(cSoTarget < SVGA3D_DX_MAX_SOTARGETS, VERR_INVALID_PARAMETER);
1151 RT_UNTRUSTED_VALIDATED_FENCE();
1152
1153 /** @todo Offset is not stored in svgaDXContext. Should it be stored elsewhere? */
1154 for (uint32_t i = 0; i < SVGA3D_DX_MAX_SOTARGETS; ++i)
1155 pDXContext->svgaDXContext.streamOut.targets[i] = i < cSoTarget ? paSoTarget[i].sid : SVGA3D_INVALID_ID;
1156
1157 rc = pSvgaR3State->pFuncsDX->pfnDXSetSOTargets(pThisCC, pDXContext, cSoTarget, paSoTarget);
1158 return rc;
1159}
1160
1161
1162int vmsvga3dDXSetViewports(PVGASTATECC pThisCC, uint32_t idDXContext, uint32_t cViewport, SVGA3dViewport const *paViewport)
1163{
1164 int rc;
1165 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1166 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetViewports, VERR_INVALID_STATE);
1167 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1168 AssertReturn(p3dState, VERR_INVALID_STATE);
1169
1170 PVMSVGA3DDXCONTEXT pDXContext;
1171 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1172 AssertRCReturn(rc, rc);
1173
1174 ASSERT_GUEST_RETURN(cViewport < SVGA3D_DX_MAX_VIEWPORTS, VERR_INVALID_PARAMETER);
1175 RT_UNTRUSTED_VALIDATED_FENCE();
1176
1177 pDXContext->svgaDXContext.numViewports = (uint8_t)cViewport;
1178 for (uint32_t i = 0; i < cViewport; ++i)
1179 pDXContext->svgaDXContext.viewports[i] = paViewport[i];
1180
1181 rc = pSvgaR3State->pFuncsDX->pfnDXSetViewports(pThisCC, pDXContext, cViewport, paViewport);
1182 return rc;
1183}
1184
1185
1186int vmsvga3dDXSetScissorRects(PVGASTATECC pThisCC, uint32_t idDXContext, uint32_t cRect, SVGASignedRect const *paRect)
1187{
1188 int rc;
1189 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1190 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetScissorRects, VERR_INVALID_STATE);
1191 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1192 AssertReturn(p3dState, VERR_INVALID_STATE);
1193
1194 PVMSVGA3DDXCONTEXT pDXContext;
1195 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1196 AssertRCReturn(rc, rc);
1197
1198 ASSERT_GUEST_RETURN(cRect < SVGA3D_DX_MAX_SCISSORRECTS, VERR_INVALID_PARAMETER);
1199 RT_UNTRUSTED_VALIDATED_FENCE();
1200
1201 pDXContext->svgaDXContext.numScissorRects = (uint8_t)cRect;
1202 for (uint32_t i = 0; i < cRect; ++i)
1203 pDXContext->svgaDXContext.scissorRects[i] = paRect[i];
1204
1205 rc = pSvgaR3State->pFuncsDX->pfnDXSetScissorRects(pThisCC, pDXContext, cRect, paRect);
1206 return rc;
1207}
1208
1209
1210int vmsvga3dDXClearRenderTargetView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXClearRenderTargetView const *pCmd)
1211{
1212 int rc;
1213 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1214 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXClearRenderTargetView, VERR_INVALID_STATE);
1215 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1216 AssertReturn(p3dState, VERR_INVALID_STATE);
1217
1218 PVMSVGA3DDXCONTEXT pDXContext;
1219 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1220 AssertRCReturn(rc, rc);
1221
1222 SVGA3dRenderTargetViewId const renderTargetViewId = pCmd->renderTargetViewId;
1223
1224 ASSERT_GUEST_RETURN(pDXContext->cot.paRTView, VERR_INVALID_STATE);
1225 ASSERT_GUEST_RETURN(renderTargetViewId < pDXContext->cot.cRTView, VERR_INVALID_PARAMETER);
1226 RT_UNTRUSTED_VALIDATED_FENCE();
1227
1228 rc = pSvgaR3State->pFuncsDX->pfnDXClearRenderTargetView(pThisCC, pDXContext, renderTargetViewId, &pCmd->rgba);
1229 return rc;
1230}
1231
1232
1233int vmsvga3dDXClearDepthStencilView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXClearDepthStencilView const *pCmd)
1234{
1235 int rc;
1236 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1237 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXClearDepthStencilView, VERR_INVALID_STATE);
1238 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1239 AssertReturn(p3dState, VERR_INVALID_STATE);
1240
1241 PVMSVGA3DDXCONTEXT pDXContext;
1242 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1243 AssertRCReturn(rc, rc);
1244
1245 SVGA3dDepthStencilViewId const depthStencilViewId = pCmd->depthStencilViewId;
1246
1247 ASSERT_GUEST_RETURN(pDXContext->cot.paDSView, VERR_INVALID_STATE);
1248 ASSERT_GUEST_RETURN(depthStencilViewId < pDXContext->cot.cDSView, VERR_INVALID_PARAMETER);
1249 RT_UNTRUSTED_VALIDATED_FENCE();
1250
1251 rc = pSvgaR3State->pFuncsDX->pfnDXClearDepthStencilView(pThisCC, pDXContext, pCmd->flags, depthStencilViewId, pCmd->depth, (uint8_t)pCmd->stencil);
1252 return rc;
1253}
1254
1255
1256int vmsvga3dDXPredCopyRegion(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXPredCopyRegion const *pCmd)
1257{
1258 int rc;
1259 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1260 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXPredCopyRegion, VERR_INVALID_STATE);
1261 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1262 AssertReturn(p3dState, VERR_INVALID_STATE);
1263
1264 PVMSVGA3DDXCONTEXT pDXContext;
1265 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1266 AssertRCReturn(rc, rc);
1267
1268 /** @todo Memcpy if both resources do not have the hardware resource. */
1269
1270 rc = pSvgaR3State->pFuncsDX->pfnDXPredCopyRegion(pThisCC, pDXContext, pCmd->dstSid, pCmd->dstSubResource, pCmd->srcSid, pCmd->srcSubResource, &pCmd->box);
1271 return rc;
1272}
1273
1274
1275int vmsvga3dDXPredCopy(PVGASTATECC pThisCC, uint32_t idDXContext)
1276{
1277 int rc;
1278 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1279 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXPredCopy, VERR_INVALID_STATE);
1280 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1281 AssertReturn(p3dState, VERR_INVALID_STATE);
1282
1283 PVMSVGA3DDXCONTEXT pDXContext;
1284 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1285 AssertRCReturn(rc, rc);
1286
1287 rc = pSvgaR3State->pFuncsDX->pfnDXPredCopy(pThisCC, pDXContext);
1288 return rc;
1289}
1290
1291
1292int vmsvga3dDXPresentBlt(PVGASTATECC pThisCC, uint32_t idDXContext)
1293{
1294 int rc;
1295 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1296 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXPresentBlt, VERR_INVALID_STATE);
1297 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1298 AssertReturn(p3dState, VERR_INVALID_STATE);
1299
1300 PVMSVGA3DDXCONTEXT pDXContext;
1301 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1302 AssertRCReturn(rc, rc);
1303
1304 rc = pSvgaR3State->pFuncsDX->pfnDXPresentBlt(pThisCC, pDXContext);
1305 return rc;
1306}
1307
1308
1309int vmsvga3dDXGenMips(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXGenMips const *pCmd)
1310{
1311 int rc;
1312 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1313 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXGenMips, VERR_INVALID_STATE);
1314 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1315 AssertReturn(p3dState, VERR_INVALID_STATE);
1316
1317 PVMSVGA3DDXCONTEXT pDXContext;
1318 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1319 AssertRCReturn(rc, rc);
1320
1321 SVGA3dShaderResourceViewId const shaderResourceViewId = pCmd->shaderResourceViewId;
1322
1323 ASSERT_GUEST_RETURN(pDXContext->cot.paSRView, VERR_INVALID_STATE);
1324 ASSERT_GUEST_RETURN(shaderResourceViewId < pDXContext->cot.cSRView, VERR_INVALID_PARAMETER);
1325 RT_UNTRUSTED_VALIDATED_FENCE();
1326
1327 rc = pSvgaR3State->pFuncsDX->pfnDXGenMips(pThisCC, pDXContext, shaderResourceViewId);
1328 return rc;
1329}
1330
1331
1332int vmsvga3dDXDefineShaderResourceView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineShaderResourceView const *pCmd)
1333{
1334 int rc;
1335 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1336 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineShaderResourceView, VERR_INVALID_STATE);
1337 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1338 AssertReturn(p3dState, VERR_INVALID_STATE);
1339
1340 PVMSVGA3DDXCONTEXT pDXContext;
1341 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1342 AssertRCReturn(rc, rc);
1343
1344 SVGA3dShaderResourceViewId const shaderResourceViewId = pCmd->shaderResourceViewId;
1345
1346 ASSERT_GUEST_RETURN(pDXContext->cot.paSRView, VERR_INVALID_STATE);
1347 ASSERT_GUEST_RETURN(shaderResourceViewId < pDXContext->cot.cSRView, VERR_INVALID_PARAMETER);
1348 RT_UNTRUSTED_VALIDATED_FENCE();
1349
1350 SVGACOTableDXSRViewEntry *pEntry = &pDXContext->cot.paSRView[shaderResourceViewId];
1351 pEntry->sid = pCmd->sid;
1352 pEntry->format = pCmd->format;
1353 pEntry->resourceDimension = pCmd->resourceDimension;
1354 pEntry->desc = pCmd->desc;
1355
1356 rc = pSvgaR3State->pFuncsDX->pfnDXDefineShaderResourceView(pThisCC, pDXContext, shaderResourceViewId, pEntry);
1357 return rc;
1358}
1359
1360
1361int vmsvga3dDXDestroyShaderResourceView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyShaderResourceView const *pCmd)
1362{
1363 int rc;
1364 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1365 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyShaderResourceView, VERR_INVALID_STATE);
1366 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1367 AssertReturn(p3dState, VERR_INVALID_STATE);
1368
1369 PVMSVGA3DDXCONTEXT pDXContext;
1370 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1371 AssertRCReturn(rc, rc);
1372
1373 SVGA3dShaderResourceViewId const shaderResourceViewId = pCmd->shaderResourceViewId;
1374
1375 ASSERT_GUEST_RETURN(pDXContext->cot.paSRView, VERR_INVALID_STATE);
1376 ASSERT_GUEST_RETURN(shaderResourceViewId < pDXContext->cot.cSRView, VERR_INVALID_PARAMETER);
1377 RT_UNTRUSTED_VALIDATED_FENCE();
1378
1379 SVGACOTableDXSRViewEntry *pEntry = &pDXContext->cot.paSRView[shaderResourceViewId];
1380 RT_ZERO(*pEntry);
1381
1382 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyShaderResourceView(pThisCC, pDXContext, shaderResourceViewId);
1383 return rc;
1384}
1385
1386
1387int vmsvga3dDXDefineRenderTargetView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineRenderTargetView const *pCmd)
1388{
1389 int rc;
1390 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1391 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineRenderTargetView, VERR_INVALID_STATE);
1392 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1393 AssertReturn(p3dState, VERR_INVALID_STATE);
1394
1395 PVMSVGA3DDXCONTEXT pDXContext;
1396 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1397 AssertRCReturn(rc, rc);
1398
1399 SVGA3dRenderTargetViewId const renderTargetViewId = pCmd->renderTargetViewId;
1400
1401 ASSERT_GUEST_RETURN(pDXContext->cot.paRTView, VERR_INVALID_STATE);
1402 ASSERT_GUEST_RETURN(renderTargetViewId < pDXContext->cot.cRTView, VERR_INVALID_PARAMETER);
1403 RT_UNTRUSTED_VALIDATED_FENCE();
1404
1405 SVGACOTableDXRTViewEntry *pEntry = &pDXContext->cot.paRTView[renderTargetViewId];
1406 pEntry->sid = pCmd->sid;
1407 pEntry->format = pCmd->format;
1408 pEntry->resourceDimension = pCmd->resourceDimension;
1409 pEntry->desc = pCmd->desc;
1410
1411 rc = pSvgaR3State->pFuncsDX->pfnDXDefineRenderTargetView(pThisCC, pDXContext, renderTargetViewId, pEntry);
1412 return rc;
1413}
1414
1415
1416int vmsvga3dDXDestroyRenderTargetView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyRenderTargetView const *pCmd)
1417{
1418 int rc;
1419 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1420 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyRenderTargetView, VERR_INVALID_STATE);
1421 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1422 AssertReturn(p3dState, VERR_INVALID_STATE);
1423
1424 PVMSVGA3DDXCONTEXT pDXContext;
1425 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1426 AssertRCReturn(rc, rc);
1427
1428 SVGA3dRenderTargetViewId const renderTargetViewId = pCmd->renderTargetViewId;
1429
1430 ASSERT_GUEST_RETURN(pDXContext->cot.paRTView, VERR_INVALID_STATE);
1431 ASSERT_GUEST_RETURN(renderTargetViewId < pDXContext->cot.cRTView, VERR_INVALID_PARAMETER);
1432 RT_UNTRUSTED_VALIDATED_FENCE();
1433
1434 SVGACOTableDXRTViewEntry *pEntry = &pDXContext->cot.paRTView[renderTargetViewId];
1435 RT_ZERO(*pEntry);
1436
1437 for (uint32_t i = 0; i < SVGA3D_MAX_SIMULTANEOUS_RENDER_TARGETS; ++i)
1438 {
1439 if (pDXContext->svgaDXContext.renderState.renderTargetViewIds[i] == renderTargetViewId)
1440 pDXContext->svgaDXContext.renderState.renderTargetViewIds[i] = SVGA_ID_INVALID;
1441 }
1442
1443 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyRenderTargetView(pThisCC, pDXContext, renderTargetViewId);
1444 return rc;
1445}
1446
1447
1448int vmsvga3dDXDefineDepthStencilView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineDepthStencilView_v2 const *pCmd)
1449{
1450 int rc;
1451 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1452 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineDepthStencilView, VERR_INVALID_STATE);
1453 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1454 AssertReturn(p3dState, VERR_INVALID_STATE);
1455
1456 PVMSVGA3DDXCONTEXT pDXContext;
1457 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1458 AssertRCReturn(rc, rc);
1459
1460 SVGA3dDepthStencilViewId const depthStencilViewId = pCmd->depthStencilViewId;
1461
1462 ASSERT_GUEST_RETURN(pDXContext->cot.paDSView, VERR_INVALID_STATE);
1463 ASSERT_GUEST_RETURN(depthStencilViewId < pDXContext->cot.cDSView, VERR_INVALID_PARAMETER);
1464 RT_UNTRUSTED_VALIDATED_FENCE();
1465
1466 SVGACOTableDXDSViewEntry *pEntry = &pDXContext->cot.paDSView[depthStencilViewId];
1467 pEntry->sid = pCmd->sid;
1468 pEntry->format = pCmd->format;
1469 pEntry->resourceDimension = pCmd->resourceDimension;
1470 pEntry->mipSlice = pCmd->mipSlice;
1471 pEntry->firstArraySlice = pCmd->firstArraySlice;
1472 pEntry->arraySize = pCmd->arraySize;
1473 pEntry->flags = pCmd->flags;
1474
1475 rc = pSvgaR3State->pFuncsDX->pfnDXDefineDepthStencilView(pThisCC, pDXContext, depthStencilViewId, pEntry);
1476 return rc;
1477}
1478
1479
1480int vmsvga3dDXDestroyDepthStencilView(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyDepthStencilView const *pCmd)
1481{
1482 int rc;
1483 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1484 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyDepthStencilView, VERR_INVALID_STATE);
1485 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1486 AssertReturn(p3dState, VERR_INVALID_STATE);
1487
1488 PVMSVGA3DDXCONTEXT pDXContext;
1489 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1490 AssertRCReturn(rc, rc);
1491
1492 SVGA3dDepthStencilViewId const depthStencilViewId = pCmd->depthStencilViewId;
1493
1494 ASSERT_GUEST_RETURN(pDXContext->cot.paDSView, VERR_INVALID_STATE);
1495 ASSERT_GUEST_RETURN(depthStencilViewId < pDXContext->cot.cDSView, VERR_INVALID_PARAMETER);
1496 RT_UNTRUSTED_VALIDATED_FENCE();
1497
1498 SVGACOTableDXDSViewEntry *pEntry = &pDXContext->cot.paDSView[depthStencilViewId];
1499 RT_ZERO(*pEntry);
1500
1501 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyDepthStencilView(pThisCC, pDXContext, depthStencilViewId);
1502 return rc;
1503}
1504
1505
1506int vmsvga3dDXDefineElementLayout(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dElementLayoutId elementLayoutId, uint32_t cDesc, SVGA3dInputElementDesc const *paDesc)
1507{
1508 int rc;
1509 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1510 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineElementLayout, VERR_INVALID_STATE);
1511 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1512 AssertReturn(p3dState, VERR_INVALID_STATE);
1513
1514 PVMSVGA3DDXCONTEXT pDXContext;
1515 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1516 AssertRCReturn(rc, rc);
1517
1518 ASSERT_GUEST_RETURN(pDXContext->cot.paElementLayout, VERR_INVALID_STATE);
1519 ASSERT_GUEST_RETURN(elementLayoutId < pDXContext->cot.cElementLayout, VERR_INVALID_PARAMETER);
1520 RT_UNTRUSTED_VALIDATED_FENCE();
1521
1522 SVGACOTableDXElementLayoutEntry *pEntry = &pDXContext->cot.paElementLayout[elementLayoutId];
1523 pEntry->elid = elementLayoutId;
1524 pEntry->numDescs = RT_MIN(cDesc, RT_ELEMENTS(pEntry->descs));
1525 memcpy(pEntry->descs, paDesc, pEntry->numDescs * sizeof(pEntry->descs[0]));
1526
1527#ifdef LOG_ENABLED
1528 Log6(("Element layout %d: slot off fmt class step reg\n", pEntry->elid));
1529 for (uint32_t i = 0; i < pEntry->numDescs; ++i)
1530 {
1531 Log6((" [%u]: %u 0x%02X %d %u %u %u\n",
1532 i,
1533 pEntry->descs[i].inputSlot,
1534 pEntry->descs[i].alignedByteOffset,
1535 pEntry->descs[i].format,
1536 pEntry->descs[i].inputSlotClass,
1537 pEntry->descs[i].instanceDataStepRate,
1538 pEntry->descs[i].inputRegister
1539 ));
1540 }
1541#endif
1542
1543 rc = pSvgaR3State->pFuncsDX->pfnDXDefineElementLayout(pThisCC, pDXContext, elementLayoutId, pEntry);
1544 return rc;
1545}
1546
1547
1548int vmsvga3dDXDestroyElementLayout(PVGASTATECC pThisCC, uint32_t idDXContext)
1549{
1550 int rc;
1551 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1552 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyElementLayout, VERR_INVALID_STATE);
1553 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1554 AssertReturn(p3dState, VERR_INVALID_STATE);
1555
1556 PVMSVGA3DDXCONTEXT pDXContext;
1557 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1558 AssertRCReturn(rc, rc);
1559
1560 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyElementLayout(pThisCC, pDXContext);
1561 return rc;
1562}
1563
1564
1565int vmsvga3dDXDefineBlendState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineBlendState const *pCmd)
1566{
1567 int rc;
1568 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1569 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineBlendState, VERR_INVALID_STATE);
1570 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1571 AssertReturn(p3dState, VERR_INVALID_STATE);
1572
1573 PVMSVGA3DDXCONTEXT pDXContext;
1574 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1575 AssertRCReturn(rc, rc);
1576
1577 const SVGA3dBlendStateId blendId = pCmd->blendId;
1578
1579 ASSERT_GUEST_RETURN(pDXContext->cot.paBlendState, VERR_INVALID_STATE);
1580 ASSERT_GUEST_RETURN(blendId < pDXContext->cot.cBlendState, VERR_INVALID_PARAMETER);
1581 RT_UNTRUSTED_VALIDATED_FENCE();
1582
1583 SVGACOTableDXBlendStateEntry *pEntry = &pDXContext->cot.paBlendState[blendId];
1584 pEntry->alphaToCoverageEnable = pCmd->alphaToCoverageEnable;
1585 pEntry->independentBlendEnable = pCmd->independentBlendEnable;
1586 memcpy(pEntry->perRT, pCmd->perRT, sizeof(pEntry->perRT));
1587
1588 rc = pSvgaR3State->pFuncsDX->pfnDXDefineBlendState(pThisCC, pDXContext, blendId, pEntry);
1589 return rc;
1590}
1591
1592
1593int vmsvga3dDXDestroyBlendState(PVGASTATECC pThisCC, uint32_t idDXContext)
1594{
1595 int rc;
1596 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1597 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyBlendState, VERR_INVALID_STATE);
1598 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1599 AssertReturn(p3dState, VERR_INVALID_STATE);
1600
1601 PVMSVGA3DDXCONTEXT pDXContext;
1602 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1603 AssertRCReturn(rc, rc);
1604
1605 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyBlendState(pThisCC, pDXContext);
1606 return rc;
1607}
1608
1609
1610int vmsvga3dDXDefineDepthStencilState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineDepthStencilState const *pCmd)
1611{
1612 int rc;
1613 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1614 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineDepthStencilState, VERR_INVALID_STATE);
1615 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1616 AssertReturn(p3dState, VERR_INVALID_STATE);
1617
1618 PVMSVGA3DDXCONTEXT pDXContext;
1619 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1620 AssertRCReturn(rc, rc);
1621
1622 SVGA3dDepthStencilStateId const depthStencilId = pCmd->depthStencilId;
1623
1624 ASSERT_GUEST_RETURN(pDXContext->cot.paDepthStencil, VERR_INVALID_STATE);
1625 ASSERT_GUEST_RETURN(depthStencilId < pDXContext->cot.cDepthStencil, VERR_INVALID_PARAMETER);
1626 RT_UNTRUSTED_VALIDATED_FENCE();
1627
1628 SVGACOTableDXDepthStencilEntry *pEntry = &pDXContext->cot.paDepthStencil[depthStencilId];
1629 pEntry->depthEnable = pCmd->depthEnable;
1630 pEntry->depthWriteMask = pCmd->depthWriteMask;
1631 pEntry->depthFunc = pCmd->depthFunc;
1632 pEntry->stencilEnable = pCmd->stencilEnable;
1633 pEntry->frontEnable = pCmd->frontEnable;
1634 pEntry->backEnable = pCmd->backEnable;
1635 pEntry->stencilReadMask = pCmd->stencilReadMask;
1636 pEntry->stencilWriteMask = pCmd->stencilWriteMask;
1637
1638 pEntry->frontStencilFailOp = pCmd->frontStencilFailOp;
1639 pEntry->frontStencilDepthFailOp = pCmd->frontStencilDepthFailOp;
1640 pEntry->frontStencilPassOp = pCmd->frontStencilPassOp;
1641 pEntry->frontStencilFunc = pCmd->frontStencilFunc;
1642
1643 pEntry->backStencilFailOp = pCmd->backStencilFailOp;
1644 pEntry->backStencilDepthFailOp = pCmd->backStencilDepthFailOp;
1645 pEntry->backStencilPassOp = pCmd->backStencilPassOp;
1646 pEntry->backStencilFunc = pCmd->backStencilFunc;
1647
1648 rc = pSvgaR3State->pFuncsDX->pfnDXDefineDepthStencilState(pThisCC, pDXContext, depthStencilId, pEntry);
1649 return rc;
1650}
1651
1652
1653int vmsvga3dDXDestroyDepthStencilState(PVGASTATECC pThisCC, uint32_t idDXContext)
1654{
1655 int rc;
1656 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1657 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyDepthStencilState, VERR_INVALID_STATE);
1658 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1659 AssertReturn(p3dState, VERR_INVALID_STATE);
1660
1661 PVMSVGA3DDXCONTEXT pDXContext;
1662 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1663 AssertRCReturn(rc, rc);
1664
1665 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyDepthStencilState(pThisCC, pDXContext);
1666 return rc;
1667}
1668
1669
1670int vmsvga3dDXDefineRasterizerState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineRasterizerState const *pCmd)
1671{
1672 int rc;
1673 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1674 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineRasterizerState, VERR_INVALID_STATE);
1675 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1676 AssertReturn(p3dState, VERR_INVALID_STATE);
1677
1678 PVMSVGA3DDXCONTEXT pDXContext;
1679 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1680 AssertRCReturn(rc, rc);
1681
1682 SVGA3dRasterizerStateId const rasterizerId = pCmd->rasterizerId;
1683
1684 ASSERT_GUEST_RETURN(pDXContext->cot.paRasterizerState, VERR_INVALID_STATE);
1685 ASSERT_GUEST_RETURN(rasterizerId < pDXContext->cot.cRasterizerState, VERR_INVALID_PARAMETER);
1686 RT_UNTRUSTED_VALIDATED_FENCE();
1687
1688 SVGACOTableDXRasterizerStateEntry *pEntry = &pDXContext->cot.paRasterizerState[rasterizerId];
1689 pEntry->fillMode = pCmd->fillMode;
1690 pEntry->cullMode = pCmd->cullMode;
1691 pEntry->frontCounterClockwise = pCmd->frontCounterClockwise;
1692 pEntry->provokingVertexLast = pCmd->provokingVertexLast;
1693 pEntry->depthBias = pCmd->depthBias;
1694 pEntry->depthBiasClamp = pCmd->depthBiasClamp;
1695 pEntry->slopeScaledDepthBias = pCmd->slopeScaledDepthBias;
1696 pEntry->depthClipEnable = pCmd->depthClipEnable;
1697 pEntry->scissorEnable = pCmd->scissorEnable;
1698 pEntry->multisampleEnable = pCmd->multisampleEnable;
1699 pEntry->antialiasedLineEnable = pCmd->antialiasedLineEnable;
1700 pEntry->lineWidth = pCmd->lineWidth;
1701 pEntry->lineStippleEnable = pCmd->lineStippleEnable;
1702 pEntry->lineStippleFactor = pCmd->lineStippleFactor;
1703 pEntry->lineStipplePattern = pCmd->lineStipplePattern;
1704 pEntry->forcedSampleCount = 0; /** @todo Not in pCmd. */
1705 RT_ZERO(pEntry->mustBeZero);
1706
1707 rc = pSvgaR3State->pFuncsDX->pfnDXDefineRasterizerState(pThisCC, pDXContext, rasterizerId, pEntry);
1708 return rc;
1709}
1710
1711
1712int vmsvga3dDXDestroyRasterizerState(PVGASTATECC pThisCC, uint32_t idDXContext)
1713{
1714 int rc;
1715 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1716 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyRasterizerState, VERR_INVALID_STATE);
1717 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1718 AssertReturn(p3dState, VERR_INVALID_STATE);
1719
1720 PVMSVGA3DDXCONTEXT pDXContext;
1721 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1722 AssertRCReturn(rc, rc);
1723
1724 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyRasterizerState(pThisCC, pDXContext);
1725 return rc;
1726}
1727
1728
1729int vmsvga3dDXDefineSamplerState(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineSamplerState const *pCmd)
1730{
1731 int rc;
1732 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1733 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineSamplerState, VERR_INVALID_STATE);
1734 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1735 AssertReturn(p3dState, VERR_INVALID_STATE);
1736
1737 PVMSVGA3DDXCONTEXT pDXContext;
1738 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1739 AssertRCReturn(rc, rc);
1740
1741 SVGA3dSamplerId const samplerId = pCmd->samplerId;
1742
1743 ASSERT_GUEST_RETURN(pDXContext->cot.paSampler, VERR_INVALID_STATE);
1744 ASSERT_GUEST_RETURN(samplerId < pDXContext->cot.cSampler, VERR_INVALID_PARAMETER);
1745 RT_UNTRUSTED_VALIDATED_FENCE();
1746
1747 SVGACOTableDXSamplerEntry *pEntry = &pDXContext->cot.paSampler[samplerId];
1748 pEntry->filter = pCmd->filter;
1749 pEntry->addressU = pCmd->addressU;
1750 pEntry->addressV = pCmd->addressV;
1751 pEntry->addressW = pCmd->addressW;
1752 pEntry->mipLODBias = pCmd->mipLODBias;
1753 pEntry->maxAnisotropy = pCmd->maxAnisotropy;
1754 pEntry->comparisonFunc = pCmd->comparisonFunc;
1755 pEntry->borderColor = pCmd->borderColor;
1756 pEntry->minLOD = pCmd->minLOD;
1757 pEntry->maxLOD = pCmd->maxLOD;
1758
1759 rc = pSvgaR3State->pFuncsDX->pfnDXDefineSamplerState(pThisCC, pDXContext, samplerId, pEntry);
1760 return rc;
1761}
1762
1763
1764int vmsvga3dDXDestroySamplerState(PVGASTATECC pThisCC, uint32_t idDXContext)
1765{
1766 int rc;
1767 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1768 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroySamplerState, VERR_INVALID_STATE);
1769 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1770 AssertReturn(p3dState, VERR_INVALID_STATE);
1771
1772 PVMSVGA3DDXCONTEXT pDXContext;
1773 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1774 AssertRCReturn(rc, rc);
1775
1776 rc = pSvgaR3State->pFuncsDX->pfnDXDestroySamplerState(pThisCC, pDXContext);
1777 return rc;
1778}
1779
1780
1781int vmsvga3dDXDefineShader(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineShader const *pCmd)
1782{
1783 int rc;
1784 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1785 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineShader, VERR_INVALID_STATE);
1786 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1787 AssertReturn(p3dState, VERR_INVALID_STATE);
1788
1789 PVMSVGA3DDXCONTEXT pDXContext;
1790 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1791 AssertRCReturn(rc, rc);
1792
1793 AssertReturn(pDXContext->paShader, VERR_INVALID_STATE);
1794
1795 SVGA3dShaderId const shaderId = pCmd->shaderId;
1796
1797 ASSERT_GUEST_RETURN(pDXContext->cot.paShader, VERR_INVALID_STATE);
1798 ASSERT_GUEST_RETURN(shaderId < pDXContext->cot.cShader, VERR_INVALID_PARAMETER);
1799 ASSERT_GUEST_RETURN(pCmd->type >= SVGA3D_SHADERTYPE_MIN && pCmd->type < SVGA3D_SHADERTYPE_MAX, VERR_INVALID_PARAMETER);
1800 ASSERT_GUEST_RETURN(pCmd->sizeInBytes >= 8, VERR_INVALID_PARAMETER); /* Version Token + Length Token. */
1801 RT_UNTRUSTED_VALIDATED_FENCE();
1802
1803 SVGACOTableDXShaderEntry *pEntry = &pDXContext->cot.paShader[shaderId];
1804 pEntry->type = pCmd->type;
1805 pEntry->sizeInBytes = pCmd->sizeInBytes;
1806 pEntry->offsetInBytes = 0;
1807 pEntry->mobid = SVGA_ID_INVALID;
1808
1809 PVMSVGA3DSHADER pShader = &pDXContext->paShader[shaderId];
1810 if (pShader->id != SVGA_ID_INVALID)
1811 {
1812 /* Cleanup the current shader. */
1813 pSvgaR3State->pFuncsDX->pfnDXDestroyShader(pThisCC, pDXContext, shaderId);
1814 RTMemFree(pShader->pShaderProgram);
1815 }
1816
1817 pShader->id = shaderId;
1818 pShader->cid = idDXContext;
1819 pShader->type = pEntry->type;
1820 pShader->cbData = pEntry->sizeInBytes;
1821 pShader->pShaderProgram = NULL;
1822 pShader->u.pvBackendShader = NULL;
1823
1824 rc = pSvgaR3State->pFuncsDX->pfnDXDefineShader(pThisCC, pDXContext, shaderId, pEntry);
1825 return rc;
1826}
1827
1828
1829int vmsvga3dDXDestroyShader(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyShader const *pCmd)
1830{
1831 int rc;
1832 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1833 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyShader, VERR_INVALID_STATE);
1834 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1835 AssertReturn(p3dState, VERR_INVALID_STATE);
1836
1837 PVMSVGA3DDXCONTEXT pDXContext;
1838 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
1839 AssertRCReturn(rc, rc);
1840
1841 AssertReturn(pDXContext->paShader, VERR_INVALID_STATE);
1842
1843 SVGA3dShaderId const shaderId = pCmd->shaderId;
1844
1845 ASSERT_GUEST_RETURN(pDXContext->cot.paShader, VERR_INVALID_STATE);
1846 ASSERT_GUEST_RETURN(shaderId < pDXContext->cot.cShader, VERR_INVALID_PARAMETER);
1847 RT_UNTRUSTED_VALIDATED_FENCE();
1848
1849 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyShader(pThisCC, pDXContext, shaderId);
1850
1851 /* Cleanup COTable entries.*/
1852 SVGACOTableDXShaderEntry *pEntry = &pDXContext->cot.paShader[shaderId];
1853 pEntry->type = SVGA3D_SHADERTYPE_INVALID;
1854 pEntry->sizeInBytes = 0;
1855 pEntry->offsetInBytes = 0;
1856 pEntry->mobid = SVGA_ID_INVALID;
1857
1858 /** @todo Destroy shaders on context and backend deletion. */
1859 PVMSVGA3DSHADER pShader = &pDXContext->paShader[shaderId];
1860 DXShaderFree(&pShader->shaderInfo);
1861 pShader->id = SVGA_ID_INVALID;
1862 pShader->cid = SVGA_ID_INVALID;
1863 pShader->type = SVGA3D_SHADERTYPE_INVALID;
1864 pShader->cbData = 0;
1865 RTMemFree(pShader->pShaderProgram);
1866 pShader->pShaderProgram = NULL;
1867 pShader->u.pvBackendShader = NULL;
1868
1869 return rc;
1870}
1871
1872
1873static int dxBindShader(PVMSVGA3DSHADER pShader, PVMSVGAMOB pMob, SVGACOTableDXShaderEntry const *pEntry, void const *pvShaderBytecode)
1874{
1875 /* How many bytes the MOB can hold. */
1876 uint32_t const cbMob = vmsvgaR3MobSize(pMob) - pEntry->offsetInBytes;
1877 ASSERT_GUEST_RETURN(cbMob >= pEntry->sizeInBytes, VERR_INVALID_PARAMETER);
1878 AssertReturn(pEntry->sizeInBytes >= 8, VERR_INTERNAL_ERROR); /* Host ensures this in DefineShader. */
1879
1880 int rc = DXShaderParse(pvShaderBytecode, pEntry->sizeInBytes, &pShader->shaderInfo);
1881 if (RT_SUCCESS(rc))
1882 {
1883 /* Get the length of the shader bytecode. */
1884 uint32_t const *pau32Token = (uint32_t *)pvShaderBytecode; /* Tokens */
1885 uint32_t const cToken = pau32Token[1]; /* Length of the shader in tokens. */
1886 ASSERT_GUEST_RETURN(cToken <= pEntry->sizeInBytes / 4, VERR_INVALID_PARAMETER);
1887
1888 pShader->cbData = cToken * 4;
1889
1890 /* Check if the MOB contains SVGA3dDXSignatureHeader and signature entries.
1891 * If they are not there (Linux guest driver does not provide them), then it is fine
1892 * and the signatures generated by DXShaderParse will be used.
1893 */
1894 uint32_t const cbSignaturesMax = cbMob - pShader->cbData; /* How many bytes for signatures are available. */
1895 if (cbSignaturesMax > sizeof(SVGA3dDXSignatureHeader))
1896 {
1897 SVGA3dDXSignatureHeader const *pSignatureHeader = (SVGA3dDXSignatureHeader *)((uint8_t *)pvShaderBytecode + pShader->cbData);
1898 if (pSignatureHeader->headerVersion == SVGADX_SIGNATURE_HEADER_VERSION_0)
1899 {
1900 DEBUG_BREAKPOINT_TEST();
1901 ASSERT_GUEST_RETURN( pSignatureHeader->numInputSignatures <= RT_ELEMENTS(pShader->shaderInfo.aInputSignature)
1902 && pSignatureHeader->numOutputSignatures <= RT_ELEMENTS(pShader->shaderInfo.aOutputSignature)
1903 && pSignatureHeader->numPatchConstantSignatures <= RT_ELEMENTS(pShader->shaderInfo.aPatchConstantSignature),
1904 VERR_INVALID_PARAMETER);
1905
1906 uint32_t const cSignature = pSignatureHeader->numInputSignatures
1907 + pSignatureHeader->numOutputSignatures
1908 + pSignatureHeader->numPatchConstantSignatures;
1909 ASSERT_GUEST_RETURN( cbSignaturesMax - sizeof(SVGA3dDXSignatureHeader)
1910 > cSignature * sizeof(sizeof(SVGA3dDXSignatureEntry)), VERR_INVALID_PARAMETER);
1911
1912 /* Copy to DXShaderInfo. */
1913 uint8_t const *pu8Signatures = (uint8_t *)&pSignatureHeader[1];
1914 pShader->shaderInfo.cInputSignature = pSignatureHeader->numInputSignatures;
1915 memcpy(pShader->shaderInfo.aInputSignature, pu8Signatures, pSignatureHeader->numInputSignatures * sizeof(SVGA3dDXSignatureEntry));
1916
1917 pu8Signatures += pSignatureHeader->numInputSignatures * sizeof(SVGA3dDXSignatureEntry);
1918 pShader->shaderInfo.cOutputSignature = pSignatureHeader->numOutputSignatures;
1919 memcpy(pShader->shaderInfo.aOutputSignature, pu8Signatures, pSignatureHeader->numOutputSignatures * sizeof(SVGA3dDXSignatureEntry));
1920
1921 pu8Signatures += pSignatureHeader->numOutputSignatures * sizeof(SVGA3dDXSignatureEntry);
1922 pShader->shaderInfo.cPatchConstantSignature = pSignatureHeader->numPatchConstantSignatures;
1923 memcpy(pShader->shaderInfo.aPatchConstantSignature, pu8Signatures, pSignatureHeader->numPatchConstantSignatures * sizeof(SVGA3dDXSignatureEntry));
1924 }
1925 }
1926 }
1927
1928 return rc;
1929}
1930
1931
1932int vmsvga3dDXBindShader(PVGASTATECC pThisCC, SVGA3dCmdDXBindShader const *pCmd, PVMSVGAMOB pMob)
1933{
1934 int rc;
1935 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1936 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindShader, VERR_INVALID_STATE);
1937 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1938 AssertReturn(p3dState, VERR_INVALID_STATE);
1939
1940 PVMSVGA3DDXCONTEXT pDXContext;
1941 rc = vmsvga3dDXContextFromCid(p3dState, pCmd->cid, &pDXContext);
1942 AssertRCReturn(rc, rc);
1943
1944 ASSERT_GUEST_RETURN(pCmd->shid < pDXContext->cot.cShader, VERR_INVALID_PARAMETER);
1945 RT_UNTRUSTED_VALIDATED_FENCE();
1946
1947 SVGACOTableDXShaderEntry *pEntry = &pDXContext->cot.paShader[pCmd->shid];
1948 //pEntry->type;
1949 //pEntry->sizeInBytes;
1950 pEntry->offsetInBytes = pCmd->offsetInBytes;
1951 pEntry->mobid = vmsvgaR3MobId(pMob);
1952
1953 if (pMob)
1954 {
1955 /* Bind a mob to the shader. */
1956
1957 /* Create a memory pointer for the MOB, which is accessible by host. */
1958 rc = vmsvgaR3MobBackingStoreCreate(pSvgaR3State, pMob, vmsvgaR3MobSize(pMob));
1959 if (RT_SUCCESS(rc))
1960 {
1961 /* Get pointer to the shader bytecode. This will also verify the offset. */
1962 void const *pvShaderBytecode = vmsvgaR3MobBackingStorePtr(pMob, pEntry->offsetInBytes);
1963 ASSERT_GUEST_RETURN(pvShaderBytecode, VERR_INVALID_PARAMETER);
1964
1965 PVMSVGA3DSHADER pShader = &pDXContext->paShader[pCmd->shid];
1966 Assert( pShader->id == pCmd->shid
1967 && pShader->type == pEntry->type); /* The host ensures this. */
1968
1969 /* Get the shader and optional signatures from the MOB. */
1970 rc = dxBindShader(pShader, pMob, pEntry, pvShaderBytecode);
1971 if (RT_SUCCESS(rc))
1972 rc = pSvgaR3State->pFuncsDX->pfnDXBindShader(pThisCC, pDXContext, pShader, pvShaderBytecode);
1973
1974 if (RT_FAILURE(rc))
1975 {
1976 /** @todo Any cleanup? */
1977 vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pMob);
1978 }
1979 }
1980 }
1981 else
1982 {
1983 /* Unbind. */
1984 /** @todo Nothing to do here but release the MOB? */
1985 vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pMob);
1986 }
1987
1988 return rc;
1989}
1990
1991
1992int vmsvga3dDXDefineStreamOutput(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDefineStreamOutput const *pCmd)
1993{
1994 int rc;
1995 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
1996 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineStreamOutput, VERR_INVALID_STATE);
1997 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
1998 AssertReturn(p3dState, VERR_INVALID_STATE);
1999
2000 PVMSVGA3DDXCONTEXT pDXContext;
2001 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2002 AssertRCReturn(rc, rc);
2003
2004 SVGA3dStreamOutputId const soid = pCmd->soid;
2005
2006 ASSERT_GUEST_RETURN(pDXContext->cot.paStreamOutput, VERR_INVALID_STATE);
2007 ASSERT_GUEST_RETURN(soid < pDXContext->cot.cStreamOutput, VERR_INVALID_PARAMETER);
2008 ASSERT_GUEST_RETURN(pCmd->numOutputStreamEntries < SVGA3D_MAX_DX10_STREAMOUT_DECLS, VERR_INVALID_PARAMETER);
2009 RT_UNTRUSTED_VALIDATED_FENCE();
2010
2011 SVGACOTableDXStreamOutputEntry *pEntry = &pDXContext->cot.paStreamOutput[soid];
2012 pEntry->numOutputStreamEntries = pCmd->numOutputStreamEntries;
2013 memcpy(pEntry->decl, pCmd->decl, sizeof(pEntry->decl));
2014 memcpy(pEntry->streamOutputStrideInBytes, pCmd->streamOutputStrideInBytes, sizeof(pEntry->streamOutputStrideInBytes));
2015 pEntry->rasterizedStream = 0; // Apparently invalid in this command: pCmd->rasterizedStream;
2016 pEntry->numOutputStreamStrides = 0;
2017 pEntry->mobid = SVGA_ID_INVALID;
2018 pEntry->offsetInBytes = 0;
2019 pEntry->usesMob = 0;
2020 pEntry->pad0 = 0;
2021 pEntry->pad1 = 0;
2022 RT_ZERO(pEntry->pad2);
2023
2024 rc = pSvgaR3State->pFuncsDX->pfnDXDefineStreamOutput(pThisCC, pDXContext, soid, pEntry);
2025 return rc;
2026}
2027
2028
2029int vmsvga3dDXDestroyStreamOutput(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXDestroyStreamOutput const *pCmd)
2030{
2031 int rc;
2032 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2033 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyStreamOutput, VERR_INVALID_STATE);
2034 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2035 AssertReturn(p3dState, VERR_INVALID_STATE);
2036
2037 PVMSVGA3DDXCONTEXT pDXContext;
2038 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2039 AssertRCReturn(rc, rc);
2040
2041 SVGA3dStreamOutputId const soid = pCmd->soid;
2042
2043 ASSERT_GUEST_RETURN(pDXContext->cot.paStreamOutput, VERR_INVALID_STATE);
2044 ASSERT_GUEST_RETURN(soid < pDXContext->cot.cStreamOutput, VERR_INVALID_PARAMETER);
2045 RT_UNTRUSTED_VALIDATED_FENCE();
2046
2047 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyStreamOutput(pThisCC, pDXContext, soid);
2048
2049 SVGACOTableDXStreamOutputEntry *pEntry = &pDXContext->cot.paStreamOutput[soid];
2050 RT_ZERO(*pEntry);
2051 pEntry->mobid = SVGA_ID_INVALID;
2052
2053 return rc;
2054}
2055
2056
2057int vmsvga3dDXSetStreamOutput(PVGASTATECC pThisCC, uint32_t idDXContext, SVGA3dCmdDXSetStreamOutput const *pCmd)
2058{
2059 int rc;
2060 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2061 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetStreamOutput, VERR_INVALID_STATE);
2062 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2063 AssertReturn(p3dState, VERR_INVALID_STATE);
2064
2065 PVMSVGA3DDXCONTEXT pDXContext;
2066 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2067 AssertRCReturn(rc, rc);
2068
2069 SVGA3dStreamOutputId const soid = pCmd->soid;
2070
2071 ASSERT_GUEST_RETURN(pDXContext->cot.paStreamOutput, VERR_INVALID_STATE);
2072 ASSERT_GUEST_RETURN( soid == SVGA_ID_INVALID
2073 || soid < pDXContext->cot.cStreamOutput, VERR_INVALID_PARAMETER);
2074 RT_UNTRUSTED_VALIDATED_FENCE();
2075
2076 pDXContext->svgaDXContext.streamOut.soid = soid;
2077
2078 rc = pSvgaR3State->pFuncsDX->pfnDXSetStreamOutput(pThisCC, pDXContext, soid);
2079 return rc;
2080}
2081
2082
2083int vmsvga3dDXSetCOTable(PVGASTATECC pThisCC, SVGA3dCmdDXSetCOTable const *pCmd, PVMSVGAMOB pMob)
2084{
2085 int rc;
2086 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2087 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetCOTable, VERR_INVALID_STATE);
2088 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2089 AssertReturn(p3dState, VERR_INVALID_STATE);
2090
2091 PVMSVGA3DDXCONTEXT pDXContext;
2092 rc = vmsvga3dDXContextFromCid(p3dState, pCmd->cid, &pDXContext);
2093 AssertRCReturn(rc, rc);
2094 RT_UNTRUSTED_VALIDATED_FENCE();
2095
2096 ASSERT_GUEST_RETURN(pCmd->type < RT_ELEMENTS(pDXContext->aCOTMobs), VERR_INVALID_PARAMETER);
2097 RT_UNTRUSTED_VALIDATED_FENCE();
2098
2099 uint32_t validSizeInBytes;
2100 uint32_t cbCOT;
2101 if (pMob)
2102 {
2103 /* Bind a mob to the COTable. */
2104 validSizeInBytes = pCmd->validSizeInBytes;
2105 cbCOT = vmsvgaR3MobSize(pMob);
2106
2107 ASSERT_GUEST_RETURN(validSizeInBytes <= cbCOT, VERR_INVALID_PARAMETER);
2108 RT_UNTRUSTED_VALIDATED_FENCE();
2109
2110 /* Create a memory pointer, which is accessible by host. */
2111 rc = vmsvgaR3MobBackingStoreCreate(pSvgaR3State, pMob, validSizeInBytes);
2112 }
2113 else
2114 {
2115 /* Unbind. */
2116 validSizeInBytes = 0;
2117 cbCOT = 0;
2118 vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pDXContext->aCOTMobs[pCmd->type]);
2119 }
2120
2121 uint32_t cEntries = 0;
2122 uint32_t cValidEntries = 0;
2123 if (RT_SUCCESS(rc))
2124 {
2125 static uint32_t const s_acbEntry[SVGA_COTABLE_MAX] =
2126 {
2127 sizeof(SVGACOTableDXRTViewEntry),
2128 sizeof(SVGACOTableDXDSViewEntry),
2129 sizeof(SVGACOTableDXSRViewEntry),
2130 sizeof(SVGACOTableDXElementLayoutEntry),
2131 sizeof(SVGACOTableDXBlendStateEntry),
2132 sizeof(SVGACOTableDXDepthStencilEntry),
2133 sizeof(SVGACOTableDXRasterizerStateEntry),
2134 sizeof(SVGACOTableDXSamplerEntry),
2135 sizeof(SVGACOTableDXStreamOutputEntry),
2136 sizeof(SVGACOTableDXQueryEntry),
2137 sizeof(SVGACOTableDXShaderEntry),
2138 sizeof(SVGACOTableDXUAViewEntry),
2139 };
2140
2141 cEntries = cbCOT / s_acbEntry[pCmd->type];
2142 cValidEntries = validSizeInBytes / s_acbEntry[pCmd->type];
2143 }
2144
2145 if (RT_SUCCESS(rc))
2146 {
2147 pDXContext->aCOTMobs[pCmd->type] = pMob;
2148
2149 void *pvCOT = vmsvgaR3MobBackingStorePtr(pMob, 0);
2150 switch (pCmd->type)
2151 {
2152 case SVGA_COTABLE_RTVIEW:
2153 pDXContext->cot.paRTView = (SVGACOTableDXRTViewEntry *)pvCOT;
2154 pDXContext->cot.cRTView = cEntries;
2155 break;
2156 case SVGA_COTABLE_DSVIEW:
2157 pDXContext->cot.paDSView = (SVGACOTableDXDSViewEntry *)pvCOT;
2158 pDXContext->cot.cDSView = cEntries;
2159 break;
2160 case SVGA_COTABLE_SRVIEW:
2161 pDXContext->cot.paSRView = (SVGACOTableDXSRViewEntry *)pvCOT;
2162 pDXContext->cot.cSRView = cEntries;
2163 break;
2164 case SVGA_COTABLE_ELEMENTLAYOUT:
2165 pDXContext->cot.paElementLayout = (SVGACOTableDXElementLayoutEntry *)pvCOT;
2166 pDXContext->cot.cElementLayout = cEntries;
2167 break;
2168 case SVGA_COTABLE_BLENDSTATE:
2169 pDXContext->cot.paBlendState = (SVGACOTableDXBlendStateEntry *)pvCOT;
2170 pDXContext->cot.cBlendState = cEntries;
2171 break;
2172 case SVGA_COTABLE_DEPTHSTENCIL:
2173 pDXContext->cot.paDepthStencil = (SVGACOTableDXDepthStencilEntry *)pvCOT;
2174 pDXContext->cot.cDepthStencil = cEntries;
2175 break;
2176 case SVGA_COTABLE_RASTERIZERSTATE:
2177 pDXContext->cot.paRasterizerState = (SVGACOTableDXRasterizerStateEntry *)pvCOT;
2178 pDXContext->cot.cRasterizerState = cEntries;
2179 break;
2180 case SVGA_COTABLE_SAMPLER:
2181 pDXContext->cot.paSampler = (SVGACOTableDXSamplerEntry *)pvCOT;
2182 pDXContext->cot.cSampler = cEntries;
2183 break;
2184 case SVGA_COTABLE_STREAMOUTPUT:
2185 pDXContext->cot.paStreamOutput = (SVGACOTableDXStreamOutputEntry *)pvCOT;
2186 pDXContext->cot.cStreamOutput = cEntries;
2187 break;
2188 case SVGA_COTABLE_DXQUERY:
2189 pDXContext->cot.paQuery = (SVGACOTableDXQueryEntry *)pvCOT;
2190 pDXContext->cot.cQuery = cEntries;
2191 break;
2192 case SVGA_COTABLE_DXSHADER:
2193 pDXContext->cot.paShader = (SVGACOTableDXShaderEntry *)pvCOT;
2194 pDXContext->cot.cShader = cEntries;
2195
2196 /* Create host array for information about shaders. */
2197 RTMemFree(pDXContext->paShader);
2198 pDXContext->paShader = NULL;
2199
2200 if (pDXContext->cot.cShader)
2201 {
2202 pDXContext->paShader = (PVMSVGA3DSHADER)RTMemAllocZ(pDXContext->cot.cShader * sizeof(VMSVGA3DSHADER));
2203 AssertReturn(pDXContext->paShader, VERR_NO_MEMORY);
2204 for (uint32_t i = 0; i < pDXContext->cot.cShader; ++i)
2205 pDXContext->paShader[i].id = SVGA_ID_INVALID;
2206 }
2207 break;
2208 case SVGA_COTABLE_UAVIEW:
2209 pDXContext->cot.paUAView = (SVGACOTableDXUAViewEntry *)pvCOT;
2210 pDXContext->cot.cUAView = cEntries;
2211 break;
2212 case SVGA_COTABLE_MAX: break; /* Compiler warning */
2213 }
2214 }
2215 else
2216 vmsvgaR3MobBackingStoreDelete(pSvgaR3State, pMob);
2217
2218 /* Notify the backend. */
2219 if (RT_SUCCESS(rc))
2220 rc = pSvgaR3State->pFuncsDX->pfnDXSetCOTable(pThisCC, pDXContext, pCmd->type, cValidEntries);
2221
2222 return rc;
2223}
2224
2225
2226int vmsvga3dDXReadbackCOTable(PVGASTATECC pThisCC, SVGA3dCmdDXReadbackCOTable const *pCmd)
2227{
2228 int rc;
2229 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2230 AssertReturn(pSvgaR3State->pFuncsDX, VERR_INVALID_STATE);
2231 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2232 AssertReturn(p3dState, VERR_INVALID_STATE);
2233
2234 PVMSVGA3DDXCONTEXT pDXContext;
2235 rc = vmsvga3dDXContextFromCid(p3dState, pCmd->cid, &pDXContext);
2236 AssertRCReturn(rc, rc);
2237 RT_UNTRUSTED_VALIDATED_FENCE();
2238
2239 ASSERT_GUEST_RETURN(pCmd->type < RT_ELEMENTS(pDXContext->aCOTMobs), VERR_INVALID_PARAMETER);
2240 RT_UNTRUSTED_VALIDATED_FENCE();
2241
2242 PVMSVGAMOB pMob = pDXContext->aCOTMobs[pCmd->type];
2243 rc = vmsvgaR3MobBackingStoreWriteToGuest(pSvgaR3State, pMob);
2244 return rc;
2245}
2246
2247
2248int vmsvga3dDXBufferCopy(PVGASTATECC pThisCC, uint32_t idDXContext)
2249{
2250 int rc;
2251 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2252 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBufferCopy, VERR_INVALID_STATE);
2253 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2254 AssertReturn(p3dState, VERR_INVALID_STATE);
2255
2256 PVMSVGA3DDXCONTEXT pDXContext;
2257 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2258 AssertRCReturn(rc, rc);
2259
2260 rc = pSvgaR3State->pFuncsDX->pfnDXBufferCopy(pThisCC, pDXContext);
2261 return rc;
2262}
2263
2264
2265int vmsvga3dDXSurfaceCopyAndReadback(PVGASTATECC pThisCC, uint32_t idDXContext)
2266{
2267 int rc;
2268 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2269 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSurfaceCopyAndReadback, VERR_INVALID_STATE);
2270 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2271 AssertReturn(p3dState, VERR_INVALID_STATE);
2272
2273 PVMSVGA3DDXCONTEXT pDXContext;
2274 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2275 AssertRCReturn(rc, rc);
2276
2277 rc = pSvgaR3State->pFuncsDX->pfnDXSurfaceCopyAndReadback(pThisCC, pDXContext);
2278 return rc;
2279}
2280
2281
2282int vmsvga3dDXMoveQuery(PVGASTATECC pThisCC, uint32_t idDXContext)
2283{
2284 int rc;
2285 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2286 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXMoveQuery, VERR_INVALID_STATE);
2287 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2288 AssertReturn(p3dState, VERR_INVALID_STATE);
2289
2290 PVMSVGA3DDXCONTEXT pDXContext;
2291 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2292 AssertRCReturn(rc, rc);
2293
2294 rc = pSvgaR3State->pFuncsDX->pfnDXMoveQuery(pThisCC, pDXContext);
2295 return rc;
2296}
2297
2298
2299int vmsvga3dDXBindAllQuery(PVGASTATECC pThisCC, uint32_t idDXContext)
2300{
2301 int rc;
2302 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2303 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindAllQuery, VERR_INVALID_STATE);
2304 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2305 AssertReturn(p3dState, VERR_INVALID_STATE);
2306
2307 PVMSVGA3DDXCONTEXT pDXContext;
2308 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2309 AssertRCReturn(rc, rc);
2310
2311 rc = pSvgaR3State->pFuncsDX->pfnDXBindAllQuery(pThisCC, pDXContext);
2312 return rc;
2313}
2314
2315
2316int vmsvga3dDXReadbackAllQuery(PVGASTATECC pThisCC, uint32_t idDXContext)
2317{
2318 int rc;
2319 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2320 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXReadbackAllQuery, VERR_INVALID_STATE);
2321 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2322 AssertReturn(p3dState, VERR_INVALID_STATE);
2323
2324 PVMSVGA3DDXCONTEXT pDXContext;
2325 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2326 AssertRCReturn(rc, rc);
2327
2328 rc = pSvgaR3State->pFuncsDX->pfnDXReadbackAllQuery(pThisCC, pDXContext);
2329 return rc;
2330}
2331
2332
2333int vmsvga3dDXMobFence64(PVGASTATECC pThisCC, uint32_t idDXContext)
2334{
2335 int rc;
2336 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2337 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXMobFence64, VERR_INVALID_STATE);
2338 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2339 AssertReturn(p3dState, VERR_INVALID_STATE);
2340
2341 PVMSVGA3DDXCONTEXT pDXContext;
2342 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2343 AssertRCReturn(rc, rc);
2344
2345 rc = pSvgaR3State->pFuncsDX->pfnDXMobFence64(pThisCC, pDXContext);
2346 return rc;
2347}
2348
2349
2350int vmsvga3dDXBindAllShader(PVGASTATECC pThisCC, uint32_t idDXContext)
2351{
2352 int rc;
2353 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2354 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindAllShader, VERR_INVALID_STATE);
2355 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2356 AssertReturn(p3dState, VERR_INVALID_STATE);
2357
2358 PVMSVGA3DDXCONTEXT pDXContext;
2359 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2360 AssertRCReturn(rc, rc);
2361
2362 rc = pSvgaR3State->pFuncsDX->pfnDXBindAllShader(pThisCC, pDXContext);
2363 return rc;
2364}
2365
2366
2367int vmsvga3dDXHint(PVGASTATECC pThisCC, uint32_t idDXContext)
2368{
2369 int rc;
2370 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2371 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXHint, VERR_INVALID_STATE);
2372 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2373 AssertReturn(p3dState, VERR_INVALID_STATE);
2374
2375 PVMSVGA3DDXCONTEXT pDXContext;
2376 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2377 AssertRCReturn(rc, rc);
2378
2379 rc = pSvgaR3State->pFuncsDX->pfnDXHint(pThisCC, pDXContext);
2380 return rc;
2381}
2382
2383
2384int vmsvga3dDXBufferUpdate(PVGASTATECC pThisCC, uint32_t idDXContext)
2385{
2386 int rc;
2387 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2388 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBufferUpdate, VERR_INVALID_STATE);
2389 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2390 AssertReturn(p3dState, VERR_INVALID_STATE);
2391
2392 PVMSVGA3DDXCONTEXT pDXContext;
2393 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2394 AssertRCReturn(rc, rc);
2395
2396 rc = pSvgaR3State->pFuncsDX->pfnDXBufferUpdate(pThisCC, pDXContext);
2397 return rc;
2398}
2399
2400
2401int vmsvga3dDXSetVSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext)
2402{
2403 int rc;
2404 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2405 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetVSConstantBufferOffset, VERR_INVALID_STATE);
2406 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2407 AssertReturn(p3dState, VERR_INVALID_STATE);
2408
2409 PVMSVGA3DDXCONTEXT pDXContext;
2410 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2411 AssertRCReturn(rc, rc);
2412
2413 rc = pSvgaR3State->pFuncsDX->pfnDXSetVSConstantBufferOffset(pThisCC, pDXContext);
2414 return rc;
2415}
2416
2417
2418int vmsvga3dDXSetPSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext)
2419{
2420 int rc;
2421 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2422 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetPSConstantBufferOffset, VERR_INVALID_STATE);
2423 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2424 AssertReturn(p3dState, VERR_INVALID_STATE);
2425
2426 PVMSVGA3DDXCONTEXT pDXContext;
2427 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2428 AssertRCReturn(rc, rc);
2429
2430 rc = pSvgaR3State->pFuncsDX->pfnDXSetPSConstantBufferOffset(pThisCC, pDXContext);
2431 return rc;
2432}
2433
2434
2435int vmsvga3dDXSetGSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext)
2436{
2437 int rc;
2438 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2439 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetGSConstantBufferOffset, VERR_INVALID_STATE);
2440 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2441 AssertReturn(p3dState, VERR_INVALID_STATE);
2442
2443 PVMSVGA3DDXCONTEXT pDXContext;
2444 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2445 AssertRCReturn(rc, rc);
2446
2447 rc = pSvgaR3State->pFuncsDX->pfnDXSetGSConstantBufferOffset(pThisCC, pDXContext);
2448 return rc;
2449}
2450
2451
2452int vmsvga3dDXSetHSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext)
2453{
2454 int rc;
2455 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2456 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetHSConstantBufferOffset, VERR_INVALID_STATE);
2457 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2458 AssertReturn(p3dState, VERR_INVALID_STATE);
2459
2460 PVMSVGA3DDXCONTEXT pDXContext;
2461 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2462 AssertRCReturn(rc, rc);
2463
2464 rc = pSvgaR3State->pFuncsDX->pfnDXSetHSConstantBufferOffset(pThisCC, pDXContext);
2465 return rc;
2466}
2467
2468
2469int vmsvga3dDXSetDSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext)
2470{
2471 int rc;
2472 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2473 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetDSConstantBufferOffset, VERR_INVALID_STATE);
2474 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2475 AssertReturn(p3dState, VERR_INVALID_STATE);
2476
2477 PVMSVGA3DDXCONTEXT pDXContext;
2478 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2479 AssertRCReturn(rc, rc);
2480
2481 rc = pSvgaR3State->pFuncsDX->pfnDXSetDSConstantBufferOffset(pThisCC, pDXContext);
2482 return rc;
2483}
2484
2485
2486int vmsvga3dDXSetCSConstantBufferOffset(PVGASTATECC pThisCC, uint32_t idDXContext)
2487{
2488 int rc;
2489 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2490 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetCSConstantBufferOffset, VERR_INVALID_STATE);
2491 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2492 AssertReturn(p3dState, VERR_INVALID_STATE);
2493
2494 PVMSVGA3DDXCONTEXT pDXContext;
2495 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2496 AssertRCReturn(rc, rc);
2497
2498 rc = pSvgaR3State->pFuncsDX->pfnDXSetCSConstantBufferOffset(pThisCC, pDXContext);
2499 return rc;
2500}
2501
2502
2503int vmsvga3dDXCondBindAllShader(PVGASTATECC pThisCC, uint32_t idDXContext)
2504{
2505 int rc;
2506 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2507 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXCondBindAllShader, VERR_INVALID_STATE);
2508 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2509 AssertReturn(p3dState, VERR_INVALID_STATE);
2510
2511 PVMSVGA3DDXCONTEXT pDXContext;
2512 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2513 AssertRCReturn(rc, rc);
2514
2515 rc = pSvgaR3State->pFuncsDX->pfnDXCondBindAllShader(pThisCC, pDXContext);
2516 return rc;
2517}
2518
2519
2520int vmsvga3dScreenCopy(PVGASTATECC pThisCC, uint32_t idDXContext)
2521{
2522 int rc;
2523 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2524 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnScreenCopy, VERR_INVALID_STATE);
2525 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2526 AssertReturn(p3dState, VERR_INVALID_STATE);
2527
2528 PVMSVGA3DDXCONTEXT pDXContext;
2529 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2530 AssertRCReturn(rc, rc);
2531
2532 rc = pSvgaR3State->pFuncsDX->pfnScreenCopy(pThisCC, pDXContext);
2533 return rc;
2534}
2535
2536
2537int vmsvga3dGrowOTable(PVGASTATECC pThisCC, uint32_t idDXContext)
2538{
2539 int rc;
2540 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2541 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnGrowOTable, VERR_INVALID_STATE);
2542 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2543 AssertReturn(p3dState, VERR_INVALID_STATE);
2544
2545 PVMSVGA3DDXCONTEXT pDXContext;
2546 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2547 AssertRCReturn(rc, rc);
2548
2549 rc = pSvgaR3State->pFuncsDX->pfnGrowOTable(pThisCC, pDXContext);
2550 return rc;
2551}
2552
2553
2554int vmsvga3dDXGrowCOTable(PVGASTATECC pThisCC, uint32_t idDXContext)
2555{
2556 int rc;
2557 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2558 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXGrowCOTable, VERR_INVALID_STATE);
2559 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2560 AssertReturn(p3dState, VERR_INVALID_STATE);
2561
2562 PVMSVGA3DDXCONTEXT pDXContext;
2563 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2564 AssertRCReturn(rc, rc);
2565
2566 rc = pSvgaR3State->pFuncsDX->pfnDXGrowCOTable(pThisCC, pDXContext);
2567 return rc;
2568}
2569
2570
2571int vmsvga3dIntraSurfaceCopy(PVGASTATECC pThisCC, uint32_t idDXContext)
2572{
2573 int rc;
2574 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2575 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnIntraSurfaceCopy, VERR_INVALID_STATE);
2576 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2577 AssertReturn(p3dState, VERR_INVALID_STATE);
2578
2579 PVMSVGA3DDXCONTEXT pDXContext;
2580 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2581 AssertRCReturn(rc, rc);
2582
2583 rc = pSvgaR3State->pFuncsDX->pfnIntraSurfaceCopy(pThisCC, pDXContext);
2584 return rc;
2585}
2586
2587
2588int vmsvga3dDefineGBSurface_v3(PVGASTATECC pThisCC, uint32_t idDXContext)
2589{
2590 int rc;
2591 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2592 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDefineGBSurface_v3, VERR_INVALID_STATE);
2593 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2594 AssertReturn(p3dState, VERR_INVALID_STATE);
2595
2596 PVMSVGA3DDXCONTEXT pDXContext;
2597 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2598 AssertRCReturn(rc, rc);
2599
2600 rc = pSvgaR3State->pFuncsDX->pfnDefineGBSurface_v3(pThisCC, pDXContext);
2601 return rc;
2602}
2603
2604
2605int vmsvga3dDXResolveCopy(PVGASTATECC pThisCC, uint32_t idDXContext)
2606{
2607 int rc;
2608 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2609 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXResolveCopy, VERR_INVALID_STATE);
2610 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2611 AssertReturn(p3dState, VERR_INVALID_STATE);
2612
2613 PVMSVGA3DDXCONTEXT pDXContext;
2614 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2615 AssertRCReturn(rc, rc);
2616
2617 rc = pSvgaR3State->pFuncsDX->pfnDXResolveCopy(pThisCC, pDXContext);
2618 return rc;
2619}
2620
2621
2622int vmsvga3dDXPredResolveCopy(PVGASTATECC pThisCC, uint32_t idDXContext)
2623{
2624 int rc;
2625 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2626 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXPredResolveCopy, VERR_INVALID_STATE);
2627 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2628 AssertReturn(p3dState, VERR_INVALID_STATE);
2629
2630 PVMSVGA3DDXCONTEXT pDXContext;
2631 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2632 AssertRCReturn(rc, rc);
2633
2634 rc = pSvgaR3State->pFuncsDX->pfnDXPredResolveCopy(pThisCC, pDXContext);
2635 return rc;
2636}
2637
2638
2639int vmsvga3dDXPredConvertRegion(PVGASTATECC pThisCC, uint32_t idDXContext)
2640{
2641 int rc;
2642 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2643 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXPredConvertRegion, VERR_INVALID_STATE);
2644 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2645 AssertReturn(p3dState, VERR_INVALID_STATE);
2646
2647 PVMSVGA3DDXCONTEXT pDXContext;
2648 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2649 AssertRCReturn(rc, rc);
2650
2651 rc = pSvgaR3State->pFuncsDX->pfnDXPredConvertRegion(pThisCC, pDXContext);
2652 return rc;
2653}
2654
2655
2656int vmsvga3dDXPredConvert(PVGASTATECC pThisCC, uint32_t idDXContext)
2657{
2658 int rc;
2659 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2660 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXPredConvert, VERR_INVALID_STATE);
2661 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2662 AssertReturn(p3dState, VERR_INVALID_STATE);
2663
2664 PVMSVGA3DDXCONTEXT pDXContext;
2665 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2666 AssertRCReturn(rc, rc);
2667
2668 rc = pSvgaR3State->pFuncsDX->pfnDXPredConvert(pThisCC, pDXContext);
2669 return rc;
2670}
2671
2672
2673int vmsvga3dWholeSurfaceCopy(PVGASTATECC pThisCC, uint32_t idDXContext)
2674{
2675 int rc;
2676 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2677 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnWholeSurfaceCopy, VERR_INVALID_STATE);
2678 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2679 AssertReturn(p3dState, VERR_INVALID_STATE);
2680
2681 PVMSVGA3DDXCONTEXT pDXContext;
2682 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2683 AssertRCReturn(rc, rc);
2684
2685 rc = pSvgaR3State->pFuncsDX->pfnWholeSurfaceCopy(pThisCC, pDXContext);
2686 return rc;
2687}
2688
2689
2690int vmsvga3dDXDefineUAView(PVGASTATECC pThisCC, uint32_t idDXContext)
2691{
2692 int rc;
2693 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2694 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineUAView, VERR_INVALID_STATE);
2695 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2696 AssertReturn(p3dState, VERR_INVALID_STATE);
2697
2698 PVMSVGA3DDXCONTEXT pDXContext;
2699 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2700 AssertRCReturn(rc, rc);
2701
2702 rc = pSvgaR3State->pFuncsDX->pfnDXDefineUAView(pThisCC, pDXContext);
2703 return rc;
2704}
2705
2706
2707int vmsvga3dDXDestroyUAView(PVGASTATECC pThisCC, uint32_t idDXContext)
2708{
2709 int rc;
2710 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2711 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDestroyUAView, VERR_INVALID_STATE);
2712 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2713 AssertReturn(p3dState, VERR_INVALID_STATE);
2714
2715 PVMSVGA3DDXCONTEXT pDXContext;
2716 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2717 AssertRCReturn(rc, rc);
2718
2719 rc = pSvgaR3State->pFuncsDX->pfnDXDestroyUAView(pThisCC, pDXContext);
2720 return rc;
2721}
2722
2723
2724int vmsvga3dDXClearUAViewUint(PVGASTATECC pThisCC, uint32_t idDXContext)
2725{
2726 int rc;
2727 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2728 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXClearUAViewUint, VERR_INVALID_STATE);
2729 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2730 AssertReturn(p3dState, VERR_INVALID_STATE);
2731
2732 PVMSVGA3DDXCONTEXT pDXContext;
2733 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2734 AssertRCReturn(rc, rc);
2735
2736 rc = pSvgaR3State->pFuncsDX->pfnDXClearUAViewUint(pThisCC, pDXContext);
2737 return rc;
2738}
2739
2740
2741int vmsvga3dDXClearUAViewFloat(PVGASTATECC pThisCC, uint32_t idDXContext)
2742{
2743 int rc;
2744 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2745 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXClearUAViewFloat, 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 rc = pSvgaR3State->pFuncsDX->pfnDXClearUAViewFloat(pThisCC, pDXContext);
2754 return rc;
2755}
2756
2757
2758int vmsvga3dDXCopyStructureCount(PVGASTATECC pThisCC, uint32_t idDXContext)
2759{
2760 int rc;
2761 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2762 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXCopyStructureCount, VERR_INVALID_STATE);
2763 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2764 AssertReturn(p3dState, VERR_INVALID_STATE);
2765
2766 PVMSVGA3DDXCONTEXT pDXContext;
2767 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2768 AssertRCReturn(rc, rc);
2769
2770 rc = pSvgaR3State->pFuncsDX->pfnDXCopyStructureCount(pThisCC, pDXContext);
2771 return rc;
2772}
2773
2774
2775int vmsvga3dDXSetUAViews(PVGASTATECC pThisCC, uint32_t idDXContext)
2776{
2777 int rc;
2778 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2779 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetUAViews, VERR_INVALID_STATE);
2780 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2781 AssertReturn(p3dState, VERR_INVALID_STATE);
2782
2783 PVMSVGA3DDXCONTEXT pDXContext;
2784 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2785 AssertRCReturn(rc, rc);
2786
2787 rc = pSvgaR3State->pFuncsDX->pfnDXSetUAViews(pThisCC, pDXContext);
2788 return rc;
2789}
2790
2791
2792int vmsvga3dDXDrawIndexedInstancedIndirect(PVGASTATECC pThisCC, uint32_t idDXContext)
2793{
2794 int rc;
2795 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2796 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDrawIndexedInstancedIndirect, VERR_INVALID_STATE);
2797 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2798 AssertReturn(p3dState, VERR_INVALID_STATE);
2799
2800 PVMSVGA3DDXCONTEXT pDXContext;
2801 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2802 AssertRCReturn(rc, rc);
2803
2804 rc = pSvgaR3State->pFuncsDX->pfnDXDrawIndexedInstancedIndirect(pThisCC, pDXContext);
2805 return rc;
2806}
2807
2808
2809int vmsvga3dDXDrawInstancedIndirect(PVGASTATECC pThisCC, uint32_t idDXContext)
2810{
2811 int rc;
2812 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2813 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDrawInstancedIndirect, VERR_INVALID_STATE);
2814 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2815 AssertReturn(p3dState, VERR_INVALID_STATE);
2816
2817 PVMSVGA3DDXCONTEXT pDXContext;
2818 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2819 AssertRCReturn(rc, rc);
2820
2821 rc = pSvgaR3State->pFuncsDX->pfnDXDrawInstancedIndirect(pThisCC, pDXContext);
2822 return rc;
2823}
2824
2825
2826int vmsvga3dDXDispatch(PVGASTATECC pThisCC, uint32_t idDXContext)
2827{
2828 int rc;
2829 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2830 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDispatch, VERR_INVALID_STATE);
2831 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2832 AssertReturn(p3dState, VERR_INVALID_STATE);
2833
2834 PVMSVGA3DDXCONTEXT pDXContext;
2835 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2836 AssertRCReturn(rc, rc);
2837
2838 rc = pSvgaR3State->pFuncsDX->pfnDXDispatch(pThisCC, pDXContext);
2839 return rc;
2840}
2841
2842
2843int vmsvga3dDXDispatchIndirect(PVGASTATECC pThisCC, uint32_t idDXContext)
2844{
2845 int rc;
2846 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2847 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDispatchIndirect, VERR_INVALID_STATE);
2848 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2849 AssertReturn(p3dState, VERR_INVALID_STATE);
2850
2851 PVMSVGA3DDXCONTEXT pDXContext;
2852 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2853 AssertRCReturn(rc, rc);
2854
2855 rc = pSvgaR3State->pFuncsDX->pfnDXDispatchIndirect(pThisCC, pDXContext);
2856 return rc;
2857}
2858
2859
2860int vmsvga3dWriteZeroSurface(PVGASTATECC pThisCC, uint32_t idDXContext)
2861{
2862 int rc;
2863 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2864 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnWriteZeroSurface, VERR_INVALID_STATE);
2865 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2866 AssertReturn(p3dState, VERR_INVALID_STATE);
2867
2868 PVMSVGA3DDXCONTEXT pDXContext;
2869 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2870 AssertRCReturn(rc, rc);
2871
2872 rc = pSvgaR3State->pFuncsDX->pfnWriteZeroSurface(pThisCC, pDXContext);
2873 return rc;
2874}
2875
2876
2877int vmsvga3dHintZeroSurface(PVGASTATECC pThisCC, uint32_t idDXContext)
2878{
2879 int rc;
2880 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2881 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnHintZeroSurface, VERR_INVALID_STATE);
2882 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2883 AssertReturn(p3dState, VERR_INVALID_STATE);
2884
2885 PVMSVGA3DDXCONTEXT pDXContext;
2886 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2887 AssertRCReturn(rc, rc);
2888
2889 rc = pSvgaR3State->pFuncsDX->pfnHintZeroSurface(pThisCC, pDXContext);
2890 return rc;
2891}
2892
2893
2894int vmsvga3dDXTransferToBuffer(PVGASTATECC pThisCC, uint32_t idDXContext)
2895{
2896 int rc;
2897 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2898 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXTransferToBuffer, VERR_INVALID_STATE);
2899 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2900 AssertReturn(p3dState, VERR_INVALID_STATE);
2901
2902 PVMSVGA3DDXCONTEXT pDXContext;
2903 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2904 AssertRCReturn(rc, rc);
2905
2906 rc = pSvgaR3State->pFuncsDX->pfnDXTransferToBuffer(pThisCC, pDXContext);
2907 return rc;
2908}
2909
2910
2911int vmsvga3dDXSetStructureCount(PVGASTATECC pThisCC, uint32_t idDXContext)
2912{
2913 int rc;
2914 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2915 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetStructureCount, VERR_INVALID_STATE);
2916 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2917 AssertReturn(p3dState, VERR_INVALID_STATE);
2918
2919 PVMSVGA3DDXCONTEXT pDXContext;
2920 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2921 AssertRCReturn(rc, rc);
2922
2923 rc = pSvgaR3State->pFuncsDX->pfnDXSetStructureCount(pThisCC, pDXContext);
2924 return rc;
2925}
2926
2927
2928int vmsvga3dLogicOpsBitBlt(PVGASTATECC pThisCC, uint32_t idDXContext)
2929{
2930 int rc;
2931 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2932 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnLogicOpsBitBlt, VERR_INVALID_STATE);
2933 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2934 AssertReturn(p3dState, VERR_INVALID_STATE);
2935
2936 PVMSVGA3DDXCONTEXT pDXContext;
2937 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2938 AssertRCReturn(rc, rc);
2939
2940 rc = pSvgaR3State->pFuncsDX->pfnLogicOpsBitBlt(pThisCC, pDXContext);
2941 return rc;
2942}
2943
2944
2945int vmsvga3dLogicOpsTransBlt(PVGASTATECC pThisCC, uint32_t idDXContext)
2946{
2947 int rc;
2948 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2949 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnLogicOpsTransBlt, VERR_INVALID_STATE);
2950 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2951 AssertReturn(p3dState, VERR_INVALID_STATE);
2952
2953 PVMSVGA3DDXCONTEXT pDXContext;
2954 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2955 AssertRCReturn(rc, rc);
2956
2957 rc = pSvgaR3State->pFuncsDX->pfnLogicOpsTransBlt(pThisCC, pDXContext);
2958 return rc;
2959}
2960
2961
2962int vmsvga3dLogicOpsStretchBlt(PVGASTATECC pThisCC, uint32_t idDXContext)
2963{
2964 int rc;
2965 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2966 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnLogicOpsStretchBlt, VERR_INVALID_STATE);
2967 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2968 AssertReturn(p3dState, VERR_INVALID_STATE);
2969
2970 PVMSVGA3DDXCONTEXT pDXContext;
2971 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2972 AssertRCReturn(rc, rc);
2973
2974 rc = pSvgaR3State->pFuncsDX->pfnLogicOpsStretchBlt(pThisCC, pDXContext);
2975 return rc;
2976}
2977
2978
2979int vmsvga3dLogicOpsColorFill(PVGASTATECC pThisCC, uint32_t idDXContext)
2980{
2981 int rc;
2982 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
2983 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnLogicOpsColorFill, VERR_INVALID_STATE);
2984 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
2985 AssertReturn(p3dState, VERR_INVALID_STATE);
2986
2987 PVMSVGA3DDXCONTEXT pDXContext;
2988 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
2989 AssertRCReturn(rc, rc);
2990
2991 rc = pSvgaR3State->pFuncsDX->pfnLogicOpsColorFill(pThisCC, pDXContext);
2992 return rc;
2993}
2994
2995
2996int vmsvga3dLogicOpsAlphaBlend(PVGASTATECC pThisCC, uint32_t idDXContext)
2997{
2998 int rc;
2999 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3000 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnLogicOpsAlphaBlend, VERR_INVALID_STATE);
3001 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3002 AssertReturn(p3dState, VERR_INVALID_STATE);
3003
3004 PVMSVGA3DDXCONTEXT pDXContext;
3005 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3006 AssertRCReturn(rc, rc);
3007
3008 rc = pSvgaR3State->pFuncsDX->pfnLogicOpsAlphaBlend(pThisCC, pDXContext);
3009 return rc;
3010}
3011
3012
3013int vmsvga3dLogicOpsClearTypeBlend(PVGASTATECC pThisCC, uint32_t idDXContext)
3014{
3015 int rc;
3016 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3017 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnLogicOpsClearTypeBlend, VERR_INVALID_STATE);
3018 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3019 AssertReturn(p3dState, VERR_INVALID_STATE);
3020
3021 PVMSVGA3DDXCONTEXT pDXContext;
3022 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3023 AssertRCReturn(rc, rc);
3024
3025 rc = pSvgaR3State->pFuncsDX->pfnLogicOpsClearTypeBlend(pThisCC, pDXContext);
3026 return rc;
3027}
3028
3029
3030int vmsvga3dDefineGBSurface_v4(PVGASTATECC pThisCC, uint32_t idDXContext)
3031{
3032 int rc;
3033 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3034 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDefineGBSurface_v4, VERR_INVALID_STATE);
3035 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3036 AssertReturn(p3dState, VERR_INVALID_STATE);
3037
3038 PVMSVGA3DDXCONTEXT pDXContext;
3039 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3040 AssertRCReturn(rc, rc);
3041
3042 rc = pSvgaR3State->pFuncsDX->pfnDefineGBSurface_v4(pThisCC, pDXContext);
3043 return rc;
3044}
3045
3046
3047int vmsvga3dDXSetCSUAViews(PVGASTATECC pThisCC, uint32_t idDXContext)
3048{
3049 int rc;
3050 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3051 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetCSUAViews, VERR_INVALID_STATE);
3052 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3053 AssertReturn(p3dState, VERR_INVALID_STATE);
3054
3055 PVMSVGA3DDXCONTEXT pDXContext;
3056 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3057 AssertRCReturn(rc, rc);
3058
3059 rc = pSvgaR3State->pFuncsDX->pfnDXSetCSUAViews(pThisCC, pDXContext);
3060 return rc;
3061}
3062
3063
3064int vmsvga3dDXSetMinLOD(PVGASTATECC pThisCC, uint32_t idDXContext)
3065{
3066 int rc;
3067 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3068 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetMinLOD, VERR_INVALID_STATE);
3069 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3070 AssertReturn(p3dState, VERR_INVALID_STATE);
3071
3072 PVMSVGA3DDXCONTEXT pDXContext;
3073 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3074 AssertRCReturn(rc, rc);
3075
3076 rc = pSvgaR3State->pFuncsDX->pfnDXSetMinLOD(pThisCC, pDXContext);
3077 return rc;
3078}
3079
3080
3081int vmsvga3dDXDefineStreamOutputWithMob(PVGASTATECC pThisCC, uint32_t idDXContext)
3082{
3083 int rc;
3084 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3085 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXDefineStreamOutputWithMob, VERR_INVALID_STATE);
3086 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3087 AssertReturn(p3dState, VERR_INVALID_STATE);
3088
3089 PVMSVGA3DDXCONTEXT pDXContext;
3090 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3091 AssertRCReturn(rc, rc);
3092
3093 rc = pSvgaR3State->pFuncsDX->pfnDXDefineStreamOutputWithMob(pThisCC, pDXContext);
3094 return rc;
3095}
3096
3097
3098int vmsvga3dDXSetShaderIface(PVGASTATECC pThisCC, uint32_t idDXContext)
3099{
3100 int rc;
3101 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3102 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXSetShaderIface, VERR_INVALID_STATE);
3103 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3104 AssertReturn(p3dState, VERR_INVALID_STATE);
3105
3106 PVMSVGA3DDXCONTEXT pDXContext;
3107 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3108 AssertRCReturn(rc, rc);
3109
3110 rc = pSvgaR3State->pFuncsDX->pfnDXSetShaderIface(pThisCC, pDXContext);
3111 return rc;
3112}
3113
3114
3115int vmsvga3dDXBindStreamOutput(PVGASTATECC pThisCC, uint32_t idDXContext)
3116{
3117 int rc;
3118 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3119 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindStreamOutput, VERR_INVALID_STATE);
3120 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3121 AssertReturn(p3dState, VERR_INVALID_STATE);
3122
3123 PVMSVGA3DDXCONTEXT pDXContext;
3124 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3125 AssertRCReturn(rc, rc);
3126
3127 rc = pSvgaR3State->pFuncsDX->pfnDXBindStreamOutput(pThisCC, pDXContext);
3128 return rc;
3129}
3130
3131
3132int vmsvga3dSurfaceStretchBltNonMSToMS(PVGASTATECC pThisCC, uint32_t idDXContext)
3133{
3134 int rc;
3135 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3136 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnSurfaceStretchBltNonMSToMS, VERR_INVALID_STATE);
3137 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3138 AssertReturn(p3dState, VERR_INVALID_STATE);
3139
3140 PVMSVGA3DDXCONTEXT pDXContext;
3141 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3142 AssertRCReturn(rc, rc);
3143
3144 rc = pSvgaR3State->pFuncsDX->pfnSurfaceStretchBltNonMSToMS(pThisCC, pDXContext);
3145 return rc;
3146}
3147
3148
3149int vmsvga3dDXBindShaderIface(PVGASTATECC pThisCC, uint32_t idDXContext)
3150{
3151 int rc;
3152 PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
3153 AssertReturn(pSvgaR3State->pFuncsDX && pSvgaR3State->pFuncsDX->pfnDXBindShaderIface, VERR_INVALID_STATE);
3154 PVMSVGA3DSTATE p3dState = pThisCC->svga.p3dState;
3155 AssertReturn(p3dState, VERR_INVALID_STATE);
3156
3157 PVMSVGA3DDXCONTEXT pDXContext;
3158 rc = vmsvga3dDXContextFromCid(p3dState, idDXContext, &pDXContext);
3159 AssertRCReturn(rc, rc);
3160
3161 rc = pSvgaR3State->pFuncsDX->pfnDXBindShaderIface(pThisCC, pDXContext);
3162 return rc;
3163}
3164
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

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