Added some comments and fixed typeos. Slightly refactored the way
authorIan Romanick <idr@us.ibm.com>
Tue, 21 Dec 2004 21:26:36 +0000 (21:26 +0000)
committerIan Romanick <idr@us.ibm.com>
Tue, 21 Dec 2004 21:26:36 +0000 (21:26 +0000)
function parameters are iterated.  There are no changes in the generated
code.

src/mesa/glapi/glX_XML.py
src/mesa/glapi/glX_proto_send.py
src/mesa/glapi/gl_XML.py
src/mesa/glapi/gl_apitemp.py
src/mesa/glapi/gl_x86_asm.py

index 44f945a9ee4fa5750a7a585c3eeb86309c3dc296..3534132053735944ac05f953ada9a215876d094a 100644 (file)
@@ -263,6 +263,42 @@ class glXParameter(gl_XML.glParameter):
                gl_XML.glParameter.__init__(self, context, name, attrs);
 
 
+class glXParameterIterator:
+       """Class to iterate over a list of glXParameters.
+
+       Objects of this class are returned by the parameterIterator method of
+       the glXFunction class.  They are used to iterate over the list of
+       parameters to the function."""
+
+       def __init__(self, data, skip_output, max_order):
+               self.data = data
+               self.index = 0
+               self.order = 0
+               self.skip_output = skip_output
+               self.max_order = max_order
+
+       def __iter__(self):
+               return self
+
+       def next(self):
+               if len( self.data ) == 0:
+                       raise StopIteration
+
+               while 1:
+                       if self.index == len( self.data ):
+                               if self.order == self.max_order:
+                                       raise StopIteration
+                               else:
+                                       self.order += 1
+                                       self.index = 0
+
+                       i = self.index
+                       self.index += 1
+
+                       if self.data[i].order == self.order and not (self.data[i].is_output and self.skip_output):
+                               return self.data[i]
+
+
 class glXFunction(gl_XML.glFunction):
        glx_rop = 0
        glx_sop = 0
@@ -293,6 +329,11 @@ class glXFunction(gl_XML.glFunction):
                gl_XML.glFunction.__init__(self, context, name, attrs)
                return
 
+
+       def parameterIterator(self, skip_output, max_order):
+               return glXParameterIterator(self.fn_parameters, skip_output, max_order)
+
+               
        def startElement(self, name, attrs):
                """Process elements within a function that are specific to GLX."""
 
@@ -360,7 +401,7 @@ class glXFunction(gl_XML.glFunction):
        def command_payload_length(self):
                size = 0
                size_string = ""
-               for p in self:
+               for p in gl_XML.glFunction.parameterIterator(self):
                        if p.is_output: continue
                        temp = p.size_string()
                        try:
@@ -382,6 +423,16 @@ class glXFunction(gl_XML.glFunction):
 
 
        def opcode_real_value(self):
+               """Get the true numeric value of the GLX opcode
+               
+               Behaves similarly to opcode_value, except for
+               X_GLXVendorPrivate and X_GLXVendorPrivateWithReply commands.
+               In these cases the value for the GLX opcode field (i.e.,
+               16 for X_GLXVendorPrivate or 17 for
+               X_GLXVendorPrivateWithReply) is returned.  For other 'single'
+               commands, the opcode for the command (e.g., 101 for
+               X_GLsop_NewList) is returned."""
+
                if self.glx_vendorpriv != 0:
                        if self.needs_reply():
                                return 17
@@ -391,6 +442,8 @@ class glXFunction(gl_XML.glFunction):
                        return self.opcode_value()
 
        def opcode_value(self):
+               """Get the unique protocol opcode for the glXFunction"""
+
                if self.glx_rop != 0:
                        return self.glx_rop
                elif self.glx_sop != 0:
@@ -401,12 +454,20 @@ class glXFunction(gl_XML.glFunction):
                        return -1
        
        def opcode_rop_basename(self):
+               """Return either the name to be used for GLX protocol enum.
+               
+               Returns either the name of the function or the name of the
+               name of the equivalent vector (e.g., glVertex3fv for
+               glVertex3f) function."""
+
                if self.vectorequiv == None:
                        return self.name
                else:
                        return self.vectorequiv
 
        def opcode_name(self):
+               """Get the unique protocol enum name for the glXFunction"""
+
                if self.glx_rop != 0:
                        return "X_GLrop_%s" % (self.opcode_rop_basename())
                elif self.glx_sop != 0:
@@ -417,6 +478,15 @@ class glXFunction(gl_XML.glFunction):
                        return "ERROR"
 
        def opcode_real_name(self):
