summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2011-06-13 13:18:35 +0200
committerDaniel Vetter <daniel.vetter@ffwll.ch>2011-06-13 13:18:35 +0200
commitc0f34338e7bb3be473ff3afe70e17afbaa3a7958 (patch)
treeae83fd31a6effcc1b24eba86e346bd7e8b429573 /tests
parent6daa883fa3cf08363912fd46bce49177a3fa7c82 (diff)
gem_stress: option to set tiles per buffer
gem_stress -p1 is much more evil than gem_stress -c1, it also manages to tear appart untiled workloads! Now duct-taping over it still works (--apply-duct-tape) ... hm. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'tests')
-rw-r--r--tests/gem_stress.c43
-rw-r--r--tests/gem_stress.h2
2 files changed, 32 insertions, 13 deletions
diff --git a/tests/gem_stress.c b/tests/gem_stress.c
index 03f8fa59..be7bf93c 100644
--- a/tests/gem_stress.c
+++ b/tests/gem_stress.c
@@ -92,8 +92,6 @@ static unsigned current_set = 0;
static unsigned target_set = 0;
static unsigned num_total_tiles = 0;
-#define TILES_PER_BUF (num_total_tiles / num_buffers)
-
int fence_storm = 0;
static int gpu_busy_load = 10;
@@ -209,6 +207,9 @@ static void cpu_copyfunc(struct scratch_buf *src, unsigned src_x, unsigned src_y
struct scratch_buf *dst, unsigned dst_x, unsigned dst_y,
unsigned logical_tile_no)
{
+ if (options.ducttape)
+ drm_intel_bo_wait_rendering(dst->bo);
+
if (options.use_cpu_maps) {
set_to_cpu_domain(src, 0);
set_to_cpu_domain(dst, 1);
@@ -226,6 +227,9 @@ static void prw_copyfunc(struct scratch_buf *src, unsigned src_x, unsigned src_y
uint32_t tmp_tile[TILE_SIZE*TILE_SIZE];
int i;
+ if (options.ducttape)
+ drm_intel_bo_wait_rendering(dst->bo);
+
if (src->tiling == I915_TILING_NONE) {
for (i = 0; i < TILE_SIZE; i++) {
unsigned ofs = src_x*sizeof(uint32_t) + src->stride*(src_y + i);
@@ -360,8 +364,8 @@ static void fan_out(void)
for (i = 0; i < num_total_tiles; i++) {
tile = i;
- buf_idx = tile / TILES_PER_BUF;
- tile %= TILES_PER_BUF;
+ buf_idx = tile / options.tiles_per_buf;
+ tile %= options.tiles_per_buf;
tile2xy(&buffers[current_set][buf_idx], tile, &x, &y);
@@ -388,8 +392,8 @@ static void fan_in_and_check(void)
int i;
for (i = 0; i < num_total_tiles; i++) {
tile = tile_permutation[i];
- buf_idx = tile / TILES_PER_BUF;
- tile %= TILES_PER_BUF;
+ buf_idx = tile / options.tiles_per_buf;
+ tile %= options.tiles_per_buf;
tile2xy(&buffers[current_set][buf_idx], tile, &x, &y);
@@ -421,7 +425,7 @@ static void init_buffer(struct scratch_buf *buf, unsigned size)
buf->data = buf->bo->virtual;
}
- buf->num_tiles = size / TILE_BYTES;
+ buf->num_tiles = options.tiles_per_buf;
}
static void permute_array(void *array, unsigned size,
@@ -525,7 +529,7 @@ static void init_set(unsigned set)
&buffers[set][i].tiling,
buffers[set][i].stride);
- if (i == options.trace_tile/TILES_PER_BUF)
+ if (options.trace_tile != -1 && i == options.trace_tile/options.tiles_per_buf)
printf("changing buffer %i containing tile %i: tiling %i, stride %i\n", i,
options.trace_tile,
buffers[set][i].tiling, buffers[set][i].stride);
@@ -552,14 +556,14 @@ static void copy_tiles(unsigned *permutation)
/* tile_permutation is independent of current_permutation, so
* abuse it to randomize the order of the src bos */
idx = tile_permutation[i];
- src_buf_idx = idx / TILES_PER_BUF;
- src_tile = idx % TILES_PER_BUF;
+ src_buf_idx = idx / options.tiles_per_buf;
+ src_tile = idx % options.tiles_per_buf;
src_buf = &buffers[current_set][src_buf_idx];
tile2xy(src_buf, src_tile, &src_x, &src_y);
- dst_buf_idx = permutation[idx] / TILES_PER_BUF;
- dst_tile = permutation[idx] % TILES_PER_BUF;
+ dst_buf_idx = permutation[idx] / options.tiles_per_buf;
+ dst_tile = permutation[idx] % options.tiles_per_buf;
dst_buf = &buffers[target_set][dst_buf_idx];
tile2xy(dst_buf, dst_tile, &dst_x, &dst_y);
@@ -621,6 +625,9 @@ static void parse_options(int argc, char **argv)
{"use-cpu-maps", 0, 0, 'm'},
{"rounds", 1, 0, 'o'},
{"no-fail", 0, 0, 'f'},
+ {"tiles-per-buf", 0, 0, 'p'},
+#define DUCTAPE 0xdead0001
+ {"apply-duct-tape", 0, 0, DUCTAPE},
};
options.scratch_buf_size = 256*4096;
@@ -634,8 +641,10 @@ static void parse_options(int argc, char **argv)
options.use_cpu_maps = 0;
options.total_rounds = 512;
options.fail = 1;
+ options.tiles_per_buf = options.scratch_buf_size / TILE_BYTES;
+ options.ducttape = 0;
- while((c = getopt_long(argc, argv, "ds:g:c:t:rbuxmo:f",
+ while((c = getopt_long(argc, argv, "ds:g:c:t:rbuxmo:fp:",
long_options, &option_index)) != -1) {
switch(c) {
case 'd':
@@ -704,6 +713,14 @@ static void parse_options(int argc, char **argv)
options.fail = 0;
printf("not failing when detecting errors\n");
break;
+ case 'p':
+ options.tiles_per_buf = atoi(optarg);
+ printf("tiles per buffer %i\n", options.tiles_per_buf);
+ break;
+ case DUCTAPE:
+ options.ducttape = 1;
+ printf("applying duct-tape\n");
+ break;
default:
printf("unkown command options\n");
break;
diff --git a/tests/gem_stress.h b/tests/gem_stress.h
index bd2e6caa..ba075f72 100644
--- a/tests/gem_stress.h
+++ b/tests/gem_stress.h
@@ -38,6 +38,8 @@ struct option_struct {
int use_cpu_maps;
int total_rounds;
int fail;
+ int tiles_per_buf;
+ int ducttape;
};
extern struct option_struct options;