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
);
543 SVGA3D_vgpu10_DrawIndexed(struct svga_winsys_context
*swc
,
545 uint32 startIndexLocation
,
546 int32 baseVertexLocation
)
548 SVGA3D_CREATE_COMMAND(DrawIndexed
, DRAW_INDEXED
);
550 SVGA3D_COPY_BASIC_3(indexCount
, startIndexLocation
,
558 SVGA3D_vgpu10_DrawInstanced(struct svga_winsys_context
*swc
,
559 uint32 vertexCountPerInstance
,
560 uint32 instanceCount
,
561 uint32 startVertexLocation
,
562 uint32 startInstanceLocation
)
564 SVGA3D_CREATE_COMMAND(DrawInstanced
, DRAW_INSTANCED
);
566 SVGA3D_COPY_BASIC_4(vertexCountPerInstance
, instanceCount
,
567 startVertexLocation
, startInstanceLocation
);
574 SVGA3D_vgpu10_DrawIndexedInstanced(struct svga_winsys_context
*swc
,
575 uint32 indexCountPerInstance
,
576 uint32 instanceCount
,
577 uint32 startIndexLocation
,
578 int32 baseVertexLocation
,
579 uint32 startInstanceLocation
)
581 SVGA3D_CREATE_COMMAND(DrawIndexedInstanced
, DRAW_INDEXED_INSTANCED
);
583 SVGA3D_COPY_BASIC_5(indexCountPerInstance
, instanceCount
,
584 startIndexLocation
, baseVertexLocation
,
585 startInstanceLocation
);
592 SVGA3D_vgpu10_DrawAuto(struct svga_winsys_context
*swc
)
594 SVGA3D_CREATE_COMMAND(DrawAuto
, DRAW_AUTO
);
601 SVGA3D_vgpu10_DefineQuery(struct svga_winsys_context
*swc
,
602 SVGA3dQueryId queryId
,
603 SVGA3dQueryType type
,
604 SVGA3dDXQueryFlags flags
)
606 SVGA3D_CREATE_COMMAND(DefineQuery
, DEFINE_QUERY
);
608 SVGA3D_COPY_BASIC_3(queryId
, type
, flags
);
615 SVGA3D_vgpu10_DestroyQuery(struct svga_winsys_context
*swc
,
616 SVGA3dQueryId queryId
)
618 SVGA3D_CREATE_COMMAND(DestroyQuery
, DESTROY_QUERY
);
620 cmd
->queryId
= queryId
;
627 SVGA3D_vgpu10_BindQuery(struct svga_winsys_context
*swc
,
628 struct svga_winsys_gb_query
*gbQuery
,
629 SVGA3dQueryId queryId
)
631 SVGA3dCmdDXBindQuery
*cmd
= SVGA3D_FIFOReserve(swc
,
632 SVGA_3D_CMD_DX_BIND_QUERY
,
636 return PIPE_ERROR_OUT_OF_MEMORY
;
638 cmd
->queryId
= queryId
;
639 swc
->query_relocation(swc
, &cmd
->mobid
, gbQuery
);
646 SVGA3D_vgpu10_SetQueryOffset(struct svga_winsys_context
*swc
,
647 SVGA3dQueryId queryId
,
650 SVGA3D_CREATE_COMMAND(SetQueryOffset
, SET_QUERY_OFFSET
);
651 SVGA3D_COPY_BASIC_2(queryId
, mobOffset
);
657 SVGA3D_vgpu10_BeginQuery(struct svga_winsys_context
*swc
,
658 SVGA3dQueryId queryId
)
660 SVGA3D_CREATE_COMMAND(BeginQuery
, BEGIN_QUERY
);
661 cmd
->queryId
= queryId
;
667 SVGA3D_vgpu10_EndQuery(struct svga_winsys_context
*swc
,
668 SVGA3dQueryId queryId
)
670 SVGA3D_CREATE_COMMAND(EndQuery
, END_QUERY
);
671 cmd
->queryId
= queryId
;
678 SVGA3D_vgpu10_ClearDepthStencilView(struct svga_winsys_context
*swc
,
679 struct pipe_surface
*ds_surf
,
684 SVGA3dCmdDXClearDepthStencilView
*cmd
;
685 struct svga_surface
*ss
= svga_surface(ds_surf
);
687 cmd
= SVGA3D_FIFOReserve(swc
,
688 SVGA_3D_CMD_DX_CLEAR_DEPTHSTENCIL_VIEW
,
689 sizeof(SVGA3dCmdDXClearDepthStencilView
),
690 1); /* one relocation */
692 return PIPE_ERROR_OUT_OF_MEMORY
;
694 /* NOTE: The following is pretty tricky. We need to emit a view/surface
695 * relocation and we have to provide a pointer to an ID which lies in
696 * the bounds of the command space which we just allocated. However,
697 * we then need to overwrite it with the original DepthStencilViewId.
699 view_relocation(swc
, ds_surf
, &cmd
->depthStencilViewId
,
701 cmd
->depthStencilViewId
= ss
->view_id
;
703 cmd
->stencil
= stencil
;
711 SVGA3D_vgpu10_DefineShaderResourceView(struct svga_winsys_context
*swc
,
712 SVGA3dShaderResourceViewId shaderResourceViewId
,
713 struct svga_winsys_surface
*surface
,
714 SVGA3dSurfaceFormat format
,
715 SVGA3dResourceType resourceDimension
,
716 const SVGA3dShaderResourceViewDesc
*desc
)
718 SVGA3dCmdDXDefineShaderResourceView
*cmd
;
720 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_DEFINE_SHADERRESOURCE_VIEW
,
721 sizeof(SVGA3dCmdDXDefineShaderResourceView
),
722 1); /* one relocation */
724 return PIPE_ERROR_OUT_OF_MEMORY
;
726 SVGA3D_COPY_BASIC_3(shaderResourceViewId
, format
, resourceDimension
);
728 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, surface
,
738 SVGA3D_vgpu10_DestroyShaderResourceView(struct svga_winsys_context
*swc
,
739 SVGA3dShaderResourceViewId shaderResourceViewId
)
741 SVGA3D_CREATE_COMMAND(DestroyShaderResourceView
,
742 DESTROY_SHADERRESOURCE_VIEW
);
744 cmd
->shaderResourceViewId
= shaderResourceViewId
;
752 SVGA3D_vgpu10_DefineRenderTargetView(struct svga_winsys_context
*swc
,
753 SVGA3dRenderTargetViewId renderTargetViewId
,
754 struct svga_winsys_surface
*surface
,
755 SVGA3dSurfaceFormat format
,
756 SVGA3dResourceType resourceDimension
,
757 const SVGA3dRenderTargetViewDesc
*desc
)
759 SVGA3dCmdDXDefineRenderTargetView
*cmd
;
761 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_DEFINE_RENDERTARGET_VIEW
,
762 sizeof(SVGA3dCmdDXDefineRenderTargetView
),
763 1); /* one relocation */
765 return PIPE_ERROR_OUT_OF_MEMORY
;
767 SVGA3D_COPY_BASIC_3(renderTargetViewId
, format
, resourceDimension
);
770 surface_to_resourceid(swc
, surface
,
772 SVGA_RELOC_READ
| SVGA_RELOC_WRITE
);
779 SVGA3D_vgpu10_DestroyRenderTargetView(struct svga_winsys_context
*swc
,
780 SVGA3dRenderTargetViewId renderTargetViewId
)
782 SVGA3D_CREATE_COMMAND(DestroyRenderTargetView
, DESTROY_RENDERTARGET_VIEW
);
784 cmd
->renderTargetViewId
= renderTargetViewId
;
792 SVGA3D_vgpu10_DefineDepthStencilView(struct svga_winsys_context
*swc
,
793 SVGA3dDepthStencilViewId depthStencilViewId
,
794 struct svga_winsys_surface
*surface
,
795 SVGA3dSurfaceFormat format
,
796 SVGA3dResourceType resourceDimension
,
797 const SVGA3dRenderTargetViewDesc
*desc
)
799 SVGA3dCmdDXDefineDepthStencilView
*cmd
;
801 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_DEFINE_DEPTHSTENCIL_VIEW
,
802 sizeof(SVGA3dCmdDXDefineDepthStencilView
),
803 1); /* one relocation */
805 return PIPE_ERROR_OUT_OF_MEMORY
;
807 SVGA3D_COPY_BASIC_3(depthStencilViewId
, format
, resourceDimension
);
808 cmd
->mipSlice
= desc
->tex
.mipSlice
;
809 cmd
->firstArraySlice
= desc
->tex
.firstArraySlice
;
810 cmd
->arraySize
= desc
->tex
.arraySize
;
812 surface_to_resourceid(swc
, surface
,
814 SVGA_RELOC_READ
| SVGA_RELOC_WRITE
);
821 SVGA3D_vgpu10_DestroyDepthStencilView(struct svga_winsys_context
*swc
,
822 SVGA3dDepthStencilViewId depthStencilViewId
)
824 SVGA3D_CREATE_COMMAND(DestroyDepthStencilView
, DESTROY_DEPTHSTENCIL_VIEW
);
826 cmd
->depthStencilViewId
= depthStencilViewId
;
833 SVGA3D_vgpu10_DefineElementLayout(struct svga_winsys_context
*swc
,
835 SVGA3dElementLayoutId elementLayoutId
,
836 const SVGA3dInputElementDesc
*elements
)
838 SVGA3dCmdDXDefineElementLayout
*cmd
;
841 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_DEFINE_ELEMENTLAYOUT
,
842 sizeof(SVGA3dCmdDXDefineElementLayout
) +
843 count
* sizeof(SVGA3dInputElementDesc
), 0);
845 return PIPE_ERROR_OUT_OF_MEMORY
;
847 /* check that all offsets are multiples of four */
848 for (i
= 0; i
< count
; i
++) {
849 assert(elements
[i
].alignedByteOffset
% 4 == 0);
851 (void) i
; /* silence unused var in release build */
853 cmd
->elementLayoutId
= elementLayoutId
;
854 memcpy(cmd
+ 1, elements
, count
* sizeof(SVGA3dInputElementDesc
));
861 SVGA3D_vgpu10_DestroyElementLayout(struct svga_winsys_context
*swc
,
862 SVGA3dElementLayoutId elementLayoutId
)
864 SVGA3D_CREATE_COMMAND(DestroyElementLayout
, DESTROY_ELEMENTLAYOUT
);
866 cmd
->elementLayoutId
= elementLayoutId
;
873 SVGA3D_vgpu10_DefineBlendState(struct svga_winsys_context
*swc
,
874 SVGA3dBlendStateId blendId
,
875 uint8 alphaToCoverageEnable
,
876 uint8 independentBlendEnable
,
877 const SVGA3dDXBlendStatePerRT
*perRT
)
879 SVGA3D_CREATE_COMMAND(DefineBlendState
, DEFINE_BLEND_STATE
);
881 cmd
->blendId
= blendId
;
882 cmd
->alphaToCoverageEnable
= alphaToCoverageEnable
;
883 cmd
->independentBlendEnable
= independentBlendEnable
;
884 memcpy(cmd
->perRT
, perRT
, sizeof(cmd
->perRT
));
892 SVGA3D_vgpu10_DestroyBlendState(struct svga_winsys_context
*swc
,
893 SVGA3dBlendStateId blendId
)
895 SVGA3D_CREATE_COMMAND(DestroyBlendState
, DESTROY_BLEND_STATE
);
897 cmd
->blendId
= blendId
;
904 SVGA3D_vgpu10_DefineDepthStencilState(struct svga_winsys_context
*swc
,
905 SVGA3dDepthStencilStateId depthStencilId
,
907 SVGA3dDepthWriteMask depthWriteMask
,
908 SVGA3dComparisonFunc depthFunc
,
912 uint8 stencilReadMask
,
913 uint8 stencilWriteMask
,
914 uint8 frontStencilFailOp
,
915 uint8 frontStencilDepthFailOp
,
916 uint8 frontStencilPassOp
,
917 SVGA3dComparisonFunc frontStencilFunc
,
918 uint8 backStencilFailOp
,
919 uint8 backStencilDepthFailOp
,
920 uint8 backStencilPassOp
,
921 SVGA3dComparisonFunc backStencilFunc
)
923 SVGA3D_CREATE_COMMAND(DefineDepthStencilState
, DEFINE_DEPTHSTENCIL_STATE
);
925 SVGA3D_COPY_BASIC_9(depthStencilId
, depthEnable
,
926 depthWriteMask
, depthFunc
,
927 stencilEnable
, frontEnable
,
928 backEnable
, stencilReadMask
,
930 SVGA3D_COPY_BASIC_8(frontStencilFailOp
, frontStencilDepthFailOp
,
931 frontStencilPassOp
, frontStencilFunc
,
932 backStencilFailOp
, backStencilDepthFailOp
,
933 backStencilPassOp
, backStencilFunc
);
940 SVGA3D_vgpu10_DestroyDepthStencilState(struct svga_winsys_context
*swc
,
941 SVGA3dDepthStencilStateId depthStencilId
)
943 SVGA3D_CREATE_COMMAND(DestroyDepthStencilState
,
944 DESTROY_DEPTHSTENCIL_STATE
);
946 cmd
->depthStencilId
= depthStencilId
;
953 SVGA3D_vgpu10_DefineRasterizerState(struct svga_winsys_context
*swc
,
954 SVGA3dRasterizerStateId rasterizerId
,
956 SVGA3dCullMode cullMode
,
957 uint8 frontCounterClockwise
,
959 float depthBiasClamp
,
960 float slopeScaledDepthBias
,
961 uint8 depthClipEnable
,
963 uint8 multisampleEnable
,
964 uint8 antialiasedLineEnable
,
966 uint8 lineStippleEnable
,
967 uint8 lineStippleFactor
,
968 uint16 lineStipplePattern
,
969 uint8 provokingVertexLast
)
971 SVGA3D_CREATE_COMMAND(DefineRasterizerState
, DEFINE_RASTERIZER_STATE
);
973 SVGA3D_COPY_BASIC_5(rasterizerId
, fillMode
,
974 cullMode
, frontCounterClockwise
,
976 SVGA3D_COPY_BASIC_6(depthBiasClamp
, slopeScaledDepthBias
,
977 depthClipEnable
, scissorEnable
,
978 multisampleEnable
, antialiasedLineEnable
);
979 cmd
->lineWidth
= lineWidth
;
980 cmd
->lineStippleEnable
= lineStippleEnable
;
981 cmd
->lineStippleFactor
= lineStippleFactor
;
982 cmd
->lineStipplePattern
= lineStipplePattern
;
983 cmd
->provokingVertexLast
= provokingVertexLast
;
990 SVGA3D_vgpu10_DestroyRasterizerState(struct svga_winsys_context
*swc
,
991 SVGA3dRasterizerStateId rasterizerId
)
993 SVGA3D_CREATE_COMMAND(DestroyRasterizerState
, DESTROY_RASTERIZER_STATE
);
995 cmd
->rasterizerId
= rasterizerId
;
1002 SVGA3D_vgpu10_DefineSamplerState(struct svga_winsys_context
*swc
,
1003 SVGA3dSamplerId samplerId
,
1004 SVGA3dFilter filter
,
1009 uint8 maxAnisotropy
,
1010 uint8 comparisonFunc
,
1011 SVGA3dRGBAFloat borderColor
,
1015 SVGA3D_CREATE_COMMAND(DefineSamplerState
, DEFINE_SAMPLER_STATE
);
1017 SVGA3D_COPY_BASIC_6(samplerId
, filter
,
1019 addressW
, mipLODBias
);
1020 SVGA3D_COPY_BASIC_5(maxAnisotropy
, comparisonFunc
,
1021 borderColor
, minLOD
,
1029 SVGA3D_vgpu10_DestroySamplerState(struct svga_winsys_context
*swc
,
1030 SVGA3dSamplerId samplerId
)
1032 SVGA3D_CREATE_COMMAND(DestroySamplerState
, DESTROY_SAMPLER_STATE
);
1034 cmd
->samplerId
= samplerId
;
1042 SVGA3D_vgpu10_DefineAndBindShader(struct svga_winsys_context
*swc
,
1043 struct svga_winsys_gb_shader
*gbshader
,
1044 SVGA3dShaderId shaderId
,
1045 SVGA3dShaderType type
,
1048 SVGA3dCmdHeader
*header
;
1049 SVGA3dCmdDXDefineShader
*dcmd
;
1050 SVGA3dCmdDXBindShader
*bcmd
;
1051 unsigned totalSize
= 2 * sizeof(*header
) +
1052 sizeof(*dcmd
) + sizeof(*bcmd
);
1054 /* Make sure there is room for both commands */
1055 header
= swc
->reserve(swc
, totalSize
, 2);
1057 return PIPE_ERROR_OUT_OF_MEMORY
;
1059 /* DXDefineShader command */
1060 header
->id
= SVGA_3D_CMD_DX_DEFINE_SHADER
;
1061 header
->size
= sizeof(*dcmd
);
1062 dcmd
= (SVGA3dCmdDXDefineShader
*)(header
+ 1);
1063 dcmd
->shaderId
= shaderId
;
1065 dcmd
->sizeInBytes
= sizeInBytes
;
1067 /* DXBindShader command */
1068 header
= (SVGA3dCmdHeader
*)(dcmd
+ 1);
1070 header
->id
= SVGA_3D_CMD_DX_BIND_SHADER
;
1071 header
->size
= sizeof(*bcmd
);
1072 bcmd
= (SVGA3dCmdDXBindShader
*)(header
+ 1);
1074 bcmd
->cid
= swc
->cid
;
1075 swc
->shader_relocation(swc
, NULL
, &bcmd
->mobid
,
1076 &bcmd
->offsetInBytes
, gbshader
, 0);
1078 bcmd
->shid
= shaderId
;
1085 SVGA3D_vgpu10_DestroyShader(struct svga_winsys_context
*swc
,
1086 SVGA3dShaderId shaderId
)
1088 SVGA3D_CREATE_COMMAND(DestroyShader
, DESTROY_SHADER
);
1090 cmd
->shaderId
= shaderId
;
1097 SVGA3D_vgpu10_DefineStreamOutput(struct svga_winsys_context
*swc
,
1098 SVGA3dStreamOutputId soid
,
1099 uint32 numOutputStreamEntries
,
1100 uint32 streamOutputStrideInBytes
[SVGA3D_DX_MAX_SOTARGETS
],
1101 const SVGA3dStreamOutputDeclarationEntry decl
[SVGA3D_MAX_STREAMOUT_DECLS
])
1104 SVGA3D_CREATE_COMMAND(DefineStreamOutput
, DEFINE_STREAMOUTPUT
);
1107 cmd
->numOutputStreamEntries
= numOutputStreamEntries
;
1109 for (i
= 0; i
< Elements(cmd
->streamOutputStrideInBytes
); i
++)
1110 cmd
->streamOutputStrideInBytes
[i
] = streamOutputStrideInBytes
[i
];
1112 memcpy(cmd
->decl
, decl
,
1113 sizeof(SVGA3dStreamOutputDeclarationEntry
)
1114 * SVGA3D_MAX_STREAMOUT_DECLS
);
1121 SVGA3D_vgpu10_DestroyStreamOutput(struct svga_winsys_context
*swc
,
1122 SVGA3dStreamOutputId soid
)
1124 SVGA3D_CREATE_COMMAND(DestroyStreamOutput
, DESTROY_STREAMOUTPUT
);
1133 SVGA3D_vgpu10_SetInputLayout(struct svga_winsys_context
*swc
,
1134 SVGA3dElementLayoutId elementLayoutId
)
1136 SVGA3D_CREATE_COMMAND(SetInputLayout
, SET_INPUT_LAYOUT
);
1138 cmd
->elementLayoutId
= elementLayoutId
;
1145 SVGA3D_vgpu10_SetVertexBuffers(struct svga_winsys_context
*swc
,
1148 const SVGA3dVertexBuffer
*bufferInfo
,
1149 struct svga_winsys_surface
**surfaces
)
1151 SVGA3dCmdDXSetVertexBuffers
*cmd
;
1152 SVGA3dVertexBuffer
*bufs
;
1157 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_SET_VERTEX_BUFFERS
,
1158 sizeof(SVGA3dCmdDXSetVertexBuffers
) +
1159 count
* sizeof(SVGA3dVertexBuffer
),
1160 count
); /* 'count' relocations */
1162 return PIPE_ERROR_OUT_OF_MEMORY
;
1164 cmd
->startBuffer
= startBuffer
;
1166 bufs
= (SVGA3dVertexBuffer
*) &cmd
[1];
1167 for (i
= 0; i
< count
; i
++) {
1168 bufs
[i
].stride
= bufferInfo
[i
].stride
;
1169 bufs
[i
].offset
= bufferInfo
[i
].offset
;
1170 assert(bufs
[i
].stride
% 4 == 0);
1171 assert(bufs
[i
].offset
% 4 == 0);
1172 swc
->surface_relocation(swc
, &bufs
[i
].sid
, NULL
, surfaces
[i
],
1181 SVGA3D_vgpu10_SetTopology(struct svga_winsys_context
*swc
,
1182 SVGA3dPrimitiveType topology
)
1184 SVGA3D_CREATE_COMMAND(SetTopology
, SET_TOPOLOGY
);
1186 cmd
->topology
= topology
;
1193 SVGA3D_vgpu10_SetIndexBuffer(struct svga_winsys_context
*swc
,
1194 struct svga_winsys_surface
*indexes
,
1195 SVGA3dSurfaceFormat format
,
1198 SVGA3dCmdDXSetIndexBuffer
*cmd
;
1200 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_SET_INDEX_BUFFER
,
1201 sizeof(SVGA3dCmdDXSetIndexBuffer
),
1202 1); /* one relocations */
1204 return PIPE_ERROR_OUT_OF_MEMORY
;
1206 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, indexes
, SVGA_RELOC_READ
);
1207 SVGA3D_COPY_BASIC_2(format
, offset
);
1214 SVGA3D_vgpu10_SetSingleConstantBuffer(struct svga_winsys_context
*swc
,
1216 SVGA3dShaderType type
,
1217 struct svga_winsys_surface
*surface
,
1218 uint32 offsetInBytes
,
1221 SVGA3dCmdDXSetSingleConstantBuffer
*cmd
;
1223 assert(offsetInBytes
% 256 == 0);
1225 assert(sizeInBytes
== 0);
1227 assert(sizeInBytes
> 0);
1229 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_SET_SINGLE_CONSTANT_BUFFER
,
1230 sizeof(SVGA3dCmdDXSetSingleConstantBuffer
),
1231 1); /* one relocation */
1233 return PIPE_ERROR_OUT_OF_MEMORY
;
1237 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, surface
, SVGA_RELOC_READ
);
1238 cmd
->offsetInBytes
= offsetInBytes
;
1239 cmd
->sizeInBytes
= sizeInBytes
;
1248 SVGA3D_vgpu10_ReadbackSubResource(struct svga_winsys_context
*swc
,
1249 struct svga_winsys_surface
*surface
,
1250 unsigned subResource
)
1252 SVGA3dCmdDXReadbackSubResource
*cmd
;
1254 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_READBACK_SUBRESOURCE
,
1255 sizeof(SVGA3dCmdDXReadbackSubResource
),
1258 return PIPE_ERROR_OUT_OF_MEMORY
;
1260 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, surface
,
1261 SVGA_RELOC_READ
| SVGA_RELOC_INTERNAL
);
1262 cmd
->subResource
= subResource
;
1269 SVGA3D_vgpu10_UpdateSubResource(struct svga_winsys_context
*swc
,
1270 struct svga_winsys_surface
*surface
,
1271 const SVGA3dBox
*box
,
1272 unsigned subResource
)
1274 SVGA3dCmdDXUpdateSubResource
*cmd
;
1276 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_UPDATE_SUBRESOURCE
,
1277 sizeof(SVGA3dCmdDXUpdateSubResource
),
1280 return PIPE_ERROR_OUT_OF_MEMORY
;
1282 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, surface
,
1283 SVGA_RELOC_WRITE
| SVGA_RELOC_INTERNAL
);
1284 cmd
->subResource
= subResource
;