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):
|
||||
def __init__(self, context, name, attrs):
|
||||
gl_XML.glEnum.__init__(self, context, name, attrs)
|
||||
self.glx_functions = []
|
||||
|
||||
|
||||
def startElement(self, name, attrs):
|
||||
if name == "size":
|
||||
@@ -416,6 +416,7 @@ class glXFunction(gl_XML.glFunction):
|
||||
|
||||
return
|
||||
|
||||
|
||||
def variable_length_parameter(self):
|
||||
for param in self.fn_parameters:
|
||||
if param.is_variable_length_array():
|
||||
@@ -424,8 +425,14 @@ class glXFunction(gl_XML.glFunction):
|
||||
return None
|
||||
|
||||
|
||||
def command_payload_length(self):
|
||||
size = 0
|
||||
def offset_of_first_parameter(self):
|
||||
"""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:
|
||||
[dim, junk, junk, junk, junk] = self.dimensions()
|
||||
@@ -435,47 +442,53 @@ class glXFunction(gl_XML.glFunction):
|
||||
# of dimensions.
|
||||
|
||||
if dim <= 2:
|
||||
size = 20
|
||||
return 20
|
||||
elif dim <= 4:
|
||||
size = 36
|
||||
return 36
|
||||
else:
|
||||
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
|
||||
|
||||
if self.image.img_pad_dimensions:
|
||||
size += 4 * (dim & 1)
|
||||
if self.image and self.image.img_null_flag:
|
||||
size += 4
|
||||
|
||||
# If the image has offset parameters, like
|
||||
# TexSubImage1D or TexSubImage3D, they need to
|
||||
# be padded out as well.
|
||||
|
||||
if self.image.img_xoff:
|
||||
size += 4 * (dim & 1)
|
||||
return size
|
||||
|
||||
|
||||
def command_variable_length(self):
|
||||
"""Return the length, as a string, of the variable-sized
|
||||
portion of the command."""
|
||||
|
||||
size_string = ""
|
||||
for p in gl_XML.glFunction.parameterIterator(self):
|
||||
if p.is_output: continue
|
||||
temp = p.size_string()
|
||||
try:
|
||||
s = int(temp)
|
||||
size += s
|
||||
except Exception,e:
|
||||
size_string = size_string + " + __GLX_PAD(%s)" % (temp)
|
||||
if (not p.is_output) and (p.size() == 0):
|
||||
size_string = size_string + " + __GLX_PAD(%s)" % (p.size_string())
|
||||
|
||||
return size_string
|
||||
|
||||
return [size, size_string]
|
||||
|
||||
def command_length(self):
|
||||
[size, size_string] = self.command_payload_length()
|
||||
size = self.command_fixed_length()
|
||||
|
||||
if self.glx_rop != 0:
|
||||
size += 4
|
||||
|
||||
size = ((size + 3) & ~3)
|
||||
return "%u%s" % (size, size_string)
|
||||
return "%u%s" % (size, self.command_variable_length())
|
||||
|
||||
|
||||
def opcode_real_value(self):
|
||||
|
@@ -470,18 +470,13 @@ generic_%u_byte( GLint rop, const void * ptr )
|
||||
indent += " "
|
||||
|
||||
[dim, width, height, depth, extent] = pixel_func.dimensions()
|
||||
|
||||
if dim < 3:
|
||||
adjust = 20 + 4
|
||||
else:
|
||||
adjust = 36 + 4
|
||||
|
||||
adjust = pixel_func.offset_of_first_parameter() + 4
|
||||
|
||||
print '%s emit_header(gc->pc, opcode, cmdlen);' % (indent)
|
||||
|
||||
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"
|
||||
pcPtr = "gc->pc + %u" % (s + 4)
|
||||
@@ -559,18 +554,13 @@ generic_%u_byte( GLint rop, const void * ptr )
|
||||
indent += " "
|
||||
|
||||
[dim, width, height, depth, extent] = f.dimensions()
|
||||
|
||||
if dim < 3:
|
||||
adjust = 20 + 4
|
||||
else:
|
||||
adjust = 36 + 4
|
||||
|
||||
adjust = f.offset_of_first_parameter() + 4
|
||||
|
||||
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)
|
||||
|
||||
[s, junk] = f.command_payload_length()
|
||||
s = f.command_fixed_length()
|
||||
|
||||
pixHeaderPtr = "gc->pc + 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:
|
||||
p = f.fn_parameters[0]
|
||||
if p.is_pointer:
|
||||
[cmdlen, size_string] = f.command_payload_length()
|
||||
cmdlen = f.command_fixed_length()
|
||||
if cmdlen in self.generic_sizes:
|
||||
self.common_func_print_just_header(f)
|
||||
print ' generic_%u_byte( %s, %s );' % (cmdlen, f.opcode_real_name(), p.name)
|
||||
|
Reference in New Issue
Block a user