13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/********************************************************** 23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2007-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 * svga3d_caps.h -- 283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Definitions for SVGA3D hardware capabilities. Capabilities 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * are used to query for optional rendering features during 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * driver initialization. The capability data is stored as very 323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * basic key/value dictionary within the "FIFO register" memory 333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * area at the beginning of BAR2. 343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Note that these definitions are only for 3D capabilities. 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The SVGA device also has "device capabilities" and "FIFO 373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * capabilities", which are non-3D-specific and are stored as 383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * bitfields rather than key/value pairs. 393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 403192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#ifndef _SVGA3D_CAPS_H_ 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define _SVGA3D_CAPS_H_ 433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#define SVGA_FIFO_3D_CAPS_SIZE (SVGA_FIFO_3D_CAPS_LAST - \ 453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA_FIFO_3D_CAPS + 1) 463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* 493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3dCapsRecordType 503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Record types that can be found in the caps block. 523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Related record types are grouped together numerically so that 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3dCaps_FindRecord() can be applied on a range of record 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * types. 553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef enum { 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3DCAPS_RECORD_UNKNOWN = 0, 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3DCAPS_RECORD_DEVCAPS_MIN = 0x100, 603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3DCAPS_RECORD_DEVCAPS = 0x100, 613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3DCAPS_RECORD_DEVCAPS_MAX = 0x1ff, 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} SVGA3dCapsRecordType; 633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* 663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3dCapsRecordHeader 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Header field leading each caps block record. Contains the offset (in 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * register words, NOT bytes) to the next caps block record (or the end 703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of caps block records which will be a zero word) and the record type 713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * as defined above. 723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef 753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct SVGA3dCapsRecordHeader { 763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz uint32 length; 773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dCapsRecordType type; 783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 793192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3dCapsRecordHeader; 803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* 833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3dCapsRecord 843192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Caps block record; "data" is a placeholder for the actual data structure 863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * contained within the record; for example a record containing a FOOBAR 873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * structure would be of size "sizeof(SVGA3dCapsRecordHeader) + 883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * sizeof(FOOBAR)". 893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef 923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstruct SVGA3dCapsRecord { 933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dCapsRecordHeader header; 943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz uint32 data[1]; 953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 963192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3dCapsRecord; 973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantztypedef uint32 SVGA3dCapPair[2]; 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/* 1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *---------------------------------------------------------------------- 1043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SVGA3dCaps_FindRecord 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Finds the record with the highest-valued type within the given range 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * in the caps block. 1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Result: pointer to found record, or NULL if not found. 1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz *---------------------------------------------------------------------- 1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic INLINE SVGA3dCapsRecord * 1163192633d4abe262d413e41feb871fe8deed409d8Jakob BornecrantzSVGA3dCaps_FindRecord(const uint32 *capsBlock, 1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dCapsRecordType recordTypeMin, 1183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dCapsRecordType recordTypeMax) 1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 1203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz SVGA3dCapsRecord *record, *found = NULL; 1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz uint32 offset; 1223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* 1243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Search linearly through the caps block records for the specified type. 1253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for (offset = 0; capsBlock[offset] != 0; offset += capsBlock[offset]) { 1273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz record = (SVGA3dCapsRecord *) (capsBlock + offset); 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if ((record->header.type >= recordTypeMin) && 1293192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz (record->header.type <= recordTypeMax) && 1303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz (!found || (record->header.type > found->header.type))) { 1313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz found = record; 1323192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 1343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return found; 1363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1373192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#endif // _SVGA3D_CAPS_H_ 140