tests/gem_tiled_partial_pread/write: fixes
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 29 Feb 2012 16:36:04 +0000 (17:36 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 29 Feb 2012 17:32:02 +0000 (18:32 +0100)
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>
tests/gem_cs_prefetch.c
tests/gem_tiled_partial_pwrite_pread.c

index 983d28e..4fb2fc4 100644 (file)
@@ -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;
index 1a781ba..ef6bb00 100644 (file)
@@ -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);