13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/**********************************************************
23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 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 * @file
283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * This file implements the SVGA interface into this winsys, defined
293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * in drivers/svga/svga_winsys.h.
303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *
313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * @author Keith Whitwell
323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * @author Jose Fonseca
333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */
343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_cmd.h"
373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga3d_caps.h"
383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3928486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h"
403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_math.h"
413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_memory.h"
423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipebuffer/pb_buffer.h"
433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipebuffer/pb_bufmgr.h"
443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_winsys.h"
453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "vmw_context.h"
463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "vmw_screen.h"
473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "vmw_surface.h"
483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "vmw_buffer.h"
493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "vmw_fence.h"
503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic struct svga_winsys_buffer *
533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_svga_winsys_buffer_create(struct svga_winsys_screen *sws,
543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                              unsigned alignment,
553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                              unsigned usage,
563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                              unsigned size)
573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct vmw_winsys_screen *vws = vmw_winsys_screen(sws);
593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct pb_desc desc;
603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct pb_manager *provider;
613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct pb_buffer *buffer;
623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   memset(&desc, 0, sizeof desc);
643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   desc.alignment = alignment;
653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   desc.usage = usage;
663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
67e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   if (usage == SVGA_BUFFER_USAGE_PINNED) {
68e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      if (vws->pools.query_fenced == NULL && !vmw_query_pools_init(vws))
69e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom	 return NULL;
70e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      provider = vws->pools.query_fenced;
71e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   } else
72e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom      provider = vws->pools.gmr_fenced;
733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   assert(provider);
753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   buffer = provider->create_buffer(provider, size, &desc);
765dddeb7776c62b6218add3a236551cde876b1cf0Thomas Hellstrom
775dddeb7776c62b6218add3a236551cde876b1cf0Thomas Hellstrom   if(!buffer && provider == vws->pools.gmr_fenced) {
785dddeb7776c62b6218add3a236551cde876b1cf0Thomas Hellstrom
795dddeb7776c62b6218add3a236551cde876b1cf0Thomas Hellstrom      assert(provider);
805dddeb7776c62b6218add3a236551cde876b1cf0Thomas Hellstrom      provider = vws->pools.gmr_slab_fenced;
815dddeb7776c62b6218add3a236551cde876b1cf0Thomas Hellstrom      buffer = provider->create_buffer(provider, size, &desc);
825dddeb7776c62b6218add3a236551cde876b1cf0Thomas Hellstrom   }
835dddeb7776c62b6218add3a236551cde876b1cf0Thomas Hellstrom
845dddeb7776c62b6218add3a236551cde876b1cf0Thomas Hellstrom   if (!buffer)
853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return NULL;
863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return vmw_svga_winsys_buffer(buffer);
883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void *
923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_svga_winsys_buffer_map(struct svga_winsys_screen *sws,
933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                           struct svga_winsys_buffer *buf,
943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                           unsigned flags)
953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   (void)sws;
97b5fcf0c8e07e666523b007fab1d0fc18c2c89241Dave Airlie   return pb_map(vmw_pb_buffer(buf), flags, NULL);
983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void
1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_svga_winsys_buffer_unmap(struct svga_winsys_screen *sws,
1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                             struct svga_winsys_buffer *buf)
1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   (void)sws;
1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   pb_unmap(vmw_pb_buffer(buf));
1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void
1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_svga_winsys_buffer_destroy(struct svga_winsys_screen *sws,
1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                               struct svga_winsys_buffer *buf)
1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct pb_buffer *pbuf = vmw_pb_buffer(buf);
1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   (void)sws;
1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   pb_reference(&pbuf, NULL);
1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void
1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_svga_winsys_fence_reference(struct svga_winsys_screen *sws,
1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                struct pipe_fence_handle **pdst,
1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                struct pipe_fence_handle *src)
1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
125e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom    struct vmw_winsys_screen *vws = vmw_winsys_screen(sws);
126e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
127e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom    vmw_fence_reference(vws, pdst, src);
1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic int
1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_svga_winsys_fence_signalled(struct svga_winsys_screen *sws,
1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                struct pipe_fence_handle *fence,
1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                unsigned flag)
1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct vmw_winsys_screen *vws = vmw_winsys_screen(sws);
137e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
138e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   return vmw_fence_signalled(vws, fence, flag);
1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic int
1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_svga_winsys_fence_finish(struct svga_winsys_screen *sws,
1443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                             struct pipe_fence_handle *fence,
1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                             unsigned flag)
1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct vmw_winsys_screen *vws = vmw_winsys_screen(sws);
148e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom
149e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   return vmw_fence_finish(vws, fence, flag);
1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic struct svga_winsys_surface *
1553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_svga_winsys_surface_create(struct svga_winsys_screen *sws,
1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                               SVGA3dSurfaceFlags flags,
1573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                               SVGA3dSurfaceFormat format,
1583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                               SVGA3dSize size,
1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                               uint32 numFaces,
1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                               uint32 numMipLevels)
1613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct vmw_winsys_screen *vws = vmw_winsys_screen(sws);
1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct vmw_svga_winsys_surface *surface;
1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   surface = CALLOC_STRUCT(vmw_svga_winsys_surface);
1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!surface)
1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      goto no_surface;
1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   pipe_reference_init(&surface->refcnt, 1);
1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   p_atomic_set(&surface->validated, 0);
1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   surface->screen = vws;
1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   surface->sid = vmw_ioctl_surface_create(vws,
1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                           flags, format, size,
1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                           numFaces, numMipLevels);
1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(surface->sid == SVGA3D_INVALID_ID)
1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      goto no_sid;
1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return svga_winsys_surface(surface);
1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzno_sid:
1813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   FREE(surface);
1823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzno_surface:
1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return NULL;
1843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic boolean
1883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_svga_winsys_surface_is_flushed(struct svga_winsys_screen *sws,
1893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                                   struct svga_winsys_surface *surface)
1903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
1913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct vmw_svga_winsys_surface *vsurf = vmw_svga_winsys_surface(surface);
1923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return (p_atomic_read(&vsurf->validated) == 0);
1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
1943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
1963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void
1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_svga_winsys_surface_ref(struct svga_winsys_screen *sws,
1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			    struct svga_winsys_surface **pDst,
1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz			    struct svga_winsys_surface *src)
2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct vmw_svga_winsys_surface *d_vsurf = vmw_svga_winsys_surface(*pDst);
2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct vmw_svga_winsys_surface *s_vsurf = vmw_svga_winsys_surface(src);
2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_svga_winsys_surface_reference(&d_vsurf, s_vsurf);
2053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   *pDst = svga_winsys_surface(d_vsurf);
2063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void
2103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_svga_winsys_destroy(struct svga_winsys_screen *sws)
2113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct vmw_winsys_screen *vws = vmw_winsys_screen(sws);
2133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vmw_winsys_destroy(vws);
2153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2182812b60a84a2992516db28b37b305c2a7eb5f424José Fonsecastatic SVGA3dHardwareVersion
2192812b60a84a2992516db28b37b305c2a7eb5f424José Fonsecavmw_svga_winsys_get_hw_version(struct svga_winsys_screen *sws)
2202812b60a84a2992516db28b37b305c2a7eb5f424José Fonseca{
2212812b60a84a2992516db28b37b305c2a7eb5f424José Fonseca   struct vmw_winsys_screen *vws = vmw_winsys_screen(sws);
2222812b60a84a2992516db28b37b305c2a7eb5f424José Fonseca
223e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   return (SVGA3dHardwareVersion) vws->ioctl.hwversion;
2242812b60a84a2992516db28b37b305c2a7eb5f424José Fonseca}
2252812b60a84a2992516db28b37b305c2a7eb5f424José Fonseca
2262812b60a84a2992516db28b37b305c2a7eb5f424José Fonseca
2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic boolean
2283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_svga_winsys_get_cap(struct svga_winsys_screen *sws,
2293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                        SVGA3dDevCapIndex index,
2303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                        SVGA3dDevCapResult *result)
2313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   struct vmw_winsys_screen *vws = vmw_winsys_screen(sws);
2333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   const uint32 *capsBlock;
2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   const SVGA3dCapsRecord *capsRecord = NULL;
2353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   uint32 offset;
2363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   const SVGA3dCapPair *capArray;
2373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   int numCaps, first, last;
2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
239e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   if(vws->ioctl.hwversion < SVGA3D_HWVERSION_WS6_B1)
2403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return FALSE;
2413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
2433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Search linearly through the caps block records for the specified type.
2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
245e7843273fae516fa9922f12053bb6c063b39921cThomas Hellstrom   capsBlock = (const uint32 *)vws->ioctl.buffer;
2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   for (offset = 0; capsBlock[offset] != 0; offset += capsBlock[offset]) {
2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      const SVGA3dCapsRecord *record;
2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      assert(offset < SVGA_FIFO_3D_CAPS_SIZE);
2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      record = (const SVGA3dCapsRecord *) (capsBlock + offset);
2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if ((record->header.type >= SVGA3DCAPS_RECORD_DEVCAPS_MIN) &&
2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz          (record->header.type <= SVGA3DCAPS_RECORD_DEVCAPS_MAX) &&
2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz          (!capsRecord || (record->header.type > capsRecord->header.type))) {
2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         capsRecord = record;
2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   if(!capsRecord)
2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      return FALSE;
2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
2613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Calculate the number of caps from the size of the record.
2623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
2633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   capArray = (const SVGA3dCapPair *) capsRecord->data;
2643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   numCaps = (int) ((capsRecord->header.length * sizeof(uint32) -
2653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz                     sizeof capsRecord->header) / (2 * sizeof(uint32)));
2663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   /*
2683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    * Binary-search for the cap with the specified index.
2693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz    */
2703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   for (first = 0, last = numCaps - 1; first <= last; ) {
2713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      int mid = (first + last) / 2;
2723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if ((SVGA3dDevCapIndex) capArray[mid][0] == index) {
2743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         /*
2753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz          * Found it.
2763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz          */
2773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         result->u = capArray[mid][1];
2783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         return TRUE;
2793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      /*
2823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       * Divide and conquer.
2833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz       */
2843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      if ((SVGA3dDevCapIndex) capArray[mid][0] > index) {
2853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         last = mid - 1;
2863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      } else {
2873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz         first = mid + 1;
2883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz      }
2893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   }
2903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return FALSE;
2923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
2933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
2953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzboolean
2963192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvmw_winsys_screen_init_svga(struct vmw_winsys_screen *vws)
2973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{
2983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->base.destroy = vmw_svga_winsys_destroy;
2992812b60a84a2992516db28b37b305c2a7eb5f424José Fonseca   vws->base.get_hw_version = vmw_svga_winsys_get_hw_version;
3003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->base.get_cap = vmw_svga_winsys_get_cap;
3013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->base.context_create = vmw_svga_winsys_context_create;
3023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->base.surface_create = vmw_svga_winsys_surface_create;
3033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->base.surface_is_flushed = vmw_svga_winsys_surface_is_flushed;
3043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->base.surface_reference = vmw_svga_winsys_surface_ref;
3053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->base.buffer_create = vmw_svga_winsys_buffer_create;
3063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->base.buffer_map = vmw_svga_winsys_buffer_map;
3073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->base.buffer_unmap = vmw_svga_winsys_buffer_unmap;
3083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->base.buffer_destroy = vmw_svga_winsys_buffer_destroy;
3093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->base.fence_reference = vmw_svga_winsys_fence_reference;
3103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->base.fence_signalled = vmw_svga_winsys_fence_signalled;
3113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   vws->base.fence_finish = vmw_svga_winsys_fence_finish;
3123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz   return TRUE;
3143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz}
3153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
3163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz
317