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_CAN_PRE_FLUSH
;
540 swc
->num_draw_commands
++;
545 SVGA3D_vgpu10_DrawIndexed(struct svga_winsys_context
*swc
,
547 uint32 startIndexLocation
,
548 int32 baseVertexLocation
)
550 SVGA3D_CREATE_COMMAND(DrawIndexed
, DRAW_INDEXED
);
552 SVGA3D_COPY_BASIC_3(indexCount
, startIndexLocation
,
555 swc
->hints
|= SVGA_HINT_FLAG_CAN_PRE_FLUSH
;
557 swc
->num_draw_commands
++;
562 SVGA3D_vgpu10_DrawInstanced(struct svga_winsys_context
*swc
,
563 uint32 vertexCountPerInstance
,
564 uint32 instanceCount
,
565 uint32 startVertexLocation
,
566 uint32 startInstanceLocation
)
568 SVGA3D_CREATE_COMMAND(DrawInstanced
, DRAW_INSTANCED
);
570 SVGA3D_COPY_BASIC_4(vertexCountPerInstance
, instanceCount
,
571 startVertexLocation
, startInstanceLocation
);
573 swc
->hints
|= SVGA_HINT_FLAG_CAN_PRE_FLUSH
;
575 swc
->num_draw_commands
++;
580 SVGA3D_vgpu10_DrawIndexedInstanced(struct svga_winsys_context
*swc
,
581 uint32 indexCountPerInstance
,
582 uint32 instanceCount
,
583 uint32 startIndexLocation
,
584 int32 baseVertexLocation
,
585 uint32 startInstanceLocation
)
587 SVGA3D_CREATE_COMMAND(DrawIndexedInstanced
, DRAW_INDEXED_INSTANCED
);
589 SVGA3D_COPY_BASIC_5(indexCountPerInstance
, instanceCount
,
590 startIndexLocation
, baseVertexLocation
,
591 startInstanceLocation
);
594 swc
->hints
|= SVGA_HINT_FLAG_CAN_PRE_FLUSH
;
596 swc
->num_draw_commands
++;
601 SVGA3D_vgpu10_DrawAuto(struct svga_winsys_context
*swc
)
603 SVGA3D_CREATE_COMMAND(DrawAuto
, DRAW_AUTO
);
605 swc
->hints
|= SVGA_HINT_FLAG_CAN_PRE_FLUSH
;
607 swc
->num_draw_commands
++;
612 SVGA3D_vgpu10_DefineQuery(struct svga_winsys_context
*swc
,
613 SVGA3dQueryId queryId
,
614 SVGA3dQueryType type
,
615 SVGA3dDXQueryFlags flags
)
617 SVGA3D_CREATE_COMMAND(DefineQuery
, DEFINE_QUERY
);
619 SVGA3D_COPY_BASIC_3(queryId
, type
, flags
);
626 SVGA3D_vgpu10_DestroyQuery(struct svga_winsys_context
*swc
,
627 SVGA3dQueryId queryId
)
629 SVGA3D_CREATE_COMMAND(DestroyQuery
, DESTROY_QUERY
);
631 cmd
->queryId
= queryId
;
638 SVGA3D_vgpu10_BindQuery(struct svga_winsys_context
*swc
,
639 struct svga_winsys_gb_query
*gbQuery
,
640 SVGA3dQueryId queryId
)
642 SVGA3dCmdDXBindQuery
*cmd
= SVGA3D_FIFOReserve(swc
,
643 SVGA_3D_CMD_DX_BIND_QUERY
,
647 return PIPE_ERROR_OUT_OF_MEMORY
;
649 cmd
->queryId
= queryId
;
650 swc
->query_relocation(swc
, &cmd
->mobid
, gbQuery
);
657 SVGA3D_vgpu10_SetQueryOffset(struct svga_winsys_context
*swc
,
658 SVGA3dQueryId queryId
,
661 SVGA3D_CREATE_COMMAND(SetQueryOffset
, SET_QUERY_OFFSET
);
662 SVGA3D_COPY_BASIC_2(queryId
, mobOffset
);
668 SVGA3D_vgpu10_BeginQuery(struct svga_winsys_context
*swc
,
669 SVGA3dQueryId queryId
)
671 SVGA3D_CREATE_COMMAND(BeginQuery
, BEGIN_QUERY
);
672 cmd
->queryId
= queryId
;
678 SVGA3D_vgpu10_EndQuery(struct svga_winsys_context
*swc
,
679 SVGA3dQueryId queryId
)
681 SVGA3D_CREATE_COMMAND(EndQuery
, END_QUERY
);
682 cmd
->queryId
= queryId
;
689 SVGA3D_vgpu10_ClearDepthStencilView(struct svga_winsys_context
*swc
,
690 struct pipe_surface
*ds_surf
,
695 SVGA3dCmdDXClearDepthStencilView
*cmd
;
696 struct svga_surface
*ss
= svga_surface(ds_surf
);
698 cmd
= SVGA3D_FIFOReserve(swc
,
699 SVGA_3D_CMD_DX_CLEAR_DEPTHSTENCIL_VIEW
,
700 sizeof(SVGA3dCmdDXClearDepthStencilView
),
701 1); /* one relocation */
703 return PIPE_ERROR_OUT_OF_MEMORY
;
705 /* NOTE: The following is pretty tricky. We need to emit a view/surface
706 * relocation and we have to provide a pointer to an ID which lies in
707 * the bounds of the command space which we just allocated. However,
708 * we then need to overwrite it with the original DepthStencilViewId.
710 view_relocation(swc
, ds_surf
, &cmd
->depthStencilViewId
,
712 cmd
->depthStencilViewId
= ss
->view_id
;
714 cmd
->stencil
= stencil
;
722 SVGA3D_vgpu10_DefineShaderResourceView(struct svga_winsys_context
*swc
,
723 SVGA3dShaderResourceViewId shaderResourceViewId
,
724 struct svga_winsys_surface
*surface
,
725 SVGA3dSurfaceFormat format
,
726 SVGA3dResourceType resourceDimension
,
727 const SVGA3dShaderResourceViewDesc
*desc
)
729 SVGA3dCmdDXDefineShaderResourceView
*cmd
;
731 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_DEFINE_SHADERRESOURCE_VIEW
,
732 sizeof(SVGA3dCmdDXDefineShaderResourceView
),
733 1); /* one relocation */
735 return PIPE_ERROR_OUT_OF_MEMORY
;
737 SVGA3D_COPY_BASIC_3(shaderResourceViewId
, format
, resourceDimension
);
739 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, surface
,
749 SVGA3D_vgpu10_DestroyShaderResourceView(struct svga_winsys_context
*swc
,
750 SVGA3dShaderResourceViewId shaderResourceViewId
)
752 SVGA3D_CREATE_COMMAND(DestroyShaderResourceView
,
753 DESTROY_SHADERRESOURCE_VIEW
);
755 cmd
->shaderResourceViewId
= shaderResourceViewId
;
763 SVGA3D_vgpu10_DefineRenderTargetView(struct svga_winsys_context
*swc
,
764 SVGA3dRenderTargetViewId renderTargetViewId
,
765 struct svga_winsys_surface
*surface
,
766 SVGA3dSurfaceFormat format
,
767 SVGA3dResourceType resourceDimension
,
768 const SVGA3dRenderTargetViewDesc
*desc
)
770 SVGA3dCmdDXDefineRenderTargetView
*cmd
;
772 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_DEFINE_RENDERTARGET_VIEW
,
773 sizeof(SVGA3dCmdDXDefineRenderTargetView
),
774 1); /* one relocation */
776 return PIPE_ERROR_OUT_OF_MEMORY
;
778 SVGA3D_COPY_BASIC_3(renderTargetViewId
, format
, resourceDimension
);
781 surface_to_resourceid(swc
, surface
,
783 SVGA_RELOC_READ
| SVGA_RELOC_WRITE
);
790 SVGA3D_vgpu10_DestroyRenderTargetView(struct svga_winsys_context
*swc
,
791 SVGA3dRenderTargetViewId renderTargetViewId
)
793 SVGA3D_CREATE_COMMAND(DestroyRenderTargetView
, DESTROY_RENDERTARGET_VIEW
);
795 cmd
->renderTargetViewId
= renderTargetViewId
;
803 SVGA3D_vgpu10_DefineDepthStencilView(struct svga_winsys_context
*swc
,
804 SVGA3dDepthStencilViewId depthStencilViewId
,
805 struct svga_winsys_surface
*surface
,
806 SVGA3dSurfaceFormat format
,
807 SVGA3dResourceType resourceDimension
,
808 const SVGA3dRenderTargetViewDesc
*desc
)
810 SVGA3dCmdDXDefineDepthStencilView
*cmd
;
812 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_DEFINE_DEPTHSTENCIL_VIEW
,
813 sizeof(SVGA3dCmdDXDefineDepthStencilView
),
814 1); /* one relocation */
816 return PIPE_ERROR_OUT_OF_MEMORY
;
818 SVGA3D_COPY_BASIC_3(depthStencilViewId
, format
, resourceDimension
);
819 cmd
->mipSlice
= desc
->tex
.mipSlice
;
820 cmd
->firstArraySlice
= desc
->tex
.firstArraySlice
;
821 cmd
->arraySize
= desc
->tex
.arraySize
;
823 surface_to_resourceid(swc
, surface
,
825 SVGA_RELOC_READ
| SVGA_RELOC_WRITE
);
832 SVGA3D_vgpu10_DestroyDepthStencilView(struct svga_winsys_context
*swc
,
833 SVGA3dDepthStencilViewId depthStencilViewId
)
835 SVGA3D_CREATE_COMMAND(DestroyDepthStencilView
, DESTROY_DEPTHSTENCIL_VIEW
);
837 cmd
->depthStencilViewId
= depthStencilViewId
;
844 SVGA3D_vgpu10_DefineElementLayout(struct svga_winsys_context
*swc
,
846 SVGA3dElementLayoutId elementLayoutId
,
847 const SVGA3dInputElementDesc
*elements
)
849 SVGA3dCmdDXDefineElementLayout
*cmd
;
852 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_DEFINE_ELEMENTLAYOUT
,
853 sizeof(SVGA3dCmdDXDefineElementLayout
) +
854 count
* sizeof(SVGA3dInputElementDesc
), 0);
856 return PIPE_ERROR_OUT_OF_MEMORY
;
858 /* check that all offsets are multiples of four */
859 for (i
= 0; i
< count
; i
++) {
860 assert(elements
[i
].alignedByteOffset
% 4 == 0);
862 (void) i
; /* silence unused var in release build */
864 cmd
->elementLayoutId
= elementLayoutId
;
865 memcpy(cmd
+ 1, elements
, count
* sizeof(SVGA3dInputElementDesc
));
872 SVGA3D_vgpu10_DestroyElementLayout(struct svga_winsys_context
*swc
,
873 SVGA3dElementLayoutId elementLayoutId
)
875 SVGA3D_CREATE_COMMAND(DestroyElementLayout
, DESTROY_ELEMENTLAYOUT
);
877 cmd
->elementLayoutId
= elementLayoutId
;
884 SVGA3D_vgpu10_DefineBlendState(struct svga_winsys_context
*swc
,
885 SVGA3dBlendStateId blendId
,
886 uint8 alphaToCoverageEnable
,
887 uint8 independentBlendEnable
,
888 const SVGA3dDXBlendStatePerRT
*perRT
)
890 SVGA3D_CREATE_COMMAND(DefineBlendState
, DEFINE_BLEND_STATE
);
892 cmd
->blendId
= blendId
;
893 cmd
->alphaToCoverageEnable
= alphaToCoverageEnable
;
894 cmd
->independentBlendEnable
= independentBlendEnable
;
895 memcpy(cmd
->perRT
, perRT
, sizeof(cmd
->perRT
));
903 SVGA3D_vgpu10_DestroyBlendState(struct svga_winsys_context
*swc
,
904 SVGA3dBlendStateId blendId
)
906 SVGA3D_CREATE_COMMAND(DestroyBlendState
, DESTROY_BLEND_STATE
);
908 cmd
->blendId
= blendId
;
915 SVGA3D_vgpu10_DefineDepthStencilState(struct svga_winsys_context
*swc
,
916 SVGA3dDepthStencilStateId depthStencilId
,
918 SVGA3dDepthWriteMask depthWriteMask
,
919 SVGA3dComparisonFunc depthFunc
,
923 uint8 stencilReadMask
,
924 uint8 stencilWriteMask
,
925 uint8 frontStencilFailOp
,
926 uint8 frontStencilDepthFailOp
,
927 uint8 frontStencilPassOp
,
928 SVGA3dComparisonFunc frontStencilFunc
,
929 uint8 backStencilFailOp
,
930 uint8 backStencilDepthFailOp
,
931 uint8 backStencilPassOp
,
932 SVGA3dComparisonFunc backStencilFunc
)
934 SVGA3D_CREATE_COMMAND(DefineDepthStencilState
, DEFINE_DEPTHSTENCIL_STATE
);
936 SVGA3D_COPY_BASIC_9(depthStencilId
, depthEnable
,
937 depthWriteMask
, depthFunc
,
938 stencilEnable
, frontEnable
,
939 backEnable
, stencilReadMask
,
941 SVGA3D_COPY_BASIC_8(frontStencilFailOp
, frontStencilDepthFailOp
,
942 frontStencilPassOp
, frontStencilFunc
,
943 backStencilFailOp
, backStencilDepthFailOp
,
944 backStencilPassOp
, backStencilFunc
);
951 SVGA3D_vgpu10_DestroyDepthStencilState(struct svga_winsys_context
*swc
,
952 SVGA3dDepthStencilStateId depthStencilId
)
954 SVGA3D_CREATE_COMMAND(DestroyDepthStencilState
,
955 DESTROY_DEPTHSTENCIL_STATE
);
957 cmd
->depthStencilId
= depthStencilId
;
964 SVGA3D_vgpu10_DefineRasterizerState(struct svga_winsys_context
*swc
,
965 SVGA3dRasterizerStateId rasterizerId
,
967 SVGA3dCullMode cullMode
,
968 uint8 frontCounterClockwise
,
970 float depthBiasClamp
,
971 float slopeScaledDepthBias
,
972 uint8 depthClipEnable
,
974 uint8 multisampleEnable
,
975 uint8 antialiasedLineEnable
,
977 uint8 lineStippleEnable
,
978 uint8 lineStippleFactor
,
979 uint16 lineStipplePattern
,
980 uint8 provokingVertexLast
)
982 SVGA3D_CREATE_COMMAND(DefineRasterizerState
, DEFINE_RASTERIZER_STATE
);
984 SVGA3D_COPY_BASIC_5(rasterizerId
, fillMode
,
985 cullMode
, frontCounterClockwise
,
987 SVGA3D_COPY_BASIC_6(depthBiasClamp
, slopeScaledDepthBias
,
988 depthClipEnable
, scissorEnable
,
989 multisampleEnable
, antialiasedLineEnable
);
990 cmd
->lineWidth
= lineWidth
;
991 cmd
->lineStippleEnable
= lineStippleEnable
;
992 cmd
->lineStippleFactor
= lineStippleFactor
;
993 cmd
->lineStipplePattern
= lineStipplePattern
;
994 cmd
->provokingVertexLast
= provokingVertexLast
;
1001 SVGA3D_vgpu10_DestroyRasterizerState(struct svga_winsys_context
*swc
,
1002 SVGA3dRasterizerStateId rasterizerId
)
1004 SVGA3D_CREATE_COMMAND(DestroyRasterizerState
, DESTROY_RASTERIZER_STATE
);
1006 cmd
->rasterizerId
= rasterizerId
;
1013 SVGA3D_vgpu10_DefineSamplerState(struct svga_winsys_context
*swc
,
1014 SVGA3dSamplerId samplerId
,
1015 SVGA3dFilter filter
,
1020 uint8 maxAnisotropy
,
1021 uint8 comparisonFunc
,
1022 SVGA3dRGBAFloat borderColor
,
1026 SVGA3D_CREATE_COMMAND(DefineSamplerState
, DEFINE_SAMPLER_STATE
);
1028 SVGA3D_COPY_BASIC_6(samplerId
, filter
,
1030 addressW
, mipLODBias
);
1031 SVGA3D_COPY_BASIC_5(maxAnisotropy
, comparisonFunc
,
1032 borderColor
, minLOD
,
1040 SVGA3D_vgpu10_DestroySamplerState(struct svga_winsys_context
*swc
,
1041 SVGA3dSamplerId samplerId
)
1043 SVGA3D_CREATE_COMMAND(DestroySamplerState
, DESTROY_SAMPLER_STATE
);
1045 cmd
->samplerId
= samplerId
;
1053 SVGA3D_vgpu10_DefineAndBindShader(struct svga_winsys_context
*swc
,
1054 struct svga_winsys_gb_shader
*gbshader
,
1055 SVGA3dShaderId shaderId
,
1056 SVGA3dShaderType type
,
1059 SVGA3dCmdHeader
*header
;
1060 SVGA3dCmdDXDefineShader
*dcmd
;
1061 SVGA3dCmdDXBindShader
*bcmd
;
1062 unsigned totalSize
= 2 * sizeof(*header
) +
1063 sizeof(*dcmd
) + sizeof(*bcmd
);
1065 /* Make sure there is room for both commands */
1066 header
= swc
->reserve(swc
, totalSize
, 2);
1068 return PIPE_ERROR_OUT_OF_MEMORY
;
1070 /* DXDefineShader command */
1071 header
->id
= SVGA_3D_CMD_DX_DEFINE_SHADER
;
1072 header
->size
= sizeof(*dcmd
);
1073 dcmd
= (SVGA3dCmdDXDefineShader
*)(header
+ 1);
1074 dcmd
->shaderId
= shaderId
;
1076 dcmd
->sizeInBytes
= sizeInBytes
;
1078 /* DXBindShader command */
1079 header
= (SVGA3dCmdHeader
*)(dcmd
+ 1);
1081 header
->id
= SVGA_3D_CMD_DX_BIND_SHADER
;
1082 header
->size
= sizeof(*bcmd
);
1083 bcmd
= (SVGA3dCmdDXBindShader
*)(header
+ 1);
1085 bcmd
->cid
= swc
->cid
;
1086 swc
->shader_relocation(swc
, NULL
, &bcmd
->mobid
,
1087 &bcmd
->offsetInBytes
, gbshader
, 0);
1089 bcmd
->shid
= shaderId
;
1096 SVGA3D_vgpu10_DestroyShader(struct svga_winsys_context
*swc
,
1097 SVGA3dShaderId shaderId
)
1099 SVGA3D_CREATE_COMMAND(DestroyShader
, DESTROY_SHADER
);
1101 cmd
->shaderId
= shaderId
;
1108 SVGA3D_vgpu10_DefineStreamOutput(struct svga_winsys_context
*swc
,
1109 SVGA3dStreamOutputId soid
,
1110 uint32 numOutputStreamEntries
,
1111 uint32 streamOutputStrideInBytes
[SVGA3D_DX_MAX_SOTARGETS
],
1112 const SVGA3dStreamOutputDeclarationEntry decl
[SVGA3D_MAX_STREAMOUT_DECLS
])
1115 SVGA3D_CREATE_COMMAND(DefineStreamOutput
, DEFINE_STREAMOUTPUT
);
1118 cmd
->numOutputStreamEntries
= numOutputStreamEntries
;
1120 for (i
= 0; i
< ARRAY_SIZE(cmd
->streamOutputStrideInBytes
); i
++)
1121 cmd
->streamOutputStrideInBytes
[i
] = streamOutputStrideInBytes
[i
];
1123 memcpy(cmd
->decl
, decl
,
1124 sizeof(SVGA3dStreamOutputDeclarationEntry
)
1125 * SVGA3D_MAX_STREAMOUT_DECLS
);
1132 SVGA3D_vgpu10_DestroyStreamOutput(struct svga_winsys_context
*swc
,
1133 SVGA3dStreamOutputId soid
)
1135 SVGA3D_CREATE_COMMAND(DestroyStreamOutput
, DESTROY_STREAMOUTPUT
);
1144 SVGA3D_vgpu10_SetInputLayout(struct svga_winsys_context
*swc
,
1145 SVGA3dElementLayoutId elementLayoutId
)
1147 SVGA3D_CREATE_COMMAND(SetInputLayout
, SET_INPUT_LAYOUT
);
1149 cmd
->elementLayoutId
= elementLayoutId
;
1156 SVGA3D_vgpu10_SetVertexBuffers(struct svga_winsys_context
*swc
,
1159 const SVGA3dVertexBuffer
*bufferInfo
,
1160 struct svga_winsys_surface
**surfaces
)
1162 SVGA3dCmdDXSetVertexBuffers
*cmd
;
1163 SVGA3dVertexBuffer
*bufs
;
1168 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_SET_VERTEX_BUFFERS
,
1169 sizeof(SVGA3dCmdDXSetVertexBuffers
) +
1170 count
* sizeof(SVGA3dVertexBuffer
),
1171 count
); /* 'count' relocations */
1173 return PIPE_ERROR_OUT_OF_MEMORY
;
1175 cmd
->startBuffer
= startBuffer
;
1177 bufs
= (SVGA3dVertexBuffer
*) &cmd
[1];
1178 for (i
= 0; i
< count
; i
++) {
1179 bufs
[i
].stride
= bufferInfo
[i
].stride
;
1180 bufs
[i
].offset
= bufferInfo
[i
].offset
;
1181 assert(bufs
[i
].stride
% 4 == 0);
1182 assert(bufs
[i
].offset
% 4 == 0);
1183 swc
->surface_relocation(swc
, &bufs
[i
].sid
, NULL
, surfaces
[i
],
1192 SVGA3D_vgpu10_SetTopology(struct svga_winsys_context
*swc
,
1193 SVGA3dPrimitiveType topology
)
1195 SVGA3D_CREATE_COMMAND(SetTopology
, SET_TOPOLOGY
);
1197 cmd
->topology
= topology
;
1204 SVGA3D_vgpu10_SetIndexBuffer(struct svga_winsys_context
*swc
,
1205 struct svga_winsys_surface
*indexes
,
1206 SVGA3dSurfaceFormat format
,
1209 SVGA3dCmdDXSetIndexBuffer
*cmd
;
1211 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_SET_INDEX_BUFFER
,
1212 sizeof(SVGA3dCmdDXSetIndexBuffer
),
1213 1); /* one relocations */
1215 return PIPE_ERROR_OUT_OF_MEMORY
;
1217 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, indexes
, SVGA_RELOC_READ
);
1218 SVGA3D_COPY_BASIC_2(format
, offset
);
1225 SVGA3D_vgpu10_SetSingleConstantBuffer(struct svga_winsys_context
*swc
,
1227 SVGA3dShaderType type
,
1228 struct svga_winsys_surface
*surface
,
1229 uint32 offsetInBytes
,
1232 SVGA3dCmdDXSetSingleConstantBuffer
*cmd
;
1234 assert(offsetInBytes
% 256 == 0);
1236 assert(sizeInBytes
== 0);
1238 assert(sizeInBytes
> 0);
1240 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_SET_SINGLE_CONSTANT_BUFFER
,
1241 sizeof(SVGA3dCmdDXSetSingleConstantBuffer
),
1242 1); /* one relocation */
1244 return PIPE_ERROR_OUT_OF_MEMORY
;
1248 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, surface
, SVGA_RELOC_READ
);
1249 cmd
->offsetInBytes
= offsetInBytes
;
1250 cmd
->sizeInBytes
= sizeInBytes
;
1259 SVGA3D_vgpu10_ReadbackSubResource(struct svga_winsys_context
*swc
,
1260 struct svga_winsys_surface
*surface
,
1261 unsigned subResource
)
1263 SVGA3dCmdDXReadbackSubResource
*cmd
;
1265 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_READBACK_SUBRESOURCE
,
1266 sizeof(SVGA3dCmdDXReadbackSubResource
),
1269 return PIPE_ERROR_OUT_OF_MEMORY
;
1271 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, surface
,
1272 SVGA_RELOC_READ
| SVGA_RELOC_INTERNAL
);
1273 cmd
->subResource
= subResource
;
1280 SVGA3D_vgpu10_UpdateSubResource(struct svga_winsys_context
*swc
,
1281 struct svga_winsys_surface
*surface
,
1282 const SVGA3dBox
*box
,
1283 unsigned subResource
)
1285 SVGA3dCmdDXUpdateSubResource
*cmd
;
1287 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_UPDATE_SUBRESOURCE
,
1288 sizeof(SVGA3dCmdDXUpdateSubResource
),
1291 return PIPE_ERROR_OUT_OF_MEMORY
;
1293 swc
->surface_relocation(swc
, &cmd
->sid
, NULL
, surface
,
1294 SVGA_RELOC_WRITE
| SVGA_RELOC_INTERNAL
);
1295 cmd
->subResource
= subResource
;
1303 SVGA3D_vgpu10_GenMips(struct svga_winsys_context
*swc
,
1304 SVGA3dShaderResourceViewId shaderResourceViewId
,
1305 struct svga_winsys_surface
*view
)
1307 SVGA3dCmdDXGenMips
*cmd
;
1309 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_GENMIPS
,
1310 sizeof(SVGA3dCmdDXGenMips
), 1);
1313 return PIPE_ERROR_OUT_OF_MEMORY
;
1315 swc
->surface_relocation(swc
, &cmd
->shaderResourceViewId
, NULL
, view
,
1317 cmd
->shaderResourceViewId
= shaderResourceViewId
;
1325 SVGA3D_vgpu10_BufferCopy(struct svga_winsys_context
*swc
,
1326 struct svga_winsys_surface
*src
,
1327 struct svga_winsys_surface
*dst
,
1328 unsigned srcx
, unsigned dstx
, unsigned width
)
1330 SVGA3dCmdDXBufferCopy
*cmd
;
1332 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_BUFFER_COPY
, sizeof *cmd
, 2);
1335 return PIPE_ERROR_OUT_OF_MEMORY
;
1337 swc
->surface_relocation(swc
, &cmd
->dest
, NULL
, dst
, SVGA_RELOC_WRITE
);
1338 swc
->surface_relocation(swc
, &cmd
->src
, NULL
, src
, SVGA_RELOC_READ
);
1348 SVGA3D_vgpu10_TransferFromBuffer(struct svga_winsys_context
*swc
,
1349 struct svga_winsys_surface
*src
,
1350 unsigned srcOffset
, unsigned srcPitch
,
1351 unsigned srcSlicePitch
,
1352 struct svga_winsys_surface
*dst
,
1353 unsigned dstSubResource
,
1356 SVGA3dCmdDXTransferFromBuffer
*cmd
;
1358 cmd
= SVGA3D_FIFOReserve(swc
, SVGA_3D_CMD_DX_TRANSFER_FROM_BUFFER
,
1359 sizeof(SVGA3dCmdDXTransferFromBuffer
), 2);
1362 return PIPE_ERROR_OUT_OF_MEMORY
;
1364 swc
->surface_relocation(swc
, &cmd
->srcSid
, NULL
, src
, SVGA_RELOC_READ
);
1365 swc
->surface_relocation(swc
, &cmd
->destSid
, NULL
, dst
, SVGA_RELOC_WRITE
);
1366 cmd
->srcOffset
= srcOffset
;
1367 cmd
->srcPitch
= srcPitch
;
1368 cmd
->srcSlicePitch
= srcSlicePitch
;
1369 cmd
->destSubResource
= dstSubResource
;
1370 cmd
->destBox
= *dstBox
;
1377 SVGA3D_vgpu10_IntraSurfaceCopy(struct svga_winsys_context
*swc
,
1378 struct svga_winsys_surface
*surface
,
1379 unsigned level
, unsigned face
,
1380 const SVGA3dCopyBox
*box
)
1382 SVGA3dCmdIntraSurfaceCopy
*cmd
=
1383 SVGA3D_FIFOReserve(swc
,
1384 SVGA_3D_CMD_INTRA_SURFACE_COPY
,
1385 sizeof(SVGA3dCmdIntraSurfaceCopy
),
1386 1); /* one relocation */
1388 return PIPE_ERROR_OUT_OF_MEMORY
;
1390 swc
->surface_relocation(swc
, &cmd
->surface
.sid
, NULL
, surface
, SVGA_RELOC_READ
| SVGA_RELOC_WRITE
);
1391 cmd
->surface
.face
= face
;
1392 cmd
->surface
.mipmap
= level
;
1401 SVGA3D_vgpu10_ResolveCopy(struct svga_winsys_context
*swc
,
1402 unsigned dstSubResource
,
1403 struct svga_winsys_surface
*dst
,
1404 unsigned srcSubResource
,
1405 struct svga_winsys_surface
*src
,
1406 const SVGA3dSurfaceFormat copyFormat
)
1408 SVGA3dCmdDXResolveCopy
*cmd
=
1409 SVGA3D_FIFOReserve(swc
,
1410 SVGA_3D_CMD_DX_RESOLVE_COPY
,
1411 sizeof(SVGA3dCmdDXResolveCopy
),
1412 2); /* two relocations */
1414 return PIPE_ERROR_OUT_OF_MEMORY
;
1416 cmd
->dstSubResource
= dstSubResource
;
1417 swc
->surface_relocation(swc
, &cmd
->dstSid
, NULL
, dst
, SVGA_RELOC_WRITE
);
1418 cmd
->srcSubResource
= srcSubResource
;
1419 swc
->surface_relocation(swc
, &cmd
->srcSid
, NULL
, src
, SVGA_RELOC_READ
);
1420 cmd
->copyFormat
= copyFormat
;