| @@ -0,0 +1,199 @@ | |||
| #!/usr/bin/env python | |||
| ########################################################################## | |||
| # | |||
| # Copyright 2009 VMware, Inc. | |||
| # 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 VMWARE 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. | |||
| # | |||
| ########################################################################## | |||
| from gallium import * | |||
| from base import * | |||
| def lods(*dims): | |||
| size = max(dims) | |||
| lods = 0 | |||
| while size: | |||
| lods += 1 | |||
| size >>= 1 | |||
| return lods | |||
| class TextureTest(TestCase): | |||
| tags = ( | |||
| 'target', | |||
| 'format', | |||
| 'width', | |||
| 'height', | |||
| 'depth', | |||
| 'last_level', | |||
| 'face', | |||
| 'level', | |||
| 'zslice', | |||
| ) | |||
| def test(self): | |||
| dev = self.dev | |||
| target = self.target | |||
| format = self.format | |||
| width = self.width | |||
| height = self.height | |||
| depth = self.depth | |||
| last_level = self.last_level | |||
| face = self.face | |||
| level = self.level | |||
| zslice = self.zslice | |||
| # textures | |||
| dst_texture = dev.texture_create( | |||
| target = target, | |||
| format = format, | |||
| width = width, | |||
| height = height, | |||
| depth = depth, | |||
| last_level = last_level, | |||
| tex_usage = PIPE_TEXTURE_USAGE_RENDER_TARGET, | |||
| ) | |||
| if dst_texture is None: | |||
| raise TestSkip | |||
| dst_surface = dst_texture.get_surface(face = face, level = level, zslice = zslice) | |||
| src_texture = dev.texture_create( | |||
| target = target, | |||
| format = format, | |||
| width = dst_surface.width, | |||
| height = dst_surface.height, | |||
| depth = 1, | |||
| last_level = 0, | |||
| tex_usage = PIPE_TEXTURE_USAGE_SAMPLER, | |||
| ) | |||
| src_surface = src_texture.get_surface() | |||
| x = 0 | |||
| y = 0 | |||
| w = dst_surface.width | |||
| h = dst_surface.height | |||
| stride = dst_surface.nblocksx * dst_texture.block.size | |||
| size = dst_surface.nblocksy * stride | |||
| src_raw = os.urandom(size) | |||
| src_surface.put_tile_raw(0, 0, w, h, src_raw, stride) | |||
| ctx = self.dev.context_create() | |||
| ctx.surface_copy(dst_surface, 0, 0, | |||
| src_surface, 0, 0, w, h) | |||
| ctx.flush() | |||
| dst_raw = dst_surface.get_tile_raw(0, 0, w, h) | |||
| if dst_raw != src_raw: | |||
| raise TestFailure | |||
| def main(): | |||
| dev = Device() | |||
| suite = TestSuite() | |||
| targets = [ | |||
| PIPE_TEXTURE_2D, | |||
| PIPE_TEXTURE_CUBE, | |||
| #PIPE_TEXTURE_3D, | |||
| ] | |||
| formats = [ | |||
| PIPE_FORMAT_A8R8G8B8_UNORM, | |||
| PIPE_FORMAT_X8R8G8B8_UNORM, | |||
| PIPE_FORMAT_A8R8G8B8_SRGB, | |||
| PIPE_FORMAT_R5G6B5_UNORM, | |||
| PIPE_FORMAT_A1R5G5B5_UNORM, | |||
| PIPE_FORMAT_A4R4G4B4_UNORM, | |||
| PIPE_FORMAT_Z32_UNORM, | |||
| PIPE_FORMAT_Z24S8_UNORM, | |||
| PIPE_FORMAT_Z24X8_UNORM, | |||
| PIPE_FORMAT_Z16_UNORM, | |||
| PIPE_FORMAT_S8_UNORM, | |||
| PIPE_FORMAT_A8_UNORM, | |||
| PIPE_FORMAT_L8_UNORM, | |||
| PIPE_FORMAT_DXT1_RGB, | |||
| PIPE_FORMAT_DXT1_RGBA, | |||
| PIPE_FORMAT_DXT3_RGBA, | |||
| PIPE_FORMAT_DXT5_RGBA, | |||
| ] | |||
| sizes = [64, 32, 16, 8, 4, 2, 1] | |||
| #sizes = [1020, 508, 252, 62, 30, 14, 6, 3] | |||
| #sizes = [64] | |||
| #sizes = [63] | |||
| faces = [ | |||
| PIPE_TEX_FACE_POS_X, | |||
| PIPE_TEX_FACE_NEG_X, | |||
| PIPE_TEX_FACE_POS_Y, | |||
| PIPE_TEX_FACE_NEG_Y, | |||
| PIPE_TEX_FACE_POS_Z, | |||
| PIPE_TEX_FACE_NEG_Z, | |||
| ] | |||
| for target in targets: | |||
| for format in formats: | |||
| for size in sizes: | |||
| if target == PIPE_TEXTURE_3D: | |||
| depth = size | |||
| else: | |||
| depth = 1 | |||
| for face in faces: | |||
| if target != PIPE_TEXTURE_CUBE and face: | |||
| continue | |||
| levels = lods(size) | |||
| for last_level in range(levels): | |||
| for level in range(0, last_level + 1): | |||
| zslice = 0 | |||
| while zslice < depth >> level: | |||
| test = TextureTest( | |||
| dev = dev, | |||
| target = target, | |||
| format = format, | |||
| width = size, | |||
| height = size, | |||
| depth = depth, | |||
| last_level = last_level, | |||
| face = face, | |||
| level = level, | |||
| zslice = zslice, | |||
| ) | |||
| suite.add_test(test) | |||
| zslice = (zslice + 1)*2 - 1 | |||
| suite.run() | |||
| if __name__ == '__main__': | |||
| main() | |||