From dcc5d7f67220bc93aa7a351658649877c7e4cf69 Mon Sep 17 00:00:00 2001 From: José Fonseca Date: Thu, 9 Sep 2010 12:09:44 +0100 Subject: gallivm: Add a new debug flag to warn about performance issues. --- src/gallium/auxiliary/gallivm/lp_bld_arit.c | 17 +++++++++++++---- src/gallium/auxiliary/gallivm/lp_bld_debug.h | 1 + src/gallium/auxiliary/gallivm/lp_bld_format_aos.c | 14 ++++++++++++++ src/gallium/auxiliary/gallivm/lp_bld_format_soa.c | 6 ++++++ src/gallium/auxiliary/gallivm/lp_bld_init.c | 1 + src/gallium/auxiliary/gallivm/lp_bld_logic.c | 7 +++++-- src/gallium/auxiliary/gallivm/lp_bld_pack.c | 2 -- src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c | 10 ++++++++++ 8 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_arit.c b/src/gallium/auxiliary/gallivm/lp_bld_arit.c index e0d30be98d..dce3c3745b 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_arit.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_arit.c @@ -56,6 +56,7 @@ #include "lp_bld_intr.h" #include "lp_bld_logic.h" #include "lp_bld_pack.h" +#include "lp_bld_debug.h" #include "lp_bld_arit.h" @@ -1850,9 +1851,11 @@ lp_build_pow(struct lp_build_context *bld, LLVMValueRef y) { /* TODO: optimize the constant case */ - if(LLVMIsConstant(x) && LLVMIsConstant(y)) + if (gallivm_debug & GALLIVM_DEBUG_PERF && + LLVMIsConstant(x) && LLVMIsConstant(y)) { debug_printf("%s: inefficient/imprecise constant arithmetic\n", __FUNCTION__); + } return lp_build_exp2(bld, lp_build_mul(bld, lp_build_log2(bld, x), y)); } @@ -1907,9 +1910,11 @@ lp_build_polynomial(struct lp_build_context *bld, assert(lp_check_value(bld->type, x)); /* TODO: optimize the constant case */ - if(LLVMIsConstant(x)) + if (gallivm_debug & GALLIVM_DEBUG_PERF && + LLVMIsConstant(x)) { debug_printf("%s: inefficient/imprecise constant arithmetic\n", __FUNCTION__); + } for (i = num_coeffs; i--; ) { LLVMValueRef coeff; @@ -1981,9 +1986,11 @@ lp_build_exp2_approx(struct lp_build_context *bld, if(p_exp2_int_part || p_frac_part || p_exp2) { /* TODO: optimize the constant case */ - if(LLVMIsConstant(x)) + if (gallivm_debug & GALLIVM_DEBUG_PERF && + LLVMIsConstant(x)) { debug_printf("%s: inefficient/imprecise constant arithmetic\n", __FUNCTION__); + } assert(type.floating && type.width == 32); @@ -2096,9 +2103,11 @@ lp_build_log2_approx(struct lp_build_context *bld, if(p_exp || p_floor_log2 || p_log2) { /* TODO: optimize the constant case */ - if(LLVMIsConstant(x)) + if (gallivm_debug & GALLIVM_DEBUG_PERF && + LLVMIsConstant(x)) { debug_printf("%s: inefficient/imprecise constant arithmetic\n", __FUNCTION__); + } assert(type.floating && type.width == 32); diff --git a/src/gallium/auxiliary/gallivm/lp_bld_debug.h b/src/gallium/auxiliary/gallivm/lp_bld_debug.h index 858002b34f..369c1bbf09 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_debug.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_debug.h @@ -40,6 +40,7 @@ #define GALLIVM_DEBUG_IR 0x2 #define GALLIVM_DEBUG_ASM 0x4 #define GALLIVM_DEBUG_NO_OPT 0x8 +#define GALLIVM_DEBUG_PERF 0x10 #ifdef DEBUG diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_aos.c b/src/gallium/auxiliary/gallivm/lp_bld_format_aos.c index 92123e09d3..6b9189e1da 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_format_aos.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_format_aos.c @@ -46,6 +46,7 @@ #include "lp_bld_conv.h" #include "lp_bld_swizzle.h" #include "lp_bld_gather.h" +#include "lp_bld_debug.h" #include "lp_bld_format.h" @@ -449,6 +450,11 @@ lp_build_fetch_rgba_aos(LLVMBuilderRef builder, * integer conversions. */ + if (gallivm_debug & GALLIVM_DEBUG_PERF && !type.floating) { + debug_printf("%s: unpacking %s with floating point\n", + __FUNCTION__, format_desc->short_name); + } + lp_build_conv(builder, lp_float32_vec4_type(), type, @@ -513,6 +519,10 @@ lp_build_fetch_rgba_aos(LLVMBuilderRef builder, util_snprintf(name, sizeof name, "util_format_%s_fetch_rgba_8unorm", format_desc->short_name); + if (gallivm_debug & GALLIVM_DEBUG_PERF) { + debug_printf("%s: falling back to %s\n", __FUNCTION__, name); + } + /* * Declare and bind format_desc->fetch_rgba_8unorm(). */ @@ -612,6 +622,10 @@ lp_build_fetch_rgba_aos(LLVMBuilderRef builder, util_snprintf(name, sizeof name, "util_format_%s_fetch_rgba_float", format_desc->short_name); + if (gallivm_debug & GALLIVM_DEBUG_PERF) { + debug_printf("%s: falling back to %s\n", __FUNCTION__, name); + } + /* * Declare and bind format_desc->fetch_rgba_float(). */ diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c index c724a4453e..ce7e54afc7 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c @@ -37,6 +37,7 @@ #include "lp_bld_conv.h" #include "lp_bld_swizzle.h" #include "lp_bld_gather.h" +#include "lp_bld_debug.h" #include "lp_bld_format.h" @@ -387,6 +388,11 @@ lp_build_fetch_rgba_soa(LLVMBuilderRef builder, unsigned k, chan; struct lp_type tmp_type; + if (gallivm_debug & GALLIVM_DEBUG_PERF) { + debug_printf("%s: scalar unpacking of %s\n", + __FUNCTION__, format_desc->short_name); + } + tmp_type = type; tmp_type.length = 4; diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c b/src/gallium/auxiliary/gallivm/lp_bld_init.c index 60d8bcfa55..761f33b578 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_init.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c @@ -43,6 +43,7 @@ static const struct debug_named_value lp_bld_debug_flags[] = { { "ir", GALLIVM_DEBUG_IR, NULL }, { "asm", GALLIVM_DEBUG_ASM, NULL }, { "nopt", GALLIVM_DEBUG_NO_OPT, NULL }, + { "perf", GALLIVM_DEBUG_PERF, NULL }, DEBUG_NAMED_VALUE_END }; diff --git a/src/gallium/auxiliary/gallivm/lp_bld_logic.c b/src/gallium/auxiliary/gallivm/lp_bld_logic.c index db25981491..a959bd4ad4 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_logic.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_logic.c @@ -40,6 +40,7 @@ #include "lp_bld_type.h" #include "lp_bld_const.h" #include "lp_bld_intr.h" +#include "lp_bld_debug.h" #include "lp_bld_logic.h" @@ -325,8 +326,10 @@ lp_build_compare(LLVMBuilderRef builder, res = LLVMGetUndef(int_vec_type); - debug_printf("%s: warning: using slow element-wise int" - " vector comparison\n", __FUNCTION__); + if (gallivm_debug & GALLIVM_DEBUG_PERF) { + debug_printf("%s: using slow element-wise int" + " vector comparison\n", __FUNCTION__); + } for(i = 0; i < type.length; ++i) { LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), i, 0); diff --git a/src/gallium/auxiliary/gallivm/lp_bld_pack.c b/src/gallium/auxiliary/gallivm/lp_bld_pack.c index b7b630f2e8..f7eb7148ab 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_pack.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_pack.c @@ -111,8 +111,6 @@ lp_build_const_pack_shuffle(unsigned n) assert(n <= LP_MAX_VECTOR_LENGTH); - /* TODO: cache results in a static table */ - for(i = 0; i < n; ++i) elems[i] = LLVMConstInt(LLVMInt32Type(), 2*i, 0); diff --git a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c index 1f39d9c98b..93cbf159aa 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c @@ -2203,6 +2203,16 @@ lp_build_sample_soa(LLVMBuilderRef builder, row_stride_array, data_array, texel_out); } else { + if (gallivm_debug & GALLIVM_DEBUG_PERF && + bld.format_desc->nr_channels > 1 && + (static_state->min_img_filter != PIPE_TEX_FILTER_NEAREST || + static_state->mag_img_filter != PIPE_TEX_FILTER_NEAREST || + static_state->min_mip_filter == PIPE_TEX_MIPFILTER_LINEAR) && + util_format_fits_8unorm(bld.format_desc)) { + debug_printf("%s: using floating point linear filtering for %s\n", + __FUNCTION__, bld.format_desc->short_name); + } + lp_build_sample_general(&bld, unit, s, t, r, ddx, ddy, lod_bias, explicit_lod, width, height, depth, -- cgit v1.2.3