Since only one of the places that used glXFunction::command_payload_length
actually used both values, it was refactored into command_fixed_length and command_variable_length. glXFunction::offset_of_first_parameter was also added.
This commit is contained in:
@@ -240,7 +240,7 @@ class glXEnumFunction:
|
|||||||
class glXEnum(gl_XML.glEnum):
|
class glXEnum(gl_XML.glEnum):
|
||||||
def __init__(self, context, name, attrs):
|
def __init__(self, context, name, attrs):
|
||||||
gl_XML.glEnum.__init__(self, context, name, attrs)
|
gl_XML.glEnum.__init__(self, context, name, attrs)
|
||||||
self.glx_functions = []
|
|
||||||
|
|
||||||
def startElement(self, name, attrs):
|
def startElement(self, name, attrs):
|
||||||
if name == "size":
|
if name == "size":
|
||||||
@@ -416,6 +416,7 @@ class glXFunction(gl_XML.glFunction):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def variable_length_parameter(self):
|
def variable_length_parameter(self):
|
||||||
for param in self.fn_parameters:
|
for param in self.fn_parameters:
|
||||||
if param.is_variable_length_array():
|
if param.is_variable_length_array():
|
||||||
@@ -424,8 +425,14 @@ class glXFunction(gl_XML.glFunction):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def command_payload_length(self):
|
def offset_of_first_parameter(self):
|
||||||
size = 0
|
"""Get the offset of the first parameter in the command.
|
||||||
|
|
||||||
|
Gets the offset of the first function parameter in the GLX
|
||||||
|
command packet. This byte offset is measured from the end
|
||||||
|
of the Render / RenderLarge header. The offset for all non-
|
||||||
|
pixel commends is zero. The offset for pixel commands depends
|
||||||
|
on the number of dimensions of the pixel data."""
|
||||||
|
|
||||||
if self.image:
|
if self.image:
|
||||||
[dim, junk, junk, junk, junk] = self.dimensions()
|
[dim, junk, junk, junk, junk] = self.dimensions()
|
||||||
@@ -435,47 +442,53 @@ class glXFunction(gl_XML.glFunction):
|
|||||||
# of dimensions.
|
# of dimensions.
|
||||||
|
|
||||||
if dim <= 2:
|
if dim <= 2:
|
||||||
size = 20
|
return 20
|
||||||
elif dim <= 4:
|
elif dim <= 4:
|
||||||
size = 36
|
return 36
|
||||||
else:
|
else:
|
||||||
raise RuntimeError('Invalid number of dimensions %u for parameter "%s" in function "%s".' % (dim, self.image.name, self.name))
|
raise RuntimeError('Invalid number of dimensions %u for parameter "%s" in function "%s".' % (dim, self.image.name, self.name))
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
|
||||||
if self.image.img_null_flag:
|
|
||||||
|
def command_fixed_length(self):
|
||||||
|
"""Return the length, in bytes as an integer, of the
|
||||||
|
fixed-size portion of the command."""
|
||||||
|
|
||||||
|
size = self.offset_of_first_parameter()
|
||||||
|
|
||||||
|
for p in gl_XML.glFunction.parameterIterator(self):
|
||||||
|
if not p.is_output:
|
||||||
|
size += p.size()
|
||||||
|
if self.pad_after(p):
|
||||||
size += 4
|
size += 4
|
||||||
|
|
||||||
if self.image.img_pad_dimensions:
|
if self.image and self.image.img_null_flag:
|
||||||
size += 4 * (dim & 1)
|
size += 4
|
||||||
|
|
||||||
# If the image has offset parameters, like
|
return size
|
||||||
# TexSubImage1D or TexSubImage3D, they need to
|
|
||||||
# be padded out as well.
|
|
||||||
|
|
||||||
if self.image.img_xoff:
|
|
||||||
size += 4 * (dim & 1)
|
|
||||||
|
|
||||||
|
|
||||||
|
def command_variable_length(self):
|
||||||
|
"""Return the length, as a string, of the variable-sized
|
||||||
|
portion of the command."""
|
||||||
|
|
||||||
size_string = ""
|
size_string = ""
|
||||||
for p in gl_XML.glFunction.parameterIterator(self):
|
for p in gl_XML.glFunction.parameterIterator(self):
|
||||||
if p.is_output: continue
|
if (not p.is_output) and (p.size() == 0):
|
||||||
temp = p.size_string()
|
size_string = size_string + " + __GLX_PAD(%s)" % (p.size_string())
|
||||||
try:
|
|
||||||
s = int(temp)
|
return size_string
|
||||||
size += s
|
|
||||||
except Exception,e:
|
|
||||||
size_string = size_string + " + __GLX_PAD(%s)" % (temp)
|
|
||||||
|
|
||||||
return [size, size_string]
|
|
||||||
|
|
||||||
def command_length(self):
|
def command_length(self):
|
||||||
[size, size_string] = self.command_payload_length()
|
size = self.command_fixed_length()
|
||||||
|
|
||||||
if self.glx_rop != 0:
|
if self.glx_rop != 0:
|
||||||
size += 4
|
size += 4
|
||||||
|
|
||||||
size = ((size + 3) & ~3)
|
size = ((size + 3) & ~3)
|
||||||
return "%u%s" % (size, size_string)
|
return "%u%s" % (size, self.command_variable_length())
|
||||||
|
|
||||||
|
|
||||||
def opcode_real_value(self):
|
def opcode_real_value(self):
|
||||||
|
@@ -470,18 +470,13 @@ generic_%u_byte( GLint rop, const void * ptr )
|
|||||||
indent += " "
|
indent += " "
|
||||||
|
|
||||||
[dim, width, height, depth, extent] = pixel_func.dimensions()
|
[dim, width, height, depth, extent] = pixel_func.dimensions()
|
||||||
|
adjust = pixel_func.offset_of_first_parameter() + 4
|
||||||
if dim < 3:
|
|
||||||
adjust = 20 + 4
|
|
||||||
else:
|
|
||||||
adjust = 36 + 4
|
|
||||||
|
|
||||||
|
|
||||||
print '%s emit_header(gc->pc, opcode, cmdlen);' % (indent)
|
print '%s emit_header(gc->pc, opcode, cmdlen);' % (indent)
|
||||||
|
|
||||||
offset = self.pixel_emit_args(pixel_func, "gc->pc", indent, adjust, dim, 0)
|
offset = self.pixel_emit_args(pixel_func, "gc->pc", indent, adjust, dim, 0)
|
||||||
|
|
||||||
[s, junk] = pixel_func.command_payload_length()
|
s = pixel_func.command_fixed_length()
|
||||||
|
|
||||||
pixHeaderPtr = "gc->pc + 4"
|
pixHeaderPtr = "gc->pc + 4"
|
||||||
pcPtr = "gc->pc + %u" % (s + 4)
|
pcPtr = "gc->pc + %u" % (s + 4)
|
||||||
@@ -559,18 +554,13 @@ generic_%u_byte( GLint rop, const void * ptr )
|
|||||||
indent += " "
|
indent += " "
|
||||||
|
|
||||||
[dim, width, height, depth, extent] = f.dimensions()
|
[dim, width, height, depth, extent] = f.dimensions()
|
||||||
|
adjust = f.offset_of_first_parameter() + 4
|
||||||
if dim < 3:
|
|
||||||
adjust = 20 + 4
|
|
||||||
else:
|
|
||||||
adjust = 36 + 4
|
|
||||||
|
|
||||||
|
|
||||||
print '%s emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name())
|
print '%s emit_header(gc->pc, %s, cmdlen);' % (indent, f.opcode_real_name())
|
||||||
|
|
||||||
offset = self.pixel_emit_args(f, "gc->pc", indent, adjust, dim, 0)
|
offset = self.pixel_emit_args(f, "gc->pc", indent, adjust, dim, 0)
|
||||||
|
|
||||||
[s, junk] = f.command_payload_length()
|
s = f.command_fixed_length()
|
||||||
|
|
||||||
pixHeaderPtr = "gc->pc + 4"
|
pixHeaderPtr = "gc->pc + 4"
|
||||||
pcPtr = "gc->pc + %u" % (s + 4)
|
pcPtr = "gc->pc + %u" % (s + 4)
|
||||||
@@ -623,7 +613,7 @@ generic_%u_byte( GLint rop, const void * ptr )
|
|||||||
if f.variable_length_parameter() == None and len(f.fn_parameters) == 1:
|
if f.variable_length_parameter() == None and len(f.fn_parameters) == 1:
|
||||||
p = f.fn_parameters[0]
|
p = f.fn_parameters[0]
|
||||||
if p.is_pointer:
|
if p.is_pointer:
|
||||||
[cmdlen, size_string] = f.command_payload_length()
|
cmdlen = f.command_fixed_length()
|
||||||
if cmdlen in self.generic_sizes:
|
if cmdlen in self.generic_sizes:
|
||||||
self.common_func_print_just_header(f)
|
self.common_func_print_just_header(f)
|
||||||
print ' generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
|
print ' generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
|
||||||
|
Reference in New Issue
Block a user