1945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri/************************************************************************** 2945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * 3945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * Copyright © 2010 Luca Barbieri 4945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * 5945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * Permission is hereby granted, free of charge, to any person obtaining a 6945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * copy of this software and associated documentation files (the "Software"), 7945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * to deal in the Software without restriction, including without limitation 8945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * and/or sell copies of the Software, and to permit persons to whom the 10945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * Software is furnished to do so, subject to the following conditions: 11945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * 12945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * The above copyright notice and this permission notice (including the next 13945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * paragraph) shall be included in all copies or substantial portions of the 14945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * Software. 15945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * 16945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * DEALINGS IN THE SOFTWARE. 23945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri * 24945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri **************************************************************************/ 25945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri 26945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri#include <stdio.h> 27066875f340dd6160b60cc7d205faf3a496581220Kai Wasserbäch#include "translate/translate.h" 28066875f340dd6160b60cc7d205faf3a496581220Kai Wasserbäch#include "util/u_memory.h" 29066875f340dd6160b60cc7d205faf3a496581220Kai Wasserbäch#include "util/u_format.h" 303a62e8bcac75ca296619adb7fe4ea806a98beef9Brian Paul#include "util/u_half.h" 31066875f340dd6160b60cc7d205faf3a496581220Kai Wasserbäch#include "util/u_cpu_detect.h" 32066875f340dd6160b60cc7d205faf3a496581220Kai Wasserbäch#include "rtasm/rtasm_cpu.h" 33945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri 34b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri/* don't use this for serious use */ 35b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieristatic double rand_double() 36b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri{ 37b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri const double rm = (double)RAND_MAX + 1; 38b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri double div = 1; 39b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri double v = 0; 4026c042c30aa3a2ec7eaf1a2b766bc4fd2bfcdb84Vinson Lee unsigned i; 4126c042c30aa3a2ec7eaf1a2b766bc4fd2bfcdb84Vinson Lee for(i = 0; i < 4; ++i) 42b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri { 43b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri div *= rm; 44b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri v += (double)rand() / div; 45b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri } 46b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri return v; 47b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri} 48b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri 49945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieriint main(int argc, char** argv) 50945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri{ 5199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri struct translate *(*create_fn)(const struct translate_key *key) = 0; 5299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 5399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri struct translate_key key; 5499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri unsigned output_format; 5599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri unsigned input_format; 564d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri unsigned buffer_size = 4096; 5799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri unsigned char* buffer[5]; 584d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri unsigned char* byte_buffer; 594d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri float* float_buffer; 604d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri double* double_buffer; 613a62e8bcac75ca296619adb7fe4ea806a98beef9Brian Paul uint16_t *half_buffer; 626586a3b287ad2799addd392d92c56c7f83e22e8fJosé Fonseca unsigned * elts; 6399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri unsigned count = 4; 6499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri unsigned i, j, k; 6599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri unsigned passed = 0; 6699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri unsigned total = 0; 6799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri const float error = 0.03125; 6899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 6999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri create_fn = 0; 7099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 7199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri util_cpu_detect(); 7299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 7399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri if(argc <= 1) 7499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri {} 7599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri else if (!strcmp(argv[1], "generic")) 7699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri create_fn = translate_generic_create; 7799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri else if (!strcmp(argv[1], "x86")) 7899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri create_fn = translate_sse2_create; 7999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri else if (!strcmp(argv[1], "nosse")) 8099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 8199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri util_cpu_caps.has_sse = 0; 8299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri util_cpu_caps.has_sse2 = 0; 8399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri util_cpu_caps.has_sse3 = 0; 8499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri util_cpu_caps.has_sse4_1 = 0; 8599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri create_fn = translate_sse2_create; 8699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 8799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri else if (!strcmp(argv[1], "sse")) 8899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 8999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri if(!util_cpu_caps.has_sse || !rtasm_cpu_has_sse()) 9099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 9199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri printf("Error: CPU doesn't support SSE (test with qemu)\n"); 9299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri return 2; 9399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 9499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri util_cpu_caps.has_sse2 = 0; 9599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri util_cpu_caps.has_sse3 = 0; 9699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri util_cpu_caps.has_sse4_1 = 0; 9799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri create_fn = translate_sse2_create; 9899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 9999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri else if (!strcmp(argv[1], "sse2")) 10099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 10199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri if(!util_cpu_caps.has_sse2 || !rtasm_cpu_has_sse()) 10299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 10399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri printf("Error: CPU doesn't support SSE2 (test with qemu)\n"); 10499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri return 2; 10599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 10699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri util_cpu_caps.has_sse3 = 0; 10799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri util_cpu_caps.has_sse4_1 = 0; 10899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri create_fn = translate_sse2_create; 10999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 11099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri else if (!strcmp(argv[1], "sse3")) 11199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 11299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri if(!util_cpu_caps.has_sse3 || !rtasm_cpu_has_sse()) 11399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 11499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri printf("Error: CPU doesn't support SSE3 (test with qemu)\n"); 11599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri return 2; 11699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 11799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri util_cpu_caps.has_sse4_1 = 0; 11899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri create_fn = translate_sse2_create; 11999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 12099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri else if (!strcmp(argv[1], "sse4.1")) 12199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 12299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri if(!util_cpu_caps.has_sse4_1 || !rtasm_cpu_has_sse()) 12399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 12499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri printf("Error: CPU doesn't support SSE4.1 (test with qemu)\n"); 12599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri return 2; 12699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 12799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri create_fn = translate_sse2_create; 12899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 12999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 13099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri if (!create_fn) 13199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 13299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri printf("Usage: ./translate_test [generic|x86|nosse|sse|sse2|sse3|sse4.1]\n"); 13399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri return 2; 13499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 13599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 1364d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri for (i = 1; i < Elements(buffer); ++i) 1374d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri buffer[i] = align_malloc(buffer_size, 4096); 1384d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri 1394d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri byte_buffer = align_malloc(buffer_size, 4096); 1404d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri float_buffer = align_malloc(buffer_size, 4096); 1414d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri double_buffer = align_malloc(buffer_size, 4096); 1423a62e8bcac75ca296619adb7fe4ea806a98beef9Brian Paul half_buffer = align_malloc(buffer_size, 4096); 14399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 1446586a3b287ad2799addd392d92c56c7f83e22e8fJosé Fonseca elts = align_malloc(count * sizeof *elts, 4096); 1456586a3b287ad2799addd392d92c56c7f83e22e8fJosé Fonseca 14699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri key.nr_elements = 1; 14799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri key.element[0].input_buffer = 0; 14899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri key.element[0].input_offset = 0; 14999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri key.element[0].output_offset = 0; 15099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri key.element[0].type = TRANSLATE_ELEMENT_NORMAL; 15199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri key.element[0].instance_divisor = 0; 15299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 153b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri srand(4359025); 1544d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri 1554d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri /* avoid negative values that work badly when converted to unsigned format*/ 156b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri for (i = 0; i < buffer_size; ++i) 157b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri byte_buffer[i] = rand() & 0x7f7f7f7f; 1584d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri 1594d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri for (i = 0; i < buffer_size / sizeof(float); ++i) 160b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri float_buffer[i] = (float)rand_double(); 1614d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri 1624d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri for (i = 0; i < buffer_size / sizeof(double); ++i) 163b9abe7f62c09c0395214b9447032323b3846b2cfLuca Barbieri double_buffer[i] = rand_double(); 16499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 1653a62e8bcac75ca296619adb7fe4ea806a98beef9Brian Paul for (i = 0; i < buffer_size / sizeof(double); ++i) 1663a62e8bcac75ca296619adb7fe4ea806a98beef9Brian Paul half_buffer[i] = util_float_to_half((float) rand_double()); 1673a62e8bcac75ca296619adb7fe4ea806a98beef9Brian Paul 1686586a3b287ad2799addd392d92c56c7f83e22e8fJosé Fonseca for (i = 0; i < count; ++i) 1696586a3b287ad2799addd392d92c56c7f83e22e8fJosé Fonseca elts[i] = i; 1706586a3b287ad2799addd392d92c56c7f83e22e8fJosé Fonseca 17199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri for (output_format = 1; output_format < PIPE_FORMAT_COUNT; ++output_format) 17299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 17399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri const struct util_format_description* output_format_desc = util_format_description(output_format); 17439cd4f7ceb09dc3050f93d1fb326faf24c11150eLuca Barbieri unsigned output_format_size; 1754d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri unsigned output_normalized = 0; 1764d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri 17799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri if (!output_format_desc 17899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri || !output_format_desc->fetch_rgba_float 17999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri || !output_format_desc->pack_rgba_float 18099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri || output_format_desc->colorspace != UTIL_FORMAT_COLORSPACE_RGB 18199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri || output_format_desc->layout != UTIL_FORMAT_LAYOUT_PLAIN 18299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri || !translate_is_output_format_supported(output_format)) 18399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri continue; 18499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 1854d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri for(i = 0; i < output_format_desc->nr_channels; ++i) 1864d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri { 1874d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri if(output_format_desc->channel[i].type != UTIL_FORMAT_TYPE_FLOAT) 1884d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri output_normalized |= (1 << output_format_desc->channel[i].normalized); 1894d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri } 1904d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri 19139cd4f7ceb09dc3050f93d1fb326faf24c11150eLuca Barbieri output_format_size = util_format_get_stride(output_format, 1); 19239cd4f7ceb09dc3050f93d1fb326faf24c11150eLuca Barbieri 19399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri for (input_format = 1; input_format < PIPE_FORMAT_COUNT; ++input_format) 19499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 19599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri const struct util_format_description* input_format_desc = util_format_description(input_format); 19639cd4f7ceb09dc3050f93d1fb326faf24c11150eLuca Barbieri unsigned input_format_size; 19799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri struct translate* translate[2]; 19899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri unsigned fail = 0; 19999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri unsigned used_generic = 0; 2004d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri unsigned input_normalized = 0; 2014d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri boolean input_is_float = FALSE; 20299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 20399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri if (!input_format_desc 20499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri || !input_format_desc->fetch_rgba_float 20599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri || !input_format_desc->pack_rgba_float 20699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri || input_format_desc->colorspace != UTIL_FORMAT_COLORSPACE_RGB 20799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri || input_format_desc->layout != UTIL_FORMAT_LAYOUT_PLAIN 20899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri || !translate_is_output_format_supported(input_format)) 20999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri continue; 21099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 21139cd4f7ceb09dc3050f93d1fb326faf24c11150eLuca Barbieri input_format_size = util_format_get_stride(input_format, 1); 21239cd4f7ceb09dc3050f93d1fb326faf24c11150eLuca Barbieri 2134d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri for(i = 0; i < input_format_desc->nr_channels; ++i) 2144d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri { 2154d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri if(input_format_desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT) 2164d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri { 2174d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri input_is_float = 1; 2184d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri input_normalized |= 1 << 1; 2194d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri } 2204d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri else 2214d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri input_normalized |= (1 << input_format_desc->channel[i].normalized); 2224d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri } 2234d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri 2244d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri if(((input_normalized | output_normalized) == 3) 2254d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri || ((input_normalized & 1) && (output_normalized & 1) 2264d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri && input_format_size * output_format_desc->nr_channels > output_format_size * input_format_desc->nr_channels)) 2274d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri continue; 2284d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri 22999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri key.element[0].input_format = input_format; 23099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri key.element[0].output_format = output_format; 23199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri key.output_stride = output_format_size; 23299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri translate[0] = create_fn(&key); 23399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri if (!translate[0]) 23499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri continue; 23599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 23699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri key.element[0].input_format = output_format; 23799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri key.element[0].output_format = input_format; 23899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri key.output_stride = input_format_size; 23999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri translate[1] = create_fn(&key); 24099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri if(!translate[1]) 24199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 24299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri used_generic = 1; 24399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri translate[1] = translate_generic_create(&key); 24499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri if(!translate[1]) 24599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri continue; 24699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 24799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 2484d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri for(i = 1; i < 5; ++i) 2494d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri memset(buffer[i], 0xcd - (0x22 * i), 4096); 2504d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri 2514d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri if(input_is_float && input_format_desc->channel[0].size == 32) 2524d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri buffer[0] = (unsigned char*)float_buffer; 2534d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri else if(input_is_float && input_format_desc->channel[0].size == 64) 2544d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri buffer[0] = (unsigned char*)double_buffer; 2553a62e8bcac75ca296619adb7fe4ea806a98beef9Brian Paul else if(input_is_float && input_format_desc->channel[0].size == 16) 2563a62e8bcac75ca296619adb7fe4ea806a98beef9Brian Paul buffer[0] = (unsigned char*)half_buffer; 2574d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri else if(input_is_float) 2584d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri abort(); 2594d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri else 2604d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri buffer[0] = byte_buffer; 2614d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri 2626586a3b287ad2799addd392d92c56c7f83e22e8fJosé Fonseca translate[0]->set_buffer(translate[0], 0, buffer[0], input_format_size, count - 1); 2636586a3b287ad2799addd392d92c56c7f83e22e8fJosé Fonseca translate[0]->run_elts(translate[0], elts, count, 0, buffer[1]); 2646586a3b287ad2799addd392d92c56c7f83e22e8fJosé Fonseca translate[1]->set_buffer(translate[1], 0, buffer[1], output_format_size, count - 1); 2656586a3b287ad2799addd392d92c56c7f83e22e8fJosé Fonseca translate[1]->run_elts(translate[1], elts, count, 0, buffer[2]); 2666586a3b287ad2799addd392d92c56c7f83e22e8fJosé Fonseca translate[0]->set_buffer(translate[0], 0, buffer[2], input_format_size, count - 1); 2676586a3b287ad2799addd392d92c56c7f83e22e8fJosé Fonseca translate[0]->run_elts(translate[0], elts, count, 0, buffer[3]); 2686586a3b287ad2799addd392d92c56c7f83e22e8fJosé Fonseca translate[1]->set_buffer(translate[1], 0, buffer[3], output_format_size, count - 1); 2696586a3b287ad2799addd392d92c56c7f83e22e8fJosé Fonseca translate[1]->run_elts(translate[1], elts, count, 0, buffer[4]); 27099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 27199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri for (i = 0; i < count; ++i) 27299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 27399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri float a[4]; 27499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri float b[4]; 27599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri input_format_desc->fetch_rgba_float(a, buffer[2] + i * input_format_size, 0, 0); 27699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri input_format_desc->fetch_rgba_float(b, buffer[4] + i * input_format_size, 0, 0); 27799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 27899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri for (j = 0; j < count; ++j) 27999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 28099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri float d = a[j] - b[j]; 28199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri if (d > error || d < -error) 28299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 28399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri fail = 1; 28499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri break; 28599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 28699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 28799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 28899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 28999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri printf("%s%s: %s -> %s -> %s -> %s -> %s\n", 29099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri fail ? "FAIL" : "PASS", 29199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri used_generic ? "[GENERIC]" : "", 29299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri input_format_desc->name, output_format_desc->name, input_format_desc->name, output_format_desc->name, input_format_desc->name); 29399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 2944d946c4e8adf3f0ac447b6a9a6caf17392b816cdLuca Barbieri if (1) 29599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 29699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri for (i = 0; i < Elements(buffer); ++i) 29799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 29899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri unsigned format_size = (i & 1) ? output_format_size : input_format_size; 29999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri printf("%c ", (i == 2 || i == 4) ? '*' : ' '); 30099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri for (j = 0; j < count; ++j) 30199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 30299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri for (k = 0; k < format_size; ++k) 30399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri { 30499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri printf("%02x", buffer[i][j * format_size + k]); 30599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 30699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri printf(" "); 30799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 30899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri printf("\n"); 30999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 31099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 31199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 31299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri if (!fail) 31399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri ++passed; 31499cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri ++total; 31599cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 31699cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri if(translate[1]) 31799cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri translate[1]->release(translate[1]); 31899cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri translate[0]->release(translate[0]); 31999cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 32099cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri } 32199cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri 32299cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri printf("%u/%u tests passed for translate_%s\n", passed, total, argv[1]); 32399cc6d70a4dc87c67f3eec9b118a853947718373Luca Barbieri return passed != total; 324945e38c73b46afc12b0655f9fc8200f216a8f8c1Luca Barbieri} 325