Home | History | Annotate | Download | only in svga
      1 /**********************************************************
      2  * Copyright 2008-2013 VMware, Inc.  All rights reserved.
      3  *
      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:
     11  *
     12  * The above copyright notice and this permission notice shall be
     13  * included in all copies or substantial portions of the Software.
     14  *
     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
     22  * SOFTWARE.
     23  *
     24  **********************************************************/
     25 
     26 /**
     27  * @file svga_cmd_vgpu10.c
     28  *
     29  * Command construction utility for the vgpu10 SVGA3D protocol.
     30  *
     31  * \author Mingcheng Chen
     32  * \author Brian Paul
     33  */
     34 
     35 
     36 #include "svga_winsys.h"
     37 #include "svga_resource_buffer.h"
     38 #include "svga_resource_texture.h"
     39 #include "svga_surface.h"
     40 #include "svga_cmd.h"
     41 
     42 
     43 /**
     44  * Emit a surface relocation for RenderTargetViewId
     45  */
     46 static void
     47 view_relocation(struct svga_winsys_context *swc, // IN
     48                 struct pipe_surface *surface,    // IN
     49                 SVGA3dRenderTargetViewId *id,    // OUT
     50                 unsigned flags)
     51 {
     52    if (surface) {
     53       struct svga_surface *s = svga_surface(surface);
     54       assert(s->handle);
     55       swc->surface_relocation(swc, id, NULL, s->handle, flags);
     56    }
     57    else {
     58       swc->surface_relocation(swc, id, NULL, NULL, flags);
     59    }
     60 }
     61 
     62 
     63 /**
     64  * Emit a surface relocation for a ResourceId.
     65  */
     66 static void
     67 surface_to_resourceid(struct svga_winsys_context *swc, // IN
     68                       struct svga_winsys_surface *surface,    // IN
     69                       SVGA3dSurfaceId *sid,            // OUT
     70                       unsigned flags)                  // IN
     71 {
     72    if (surface) {
     73       swc->surface_relocation(swc, sid, NULL, surface, flags);
     74    }
     75    else {
     76       swc->surface_relocation(swc, sid, NULL, NULL, flags);
     77    }
     78 }
     79 
     80 
     81 #define SVGA3D_CREATE_COMMAND(CommandName, CommandCode) \
     82 SVGA3dCmdDX##CommandName *cmd; \
     83 { \
     84    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_##CommandCode, \
     85                             sizeof(SVGA3dCmdDX##CommandName), 0); \
     86    if (!cmd) \
     87       return PIPE_ERROR_OUT_OF_MEMORY; \
     88 }
     89 
     90 #define SVGA3D_CREATE_CMD_COUNT(CommandName, CommandCode, ElementClassName) \
     91 SVGA3dCmdDX##CommandName *cmd; \
     92 { \
     93    assert(count > 0); \
     94    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_##CommandCode, \
     95                             sizeof(SVGA3dCmdDX##CommandName) + \
     96                             count * sizeof(ElementClassName), 0); \
     97    if (!cmd) \
     98       return PIPE_ERROR_OUT_OF_MEMORY; \
     99 }
    100 
    101 #define SVGA3D_COPY_BASIC(VariableName) \
    102 { \
    103    cmd->VariableName = VariableName; \
    104 }
    105 
    106 #define SVGA3D_COPY_BASIC_2(VariableName1, VariableName2) \
    107 { \
    108    SVGA3D_COPY_BASIC(VariableName1); \
    109    SVGA3D_COPY_BASIC(VariableName2); \
    110 }
    111 
    112 #define SVGA3D_COPY_BASIC_3(VariableName1, VariableName2, VariableName3) \
    113 { \
    114    SVGA3D_COPY_BASIC_2(VariableName1, VariableName2); \
    115    SVGA3D_COPY_BASIC(VariableName3); \
    116 }
    117 
    118 #define SVGA3D_COPY_BASIC_4(VariableName1, VariableName2, VariableName3, \
    119                             VariableName4) \
    120 { \
    121    SVGA3D_COPY_BASIC_2(VariableName1, VariableName2); \
    122    SVGA3D_COPY_BASIC_2(VariableName3, VariableName4); \
    123 }
    124 
    125 #define SVGA3D_COPY_BASIC_5(VariableName1, VariableName2, VariableName3, \
    126                             VariableName4, VariableName5) \
    127 {\
    128    SVGA3D_COPY_BASIC_3(VariableName1, VariableName2, VariableName3); \
    129    SVGA3D_COPY_BASIC_2(VariableName4, VariableName5); \
    130 }
    131 
    132 #define SVGA3D_COPY_BASIC_6(VariableName1, VariableName2, VariableName3, \
    133                             VariableName4, VariableName5, VariableName6) \
    134 {\
    135    SVGA3D_COPY_BASIC_3(VariableName1, VariableName2, VariableName3); \
    136    SVGA3D_COPY_BASIC_3(VariableName4, VariableName5, VariableName6); \
    137 }
    138 
    139 #define SVGA3D_COPY_BASIC_7(VariableName1, VariableName2, VariableName3, \
    140                             VariableName4, VariableName5, VariableName6, \
    141                             VariableName7) \
    142 {\
    143    SVGA3D_COPY_BASIC_4(VariableName1, VariableName2, VariableName3, \
    144                        VariableName4); \
    145    SVGA3D_COPY_BASIC_3(VariableName5, VariableName6, VariableName7); \
    146 }
    147 
    148 #define SVGA3D_COPY_BASIC_8(VariableName1, VariableName2, VariableName3, \
    149                             VariableName4, VariableName5, VariableName6, \
    150                             VariableName7, VariableName8) \
    151 {\
    152    SVGA3D_COPY_BASIC_4(VariableName1, VariableName2, VariableName3, \
    153                        VariableName4); \
    154    SVGA3D_COPY_BASIC_4(VariableName5, VariableName6, VariableName7, \
    155                        VariableName8); \
    156 }
    157 
    158 #define SVGA3D_COPY_BASIC_9(VariableName1, VariableName2, VariableName3, \
    159                             VariableName4, VariableName5, VariableName6, \
    160                             VariableName7, VariableName8, VariableName9) \
    161 {\
    162    SVGA3D_COPY_BASIC_5(VariableName1, VariableName2, VariableName3, \
    163                        VariableName4, VariableName5); \
    164    SVGA3D_COPY_BASIC_4(VariableName6, VariableName7, VariableName8, \
    165                        VariableName9); \
    166 }
    167 
    168 
    169 enum pipe_error
    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)
    176 {
    177    SVGA3dCmdDXPredCopyRegion *cmd =
    178       SVGA3D_FIFOReserve(swc,
    179                          SVGA_3D_CMD_DX_PRED_COPY_REGION,
    180                          sizeof(SVGA3dCmdDXPredCopyRegion),
    181                          2);  /* two relocations */
    182    if (!cmd)
    183       return PIPE_ERROR_OUT_OF_MEMORY;
    184 
    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;
    189    cmd->box = *box;
    190 
    191    swc->commit(swc);
    192 
    193    return PIPE_OK;
    194 }
    195 
    196 
    197 enum pipe_error
    198 SVGA3D_vgpu10_PredCopy(struct svga_winsys_context *swc,
    199                        struct svga_winsys_surface *dstSurf,
    200                        struct svga_winsys_surface *srcSurf)
    201 {
    202    SVGA3dCmdDXPredCopy *cmd =
    203       SVGA3D_FIFOReserve(swc,
    204                          SVGA_3D_CMD_DX_PRED_COPY,
    205                          sizeof(SVGA3dCmdDXPredCopy),
    206                          2);  /* two relocations */
    207    if (!cmd)
    208       return PIPE_ERROR_OUT_OF_MEMORY;
    209 
    210    swc->surface_relocation(swc, &cmd->dstSid, NULL, dstSurf, SVGA_RELOC_WRITE);
    211    swc->surface_relocation(swc, &cmd->srcSid, NULL, srcSurf, SVGA_RELOC_READ);
    212 
    213    swc->commit(swc);
    214 
    215    return PIPE_OK;
    216 }
    217 
    218 enum pipe_error
    219 SVGA3D_vgpu10_SetViewports(struct svga_winsys_context *swc,
    220                            unsigned count,
    221                            const SVGA3dViewport *viewports)
    222 {
    223    SVGA3D_CREATE_CMD_COUNT(SetViewports, SET_VIEWPORTS, SVGA3dViewport);
    224 
    225    memcpy(cmd + 1, viewports, count * sizeof(SVGA3dViewport));
    226 
    227    swc->commit(swc);
    228    return PIPE_OK;
    229 }
    230 
    231 
    232 enum pipe_error
    233 SVGA3D_vgpu10_SetShader(struct svga_winsys_context *swc,
    234                         SVGA3dShaderType type,
    235                         struct svga_winsys_gb_shader *gbshader,
    236                         SVGA3dShaderId shaderId)
    237 {
    238    SVGA3dCmdDXSetShader *cmd = SVGA3D_FIFOReserve(swc,
    239                                                   SVGA_3D_CMD_DX_SET_SHADER,
    240                                                   sizeof *cmd,
    241                                                   1);  /* one relocation */
    242    if (!cmd)
    243       return PIPE_ERROR_OUT_OF_MEMORY;
    244 
    245    swc->shader_relocation(swc, &cmd->shaderId, NULL, NULL, gbshader, 0);
    246 
    247    cmd->type = type;
    248    cmd->shaderId = shaderId;
    249    swc->commit(swc);
    250 
    251    return PIPE_OK;
    252 }
    253 
    254 
    255 enum pipe_error
    256 SVGA3D_vgpu10_SetShaderResources(struct svga_winsys_context *swc,
    257                                  SVGA3dShaderType type,
    258                                  uint32 startView,
    259                                  unsigned count,
    260                                  const SVGA3dShaderResourceViewId ids[],
    261                                  struct svga_winsys_surface **views)
    262 {
    263    SVGA3dCmdDXSetShaderResources *cmd;
    264    SVGA3dShaderResourceViewId *cmd_ids;
    265    unsigned i;
    266 
    267    cmd = SVGA3D_FIFOReserve(swc,
    268                             SVGA_3D_CMD_DX_SET_SHADER_RESOURCES,
    269                             sizeof(SVGA3dCmdDXSetShaderResources) +
    270                             count * sizeof(SVGA3dShaderResourceViewId),
    271                             count); /* 'count' relocations */
    272    if (!cmd)
    273       return PIPE_ERROR_OUT_OF_MEMORY;
    274 
    275 
    276    cmd->type = type;
    277    cmd->startView = startView;
    278 
    279    cmd_ids = (SVGA3dShaderResourceViewId *) (cmd + 1);
    280    for (i = 0; i < count; i++) {
    281       swc->surface_relocation(swc, cmd_ids + i, NULL, views[i],
    282                               SVGA_RELOC_READ);
    283       cmd_ids[i] = ids[i];
    284    }
    285 
    286    swc->commit(swc);
    287    return PIPE_OK;
    288 }
    289 
    290 
    291 enum pipe_error
    292 SVGA3D_vgpu10_SetSamplers(struct svga_winsys_context *swc,
    293                           unsigned count,
    294                           uint32 startSampler,
    295                           SVGA3dShaderType type,
    296                           const SVGA3dSamplerId *samplerIds)
    297 {
    298    SVGA3D_CREATE_CMD_COUNT(SetSamplers, SET_SAMPLERS, SVGA3dSamplerId);
    299 
    300    SVGA3D_COPY_BASIC_2(startSampler, type);
    301    memcpy(cmd + 1, samplerIds, count * sizeof(SVGA3dSamplerId));
    302 
    303    swc->commit(swc);
    304    return PIPE_OK;
    305 }
    306 
    307 
    308 enum pipe_error
    309 SVGA3D_vgpu10_ClearRenderTargetView(struct svga_winsys_context *swc,
    310                                     struct pipe_surface *color_surf,
    311                                     const float *rgba)
    312 {
    313    SVGA3dCmdDXClearRenderTargetView *cmd;
    314    struct svga_surface *ss = svga_surface(color_surf);
    315 
    316    cmd = SVGA3D_FIFOReserve(swc,
    317                             SVGA_3D_CMD_DX_CLEAR_RENDERTARGET_VIEW,
    318                             sizeof(SVGA3dCmdDXClearRenderTargetView),
    319                             1); /* one relocation */
    320    if (!cmd)
    321       return PIPE_ERROR_OUT_OF_MEMORY;
    322 
    323 
    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.
    328     */
    329    view_relocation(swc, color_surf, &cmd->renderTargetViewId,
    330                    SVGA_RELOC_WRITE);
    331    cmd->renderTargetViewId = ss->view_id;
    332 
    333    COPY_4V(cmd->rgba.value, rgba);
    334 
    335    swc->commit(swc);
    336    return PIPE_OK;
    337 }
    338 
    339 
    340 enum pipe_error
    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)
    345 {
    346    const unsigned surf_count = color_count + 1;
    347    SVGA3dCmdDXSetRenderTargets *cmd;
    348    SVGA3dRenderTargetViewId *ctarget;
    349    struct svga_surface *ss;
    350    unsigned i;
    351 
    352    assert(surf_count > 0);
    353 
    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 */
    359    if (!cmd)
    360       return PIPE_ERROR_OUT_OF_MEMORY;
    361 
    362    /* NOTE: See earlier comment about the tricky handling of the ViewIds.
    363     */
    364 
    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,
    369                       SVGA_RELOC_WRITE);
    370       cmd->depthStencilViewId = ss->view_id;
    371    }
    372    else {
    373       /* no depth/stencil buffer - still need a relocation */
    374       view_relocation(swc, NULL, &cmd->depthStencilViewId,
    375                       SVGA_RELOC_WRITE);
    376       cmd->depthStencilViewId = SVGA3D_INVALID_ID;
    377    }
    378 
    379    /* Color buffers */
    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;
    386       }
    387       else {
    388          view_relocation(swc, NULL, ctarget + i, SVGA_RELOC_WRITE);
    389          ctarget[i] = SVGA3D_INVALID_ID;
    390       }
    391    }
    392 
    393    swc->commit(swc);
    394    return PIPE_OK;
    395 }
    396 
    397 
    398 enum pipe_error
    399 SVGA3D_vgpu10_SetBlendState(struct svga_winsys_context *swc,
    400                             SVGA3dBlendStateId blendId,
    401                             const float *blendFactor,
    402                             uint32 sampleMask)
    403 {
    404    SVGA3D_CREATE_COMMAND(SetBlendState, SET_BLEND_STATE);
    405 
    406    SVGA3D_COPY_BASIC_2(blendId, sampleMask);
    407    memcpy(cmd->blendFactor, blendFactor, sizeof(float) * 4);
    408 
    409    swc->commit(swc);
    410    return PIPE_OK;
    411 }
    412 
    413 enum pipe_error
    414 SVGA3D_vgpu10_SetDepthStencilState(struct svga_winsys_context *swc,
    415                                    SVGA3dDepthStencilStateId depthStencilId,
    416                                    uint32 stencilRef)
    417 {
    418    SVGA3D_CREATE_COMMAND(SetDepthStencilState, SET_DEPTHSTENCIL_STATE);
    419 
    420    SVGA3D_COPY_BASIC_2(depthStencilId, stencilRef);
    421 
    422    swc->commit(swc);
    423    return PIPE_OK;
    424 }
    425 
    426 enum pipe_error
    427 SVGA3D_vgpu10_SetRasterizerState(struct svga_winsys_context *swc,
    428                                  SVGA3dRasterizerStateId rasterizerId)
    429 {
    430    SVGA3D_CREATE_COMMAND(SetRasterizerState, SET_RASTERIZER_STATE);
    431 
    432    cmd->rasterizerId = rasterizerId;
    433 
    434    swc->commit(swc);
    435    return PIPE_OK;
    436 }
    437 
    438 enum pipe_error
    439 SVGA3D_vgpu10_SetPredication(struct svga_winsys_context *swc,
    440                              SVGA3dQueryId queryId,
    441                              uint32 predicateValue)
    442 {
    443    SVGA3dCmdDXSetPredication *cmd;
    444 
    445    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_SET_PREDICATION,
    446                             sizeof *cmd, 0);
    447 
    448    if (!cmd)
    449       return PIPE_ERROR_OUT_OF_MEMORY;
    450 
    451    cmd->queryId = queryId;
    452    cmd->predicateValue = predicateValue;
    453    swc->commit(swc);
    454    return PIPE_OK;
    455 }
    456 
    457 enum pipe_error
    458 SVGA3D_vgpu10_SetSOTargets(struct svga_winsys_context *swc,
    459                            unsigned count,
    460                            const SVGA3dSoTarget *targets,
    461                            struct svga_winsys_surface **surfaces)
    462 {
    463    SVGA3dCmdDXSetSOTargets *cmd;
    464    SVGA3dSoTarget *sot;
    465    unsigned i;
    466 
    467    cmd = SVGA3D_FIFOReserve(swc,
    468                             SVGA_3D_CMD_DX_SET_SOTARGETS,
    469                             sizeof(SVGA3dCmdDXSetSOTargets) +
    470                             count * sizeof(SVGA3dSoTarget),
    471                             count);
    472 
    473    if (!cmd)
    474       return PIPE_ERROR_OUT_OF_MEMORY;
    475 
    476    cmd->pad0 = 0;
    477    sot = (SVGA3dSoTarget *)(cmd + 1);
    478    for (i = 0; i < count; i++, sot++) {
    479       if (surfaces[i]) {
    480          sot->offset = targets[i].offset;
    481          sot->sizeInBytes = targets[i].sizeInBytes;
    482          swc->surface_relocation(swc, &sot->sid, NULL, surfaces[i],
    483                                  SVGA_RELOC_WRITE);
    484       }
    485       else {
    486          sot->offset = 0;
    487          sot->sizeInBytes = ~0u;
    488          swc->surface_relocation(swc, &sot->sid, NULL, NULL,
    489                                  SVGA_RELOC_WRITE);
    490       }
    491    }
    492    swc->commit(swc);
    493    return PIPE_OK;
    494 }
    495 
    496 enum pipe_error
    497 SVGA3D_vgpu10_SetScissorRects(struct svga_winsys_context *swc,
    498                               unsigned count,
    499                               const SVGASignedRect *rects)
    500 {
    501    SVGA3dCmdDXSetScissorRects *cmd;
    502 
    503    assert(count > 0);
    504    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_SET_SCISSORRECTS,
    505                             sizeof(SVGA3dCmdDXSetScissorRects) +
    506                             count * sizeof(SVGASignedRect),
    507                             0);
    508    if (!cmd)
    509       return PIPE_ERROR_OUT_OF_MEMORY;
    510 
    511    memcpy(cmd + 1, rects, count * sizeof(SVGASignedRect));
    512 
    513    swc->commit(swc);
    514    return PIPE_OK;
    515 }
    516 
    517 enum pipe_error
    518 SVGA3D_vgpu10_SetStreamOutput(struct svga_winsys_context *swc,
    519                               SVGA3dStreamOutputId soid)
    520 {
    521    SVGA3D_CREATE_COMMAND(SetStreamOutput, SET_STREAMOUTPUT);
    522 
    523    cmd->soid = soid;
    524 
    525    swc->commit(swc);
    526    return PIPE_OK;
    527 }
    528 
    529 enum pipe_error
    530 SVGA3D_vgpu10_Draw(struct svga_winsys_context *swc,
    531                    uint32 vertexCount,
    532                    uint32 startVertexLocation)
    533 {
    534    SVGA3D_CREATE_COMMAND(Draw, DRAW);
    535 
    536    SVGA3D_COPY_BASIC_2(vertexCount, startVertexLocation);
    537 
    538    swc->hints |= SVGA_HINT_FLAG_CAN_PRE_FLUSH;
    539    swc->commit(swc);
    540    swc->num_draw_commands++;
    541    return PIPE_OK;
    542 }
    543 
    544 enum pipe_error
    545 SVGA3D_vgpu10_DrawIndexed(struct svga_winsys_context *swc,
    546                           uint32 indexCount,
    547                           uint32 startIndexLocation,
    548                           int32 baseVertexLocation)
    549 {
    550    SVGA3D_CREATE_COMMAND(DrawIndexed, DRAW_INDEXED);
    551 
    552    SVGA3D_COPY_BASIC_3(indexCount, startIndexLocation,
    553                        baseVertexLocation);
    554 
    555    swc->hints |= SVGA_HINT_FLAG_CAN_PRE_FLUSH;
    556    swc->commit(swc);
    557    swc->num_draw_commands++;
    558    return PIPE_OK;
    559 }
    560 
    561 enum pipe_error
    562 SVGA3D_vgpu10_DrawInstanced(struct svga_winsys_context *swc,
    563                             uint32 vertexCountPerInstance,
    564                             uint32 instanceCount,
    565                             uint32 startVertexLocation,
    566                             uint32 startInstanceLocation)
    567 {
    568    SVGA3D_CREATE_COMMAND(DrawInstanced, DRAW_INSTANCED);
    569 
    570    SVGA3D_COPY_BASIC_4(vertexCountPerInstance, instanceCount,
    571                        startVertexLocation, startInstanceLocation);
    572 
    573    swc->hints |= SVGA_HINT_FLAG_CAN_PRE_FLUSH;
    574    swc->commit(swc);
    575    swc->num_draw_commands++;
    576    return PIPE_OK;
    577 }
    578 
    579 enum pipe_error
    580 SVGA3D_vgpu10_DrawIndexedInstanced(struct svga_winsys_context *swc,
    581                                    uint32 indexCountPerInstance,
    582                                    uint32 instanceCount,
    583                                    uint32 startIndexLocation,
    584                                    int32  baseVertexLocation,
    585                                    uint32 startInstanceLocation)
    586 {
    587    SVGA3D_CREATE_COMMAND(DrawIndexedInstanced, DRAW_INDEXED_INSTANCED);
    588 
    589    SVGA3D_COPY_BASIC_5(indexCountPerInstance, instanceCount,
    590                        startIndexLocation, baseVertexLocation,
    591                        startInstanceLocation);
    592 
    593 
    594    swc->hints |= SVGA_HINT_FLAG_CAN_PRE_FLUSH;
    595    swc->commit(swc);
    596    swc->num_draw_commands++;
    597    return PIPE_OK;
    598 }
    599 
    600 enum pipe_error
    601 SVGA3D_vgpu10_DrawAuto(struct svga_winsys_context *swc)
    602 {
    603    SVGA3D_CREATE_COMMAND(DrawAuto, DRAW_AUTO);
    604 
    605    swc->hints |= SVGA_HINT_FLAG_CAN_PRE_FLUSH;
    606    swc->commit(swc);
    607    swc->num_draw_commands++;
    608    return PIPE_OK;
    609 }
    610 
    611 enum pipe_error
    612 SVGA3D_vgpu10_DefineQuery(struct svga_winsys_context *swc,
    613                           SVGA3dQueryId queryId,
    614                           SVGA3dQueryType type,
    615                           SVGA3dDXQueryFlags flags)
    616 {
    617    SVGA3D_CREATE_COMMAND(DefineQuery, DEFINE_QUERY);
    618 
    619    SVGA3D_COPY_BASIC_3(queryId, type, flags);
    620 
    621    swc->commit(swc);
    622    return PIPE_OK;
    623 }
    624 
    625 enum pipe_error
    626 SVGA3D_vgpu10_DestroyQuery(struct svga_winsys_context *swc,
    627                            SVGA3dQueryId queryId)
    628 {
    629    SVGA3D_CREATE_COMMAND(DestroyQuery, DESTROY_QUERY);
    630 
    631    cmd->queryId = queryId;
    632 
    633    swc->commit(swc);
    634    return PIPE_OK;
    635 }
    636 
    637 enum pipe_error
    638 SVGA3D_vgpu10_BindQuery(struct svga_winsys_context *swc,
    639                         struct svga_winsys_gb_query *gbQuery,
    640                         SVGA3dQueryId queryId)
    641 {
    642    SVGA3dCmdDXBindQuery *cmd = SVGA3D_FIFOReserve(swc,
    643                                                   SVGA_3D_CMD_DX_BIND_QUERY,
    644                                                   sizeof *cmd,
    645                                                   1);
    646    if (!cmd)
    647       return PIPE_ERROR_OUT_OF_MEMORY;
    648 
    649    cmd->queryId = queryId;
    650    swc->query_relocation(swc, &cmd->mobid, gbQuery);
    651 
    652    swc->commit(swc);
    653    return PIPE_OK;
    654 }
    655 
    656 enum pipe_error
    657 SVGA3D_vgpu10_SetQueryOffset(struct svga_winsys_context *swc,
    658                              SVGA3dQueryId queryId,
    659                              uint32 mobOffset)
    660 {
    661    SVGA3D_CREATE_COMMAND(SetQueryOffset, SET_QUERY_OFFSET);
    662    SVGA3D_COPY_BASIC_2(queryId, mobOffset);
    663    swc->commit(swc);
    664    return PIPE_OK;
    665 }
    666 
    667 enum pipe_error
    668 SVGA3D_vgpu10_BeginQuery(struct svga_winsys_context *swc,
    669                          SVGA3dQueryId queryId)
    670 {
    671    SVGA3D_CREATE_COMMAND(BeginQuery, BEGIN_QUERY);
    672    cmd->queryId = queryId;
    673    swc->commit(swc);
    674    return PIPE_OK;
    675 }
    676 
    677 enum pipe_error
    678 SVGA3D_vgpu10_EndQuery(struct svga_winsys_context *swc,
    679                        SVGA3dQueryId queryId)
    680 {
    681    SVGA3D_CREATE_COMMAND(EndQuery, END_QUERY);
    682    cmd->queryId = queryId;
    683    swc->commit(swc);
    684    return PIPE_OK;
    685 }
    686 
    687 
    688 enum pipe_error
    689 SVGA3D_vgpu10_ClearDepthStencilView(struct svga_winsys_context *swc,
    690                                     struct pipe_surface *ds_surf,
    691                                     uint16 flags,
    692                                     uint16 stencil,
    693                                     float depth)
    694 {
    695    SVGA3dCmdDXClearDepthStencilView *cmd;
    696    struct svga_surface *ss = svga_surface(ds_surf);
    697 
    698    cmd = SVGA3D_FIFOReserve(swc,
    699                             SVGA_3D_CMD_DX_CLEAR_DEPTHSTENCIL_VIEW,
    700                             sizeof(SVGA3dCmdDXClearDepthStencilView),
    701                             1); /* one relocation */
    702    if (!cmd)
    703       return PIPE_ERROR_OUT_OF_MEMORY;
    704 
    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.
    709     */
    710    view_relocation(swc, ds_surf, &cmd->depthStencilViewId,
    711                    SVGA_RELOC_WRITE);
    712    cmd->depthStencilViewId = ss->view_id;
    713    cmd->flags = flags;
    714    cmd->stencil = stencil;
    715    cmd->depth = depth;
    716 
    717    swc->commit(swc);
    718    return PIPE_OK;
    719 }
    720 
    721 enum pipe_error
    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)
    728 {
    729    SVGA3dCmdDXDefineShaderResourceView *cmd;
    730 
    731    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_DEFINE_SHADERRESOURCE_VIEW,
    732                             sizeof(SVGA3dCmdDXDefineShaderResourceView),
    733                             1); /* one relocation */
    734    if (!cmd)
    735       return PIPE_ERROR_OUT_OF_MEMORY;
    736 
    737    SVGA3D_COPY_BASIC_3(shaderResourceViewId, format, resourceDimension);
    738 
    739    swc->surface_relocation(swc, &cmd->sid, NULL, surface,
    740                            SVGA_RELOC_READ);
    741 
    742    cmd->desc = *desc;
    743 
    744    swc->commit(swc);
    745    return PIPE_OK;
    746 }
    747 
    748 enum pipe_error
    749 SVGA3D_vgpu10_DestroyShaderResourceView(struct svga_winsys_context *swc,
    750                              SVGA3dShaderResourceViewId shaderResourceViewId)
    751 {
    752    SVGA3D_CREATE_COMMAND(DestroyShaderResourceView,
    753                        DESTROY_SHADERRESOURCE_VIEW);
    754 
    755    cmd->shaderResourceViewId = shaderResourceViewId;
    756 
    757    swc->commit(swc);
    758    return PIPE_OK;
    759 }
    760 
    761 
    762 enum pipe_error
    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)
    769 {
    770    SVGA3dCmdDXDefineRenderTargetView *cmd;
    771 
    772    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_DEFINE_RENDERTARGET_VIEW,
    773                             sizeof(SVGA3dCmdDXDefineRenderTargetView),
    774                             1); /* one relocation */
    775    if (!cmd)
    776       return PIPE_ERROR_OUT_OF_MEMORY;
    777 
    778    SVGA3D_COPY_BASIC_3(renderTargetViewId, format, resourceDimension);
    779    cmd->desc = *desc;
    780 
    781    surface_to_resourceid(swc, surface,
    782                          &cmd->sid,
    783                          SVGA_RELOC_READ | SVGA_RELOC_WRITE);
    784 
    785    swc->commit(swc);
    786    return PIPE_OK;
    787 }
    788 
    789 enum pipe_error
    790 SVGA3D_vgpu10_DestroyRenderTargetView(struct svga_winsys_context *swc,
    791                                  SVGA3dRenderTargetViewId renderTargetViewId)
    792 {
    793    SVGA3D_CREATE_COMMAND(DestroyRenderTargetView, DESTROY_RENDERTARGET_VIEW);
    794 
    795    cmd->renderTargetViewId = renderTargetViewId;
    796 
    797    swc->commit(swc);
    798    return PIPE_OK;
    799 }
    800 
    801 
    802 enum pipe_error
    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)
    809 {
    810    SVGA3dCmdDXDefineDepthStencilView *cmd;
    811 
    812    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_DEFINE_DEPTHSTENCIL_VIEW,
    813                             sizeof(SVGA3dCmdDXDefineDepthStencilView),
    814                             1); /* one relocation */
    815    if (!cmd)
    816       return PIPE_ERROR_OUT_OF_MEMORY;
    817 
    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;
    822 
    823    surface_to_resourceid(swc, surface,
    824                          &cmd->sid,
    825                          SVGA_RELOC_READ | SVGA_RELOC_WRITE);
    826 
    827    swc->commit(swc);
    828    return PIPE_OK;
    829 }
    830 
    831 enum pipe_error
    832 SVGA3D_vgpu10_DestroyDepthStencilView(struct svga_winsys_context *swc,
    833                                  SVGA3dDepthStencilViewId depthStencilViewId)
    834 {
    835    SVGA3D_CREATE_COMMAND(DestroyDepthStencilView, DESTROY_DEPTHSTENCIL_VIEW);
    836 
    837    cmd->depthStencilViewId = depthStencilViewId;
    838 
    839    swc->commit(swc);
    840    return PIPE_OK;
    841 }
    842 
    843 enum pipe_error
    844 SVGA3D_vgpu10_DefineElementLayout(struct svga_winsys_context *swc,
    845                                   unsigned count,
    846                                   SVGA3dElementLayoutId elementLayoutId,
    847                                   const SVGA3dInputElementDesc *elements)
    848 {
    849    SVGA3dCmdDXDefineElementLayout *cmd;
    850    unsigned i;
    851 
    852    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_DEFINE_ELEMENTLAYOUT,
    853                             sizeof(SVGA3dCmdDXDefineElementLayout) +
    854                             count * sizeof(SVGA3dInputElementDesc), 0);
    855    if (!cmd)
    856       return PIPE_ERROR_OUT_OF_MEMORY;
    857 
    858    /* check that all offsets are multiples of four */
    859    for (i = 0; i < count; i++) {
    860       assert(elements[i].alignedByteOffset % 4 == 0);
    861    }
    862    (void) i; /* silence unused var in release build */
    863 
    864    cmd->elementLayoutId = elementLayoutId;
    865    memcpy(cmd + 1, elements, count * sizeof(SVGA3dInputElementDesc));
    866 
    867    swc->commit(swc);
    868    return PIPE_OK;
    869 }
    870 
    871 enum pipe_error
    872 SVGA3D_vgpu10_DestroyElementLayout(struct svga_winsys_context *swc,
    873                                    SVGA3dElementLayoutId elementLayoutId)
    874 {
    875    SVGA3D_CREATE_COMMAND(DestroyElementLayout, DESTROY_ELEMENTLAYOUT);
    876 
    877    cmd->elementLayoutId = elementLayoutId;
    878 
    879    swc->commit(swc);
    880    return PIPE_OK;
    881 }
    882 
    883 enum pipe_error
    884 SVGA3D_vgpu10_DefineBlendState(struct svga_winsys_context *swc,
    885                                SVGA3dBlendStateId blendId,
    886                                uint8 alphaToCoverageEnable,
    887                                uint8 independentBlendEnable,
    888                                const SVGA3dDXBlendStatePerRT *perRT)
    889 {
    890    SVGA3D_CREATE_COMMAND(DefineBlendState, DEFINE_BLEND_STATE);
    891 
    892    cmd->blendId = blendId;
    893    cmd->alphaToCoverageEnable = alphaToCoverageEnable;
    894    cmd->independentBlendEnable = independentBlendEnable;
    895    memcpy(cmd->perRT, perRT, sizeof(cmd->perRT));
    896    cmd->pad0 = 0;
    897 
    898    swc->commit(swc);
    899    return PIPE_OK;
    900 }
    901 
    902 enum pipe_error
    903 SVGA3D_vgpu10_DestroyBlendState(struct svga_winsys_context *swc,
    904                                 SVGA3dBlendStateId blendId)
    905 {
    906    SVGA3D_CREATE_COMMAND(DestroyBlendState, DESTROY_BLEND_STATE);
    907 
    908    cmd->blendId = blendId;
    909 
    910    swc->commit(swc);
    911    return PIPE_OK;
    912 }
    913 
    914 enum pipe_error
    915 SVGA3D_vgpu10_DefineDepthStencilState(struct svga_winsys_context *swc,
    916                                       SVGA3dDepthStencilStateId depthStencilId,
    917                                       uint8 depthEnable,
    918                                       SVGA3dDepthWriteMask depthWriteMask,
    919                                       SVGA3dComparisonFunc depthFunc,
    920                                       uint8 stencilEnable,
    921                                       uint8 frontEnable,
    922                                       uint8 backEnable,
    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)
    933 {
    934    SVGA3D_CREATE_COMMAND(DefineDepthStencilState, DEFINE_DEPTHSTENCIL_STATE);
    935 
    936    SVGA3D_COPY_BASIC_9(depthStencilId, depthEnable,
    937                        depthWriteMask, depthFunc,
    938                        stencilEnable, frontEnable,
    939                        backEnable, stencilReadMask,
    940                        stencilWriteMask);
    941    SVGA3D_COPY_BASIC_8(frontStencilFailOp, frontStencilDepthFailOp,
    942                        frontStencilPassOp, frontStencilFunc,
    943                        backStencilFailOp, backStencilDepthFailOp,
    944                        backStencilPassOp, backStencilFunc);
    945 
    946    swc->commit(swc);
    947    return PIPE_OK;
    948 }
    949 
    950 enum pipe_error
    951 SVGA3D_vgpu10_DestroyDepthStencilState(struct svga_winsys_context *swc,
    952                                     SVGA3dDepthStencilStateId depthStencilId)
    953 {
    954    SVGA3D_CREATE_COMMAND(DestroyDepthStencilState,
    955                          DESTROY_DEPTHSTENCIL_STATE);
    956 
    957    cmd->depthStencilId = depthStencilId;
    958 
    959    swc->commit(swc);
    960    return PIPE_OK;
    961 }
    962 
    963 enum pipe_error
    964 SVGA3D_vgpu10_DefineRasterizerState(struct svga_winsys_context *swc,
    965                                     SVGA3dRasterizerStateId rasterizerId,
    966                                     uint8 fillMode,
    967                                     SVGA3dCullMode cullMode,
    968                                     uint8 frontCounterClockwise,
    969                                     int32 depthBias,
    970                                     float depthBiasClamp,
    971                                     float slopeScaledDepthBias,
    972                                     uint8 depthClipEnable,
    973                                     uint8 scissorEnable,
    974                                     uint8 multisampleEnable,
    975                                     uint8 antialiasedLineEnable,
    976                                     float lineWidth,
    977                                     uint8 lineStippleEnable,
    978                                     uint8 lineStippleFactor,
    979                                     uint16 lineStipplePattern,
    980                                     uint8 provokingVertexLast)
    981 {
    982    SVGA3D_CREATE_COMMAND(DefineRasterizerState, DEFINE_RASTERIZER_STATE);
    983 
    984    SVGA3D_COPY_BASIC_5(rasterizerId, fillMode,
    985                        cullMode, frontCounterClockwise,
    986                        depthBias);
    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;
    995 
    996    swc->commit(swc);
    997    return PIPE_OK;
    998 }
    999 
   1000 enum pipe_error
   1001 SVGA3D_vgpu10_DestroyRasterizerState(struct svga_winsys_context *swc,
   1002                                      SVGA3dRasterizerStateId rasterizerId)
   1003 {
   1004    SVGA3D_CREATE_COMMAND(DestroyRasterizerState, DESTROY_RASTERIZER_STATE);
   1005 
   1006    cmd->rasterizerId = rasterizerId;
   1007 
   1008    swc->commit(swc);
   1009    return PIPE_OK;
   1010 }
   1011 
   1012 enum pipe_error
   1013 SVGA3D_vgpu10_DefineSamplerState(struct svga_winsys_context *swc,
   1014                                  SVGA3dSamplerId samplerId,
   1015                                  SVGA3dFilter filter,
   1016                                  uint8 addressU,
   1017                                  uint8 addressV,
   1018                                  uint8 addressW,
   1019                                  float mipLODBias,
   1020                                  uint8 maxAnisotropy,
   1021                                  uint8 comparisonFunc,
   1022                                  SVGA3dRGBAFloat borderColor,
   1023                                  float minLOD,
   1024                                  float maxLOD)
   1025 {
   1026    SVGA3D_CREATE_COMMAND(DefineSamplerState, DEFINE_SAMPLER_STATE);
   1027 
   1028    SVGA3D_COPY_BASIC_6(samplerId, filter,
   1029                        addressU, addressV,
   1030                        addressW, mipLODBias);
   1031    SVGA3D_COPY_BASIC_5(maxAnisotropy, comparisonFunc,
   1032                        borderColor, minLOD,
   1033                        maxLOD);
   1034 
   1035    swc->commit(swc);
   1036    return PIPE_OK;
   1037 }
   1038 
   1039 enum pipe_error
   1040 SVGA3D_vgpu10_DestroySamplerState(struct svga_winsys_context *swc,
   1041                                   SVGA3dSamplerId samplerId)
   1042 {
   1043    SVGA3D_CREATE_COMMAND(DestroySamplerState, DESTROY_SAMPLER_STATE);
   1044 
   1045    cmd->samplerId = samplerId;
   1046 
   1047    swc->commit(swc);
   1048    return PIPE_OK;
   1049 }
   1050 
   1051 
   1052 enum pipe_error
   1053 SVGA3D_vgpu10_DefineAndBindShader(struct svga_winsys_context *swc,
   1054                                   struct svga_winsys_gb_shader *gbshader,
   1055                                   SVGA3dShaderId shaderId,
   1056                                   SVGA3dShaderType type,
   1057                                   uint32 sizeInBytes)
   1058 {
   1059    SVGA3dCmdHeader *header;
   1060    SVGA3dCmdDXDefineShader *dcmd;
   1061    SVGA3dCmdDXBindShader *bcmd;
   1062    unsigned totalSize = 2 * sizeof(*header) +
   1063                         sizeof(*dcmd) + sizeof(*bcmd);
   1064 
   1065    /* Make sure there is room for both commands */
   1066    header = swc->reserve(swc, totalSize, 2);
   1067    if (!header)
   1068       return PIPE_ERROR_OUT_OF_MEMORY;
   1069 
   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;
   1075    dcmd->type = type;
   1076    dcmd->sizeInBytes = sizeInBytes;
   1077 
   1078    /* DXBindShader command */
   1079    header = (SVGA3dCmdHeader *)(dcmd + 1);
   1080 
   1081    header->id = SVGA_3D_CMD_DX_BIND_SHADER;
   1082    header->size = sizeof(*bcmd);
   1083    bcmd = (SVGA3dCmdDXBindShader *)(header + 1);
   1084 
   1085    bcmd->cid = swc->cid;
   1086    swc->shader_relocation(swc, NULL, &bcmd->mobid,
   1087                           &bcmd->offsetInBytes, gbshader, 0);
   1088 
   1089    bcmd->shid = shaderId;
   1090 
   1091    swc->commit(swc);
   1092    return PIPE_OK;
   1093 }
   1094 
   1095 enum pipe_error
   1096 SVGA3D_vgpu10_DestroyShader(struct svga_winsys_context *swc,
   1097                             SVGA3dShaderId shaderId)
   1098 {
   1099    SVGA3D_CREATE_COMMAND(DestroyShader, DESTROY_SHADER);
   1100 
   1101    cmd->shaderId = shaderId;
   1102 
   1103    swc->commit(swc);
   1104    return PIPE_OK;
   1105 }
   1106 
   1107 enum pipe_error
   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])
   1113 {
   1114    unsigned i;
   1115    SVGA3D_CREATE_COMMAND(DefineStreamOutput, DEFINE_STREAMOUTPUT);
   1116 
   1117    cmd->soid = soid;
   1118    cmd->numOutputStreamEntries = numOutputStreamEntries;
   1119 
   1120    for (i = 0; i < ARRAY_SIZE(cmd->streamOutputStrideInBytes); i++)
   1121       cmd->streamOutputStrideInBytes[i] = streamOutputStrideInBytes[i];
   1122 
   1123    memcpy(cmd->decl, decl,
   1124           sizeof(SVGA3dStreamOutputDeclarationEntry)
   1125           * SVGA3D_MAX_STREAMOUT_DECLS);
   1126 
   1127    swc->commit(swc);
   1128    return PIPE_OK;
   1129 }
   1130 
   1131 enum pipe_error
   1132 SVGA3D_vgpu10_DestroyStreamOutput(struct svga_winsys_context *swc,
   1133                                   SVGA3dStreamOutputId soid)
   1134 {
   1135    SVGA3D_CREATE_COMMAND(DestroyStreamOutput, DESTROY_STREAMOUTPUT);
   1136 
   1137    cmd->soid = soid;
   1138 
   1139    swc->commit(swc);
   1140    return PIPE_OK;
   1141 }
   1142 
   1143 enum pipe_error
   1144 SVGA3D_vgpu10_SetInputLayout(struct svga_winsys_context *swc,
   1145                              SVGA3dElementLayoutId elementLayoutId)
   1146 {
   1147    SVGA3D_CREATE_COMMAND(SetInputLayout, SET_INPUT_LAYOUT);
   1148 
   1149    cmd->elementLayoutId = elementLayoutId;
   1150 
   1151    swc->commit(swc);
   1152    return PIPE_OK;
   1153 }
   1154 
   1155 enum pipe_error
   1156 SVGA3D_vgpu10_SetVertexBuffers(struct svga_winsys_context *swc,
   1157                                unsigned count,
   1158                                uint32 startBuffer,
   1159                                const SVGA3dVertexBuffer *bufferInfo,
   1160                                struct svga_winsys_surface **surfaces)
   1161 {
   1162    SVGA3dCmdDXSetVertexBuffers *cmd;
   1163    SVGA3dVertexBuffer *bufs;
   1164    unsigned i;
   1165 
   1166    assert(count > 0);
   1167 
   1168    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_SET_VERTEX_BUFFERS,
   1169                             sizeof(SVGA3dCmdDXSetVertexBuffers) +
   1170                             count * sizeof(SVGA3dVertexBuffer),
   1171                             count); /* 'count' relocations */
   1172    if (!cmd)
   1173       return PIPE_ERROR_OUT_OF_MEMORY;
   1174 
   1175    cmd->startBuffer = startBuffer;
   1176 
   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],
   1184                               SVGA_RELOC_READ);
   1185    }
   1186 
   1187    swc->commit(swc);
   1188    return PIPE_OK;
   1189 }
   1190 
   1191 enum pipe_error
   1192 SVGA3D_vgpu10_SetTopology(struct svga_winsys_context *swc,
   1193                           SVGA3dPrimitiveType topology)
   1194 {
   1195    SVGA3D_CREATE_COMMAND(SetTopology, SET_TOPOLOGY);
   1196 
   1197    cmd->topology = topology;
   1198 
   1199    swc->commit(swc);
   1200    return PIPE_OK;
   1201 }
   1202 
   1203 enum pipe_error
   1204 SVGA3D_vgpu10_SetIndexBuffer(struct svga_winsys_context *swc,
   1205                              struct svga_winsys_surface *indexes,
   1206                              SVGA3dSurfaceFormat format,
   1207                              uint32 offset)
   1208 {
   1209    SVGA3dCmdDXSetIndexBuffer *cmd;
   1210 
   1211    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_SET_INDEX_BUFFER,
   1212                             sizeof(SVGA3dCmdDXSetIndexBuffer),
   1213                             1); /* one relocations */
   1214    if (!cmd)
   1215       return PIPE_ERROR_OUT_OF_MEMORY;
   1216 
   1217    swc->surface_relocation(swc, &cmd->sid, NULL, indexes, SVGA_RELOC_READ);
   1218    SVGA3D_COPY_BASIC_2(format, offset);
   1219 
   1220    swc->commit(swc);
   1221    return PIPE_OK;
   1222 }
   1223 
   1224 enum pipe_error
   1225 SVGA3D_vgpu10_SetSingleConstantBuffer(struct svga_winsys_context *swc,
   1226                                       unsigned slot,
   1227                                       SVGA3dShaderType type,
   1228                                       struct svga_winsys_surface *surface,
   1229                                       uint32 offsetInBytes,
   1230                                       uint32 sizeInBytes)
   1231 {
   1232    SVGA3dCmdDXSetSingleConstantBuffer *cmd;
   1233 
   1234    assert(offsetInBytes % 256 == 0);
   1235    if (!surface)
   1236       assert(sizeInBytes == 0);
   1237    else
   1238       assert(sizeInBytes > 0);
   1239 
   1240    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_SET_SINGLE_CONSTANT_BUFFER,
   1241                             sizeof(SVGA3dCmdDXSetSingleConstantBuffer),
   1242                             1);  /* one relocation */
   1243    if (!cmd)
   1244       return PIPE_ERROR_OUT_OF_MEMORY;
   1245 
   1246    cmd->slot = slot;
   1247    cmd->type = type;
   1248    swc->surface_relocation(swc, &cmd->sid, NULL, surface, SVGA_RELOC_READ);
   1249    cmd->offsetInBytes = offsetInBytes;
   1250    cmd->sizeInBytes = sizeInBytes;
   1251 
   1252    swc->commit(swc);
   1253 
   1254    return PIPE_OK;
   1255 }
   1256 
   1257 
   1258 enum pipe_error
   1259 SVGA3D_vgpu10_ReadbackSubResource(struct svga_winsys_context *swc,
   1260                                   struct svga_winsys_surface *surface,
   1261                                   unsigned subResource)
   1262 {
   1263    SVGA3dCmdDXReadbackSubResource *cmd;
   1264 
   1265    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_READBACK_SUBRESOURCE,
   1266                             sizeof(SVGA3dCmdDXReadbackSubResource),
   1267                             1);
   1268    if (!cmd)
   1269       return PIPE_ERROR_OUT_OF_MEMORY;
   1270 
   1271    swc->surface_relocation(swc, &cmd->sid, NULL, surface,
   1272                            SVGA_RELOC_READ | SVGA_RELOC_INTERNAL);
   1273    cmd->subResource = subResource;
   1274 
   1275    swc->commit(swc);
   1276    return PIPE_OK;
   1277 }
   1278 
   1279 enum pipe_error
   1280 SVGA3D_vgpu10_UpdateSubResource(struct svga_winsys_context *swc,
   1281                                 struct svga_winsys_surface *surface,
   1282                                 const SVGA3dBox *box,
   1283                                 unsigned subResource)
   1284 {
   1285    SVGA3dCmdDXUpdateSubResource *cmd;
   1286 
   1287    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_UPDATE_SUBRESOURCE,
   1288                             sizeof(SVGA3dCmdDXUpdateSubResource),
   1289                             1);
   1290    if (!cmd)
   1291       return PIPE_ERROR_OUT_OF_MEMORY;
   1292 
   1293    swc->surface_relocation(swc, &cmd->sid, NULL, surface,
   1294                            SVGA_RELOC_WRITE | SVGA_RELOC_INTERNAL);
   1295    cmd->subResource = subResource;
   1296    cmd->box = *box;
   1297 
   1298    swc->commit(swc);
   1299    return PIPE_OK;
   1300 }
   1301 
   1302 enum pipe_error
   1303 SVGA3D_vgpu10_GenMips(struct svga_winsys_context *swc,
   1304                       SVGA3dShaderResourceViewId shaderResourceViewId,
   1305                       struct svga_winsys_surface *view)
   1306 {
   1307    SVGA3dCmdDXGenMips *cmd;
   1308 
   1309    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_GENMIPS,
   1310                             sizeof(SVGA3dCmdDXGenMips), 1);
   1311 
   1312    if (!cmd)
   1313       return PIPE_ERROR_OUT_OF_MEMORY;
   1314 
   1315    swc->surface_relocation(swc, &cmd->shaderResourceViewId, NULL, view,
   1316                            SVGA_RELOC_WRITE);
   1317    cmd->shaderResourceViewId = shaderResourceViewId;
   1318 
   1319    swc->commit(swc);
   1320    return PIPE_OK;
   1321 }
   1322 
   1323 
   1324 enum pipe_error
   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)
   1329 {
   1330    SVGA3dCmdDXBufferCopy *cmd;
   1331 
   1332    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_BUFFER_COPY, sizeof *cmd, 2);
   1333 
   1334    if (!cmd)
   1335       return PIPE_ERROR_OUT_OF_MEMORY;
   1336 
   1337    swc->surface_relocation(swc, &cmd->dest, NULL, dst, SVGA_RELOC_WRITE);
   1338    swc->surface_relocation(swc, &cmd->src, NULL, src, SVGA_RELOC_READ);
   1339    cmd->destX = dstx;
   1340    cmd->srcX = srcx;
   1341    cmd->width = width;
   1342 
   1343    swc->commit(swc);
   1344    return PIPE_OK;
   1345 }
   1346 
   1347 enum pipe_error
   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,
   1354                                  SVGA3dBox *dstBox)
   1355 {
   1356    SVGA3dCmdDXTransferFromBuffer *cmd;
   1357 
   1358    cmd = SVGA3D_FIFOReserve(swc, SVGA_3D_CMD_DX_TRANSFER_FROM_BUFFER,
   1359                             sizeof(SVGA3dCmdDXTransferFromBuffer), 2);
   1360 
   1361    if (!cmd)
   1362       return PIPE_ERROR_OUT_OF_MEMORY;
   1363 
   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;
   1371 
   1372    swc->commit(swc);
   1373    return PIPE_OK;
   1374 }
   1375