+               """Get the true protocol enum name for the GLX opcode
+               
+               Behaves similarly to opcode_name, except for
+               X_GLXVendorPrivate and X_GLXVendorPrivateWithReply commands.
+               In these cases the string 'X_GLXVendorPrivate' or
+               'X_GLXVendorPrivateWithReply' is returned.  For other
+               single or render commands 'X_GLsop' or 'X_GLrop' plus the
+               name of the function returned."""
+
                if self.glx_vendorpriv != 0:
                        if self.needs_reply():
                                return "X_GLXVendorPrivateWithReply"
index 2b688ace156ed0841b4a116e0b39f3c2cdf6fe86..418f140df4572057186f913f37a03933519c7f67 100644 (file)
@@ -153,8 +153,6 @@ generic_%u_byte( GLint rop, const void * ptr )
 
 
        def common_emit_one_arg(self, p, offset, pc, indent, adjust):
-               if p.is_output: return
-
                t = p.p_type
                if p.is_array():
                        src_ptr = p.name
@@ -165,23 +163,16 @@ generic_%u_byte( GLint rop, const void * ptr )
                        % (indent, pc, offset + adjust, src_ptr, p.size_string() )
 
        def common_emit_args(self, f, pc, indent, adjust, skip_vla):
-               # First emit all of the fixed-length 8-byte (i.e., GLdouble)
-               # parameters.
-
                offset = 0
 
                if skip_vla:
-                       r = [0, 1]
+                       r = 1
                else:
-                       r = [0, 1, 2]
-
-               for order in r:
-                       for p in f:
-                               if p.is_output or p.order != order: continue
-
-                               self.common_emit_one_arg(p, offset, pc, indent, adjust)
-                               offset += p.size()
+                       r = 2
 
+               for p in f.parameterIterator(1, r):
+                       self.common_emit_one_arg(p, offset, pc, indent, adjust)
+                       offset += p.size()
 
                return offset
 
@@ -274,7 +265,7 @@ generic_%u_byte( GLint rop, const void * ptr )
                # of data, and the protocol for this functions is very
                # regular.  Since they are so regular and there are so many
                # of them, special case them with generic functions.  On
-               # x86, this save about 26KB in the libGL.so binary.
+               # x86, this saves about 26KB in the libGL.so binary.
 
                if f.variable_length_parameter() == None and len(f.fn_parameters) == 1:
                        p = f.fn_parameters[0]
index 79da5abab9b61d08394c209217e12e5864a817e4..a58f28515563ff118c89627f705438a4078e3f27 100644 (file)
@@ -252,14 +252,17 @@ class glParameter( glItem ):
 class glParameterIterator:
        """Class to iterate over a list of glParameters.
        
-       Objects of this class are returned by the __iter__ method of the
-       glFunction class.  They are used to iterate over the list of
+       Objects of this class are returned by the parameterIterator method of
+       the glFunction class.  They are used to iterate over the list of
        parameters to the function."""
 
        def __init__(self, data):
                self.data = data
                self.index = 0
-               
+
+       def __iter__(self):
+               return self
+
        def next(self):
                if self.index == len( self.data ):
                        raise StopIteration
@@ -295,7 +298,7 @@ class glFunction( glItem ):
                return
 
 
-       def __iter__(self):
+       def parameterIterator(self):
                return glParameterIterator(self.fn_parameters)
 
 
@@ -325,7 +328,7 @@ class glFunction( glItem ):
        def get_parameter_string(self):
                arg_string = ""
                comma = ""
-               for p in self:
+               for p in glFunction.parameterIterator(self):
                        arg_string = arg_string + comma + p.p_type_string + " " + p.name
                        comma = ", "
 
index 1e5c3f4efa550f5e1100b251996815f49a14b648..533cc65becdfca3d1e530620b52ef30d9db8bbb4 100644 (file)
@@ -48,7 +48,7 @@ class PrintGlOffsets(gl_XML.FilterGLAPISpecBase):
                t_string = ""
                comma = ""
 
-               for p in f:
+               for p in f.parameterIterator():
                        cast = ""
 
                        if p.is_pointer:
index 47cef8054736d7ff61baa3e84831688983ae4da9..f87065a5af2c2c7cfa29c1191e4d0c7e863ceafb 100644 (file)
@@ -45,7 +45,7 @@ class PrintGenericStubs(gl_XML.FilterGLAPISpecBase):
 
        def get_stack_size(self, f):
                size = 0
-               for p in f:
+               for p in f.parameterIterator():
                        t = p.p_type
 
                        if p.is_array() or t.size != 8: