116 lines
3.8 KiB
Python
116 lines
3.8 KiB
Python
""" This simple Python script can be run to generate
|
|
store_pixel_code.h and store_pixel_table.h, which are a poor man's
|
|
form of generated code to cover the explosion of different blending
|
|
options when storing a pixel into the framebuffer.
|
|
|
|
Each different combination of options is compiled to a different
|
|
inner-loop store function. The code in tinyGraphicsStateGuardian.cxx
|
|
will select the appropriate function pointer at draw time. """
|
|
|
|
Operands = [
|
|
'zero', 'one',
|
|
'icolor', 'micolor',
|
|
'fcolor', 'mfcolor',
|
|
'ialpha', 'mialpha',
|
|
'falpha', 'mfalpha',
|
|
'ccolor', 'mccolor',
|
|
'calpha', 'mcalpha',
|
|
]
|
|
|
|
CodeTable = {
|
|
'zero' : '0',
|
|
'one' : '0x10000',
|
|
'icolor' : 'i',
|
|
'micolor' : '0xffff - i',
|
|
'fcolor' : 'f',
|
|
'mfcolor' : '0xffff - f',
|
|
'ialpha' : 'a',
|
|
'mialpha' : '0xffff - a',
|
|
'falpha' : 'fa',
|
|
'mfalpha' : '0xffff - fa',
|
|
'ccolor' : 'zb->blend_ ## i',
|
|
'mccolor' : '0xffff - zb->blend_ ## i',
|
|
'calpha' : 'zb->blend_a',
|
|
'mcalpha' : '0xffff - zb->blend_a',
|
|
}
|
|
|
|
|
|
bitnames = 'rgba'
|
|
|
|
def getFname(op_a, op_b, mask):
|
|
maskname = ''
|
|
for b in range(4):
|
|
if (mask & (1 << b)):
|
|
maskname += bitnames[b]
|
|
else:
|
|
maskname += '0'
|
|
return 'store_pixel_%s_%s_%s' % (op_a, op_b, maskname)
|
|
|
|
# We write the code that actually instantiates the various
|
|
# pixel-storing functions to store_pixel_code.h.
|
|
code = open('store_pixel_code.h', 'wb')
|
|
print >> code, '/* This file is generated code--do not edit. See store_pixel.py. */'
|
|
print >> code, ''
|
|
|
|
# The external reference for the table containing the above function
|
|
# pointers gets written here.
|
|
table = open('store_pixel_table.h', 'wb')
|
|
print >> table, '/* This file is generated code--do not edit. See store_pixel.py. */'
|
|
print >> table, ''
|
|
|
|
for op_a in Operands:
|
|
for op_b in Operands:
|
|
for mask in range(0, 16):
|
|
fname = getFname(op_a, op_b, mask)
|
|
print >> code, '#define FNAME(name) %s' % (fname)
|
|
if mask & (1 | 2 | 3):
|
|
print >> code, '#define FNAME_S(name) %s_s' % (fname)
|
|
|
|
print >> code, '#define OP_A(f, i) ((unsigned int)(%s))' % (CodeTable[op_a])
|
|
print >> code, '#define OP_B(f, i) ((unsigned int)(%s))' % (CodeTable[op_b])
|
|
for b in range(0, 4):
|
|
if (mask & (1 << b)):
|
|
print >> code, "#define STORE_PIXEL_%s(fr, r) STORE_PIX_CLAMP(r)" % (b)
|
|
else:
|
|
print >> code, "#define STORE_PIXEL_%s(fr, r) (fr)" % (b)
|
|
print >> code, '#include "store_pixel.h"'
|
|
print >> code, ''
|
|
|
|
|
|
# Now, generate the table of function pointers.
|
|
arraySize = '[%s][%s][16]' % (len(Operands), len(Operands))
|
|
|
|
print >> table, 'extern const ZB_storePixelFunc store_pixel_funcs%s;' % (arraySize)
|
|
print >> code, 'const ZB_storePixelFunc store_pixel_funcs%s = {' % (arraySize)
|
|
|
|
for op_a in Operands:
|
|
print >> code, ' {'
|
|
for op_b in Operands:
|
|
print >> code, ' {'
|
|
for mask in range(0, 16):
|
|
fname = getFname(op_a, op_b, mask)
|
|
print >> code, ' %s,' % (fname)
|
|
print >> code, ' },'
|
|
print >> code, ' },'
|
|
print >> code, '};'
|
|
|
|
print >> code
|
|
|
|
# Now do this again, but for the sRGB function pointers.
|
|
print >> table, 'extern const ZB_storePixelFunc store_pixel_funcs_sRGB%s;' % (arraySize)
|
|
print >> code, 'const ZB_storePixelFunc store_pixel_funcs_sRGB%s = {' % (arraySize)
|
|
|
|
for op_a in Operands:
|
|
print >> code, ' {'
|
|
for op_b in Operands:
|
|
print >> code, ' {'
|
|
for mask in range(0, 16):
|
|
fname = getFname(op_a, op_b, mask)
|
|
if mask & (1 | 2 | 3):
|
|
print >> code, ' %s_s,' % (fname)
|
|
else:
|
|
print >> code, ' %s,' % (fname)
|
|
print >> code, ' },'
|
|
print >> code, ' },'
|
|
print >> code, '};'
|