From 33ce51bc0d52dcfbfa481211dd1fe73a5ecb948f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Fri, 21 Aug 2009 07:34:15 +0100 Subject: [PATCH] llvmpipe: Several fixes of the conversion test. --- src/gallium/drivers/llvmpipe/lp_bld_const.c | 22 +++++++++ src/gallium/drivers/llvmpipe/lp_bld_const.h | 4 ++ src/gallium/drivers/llvmpipe/lp_test_conv.c | 10 ++-- src/gallium/drivers/llvmpipe/lp_test_main.c | 53 +++++++++------------ 4 files changed, 55 insertions(+), 34 deletions(-) diff --git a/src/gallium/drivers/llvmpipe/lp_bld_const.c b/src/gallium/drivers/llvmpipe/lp_bld_const.c index 20f0d3c40bb..991cf24a9ea 100644 --- a/src/gallium/drivers/llvmpipe/lp_bld_const.c +++ b/src/gallium/drivers/llvmpipe/lp_bld_const.c @@ -33,6 +33,7 @@ * @author Jose Fonseca */ +#include #include "util/u_debug.h" @@ -92,6 +93,27 @@ lp_const_scale(union lp_type type) } +double +lp_const_eps(union lp_type type) +{ + if (type.floating) { + switch(type.width) { + case 32: + return FLT_EPSILON; + case 64: + return DBL_EPSILON; + default: + assert(0); + return 0.0; + } + } + else { + double scale = lp_const_scale(type); + return 1.0/scale; + } +} + + LLVMValueRef lp_build_undef(union lp_type type) { diff --git a/src/gallium/drivers/llvmpipe/lp_bld_const.h b/src/gallium/drivers/llvmpipe/lp_bld_const.h index 854b729ee6f..fb0e70ad197 100644 --- a/src/gallium/drivers/llvmpipe/lp_bld_const.h +++ b/src/gallium/drivers/llvmpipe/lp_bld_const.h @@ -57,6 +57,10 @@ double lp_const_scale(union lp_type type); +double +lp_const_eps(union lp_type type); + + LLVMValueRef lp_build_undef(union lp_type type); diff --git a/src/gallium/drivers/llvmpipe/lp_test_conv.c b/src/gallium/drivers/llvmpipe/lp_test_conv.c index 91815509b79..e8b0b56d96c 100644 --- a/src/gallium/drivers/llvmpipe/lp_test_conv.c +++ b/src/gallium/drivers/llvmpipe/lp_test_conv.c @@ -35,6 +35,7 @@ #include "lp_bld_type.h" +#include "lp_bld_const.h" #include "lp_bld_conv.h" #include "lp_bld_debug.h" #include "lp_test.h" @@ -160,6 +161,7 @@ test_one(unsigned verbose, double cycles_avg = 0.0; unsigned num_srcs; unsigned num_dsts; + double eps; unsigned i, j; if(verbose >= 1) @@ -179,6 +181,8 @@ test_one(unsigned verbose, /* We must not loose or gain channels. Only precision */ assert(src_type.length * num_srcs == dst_type.length * num_dsts); + eps = MAX2(lp_const_eps(src_type), lp_const_eps(dst_type)); + module = LLVMModuleCreateWithName("test"); func = add_conv_test(module, src_type, num_srcs, dst_type, num_dsts); @@ -248,7 +252,7 @@ test_one(unsigned verbose, cycles[i] = end_counter - start_counter; for(j = 0; j < num_dsts; ++j) { - if(!compare_vec(dst_type, dst + j*dst_stride, ref + j*dst_stride)) + if(!compare_vec_with_eps(dst_type, dst + j*dst_stride, ref + j*dst_stride, eps)) success = FALSE; } @@ -263,8 +267,8 @@ test_one(unsigned verbose, fprintf(stderr, "\n"); } -#if 0 - fprintf(stderr, " Ref: ", j); +#if 1 + fprintf(stderr, " Ref: "); for(j = 0; j < src_type.length*num_srcs; ++j) fprintf(stderr, " %f", fref[j]); fprintf(stderr, "\n"); diff --git a/src/gallium/drivers/llvmpipe/lp_test_main.c b/src/gallium/drivers/llvmpipe/lp_test_main.c index 32ed0f6da3f..49213fb4f0b 100644 --- a/src/gallium/drivers/llvmpipe/lp_test_main.c +++ b/src/gallium/drivers/llvmpipe/lp_test_main.c @@ -120,6 +120,8 @@ write_elem(union lp_type type, void *dst, unsigned index, double value) assert(index < type.length); if(!type.sign && value < 0.0) value = 0.0; + if(type.norm && value < -1.0) + value = -1.0; if(type.norm && value > 1.0) value = 1.0; if (type.floating) { @@ -136,9 +138,10 @@ write_elem(union lp_type type, void *dst, unsigned index, double value) } else { double scale = lp_const_scale(type); - long long lvalue = (long long)round(value*scale); + value = round(value*scale); if(type.sign) { - lvalue = MIN2(lvalue, (1 << (type.width - 1)) - 1); + long long lvalue = (long long)value; + lvalue = MIN2(lvalue, ((long long)1 << (type.width - 1)) - 1); switch(type.width) { case 8: *((int8_t *)dst + index) = (int8_t)lvalue; @@ -150,14 +153,15 @@ write_elem(union lp_type type, void *dst, unsigned index, double value) *((int32_t *)dst + index) = (int32_t)lvalue; break; case 64: - *((int64_t *)dst + index) = (int32_t)lvalue; + *((int64_t *)dst + index) = (int64_t)lvalue; break; default: assert(0); } } else { - lvalue = MIN2(lvalue, (1 << type.width) - 1); + unsigned long long lvalue = (long long)value; + lvalue = MIN2(lvalue, ((unsigned long long)1 << type.width) - 1); switch(type.width) { case 8: *((uint8_t *)dst + index) = (uint8_t)lvalue; @@ -239,30 +243,9 @@ random_vec(union lp_type type, void *dst) boolean -compare_vec(union lp_type type, const void *res, const void *ref) +compare_vec_with_eps(union lp_type type, const void *res, const void *ref, double eps) { - double eps; unsigned i; - - if (type.floating) { - switch(type.width) { - case 32: - eps = FLT_EPSILON; - break; - case 64: - eps = DBL_EPSILON; - break; - default: - assert(0); - eps = 0.0; - break; - } - } - else { - double scale = lp_const_scale(type); - eps = 1.0/scale; - } - for (i = 0; i < type.length; ++i) { double res_elem = read_elem(type, res, i); double ref_elem = read_elem(type, ref, i); @@ -275,6 +258,14 @@ compare_vec(union lp_type type, const void *res, const void *ref) } +boolean +compare_vec(union lp_type type, const void *res, const void *ref) +{ + double eps = lp_const_eps(type); + return compare_vec_with_eps(type, res, ref, eps); +} + + void dump_vec(FILE *fp, union lp_type type, const void *src) { @@ -298,7 +289,7 @@ dump_vec(FILE *fp, union lp_type type, const void *src) fprintf(fp, "%f", value); } else { - if(type.sign) { + if(type.sign && !type.norm) { long long value; const char *format; switch(type.width) { @@ -331,19 +322,19 @@ dump_vec(FILE *fp, union lp_type type, const void *src) switch(type.width) { case 8: value = *((const uint8_t *)src + i); - format = "%4llu"; + format = type.norm ? "%2x" : "%4llu"; break; case 16: value = *((const uint16_t *)src + i); - format = "%6llu"; + format = type.norm ? "%4x" : "%6llx"; break; case 32: value = *((const uint32_t *)src + i); - format = "%11llu"; + format = type.norm ? "%8x" : "%11llx"; break; case 64: value = *((const uint64_t *)src + i); - format = "%21llu"; + format = type.norm ? "%16x" : "%21llx"; break; default: assert(0); -- 2.30.2