Home | History | Annotate | Download | only in gen
      1 #!/usr/bin/env python
      2 
      3 # (C) Copyright IBM Corporation 2004, 2005
      4 # All Rights Reserved.
      5 #
      6 # Permission is hereby granted, free of charge, to any person obtaining a
      7 # copy of this software and associated documentation files (the "Software"),
      8 # to deal in the Software without restriction, including without limitation
      9 # on the rights to use, copy, modify, merge, publish, distribute, sub
     10 # license, and/or sell copies of the Software, and to permit persons to whom
     11 # the Software is furnished to do so, subject to the following conditions:
     12 #
     13 # The above copyright notice and this permission notice (including the next
     14 # paragraph) shall be included in all copies or substantial portions of the
     15 # Software.
     16 #
     17 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19 # FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
     20 # IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     22 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     23 # IN THE SOFTWARE.
     24 #
     25 # Authors:
     26 #    Ian Romanick <idr (at] us.ibm.com>
     27 
     28 import gl_XML, glX_XML
     29 import string
     30 
     31 
     32 class glx_proto_item_factory(glX_XML.glx_item_factory):
     33 	"""Factory to create GLX protocol oriented objects derived from gl_item."""
     34     
     35 	def create_item(self, name, element, context):
     36 		if name == "type":
     37 			return glx_proto_type(element, context)
     38 		else:
     39 			return glX_XML.glx_item_factory.create_item(self, name, element, context)
     40 
     41 
     42 class glx_proto_type(gl_XML.gl_type):
     43 	def __init__(self, element, context):
     44 		gl_XML.gl_type.__init__(self, element, context)
     45 
     46 		self.glx_name = element.nsProp( "glx_name", None )
     47 		return
     48 
     49 
     50 class glx_print_proto(gl_XML.gl_print_base):
     51 	def size_call(self, func, outputs_also = 0):
     52 		"""Create C code to calculate 'compsize'.
     53 
     54 		Creates code to calculate 'compsize'.  If the function does
     55 		not need 'compsize' to be calculated, None will be
     56 		returned."""
     57 	
     58 		compsize = None
     59 
     60 		for param in func.parameterIterator():
     61 			if outputs_also or not param.is_output:
     62 				if param.is_image():
     63 					[dim, w, h, d, junk] = param.get_dimensions()
     64 
     65 					compsize = '__glImageSize(%s, %s, %s, %s, %s, %s)' % (w, h, d, param.img_format, param.img_type, param.img_target)
     66 					if not param.img_send_null:
     67 						compsize = '(%s != NULL) ? %s : 0' % (param.name, compsize)
     68 
     69 					return compsize
     70 
     71 				elif len(param.count_parameter_list):
     72 					parameters = string.join( param.count_parameter_list, "," )
     73 					compsize = "__gl%s_size(%s)" % (func.name, parameters)
     74 
     75 					return compsize
     76 
     77 		return None
     78 
     79 
     80 	def emit_packet_size_calculation(self, f, bias):
     81 		# compsize is only used in the command size calculation if
     82 		# the function has a non-output parameter that has a non-empty
     83 		# counter_parameter_list.
     84 
     85 		compsize = self.size_call(f)
     86 		if compsize:
     87 			print '    const GLuint compsize = %s;' % (compsize)
     88 
     89 		if bias:
     90 			print '    const GLuint cmdlen = %s - %u;' % (f.command_length(), bias)
     91 		else:
     92 			print '    const GLuint cmdlen = %s;' % (f.command_length())
     93 
     94 		#print ''
     95 		return compsize
     96