{
D3DLOCKED_RECT lock;
HRESULT hr;
- const struct util_format_description *sfmt =
- util_format_description(surf->base.info.format);
- assert(sfmt);
+ const struct util_format_unpack_description *unpack =
+ util_format_unpack_description(surf->base.info.format);
+ assert(unpack);
hr = NineSurface9_LockRect(surf, &lock, NULL, D3DLOCK_READONLY);
if (FAILED(hr))
ret_err("Failed to map cursor source image.\n",
D3DERR_DRIVERINTERNALERROR);
- sfmt->unpack_rgba_8unorm(ptr, transfer->stride,
- lock.pBits, lock.Pitch,
- This->cursor.w, This->cursor.h);
+ unpack->unpack_rgba_8unorm(ptr, transfer->stride,
+ lock.pBits, lock.Pitch,
+ This->cursor.w, This->cursor.h);
if (hw_cursor) {
void *data = lock.pBits;
/* SetCursor assumes 32x32 argb with pitch 128 */
if (lock.Pitch != 128) {
- sfmt->unpack_rgba_8unorm(This->cursor.hw_upload_temp, 128,
- lock.pBits, lock.Pitch,
- 32, 32);
+ unpack->unpack_rgba_8unorm(This->cursor.hw_upload_temp, 128,
+ lock.pBits, lock.Pitch,
+ 32, 32);
data = This->cursor.hw_upload_temp;
}
hw_cursor = ID3DPresent_SetCursor(This->swapchains[0]->present,
SWIZZLE_NONE: "PIPE_SWIZZLE_NONE",
}
+def has_access(format):
+ # We don't generate code for YUV formats, and many of the new ones lack
+ # pack/unpack functions for softpipe/llvmpipe.
+ noaccess_formats = [
+ 'yv12',
+ 'yv16',
+ 'iyuv',
+ 'nv12',
+ 'nv16',
+ 'nv21',
+ 'p010',
+ 'p012',
+ 'p016',
+ 'xyuv',
+ 'ayuv',
+ 'r8g8_r8b8_unorm',
+ 'g8r8_b8r8_unorm',
+ 'g8r8_g8b8_unorm',
+ 'y8_u8_v8_422_unorm',
+ 'y8_u8v8_422_unorm',
+ 'y8_u8_v8_444_unorm',
+ 'y16_u16_v16_420_unorm',
+ 'y16_u16_v16_422_unorm',
+ 'y16_u16v16_422_unorm',
+ 'y16_u16_v16_444_unorm',
+ ]
+ if format.short_name() in noaccess_formats:
+ return False
+ if format.layout in ('astc', 'atc', 'fxt1'):
+ return False
+ if format.layout == 'etc' and format.short_name() != 'etc1_rgb8':
+ return False
+ return True
def write_format_table(formats):
print('/* This file is autogenerated by u_format_table.py from u_format.csv. Do not edit directly. */')
print("const struct util_format_%sdescription *" % type)
print("util_format_%sdescription(enum pipe_format format)" % type)
print("{")
- print(" if (format >= PIPE_FORMAT_COUNT) {")
+ print(" if (format >= ARRAY_SIZE(util_format_%sdescriptions))" % (type))
print(" return NULL;")
- print(" }")
print()
- print(" switch (format) {")
- for format in formats:
- print(" case %s:" % format.name)
- print(" return &util_format_%s_%sdescription;" % (format.short_name(), type))
- print(" default:")
- print(" return NULL;")
- print(" }")
+ print(" return &util_format_%sdescriptions[format];" % (type))
print("}")
print()
-
+ print('static const struct util_format_description')
+ print('util_format_descriptions[] = {')
for format in formats:
sn = format.short_name()
- print('const struct util_format_description')
- print('util_format_%s_description = {' % (sn,))
+ print(" [%s] = {" % (format.name,))
print(" %s," % (format.name,))
print(" \"%s\"," % (format.name,))
print(" \"%s\"," % (sn,))
u_format_pack.print_channels(format, do_channel_array)
u_format_pack.print_channels(format, do_swizzle_array)
print(" %s," % (colorspace_map(format.colorspace),))
- print("};")
+ print(" },")
print()
+ print("};")
+ print()
+ generate_table_getter("")
+
+ print('static const struct util_format_pack_description')
+ print('util_format_pack_descriptions[] = {')
+ for format in formats:
+ sn = format.short_name()
+
+ if not has_access(format):
+ print(" [%s] = { 0 }," % (format.name,))
+ continue
- # We don't generate code for YUV formats, and many of the new ones lack pack/unpack
- # functions for softpipe/llvmpipe.
- noaccess_formats = [
- 'yv12',
- 'yv16',
- 'iyuv',
- 'nv12',
- 'nv16',
- 'nv21',
- 'p010',
- 'p012',
- 'p016',
- 'xyuv',
- 'ayuv',
- 'r8g8_r8b8_unorm',
- 'g8r8_b8r8_unorm',
- 'g8r8_g8b8_unorm',
- 'y8_u8_v8_422_unorm',
- 'y8_u8v8_422_unorm',
- 'y8_u8_v8_444_unorm',
- 'y16_u16_v16_420_unorm',
- 'y16_u16_v16_422_unorm',
- 'y16_u16v16_422_unorm',
- 'y16_u16_v16_444_unorm',
- ]
- access = sn not in noaccess_formats
- if format.layout in ('astc', 'atc', 'fxt1'):
- access = False
- if format.layout == 'etc' and sn != 'etc1_rgb8':
- access = False
-
- print('const struct util_format_pack_description')
- print('util_format_%s_pack_description = {' % sn)
- if format.colorspace != ZS and not format.is_pure_color() and access:
+ print(" [%s] = {" % (format.name,))
+
+ if format.colorspace != ZS and not format.is_pure_color():
print(" .pack_rgba_8unorm = &util_format_%s_pack_rgba_8unorm," % sn)
print(" .pack_rgba_float = &util_format_%s_pack_rgba_float," % sn)
if format.is_pure_unsigned() or format.is_pure_signed():
print(" .pack_rgba_uint = &util_format_%s_pack_unsigned," % sn)
print(" .pack_rgba_sint = &util_format_%s_pack_signed," % sn)
- print("};")
+ print(" },")
print()
+ print("};")
+ print()
+ generate_table_getter("pack_")
+
+ print('static const struct util_format_unpack_description')
+ print('util_format_unpack_descriptions[] = {')
+ for format in formats:
+ sn = format.short_name()
+
+ if not has_access(format):
+ print(" [%s] = { 0 }," % (format.name,))
+ continue
+
+ print(" [%s] = {" % (format.name,))
- print('const struct util_format_unpack_description')
- print('util_format_%s_unpack_description = {' % sn)
- if format.colorspace != ZS and not format.is_pure_color() and access:
+ if format.colorspace != ZS and not format.is_pure_color():
print(" .unpack_rgba_8unorm = &util_format_%s_unpack_rgba_8unorm," % sn)
if format.layout == 's3tc' or format.layout == 'rgtc':
print(" .fetch_rgba_8unorm = &util_format_%s_fetch_rgba_8unorm," % sn)
elif format.is_pure_signed():
print(" .unpack_rgba = &util_format_%s_unpack_signed," % sn)
print(" .fetch_rgba_sint = &util_format_%s_fetch_signed," % sn)
- print("};")
- print()
+ print(" },")
+ print("};")
+ print()
- generate_table_getter("")
- generate_table_getter("pack_")
generate_table_getter("unpack_")
def main():