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 |
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();
(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);
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();
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);
}
}
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);
}
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);
}
}
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);