diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-02-29 17:36:04 +0100 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-02-29 18:32:02 +0100 |
commit | dac239e2b694f5f187ae0af9aeb339e3b57a51a1 (patch) | |
tree | 573cbe647c473810c171aa77d122998c11260af0 /tests | |
parent | f1d32d541dc8328a0f55224915906f23b58062a0 (diff) |
tests/gem_tiled_partial_pread/write: fixes
Astonishing how dense I sometimes am ...
- increase the bo size so that we don't have any round-up to next tile
size areas (which the 2d blit go over, but the 1d pread/pwrite calls
will notice).
- correctly set tiling bits when copying back to a linear buffer.
- read back through a tiled bo to avoid messing with swizzling.
Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/gem_cs_prefetch.c | 2 | ||||
-rw-r--r-- | tests/gem_tiled_partial_pwrite_pread.c | 77 |
2 files changed, 46 insertions, 33 deletions
diff --git a/tests/gem_cs_prefetch.c b/tests/gem_cs_prefetch.c index 983d28eb..4fb2fc4e 100644 --- a/tests/gem_cs_prefetch.c +++ b/tests/gem_cs_prefetch.c @@ -87,7 +87,7 @@ static void exec(int fd, uint32_t handle) int main(int argc, char **argv) { - uint32_t batch_end[2] = {MI_BATCH_BUFFER_END}; + uint32_t batch_end[4] = {MI_BATCH_BUFFER_END, 0, 0, 0}; int fd, i, ret; uint64_t aper_size; int count; diff --git a/tests/gem_tiled_partial_pwrite_pread.c b/tests/gem_tiled_partial_pwrite_pread.c index 1a781ba9..ef6bb004 100644 --- a/tests/gem_tiled_partial_pwrite_pread.c +++ b/tests/gem_tiled_partial_pwrite_pread.c @@ -57,23 +57,32 @@ struct intel_batchbuffer *batch; drm_intel_bo *scratch_bo; drm_intel_bo *staging_bo; -#define BO_SIZE (4*4096) +drm_intel_bo *tiled_staging_bo; +unsigned long scratch_pitch; +#define BO_SIZE (8*4096) uint32_t devid; uint64_t mappable_gtt_limit; int fd; static void -copy_bo(drm_intel_bo *src, drm_intel_bo *dst) +copy_bo(drm_intel_bo *src, int src_tiled, + drm_intel_bo *dst, int dst_tiled) { - unsigned long pitch = 4096; + unsigned long dst_pitch = scratch_pitch; + unsigned long src_pitch = scratch_pitch; uint32_t cmd_bits = 0; /* dst is tiled ... */ - if (intel_gen(devid) >= 4) { - pitch /= 4; + if (intel_gen(devid) >= 4 && dst_tiled) { + dst_pitch /= 4; cmd_bits |= XY_SRC_COPY_BLT_DST_TILED; } + if (intel_gen(devid) >= 4 && dst_tiled) { + src_pitch /= 4; + cmd_bits |= XY_SRC_COPY_BLT_SRC_TILED; + } + BEGIN_BATCH(8); OUT_BATCH(XY_SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA | @@ -81,12 +90,12 @@ copy_bo(drm_intel_bo *src, drm_intel_bo *dst) cmd_bits); OUT_BATCH((3 << 24) | /* 32 bits */ (0xcc << 16) | /* copy ROP */ - pitch); + dst_pitch); OUT_BATCH(0 << 16 | 0); - OUT_BATCH((BO_SIZE/4096) << 16 | 1024); + OUT_BATCH(BO_SIZE/scratch_pitch << 16 | 1024); OUT_RELOC_FENCED(dst, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0); OUT_BATCH(0 << 16 | 0); - OUT_BATCH(4096); + OUT_BATCH(src_pitch); OUT_RELOC_FENCED(src, I915_GEM_DOMAIN_RENDER, 0, 0); ADVANCE_BATCH(); @@ -111,18 +120,17 @@ blt_bo_fill(drm_intel_bo *tmp_bo, drm_intel_bo *bo, int val) (IS_G33(devid) || intel_gen(devid) >= 4)) drmtest_trash_aperture(); - copy_bo(tmp_bo, bo); + copy_bo(tmp_bo, 0, bo, 1); } #define MAX_BLT_SIZE 128 -#define ROUNDS 500 +#define ROUNDS 200 int main(int argc, char **argv) { int i, j; uint8_t tmp[BO_SIZE]; - uint8_t *gtt_ptr; + uint8_t compare_tmp[BO_SIZE]; uint32_t tiling_mode = I915_TILING_X; - unsigned long pitch; srandom(0xdeadbeef); @@ -134,11 +142,16 @@ int main(int argc, char **argv) batch = intel_batchbuffer_alloc(bufmgr, devid); /* overallocate the buffers we're actually using because */ - scratch_bo = drm_intel_bo_alloc_tiled(bufmgr, "scratch bo", 1024, 4, 4, - &tiling_mode, &pitch, 0); + scratch_bo = drm_intel_bo_alloc_tiled(bufmgr, "scratch bo", 1024, + BO_SIZE/4096, 4, + &tiling_mode, &scratch_pitch, 0); assert(tiling_mode == I915_TILING_X); - assert(pitch == 4096); + assert(scratch_pitch == 4096); staging_bo = drm_intel_bo_alloc(bufmgr, "staging bo", BO_SIZE, 4096); + tiled_staging_bo = drm_intel_bo_alloc_tiled(bufmgr, "scratch bo", 1024, + BO_SIZE/4096, 4, + &tiling_mode, + &scratch_pitch, 0); drmtest_init_aperture_trashers(bufmgr); mappable_gtt_limit = gem_mappable_aperture_size(); @@ -157,7 +170,7 @@ int main(int argc, char **argv) for (j = 0; j < len; j++) { if (tmp[j] != val) { printf("mismatch at %i, got: %i, expected: %i\n", - j, tmp[j], val); + start + j, tmp[j], val); exit(1); } } @@ -179,27 +192,27 @@ int main(int argc, char **argv) drm_intel_bo_subdata(scratch_bo, start, len, tmp); - copy_bo(scratch_bo, staging_bo); - drm_intel_gem_bo_map_gtt(staging_bo); - gtt_ptr = staging_bo->virtual; + copy_bo(scratch_bo, 1, tiled_staging_bo, 1); + drm_intel_bo_get_subdata(tiled_staging_bo, 0, BO_SIZE, + compare_tmp); for (j = 0; j < start; j++) { - if (gtt_ptr[j] != val) { - printf("mismatch at %i, got: %i, expected: %i\n", + if (compare_tmp[j] != val) { + printf("amismatch at %i, got: %i, expected: %i\n", j, tmp[j], val); exit(1); } } for (; j < start + len; j++) { - if (gtt_ptr[j] != tmp[0]) { - printf("mismatch at %i, got: %i, expected: %i\n", + if (compare_tmp[j] != tmp[0]) { + printf("bmismatch at %i, got: %i, expected: %i\n", j, tmp[j], i); exit(1); } } for (; j < BO_SIZE; j++) { - if (gtt_ptr[j] != val) { - printf("mismatch at %i, got: %i, expected: %i\n", + if (compare_tmp[j] != val) { + printf("cmismatch at %i, got: %i, expected: %i\n", j, tmp[j], val); exit(1); } @@ -224,7 +237,7 @@ int main(int argc, char **argv) for (j = 0; j < len; j++) { if (tmp[j] != val) { printf("mismatch in read at %i, got: %i, expected: %i\n", - j, tmp[j], val); + start + j, tmp[j], val); exit(1); } } @@ -242,26 +255,26 @@ int main(int argc, char **argv) drm_intel_bo_subdata(scratch_bo, start, len, tmp); - copy_bo(scratch_bo, staging_bo); - drm_intel_gem_bo_map_gtt(staging_bo); - gtt_ptr = staging_bo->virtual; + copy_bo(scratch_bo, 1, tiled_staging_bo, 1); + drm_intel_bo_get_subdata(tiled_staging_bo, 0, BO_SIZE, + compare_tmp); for (j = 0; j < start; j++) { - if (gtt_ptr[j] != val) { + if (compare_tmp[j] != val) { printf("mismatch at %i, got: %i, expected: %i\n", j, tmp[j], val); exit(1); } } for (; j < start + len; j++) { - if (gtt_ptr[j] != tmp[0]) { + if (compare_tmp[j] != tmp[0]) { printf("mismatch at %i, got: %i, expected: %i\n", j, tmp[j], tmp[0]); exit(1); } } for (; j < BO_SIZE; j++) { - if (gtt_ptr[j] != val) { + if (compare_tmp[j] != val) { printf("mismatch at %i, got: %i, expected: %i\n", j, tmp[j], val); exit(1); |