1 /**********************************************************
2 * Copyright 2008-2013 VMware, Inc. All rights reserved.
4 * Permission is hereby granted, free of charge, to any person
5 * obtaining a copy of this software and associated documentation
6 * files (the "Software"), to deal in the Software without
7 * restriction, including without limitation the rights to use, copy,
8 * modify, merge, publish, distribute, sublicense, and/or sell copies
9 * of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 **********************************************************/
27 * @file svga_cmd_vgpu10.c
29 * Command construction utility for the vgpu10 SVGA3D protocol.
31 * \author Mingcheng Chen
36 #include "svga_winsys.h"
37 #include "svga_resource_buffer.h"
38 #include "svga_resource_texture.h"
39 #include "svga_surface.h"
44 * Emit a surface relocation for RenderTargetViewId
47 view_relocation(struct svga_winsys_context
*swc
, // IN
48 struct pipe_surface
*surface
, // IN
49 SVGA3dRenderTargetViewId
*id
, // OUT
53 struct svga_surface
*s
= svga_surface(surface
);
55 swc
->surface_relocation(swc
, id
, NULL
, s
->handle
, flags
);
58 swc
->surface_relocation(swc
, id
, NULL
, NULL
, flags
);
64 * Emit a surface relocation for a ResourceId.
67 surface_to_resourceid(struct svga_winsys_context
*swc
, // IN
68 struct svga_winsys_surface
*surface
, // IN
69 SVGA3dSurfaceId
*sid
, // OUT
73 swc
->surface_relocation(swc
, sid
, NULL
, surface
, flags
);
76 swc
->surface_relocation(swc
, sid
, NULL
, NULL
, flags
);
81 #define SVGA3D_CREATE_COMMAND(CommandName, CommandCode) \
82 SVGA3dCmdDX##CommandName *cmd; \
84 cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_##CommandCode, \
85 sizeof(SVGA3dCmdDX##CommandName), 0); \
87 return PIPE_ERROR_OUT_OF_MEMORY; \
90 #define SVGA3D_CREATE_CMD_COUNT(CommandName, CommandCode, ElementClassName) \
91 SVGA3dCmdDX##CommandName *cmd; \
94 cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_##CommandCode, \
95 sizeof(SVGA3dCmdDX##CommandName) + \
96 count * sizeof(ElementClassName), 0); \
98 return PIPE_ERROR_OUT_OF_MEMORY; \
101 #define SVGA3D_COPY_BASIC(VariableName) \
103 cmd->VariableName = VariableName; \
106 #define SVGA3D_COPY_BASIC_2(VariableName1, VariableName2) \
108 SVGA3D_COPY_BASIC(VariableName1); \
109 SVGA3D_COPY_BASIC(VariableName2); \
112 #define SVGA3D_COPY_BASIC_3(VariableName1, VariableName2, VariableName3) \
114 SVGA3D_COPY_BASIC_2(VariableName1, VariableName2); \
115 SVGA3D_COPY_BASIC(VariableName3); \
118 #define SVGA3D_COPY_BASIC_4(VariableName1, VariableName2, VariableName3, \
121 SVGA3D_COPY_BASIC_2(VariableName1, VariableName2); \
122 SVGA3D_COPY_BASIC_2(VariableName3, VariableName4); \
125 #define SVGA3D_COPY_BASIC_5(VariableName1, VariableName2, VariableName3, \
126 VariableName4, VariableName5) \
128 SVGA3D_COPY_BASIC_3(VariableName1, VariableName2, VariableName3); \
129 SVGA3D_COPY_BASIC_2(VariableName4, VariableName5); \
132 #define SVGA3D_COPY_BASIC_6(VariableName1, VariableName2, VariableName3, \
133 VariableName4, VariableName5, VariableName6) \
135 SVGA3D_COPY_BASIC_3(VariableName1, VariableName2, VariableName3); \
136 SVGA3D_COPY_BASIC_3(VariableName4, VariableName5, VariableName6); \
139 #define SVGA3D_COPY_BASIC_7(VariableName1, VariableName2, VariableName3, \
140 VariableName4, VariableName5, VariableName6, \
143 SVGA3D_COPY_BASIC_4(VariableName1, VariableName2, VariableName3, \
145 SVGA3D_COPY_BASIC_3(VariableName5, VariableName6, VariableName7); \
148 #define SVGA3D_COPY_BASIC_8(VariableName1, VariableName2, VariableName3, \
149 VariableName4, VariableName5, VariableName6, \
150 VariableName7, VariableName8) \
152 SVGA3D_COPY_BASIC_4(VariableName1, VariableName2, VariableName3, \
154 SVGA3D_COPY_BASIC_4(VariableName5, VariableName6, VariableName7, \
158 #define SVGA3D_COPY_BASIC_9(VariableName1, VariableName2, VariableName3, \
159 VariableName4, VariableName5, VariableName6, \
160 VariableName7, VariableName8, VariableName9) \
162 SVGA3D_COPY_BASIC_5(VariableName1, VariableName2, VariableName3, \
163 VariableName4, VariableName5); \
164 SVGA3D_COPY_BASIC_4(VariableName6, VariableName7, VariableName8, \
170 SVGA3D_vgpu10_PredCopyRegion(struct svga_winsys_context
*swc
,
171 struct svga_winsys_surface
*dstSurf
,
172 uint32 dstSubResource
,
173 struct svga_winsys_surface
*srcSurf
,
174 uint32 srcSubResource
,
175 const SVGA3dCopyBox
*box
)
177 SVGA3dCmdDXPredCopyRegion
*cmd
=
178 SVGA3D_FIFOReserve(swc
,
179 SVGA_3D_CMD_DX_PRED_COPY_REGION
,
180 sizeof(SVGA3dCmdDXPredCopyRegion
),
181 2); /* two relocations */
183 return PIPE_ERROR_OUT_OF_MEMORY
;
185 swc
->surface_relocation(swc
, &cmd
->dstSid
, NULL
, dstSurf
, SVGA_RELOC_WRITE
);
186 swc
->surface_relocation(swc
, &cmd
->srcSid
, NULL
, srcSurf
, SVGA_RELOC_READ
);
187 cmd
->dstSubResource
= dstSubResource
;
188 cmd
->srcSubResource
= srcSubResource
;
198 SVGA3D_vgpu10_PredCopy(struct svga_winsys_context
*swc
,
199 struct svga_winsys_surface
*dstSurf
,
200 struct svga_winsys_surface
*srcSurf
)
202 SVGA3dCmdDXPredCopy
*cmd
=
203 SVGA3D_FIFOReserve(swc
,
204 SVGA_3D_CMD_DX_PRED_COPY
,
205 sizeof(SVGA3dCmdDXPredCopy
),
206 2); /* two relocations */
208 return PIPE_ERROR_OUT_OF_MEMORY
;
210 swc
->surface_relocation(swc
, &cmd
->dstSid
, NULL
, dstSurf
, SVGA_RELOC_WRITE
);
211 swc
->surface_relocation(swc
, &cmd
->srcSid
, NULL
, srcSurf
, SVGA_RELOC_READ
);
219 SVGA3D_vgpu10_SetViewports(struct svga_winsys_context
*swc
,
221 const SVGA3dViewport
*viewports
)
223 SVGA3D_CREATE_CMD_COUNT(SetViewports
, SET_VIEWPORTS
, SVGA3dViewport
);
225 memcpy(cmd
+ 1, viewports
, count
* sizeof(SVGA3dViewport
));
233 SVGA3D_vgpu10_SetShader(struct svga_winsys_context
*swc
,
234 SVGA3dShaderType type
,
235 struct svga_winsys_gb_shader
*gbshader
,
236 SVGA3dShaderId shaderId
)
238 SVGA3dCmdDXSetShader
*cmd
= SVGA3D_FIFOReserve(swc
,
239 SVGA_3D_CMD_DX_SET_SHADER
,
241 1); /* one relocation */
243 return PIPE_ERROR_OUT_OF_MEMORY
;
245 swc
->shader_relocation(swc
, &cmd
->shaderId
, NULL
, NULL
, gbshader
, 0);
248 cmd
->shaderId
= shaderId
;
256 SVGA3D_vgpu10_SetShaderResources(struct svga_winsys_context
*swc
,
257 SVGA3dShaderType type
,
260 const SVGA3dShaderResourceViewId ids
[],
261 struct svga_winsys_surface
**views
)
263 SVGA3dCmdDXSetShaderResources
*cmd
;
264 SVGA3dShaderResourceViewId
*cmd_ids
;
267 cmd
= SVGA3D_FIFOReserve(swc
,
268 SVGA_3D_CMD_DX_SET_SHADER_RESOURCES
,
269 sizeof(SVGA3dCmdDXSetShaderResources
) +
270 count
* sizeof(SVGA3dShaderResourceViewId
),
271 count
); /* 'count' relocations */
273 return PIPE_ERROR_OUT_OF_MEMORY
;
277 cmd
->startView
= startView
;
279 cmd_ids
= (SVGA3dShaderResourceViewId
*) (cmd
+ 1);
280 for (i
= 0; i
< count
; i
++) {
281 swc
->surface_relocation(swc
, cmd_ids
+ i
, NULL
, views
[i
],
292 SVGA3D_vgpu10_SetSamplers(struct svga_winsys_context
*swc
,
295 SVGA3dShaderType type
,
296 const SVGA3dSamplerId
*samplerIds
)
298 SVGA3D_CREATE_CMD_COUNT(SetSamplers
, SET_SAMPLERS
, SVGA3dSamplerId
);
300 SVGA3D_COPY_BASIC_2(startSampler
, type
);
301 memcpy(cmd
+ 1, samplerIds
, count
* sizeof(SVGA3dSamplerId
));
309 SVGA3D_vgpu10_ClearRenderTargetView(struct svga_winsys_context
*swc
,
310 struct pipe_surface
*color_surf
,
313 SVGA3dCmdDXClearRenderTargetView
*cmd
;
314 struct svga_surface
*ss
= svga_surface(color_surf
);
316 cmd
= SVGA3D_FIFOReserve(swc
,
317 SVGA_3D_CMD_DX_CLEAR_RENDERTARGET_VIEW
,
318 sizeof(SVGA3dCmdDXClearRenderTargetView
),
319 1); /* one relocation */
321 return PIPE_ERROR_OUT_OF_MEMORY
;
324 /* NOTE: The following is pretty tricky. We need to emit a view/surface
325 * relocation and we have to provide a pointer to an ID which lies in
326 * the bounds of the command space which we just allocated. However,
327 * we then need to overwrite it with the original RenderTargetViewId.
329 view_relocation(swc
, color_surf
, &cmd
->renderTargetViewId
,
331 cmd
->renderTargetViewId
= ss
->view_id
;
333 COPY_4V(cmd
->rgba
.value
, rgba
);
341 SVGA3D_vgpu10_SetRenderTargets(struct svga_winsys_context
*swc
,
342 unsigned color_count
,
343 struct pipe_surface
**color_surfs
,
344 struct pipe_surface
*depth_stencil_surf
)
346 const unsigned surf_count
= color_count
+ 1;
347 SVGA3dCmdDXSetRenderTargets
*cmd
;
348 SVGA3dRenderTargetViewId
*ctarget
;
349 struct svga_surface
*ss
;
352 assert(surf_count
> 0);
354 cmd
= SVGA3D_FIFOReserve(swc
,
355 SVGA_3D_CMD_DX_SET_RENDERTARGETS
,
356 sizeof(SVGA3dCmdDXSetRenderTargets
) +
357 color_count
* sizeof(SVGA3dRenderTargetViewId
),
358 surf_count
); /* 'surf_count' relocations */
360 return PIPE_ERROR_OUT_OF_MEMORY
;
362 /* NOTE: See earlier comment about the tricky handling of the ViewIds.
365 /* Depth / Stencil buffer */
366 if (depth_stencil_surf
) {
367 ss
= svga_surface(depth_stencil_surf
);
368 view_relocation(swc
, depth_stencil_surf
, &cmd
->depthStencilViewId
,
370 cmd
->depthStencilViewId
= ss
->view_id
;
373 /* no depth/stencil buffer - still need a relocation */
374 view_relocation(swc
, NULL
, &cmd
->depthStencilViewId
,
376 cmd
->depthStencilViewId
= SVGA3D_INVALID_ID
;
380 ctarget
= (SVGA3dRenderTargetViewId
*) &cmd
[1];
381 for (i
= 0; i
< color_count
; i
++) {
382 if (color_surfs
[i
]) {
383 ss
= svga_surface(color_surfs
[i
]);
384 view_relocation(swc
, color_surfs
[i
], ctarget
+ i
, SVGA_RELOC_WRITE
);
385 ctarget
[i
] = ss
->view_id
;
388 view_relocation(swc
, NULL
, ctarget
+ i
, SVGA_RELOC_WRITE
);
389 ctarget
[i
] = SVGA3D_INVALID_ID
;
399 SVGA3D_vgpu10_SetBlendState(struct svga_winsys_context
*swc
,
400 SVGA3dBlendStateId blendId
,
401 const float *blendFactor
,
404 SVGA3D_CREATE_COMMAND(SetBlendState
, SET_BLEND_STATE
);
406 SVGA3D_COPY_BASIC_2(blendId
, sampleMask
);
407 memcpy(cmd
->blendFactor
, blendFactor
, sizeof(float) * 4);
414 SVGA3D_vgpu10_SetDepthStencilState(struct svga_winsys_context
*swc
,
415 SVGA3dDepthStencilStateId depthStencilId
,
418 SVGA3D_CREATE_COMMAND(SetDepthStencilState
, SET_DEPTHSTENCIL_STATE
);
420 SVGA3D_COPY_BASIC_2(depthStencilId
, stencilRef
);
427 SVGA3D_vgpu10_SetRasterizerState(struct svga_winsys_context
*swc
,
428 SVGA3dRasterizerStateId rasterizerId
)
430 SVGA3D_CREATE_COMMAND(SetRasterizerState
, SET_RASTERIZER_STATE
);
432 cmd
->rasterizerId
= rasterizerId
;
439 SVGA3D_vgpu10_SetPredication(struct svga_winsys_context
*swc
,
440 SVGA3dQueryId queryId
,
441 uint32 predicateValue
)
443 SVGA3dCmdDXSetPredication
*cmd
;
445 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_SET_PREDICATION
,
449 return PIPE_ERROR_OUT_OF_MEMORY
;
451 cmd
->queryId
= queryId
;
452 cmd
->predicateValue
= predicateValue
;
458 SVGA3D_vgpu10_SetSOTargets(struct svga_winsys_context
*swc
,
460 const SVGA3dSoTarget
*targets
,
461 struct svga_winsys_surface
**surfaces
)
463 SVGA3dCmdDXSetSOTargets
*cmd
;
467 cmd
= SVGA3D_FIFOReserve(swc
,
468 SVGA_3D_CMD_DX_SET_SOTARGETS
,
469 sizeof(SVGA3dCmdDXSetSOTargets
) +
470 count
* sizeof(SVGA3dSoTarget
),
474 return PIPE_ERROR_OUT_OF_MEMORY
;
477 sot
= (SVGA3dSoTarget
*)(cmd
+ 1);
478 for (i
= 0; i
< count
; i
++, sot
++) {
480 sot
->offset
= targets
[i
].offset
;
481 sot
->sizeInBytes
= targets
[i
].sizeInBytes
;
482 swc
->surface_relocation(swc
, &sot
->sid
, NULL
, surfaces
[i
],
487 sot
->sizeInBytes
= ~0u;
488 swc
->surface_relocation(swc
, &sot
->sid
, NULL
, NULL
,
497 SVGA3D_vgpu10_SetScissorRects(struct svga_winsys_context
*swc
,
499 const SVGASignedRect
*rects
)
501 SVGA3dCmdDXSetScissorRects
*cmd
;
504 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_SET_SCISSORRECTS
,
505 sizeof(SVGA3dCmdDXSetScissorRects
) +
506 count
* sizeof(SVGASignedRect
),
509 return PIPE_ERROR_OUT_OF_MEMORY
;
511 memcpy(cmd
+ 1, rects
, count
* sizeof(SVGASignedRect
));
518 SVGA3D_vgpu10_SetStreamOutput(struct svga_winsys_context
*swc
,
519 SVGA3dStreamOutputId soid
)
521 SVGA3D_CREATE_COMMAND(SetStreamOutput
, SET_STREAMOUTPUT
);
530 SVGA3D_vgpu10_Draw(struct svga_winsys_context
*swc
,
532 uint32 startVertexLocation
)
534 SVGA3D_CREATE_COMMAND(Draw
, DRAW
);
536 SVGA3D_COPY_BASIC_2(vertexCount
, startVertexLocation
);
538 swc
->hints
|= SVGA_HINT_FLAG_DRAW_EMITTED
;
544 SVGA3D_vgpu10_DrawIndexed(struct svga_winsys_context
*swc
,
546 uint32 startIndexLocation
,
547 int32 baseVertexLocation
)
549 SVGA3D_CREATE_COMMAND(DrawIndexed
, DRAW_INDEXED
);
551 SVGA3D_COPY_BASIC_3(indexCount
, startIndexLocation
,
554 swc
->hints
|= SVGA_HINT_FLAG_DRAW_EMITTED
;
560 SVGA3D_vgpu10_DrawInstanced(struct svga_winsys_context
*swc
,
561 uint32 vertexCountPerInstance
,
562 uint32 instanceCount
,
563 uint32 startVertexLocation
,
564 uint32 startInstanceLocation
)
566 SVGA3D_CREATE_COMMAND(DrawInstanced
, DRAW_INSTANCED
);
568 SVGA3D_COPY_BASIC_4(vertexCountPerInstance
, instanceCount
,
569 startVertexLocation
, startInstanceLocation
);
571 swc
->hints
|= SVGA_HINT_FLAG_DRAW_EMITTED
;
577 SVGA3D_vgpu10_DrawIndexedInstanced(struct svga_winsys_context
*swc
,
578 uint32 indexCountPerInstance
,
579 uint32 instanceCount
,
580 uint32 startIndexLocation
,
581 int32 baseVertexLocation
,
582 uint32 startInstanceLocation
)
584 SVGA3D_CREATE_COMMAND(DrawIndexedInstanced
, DRAW_INDEXED_INSTANCED
);
586 SVGA3D_COPY_BASIC_5(indexCountPerInstance
, instanceCount
,
587 startIndexLocation
, baseVertexLocation
,
588 startInstanceLocation
);
591 swc
->hints
|= SVGA_HINT_FLAG_DRAW_EMITTED
;
597 SVGA3D_vgpu10_DrawAuto(struct svga_winsys_context
*swc
)
599 SVGA3D_CREATE_COMMAND(DrawAuto
, DRAW_AUTO
);
601 swc
->hints
|= SVGA_HINT_FLAG_DRAW_EMITTED
;
607 SVGA3D_vgpu10_DefineQuery(struct svga_winsys_context
*swc
,
608 SVGA3dQueryId queryId
,
609 SVGA3dQueryType type
,
610 SVGA3dDXQueryFlags flags
)
612 SVGA3D_CREATE_COMMAND(DefineQuery
, DEFINE_QUERY
);
614 SVGA3D_COPY_BASIC_3(queryId
, type
, flags
);
621 SVGA3D_vgpu10_DestroyQuery(struct svga_winsys_context
*swc
,
622 SVGA3dQueryId queryId
)
624 SVGA3D_CREATE_COMMAND(DestroyQuery
, DESTROY_QUERY
);
626 cmd
->queryId
= queryId
;
633 SVGA3D_vgpu10_BindQuery(struct svga_winsys_context
*swc
,
634 struct svga_winsys_gb_query
*gbQuery
,
635 SVGA3dQueryId queryId
)
637 SVGA3dCmdDXBindQuery
*cmd
= SVGA3D_FIFOReserve(swc
,
638 SVGA_3D_CMD_DX_BIND_QUERY
,
642 return PIPE_ERROR_OUT_OF_MEMORY
;
644 cmd
->queryId
= queryId
;
645 swc
->query_relocation(swc
, &cmd
->mobid
, gbQuery
);
652 SVGA3D_vgpu10_SetQueryOffset(struct svga_winsys_context
*swc
,
653 SVGA3dQueryId queryId
,
656 SVGA3D_CREATE_COMMAND(SetQueryOffset
, SET_QUERY_OFFSET
);
657 SVGA3D_COPY_BASIC_2(queryId
, mobOffset
);
663 SVGA3D_vgpu10_BeginQuery(struct svga_winsys_context
*swc
,
664 SVGA3dQueryId queryId
)
666 SVGA3D_CREATE_COMMAND(BeginQuery
, BEGIN_QUERY
);
667 cmd
->queryId
= queryId
;
673 SVGA3D_vgpu10_EndQuery(struct svga_winsys_context
*swc
,
674 SVGA3dQueryId queryId
)
676 SVGA3D_CREATE_COMMAND(EndQuery
, END_QUERY
);
677 cmd
->queryId
= queryId
;
684 SVGA3D_vgpu10_ClearDepthStencilView(struct svga_winsys_context
*swc
,
685 struct pipe_surface
*ds_surf
,
690 SVGA3dCmdDXClearDepthStencilView
*cmd
;
691 struct svga_surface
*ss
= svga_surface(ds_surf
);
693 cmd
= SVGA3D_FIFOReserve(swc
,
694 SVGA_3D_CMD_DX_CLEAR_DEPTHSTENCIL_VIEW
,
695 sizeof(SVGA3dCmdDXClearDepthStencilView
),
696 1); /* one relocation */
698 return PIPE_ERROR_OUT_OF_MEMORY
;
700 /* NOTE: The following is pretty tricky. We need to emit a view/surface
701 * relocation and we have to provide a pointer to an ID which lies in
702 * the bounds of the command space which we just allocated. However,
703 * we then need to overwrite it with the original DepthStencilViewId.
705 view_relocation(swc
, ds_surf
, &cmd
->depthStencilViewId
,
707 cmd
->depthStencilViewId
= ss
->view_id
;
709 cmd
->stencil
= stencil
;
717 SVGA3D_vgpu10_DefineShaderResourceView(struct svga_winsys_context
*swc
,
718 SVGA3dShaderResourceViewId shaderResourceViewId
,
719 struct svga_winsys_surface
*surface
,
720 SVGA3dSurfaceFormat format
,
721 SVGA3dResourceType resourceDimension
,
722 const SVGA3dShaderResourceViewDesc
*desc
)
724 SVGA3dCmdDXDefineShaderResourceView
*cmd
;
726 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_DEFINE_SHADERRESOURCE_VIEW
,
727 sizeof(SVGA3dCmdDXDefineShaderResourceView
),
728 1); /* one relocation */
730 return PIPE_ERROR_OUT_OF_MEMORY
;
732 SVGA3D_COPY_BASIC_3(shaderResourceViewId
, format
, resourceDimension
);
734 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, surface
,
744 SVGA3D_vgpu10_DestroyShaderResourceView(struct svga_winsys_context
*swc
,
745 SVGA3dShaderResourceViewId shaderResourceViewId
)
747 SVGA3D_CREATE_COMMAND(DestroyShaderResourceView
,
748 DESTROY_SHADERRESOURCE_VIEW
);
750 cmd
->shaderResourceViewId
= shaderResourceViewId
;
758 SVGA3D_vgpu10_DefineRenderTargetView(struct svga_winsys_context
*swc
,
759 SVGA3dRenderTargetViewId renderTargetViewId
,
760 struct svga_winsys_surface
*surface
,
761 SVGA3dSurfaceFormat format
,
762 SVGA3dResourceType resourceDimension
,
763 const SVGA3dRenderTargetViewDesc
*desc
)
765 SVGA3dCmdDXDefineRenderTargetView
*cmd
;
767 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_DEFINE_RENDERTARGET_VIEW
,
768 sizeof(SVGA3dCmdDXDefineRenderTargetView
),
769 1); /* one relocation */
771 return PIPE_ERROR_OUT_OF_MEMORY
;
773 SVGA3D_COPY_BASIC_3(renderTargetViewId
, format
, resourceDimension
);
776 surface_to_resourceid(swc
, surface
,
778 SVGA_RELOC_READ
| SVGA_RELOC_WRITE
);
785 SVGA3D_vgpu10_DestroyRenderTargetView(struct svga_winsys_context
*swc
,
786 SVGA3dRenderTargetViewId renderTargetViewId
)
788 SVGA3D_CREATE_COMMAND(DestroyRenderTargetView
, DESTROY_RENDERTARGET_VIEW
);
790 cmd
->renderTargetViewId
= renderTargetViewId
;
798 SVGA3D_vgpu10_DefineDepthStencilView(struct svga_winsys_context
*swc
,
799 SVGA3dDepthStencilViewId depthStencilViewId
,
800 struct svga_winsys_surface
*surface
,
801 SVGA3dSurfaceFormat format
,
802 SVGA3dResourceType resourceDimension
,
803 const SVGA3dRenderTargetViewDesc
*desc
)
805 SVGA3dCmdDXDefineDepthStencilView
*cmd
;
807 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_DEFINE_DEPTHSTENCIL_VIEW
,
808 sizeof(SVGA3dCmdDXDefineDepthStencilView
),
809 1); /* one relocation */
811 return PIPE_ERROR_OUT_OF_MEMORY
;
813 SVGA3D_COPY_BASIC_3(depthStencilViewId
, format
, resourceDimension
);
814 cmd
->mipSlice
= desc
->tex
.mipSlice
;
815 cmd
->firstArraySlice
= desc
->tex
.firstArraySlice
;
816 cmd
->arraySize
= desc
->tex
.arraySize
;
818 surface_to_resourceid(swc
, surface
,
820 SVGA_RELOC_READ
| SVGA_RELOC_WRITE
);
827 SVGA3D_vgpu10_DestroyDepthStencilView(struct svga_winsys_context
*swc
,
828 SVGA3dDepthStencilViewId depthStencilViewId
)
830 SVGA3D_CREATE_COMMAND(DestroyDepthStencilView
, DESTROY_DEPTHSTENCIL_VIEW
);
832 cmd
->depthStencilViewId
= depthStencilViewId
;
839 SVGA3D_vgpu10_DefineElementLayout(struct svga_winsys_context
*swc
,
841 SVGA3dElementLayoutId elementLayoutId
,
842 const SVGA3dInputElementDesc
*elements
)
844 SVGA3dCmdDXDefineElementLayout
*cmd
;
847 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_DEFINE_ELEMENTLAYOUT
,
848 sizeof(SVGA3dCmdDXDefineElementLayout
) +
849 count
* sizeof(SVGA3dInputElementDesc
), 0);
851 return PIPE_ERROR_OUT_OF_MEMORY
;
853 /* check that all offsets are multiples of four */
854 for (i
= 0; i
< count
; i
++) {
855 assert(elements
[i
].alignedByteOffset
% 4 == 0);
857 (void) i
; /* silence unused var in release build */
859 cmd
->elementLayoutId
= elementLayoutId
;
860 memcpy(cmd
+ 1, elements
, count
* sizeof(SVGA3dInputElementDesc
));
867 SVGA3D_vgpu10_DestroyElementLayout(struct svga_winsys_context
*swc
,
868 SVGA3dElementLayoutId elementLayoutId
)
870 SVGA3D_CREATE_COMMAND(DestroyElementLayout
, DESTROY_ELEMENTLAYOUT
);
872 cmd
->elementLayoutId
= elementLayoutId
;
879 SVGA3D_vgpu10_DefineBlendState(struct svga_winsys_context
*swc
,
880 SVGA3dBlendStateId blendId
,
881 uint8 alphaToCoverageEnable
,
882 uint8 independentBlendEnable
,
883 const SVGA3dDXBlendStatePerRT
*perRT
)
885 SVGA3D_CREATE_COMMAND(DefineBlendState
, DEFINE_BLEND_STATE
);
887 cmd
->blendId
= blendId
;
888 cmd
->alphaToCoverageEnable
= alphaToCoverageEnable
;
889 cmd
->independentBlendEnable
= independentBlendEnable
;
890 memcpy(cmd
->perRT
, perRT
, sizeof(cmd
->perRT
));
898 SVGA3D_vgpu10_DestroyBlendState(struct svga_winsys_context
*swc
,
899 SVGA3dBlendStateId blendId
)
901 SVGA3D_CREATE_COMMAND(DestroyBlendState
, DESTROY_BLEND_STATE
);
903 cmd
->blendId
= blendId
;
910 SVGA3D_vgpu10_DefineDepthStencilState(struct svga_winsys_context
*swc
,
911 SVGA3dDepthStencilStateId depthStencilId
,
913 SVGA3dDepthWriteMask depthWriteMask
,
914 SVGA3dComparisonFunc depthFunc
,
918 uint8 stencilReadMask
,
919 uint8 stencilWriteMask
,
920 uint8 frontStencilFailOp
,
921 uint8 frontStencilDepthFailOp
,
922 uint8 frontStencilPassOp
,
923 SVGA3dComparisonFunc frontStencilFunc
,
924 uint8 backStencilFailOp
,
925 uint8 backStencilDepthFailOp
,
926 uint8 backStencilPassOp
,
927 SVGA3dComparisonFunc backStencilFunc
)
929 SVGA3D_CREATE_COMMAND(DefineDepthStencilState
, DEFINE_DEPTHSTENCIL_STATE
);
931 SVGA3D_COPY_BASIC_9(depthStencilId
, depthEnable
,
932 depthWriteMask
, depthFunc
,
933 stencilEnable
, frontEnable
,
934 backEnable
, stencilReadMask
,
936 SVGA3D_COPY_BASIC_8(frontStencilFailOp
, frontStencilDepthFailOp
,
937 frontStencilPassOp
, frontStencilFunc
,
938 backStencilFailOp
, backStencilDepthFailOp
,
939 backStencilPassOp
, backStencilFunc
);
946 SVGA3D_vgpu10_DestroyDepthStencilState(struct svga_winsys_context
*swc
,
947 SVGA3dDepthStencilStateId depthStencilId
)
949 SVGA3D_CREATE_COMMAND(DestroyDepthStencilState
,
950 DESTROY_DEPTHSTENCIL_STATE
);
952 cmd
->depthStencilId
= depthStencilId
;
959 SVGA3D_vgpu10_DefineRasterizerState(struct svga_winsys_context
*swc
,
960 SVGA3dRasterizerStateId rasterizerId
,
962 SVGA3dCullMode cullMode
,
963 uint8 frontCounterClockwise
,
965 float depthBiasClamp
,
966 float slopeScaledDepthBias
,
967 uint8 depthClipEnable
,
969 uint8 multisampleEnable
,
970 uint8 antialiasedLineEnable
,
972 uint8 lineStippleEnable
,
973 uint8 lineStippleFactor
,
974 uint16 lineStipplePattern
,
975 uint8 provokingVertexLast
)
977 SVGA3D_CREATE_COMMAND(DefineRasterizerState
, DEFINE_RASTERIZER_STATE
);
979 SVGA3D_COPY_BASIC_5(rasterizerId
, fillMode
,
980 cullMode
, frontCounterClockwise
,
982 SVGA3D_COPY_BASIC_6(depthBiasClamp
, slopeScaledDepthBias
,
983 depthClipEnable
, scissorEnable
,
984 multisampleEnable
, antialiasedLineEnable
);
985 cmd
->lineWidth
= lineWidth
;
986 cmd
->lineStippleEnable
= lineStippleEnable
;
987 cmd
->lineStippleFactor
= lineStippleFactor
;
988 cmd
->lineStipplePattern
= lineStipplePattern
;
989 cmd
->provokingVertexLast
= provokingVertexLast
;
996 SVGA3D_vgpu10_DestroyRasterizerState(struct svga_winsys_context
*swc
,
997 SVGA3dRasterizerStateId rasterizerId
)
999 SVGA3D_CREATE_COMMAND(DestroyRasterizerState
, DESTROY_RASTERIZER_STATE
);
1001 cmd
->rasterizerId
= rasterizerId
;
1008 SVGA3D_vgpu10_DefineSamplerState(struct svga_winsys_context
*swc
,
1009 SVGA3dSamplerId samplerId
,
1010 SVGA3dFilter filter
,
1015 uint8 maxAnisotropy
,
1016 uint8 comparisonFunc
,
1017 SVGA3dRGBAFloat borderColor
,
1021 SVGA3D_CREATE_COMMAND(DefineSamplerState
, DEFINE_SAMPLER_STATE
);
1023 SVGA3D_COPY_BASIC_6(samplerId
, filter
,
1025 addressW
, mipLODBias
);
1026 SVGA3D_COPY_BASIC_5(maxAnisotropy
, comparisonFunc
,
1027 borderColor
, minLOD
,
1035 SVGA3D_vgpu10_DestroySamplerState(struct svga_winsys_context
*swc
,
1036 SVGA3dSamplerId samplerId
)
1038 SVGA3D_CREATE_COMMAND(DestroySamplerState
, DESTROY_SAMPLER_STATE
);
1040 cmd
->samplerId
= samplerId
;
1048 SVGA3D_vgpu10_DefineAndBindShader(struct svga_winsys_context
*swc
,
1049 struct svga_winsys_gb_shader
*gbshader
,
1050 SVGA3dShaderId shaderId
,
1051 SVGA3dShaderType type
,
1054 SVGA3dCmdHeader
*header
;
1055 SVGA3dCmdDXDefineShader
*dcmd
;
1056 SVGA3dCmdDXBindShader
*bcmd
;
1057 unsigned totalSize
= 2 * sizeof(*header
) +
1058 sizeof(*dcmd
) + sizeof(*bcmd
);
1060 /* Make sure there is room for both commands */
1061 header
= swc
->reserve(swc
, totalSize
, 2);
1063 return PIPE_ERROR_OUT_OF_MEMORY
;
1065 /* DXDefineShader command */
1066 header
->id
= SVGA_3D_CMD_DX_DEFINE_SHADER
;
1067 header
->size
= sizeof(*dcmd
);
1068 dcmd
= (SVGA3dCmdDXDefineShader
*)(header
+ 1);
1069 dcmd
->shaderId
= shaderId
;
1071 dcmd
->sizeInBytes
= sizeInBytes
;
1073 /* DXBindShader command */
1074 header
= (SVGA3dCmdHeader
*)(dcmd
+ 1);
1076 header
->id
= SVGA_3D_CMD_DX_BIND_SHADER
;
1077 header
->size
= sizeof(*bcmd
);
1078 bcmd
= (SVGA3dCmdDXBindShader
*)(header
+ 1);
1080 bcmd
->cid
= swc
->cid
;
1081 swc
->shader_relocation(swc
, NULL
, &bcmd
->mobid
,
1082 &bcmd
->offsetInBytes
, gbshader
, 0);
1084 bcmd
->shid
= shaderId
;
1091 SVGA3D_vgpu10_DestroyShader(struct svga_winsys_context
*swc
,
1092 SVGA3dShaderId shaderId
)
1094 SVGA3D_CREATE_COMMAND(DestroyShader
, DESTROY_SHADER
);
1096 cmd
->shaderId
= shaderId
;
1103 SVGA3D_vgpu10_DefineStreamOutput(struct svga_winsys_context
*swc
,
1104 SVGA3dStreamOutputId soid
,
1105 uint32 numOutputStreamEntries
,
1106 uint32 streamOutputStrideInBytes
[SVGA3D_DX_MAX_SOTARGETS
],
1107 const SVGA3dStreamOutputDeclarationEntry decl
[SVGA3D_MAX_STREAMOUT_DECLS
])
1110 SVGA3D_CREATE_COMMAND(DefineStreamOutput
, DEFINE_STREAMOUTPUT
);
1113 cmd
->numOutputStreamEntries
= numOutputStreamEntries
;
1115 for (i
= 0; i
< Elements(cmd
->streamOutputStrideInBytes
); i
++)
1116 cmd
->streamOutputStrideInBytes
[i
] = streamOutputStrideInBytes
[i
];
1118 memcpy(cmd
->decl
, decl
,
1119 sizeof(SVGA3dStreamOutputDeclarationEntry
)
1120 * SVGA3D_MAX_STREAMOUT_DECLS
);
1127 SVGA3D_vgpu10_DestroyStreamOutput(struct svga_winsys_context
*swc
,
1128 SVGA3dStreamOutputId soid
)
1130 SVGA3D_CREATE_COMMAND(DestroyStreamOutput
, DESTROY_STREAMOUTPUT
);
1139 SVGA3D_vgpu10_SetInputLayout(struct svga_winsys_context
*swc
,
1140 SVGA3dElementLayoutId elementLayoutId
)
1142 SVGA3D_CREATE_COMMAND(SetInputLayout
, SET_INPUT_LAYOUT
);
1144 cmd
->elementLayoutId
= elementLayoutId
;
1151 SVGA3D_vgpu10_SetVertexBuffers(struct svga_winsys_context
*swc
,
1154 const SVGA3dVertexBuffer
*bufferInfo
,
1155 struct svga_winsys_surface
**surfaces
)
1157 SVGA3dCmdDXSetVertexBuffers
*cmd
;
1158 SVGA3dVertexBuffer
*bufs
;
1163 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_SET_VERTEX_BUFFERS
,
1164 sizeof(SVGA3dCmdDXSetVertexBuffers
) +
1165 count
* sizeof(SVGA3dVertexBuffer
),
1166 count
); /* 'count' relocations */
1168 return PIPE_ERROR_OUT_OF_MEMORY
;
1170 cmd
->startBuffer
= startBuffer
;
1172 bufs
= (SVGA3dVertexBuffer
*) &cmd
[1];
1173 for (i
= 0; i
< count
; i
++) {
1174 bufs
[i
].stride
= bufferInfo
[i
].stride
;
1175 bufs
[i
].offset
= bufferInfo
[i
].offset
;
1176 assert(bufs
[i
].stride
% 4 == 0);
1177 assert(bufs
[i
].offset
% 4 == 0);
1178 swc
->surface_relocation(swc
, &bufs
[i
].sid
, NULL
, surfaces
[i
],
1187 SVGA3D_vgpu10_SetTopology(struct svga_winsys_context
*swc
,
1188 SVGA3dPrimitiveType topology
)
1190 SVGA3D_CREATE_COMMAND(SetTopology
, SET_TOPOLOGY
);
1192 cmd
->topology
= topology
;
1199 SVGA3D_vgpu10_SetIndexBuffer(struct svga_winsys_context
*swc
,
1200 struct svga_winsys_surface
*indexes
,
1201 SVGA3dSurfaceFormat format
,
1204 SVGA3dCmdDXSetIndexBuffer
*cmd
;
1206 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_SET_INDEX_BUFFER
,
1207 sizeof(SVGA3dCmdDXSetIndexBuffer
),
1208 1); /* one relocations */
1210 return PIPE_ERROR_OUT_OF_MEMORY
;
1212 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, indexes
, SVGA_RELOC_READ
);
1213 SVGA3D_COPY_BASIC_2(format
, offset
);
1220 SVGA3D_vgpu10_SetSingleConstantBuffer(struct svga_winsys_context
*swc
,
1222 SVGA3dShaderType type
,
1223 struct svga_winsys_surface
*surface
,
1224 uint32 offsetInBytes
,
1227 SVGA3dCmdDXSetSingleConstantBuffer
*cmd
;
1229 assert(offsetInBytes
% 256 == 0);
1231 assert(sizeInBytes
== 0);
1233 assert(sizeInBytes
> 0);
1235 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_SET_SINGLE_CONSTANT_BUFFER
,
1236 sizeof(SVGA3dCmdDXSetSingleConstantBuffer
),
1237 1); /* one relocation */
1239 return PIPE_ERROR_OUT_OF_MEMORY
;
1243 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, surface
, SVGA_RELOC_READ
);
1244 cmd
->offsetInBytes
= offsetInBytes
;
1245 cmd
->sizeInBytes
= sizeInBytes
;
1254 SVGA3D_vgpu10_ReadbackSubResource(struct svga_winsys_context
*swc
,
1255 struct svga_winsys_surface
*surface
,
1256 unsigned subResource
)
1258 SVGA3dCmdDXReadbackSubResource
*cmd
;
1260 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_READBACK_SUBRESOURCE
,
1261 sizeof(SVGA3dCmdDXReadbackSubResource
),
1264 return PIPE_ERROR_OUT_OF_MEMORY
;
1266 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, surface
,
1267 SVGA_RELOC_READ
| SVGA_RELOC_INTERNAL
);
1268 cmd
->subResource
= subResource
;
1275 SVGA3D_vgpu10_UpdateSubResource(struct svga_winsys_context
*swc
,
1276 struct svga_winsys_surface
*surface
,
1277 const SVGA3dBox
*box
,
1278 unsigned subResource
)
1280 SVGA3dCmdDXUpdateSubResource
*cmd
;
1282 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_UPDATE_SUBRESOURCE
,
1283 sizeof(SVGA3dCmdDXUpdateSubResource
),
1286 return PIPE_ERROR_OUT_OF_MEMORY
;
1288 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, surface
,
1289 SVGA_RELOC_WRITE
| SVGA_RELOC_INTERNAL
);
1290 cmd
->subResource
= subResource
;