100772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick#!/usr/bin/env python 200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 300772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# (C) Copyright IBM Corporation 2004, 2005 400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# All Rights Reserved. 500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# 600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# Permission is hereby granted, free of charge, to any person obtaining a 700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# copy of this software and associated documentation files (the "Software"), 800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# to deal in the Software without restriction, including without limitation 900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# on the rights to use, copy, modify, merge, publish, distribute, sub 1000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# license, and/or sell copies of the Software, and to permit persons to whom 1100772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# the Software is furnished to do so, subject to the following conditions: 1200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# 1300772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# The above copyright notice and this permission notice (including the next 1400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# paragraph) shall be included in all copies or substantial portions of the 1500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# Software. 1600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# 1700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 2000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2100772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 2300772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# IN THE SOFTWARE. 2400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# 2500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# Authors: 2600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick# Ian Romanick <idr@us.ibm.com> 2700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 2866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickimport gl_XML, glX_XML 2900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanickimport license 3066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickimport sys, getopt, copy, string 3100772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 3200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 3366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass glx_enum_function: 3466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def __init__(self, func_name, enum_dict): 3566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.name = func_name 3666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.mode = 1 3766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.sig = None 383fec8c24ec14a5e07953828beba7e03d6367ae34Ian Romanick 3966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # "enums" is a set of lists. The element in the set is the 4066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # value of the enum. The list is the list of names for that 4166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # value. For example, [0x8126] = {"POINT_SIZE_MIN", 4266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # "POINT_SIZE_MIN_ARB", "POINT_SIZE_MIN_EXT", 4366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # "POINT_SIZE_MIN_SGIS"}. 445aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 4566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.enums = {} 465aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 4766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # "count" is indexed by count values. Each element of count 4866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # is a list of index to "enums" that have that number of 4966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # associated data elements. For example, [4] = 5066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # {GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION, 5166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # GL_AMBIENT_AND_DIFFUSE} (the enum names are used here, 5266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # but the actual hexadecimal values would be in the array). 5366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 5466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.count = {} 555aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 565aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 5766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Fill self.count and self.enums using the dictionary of enums 589a3a1497e5d709015486d0c7801688812ca446daIan Romanick # that was passed in. The generic Get functions (e.g., 599a3a1497e5d709015486d0c7801688812ca446daIan Romanick # GetBooleanv and friends) are handled specially here. In 609a3a1497e5d709015486d0c7801688812ca446daIan Romanick # the data the generic Get functions are refered to as "Get". 619a3a1497e5d709015486d0c7801688812ca446daIan Romanick 629a3a1497e5d709015486d0c7801688812ca446daIan Romanick if func_name in ["GetIntegerv", "GetBooleanv", "GetFloatv", "GetDoublev"]: 639a3a1497e5d709015486d0c7801688812ca446daIan Romanick match_name = "Get" 649a3a1497e5d709015486d0c7801688812ca446daIan Romanick else: 659a3a1497e5d709015486d0c7801688812ca446daIan Romanick match_name = func_name 6666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 6766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick mode_set = 0 6866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for enum_name in enum_dict: 6966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick e = enum_dict[ enum_name ] 709a3a1497e5d709015486d0c7801688812ca446daIan Romanick 719a3a1497e5d709015486d0c7801688812ca446daIan Romanick if e.functions.has_key( match_name ): 729a3a1497e5d709015486d0c7801688812ca446daIan Romanick [count, mode] = e.functions[ match_name ] 735aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 7466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if mode_set and mode != self.mode: 7566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick raise RuntimeError("Not all enums for %s have the same mode." % (func_name)) 765aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 7766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.mode = mode 785aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 7966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.enums.has_key( e.value ): 8066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if e.name not in self.enums[ e.value ]: 8166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.enums[ e.value ].append( e ) 8266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 8366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not self.count.has_key( count ): 8466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.count[ count ] = [] 855aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 8666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.enums[ e.value ] = [ e ] 8766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.count[ count ].append( e.value ) 885aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 895aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 905aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick return 915aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 925aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 9366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def signature( self ): 9466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.sig == None: 9566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.sig = "" 9666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for i in self.count: 9766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if i == None: 9866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick raise RuntimeError("i is None. WTF?") 9966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 10066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.count[i].sort() 10166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for e in self.count[i]: 1029a3a1497e5d709015486d0c7801688812ca446daIan Romanick self.sig += "%04x,%d," % (e, i) 1039a3a1497e5d709015486d0c7801688812ca446daIan Romanick 10466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return self.sig 10566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 10666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 10766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def is_set( self ): 10866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return self.mode 10966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 11066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 11166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def PrintUsingTable(self): 11266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick """Emit the body of the __gl*_size function using a pair 11366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick of look-up tables and a mask. The mask is calculated such 11466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick that (e & mask) is unique for all the valid values of e for 11566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick this function. The result of (e & mask) is used as an index 11666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick into the first look-up table. If it matches e, then the 11766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick same entry of the second table is returned. Otherwise zero 11866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick is returned. 11966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 12066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick It seems like this should cause better code to be generated. 12166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick However, on x86 at least, the resulting .o file is about 20% 12266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick larger then the switch-statment version. I am leaving this 12366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick code in because the results may be different on other 12466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick platforms (e.g., PowerPC or x86-64).""" 12566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 12666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 0 12766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick count = 0 12866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for a in self.enums: 12966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick count += 1 13066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 13166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.count.has_key(-1): 13266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 0 13366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 13466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Determine if there is some mask M, such that M = (2^N) - 1, 13566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # that will generate unique values for all of the enums. 13666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 13766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick mask = 0 13866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for i in [1, 2, 3, 4, 5, 6, 7, 8]: 13966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick mask = (1 << i) - 1 14066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 14166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick fail = 0; 14266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for a in self.enums: 14366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for b in self.enums: 14466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if a != b: 14566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if (a & mask) == (b & mask): 14666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick fail = 1; 14766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 14866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not fail: 14966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick break; 15066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 15166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick mask = 0 15266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 15366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if (mask != 0) and (mask < (2 * count)): 15466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick masked_enums = {} 15566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick masked_count = {} 15666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 15766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for i in range(0, mask + 1): 15866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick masked_enums[i] = "0"; 15966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick masked_count[i] = 0; 16066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 16166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for c in self.count: 16266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for e in self.count[c]: 16366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick i = e & mask 16466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick enum_obj = self.enums[e][0] 16566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick masked_enums[i] = '0x%04x /* %s */' % (e, enum_obj.name ) 16666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick masked_count[i] = c 16766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 16866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 16966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' static const GLushort a[%u] = {' % (mask + 1) 17066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for e in masked_enums: 17166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' %s, ' % (masked_enums[e]) 17266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' };' 1735aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 17466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' static const GLubyte b[%u] = {' % (mask + 1) 17566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for c in masked_count: 17666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' %u, ' % (masked_count[c]) 17766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' };' 1785aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 17966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' const unsigned idx = (e & 0x%02xU);' % (mask) 18066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '' 18166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' return (e == a[idx]) ? (GLint) b[idx] : 0;' 18266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 1; 18366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 18466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 0; 18566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 18666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 18766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def PrintUsingSwitch(self, name): 18866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick """Emit the body of the __gl*_size function using a 18966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick switch-statement.""" 19066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 19166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' switch( e ) {' 19266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 19366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for c in self.count: 19466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for e in self.count[c]: 19566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick first = 1 19666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 19766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # There may be multiple enums with the same 19866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # value. This happens has extensions are 19966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # promoted from vendor-specific or EXT to 20066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # ARB and to the core. Emit the first one as 20166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # a case label, and emit the others as 20266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # commented-out case labels. 20366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 20466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick list = {} 20566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for enum_obj in self.enums[e]: 20666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick list[ enum_obj.priority() ] = enum_obj.name 20766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 20866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick keys = list.keys() 20966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick keys.sort() 21066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for k in keys: 21166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick j = list[k] 21266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if first: 21366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' case GL_%s:' % (j) 21466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick first = 0 21566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 21666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '/* case GL_%s:*/' % (j) 21766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 21866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if c == -1: 21966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' return __gl%s_variable_size( e );' % (name) 22066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 22166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' return %u;' % (c) 22266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 22366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' default: return 0;' 22466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' }' 22566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 22666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 22766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def Print(self, name): 2280c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick print '_X_INTERNAL PURE FASTCALL GLint' 22966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '__gl%s_size( GLenum e )' % (name) 23066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '{' 23166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 23266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not self.PrintUsingTable(): 23366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.PrintUsingSwitch(name) 23466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 23566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '}' 23666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print '' 23766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 23866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 23966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass glx_server_enum_function(glx_enum_function): 24066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def __init__(self, func, enum_dict): 24166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick glx_enum_function.__init__(self, func.name, enum_dict) 24266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 24366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.function = func 24466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 2455aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 2465aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 247ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick def signature( self ): 248ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick if self.sig == None: 24966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick sig = glx_enum_function.signature(self) 250ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 25166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p = self.function.variable_length_parameter() 25266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p: 25366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick sig += "%u" % (p.size()) 254ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 255ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick self.sig = sig 256ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 257ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick return self.sig; 258ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 259ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 26066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def Print(self, name, printer): 26166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick f = self.function 26266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer.common_func_print_just_header( f ) 263ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 264ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick fixup = [] 26566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 26666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick foo = {} 26766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for param_name in f.count_parameter_list: 26866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick o = f.offset_of( param_name ) 26966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick foo[o] = param_name 27066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 27166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for param_name in f.counter_list: 27266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick o = f.offset_of( param_name ) 27366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick foo[o] = param_name 27466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 27566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick keys = foo.keys() 27666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick keys.sort() 27766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for o in keys: 27866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick p = f.parameters_by_name[ foo[o] ] 27966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 280990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick printer.common_emit_one_arg(p, "pc", 0) 28166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick fixup.append( p.name ) 282ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 283ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 284ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' GLsizei compsize;' 285ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 286ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 28766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer.common_emit_fixups(fixup) 288ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 289ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 29066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' compsize = __gl%s_size(%s);' % (f.name, string.join(f.count_parameter_list, ",")) 291ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick p = f.variable_length_parameter() 292ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' return __GLX_PAD(%s);' % (p.size_string()) 293ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 294ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '}' 295ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 296ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 297ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 29866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxSizeStubs_common(gl_XML.gl_print_base): 2995aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick do_get = (1 << 0) 3005aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick do_set = (1 << 1) 3015aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 3025aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick def __init__(self, which_functions): 30366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick gl_XML.gl_print_base.__init__(self) 30400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 30566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.name = "glX_proto_size.py (from Mesa)" 30666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2004", "IBM") 3075aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 30866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.emit_set = ((which_functions & PrintGlxSizeStubs_common.do_set) != 0) 30966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.emit_get = ((which_functions & PrintGlxSizeStubs_common.do_get) != 0) 31066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 3115aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 3125aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 3135aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanickclass PrintGlxSizeStubs_c(PrintGlxSizeStubs_common): 31400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick def printRealHeader(self): 31500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '' 3160c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick print '#include <X11/Xfuncproto.h>' 31700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '#include <GL/gl.h>' 31866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if self.emit_get: 31980a939cafb7a67837a9fc82e45b5ec85c5912a06Ian Romanick print '#include "indirect_size_get.h"' 3203a6d968f37683835bd92b1b853e0ac8cadd0fdefKristian Høgsberg print '#include "glxserver.h"' 3213a6d968f37683835bd92b1b853e0ac8cadd0fdefKristian Høgsberg print '#include "indirect_util.h"' 32200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 32380a939cafb7a67837a9fc82e45b5ec85c5912a06Ian Romanick print '#include "indirect_size.h"' 32480a939cafb7a67837a9fc82e45b5ec85c5912a06Ian Romanick 32500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '' 326c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printPure() 32700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '' 328c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printFastcall() 32900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '' 33000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '' 331903986ca128d51ff031cc9eafa1976618834a8deBrian Paul print '#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(GLX_USE_APPLEGL)' 332f4166a1fd76935f358c2db900c21b3532ba9d6a8Alan Hourihane print '# undef HAVE_ALIAS' 333f4166a1fd76935f358c2db900c21b3532ba9d6a8Alan Hourihane print '#endif' 33400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '#ifdef HAVE_ALIAS' 33500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '# define ALIAS2(from,to) \\' 3360c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick print ' _X_INTERNAL PURE FASTCALL GLint __gl ## from ## _size( GLenum e ) \\' 33700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print ' __attribute__ ((alias( # to )));' 33800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '# define ALIAS(from,to) ALIAS2( from, __gl ## to ## _size )' 33900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '#else' 34000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '# define ALIAS(from,to) \\' 3410c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick print ' _X_INTERNAL PURE FASTCALL GLint __gl ## from ## _size( GLenum e ) \\' 34200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print ' { return __gl ## to ## _size( e ); }' 34300772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '#endif' 34400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '' 34500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '' 34600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 3475aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 34866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 34966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick enum_sigs = {} 35066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick aliases = [] 35166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 35266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 35366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick ef = glx_enum_function( func.name, api.enums_by_name ) 35466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len(ef.enums) == 0: 35566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick continue 35600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 35766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if (ef.is_set() and self.emit_set) or (not ef.is_set() and self.emit_get): 35866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick sig = ef.signature() 35966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if enum_sigs.has_key( sig ): 36066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick aliases.append( [func.name, enum_sigs[ sig ]] ) 36166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 36266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick enum_sigs[ sig ] = func.name 36366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick ef.Print( func.name ) 3645aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 36500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 36666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for [alias_name, real_name] in aliases: 36766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print 'ALIAS( %s, %s )' % (alias_name, real_name) 36800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 36900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 37000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 3715aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanickclass PrintGlxSizeStubs_h(PrintGlxSizeStubs_common): 37200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick def printRealHeader(self): 37316c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick print """/** 37400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick * \\file 37500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick * Prototypes for functions used to determine the number of data elements in 37600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick * various GLX protocol messages. 37700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick * 37800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick * \\author Ian Romanick <idr@us.ibm.com> 37900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick */ 38000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick""" 3810c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick print '#include <X11/Xfuncproto.h>' 3820c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick print '' 383c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printPure(); 38400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '' 385c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printFastcall(); 38600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick print '' 38700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 38800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 38966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 39066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 39166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick ef = glx_enum_function( func.name, api.enums_by_name ) 39266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len(ef.enums) == 0: 39366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick continue 39466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 39566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if (ef.is_set() and self.emit_set) or (not ef.is_set() and self.emit_get): 3960c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick print 'extern _X_INTERNAL PURE FASTCALL GLint __gl%s_size(GLenum);' % (func.name) 39700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 39800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 39966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlxReqSize_common(gl_XML.gl_print_base): 40000e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick """Common base class for PrintGlxSizeReq_h and PrintGlxSizeReq_h. 40100e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick 40200e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick The main purpose of this common base class is to provide the infrastructure 40300e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick for the derrived classes to iterate over the same set of functions. 40400e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick """ 40500e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick 406ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick def __init__(self): 40766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick gl_XML.gl_print_base.__init__(self) 40866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 409ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick self.name = "glX_proto_size.py (from Mesa)" 410ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick self.license = license.bsd_license_template % ( "(C) Copyright IBM Corporation 2005", "IBM") 41100e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick 41200e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick 41300e760c971ccd6ffab7895a157b5256d54aba24eIan Romanickclass PrintGlxReqSize_h(PrintGlxReqSize_common): 41400e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick def __init__(self): 41500e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick PrintGlxReqSize_common.__init__(self) 416ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick self.header_tag = "_INDIRECT_REQSIZE_H_" 417ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 418ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 419ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick def printRealHeader(self): 4200c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick print '#include <X11/Xfuncproto.h>' 421ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 422c2803587b6f2533514e1cfa9793d0a448e9c2c85Ian Romanick self.printPure() 423ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 424ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 425ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 42666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 42766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 42866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not func.ignore and func.has_variable_size_request(): 4290c6b9303227977723a6d03664f71e5eb56ebf139Ian Romanick print 'extern PURE _X_HIDDEN int __glX%sReqSize(const GLbyte *pc, Bool swap);' % (func.name) 430ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 431ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 43200e760c971ccd6ffab7895a157b5256d54aba24eIan Romanickclass PrintGlxReqSize_c(PrintGlxReqSize_common): 4339a3a1497e5d709015486d0c7801688812ca446daIan Romanick """Create the server-side 'request size' functions. 4349a3a1497e5d709015486d0c7801688812ca446daIan Romanick 4359a3a1497e5d709015486d0c7801688812ca446daIan Romanick Create the server-side functions that are used to determine what the 4369a3a1497e5d709015486d0c7801688812ca446daIan Romanick size of a varible length command should be. The server then uses 4379a3a1497e5d709015486d0c7801688812ca446daIan Romanick this value to determine if the incoming command packed it malformed. 4389a3a1497e5d709015486d0c7801688812ca446daIan Romanick """ 4399a3a1497e5d709015486d0c7801688812ca446daIan Romanick 440ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick def __init__(self): 44100e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick PrintGlxReqSize_common.__init__(self) 442ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick self.counter_sigs = {} 443ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 444ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 445ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick def printRealHeader(self): 446ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 447ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '#include <GL/gl.h>' 448ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '#include "glxserver.h"' 4495ca107a4f215b84176123fd7a2d5fe14508a9f62Ian Romanick print '#include "glxbyteorder.h"' 450ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '#include "indirect_size.h"' 451ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '#include "indirect_reqsize.h"' 4529a3a1497e5d709015486d0c7801688812ca446daIan Romanick print '' 453ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '#define __GLX_PAD(x) (((x) + 3) & ~3)' 454ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 455f4166a1fd76935f358c2db900c21b3532ba9d6a8Alan Hourihane print '#if defined(__CYGWIN__) || defined(__MINGW32__)' 456f4166a1fd76935f358c2db900c21b3532ba9d6a8Alan Hourihane print '# undef HAVE_ALIAS' 457f4166a1fd76935f358c2db900c21b3532ba9d6a8Alan Hourihane print '#endif' 458ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '#ifdef HAVE_ALIAS' 459ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '# define ALIAS2(from,to) \\' 460ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \\' 461ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' __attribute__ ((alias( # to )));' 462ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '# define ALIAS(from,to) ALIAS2( from, __glX ## to ## ReqSize )' 463ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '#else' 464ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '# define ALIAS(from,to) \\' 465ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \\' 466ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' { return __glX ## to ## ReqSize( pc, swap ); }' 467ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '#endif' 468ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 469ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 470ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 471ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 47266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick def printBody(self, api): 47366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick aliases = [] 47466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick enum_functions = {} 47566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick enum_sigs = {} 476ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 47766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 47866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not func.has_variable_size_request(): continue 479ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 48066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick ef = glx_server_enum_function( func, api.enums_by_name ) 48166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if len(ef.enums) == 0: continue 48200e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick 48366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick sig = ef.signature() 484ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 48566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not enum_functions.has_key(func.name): 48666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick enum_functions[ func.name ] = sig 487ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 48866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not enum_sigs.has_key( sig ): 48966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick enum_sigs[ sig ] = ef 49066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 49166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 49266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 49366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for func in api.functionIterateGlx(): 49466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # Even though server-handcode fuctions are on "the 49566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # list", and prototypes are generated for them, there 49666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # isn't enough information to generate a size 49766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # function. If there was enough information, they 49866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # probably wouldn't need to be handcoded in the first 49966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick # place! 50066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 50166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if func.server_handcode: continue 50266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if not func.has_variable_size_request(): continue 50366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 50466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if enum_functions.has_key(func.name): 50566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick sig = enum_functions[func.name] 50666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick ef = enum_sigs[ sig ] 50766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 50866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if ef.name != func.name: 50966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick aliases.append( [func.name, ef.name] ) 51066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick else: 51166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick ef.Print( func.name, self ) 51266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 51366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick elif func.images: 51466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick self.printPixelFunction(func) 51566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick elif func.has_variable_size_request(): 51666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick a = self.printCountedFunction(func) 51766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if a: aliases.append(a) 51866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 51966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 52066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for [alias_name, real_name] in aliases: 52166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print 'ALIAS( %s, %s )' % (alias_name, real_name) 52266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 52366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return 524ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 525ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 526ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick def common_emit_fixups(self, fixup): 527ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick """Utility function to emit conditional byte-swaps.""" 528ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 529ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick if fixup: 530ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' if (swap) {' 531ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick for name in fixup: 5325ca107a4f215b84176123fd7a2d5fe14508a9f62Ian Romanick print ' %s = bswap_32(%s);' % (name, name) 533ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' }' 534ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 535ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick return 536ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 537ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 538990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick def common_emit_one_arg(self, p, pc, adjust): 53966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick offset = p.offset 54066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick dst = p.string() 54166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick src = '(%s *)' % (p.type_string()) 542990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick print '%-18s = *%11s(%s + %u);' % (dst, src, pc, offset + adjust); 543ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick return 544ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 545ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 546ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick def common_func_print_just_header(self, f): 547ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print 'int' 548ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '__glX%sReqSize( const GLbyte * pc, Bool swap )' % (f.name) 549ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '{' 550ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 551ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 552ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick def printPixelFunction(self, f): 553ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick self.common_func_print_just_header(f) 554ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 55566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick f.offset_of( f.parameters[0].name ) 5569a3a1497e5d709015486d0c7801688812ca446daIan Romanick [dim, w, h, d, junk] = f.get_images()[0].get_dimensions() 557ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 558ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' GLint row_length = * (GLint *)(pc + 4);' 559ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 560ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick if dim < 3: 561ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick fixup = ['row_length', 'skip_rows', 'alignment'] 562ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' GLint image_height = 0;' 563ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' GLint skip_images = 0;' 564ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' GLint skip_rows = * (GLint *)(pc + 8);' 565ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' GLint alignment = * (GLint *)(pc + 16);' 566ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick else: 567ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick fixup = ['row_length', 'image_height', 'skip_rows', 'skip_images', 'alignment'] 568ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' GLint image_height = * (GLint *)(pc + 8);' 569ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' GLint skip_rows = * (GLint *)(pc + 16);' 570ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' GLint skip_images = * (GLint *)(pc + 20);' 571ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' GLint alignment = * (GLint *)(pc + 32);' 572ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 57366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick img = f.images[0] 57466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateGlxSend(): 57566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick if p.name in [w, h, d, img.img_format, img.img_type, img.img_target]: 576990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_one_arg(p, "pc", 0) 577ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick fixup.append( p.name ) 578ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 579ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 580ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 581ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick self.common_emit_fixups(fixup) 582ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 5831709ab01ef24279c782e420568e9257b4b92b224Neil Roberts if img.img_null_flag: 5841709ab01ef24279c782e420568e9257b4b92b224Neil Roberts print '' 5851709ab01ef24279c782e420568e9257b4b92b224Neil Roberts print ' if (*(CARD32 *) (pc + %s))' % (img.offset - 4) 5861709ab01ef24279c782e420568e9257b4b92b224Neil Roberts print ' return 0;' 5871709ab01ef24279c782e420568e9257b4b92b224Neil Roberts 588ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 58966a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick print ' return __glXImageSize(%s, %s, %s, %s, %s, %s,' % (img.img_format, img.img_type, img.img_target, w, h, d ) 590ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' image_height, row_length, skip_images,' 591ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' skip_rows, alignment);' 592ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '}' 593ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 594ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick return 595ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 596ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 597ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick def printCountedFunction(self, f): 598ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 599ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick sig = "" 600ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick offset = 0 601ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick fixup = [] 602ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick params = [] 603ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick plus = '' 604ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick size = '' 605ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick param_offsets = {} 606ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 607ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick # Calculate the offset of each counter parameter and the 608ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick # size string for the variable length parameter(s). While 609ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick # that is being done, calculate a unique signature for this 610ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick # function. 611ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 61266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in f.parameterIterateGlxSend(): 613ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick if p.is_counter: 614ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick fixup.append( p.name ) 61566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick params.append( p ) 616ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick elif p.counter: 61766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick s = p.size() 618ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick if s == 0: s = 1 619ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 62066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick sig += "(%u,%u)" % (f.offset_of(p.counter), s) 621ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick size += '%s%s' % (plus, p.size_string()) 622ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick plus = ' + ' 623ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 624ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 62500e760c971ccd6ffab7895a157b5256d54aba24eIan Romanick # If the calculated signature matches a function that has 626ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick # already be emitted, don't emit this function. Instead, add 627ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick # it to the list of function aliases. 628ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 629ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick if self.counter_sigs.has_key(sig): 630ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick n = self.counter_sigs[sig]; 63166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick alias = [f.name, n] 632ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick else: 63366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick alias = None 634ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick self.counter_sigs[sig] = f.name 635ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 636ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick self.common_func_print_just_header(f) 637ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 63866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick for p in params: 639990c8a9df9f7b7081b0406fcffcae6f37c1d39e7Ian Romanick self.common_emit_one_arg(p, "pc", 0) 640ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 641ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 642ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 643ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick self.common_emit_fixups(fixup) 644ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 645ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 646ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print ' return __GLX_PAD(%s);' % (size) 647ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '}' 648ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick print '' 649ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 65066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick return alias 651ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 652ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick 65300772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanickdef show_usage(): 6545aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick print "Usage: %s [-f input_file_name] -m output_mode [--only-get | --only-set] [--get-alias-set]" % sys.argv[0] 6555aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick print " -m output_mode Output mode can be one of 'size_c' or 'size_h'." 6565aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick print " --only-get Only emit 'get'-type functions." 6575aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick print " --only-set Only emit 'set'-type functions." 6585aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick print "" 6595aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick print "By default, both 'get' and 'set'-type functions are emitted." 66000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick sys.exit(1) 66100772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 66200772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 66300772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanickif __name__ == '__main__': 66400772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick file_name = "gl_API.xml" 66500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 66600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick try: 66766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick (args, trail) = getopt.getopt(sys.argv[1:], "f:m:h:", ["only-get", "only-set", "header-tag"]) 66800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick except Exception,e: 66900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick show_usage() 67000772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 6715aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick mode = None 67216c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick header_tag = None 6735aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick which_functions = PrintGlxSizeStubs_common.do_get | PrintGlxSizeStubs_common.do_set 6745aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick 67500772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick for (arg,val) in args: 67600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick if arg == "-f": 67700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick file_name = val 67800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick elif arg == "-m": 67900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick mode = val 6805aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick elif arg == "--only-get": 6815aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick which_functions = PrintGlxSizeStubs_common.do_get 6825aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick elif arg == "--only-set": 6835aa6dc329b983b95071700c3af9353e3b35454d9Ian Romanick which_functions = PrintGlxSizeStubs_common.do_set 68416c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick elif (arg == '-h') or (arg == "--header-tag"): 68516c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick header_tag = val 68600772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 68700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick if mode == "size_c": 68866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxSizeStubs_c( which_functions ) 68900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick elif mode == "size_h": 69066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxSizeStubs_h( which_functions ) 69116c3c7401846bbc7c300e6a9b433584ec5b68699Ian Romanick if header_tag: 69266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer.header_tag = header_tag 693ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick elif mode == "reqsize_c": 69466a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxReqSize_c() 695ba09c19ed65051cd9244c8a5ff380d08e7db1aedIan Romanick elif mode == "reqsize_h": 69666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer = PrintGlxReqSize_h() 69700772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick else: 69800772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick show_usage() 69900772ac42f0f7201d37d1d3bfb2f0b6f9623dfbcIan Romanick 70066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick api = gl_XML.parse_GL_API( file_name, glX_XML.glx_item_factory() ) 70166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 70266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick 70366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick printer.Print( api ) 704