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>
This commit is contained in:
Daniel Vetter 2012-02-29 17:36:04 +01:00
parent f1d32d541d
commit dac239e2b6
2 changed files with 46 additions and 33 deletions

View File

@ -87,7 +87,7 @@ static void exec(int fd, uint32_t handle)
int main(int argc, char **argv) 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; int fd, i, ret;
uint64_t aper_size; uint64_t aper_size;
int count; int count;

View File

@ -57,23 +57,32 @@ struct intel_batchbuffer *batch;
drm_intel_bo *scratch_bo; drm_intel_bo *scratch_bo;
drm_intel_bo *staging_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; uint32_t devid;
uint64_t mappable_gtt_limit; uint64_t mappable_gtt_limit;
int fd; int fd;
static void 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; uint32_t cmd_bits = 0;
/* dst is tiled ... */ /* dst is tiled ... */
if (intel_gen(devid) >= 4) { if (intel_gen(devid) >= 4 && dst_tiled) {
pitch /= 4; dst_pitch /= 4;
cmd_bits |= XY_SRC_COPY_BLT_DST_TILED; 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); BEGIN_BATCH(8);
OUT_BATCH(XY_SRC_COPY_BLT_CMD | OUT_BATCH(XY_SRC_COPY_BLT_CMD |
XY_SRC_COPY_BLT_WRITE_ALPHA | XY_SRC_COPY_BLT_WRITE_ALPHA |
@ -81,12 +90,12 @@ copy_bo(drm_intel_bo *src, drm_intel_bo *dst)
cmd_bits); cmd_bits);
OUT_BATCH((3 << 24) | /* 32 bits */ OUT_BATCH((3 << 24) | /* 32 bits */
(0xcc << 16) | /* copy ROP */ (0xcc << 16) | /* copy ROP */
pitch); dst_pitch);
OUT_BATCH(0 << 16 | 0); 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_RELOC_FENCED(dst, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
OUT_BATCH(0 << 16 | 0); OUT_BATCH(0 << 16 | 0);
OUT_BATCH(4096); OUT_BATCH(src_pitch);
OUT_RELOC_FENCED(src, I915_GEM_DOMAIN_RENDER, 0, 0); OUT_RELOC_FENCED(src, I915_GEM_DOMAIN_RENDER, 0, 0);
ADVANCE_BATCH(); 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)) (IS_G33(devid) || intel_gen(devid) >= 4))
drmtest_trash_aperture(); drmtest_trash_aperture();
copy_bo(tmp_bo, bo); copy_bo(tmp_bo, 0, bo, 1);
} }
#define MAX_BLT_SIZE 128 #define MAX_BLT_SIZE 128
#define ROUNDS 500 #define ROUNDS 200
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int i, j; int i, j;
uint8_t tmp[BO_SIZE]; uint8_t tmp[BO_SIZE];
uint8_t *gtt_ptr; uint8_t compare_tmp[BO_SIZE];
uint32_t tiling_mode = I915_TILING_X; uint32_t tiling_mode = I915_TILING_X;
unsigned long pitch;
srandom(0xdeadbeef); srandom(0xdeadbeef);
@ -134,11 +142,16 @@ int main(int argc, char **argv)
batch = intel_batchbuffer_alloc(bufmgr, devid); batch = intel_batchbuffer_alloc(bufmgr, devid);
/* overallocate the buffers we're actually using because */ /* overallocate the buffers we're actually using because */
scratch_bo = drm_intel_bo_alloc_tiled(bufmgr, "scratch bo", 1024, 4, 4, scratch_bo = drm_intel_bo_alloc_tiled(bufmgr, "scratch bo", 1024,
&tiling_mode, &pitch, 0); BO_SIZE/4096, 4,
&tiling_mode, &scratch_pitch, 0);
assert(tiling_mode == I915_TILING_X); 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); 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); drmtest_init_aperture_trashers(bufmgr);
mappable_gtt_limit = gem_mappable_aperture_size(); mappable_gtt_limit = gem_mappable_aperture_size();
@ -157,7 +170,7 @@ int main(int argc, char **argv)
for (j = 0; j < len; j++) { for (j = 0; j < len; j++) {
if (tmp[j] != val) { if (tmp[j] != val) {
printf("mismatch at %i, got: %i, expected: %i\n", printf("mismatch at %i, got: %i, expected: %i\n",
j, tmp[j], val); start + j, tmp[j], val);
exit(1); exit(1);
} }
} }
@ -179,27 +192,27 @@ int main(int argc, char **argv)
drm_intel_bo_subdata(scratch_bo, start, len, tmp); drm_intel_bo_subdata(scratch_bo, start, len, tmp);
copy_bo(scratch_bo, staging_bo); copy_bo(scratch_bo, 1, tiled_staging_bo, 1);
drm_intel_gem_bo_map_gtt(staging_bo); drm_intel_bo_get_subdata(tiled_staging_bo, 0, BO_SIZE,
gtt_ptr = staging_bo->virtual; compare_tmp);
for (j = 0; j < start; j++) { 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", printf("amismatch at %i, got: %i, expected: %i\n",
j, tmp[j], val); j, tmp[j], val);
exit(1); exit(1);
} }
} }
for (; j < start + len; j++) { 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", printf("bmismatch at %i, got: %i, expected: %i\n",
j, tmp[j], i); j, tmp[j], i);
exit(1); exit(1);
} }
} }
for (; j < BO_SIZE; j++) { for (; j < BO_SIZE; j++) {
if (gtt_ptr[j] != val) { if (compare_tmp[j] != val) {
printf("mismatch at %i, got: %i, expected: %i\n", printf("cmismatch at %i, got: %i, expected: %i\n",
j, tmp[j], val); j, tmp[j], val);
exit(1); exit(1);
} }
@ -224,7 +237,7 @@ int main(int argc, char **argv)
for (j = 0; j < len; j++) { for (j = 0; j < len; j++) {
if (tmp[j] != val) { if (tmp[j] != val) {
printf("mismatch in read at %i, got: %i, expected: %i\n", printf("mismatch in read at %i, got: %i, expected: %i\n",
j, tmp[j], val); start + j, tmp[j], val);
exit(1); exit(1);
} }
} }
@ -242,26 +255,26 @@ int main(int argc, char **argv)
drm_intel_bo_subdata(scratch_bo, start, len, tmp); drm_intel_bo_subdata(scratch_bo, start, len, tmp);
copy_bo(scratch_bo, staging_bo); copy_bo(scratch_bo, 1, tiled_staging_bo, 1);
drm_intel_gem_bo_map_gtt(staging_bo); drm_intel_bo_get_subdata(tiled_staging_bo, 0, BO_SIZE,
gtt_ptr = staging_bo->virtual; compare_tmp);
for (j = 0; j < start; j++) { 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", printf("mismatch at %i, got: %i, expected: %i\n",
j, tmp[j], val); j, tmp[j], val);
exit(1); exit(1);
} }
} }
for (; j < start + len; j++) { 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", printf("mismatch at %i, got: %i, expected: %i\n",
j, tmp[j], tmp[0]); j, tmp[j], tmp[0]);
exit(1); exit(1);
} }
} }
for (; j < BO_SIZE; j++) { for (; j < BO_SIZE; j++) {
if (gtt_ptr[j] != val) { if (compare_tmp[j] != val) {
printf("mismatch at %i, got: %i, expected: %i\n", printf("mismatch at %i, got: %i, expected: %i\n",
j, tmp[j], val); j, tmp[j], val);
exit(1); exit(1);