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