13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/**********************************************************
23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2008-2009 VMware, Inc.  All rights reserved.
33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person
53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation
63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without
73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy,
83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies
93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is
103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions:
113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be
133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software.
143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE.
233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/
253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/**
273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * svga_cmd.c --
283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Command construction utility for the SVGA3D protocol used by
303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      the VMware SVGA device, based on the svgautil library.
313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_winsys.h"
34287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "svga_resource_buffer.h"
35287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "svga_resource_texture.h"
36287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "svga_surface.h"
373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_cmd.h"
383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * surface_to_surfaceid --
433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Utility function for surface ids.
453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Can handle null surface. Does a surface_reallocation so you need
463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      to have allocated the fifo space before converting.
473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
492d22186ca80cee2c5929f8fb59b18eec12995534Brian Paul *      id is filled out.
503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
522d22186ca80cee2c5929f8fb59b18eec12995534Brian Paul *      One surface relocation is performed for texture handle.
533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic INLINE
583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid surface_to_surfaceid(struct svga_winsys_context *swc, // IN
593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                          struct pipe_surface *surface,    // IN
603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                          SVGA3dSurfaceImageId *id,        // OUT
613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                          unsigned flags)                  // IN
623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(surface) {
643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      struct svga_surface *s = svga_surface(surface);
653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      swc->surface_relocation(swc, &id->sid, s->handle, flags);
663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      id->face = s->real_face; /* faces have the same order */
673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      id->mipmap = s->real_level;
683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   else {
7004094b2da2030a82ff49e647fc8658502f02cea8José Fonseca      swc->surface_relocation(swc, &id->sid, NULL, flags);
713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      id->face = 0;
723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      id->mipmap = 0;
733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_FIFOReserve --
813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Reserve space for an SVGA3D FIFO command.
833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      The 2D SVGA commands have been around for a while, so they
853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      have a rather asymmetric structure. The SVGA3D protocol is
863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      more uniform: each command begins with a header containing the
873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      command number and the full size.
883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      This is a convenience wrapper around SVGA_FIFOReserve. We
903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      reserve space for the whole command, and write the header.
913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      This function must be paired with SVGA_FIFOCommitAll().
933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Returns a pointer to the space reserved for command-specific
963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      data. It must be 'cmdSize' bytes long.
973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Begins a FIFO reservation.
1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid *
1053192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_FIFOReserve(struct svga_winsys_context *swc,
1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                   uint32 cmd,       // IN
1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                   uint32 cmdSize,   // IN
1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                   uint32 nr_relocs) // IN
1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdHeader *header;
1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   header = swc->reserve(swc, sizeof *header + cmdSize, nr_relocs);
1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!header)
1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return NULL;
1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   header->id = cmd;
1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   header->size = cmdSize;
1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return &header[1];
1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid
1243192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA_FIFOCommitAll(struct svga_winsys_context *swc)
1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_DefineContext --
1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Create a new context, to be referred to with the provided ID.
1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Context objects encapsulate all render state, and shader
1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      objects are per-context.
1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Surfaces are not per-context. The same surface can be shared
1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      between multiple contexts, and surface operations can occur
1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      without a context.
1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      If the provided context ID already existed, it is redefined.
1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Context IDs are arbitrary small non-negative integers,
1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      global to the entire SVGA device.
1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
1593192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_DefineContext(struct svga_winsys_context *swc)  // IN
1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdDefineContext *cmd;
1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_CONTEXT_DEFINE, sizeof *cmd, 0);
1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_DestroyContext --
1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Delete a context created with SVGA3D_DefineContext.
1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
1933192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_DestroyContext(struct svga_winsys_context *swc)  // IN
1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdDestroyContext *cmd;
1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_CONTEXT_DESTROY, sizeof *cmd, 0);
1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
2123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_BeginDefineSurface --
2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Begin a SURFACE_DEFINE command. This reserves space for it in
2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      the FIFO, and returns pointers to the command's faces and
2173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      mipsizes arrays.
2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      This function must be paired with SVGA_FIFOCommitAll().
2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      The faces and mipSizes arrays are initialized to zero.
2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      This creates a "surface" object in the SVGA3D device,
2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      with the provided surface ID (sid). Surfaces are generic
2243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      containers for host VRAM objects like textures, vertex
2253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      buffers, and depth/stencil buffers.
2263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2272d22186ca80cee2c5929f8fb59b18eec12995534Brian Paul *      Surfaces are hierarchical:
2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *        - Surface may have multiple faces (for cube maps)
2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *          - Each face has a list of mipmap levels
2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *             - Each mipmap image may have multiple volume
2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *               slices, if the image is three dimensional.
2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *                - Each slice is a 2D array of 'blocks'
2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *                   - Each block may be one or more pixels.
2393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *                     (Usually 1, more for DXT or YUV formats.)
2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Surfaces are generic host VRAM objects. The SVGA3D device
2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      may optimize surfaces according to the format they were
2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      created with, but this format does not limit the ways in
2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      which the surface may be used. For example, a depth surface
2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      can be used as a texture, or a floating point image may
2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      be used as a vertex buffer. Some surface usages may be
2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      lower performance, due to software emulation, but any
2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      usage should work with any surface.
2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      If 'sid' is already defined, the old surface is deleted
2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      and this new surface replaces it.
2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Surface IDs are arbitrary small non-negative integers,
2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      global to the entire SVGA device.
2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Returns pointers to arrays allocated in the FIFO for 'faces'
2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      and 'mipSizes'.
2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Begins a FIFO reservation.
2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
2653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
2673192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_BeginDefineSurface(struct svga_winsys_context *swc,
2683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                          struct svga_winsys_surface *sid, // IN
2693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                          SVGA3dSurfaceFlags flags,    // IN
2703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                          SVGA3dSurfaceFormat format,  // IN
2713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                          SVGA3dSurfaceFace **faces,   // OUT
2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                          SVGA3dSize **mipSizes,       // OUT
2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                          uint32 numMipSizes)          // IN
2743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdDefineSurface *cmd;
2763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
2783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SURFACE_DEFINE, sizeof *cmd +
2793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            sizeof **mipSizes * numMipSizes, 1);
2803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
2813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
2823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
283287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   swc->surface_relocation(swc, &cmd->sid, sid, SVGA_RELOC_WRITE);
2843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->surfaceFlags = flags;
2853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->format = format;
2863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   *faces = &cmd->face[0];
2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   *mipSizes = (SVGA3dSize*) &cmd[1];
2893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(*faces, 0, sizeof **faces * SVGA3D_MAX_SURFACE_FACES);
2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(*mipSizes, 0, sizeof **mipSizes * numMipSizes);
2923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
2943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
2983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
2993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_DefineSurface2D --
3013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      This is a simplified version of SVGA3D_BeginDefineSurface(),
3033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      which does not support cube maps, mipmaps, or volume textures.
3043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
3063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
3073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
3093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
3103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
3123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
3133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
3153192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_DefineSurface2D(struct svga_winsys_context *swc,    // IN
3163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                       struct svga_winsys_surface *sid, // IN
3173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                       uint32 width,                // IN
3183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                       uint32 height,               // IN
3193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                       SVGA3dSurfaceFormat format)  // IN
3203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
3213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dSize *mipSizes;
3223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dSurfaceFace *faces;
3233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   enum pipe_error ret;
3243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   ret = SVGA3D_BeginDefineSurface(swc,
3263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                   sid, 0, format, &faces, &mipSizes, 1);
3273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(ret != PIPE_OK)
3283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return ret;
3293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   faces[0].numMipLevels = 1;
3313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   mipSizes[0].width = width;
3333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   mipSizes[0].height = height;
3343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   mipSizes[0].depth = 1;
3353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);;
3373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
3393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
3433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
3443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_DestroySurface --
3463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Release the host VRAM encapsulated by a particular surface ID.
3483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
3503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
3513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
3533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
3543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
3563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
3573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
3593192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_DestroySurface(struct svga_winsys_context *swc,
3603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                      struct svga_winsys_surface *sid)  // IN
3613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
3623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdDestroySurface *cmd;
3633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
3653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SURFACE_DESTROY, sizeof *cmd, 1);
3663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
3673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
3683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
369287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   swc->surface_relocation(swc, &cmd->sid, sid, SVGA_RELOC_READ);
3703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);;
3713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
3733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
3773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
3783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3792d22186ca80cee2c5929f8fb59b18eec12995534Brian Paul * SVGA3D_SurfaceDMA--
3803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3812d22186ca80cee2c5929f8fb59b18eec12995534Brian Paul *      Emit a SURFACE_DMA command.
3823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      When the SVGA3D device asynchronously processes this FIFO
3843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      command, a DMA operation is performed between host VRAM and
3853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      a generic SVGAGuestPtr. The guest pointer may refer to guest
3863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      VRAM (provided by the SVGA PCI device) or to guest system
3873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      memory that has been set up as a Guest Memory Region (GMR)
3883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      by the SVGA device.
3893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      The guest's DMA buffer must remain valid (not freed, paged out,
3913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      or overwritten) until the host has finished processing this
3923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      command. The guest can determine that the host has finished
3933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      by using the SVGA device's FIFO Fence mechanism.
3943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      The guest's image buffer can be an arbitrary size and shape.
3963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Guest image data is interpreted according to the SVGA3D surface
3973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      format specified when the surface was defined.
3983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
3993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      The caller may optionally define the guest image's pitch.
4003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      guestImage->pitch can either be zero (assume image is tightly
4013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      packed) or it must be the number of bytes between vertically
4023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      adjacent image blocks.
4033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
4043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      The provided copybox list specifies which regions of the source
4053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      image are to be copied, and where they appear on the destination.
4063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
4073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      NOTE: srcx/srcy are always on the guest image and x/y are
4083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      always on the host image, regardless of the actual transfer
4093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      direction!
4103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
4113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      For efficiency, the SVGA3D device is free to copy more data
4123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      than specified. For example, it may round copy boxes outwards
4133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      such that they lie on particular alignment boundaries.
4143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
4153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
4163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
4173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
4193192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_SurfaceDMA(struct svga_winsys_context *swc,
4203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                  struct svga_transfer *st,         // IN
4213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                  SVGA3dTransferType transfer,      // IN
4223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                  const SVGA3dCopyBox *boxes,       // IN
423530ad1ff6f6e0af9d84789dccbc0e18ad1c6b11cJosé Fonseca                  uint32 numBoxes,                  // IN
424530ad1ff6f6e0af9d84789dccbc0e18ad1c6b11cJosé Fonseca                  SVGA3dSurfaceDMAFlags flags)      // IN
4253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
426287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct svga_texture *texture = svga_texture(st->base.resource);
4273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSurfaceDMA *cmd;
4283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSurfaceDMASuffix *pSuffix;
4293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 boxesSize = sizeof *boxes * numBoxes;
4303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   unsigned region_flags;
4313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   unsigned surface_flags;
4323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(transfer == SVGA3D_WRITE_HOST_VRAM) {
434287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      region_flags = SVGA_RELOC_READ;
435287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      surface_flags = SVGA_RELOC_WRITE;
4363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
4373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   else if(transfer == SVGA3D_READ_HOST_VRAM) {
438287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      region_flags = SVGA_RELOC_WRITE;
439287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      surface_flags = SVGA_RELOC_READ;
4403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
4413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   else {
4423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      assert(0);
4433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_BAD_INPUT;
4443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
4453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
4473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SURFACE_DMA,
4483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            sizeof *cmd + boxesSize + sizeof *pSuffix,
4493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            2);
4503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
4513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
4523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->region_relocation(swc, &cmd->guest.ptr, st->hwbuf, 0, region_flags);
4543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->guest.pitch = st->base.stride;
4553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->surface_relocation(swc, &cmd->host.sid, texture->handle, surface_flags);
4574c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   cmd->host.face = st->face; /* PIPE_TEX_FACE_* and SVGA3D_CUBEFACE_* match */
4584c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   cmd->host.mipmap = st->base.level;
4593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->transfer = transfer;
4613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memcpy(&cmd[1], boxes, boxesSize);
4633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   pSuffix = (SVGA3dCmdSurfaceDMASuffix *)((uint8_t*)cmd + sizeof *cmd + boxesSize);
4653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   pSuffix->suffixSize = sizeof *pSuffix;
4663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   pSuffix->maximumOffset = st->hw_nblocksy*st->base.stride;
467530ad1ff6f6e0af9d84789dccbc0e18ad1c6b11cJosé Fonseca   pSuffix->flags = flags;
4683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
4703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
4723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
4733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
4763192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_BufferDMA(struct svga_winsys_context *swc,
4773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 struct svga_winsys_buffer *guest,
4783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 struct svga_winsys_surface *host,
4793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 SVGA3dTransferType transfer,      // IN
4803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 uint32 size,                      // IN
4818ea7d8412c5c002b43824a5df5356cbe1a05ce20José Fonseca                 uint32 guest_offset,              // IN
4828ea7d8412c5c002b43824a5df5356cbe1a05ce20José Fonseca                 uint32 host_offset,               // IN
4833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 SVGA3dSurfaceDMAFlags flags)      // IN
4843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
4853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSurfaceDMA *cmd;
4863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCopyBox *box;
4873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSurfaceDMASuffix *pSuffix;
4883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   unsigned region_flags;
4893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   unsigned surface_flags;
4903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
4913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(transfer == SVGA3D_WRITE_HOST_VRAM) {
492287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      region_flags = SVGA_RELOC_READ;
493287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      surface_flags = SVGA_RELOC_WRITE;
4943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
4953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   else if(transfer == SVGA3D_READ_HOST_VRAM) {
496287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      region_flags = SVGA_RELOC_WRITE;
497287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      surface_flags = SVGA_RELOC_READ;
4983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
4993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   else {
5003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      assert(0);
5013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_BAD_INPUT;
5023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
5033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
5053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SURFACE_DMA,
5063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            sizeof *cmd + sizeof *box + sizeof *pSuffix,
5073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            2);
5083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
5093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
5103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->region_relocation(swc, &cmd->guest.ptr, guest, 0, region_flags);
5123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->guest.pitch = 0;
5133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->surface_relocation(swc, &cmd->host.sid, host, surface_flags);
5153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->host.face = 0;
5163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->host.mipmap = 0;
5173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->transfer = transfer;
5193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   box = (SVGA3dCopyBox *)&cmd[1];
5218ea7d8412c5c002b43824a5df5356cbe1a05ce20José Fonseca   box->x = host_offset;
5223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   box->y = 0;
5233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   box->z = 0;
5243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   box->w = size;
5253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   box->h = 1;
5263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   box->d = 1;
5278ea7d8412c5c002b43824a5df5356cbe1a05ce20José Fonseca   box->srcx = guest_offset;
5283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   box->srcy = 0;
5293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   box->srcz = 0;
5303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   pSuffix = (SVGA3dCmdSurfaceDMASuffix *)((uint8_t*)cmd + sizeof *cmd + sizeof *box);
5323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   pSuffix->suffixSize = sizeof *pSuffix;
5338ea7d8412c5c002b43824a5df5356cbe1a05ce20José Fonseca   pSuffix->maximumOffset = guest_offset + size;
5343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   pSuffix->flags = flags;
5353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
5373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
5393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
5403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
5433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
5443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_SetRenderTarget --
5463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Bind a surface object to a particular render target attachment
5483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      point on the current context. Render target attachment points
5493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      exist for color buffers, a depth buffer, and a stencil buffer.
5503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      The SVGA3D device is quite lenient about the types of surfaces
5523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      that may be used as render targets. The color buffers must
5533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      all be the same size, but the depth and stencil buffers do not
5543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      have to be the same size as the color buffer. All attachments
5553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      are optional.
5563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Some combinations of render target formats may require software
5583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      emulation, depending on the capabilities of the host graphics
5593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      API and graphics hardware.
5603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
5623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
5633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
5653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
5663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
5673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
5683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
5693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
5713192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_SetRenderTarget(struct svga_winsys_context *swc,
5723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                       SVGA3dRenderTargetType type,   // IN
5733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                       struct pipe_surface *surface)  // IN
5743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
5753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSetRenderTarget *cmd;
5763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
5783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SETRENDERTARGET, sizeof *cmd, 1);
5793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
5803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
5813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
5843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->type = type;
5863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
587287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   surface_to_surfaceid(swc, surface, &cmd->target, SVGA_RELOC_WRITE);
5883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
5903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
5923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
5933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
5993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
6003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
6013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_DefineShader --
6033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Upload the bytecode for a new shader. The bytecode is "SVGA3D
6053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      format", which is theoretically a binary-compatible superset
6063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      of Microsoft's DirectX shader bytecode. In practice, the
6073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      SVGA3D bytecode doesn't yet have any extensions to DirectX's
6083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      bytecode format.
6093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      The SVGA3D device supports shader models 1.1 through 2.0.
6113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      The caller chooses a shader ID (small positive integer) by
6133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      which this shader will be identified in future commands. This
6143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      ID is in a namespace which is per-context and per-shader-type.
6153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      'bytecodeLen' is specified in bytes. It must be a multiple of 4.
6173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
6193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
6203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
6223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
6233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
6253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
6263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
6283192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_DefineShader(struct svga_winsys_context *swc,
6293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                    uint32 shid,                  // IN
6303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                    SVGA3dShaderType type,        // IN
6313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                    const uint32 *bytecode,       // IN
6323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                    uint32 bytecodeLen)           // IN
6333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
6343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdDefineShader *cmd;
6353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   assert(bytecodeLen % 4 == 0);
6373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
6393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SHADER_DEFINE, sizeof *cmd + bytecodeLen,
6403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            0);
6413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
6423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
6433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
6453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->shid = shid;
6463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->type = type;
6473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memcpy(&cmd[1], bytecode, bytecodeLen);
6483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
6493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
6513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
6523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
6553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
6563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_DestroyShader --
6583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Delete a shader that was created by SVGA3D_DefineShader. If
6603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      the shader was the current vertex or pixel shader for its
6613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      context, rendering results are undefined until a new shader is
6623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      bound.
6633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
6653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
6663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
6683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
6693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
6713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
6723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
6743192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_DestroyShader(struct svga_winsys_context *swc,
6753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                     uint32 shid,            // IN
6763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                     SVGA3dShaderType type)  // IN
6773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
6783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdDestroyShader *cmd;
6793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
6813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SHADER_DESTROY, sizeof *cmd,
6823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            0);
6833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
6843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
6853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
6873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->shid = shid;
6883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->type = type;
6893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
6903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
6923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
6933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
6953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
6963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
6973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
6983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_SetShaderConst --
6993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
7003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Set the value of a shader constant.
7013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
7023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Shader constants are analogous to uniform variables in GLSL,
7033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      except that they belong to the render context rather than to
7043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      an individual shader.
7053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
7063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Constants may have one of three types: A 4-vector of floats,
7073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      a 4-vector of integers, or a single boolean flag.
7083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
7093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
7103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
7113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
7123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
7133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
7143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
7153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
7163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
7173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
7193192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_SetShaderConst(struct svga_winsys_context *swc,
7203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                      uint32 reg,                   // IN
7213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                      SVGA3dShaderType type,        // IN
7223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                      SVGA3dShaderConstType ctype,  // IN
7233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                      const void *value)            // IN
7243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
7253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSetShaderConst *cmd;
7263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
7283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SET_SHADER_CONST, sizeof *cmd,
7293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            0);
7303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
7313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
7323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
7343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->reg = reg;
7353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->type = type;
7363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->ctype = ctype;
7373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   switch (ctype) {
7393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case SVGA3D_CONST_TYPE_FLOAT:
7413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case SVGA3D_CONST_TYPE_INT:
7423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      memcpy(&cmd->values, value, sizeof cmd->values);
7433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      break;
7443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   case SVGA3D_CONST_TYPE_BOOL:
7463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      memset(&cmd->values, 0, sizeof cmd->values);
7473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      cmd->values[0] = *(uint32*)value;
7483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      break;
7493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   default:
7513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      assert(0);
7523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      break;
7533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
7553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
7563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
7583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
7593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
7603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
761fd69fc87444af8ead30b4af64598a98df7969397José Fonseca/*
762fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *----------------------------------------------------------------------
763fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *
764fd69fc87444af8ead30b4af64598a98df7969397José Fonseca * SVGA3D_SetShaderConsts --
765fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *
766fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *      Set the value of successive shader constants.
767fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *
768fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *      Shader constants are analogous to uniform variables in GLSL,
769fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *      except that they belong to the render context rather than to
770fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *      an individual shader.
771fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *
772fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *      Constants may have one of three types: A 4-vector of floats,
773fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *      a 4-vector of integers, or a single boolean flag.
774fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *
775fd69fc87444af8ead30b4af64598a98df7969397José Fonseca * Results:
776fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *      None.
777fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *
778fd69fc87444af8ead30b4af64598a98df7969397José Fonseca * Side effects:
779fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *      None.
780fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *
781fd69fc87444af8ead30b4af64598a98df7969397José Fonseca *----------------------------------------------------------------------
782fd69fc87444af8ead30b4af64598a98df7969397José Fonseca */
783fd69fc87444af8ead30b4af64598a98df7969397José Fonseca
784fd69fc87444af8ead30b4af64598a98df7969397José Fonsecaenum pipe_error
785fd69fc87444af8ead30b4af64598a98df7969397José FonsecaSVGA3D_SetShaderConsts(struct svga_winsys_context *swc,
786fd69fc87444af8ead30b4af64598a98df7969397José Fonseca                        uint32 reg,                   // IN
787fd69fc87444af8ead30b4af64598a98df7969397José Fonseca                        uint32 numRegs,               // IN
788fd69fc87444af8ead30b4af64598a98df7969397José Fonseca                        SVGA3dShaderType type,        // IN
789fd69fc87444af8ead30b4af64598a98df7969397José Fonseca                        SVGA3dShaderConstType ctype,  // IN
790fd69fc87444af8ead30b4af64598a98df7969397José Fonseca                        const void *values)           // IN
791fd69fc87444af8ead30b4af64598a98df7969397José Fonseca{
792fd69fc87444af8ead30b4af64598a98df7969397José Fonseca   SVGA3dCmdSetShaderConst *cmd;
793fd69fc87444af8ead30b4af64598a98df7969397José Fonseca
794fd69fc87444af8ead30b4af64598a98df7969397José Fonseca   cmd = SVGA3D_FIFOReserve(swc,
795fd69fc87444af8ead30b4af64598a98df7969397José Fonseca                            SVGA_3D_CMD_SET_SHADER_CONST,
796fd69fc87444af8ead30b4af64598a98df7969397José Fonseca                            sizeof *cmd + (numRegs - 1) * sizeof cmd->values,
797fd69fc87444af8ead30b4af64598a98df7969397José Fonseca                            0);
798fd69fc87444af8ead30b4af64598a98df7969397José Fonseca   if(!cmd)
799fd69fc87444af8ead30b4af64598a98df7969397José Fonseca      return PIPE_ERROR_OUT_OF_MEMORY;
800fd69fc87444af8ead30b4af64598a98df7969397José Fonseca
801fd69fc87444af8ead30b4af64598a98df7969397José Fonseca   cmd->cid = swc->cid;
802fd69fc87444af8ead30b4af64598a98df7969397José Fonseca   cmd->reg = reg;
803fd69fc87444af8ead30b4af64598a98df7969397José Fonseca   cmd->type = type;
804fd69fc87444af8ead30b4af64598a98df7969397José Fonseca   cmd->ctype = ctype;
805fd69fc87444af8ead30b4af64598a98df7969397José Fonseca
806fd69fc87444af8ead30b4af64598a98df7969397José Fonseca   memcpy(&cmd->values, values, numRegs * sizeof cmd->values);
807fd69fc87444af8ead30b4af64598a98df7969397José Fonseca
808fd69fc87444af8ead30b4af64598a98df7969397José Fonseca   swc->commit(swc);
809fd69fc87444af8ead30b4af64598a98df7969397José Fonseca
810fd69fc87444af8ead30b4af64598a98df7969397José Fonseca   return PIPE_OK;
811fd69fc87444af8ead30b4af64598a98df7969397José Fonseca}
812fd69fc87444af8ead30b4af64598a98df7969397José Fonseca
813fd69fc87444af8ead30b4af64598a98df7969397José Fonseca
8143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
8183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
8193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_SetShader --
8213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Switch active shaders. This binds a new vertex or pixel shader
8233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      to the specified context.
8243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      A shader ID of SVGA3D_INVALID_ID unbinds any shader, switching
8263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      back to the fixed function vertex or pixel pipeline.
8273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
8293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
8303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
8323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
8333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
8353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
8363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
8383192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_SetShader(struct svga_winsys_context *swc,
8393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 SVGA3dShaderType type,  // IN
8403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 uint32 shid)            // IN
8413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
8423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSetShader *cmd;
8433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
8453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SET_SHADER, sizeof *cmd,
8463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            0);
8473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
8483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
8493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
8513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->type = type;
8523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->shid = shid;
8533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
8543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
8563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
8573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
8603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
8613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_BeginClear --
8633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Begin a CLEAR command. This reserves space for it in the FIFO,
8653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      and returns a pointer to the command's rectangle array.  This
8663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      function must be paired with SVGA_FIFOCommitAll().
8673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Clear is a rendering operation which fills a list of
8693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      rectangles with constant values on all render target types
8703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      indicated by 'flags'.
8713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Clear is not affected by clipping, depth test, or other
8733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      render state which affects the fragment pipeline.
8743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
8763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
8773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
8793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      May write to attached render target surfaces.
8803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
8813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
8823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
8833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
8853192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_BeginClear(struct svga_winsys_context *swc,
8863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                  SVGA3dClearFlag flags,  // IN
8873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                  uint32 color,           // IN
8883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                  float depth,            // IN
8893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                  uint32 stencil,         // IN
8903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                  SVGA3dRect **rects,     // OUT
8913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                  uint32 numRects)        // IN
8923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
8933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdClear *cmd;
8943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
8953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
8963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_CLEAR,
8973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            sizeof *cmd + sizeof **rects * numRects,
8983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            0);
8993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
9003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
9013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
9033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->clearFlag = flags;
9043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->color = color;
9053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->depth = depth;
9063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->stencil = stencil;
9073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   *rects = (SVGA3dRect*) &cmd[1];
9083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
9103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
9113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
9143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
9153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_ClearRect --
9173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      This is a simplified version of SVGA3D_BeginClear().
9193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
9213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
9223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
9243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
9253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
9273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
9283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
9303192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_ClearRect(struct svga_winsys_context *swc,
9313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 SVGA3dClearFlag flags,  // IN
9323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 uint32 color,           // IN
9333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 float depth,            // IN
9343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 uint32 stencil,         // IN
9353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 uint32 x,               // IN
9363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 uint32 y,               // IN
9373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 uint32 w,               // IN
9383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 uint32 h)               // IN
9393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
9403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dRect *rect;
9413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   enum pipe_error ret;
9423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   ret = SVGA3D_BeginClear(swc, flags, color, depth, stencil, &rect, 1);
9443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(ret != PIPE_OK)
9453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
9463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(rect, 0, sizeof *rect);
9483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rect->x = x;
9493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rect->y = y;
9503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rect->w = w;
9513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rect->h = h;
9523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
9533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
9553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
9563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
9593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
9603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_BeginDrawPrimitives --
9623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Begin a DRAW_PRIMITIVES command. This reserves space for it in
9643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      the FIFO, and returns a pointer to the command's arrays.
9653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      This function must be paired with SVGA_FIFOCommitAll().
9663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Drawing commands consist of two variable-length arrays:
9683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      SVGA3dVertexDecl elements declare a set of vertex buffers to
9693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      use while rendering, and SVGA3dPrimitiveRange elements specify
9703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      groups of primitives each with an optional index buffer.
9713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      The decls and ranges arrays are initialized to zero.
9733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
9753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
9763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
9783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      May write to attached render target surfaces.
9793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
9803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
9813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
9823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
9843192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_BeginDrawPrimitives(struct svga_winsys_context *swc,
9853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                           SVGA3dVertexDecl **decls,      // OUT
9863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                           uint32 numVertexDecls,         // IN
9873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                           SVGA3dPrimitiveRange **ranges, // OUT
9883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                           uint32 numRanges)              // IN
9893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
9903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdDrawPrimitives *cmd;
9913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dVertexDecl *declArray;
9923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dPrimitiveRange *rangeArray;
9933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 declSize = sizeof **decls * numVertexDecls;
9943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 rangeSize = sizeof **ranges * numRanges;
9953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
9963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
9973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_DRAW_PRIMITIVES,
9983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            sizeof *cmd + declSize + rangeSize,
9993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            numVertexDecls + numRanges);
10003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
10013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
10023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
10043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->numVertexDecls = numVertexDecls;
10053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->numRanges = numRanges;
10063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   declArray = (SVGA3dVertexDecl*) &cmd[1];
10083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   rangeArray = (SVGA3dPrimitiveRange*) &declArray[numVertexDecls];
10093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(declArray, 0, declSize);
10113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(rangeArray, 0, rangeSize);
10123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   *decls = declArray;
10143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   *ranges = rangeArray;
10153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
10173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
10183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
10213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
10223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_BeginSurfaceCopy --
10243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Begin a SURFACE_COPY command. This reserves space for it in
10263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      the FIFO, and returns a pointer to the command's arrays.  This
10273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      function must be paired with SVGA_FIFOCommitAll().
10283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      The box array is initialized with zeroes.
10303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
10323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
10333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
10353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Asynchronously copies a list of boxes from surface to surface.
10363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
10383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
10393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
10413192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_BeginSurfaceCopy(struct svga_winsys_context *swc,
10423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                        struct pipe_surface *src,    // IN
10433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                        struct pipe_surface *dest,   // IN
10443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                        SVGA3dCopyBox **boxes,       // OUT
10453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                        uint32 numBoxes)             // IN
10463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
10473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSurfaceCopy *cmd;
10483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 boxesSize = sizeof **boxes * numBoxes;
10493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
10513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SURFACE_COPY, sizeof *cmd + boxesSize,
10523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            2);
10533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
10543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
10553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1056287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   surface_to_surfaceid(swc, src, &cmd->src, SVGA_RELOC_READ);
1057287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   surface_to_surfaceid(swc, dest, &cmd->dest, SVGA_RELOC_WRITE);
10583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   *boxes = (SVGA3dCopyBox*) &cmd[1];
10593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(*boxes, 0, boxesSize);
10613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
10633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
10643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
10673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
10683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_SurfaceStretchBlt --
10703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Issue a SURFACE_STRETCHBLT command: an asynchronous
10723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      surface-to-surface blit, with scaling.
10733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
10753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
10763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
10783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Asynchronously copies one box from surface to surface.
10793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
10803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
10813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
10823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
10843192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_SurfaceStretchBlt(struct svga_winsys_context *swc,
10853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                         struct pipe_surface *src,    // IN
10863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                         struct pipe_surface *dest,   // IN
10873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                         SVGA3dBox *boxSrc,           // IN
10883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                         SVGA3dBox *boxDest,          // IN
10893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                         SVGA3dStretchBltMode mode)   // IN
10903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
10913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSurfaceStretchBlt *cmd;
10923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
10933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
10943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SURFACE_STRETCHBLT, sizeof *cmd,
10953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            2);
10963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
10973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
10983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1099287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   surface_to_surfaceid(swc, src, &cmd->src, SVGA_RELOC_READ);
1100287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   surface_to_surfaceid(swc, dest, &cmd->dest, SVGA_RELOC_WRITE);
11013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->boxSrc = *boxSrc;
11023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->boxDest = *boxDest;
11033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->mode = mode;
11043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
11053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
11073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
11083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
11113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
11123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_SetViewport --
11143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Set the current context's viewport rectangle. The viewport
11163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      is clipped to the dimensions of the current render target,
11173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      then all rendering is clipped to the viewport.
11183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
11203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
11213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
11233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
11243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
11263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
11273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
11293192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_SetViewport(struct svga_winsys_context *swc,
11303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                   SVGA3dRect *rect)  // IN
11313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
11323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSetViewport *cmd;
11333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
11353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SETVIEWPORT, sizeof *cmd,
11363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            0);
11373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
11383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
11393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
11413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->rect = *rect;
11423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
11433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
11453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
11463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
11513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
11523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_SetScissorRect --
11543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Set the current context's scissor rectangle. If scissor
11563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      is enabled then all rendering is clipped to the scissor.
11573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
11593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
11603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
11623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
11633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
11653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
11663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
11683192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_SetScissorRect(struct svga_winsys_context *swc,
11693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                      SVGA3dRect *rect)  // IN
11703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
11713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSetScissorRect *cmd;
11723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
11743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SETSCISSORRECT, sizeof *cmd,
11753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            0);
11763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
11773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
11783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
11803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->rect = *rect;
11813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
11823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
11843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
11853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
11863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
11873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
11883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_SetClipPlane --
11903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Set one of the current context's clip planes. If the clip
11923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      plane is enabled then all 3d rendering is clipped to against
11933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      the plane.
11943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
11963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
11973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
11983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
11993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
12003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
12023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
12033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1204553a08d3144b8b668f28c6094948afe64be309d9Brian Paulenum pipe_error
1205553a08d3144b8b668f28c6094948afe64be309d9Brian PaulSVGA3D_SetClipPlane(struct svga_winsys_context *swc,
1206553a08d3144b8b668f28c6094948afe64be309d9Brian Paul                    uint32 index, const float *plane)
12073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
12083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSetClipPlane *cmd;
12093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
12113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SETCLIPPLANE, sizeof *cmd,
12123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            0);
12133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
12143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
12153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
12173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->index = index;
12183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->plane[0] = plane[0];
12193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->plane[1] = plane[1];
12203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->plane[2] = plane[2];
12213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->plane[3] = plane[3];
12223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
12233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
12253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
12263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
12283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
12293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_SetZRange --
12313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Set the range of the depth buffer to use. 'min' and 'max'
12333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      are values between 0.0 and 1.0.
12343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
12363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
12373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
12393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
12403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
12423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
12433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
12453192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_SetZRange(struct svga_winsys_context *swc,
12463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 float zMin,  // IN
12473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                 float zMax)  // IN
12483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
12493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSetZRange *cmd;
12503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
12523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SETZRANGE, sizeof *cmd,
12533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            0);
12543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
12553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
12563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
12583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->zRange.min = zMin;
12593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->zRange.max = zMax;
12603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
12613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
12633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
12643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
12673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
12683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_BeginSetTextureState --
12703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Begin a SETTEXTURESTATE command. This reserves space for it in
12723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      the FIFO, and returns a pointer to the command's texture state
12733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      array.  This function must be paired with SVGA_FIFOCommitAll().
12743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      This command sets rendering state which is per-texture-unit.
12763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      XXX: Individual texture states need documentation. However,
12783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *           they are very similar to the texture states defined by
12793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *           Direct3D. The D3D documentation is a good starting point
12803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *           for understanding SVGA3D texture states.
12813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
12833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
12843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
12863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
12873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
12883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
12893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
12903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
12923192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_BeginSetTextureState(struct svga_winsys_context *swc,
12933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA3dTextureState **states,  // OUT
12943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            uint32 numStates)             // IN
12953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
12963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSetTextureState *cmd;
12973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
12983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
12993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SETTEXTURESTATE,
13003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            sizeof *cmd + sizeof **states * numStates,
13013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            numStates);
13023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
13033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
13043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
13063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   *states = (SVGA3dTextureState*) &cmd[1];
13073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
13093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
13103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
13133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
13143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_BeginSetRenderState --
13163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Begin a SETRENDERSTATE command. This reserves space for it in
13183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      the FIFO, and returns a pointer to the command's texture state
13193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      array.  This function must be paired with SVGA_FIFOCommitAll().
13203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      This command sets rendering state which is global to the context.
13223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      XXX: Individual render states need documentation. However,
13243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *           they are very similar to the render states defined by
13253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *           Direct3D. The D3D documentation is a good starting point
13263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *           for understanding SVGA3D render states.
13273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
13293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
13303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
13323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
13333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
13353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
13363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
13383192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_BeginSetRenderState(struct svga_winsys_context *swc,
13393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                           SVGA3dRenderState **states,  // OUT
13403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                           uint32 numStates)            // IN
13413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
13423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdSetRenderState *cmd;
13433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
13453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_SETRENDERSTATE,
13463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            sizeof *cmd + sizeof **states * numStates,
13473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            0);
13483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
13493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
13503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
13523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   *states = (SVGA3dRenderState*) &cmd[1];
13533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
13553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
13563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
13593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
13603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_BeginQuery--
13623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Issues a SVGA_3D_CMD_BEGIN_QUERY command.
13643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
13663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
13673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
13693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Commits space in the FIFO memory.
13703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
13723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
13733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
13753192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_BeginQuery(struct svga_winsys_context *swc,
13763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                  SVGA3dQueryType type) // IN
13773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
13783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdBeginQuery *cmd;
13793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
13813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_BEGIN_QUERY,
13823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            sizeof *cmd,
13833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            0);
13843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
13853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
13863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
13883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->type = type;
13893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
13913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
13933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
13943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
13963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
13973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
13983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
13993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_EndQuery--
14003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Issues a SVGA_3D_CMD_END_QUERY command.
14023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
14043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
14053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
14073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Commits space in the FIFO memory.
14083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
14103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
14113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
14133192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_EndQuery(struct svga_winsys_context *swc,
14143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                SVGA3dQueryType type,              // IN
14153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                struct svga_winsys_buffer *buffer) // IN/OUT
14163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
14173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdEndQuery *cmd;
14183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
14203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_END_QUERY,
14213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            sizeof *cmd,
14223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            1);
14233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
14243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
14253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
14273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->type = type;
14283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->region_relocation(swc, &cmd->guestResult, buffer, 0,
1430287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                          SVGA_RELOC_WRITE);
14313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
14333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
14353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
14363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/*
14393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
14403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3D_WaitForQuery--
14423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Issues a SVGA_3D_CMD_WAIT_FOR_QUERY command.  This reserves space
14443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      for it in the FIFO.  This doesn't actually wait for the query to
14453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      finish but instead tells the host to start a wait at the driver
14463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      level.  The caller can wait on the status variable in the
14473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      guestPtr memory or send an insert fence instruction after this
14483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      command and wait on the fence.
14493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Results:
14513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      None.
14523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Side effects:
14543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *      Commits space in the FIFO memory.
14553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
14563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *----------------------------------------------------------------------
14573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
14583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzenum pipe_error
14603192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3D_WaitForQuery(struct svga_winsys_context *swc,
14613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                    SVGA3dQueryType type,              // IN
14623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                    struct svga_winsys_buffer *buffer) // IN/OUT
14633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
14643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   SVGA3dCmdWaitForQuery *cmd;
14653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd = SVGA3D_FIFOReserve(swc,
14673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            SVGA_3D_CMD_WAIT_FOR_QUERY,
14683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            sizeof *cmd,
14693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                            1);
14703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!cmd)
14713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return PIPE_ERROR_OUT_OF_MEMORY;
14723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->cid = swc->cid;
14743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   cmd->type = type;
14753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->region_relocation(swc, &cmd->guestResult, buffer, 0,
1477287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                          SVGA_RELOC_WRITE);
14783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   swc->commit(swc);
14803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
14813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return PIPE_OK;
14823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1483