#!/usr/bin/env python ########################################################################## # # Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. # All Rights Reserved. # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sub license, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice (including the # next paragraph) shall be included in all copies or substantial portions # of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. # IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR # ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ########################################################################## """Texture data generation for use in testing.""" import random from gallium import * dxt1_rgb_data = [ ( [ [0x99, 0xb0, 0x8e, 0xff], [0x5d, 0x62, 0x89, 0xff], [0x99, 0xb0, 0x8e, 0xff], [0x99, 0xb0, 0x8e, 0xff], [0xd6, 0xff, 0x94, 0xff], [0x5d, 0x62, 0x89, 0xff], [0x99, 0xb0, 0x8e, 0xff], [0xd6, 0xff, 0x94, 0xff], [0x5d, 0x62, 0x89, 0xff], [0x5d, 0x62, 0x89, 0xff], [0x99, 0xb0, 0x8e, 0xff], [0x21, 0x14, 0x84, 0xff], [0x5d, 0x62, 0x89, 0xff], [0x21, 0x14, 0x84, 0xff], [0x21, 0x14, 0x84, 0xff], [0x99, 0xb0, 0x8e, 0xff], ], [0xf2, 0xd7, 0xb0, 0x20, 0xae, 0x2c, 0x6f, 0x97], ), ( [ [0xb5, 0xcf, 0x9c, 0xff], [0x83, 0x8c, 0x8b, 0xff], [0x21, 0x08, 0x6b, 0xff], [0x83, 0x8c, 0x8b, 0xff], [0x52, 0x4a, 0x7b, 0xff], [0x83, 0x8c, 0x8b, 0xff], [0x83, 0x8c, 0x8b, 0xff], [0xb5, 0xcf, 0x9c, 0xff], [0x21, 0x08, 0x6b, 0xff], [0xb5, 0xcf, 0x9c, 0xff], [0x83, 0x8c, 0x8b, 0xff], [0x52, 0x4a, 0x7b, 0xff], [0xb5, 0xcf, 0x9c, 0xff], [0x83, 0x8c, 0x8b, 0xff], [0x52, 0x4a, 0x7b, 0xff], [0x83, 0x8c, 0x8b, 0xff], ], [0x73, 0xb6, 0x4d, 0x20, 0x98, 0x2b, 0xe1, 0xb8], ), ( [ [0x00, 0x2c, 0xff, 0xff], [0x94, 0x8d, 0x7b, 0xff], [0x4a, 0x5c, 0xbd, 0xff], [0x4a, 0x5c, 0xbd, 0xff], [0x4a, 0x5c, 0xbd, 0xff], [0x94, 0x8d, 0x7b, 0xff], [0x94, 0x8d, 0x7b, 0xff], [0x94, 0x8d, 0x7b, 0xff], [0xde, 0xbe, 0x39, 0xff], [0x94, 0x8d, 0x7b, 0xff], [0xde, 0xbe, 0x39, 0xff], [0xde, 0xbe, 0x39, 0xff], [0xde, 0xbe, 0x39, 0xff], [0xde, 0xbe, 0x39, 0xff], [0xde, 0xbe, 0x39, 0xff], [0x94, 0x8d, 0x7b, 0xff], ], [0xe7, 0xdd, 0x7f, 0x01, 0xf9, 0xab, 0x08, 0x80], ), ( [ [0x6b, 0x24, 0x21, 0xff], [0x7b, 0x4f, 0x5d, 0xff], [0x7b, 0x4f, 0x5d, 0xff], [0x8b, 0x7a, 0x99, 0xff], [0x7b, 0x4f, 0x5d, 0xff], [0x7b, 0x4f, 0x5d, 0xff], [0x6b, 0x24, 0x21, 0xff], [0x8b, 0x7a, 0x99, 0xff], [0x9c, 0xa6, 0xd6, 0xff], [0x6b, 0x24, 0x21, 0xff], [0x7b, 0x4f, 0x5d, 0xff], [0x8b, 0x7a, 0x99, 0xff], [0x6b, 0x24, 0x21, 0xff], [0x8b, 0x7a, 0x99, 0xff], [0x7b, 0x4f, 0x5d, 0xff], [0x9c, 0xa6, 0xd6, 0xff], ], [0x3a, 0x9d, 0x24, 0x69, 0xbd, 0x9f, 0xb4, 0x39], ), ] dxt1_rgba = [ ( [ [0x00, 0x00, 0x00, 0x00], [0x4e, 0xaa, 0x90, 0xff], [0x4e, 0xaa, 0x90, 0xff], [0x00, 0x00, 0x00, 0x00], [0x4e, 0xaa, 0x90, 0xff], [0x29, 0xff, 0xff, 0xff], [0x00, 0x00, 0x00, 0x00], [0x4e, 0xaa, 0x90, 0xff], [0x73, 0x55, 0x21, 0xff], [0x00, 0x00, 0x00, 0x00], [0x00, 0x00, 0x00, 0x00], [0x4e, 0xaa, 0x90, 0xff], [0x4e, 0xaa, 0x90, 0xff], [0x00, 0x00, 0x00, 0x00], [0x00, 0x00, 0x00, 0x00], [0x4e, 0xaa, 0x90, 0xff], ], [0xff, 0x2f, 0xa4, 0x72, 0xeb, 0xb2, 0xbd, 0xbe], ), ( [ [0xb5, 0xe3, 0x63, 0xff], [0x00, 0x00, 0x00, 0x00], [0x6b, 0x24, 0x84, 0xff], [0xb5, 0xe3, 0x63, 0xff], [0x00, 0x00, 0x00, 0x00], [0xb5, 0xe3, 0x63, 0xff], [0x00, 0x00, 0x00, 0x00], [0x00, 0x00, 0x00, 0x00], [0x00, 0x00, 0x00, 0x00], [0x00, 0x00, 0x00, 0x00], [0x6b, 0x24, 0x84, 0xff], [0x6b, 0x24, 0x84, 0xff], [0x00, 0x00, 0x00, 0x00], [0xb5, 0xe3, 0x63, 0xff], [0x90, 0x83, 0x73, 0xff], [0xb5, 0xe3, 0x63, 0xff], ], [0x30, 0x69, 0x0c, 0xb7, 0x4d, 0xf7, 0x0f, 0x67], ), ( [ [0x00, 0x00, 0x00, 0x00], [0xc6, 0x86, 0x8c, 0xff], [0xc6, 0x86, 0x8c, 0xff], [0x21, 0x65, 0x42, 0xff], [0x21, 0x65, 0x42, 0xff], [0x21, 0x65, 0x42, 0xff], [0x21, 0x65, 0x42, 0xff], [0x00, 0x00, 0x00, 0x00], [0x00, 0x00, 0x00, 0x00], [0x21, 0x65, 0x42, 0xff], [0xc6, 0x86, 0x8c, 0xff], [0x00, 0x00, 0x00, 0x00], [0x00, 0x00, 0x00, 0x00], [0x00, 0x00, 0x00, 0x00], [0x00, 0x00, 0x00, 0x00], [0xc6, 0x86, 0x8c, 0xff], ], [0x28, 0x23, 0x31, 0xc4, 0x17, 0xc0, 0xd3, 0x7f], ), ( [ [0x00, 0x00, 0x00, 0x00], [0x00, 0x00, 0x00, 0x00], [0x00, 0x00, 0x00, 0x00], [0xc6, 0xe3, 0x9c, 0xff], [0x7b, 0x1c, 0x52, 0xff], [0x00, 0x00, 0x00, 0x00], [0x00, 0x00, 0x00, 0x00], [0x00, 0x00, 0x00, 0x00], [0x00, 0x00, 0x00, 0x00], [0x7b, 0x1c, 0x52, 0xff], [0x00, 0x00, 0x00, 0x00], [0x7b, 0x1c, 0x52, 0xff], [0xa0, 0x7f, 0x77, 0xff], [0xc6, 0xe3, 0x9c, 0xff], [0x00, 0x00, 0x00, 0x00], [0xa0, 0x7f, 0x77, 0xff], ], [0xea, 0x78, 0x13, 0xc7, 0x7f, 0xfc, 0x33, 0xb6], ), ] def generate_data_compressed(surface, blocks): stride = surface.nblocksx*surface.block.size size = surface.nblocksy*stride raw = ByteArray(size) rgba = FloatArray(surface.height*surface.width*4) for yj in range(0, surface.nblocksy): for xj in range(0, surface.nblocksx): pixels, block = blocks[random.randint(0, len(blocks) - 1)] offset = (yj*surface.nblocksx + xj)*surface.block.size for i in range(0, surface.block.size): raw[offset + i] = block[i] for yi in range(0, surface.block.height): for xi in range(0, surface.block.width): y = yj*surface.block.height + yi x = xj*surface.block.width + xi if y < surface.height and x < surface.width: offset = (y*surface.width + x)*4 pixel = pixels[yi*surface.block.width + xi] for ch in range(0, 4): rgba[offset + ch] = float(pixel[ch])/255.0 surface.put_tile_raw(0, 0, surface.width, surface.height, raw, stride) return rgba def generate_data_simple(surface): stride = surface.nblocksx*surface.block.size size = surface.nblocksy*stride raw = ByteArray(size) rgba = FloatArray(surface.height*surface.width*4) for i in range(0, size): raw[i] = random.randint(0, 255) surface.put_tile_raw(0, 0, surface.width, surface.height, raw, stride) surface.get_tile_rgba(0, 0, surface.width, surface.height, rgba) if surface.format in (PIPE_FORMAT_YCBCR, PIPE_FORMAT_YCBCR_REV): # normalize for y in range(0, surface.height): for x in range(0, surface.width): for ch in range(4): offset = (y*surface.width + x)*4 + ch rgba[offset] = min(max(rgba[offset], 0.0), 1.0) return rgba def generate_data(surface): width = surface.width height = surface.height if surface.format == PIPE_FORMAT_DXT1_RGB: return generate_data_compressed(surface, dxt1_rgb_data) if surface.format == PIPE_FORMAT_DXT1_RGBA: return generate_data_compressed(surface, dxt1_rgba_data) if surface.format == PIPE_FORMAT_DXT3_RGBA: assert 0 if surface.format == PIPE_FORMAT_DXT5_RGBA: assert 0 return generate_data_simple(surface)