Lines Matching refs:kgem

96 	assert(sna->kgem.nbatch <= KGEM_BATCH_SIZE(&sna->kgem));
97 if (sna->kgem.nexec > 1 && __kgem_ring_empty(&sna->kgem)) {
99 _kgem_submit(&sna->kgem);
106 struct kgem *kgem = &sna->kgem;
108 assert(kgem->nbatch <= KGEM_BATCH_SIZE(kgem));
109 if (kgem->nexec > 1 && __kgem_ring_empty(kgem)) {
111 _kgem_submit(kgem);
115 if (kgem_check_batch(kgem, 3)) {
116 uint32_t *b = kgem->batch + kgem->nbatch;
117 assert(sna->kgem.mode == KGEM_BLT);
120 kgem->nbatch += 3;
121 assert(kgem->nbatch < kgem->surface);
123 assert(sna->kgem.nbatch <= KGEM_BATCH_SIZE(&sna->kgem));
134 struct kgem *kgem = &sna->kgem;
136 assert(kgem_bo_can_blt (kgem, bo));
141 if (kgem->gen >= 040 && bo->tiling) {
168 kgem_set_mode(kgem, KGEM_BLT, bo);
169 if (!kgem_check_batch(kgem, 14) ||
170 !kgem_check_bo_fenced(kgem, bo)) {
171 kgem_submit(kgem);
172 if (!kgem_check_bo_fenced(kgem, bo))
174 _kgem_set_mode(kgem, KGEM_BLT);
183 if (!kgem_check_batch(kgem, 24) ||
184 !kgem_check_reloc(kgem, 1)) {
185 _kgem_submit(kgem);
186 if (!kgem_check_bo_fenced(kgem, bo))
188 _kgem_set_mode(kgem, KGEM_BLT);
190 kgem_bcs_set_tiling(kgem, NULL, bo);
192 assert(sna->kgem.mode == KGEM_BLT);
193 b = kgem->batch + kgem->nbatch;
194 if (sna->kgem.gen >= 0100) {
204 kgem_add_reloc64(kgem, kgem->nbatch + 4, bo,
213 kgem->nbatch += 10;
218 if (bo->tiling && kgem->gen >= 040)
223 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, bo,
232 kgem->nbatch += 9;
234 assert(kgem->nbatch < kgem->surface);
241 assert(sna->kgem.mode == KGEM_BLT);
248 struct kgem *kgem = &sna->kgem;
251 kgem_bcs_set_tiling(&sna->kgem, NULL, blt->bo[0]);
253 assert(kgem->mode == KGEM_BLT);
254 b = kgem->batch + kgem->nbatch;
255 if (sna->kgem.gen >= 0100) {
265 kgem_add_reloc64(kgem, kgem->nbatch + 4, blt->bo[0],
274 kgem->nbatch += 10;
279 if (blt->bo[0]->tiling && kgem->gen >= 040)
284 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, blt->bo[0],
293 kgem->nbatch += 9;
300 struct kgem *kgem = &sna->kgem;
302 if (kgem->nreloc) {
303 _kgem_submit(kgem);
304 _kgem_set_mode(kgem, KGEM_BLT);
305 kgem_bcs_set_tiling(kgem, NULL, blt->bo[0]);
306 assert(kgem->nbatch == 0);
317 struct kgem *kgem = &sna->kgem;
327 if (!kgem_check_batch(kgem, 3))
330 assert(sna->kgem.mode == KGEM_BLT);
331 b = kgem->batch + kgem->nbatch;
332 kgem->nbatch += 3;
333 assert(kgem->nbatch < kgem->surface);
347 struct kgem *kgem = &sna->kgem;
349 assert(kgem_bo_can_blt(kgem, src));
350 assert(kgem_bo_can_blt(kgem, dst));
355 blt->cmd = XY_SRC_COPY_BLT_CMD | (kgem->gen >= 0100 ? 8 : 6);
360 if (kgem->gen >= 040 && src->tiling) {
367 if (kgem->gen >= 040 && dst->tiling) {
382 kgem_set_mode(kgem, KGEM_BLT, dst);
383 if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL)) {
384 kgem_submit(kgem);
385 if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL))
387 _kgem_set_mode(kgem, KGEM_BLT);
389 kgem_bcs_set_tiling(&sna->kgem, src, dst);
401 struct kgem *kgem = &sna->kgem;
405 assert(kgem_bo_can_blt(kgem, src));
406 assert(kgem_bo_can_blt(kgem, dst));
411 blt->cmd = XY_FULL_MONO_PATTERN_BLT | (kgem->gen >= 0100 ? 12 : 10);
413 if (kgem->gen >= 040 && src->tiling) {
420 if (kgem->gen >= 040 && dst->tiling) {
437 kgem_set_mode(kgem, KGEM_BLT, dst);
438 if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL)) {
439 kgem_submit(kgem);
440 if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL))
442 _kgem_set_mode(kgem, KGEM_BLT);
444 kgem_bcs_set_tiling(&sna->kgem, src, dst);
456 struct kgem *kgem = &sna->kgem;
471 if (!kgem_check_batch(kgem, 14) ||
472 !kgem_check_reloc(kgem, 2)) {
473 _kgem_submit(kgem);
474 _kgem_set_mode(kgem, KGEM_BLT);
475 kgem_bcs_set_tiling(&sna->kgem, blt->bo[0], blt->bo[1]);
478 assert(sna->kgem.mode == KGEM_BLT);
479 b = kgem->batch + kgem->nbatch;
484 if (sna->kgem.gen >= 0100) {
486 kgem_add_reloc64(kgem, kgem->nbatch + 4, blt->bo[1],
494 kgem_add_reloc64(kgem, kgem->nbatch + 8, blt->bo[0],
502 kgem->nbatch += 14;
504 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, blt->bo[1],
511 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, blt->bo[0],
519 kgem->nbatch += 12;
521 assert(kgem->nbatch < kgem->surface);
530 struct kgem *kgem = &sna->kgem;
547 kgem->reloc[kgem->nreloc-1].target_handle == blt->bo[1]->target_handle) {
548 if (sna->kgem.gen >= 0100) {
549 if (kgem->nbatch >= 7 &&
550 kgem->batch[kgem->nbatch-7] == (XY_COLOR_BLT | (blt->cmd & (BLT_DST_TILED | BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 5) &&
551 kgem->batch[kgem->nbatch-5] == ((uint32_t)dst_y << 16 | (uint16_t)dst_x) &&
552 kgem->batch[kgem->nbatch-4] == ((uint32_t)(dst_y+height) << 16 | (uint16_t)(dst_x+width))) {
554 if (kgem_check_batch(kgem, 3)) {
555 assert(kgem->mode == KGEM_BLT);
556 b = kgem->batch + kgem->nbatch - 7;
562 kgem_add_reloc64(kgem, kgem->nbatch + 8 - 7, blt->bo[0],
566 kgem->nbatch += 3;
567 assert(kgem->nbatch < kgem->surface);
570 kgem->nbatch -= 7;
571 kgem->nreloc--;
574 if (kgem->nbatch >= 6 &&
575 kgem->batch[kgem->nbatch-6] == (XY_COLOR_BLT | (blt->cmd & (BLT_DST_TILED | BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 4) &&
576 kgem->batch[kgem->nbatch-4] == ((uint32_t)dst_y << 16 | (uint16_t)dst_x) &&
577 kgem->batch[kgem->nbatch-3] == ((uint32_t)(dst_y+height) << 16 | (uint16_t)(dst_x+width))) {
579 if (kgem_check_batch(kgem, 8-6)) {
580 assert(kgem->mode == KGEM_BLT);
581 b = kgem->batch + kgem->nbatch - 6;
586 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7 - 6, blt->bo[0],
590 kgem->nbatch += 8 - 6;
591 assert(kgem->nbatch < kgem->surface);
594 kgem->nbatch -= 6;
595 kgem->nreloc--;
600 if (!kgem_check_batch(kgem, 10) ||
601 !kgem_check_reloc(kgem, 2)) {
602 _kgem_submit(kgem);
603 _kgem_set_mode(kgem, KGEM_BLT);
604 kgem_bcs_set_tiling(&sna->kgem, blt->bo[0], blt->bo[1]);
607 assert(sna->kgem.mode == KGEM_BLT);
608 b = kgem->batch + kgem->nbatch;
613 if (kgem->gen >= 0100) {
615 kgem_add_reloc64(kgem, kgem->nbatch + 4, blt->bo[1],
623 kgem_add_reloc64(kgem, kgem->nbatch + 8, blt->bo[0],
627 kgem->nbatch += 10;
629 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, blt->bo[1],
636 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, blt->bo[0],
640 kgem->nbatch += 8;
642 assert(kgem->nbatch < kgem->surface);
1113 struct kgem *kgem = &sna->kgem;
1124 if (!kgem_check_batch(kgem, 3))
1127 assert(sna->kgem.mode == KGEM_BLT);
1128 b = kgem->batch + kgem->nbatch;
1129 kgem->nbatch += 3;
1130 assert(kgem->nbatch < kgem->surface);
1141 struct kgem *kgem = &sna->kgem;
1146 if (!kgem_check_batch(kgem, 3))
1150 uint32_t *b = kgem->batch + kgem->nbatch;
1153 assert(sna->kgem.mode == KGEM_BLT);
1155 rem = kgem_batch_space(kgem);
1163 kgem->nbatch += 3 * nbox_this_time;
1164 assert(kgem->nbatch < kgem->surface);
1238 struct kgem *kgem = &sna->kgem;
1245 assert(kgem->mode == KGEM_BLT);
1246 if (!kgem_check_batch(kgem, 3)) {
1252 uint32_t *b = kgem->batch + kgem->nbatch;
1255 assert(sna->kgem.mode == KGEM_BLT);
1257 rem = kgem_batch_space(kgem);
1265 kgem->nbatch += 3 * nbox_this_time;
1266 assert(kgem->nbatch < kgem->surface);
1351 struct kgem *kgem = &sna->kgem;
1360 assert(kgem->mode == KGEM_BLT);
1361 if (!kgem_check_batch(kgem, 3)) {
1367 uint32_t *b = kgem->batch + kgem->nbatch;
1370 assert(sna->kgem.mode == KGEM_BLT);
1372 rem = kgem_batch_space(kgem);
1380 kgem->nbatch += 3 * nbox_this_time;
1381 assert(kgem->nbatch < kgem->surface);
1447 assert(sna->kgem.mode == KGEM_BLT);
1448 if (!kgem_check_bo_fenced(&sna->kgem, op->dst.bo)) {
1449 kgem_submit(&sna->kgem);
1450 if (!kgem_check_bo_fenced(&sna->kgem, op->dst.bo))
1453 _kgem_set_mode(&sna->kgem, KGEM_BLT);
1454 kgem_bcs_set_tiling(&sna->kgem, NULL, op->dst.bo);
1648 struct kgem *kgem = &sna->kgem;
1669 rem = kgem_batch_space(kgem);
1672 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
1673 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
1679 assert(sna->kgem.mode == KGEM_BLT);
1681 uint32_t *b = kgem->batch + kgem->nbatch;
1698 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, dst_bo,
1705 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, src_bo,
1709 kgem->nbatch += 8;
1710 assert(kgem->nbatch < kgem->surface);
1717 _kgem_submit(kgem);
1718 _kgem_set_mode(kgem, KGEM_BLT);
1719 kgem_bcs_set_tiling(&sna->kgem, src_bo, dst_bo);
1726 rem = kgem_batch_space(kgem);
1729 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
1730 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
1736 assert(sna->kgem.mode == KGEM_BLT);
1738 uint32_t *b = kgem->batch + kgem->nbatch;
1755 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, dst_bo,
1762 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, src_bo,
1766 kgem->nbatch += 8;
1767 assert(kgem->nbatch < kgem->surface);
1774 _kgem_submit(kgem);
1775 _kgem_set_mode(kgem, KGEM_BLT);
1776 kgem_bcs_set_tiling(&sna->kgem, src_bo, dst_bo);
1786 struct kgem *kgem = &sna->kgem;
1807 rem = kgem_batch_space(kgem);
1810 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
1811 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
1817 assert(kgem->mode == KGEM_BLT);
1819 uint32_t *b = kgem->batch + kgem->nbatch;
1837 kgem_add_reloc64(kgem, kgem->nbatch + 4, dst_bo,
1845 kgem_add_reloc64(kgem, kgem->nbatch + 8, src_bo,
1849 kgem->nbatch += 10;
1850 assert(kgem->nbatch < kgem->surface);
1857 _kgem_submit(kgem);
1858 _kgem_set_mode(kgem, KGEM_BLT);
1859 kgem_bcs_set_tiling(&sna->kgem, src_bo, dst_bo);
1866 rem = kgem_batch_space(kgem);
1869 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
1870 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
1876 assert(kgem->mode == KGEM_BLT);
1878 uint32_t *b = kgem->batch + kgem->nbatch;
1896 kgem_add_reloc64(kgem, kgem->nbatch + 4, dst_bo,
1904 kgem_add_reloc64(kgem, kgem->nbatch + 8, src_bo,
1908 kgem->nbatch += 10;
1909 assert(kgem->nbatch < kgem->surface);
1916 _kgem_submit(kgem);
1917 _kgem_set_mode(kgem, KGEM_BLT);
1918 kgem_bcs_set_tiling(&sna->kgem, src_bo, dst_bo);
2013 assert(kgem_bo_can_blt(&sna->kgem, op->dst.bo));
2014 assert(kgem_bo_can_blt(&sna->kgem, bo));
2016 kgem_set_mode(&sna->kgem, KGEM_BLT, op->dst.bo);
2017 if (!kgem_check_many_bo_fenced(&sna->kgem, op->dst.bo, bo, NULL)) {
2018 kgem_submit(&sna->kgem);
2019 if (!kgem_check_many_bo_fenced(&sna->kgem,
2026 _kgem_set_mode(&sna->kgem, KGEM_BLT);
2028 kgem_bcs_set_tiling(&sna->kgem, bo, op->dst.bo);
2032 if (sna->kgem.gen >= 060 && op->dst.bo == bo)
2050 if (sna->kgem.gen >= 0100)
2621 if (!kgem_bo_can_blt(&sna->kgem, tmp->dst.bo)) {
2627 kgem_bo_undo(&sna->kgem, tmp->dst.bo);
2722 if (!kgem_bo_can_blt(&sna->kgem, tmp->dst.bo)) {
2728 kgem_bo_undo(&sna->kgem, tmp->dst.bo);
2859 if (bo && !kgem_bo_can_blt(&sna->kgem, bo)) {
2895 kgem_bo_pair_undo(&sna->kgem, priv->gpu_bo, priv->cpu_bo);
2909 } else if (!kgem_bo_can_blt(&sna->kgem, bo)) {
2917 } else if (!kgem_bo_can_blt(&sna->kgem, tmp->dst.bo)) {
2964 struct kgem *kgem = &sna->kgem;
2966 assert(kgem->nbatch <= KGEM_BATCH_SIZE(kgem));
2967 if (kgem->nexec > 1 && __kgem_ring_empty(kgem)) {
2969 _kgem_submit(kgem);
2972 kgem_bo_destroy(kgem, op->src.bo);
2978 struct kgem *kgem = &sna->kgem;
2980 if (kgem_check_batch(kgem, 3)) {
2981 uint32_t *b = kgem->batch + kgem->nbatch;
2982 assert(sna->kgem.mode == KGEM_BLT);
2985 kgem->nbatch += 3;
2986 assert(kgem->nbatch < kgem->surface);
3010 if (!kgem_bo_can_blt(&sna->kgem, tmp->dst.bo) ||
3011 !kgem_bo_can_blt(&sna->kgem, tmp->src.bo)) {
3086 kgem_set_mode(&sna->kgem, KGEM_BLT, tmp->dst.bo);
3087 if (!kgem_check_many_bo_fenced(&sna->kgem, tmp->dst.bo, tmp->src.bo, NULL)) {
3088 kgem_submit(&sna->kgem);
3089 if (!kgem_check_many_bo_fenced(&sna->kgem,
3096 _kgem_set_mode(&sna->kgem, KGEM_BLT);
3098 kgem_bcs_set_tiling(&sna->kgem, tmp->src.bo, tmp->dst.bo);
3114 if (sna->kgem.gen >= 0100)
3127 if (sna->kgem.gen >= 060 && tmp->src.bo == tmp->dst.bo)
3205 struct kgem *kgem = &sna->kgem;
3218 if (!kgem_check_batch(kgem, 2))
3222 if (kgem->gen >= 040 && op->base.u.blt.bo[0]->tiling)
3226 uint32_t *b = kgem->batch + kgem->nbatch;
3229 assert(sna->kgem.mode == KGEM_BLT);
3231 rem = kgem_batch_space(kgem);
3237 kgem->nbatch += 2 * n_this_time;
3238 assert(kgem->nbatch < kgem->surface);
3270 if (!kgem_bo_can_blt(&sna->kgem, bo)) {
3280 assert(sna->kgem.mode == KGEM_BLT);
3312 if (!kgem_bo_can_blt(&sna->kgem, src))
3315 if (!kgem_bo_can_blt(&sna->kgem, dst))
3324 if (sna->kgem.gen >= 060 && src == dst)
3338 struct kgem *kgem = &sna->kgem;
3342 assert(kgem_bo_can_blt (kgem, bo));
3350 cmd = XY_COLOR_BLT | (kgem->gen >= 0100 ? 5 : 4);
3352 if (kgem->gen >= 040 && bo->tiling) {
3370 if (sna->kgem.gen >= 0100) {
3371 if (kgem->nbatch >= 7 &&
3372 kgem->batch[kgem->nbatch-7] == cmd &&
3373 *(uint64_t *)&kgem->batch[kgem->nbatch-5] == *(const uint64_t *)box &&
3374 kgem->reloc[kgem->nreloc-1].target_handle == bo->target_handle) {
3376 kgem->batch[kgem->nbatch-6] = br13;
3377 kgem->batch[kgem->nbatch-1] = color;
3380 if (kgem->nbatch >= 10 &&
3381 (kgem->batch[kgem->nbatch-10] & 0xffc00000) == XY_SRC_COPY_BLT_CMD &&
3382 *(uint64_t *)&kgem->batch[kgem->nbatch-8] == *(const uint64_t *)box &&
3383 kgem->reloc[kgem->nreloc-2].target_handle == bo->target_handle) {
3385 kgem->batch[kgem->nbatch-10] = cmd;
3386 kgem->batch[kgem->nbatch-8] = br13;
3387 kgem->batch[kgem->nbatch-4] = color;
3391 kgem->nreloc--;
3392 kgem->nbatch -= 3;
3396 if (kgem->nbatch >= 6 &&
3397 kgem->batch[kgem->nbatch-6] == cmd &&
3398 *(uint64_t *)&kgem->batch[kgem->nbatch-4] == *(const uint64_t *)box &&
3399 kgem->reloc[kgem->nreloc-1].target_handle == bo->target_handle) {
3401 kgem->batch[kgem->nbatch-5] = br13;
3402 kgem->batch[kgem->nbatch-1] = color;
3405 if (kgem->nbatch >= 8 &&
3406 (kgem->batch[kgem->nbatch-8] & 0xffc00000) == XY_SRC_COPY_BLT_CMD &&
3407 *(uint64_t *)&kgem->batch[kgem->nbatch-6] == *(const uint64_t *)box &&
3408 kgem->reloc[kgem->nreloc-2].target_handle == bo->target_handle) {
3410 kgem->batch[kgem->nbatch-8] = cmd;
3411 kgem->batch[kgem->nbatch-7] = br13;
3412 kgem->batch[kgem->nbatch-3] = color;
3416 kgem->nreloc--;
3417 kgem->nbatch -= 2;
3433 kgem_set_mode(kgem, KGEM_BLT, bo);
3434 if (!kgem_check_batch(kgem, 7) ||
3435 !kgem_check_reloc(kgem, 1) ||
3436 !kgem_check_bo_fenced(kgem, bo)) {
3437 kgem_submit(kgem);
3438 if (!kgem_check_bo_fenced(&sna->kgem, bo))
3441 _kgem_set_mode(kgem, KGEM_BLT);
3443 kgem_bcs_set_tiling(&sna->kgem, NULL, bo);
3445 assert(kgem_check_batch(kgem, 6));
3446 assert(kgem_check_reloc(kgem, 1));
3448 assert(sna->kgem.mode == KGEM_BLT);
3449 b = kgem->batch + kgem->nbatch;
3453 if (kgem->gen >= 0100) {
3455 kgem_add_reloc64(kgem, kgem->nbatch + 4, bo,
3461 kgem->nbatch += 7;
3463 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, bo,
3469 kgem->nbatch += 6;
3471 assert(kgem->nbatch < kgem->surface);
3484 struct kgem *kgem = &sna->kgem;
3494 if (!kgem_bo_can_blt(kgem, bo)) {
3513 if (kgem->gen >= 040 && bo->tiling) {
3527 kgem_set_mode(kgem, KGEM_BLT, bo);
3528 if (!kgem_check_batch(kgem, 14) ||
3529 !kgem_check_bo_fenced(kgem, bo)) {
3530 kgem_submit(kgem);
3531 if (!kgem_check_bo_fenced(&sna->kgem, bo))
3533 _kgem_set_mode(kgem, KGEM_BLT);
3542 if (!kgem_check_batch(kgem, 24) ||
3543 !kgem_check_reloc(kgem, 1)) {
3544 _kgem_submit(kgem);
3545 if (!kgem_check_bo_fenced(&sna->kgem, bo))
3547 _kgem_set_mode(kgem, KGEM_BLT);
3550 kgem_bcs_set_tiling(&sna->kgem, NULL, bo);
3552 assert(sna->kgem.mode == KGEM_BLT);
3553 b = kgem->batch + kgem->nbatch;
3554 if (kgem->gen >= 0100) {
3564 kgem_add_reloc64(kgem, kgem->nbatch + 4, bo,
3573 kgem->nbatch += 10;
3578 if (bo->tiling && kgem->gen >= 040)
3583 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, bo,
3592 kgem->nbatch += 9;
3594 assert(kgem->nbatch < kgem->surface);
3605 rem = kgem_batch_space(kgem);
3613 assert(sna->kgem.mode == KGEM_BLT);
3627 b = kgem->batch + kgem->nbatch;
3628 kgem->nbatch += 3;
3629 assert(kgem->nbatch < kgem->surface);
3638 _kgem_submit(kgem);
3639 _kgem_set_mode(kgem, KGEM_BLT);
3640 kgem_bcs_set_tiling(&sna->kgem, NULL, bo);
3642 assert(sna->kgem.mode == KGEM_BLT);
3643 b = kgem->batch + kgem->nbatch;
3644 if (kgem->gen >= 0100) {
3654 kgem_add_reloc64(kgem, kgem->nbatch + 4, bo,
3663 kgem->nbatch += 10;
3668 if (bo->tiling && kgem->gen >= 040)
3673 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, bo,
3682 kgem->nbatch += 9;
3684 assert(kgem->nbatch < kgem->surface);
3685 assert(kgem_check_batch(kgem, 3));
3689 if (kgem->nexec > 1 && __kgem_ring_empty(kgem)) {
3691 _kgem_submit(kgem);
3702 struct kgem *kgem = &sna->kgem;
3715 if (wedged(sna) || !kgem_bo_can_blt(kgem, src_bo) || !kgem_bo_can_blt(kgem, dst_bo)) {
3718 kgem_bo_can_blt(kgem, src_bo),
3719 kgem_bo_can_blt(kgem, dst_bo)));
3728 if (kgem->gen >= 040 && src_bo->tiling) {
3735 if (kgem->gen >= 040 && dst_bo->tiling) {
3751 kgem->reloc[kgem->nreloc-1].target_handle == dst_bo->target_handle) {
3752 if (kgem->gen >= 0100) {
3753 if (kgem->nbatch >= 7 &&
3754 kgem->batch[kgem->nbatch-7] == (XY_COLOR_BLT | (cmd & (BLT_DST_TILED | BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 5) &&
3755 kgem->batch[kgem->nbatch-5] == ((uint32_t)(box->y1 + dst_dy) << 16 | (uint16_t)(box->x1 + dst_dx)) &&
3756 kgem->batch[kgem->nbatch-4] == ((uint32_t)(box->y2 + dst_dy) << 16 | (uint16_t)(box->x2 + dst_dx))) {
3758 kgem->nbatch -= 7;
3759 kgem->nreloc--;
3762 if (kgem->nbatch >= 6 &&
3763 kgem->batch[kgem->nbatch-6] == (XY_COLOR_BLT | (cmd & (BLT_DST_TILED | BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 4) &&
3764 kgem->batch[kgem->nbatch-4] == ((uint32_t)(box->y1 + dst_dy) << 16 | (uint16_t)(box->x1 + dst_dx)) &&
3765 kgem->batch[kgem->nbatch-3] == ((uint32_t)(box->y2 + dst_dy) << 16 | (uint16_t)(box->x2 + dst_dx))) {
3767 kgem->nbatch -= 6;
3768 kgem->nreloc--;
3773 kgem_set_mode(kgem, KGEM_BLT, dst_bo);
3774 if (!kgem_check_batch(kgem, 10) ||
3775 !kgem_check_reloc(kgem, 2) ||
3776 !kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
3777 kgem_submit(kgem);
3778 if (!kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
3785 _kgem_set_mode(kgem, KGEM_BLT);
3787 kgem_bcs_set_tiling(&sna->kgem, src_bo, dst_bo);
3790 if (kgem->gen >= 0100) {
3796 rem = kgem_batch_space(kgem);
3799 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
3800 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
3806 assert(sna->kgem.mode == KGEM_BLT);
3808 uint32_t *b = kgem->batch + kgem->nbatch;
3826 kgem_add_reloc64(kgem, kgem->nbatch + 4, dst_bo,
3834 kgem_add_reloc64(kgem, kgem->nbatch + 8, src_bo,
3838 kgem->nbatch += 10;
3839 assert(kgem->nbatch < kgem->surface);
3846 _kgem_submit(kgem);
3847 _kgem_set_mode(kgem, KGEM_BLT);
3848 kgem_bcs_set_tiling(&sna->kgem, src_bo, dst_bo);
3856 rem = kgem_batch_space(kgem);
3859 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
3860 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
3866 assert(sna->kgem.mode == KGEM_BLT);
3868 uint32_t *b = kgem->batch + kgem->nbatch;
3885 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, dst_bo,
3892 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, src_bo,
3896 kgem->nbatch += 8;
3897 assert(kgem->nbatch < kgem->surface);
3904 _kgem_submit(kgem);
3905 _kgem_set_mode(kgem, KGEM_BLT);
3906 kgem_bcs_set_tiling(&sna->kgem, src_bo, dst_bo);
3910 if (kgem->gen >= 0100) {
3916 rem = kgem_batch_space(kgem);
3919 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
3920 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
3926 assert(sna->kgem.mode == KGEM_BLT);
3928 uint32_t *b = kgem->batch + kgem->nbatch;
3946 kgem_add_reloc64(kgem, kgem->nbatch + 4, dst_bo,
3954 kgem_add_reloc64(kgem, kgem->nbatch + 8, src_bo,
3958 kgem->nbatch += 10;
3959 assert(kgem->nbatch < kgem->surface);
3966 _kgem_submit(kgem);
3967 _kgem_set_mode(kgem, KGEM_BLT);
3968 kgem_bcs_set_tiling(&sna->kgem, src_bo, dst_bo);
3976 rem = kgem_batch_space(kgem);
3979 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
3980 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
3986 assert(sna->kgem.mode == KGEM_BLT);
3988 uint32_t *b = kgem->batch + kgem->nbatch;
4005 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, dst_bo,
4012 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, src_bo,
4016 kgem->nbatch += 8;
4017 assert(kgem->nbatch < kgem->surface);
4024 _kgem_submit(kgem);
4025 _kgem_set_mode(kgem, KGEM_BLT);
4026 kgem_bcs_set_tiling(&sna->kgem, src_bo, dst_bo);
4031 if (kgem->nexec > 1 && __kgem_ring_empty(kgem)) {
4033 _kgem_submit(kgem);
4034 } else if (kgem->gen >= 060 && src_bo == dst_bo && kgem_check_batch(kgem, 3)) {
4035 uint32_t *b = kgem->batch + kgem->nbatch;
4036 assert(sna->kgem.mode == KGEM_BLT);
4039 kgem->nbatch += 3;
4040 assert(kgem->nbatch < kgem->surface);
4053 struct kgem *kgem = &sna->kgem;
4065 if (wedged(sna) || !kgem_bo_can_blt(kgem, src_bo) || !kgem_bo_can_blt(kgem, dst_bo)) {
4068 kgem_bo_can_blt(kgem, src_bo),
4069 kgem_bo_can_blt(kgem, dst_bo)));
4073 cmd = XY_FULL_MONO_PATTERN_BLT | (kgem->gen >= 0100 ? 12 : 10);
4075 if (kgem->gen >= 040 && src_bo->tiling) {
4082 if (kgem->gen >= 040 && dst_bo->tiling) {
4096 kgem_set_mode(kgem, KGEM_BLT, dst_bo);
4097 if (!kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
4104 kgem->reloc[kgem->nreloc-1].target_handle == dst_bo->target_handle) {
4105 if (kgem->gen >= 0100) {
4106 if (kgem->nbatch >= 7 &&
4107 kgem->batch[kgem->nbatch-7] == (XY_COLOR_BLT | (cmd & (BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 5) &&
4108 kgem->batch[kgem->nbatch-5] == ((uint32_t)(box->y1 + dst_dy) << 16 | (uint16_t)(box->x1 + dst_dx)) &&
4109 kgem->batch[kgem->nbatch-4] == ((uint32_t)(box->y2 + dst_dy) << 16 | (uint16_t)(box->x2 + dst_dx))) {
4111 kgem->nbatch -= 7;
4112 kgem->nreloc--;
4115 if (kgem->nbatch >= 6 &&
4116 kgem->batch[kgem->nbatch-6] == (XY_COLOR_BLT | (cmd & (BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 4) &&
4117 kgem->batch[kgem->nbatch-4] == ((uint32_t)(box->y1 + dst_dy) << 16 | (uint16_t)(box->x1 + dst_dx)) &&
4118 kgem->batch[kgem->nbatch-3] == ((uint32_t)(box->y2 + dst_dy) << 16 | (uint16_t)(box->x2 + dst_dx))) {
4120 kgem->nbatch -= 6;
4121 kgem->nreloc--;
4129 if (!kgem_check_batch(kgem, 14) ||
4130 !kgem_check_reloc(kgem, 2)) {
4131 _kgem_submit(kgem);
4132 _kgem_set_mode(kgem, KGEM_BLT);
4133 kgem_bcs_set_tiling(&sna->kgem, src_bo, dst_bo);
4136 assert(sna->kgem.mode == KGEM_BLT);
4137 b = kgem->batch + kgem->nbatch;
4142 if (sna->kgem.gen >= 0100) {
4144 kgem_add_reloc64(kgem, kgem->nbatch + 4, dst_bo,
4152 kgem_add_reloc64(kgem, kgem->nbatch + 8, src_bo,
4160 kgem->nbatch += 14;
4162 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, dst_bo,
4169 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, src_bo,
4177 kgem->nbatch += 12;
4179 assert(kgem->nbatch < kgem->surface);
4183 if (kgem->nexec > 1 && __kgem_ring_empty(kgem)) {
4185 _kgem_submit(kgem);
4229 !sna->kgem.can_blt_y &&
4230 kgem_bo_blt_pitch_is_ok(&sna->kgem, src_bo)) {
4247 free_bo = kgem_create_2d(&sna->kgem,
4265 kgem_bo_destroy(&sna->kgem, free_bo);
4277 !sna->kgem.can_blt_y &&
4278 kgem_bo_blt_pitch_is_ok(&sna->kgem, src_bo)) {
4292 !sna->kgem.can_blt_y &&
4293 kgem_bo_blt_pitch_is_ok(&sna->kgem, dst_bo)) {
4314 kgem_bo_destroy(&sna->kgem, free_bo);