mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-14 19:50:28 +01:00
llvmpipe: Write data to a tsv file for posterior analysis.
This commit is contained in:
parent
f081bacc25
commit
a77084ea4b
1 changed files with 168 additions and 97 deletions
|
|
@ -51,6 +51,7 @@
|
|||
#include "pipe/p_state.h"
|
||||
#include "util/u_format.h"
|
||||
#include "util/u_math.h"
|
||||
#include "util/u_debug_dump.h"
|
||||
|
||||
#include "lp_bld.h"
|
||||
#include "lp_bld_type.h"
|
||||
|
|
@ -63,6 +64,78 @@ unsigned verbose = 0;
|
|||
typedef void (*blend_test_ptr_t)(const void *src, const void *dst, const void *con, void *res);
|
||||
|
||||
|
||||
static void
|
||||
write_tsv_header(FILE *fp)
|
||||
{
|
||||
fprintf(fp,
|
||||
"result\t"
|
||||
"cycles\t"
|
||||
"type\t"
|
||||
"rgb_func\t"
|
||||
"rgb_src_factor\t"
|
||||
"rgb_dst_factor\t"
|
||||
"alpha_func\t"
|
||||
"alpha_src_factor\t"
|
||||
"alpha_dst_factor\n");
|
||||
|
||||
fflush(fp);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
write_tsv_row(FILE *fp,
|
||||
const struct pipe_blend_state *blend,
|
||||
union lp_type type,
|
||||
double cycles,
|
||||
boolean success)
|
||||
{
|
||||
fprintf(fp, "%s\t", success ? "pass" : "fail");
|
||||
|
||||
fprintf(fp, "%u\t", (unsigned)(cycles + 0.5));
|
||||
|
||||
fprintf(fp, "%s%u%sx%u\t",
|
||||
type.floating ? "f" : (type.fixed ? "h" : (type.sign ? "s" : "u")),
|
||||
type.width,
|
||||
type.norm ? "n" : "",
|
||||
type.length);
|
||||
|
||||
fprintf(fp,
|
||||
"%s\t%s\t%s\t%s\t%s\t%s\n",
|
||||
debug_dump_blend_func(blend->rgb_func, TRUE),
|
||||
debug_dump_blend_factor(blend->rgb_src_factor, TRUE),
|
||||
debug_dump_blend_factor(blend->rgb_dst_factor, TRUE),
|
||||
debug_dump_blend_func(blend->alpha_func, TRUE),
|
||||
debug_dump_blend_factor(blend->alpha_src_factor, TRUE),
|
||||
debug_dump_blend_factor(blend->alpha_dst_factor, TRUE));
|
||||
|
||||
fflush(fp);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
dump_blend_type(FILE *fp,
|
||||
const struct pipe_blend_state *blend,
|
||||
union lp_type type)
|
||||
{
|
||||
fprintf(fp,
|
||||
"%s=%s %s=%s %s=%s %s=%s %s=%s %s=%s",
|
||||
"rgb_func", debug_dump_blend_func(blend->rgb_func, TRUE),
|
||||
"rgb_src_factor", debug_dump_blend_factor(blend->rgb_src_factor, TRUE),
|
||||
"rgb_dst_factor", debug_dump_blend_factor(blend->rgb_dst_factor, TRUE),
|
||||
"alpha_func", debug_dump_blend_func(blend->alpha_func, TRUE),
|
||||
"alpha_src_factor", debug_dump_blend_factor(blend->alpha_src_factor, TRUE),
|
||||
"alpha_dst_factor", debug_dump_blend_factor(blend->alpha_dst_factor, TRUE));
|
||||
|
||||
fprintf(fp, " type=%s%u%sx%u",
|
||||
type.floating ? "f" : (type.fixed ? "h" : (type.sign ? "s" : "u")),
|
||||
type.width,
|
||||
type.norm ? "n" : "",
|
||||
type.length);
|
||||
|
||||
fflush(fp);
|
||||
}
|
||||
|
||||
|
||||
static INLINE uint64_t
|
||||
rdtsc(void)
|
||||
{
|
||||
|
|
@ -367,7 +440,8 @@ compute_blend_ref(const struct pipe_blend_state *blend,
|
|||
|
||||
|
||||
static boolean
|
||||
test_one(const struct pipe_blend_state *blend,
|
||||
test_one(FILE *fp,
|
||||
const struct pipe_blend_state *blend,
|
||||
union lp_type type)
|
||||
{
|
||||
LLVMModuleRef module = NULL;
|
||||
|
|
@ -380,8 +454,12 @@ test_one(const struct pipe_blend_state *blend,
|
|||
boolean success;
|
||||
const unsigned n = 32;
|
||||
int64_t cycles[n];
|
||||
double cycles_avg = 0.0;
|
||||
unsigned i, j, k;
|
||||
|
||||
if(verbose >= 1)
|
||||
dump_blend_type(stdout, blend, type);
|
||||
|
||||
module = LLVMModuleCreateWithName("test");
|
||||
|
||||
func = add_blend_test(module, blend, type);
|
||||
|
|
@ -394,6 +472,8 @@ test_one(const struct pipe_blend_state *blend,
|
|||
|
||||
provider = LLVMCreateModuleProviderForExistingModule(module);
|
||||
if (LLVMCreateJITCompiler(&engine, provider, 1, &error)) {
|
||||
dump_blend_type(stderr, blend, type);
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, "%s\n", error);
|
||||
LLVMDisposeMessage(error);
|
||||
abort();
|
||||
|
|
@ -449,6 +529,8 @@ test_one(const struct pipe_blend_state *blend,
|
|||
success = FALSE;
|
||||
|
||||
if (!success) {
|
||||
dump_blend_type(stderr, blend, type);
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, "MISMATCH\n");
|
||||
fprintf(stderr, " Result: ");
|
||||
for(j = 0; j < type.length; ++j)
|
||||
|
|
@ -504,6 +586,8 @@ test_one(const struct pipe_blend_state *blend,
|
|||
}
|
||||
|
||||
if (!success) {
|
||||
dump_blend_type(stderr, blend, type);
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, "MISMATCH\n");
|
||||
fprintf(stderr, " Result: ");
|
||||
for(j = 0; j < type.length; ++j)
|
||||
|
|
@ -526,7 +610,7 @@ test_one(const struct pipe_blend_state *blend,
|
|||
* -- sometimes we get outliers (due IRQs perhaps?) which are
|
||||
* better removed to avoid random or biased data.
|
||||
*/
|
||||
if(verbose >=1 && success) {
|
||||
{
|
||||
double sum = 0.0, sum2 = 0.0;
|
||||
double avg, std;
|
||||
unsigned m;
|
||||
|
|
@ -548,10 +632,13 @@ test_one(const struct pipe_blend_state *blend,
|
|||
}
|
||||
}
|
||||
|
||||
avg = sum/m;
|
||||
cycles_avg = sum/m;
|
||||
|
||||
fprintf(stdout, " cycles=%.1f", avg);
|
||||
fprintf(stdout, " cycles_per_elem=%.1f", avg/type.length);
|
||||
}
|
||||
|
||||
if(verbose >= 1) {
|
||||
fprintf(stdout, " cycles=%.1f", cycles_avg);
|
||||
fprintf(stdout, " cycles_per_elem=%.1f", cycles_avg/type.length);
|
||||
}
|
||||
|
||||
if(verbose >= 1) {
|
||||
|
|
@ -559,6 +646,9 @@ test_one(const struct pipe_blend_state *blend,
|
|||
fflush(stdout);
|
||||
}
|
||||
|
||||
if(fp)
|
||||
write_tsv_row(fp, blend, type, cycles_avg, success);
|
||||
|
||||
if (!success) {
|
||||
LLVMDumpModule(module);
|
||||
LLVMWriteBitcodeToFile(module, "blend.bc");
|
||||
|
|
@ -576,48 +666,41 @@ test_one(const struct pipe_blend_state *blend,
|
|||
}
|
||||
|
||||
|
||||
struct value_name_pair
|
||||
{
|
||||
unsigned value;
|
||||
const char *name;
|
||||
};
|
||||
|
||||
|
||||
const struct value_name_pair
|
||||
const unsigned
|
||||
blend_factors[] = {
|
||||
{PIPE_BLENDFACTOR_ZERO , "zero"},
|
||||
{PIPE_BLENDFACTOR_ONE , "one"},
|
||||
{PIPE_BLENDFACTOR_SRC_COLOR , "src_color"},
|
||||
{PIPE_BLENDFACTOR_SRC_ALPHA , "src_alpha"},
|
||||
{PIPE_BLENDFACTOR_DST_COLOR , "dst_color"},
|
||||
{PIPE_BLENDFACTOR_DST_ALPHA , "dst_alpha"},
|
||||
{PIPE_BLENDFACTOR_CONST_COLOR , "const_color"},
|
||||
{PIPE_BLENDFACTOR_CONST_ALPHA , "const_alpha"},
|
||||
PIPE_BLENDFACTOR_ZERO,
|
||||
PIPE_BLENDFACTOR_ONE,
|
||||
PIPE_BLENDFACTOR_SRC_COLOR,
|
||||
PIPE_BLENDFACTOR_SRC_ALPHA,
|
||||
PIPE_BLENDFACTOR_DST_COLOR,
|
||||
PIPE_BLENDFACTOR_DST_ALPHA,
|
||||
PIPE_BLENDFACTOR_CONST_COLOR,
|
||||
PIPE_BLENDFACTOR_CONST_ALPHA,
|
||||
#if 0
|
||||
{PIPE_BLENDFACTOR_SRC1_COLOR , "src1_color"},
|
||||
{PIPE_BLENDFACTOR_SRC1_ALPHA , "src1_alpha"},
|
||||
PIPE_BLENDFACTOR_SRC1_COLOR,
|
||||
PIPE_BLENDFACTOR_SRC1_ALPHA,
|
||||
#endif
|
||||
{PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE , "src_alpha_saturate"},
|
||||
{PIPE_BLENDFACTOR_INV_SRC_COLOR , "inv_src_color"},
|
||||
{PIPE_BLENDFACTOR_INV_SRC_ALPHA , "inv_src_alpha"},
|
||||
{PIPE_BLENDFACTOR_INV_DST_COLOR , "inv_dst_color"},
|
||||
{PIPE_BLENDFACTOR_INV_DST_ALPHA , "inv_dst_alpha"},
|
||||
{PIPE_BLENDFACTOR_INV_CONST_COLOR , "inv_const_color"},
|
||||
{PIPE_BLENDFACTOR_INV_CONST_ALPHA , "inv_const_alpha"},
|
||||
PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE,
|
||||
PIPE_BLENDFACTOR_INV_SRC_COLOR,
|
||||
PIPE_BLENDFACTOR_INV_SRC_ALPHA,
|
||||
PIPE_BLENDFACTOR_INV_DST_COLOR,
|
||||
PIPE_BLENDFACTOR_INV_DST_ALPHA,
|
||||
PIPE_BLENDFACTOR_INV_CONST_COLOR,
|
||||
PIPE_BLENDFACTOR_INV_CONST_ALPHA,
|
||||
#if 0
|
||||
{PIPE_BLENDFACTOR_INV_SRC1_COLOR , "inv_src1_color"},
|
||||
{PIPE_BLENDFACTOR_INV_SRC1_ALPHA , "inv_src1_alpha"}
|
||||
PIPE_BLENDFACTOR_INV_SRC1_COLOR,
|
||||
PIPE_BLENDFACTOR_INV_SRC1_ALPHA,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
const struct value_name_pair
|
||||
const unsigned
|
||||
blend_funcs[] = {
|
||||
{PIPE_BLEND_ADD , "add"},
|
||||
{PIPE_BLEND_SUBTRACT , "sub"},
|
||||
{PIPE_BLEND_REVERSE_SUBTRACT , "rev_sub"},
|
||||
{PIPE_BLEND_MIN , "min"},
|
||||
{PIPE_BLEND_MAX , "max"}
|
||||
PIPE_BLEND_ADD,
|
||||
PIPE_BLEND_SUBTRACT,
|
||||
PIPE_BLEND_REVERSE_SUBTRACT,
|
||||
PIPE_BLEND_MIN,
|
||||
PIPE_BLEND_MAX
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -634,14 +717,14 @@ const unsigned num_types = sizeof(blend_types)/sizeof(blend_types[0]);
|
|||
|
||||
|
||||
static boolean
|
||||
test_all(void)
|
||||
test_all(FILE *fp)
|
||||
{
|
||||
const struct value_name_pair *rgb_func;
|
||||
const struct value_name_pair *rgb_src_factor;
|
||||
const struct value_name_pair *rgb_dst_factor;
|
||||
const struct value_name_pair *alpha_func;
|
||||
const struct value_name_pair *alpha_src_factor;
|
||||
const struct value_name_pair *alpha_dst_factor;
|
||||
const unsigned *rgb_func;
|
||||
const unsigned *rgb_src_factor;
|
||||
const unsigned *rgb_dst_factor;
|
||||
const unsigned *alpha_func;
|
||||
const unsigned *alpha_src_factor;
|
||||
const unsigned *alpha_dst_factor;
|
||||
struct pipe_blend_state blend;
|
||||
const union lp_type *type;
|
||||
bool success = TRUE;
|
||||
|
|
@ -654,32 +737,20 @@ test_all(void)
|
|||
for(alpha_dst_factor = blend_factors; alpha_dst_factor <= alpha_src_factor; ++alpha_dst_factor) {
|
||||
for(type = blend_types; type < &blend_types[num_types]; ++type) {
|
||||
|
||||
if(rgb_dst_factor->value == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE ||
|
||||
alpha_dst_factor->value == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE)
|
||||
if(*rgb_dst_factor == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE ||
|
||||
*alpha_dst_factor == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE)
|
||||
continue;
|
||||
|
||||
if(verbose >= 1) {
|
||||
fprintf(stdout,
|
||||
"%s=%s %s=%s %s=%s %s=%s %s=%s %s=%s",
|
||||
"rgb_func", rgb_func->name,
|
||||
"rgb_src_factor", rgb_src_factor->name,
|
||||
"rgb_dst_factor", rgb_dst_factor->name,
|
||||
"alpha_func", alpha_func->name,
|
||||
"alpha_src_factor", alpha_src_factor->name,
|
||||
"alpha_dst_factor", alpha_dst_factor->name);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
memset(&blend, 0, sizeof blend);
|
||||
blend.blend_enable = 1;
|
||||
blend.rgb_func = rgb_func->value;
|
||||
blend.rgb_src_factor = rgb_src_factor->value;
|
||||
blend.rgb_dst_factor = rgb_dst_factor->value;
|
||||
blend.alpha_func = alpha_func->value;
|
||||
blend.alpha_src_factor = alpha_src_factor->value;
|
||||
blend.alpha_dst_factor = alpha_dst_factor->value;
|
||||
blend.rgb_func = *rgb_func;
|
||||
blend.rgb_src_factor = *rgb_src_factor;
|
||||
blend.rgb_dst_factor = *rgb_dst_factor;
|
||||
blend.alpha_func = *alpha_func;
|
||||
blend.alpha_src_factor = *alpha_src_factor;
|
||||
blend.alpha_dst_factor = *alpha_dst_factor;
|
||||
|
||||
if(!test_one(&blend, *type))
|
||||
if(!test_one(fp, &blend, *type))
|
||||
success = FALSE;
|
||||
|
||||
}
|
||||
|
|
@ -695,14 +766,14 @@ test_all(void)
|
|||
|
||||
|
||||
static boolean
|
||||
test_some(unsigned long n)
|
||||
test_some(FILE *fp, unsigned long n)
|
||||
{
|
||||
const struct value_name_pair *rgb_func;
|
||||
const struct value_name_pair *rgb_src_factor;
|
||||
const struct value_name_pair *rgb_dst_factor;
|
||||
const struct value_name_pair *alpha_func;
|
||||
const struct value_name_pair *alpha_src_factor;
|
||||
const struct value_name_pair *alpha_dst_factor;
|
||||
const unsigned *rgb_func;
|
||||
const unsigned *rgb_src_factor;
|
||||
const unsigned *rgb_dst_factor;
|
||||
const unsigned *alpha_func;
|
||||
const unsigned *alpha_src_factor;
|
||||
const unsigned *alpha_dst_factor;
|
||||
struct pipe_blend_state blend;
|
||||
const union lp_type *type;
|
||||
unsigned long i;
|
||||
|
|
@ -716,38 +787,25 @@ test_some(unsigned long n)
|
|||
|
||||
do {
|
||||
rgb_dst_factor = &blend_factors[random() % num_factors];
|
||||
} while(rgb_dst_factor->value == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE);
|
||||
} while(*rgb_dst_factor == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE);
|
||||
|
||||
do {
|
||||
alpha_dst_factor = &blend_factors[random() % num_factors];
|
||||
} while(alpha_dst_factor->value == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE);
|
||||
} while(*alpha_dst_factor == PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE);
|
||||
|
||||
for(type = blend_types; type < &blend_types[num_types]; ++type) {
|
||||
|
||||
if(verbose >= 1) {
|
||||
fprintf(stdout,
|
||||
"%s=%s %s=%s %s=%s %s=%s %s=%s %s=%s",
|
||||
"rgb_func", rgb_func->name,
|
||||
"rgb_src_factor", rgb_src_factor->name,
|
||||
"rgb_dst_factor", rgb_dst_factor->name,
|
||||
"alpha_func", alpha_func->name,
|
||||
"alpha_src_factor", alpha_src_factor->name,
|
||||
"alpha_dst_factor", alpha_dst_factor->name);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
memset(&blend, 0, sizeof blend);
|
||||
blend.blend_enable = 1;
|
||||
blend.rgb_func = rgb_func->value;
|
||||
blend.rgb_src_factor = rgb_src_factor->value;
|
||||
blend.rgb_dst_factor = rgb_dst_factor->value;
|
||||
blend.alpha_func = alpha_func->value;
|
||||
blend.alpha_src_factor = alpha_src_factor->value;
|
||||
blend.alpha_dst_factor = alpha_dst_factor->value;
|
||||
blend.rgb_func = *rgb_func;
|
||||
blend.rgb_src_factor = *rgb_src_factor;
|
||||
blend.rgb_dst_factor = *rgb_dst_factor;
|
||||
blend.alpha_func = *alpha_func;
|
||||
blend.alpha_src_factor = *alpha_src_factor;
|
||||
blend.alpha_dst_factor = *alpha_dst_factor;
|
||||
|
||||
if(!test_one(&blend, *type))
|
||||
if(!test_one(fp, &blend, *type))
|
||||
success = FALSE;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -758,20 +816,33 @@ test_some(unsigned long n)
|
|||
int main(int argc, char **argv)
|
||||
{
|
||||
unsigned long n = 1000;
|
||||
FILE *fp = NULL;
|
||||
unsigned i;
|
||||
boolean success;
|
||||
|
||||
for(i = 1; i < argc; ++i) {
|
||||
if(strcmp(argv[i], "-v") == 0)
|
||||
++verbose;
|
||||
else if(strcmp(argv[i], "-o") == 0)
|
||||
fp = fopen(argv[++i], "wt");
|
||||
else
|
||||
n = atoi(argv[i]);
|
||||
}
|
||||
|
||||
if(fp) {
|
||||
/* Warm up the caches */
|
||||
test_some(NULL, 100);
|
||||
|
||||
write_tsv_header(fp);
|
||||
}
|
||||
|
||||
if(n)
|
||||
success = test_some(n);
|
||||
success = test_some(fp, n);
|
||||
else
|
||||
success = test_all();
|
||||
success = test_all(fp);
|
||||
|
||||
if(fp)
|
||||
fclose(fp);
|
||||
|
||||
return success ? 0 : 1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue