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