Lines Matching refs:kgem
91 assert(sna->kgem.nbatch <= KGEM_BATCH_SIZE(&sna->kgem));
92 if (sna->kgem.nexec > 1 && __kgem_ring_empty(&sna->kgem)) {
94 _kgem_submit(&sna->kgem);
101 struct kgem *kgem = &sna->kgem;
103 assert(kgem->nbatch <= KGEM_BATCH_SIZE(kgem));
104 if (kgem->nexec > 1 && __kgem_ring_empty(kgem)) {
106 _kgem_submit(kgem);
110 if (kgem_check_batch(kgem, 3)) {
111 uint32_t *b = kgem->batch + kgem->nbatch;
112 assert(sna->kgem.mode == KGEM_BLT);
115 kgem->nbatch += 3;
116 assert(kgem->nbatch < kgem->surface);
118 assert(sna->kgem.nbatch <= KGEM_BATCH_SIZE(&sna->kgem));
129 struct kgem *kgem = &sna->kgem;
131 assert(kgem_bo_can_blt (kgem, bo));
137 if (kgem->gen >= 040 && bo->tiling) {
164 kgem_set_mode(kgem, KGEM_BLT, bo);
165 if (!kgem_check_batch(kgem, 14) ||
166 !kgem_check_bo_fenced(kgem, bo)) {
167 kgem_submit(kgem);
168 if (!kgem_check_bo_fenced(kgem, bo))
170 _kgem_set_mode(kgem, KGEM_BLT);
179 if (!kgem_check_batch(kgem, 24) ||
180 !kgem_check_reloc(kgem, 1)) {
181 _kgem_submit(kgem);
182 if (!kgem_check_bo_fenced(kgem, bo))
184 _kgem_set_mode(kgem, KGEM_BLT);
187 assert(sna->kgem.mode == KGEM_BLT);
188 b = kgem->batch + kgem->nbatch;
189 if (sna->kgem.gen >= 0100) {
199 kgem_add_reloc64(kgem, kgem->nbatch + 4, bo,
208 kgem->nbatch += 10;
213 if (bo->tiling && kgem->gen >= 040)
218 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, bo,
227 kgem->nbatch += 9;
229 assert(kgem->nbatch < kgem->surface);
236 assert(sna->kgem.mode == KGEM_BLT);
243 struct kgem *kgem = &sna->kgem;
246 if (kgem->nreloc) {
247 _kgem_submit(kgem);
248 _kgem_set_mode(kgem, KGEM_BLT);
249 assert(kgem->nbatch == 0);
252 assert(kgem->mode == KGEM_BLT);
253 b = kgem->batch + kgem->nbatch;
254 if (sna->kgem.gen >= 0100) {
264 kgem_add_reloc64(kgem, kgem->nbatch + 4, blt->bo[0],
273 kgem->nbatch += 10;
278 if (blt->bo[0]->tiling && kgem->gen >= 040)
283 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, blt->bo[0],
292 kgem->nbatch += 9;
301 struct kgem *kgem = &sna->kgem;
311 if (!kgem_check_batch(kgem, 3))
314 assert(sna->kgem.mode == KGEM_BLT);
315 b = kgem->batch + kgem->nbatch;
316 kgem->nbatch += 3;
317 assert(kgem->nbatch < kgem->surface);
331 struct kgem *kgem = &sna->kgem;
333 assert(kgem_bo_can_blt (kgem, src));
334 assert(kgem_bo_can_blt (kgem, dst));
339 blt->cmd = XY_SRC_COPY_BLT_CMD | (kgem->gen >= 0100 ? 8 : 6);
344 if (kgem->gen >= 040 && src->tiling) {
351 if (kgem->gen >= 040 && dst->tiling) {
366 kgem_set_mode(kgem, KGEM_BLT, dst);
367 if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL)) {
368 kgem_submit(kgem);
369 if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL))
371 _kgem_set_mode(kgem, KGEM_BLT);
384 struct kgem *kgem = &sna->kgem;
388 assert(kgem_bo_can_blt(kgem, src));
389 assert(kgem_bo_can_blt(kgem, dst));
394 blt->cmd = XY_FULL_MONO_PATTERN_BLT | (kgem->gen >= 0100 ? 12 : 10);
396 if (kgem->gen >= 040 && src->tiling) {
403 if (kgem->gen >= 040 && dst->tiling) {
420 kgem_set_mode(kgem, KGEM_BLT, dst);
421 if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL)) {
422 kgem_submit(kgem);
423 if (!kgem_check_many_bo_fenced(kgem, src, dst, NULL))
425 _kgem_set_mode(kgem, KGEM_BLT);
438 struct kgem *kgem = &sna->kgem;
453 if (!kgem_check_batch(kgem, 14) ||
454 !kgem_check_reloc(kgem, 2)) {
455 _kgem_submit(kgem);
456 _kgem_set_mode(kgem, KGEM_BLT);
459 assert(sna->kgem.mode == KGEM_BLT);
460 b = kgem->batch + kgem->nbatch;
465 if (sna->kgem.gen >= 0100) {
467 kgem_add_reloc64(kgem, kgem->nbatch + 4, blt->bo[1],
475 kgem_add_reloc64(kgem, kgem->nbatch + 8, blt->bo[0],
483 kgem->nbatch += 14;
485 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, blt->bo[1],
492 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, blt->bo[0],
500 kgem->nbatch += 12;
502 assert(kgem->nbatch < kgem->surface);
511 struct kgem *kgem = &sna->kgem;
528 kgem->reloc[kgem->nreloc-1].target_handle == blt->bo[1]->target_handle) {
529 if (sna->kgem.gen >= 0100) {
530 if (kgem->nbatch >= 7 &&
531 kgem->batch[kgem->nbatch-7] == (XY_COLOR_BLT | (blt->cmd & (BLT_DST_TILED | BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 5) &&
532 kgem->batch[kgem->nbatch-5] == ((uint32_t)dst_y << 16 | (uint16_t)dst_x) &&
533 kgem->batch[kgem->nbatch-4] == ((uint32_t)(dst_y+height) << 16 | (uint16_t)(dst_x+width))) {
535 if (kgem_check_batch(kgem, 3)) {
536 assert(kgem->mode == KGEM_BLT);
537 b = kgem->batch + kgem->nbatch - 7;
543 kgem_add_reloc64(kgem, kgem->nbatch + 8 - 7, blt->bo[0],
547 kgem->nbatch += 3;
548 assert(kgem->nbatch < kgem->surface);
551 kgem->nbatch -= 7;
552 kgem->nreloc--;
555 if (kgem->nbatch >= 6 &&
556 kgem->batch[kgem->nbatch-6] == (XY_COLOR_BLT | (blt->cmd & (BLT_DST_TILED | BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 4) &&
557 kgem->batch[kgem->nbatch-4] == ((uint32_t)dst_y << 16 | (uint16_t)dst_x) &&
558 kgem->batch[kgem->nbatch-3] == ((uint32_t)(dst_y+height) << 16 | (uint16_t)(dst_x+width))) {
560 if (kgem_check_batch(kgem, 8-6)) {
561 assert(kgem->mode == KGEM_BLT);
562 b = kgem->batch + kgem->nbatch - 6;
567 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7 - 6, blt->bo[0],
571 kgem->nbatch += 8 - 6;
572 assert(kgem->nbatch < kgem->surface);
575 kgem->nbatch -= 6;
576 kgem->nreloc--;
581 if (!kgem_check_batch(kgem, 10) ||
582 !kgem_check_reloc(kgem, 2)) {
583 _kgem_submit(kgem);
584 _kgem_set_mode(kgem, KGEM_BLT);
587 assert(sna->kgem.mode == KGEM_BLT);
588 b = kgem->batch + kgem->nbatch;
593 if (kgem->gen >= 0100) {
595 kgem_add_reloc64(kgem, kgem->nbatch + 4, blt->bo[1],
603 kgem_add_reloc64(kgem, kgem->nbatch + 8, blt->bo[0],
607 kgem->nbatch += 10;
609 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, blt->bo[1],
616 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, blt->bo[0],
620 kgem->nbatch += 8;
622 assert(kgem->nbatch < kgem->surface);
1069 struct kgem *kgem = &sna->kgem;
1080 if (!kgem_check_batch(kgem, 3))
1083 assert(sna->kgem.mode == KGEM_BLT);
1084 b = kgem->batch + kgem->nbatch;
1085 kgem->nbatch += 3;
1086 assert(kgem->nbatch < kgem->surface);
1097 struct kgem *kgem = &sna->kgem;
1102 if (!kgem_check_batch(kgem, 3))
1106 uint32_t *b = kgem->batch + kgem->nbatch;
1109 assert(sna->kgem.mode == KGEM_BLT);
1111 rem = kgem_batch_space(kgem);
1119 kgem->nbatch += 3 * nbox_this_time;
1120 assert(kgem->nbatch < kgem->surface);
1191 struct kgem *kgem = &sna->kgem;
1198 assert(kgem->mode == KGEM_BLT);
1199 if (!kgem_check_batch(kgem, 3)) {
1205 uint32_t *b = kgem->batch + kgem->nbatch;
1208 assert(sna->kgem.mode == KGEM_BLT);
1210 rem = kgem_batch_space(kgem);
1218 kgem->nbatch += 3 * nbox_this_time;
1219 assert(kgem->nbatch < kgem->surface);
1304 struct kgem *kgem = &sna->kgem;
1313 assert(kgem->mode == KGEM_BLT);
1314 if (!kgem_check_batch(kgem, 3)) {
1320 uint32_t *b = kgem->batch + kgem->nbatch;
1323 assert(sna->kgem.mode == KGEM_BLT);
1325 rem = kgem_batch_space(kgem);
1333 kgem->nbatch += 3 * nbox_this_time;
1334 assert(kgem->nbatch < kgem->surface);
1400 assert(sna->kgem.mode == KGEM_BLT);
1401 if (!kgem_check_bo_fenced(&sna->kgem, op->dst.bo)) {
1402 kgem_submit(&sna->kgem);
1403 if (!kgem_check_bo_fenced(&sna->kgem, op->dst.bo))
1406 _kgem_set_mode(&sna->kgem, KGEM_BLT);
1600 struct kgem *kgem = &sna->kgem;
1621 rem = kgem_batch_space(kgem);
1624 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
1625 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
1631 assert(sna->kgem.mode == KGEM_BLT);
1633 uint32_t *b = kgem->batch + kgem->nbatch;
1650 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, dst_bo,
1657 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, src_bo,
1661 kgem->nbatch += 8;
1662 assert(kgem->nbatch < kgem->surface);
1669 _kgem_submit(kgem);
1670 _kgem_set_mode(kgem, KGEM_BLT);
1677 rem = kgem_batch_space(kgem);
1680 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
1681 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
1687 assert(sna->kgem.mode == KGEM_BLT);
1689 uint32_t *b = kgem->batch + kgem->nbatch;
1706 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, dst_bo,
1713 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, src_bo,
1717 kgem->nbatch += 8;
1718 assert(kgem->nbatch < kgem->surface);
1725 _kgem_submit(kgem);
1726 _kgem_set_mode(kgem, KGEM_BLT);
1736 struct kgem *kgem = &sna->kgem;
1757 rem = kgem_batch_space(kgem);
1760 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
1761 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
1767 assert(kgem->mode == KGEM_BLT);
1769 uint32_t *b = kgem->batch + kgem->nbatch;
1787 kgem_add_reloc64(kgem, kgem->nbatch + 4, dst_bo,
1795 kgem_add_reloc64(kgem, kgem->nbatch + 8, src_bo,
1799 kgem->nbatch += 10;
1800 assert(kgem->nbatch < kgem->surface);
1807 _kgem_submit(kgem);
1808 _kgem_set_mode(kgem, KGEM_BLT);
1815 rem = kgem_batch_space(kgem);
1818 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
1819 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
1825 assert(kgem->mode == KGEM_BLT);
1827 uint32_t *b = kgem->batch + kgem->nbatch;
1845 kgem_add_reloc64(kgem, kgem->nbatch + 4, dst_bo,
1853 kgem_add_reloc64(kgem, kgem->nbatch + 8, src_bo,
1857 kgem->nbatch += 10;
1858 assert(kgem->nbatch < kgem->surface);
1865 _kgem_submit(kgem);
1866 _kgem_set_mode(kgem, KGEM_BLT);
1961 assert(kgem_bo_can_blt(&sna->kgem, op->dst.bo));
1962 assert(kgem_bo_can_blt(&sna->kgem, bo));
1964 kgem_set_mode(&sna->kgem, KGEM_BLT, op->dst.bo);
1965 if (!kgem_check_many_bo_fenced(&sna->kgem, op->dst.bo, bo, NULL)) {
1966 kgem_submit(&sna->kgem);
1967 if (!kgem_check_many_bo_fenced(&sna->kgem,
1974 _kgem_set_mode(&sna->kgem, KGEM_BLT);
1979 if (sna->kgem.gen >= 060 && op->dst.bo == bo)
1997 if (sna->kgem.gen >= 0100)
2563 if (!kgem_bo_can_blt(&sna->kgem, tmp->dst.bo)) {
2569 kgem_bo_undo(&sna->kgem, tmp->dst.bo);
2653 if (!kgem_bo_can_blt(&sna->kgem, tmp->dst.bo)) {
2659 kgem_bo_undo(&sna->kgem, tmp->dst.bo);
2788 if (bo && !kgem_bo_can_blt(&sna->kgem, bo)) {
2823 kgem_bo_pair_undo(&sna->kgem, priv->gpu_bo, priv->cpu_bo);
2837 } else if (!kgem_bo_can_blt(&sna->kgem, bo)) {
2845 } else if (!kgem_bo_can_blt(&sna->kgem, tmp->dst.bo)) {
2892 struct kgem *kgem = &sna->kgem;
2894 assert(kgem->nbatch <= KGEM_BATCH_SIZE(kgem));
2895 if (kgem->nexec > 1 && __kgem_ring_empty(kgem)) {
2897 _kgem_submit(kgem);
2900 kgem_bo_destroy(kgem, op->src.bo);
2906 struct kgem *kgem = &sna->kgem;
2908 if (kgem_check_batch(kgem, 3)) {
2909 uint32_t *b = kgem->batch + kgem->nbatch;
2910 assert(sna->kgem.mode == KGEM_BLT);
2913 kgem->nbatch += 3;
2914 assert(kgem->nbatch < kgem->surface);
2938 if (!kgem_bo_can_blt(&sna->kgem, tmp->dst.bo) ||
2939 !kgem_bo_can_blt(&sna->kgem, tmp->src.bo)) {
3014 kgem_set_mode(&sna->kgem, KGEM_BLT, tmp->dst.bo);
3015 if (!kgem_check_many_bo_fenced(&sna->kgem, tmp->dst.bo, tmp->src.bo, NULL)) {
3016 kgem_submit(&sna->kgem);
3017 if (!kgem_check_many_bo_fenced(&sna->kgem,
3024 _kgem_set_mode(&sna->kgem, KGEM_BLT);
3051 if (sna->kgem.gen >= 060 && tmp->src.bo == tmp->dst.bo)
3129 struct kgem *kgem = &sna->kgem;
3142 if (!kgem_check_batch(kgem, 2))
3146 if (kgem->gen >= 040 && op->base.u.blt.bo[0]->tiling)
3150 uint32_t *b = kgem->batch + kgem->nbatch;
3153 assert(sna->kgem.mode == KGEM_BLT);
3155 rem = kgem_batch_space(kgem);
3161 kgem->nbatch += 2 * n_this_time;
3162 assert(kgem->nbatch < kgem->surface);
3244 if (!kgem_bo_can_blt(&sna->kgem, bo)) {
3254 assert(sna->kgem.mode == KGEM_BLT);
3286 if (!kgem_bo_can_blt(&sna->kgem, src))
3289 if (!kgem_bo_can_blt(&sna->kgem, dst))
3298 if (sna->kgem.gen >= 060 && src == dst)
3312 struct kgem *kgem = &sna->kgem;
3316 assert(kgem_bo_can_blt (kgem, bo));
3324 cmd = XY_COLOR_BLT | (kgem->gen >= 0100 ? 5 : 4);
3326 if (kgem->gen >= 040 && bo->tiling) {
3344 if (sna->kgem.gen >= 0100) {
3345 if (kgem->nbatch >= 7 &&
3346 kgem->batch[kgem->nbatch-7] == cmd &&
3347 *(uint64_t *)&kgem->batch[kgem->nbatch-5] == *(const uint64_t *)box &&
3348 kgem->reloc[kgem->nreloc-1].target_handle == bo->target_handle) {
3350 kgem->batch[kgem->nbatch-6] = br13;
3351 kgem->batch[kgem->nbatch-1] = color;
3354 if (kgem->nbatch >= 10 &&
3355 (kgem->batch[kgem->nbatch-10] & 0xffc00000) == XY_SRC_COPY_BLT_CMD &&
3356 *(uint64_t *)&kgem->batch[kgem->nbatch-8] == *(const uint64_t *)box &&
3357 kgem->reloc[kgem->nreloc-2].target_handle == bo->target_handle) {
3359 kgem->batch[kgem->nbatch-10] = cmd;
3360 kgem->batch[kgem->nbatch-8] = br13;
3361 kgem->batch[kgem->nbatch-4] = color;
3365 kgem->nreloc--;
3366 kgem->nbatch -= 3;
3370 if (kgem->nbatch >= 6 &&
3371 kgem->batch[kgem->nbatch-6] == cmd &&
3372 *(uint64_t *)&kgem->batch[kgem->nbatch-4] == *(const uint64_t *)box &&
3373 kgem->reloc[kgem->nreloc-1].target_handle == bo->target_handle) {
3375 kgem->batch[kgem->nbatch-5] = br13;
3376 kgem->batch[kgem->nbatch-1] = color;
3379 if (kgem->nbatch >= 8 &&
3380 (kgem->batch[kgem->nbatch-8] & 0xffc00000) == XY_SRC_COPY_BLT_CMD &&
3381 *(uint64_t *)&kgem->batch[kgem->nbatch-6] == *(const uint64_t *)box &&
3382 kgem->reloc[kgem->nreloc-2].target_handle == bo->target_handle) {
3384 kgem->batch[kgem->nbatch-8] = cmd;
3385 kgem->batch[kgem->nbatch-7] = br13;
3386 kgem->batch[kgem->nbatch-3] = color;
3390 kgem->nreloc--;
3391 kgem->nbatch -= 2;
3407 kgem_set_mode(kgem, KGEM_BLT, bo);
3408 if (!kgem_check_batch(kgem, 7) ||
3409 !kgem_check_reloc(kgem, 1) ||
3410 !kgem_check_bo_fenced(kgem, bo)) {
3411 kgem_submit(kgem);
3412 if (!kgem_check_bo_fenced(&sna->kgem, bo))
3415 _kgem_set_mode(kgem, KGEM_BLT);
3418 assert(kgem_check_batch(kgem, 6));
3419 assert(kgem_check_reloc(kgem, 1));
3421 assert(sna->kgem.mode == KGEM_BLT);
3422 b = kgem->batch + kgem->nbatch;
3426 if (kgem->gen >= 0100) {
3428 kgem_add_reloc64(kgem, kgem->nbatch + 4, bo,
3434 kgem->nbatch += 7;
3436 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, bo,
3442 kgem->nbatch += 6;
3444 assert(kgem->nbatch < kgem->surface);
3457 struct kgem *kgem = &sna->kgem;
3467 if (!kgem_bo_can_blt(kgem, bo)) {
3486 if (kgem->gen >= 040 && bo->tiling) {
3500 kgem_set_mode(kgem, KGEM_BLT, bo);
3501 if (!kgem_check_batch(kgem, 14) ||
3502 !kgem_check_bo_fenced(kgem, bo)) {
3503 kgem_submit(kgem);
3504 if (!kgem_check_bo_fenced(&sna->kgem, bo))
3506 _kgem_set_mode(kgem, KGEM_BLT);
3515 if (!kgem_check_batch(kgem, 24) ||
3516 !kgem_check_reloc(kgem, 1)) {
3517 _kgem_submit(kgem);
3518 if (!kgem_check_bo_fenced(&sna->kgem, bo))
3520 _kgem_set_mode(kgem, KGEM_BLT);
3523 assert(sna->kgem.mode == KGEM_BLT);
3524 b = kgem->batch + kgem->nbatch;
3525 if (kgem->gen >= 0100) {
3535 kgem_add_reloc64(kgem, kgem->nbatch + 4, bo,
3544 kgem->nbatch += 10;
3549 if (bo->tiling && kgem->gen >= 040)
3554 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, bo,
3563 kgem->nbatch += 9;
3565 assert(kgem->nbatch < kgem->surface);
3576 rem = kgem_batch_space(kgem);
3584 assert(sna->kgem.mode == KGEM_BLT);
3598 b = kgem->batch + kgem->nbatch;
3599 kgem->nbatch += 3;
3600 assert(kgem->nbatch < kgem->surface);
3609 _kgem_submit(kgem);
3610 _kgem_set_mode(kgem, KGEM_BLT);
3612 assert(sna->kgem.mode == KGEM_BLT);
3613 b = kgem->batch + kgem->nbatch;
3614 if (kgem->gen >= 0100) {
3624 kgem_add_reloc64(kgem, kgem->nbatch + 4, bo,
3633 kgem->nbatch += 10;
3638 if (bo->tiling && kgem->gen >= 040)
3643 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, bo,
3652 kgem->nbatch += 9;
3654 assert(kgem->nbatch < kgem->surface);
3655 assert(kgem_check_batch(kgem, 3));
3659 if (kgem->nexec > 1 && __kgem_ring_empty(kgem)) {
3661 _kgem_submit(kgem);
3672 struct kgem *kgem = &sna->kgem;
3685 if (wedged(sna) || !kgem_bo_can_blt(kgem, src_bo) || !kgem_bo_can_blt(kgem, dst_bo)) {
3688 kgem_bo_can_blt(kgem, src_bo),
3689 kgem_bo_can_blt(kgem, dst_bo)));
3698 if (kgem->gen >= 040 && src_bo->tiling) {
3705 if (kgem->gen >= 040 && dst_bo->tiling) {
3721 kgem->reloc[kgem->nreloc-1].target_handle == dst_bo->target_handle) {
3722 if (kgem->gen >= 0100) {
3723 if (kgem->nbatch >= 7 &&
3724 kgem->batch[kgem->nbatch-7] == (XY_COLOR_BLT | (cmd & (BLT_DST_TILED | BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 5) &&
3725 kgem->batch[kgem->nbatch-5] == ((uint32_t)(box->y1 + dst_dy) << 16 | (uint16_t)(box->x1 + dst_dx)) &&
3726 kgem->batch[kgem->nbatch-4] == ((uint32_t)(box->y2 + dst_dy) << 16 | (uint16_t)(box->x2 + dst_dx))) {
3728 kgem->nbatch -= 7;
3729 kgem->nreloc--;
3732 if (kgem->nbatch >= 6 &&
3733 kgem->batch[kgem->nbatch-6] == (XY_COLOR_BLT | (cmd & (BLT_DST_TILED | BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 4) &&
3734 kgem->batch[kgem->nbatch-4] == ((uint32_t)(box->y1 + dst_dy) << 16 | (uint16_t)(box->x1 + dst_dx)) &&
3735 kgem->batch[kgem->nbatch-3] == ((uint32_t)(box->y2 + dst_dy) << 16 | (uint16_t)(box->x2 + dst_dx))) {
3737 kgem->nbatch -= 6;
3738 kgem->nreloc--;
3743 kgem_set_mode(kgem, KGEM_BLT, dst_bo);
3744 if (!kgem_check_batch(kgem, 10) ||
3745 !kgem_check_reloc(kgem, 2) ||
3746 !kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
3747 kgem_submit(kgem);
3748 if (!kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
3755 _kgem_set_mode(kgem, KGEM_BLT);
3759 if (kgem->gen >= 0100) {
3765 rem = kgem_batch_space(kgem);
3768 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
3769 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
3775 assert(sna->kgem.mode == KGEM_BLT);
3777 uint32_t *b = kgem->batch + kgem->nbatch;
3795 kgem_add_reloc64(kgem, kgem->nbatch + 4, dst_bo,
3803 kgem_add_reloc64(kgem, kgem->nbatch + 8, src_bo,
3807 kgem->nbatch += 10;
3808 assert(kgem->nbatch < kgem->surface);
3815 _kgem_submit(kgem);
3816 _kgem_set_mode(kgem, KGEM_BLT);
3824 rem = kgem_batch_space(kgem);
3827 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
3828 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
3834 assert(sna->kgem.mode == KGEM_BLT);
3836 uint32_t *b = kgem->batch + kgem->nbatch;
3853 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, dst_bo,
3860 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, src_bo,
3864 kgem->nbatch += 8;
3865 assert(kgem->nbatch < kgem->surface);
3872 _kgem_submit(kgem);
3873 _kgem_set_mode(kgem, KGEM_BLT);
3877 if (kgem->gen >= 0100) {
3883 rem = kgem_batch_space(kgem);
3886 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
3887 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
3893 assert(sna->kgem.mode == KGEM_BLT);
3895 uint32_t *b = kgem->batch + kgem->nbatch;
3913 kgem_add_reloc64(kgem, kgem->nbatch + 4, dst_bo,
3921 kgem_add_reloc64(kgem, kgem->nbatch + 8, src_bo,
3925 kgem->nbatch += 10;
3926 assert(kgem->nbatch < kgem->surface);
3933 _kgem_submit(kgem);
3934 _kgem_set_mode(kgem, KGEM_BLT);
3942 rem = kgem_batch_space(kgem);
3945 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
3946 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc)/2;
3952 assert(sna->kgem.mode == KGEM_BLT);
3954 uint32_t *b = kgem->batch + kgem->nbatch;
3971 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, dst_bo,
3978 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, src_bo,
3982 kgem->nbatch += 8;
3983 assert(kgem->nbatch < kgem->surface);
3990 _kgem_submit(kgem);
3991 _kgem_set_mode(kgem, KGEM_BLT);
3996 if (kgem->nexec > 1 && __kgem_ring_empty(kgem)) {
3998 _kgem_submit(kgem);
3999 } else if (kgem->gen >= 060 && src_bo == dst_bo && kgem_check_batch(kgem, 3)) {
4000 uint32_t *b = kgem->batch + kgem->nbatch;
4001 assert(sna->kgem.mode == KGEM_BLT);
4004 kgem->nbatch += 3;
4005 assert(kgem->nbatch < kgem->surface);
4018 struct kgem *kgem = &sna->kgem;
4030 if (wedged(sna) || !kgem_bo_can_blt(kgem, src_bo) || !kgem_bo_can_blt(kgem, dst_bo)) {
4033 kgem_bo_can_blt(kgem, src_bo),
4034 kgem_bo_can_blt(kgem, dst_bo)));
4038 cmd = XY_FULL_MONO_PATTERN_BLT | (kgem->gen >= 0100 ? 12 : 10);
4040 if (kgem->gen >= 040 && src_bo->tiling) {
4047 if (kgem->gen >= 040 && dst_bo->tiling) {
4061 kgem_set_mode(kgem, KGEM_BLT, dst_bo);
4062 if (!kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
4069 kgem->reloc[kgem->nreloc-1].target_handle == dst_bo->target_handle) {
4070 if (kgem->gen >= 0100) {
4071 if (kgem->nbatch >= 7 &&
4072 kgem->batch[kgem->nbatch-7] == (XY_COLOR_BLT | (cmd & (BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 5) &&
4073 kgem->batch[kgem->nbatch-5] == ((uint32_t)(box->y1 + dst_dy) << 16 | (uint16_t)(box->x1 + dst_dx)) &&
4074 kgem->batch[kgem->nbatch-4] == ((uint32_t)(box->y2 + dst_dy) << 16 | (uint16_t)(box->x2 + dst_dx))) {
4076 kgem->nbatch -= 7;
4077 kgem->nreloc--;
4080 if (kgem->nbatch >= 6 &&
4081 kgem->batch[kgem->nbatch-6] == (XY_COLOR_BLT | (cmd & (BLT_WRITE_ALPHA | BLT_WRITE_RGB)) | 4) &&
4082 kgem->batch[kgem->nbatch-4] == ((uint32_t)(box->y1 + dst_dy) << 16 | (uint16_t)(box->x1 + dst_dx)) &&
4083 kgem->batch[kgem->nbatch-3] == ((uint32_t)(box->y2 + dst_dy) << 16 | (uint16_t)(box->x2 + dst_dx))) {
4085 kgem->nbatch -= 6;
4086 kgem->nreloc--;
4094 if (!kgem_check_batch(kgem, 14) ||
4095 !kgem_check_reloc(kgem, 2)) {
4096 _kgem_submit(kgem);
4097 _kgem_set_mode(kgem, KGEM_BLT);
4100 assert(sna->kgem.mode == KGEM_BLT);
4101 b = kgem->batch + kgem->nbatch;
4106 if (sna->kgem.gen >= 0100) {
4108 kgem_add_reloc64(kgem, kgem->nbatch + 4, dst_bo,
4116 kgem_add_reloc64(kgem, kgem->nbatch + 8, src_bo,
4124 kgem->nbatch += 14;
4126 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, dst_bo,
4133 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, src_bo,
4141 kgem->nbatch += 12;
4143 assert(kgem->nbatch < kgem->surface);
4147 if (kgem->nexec > 1 && __kgem_ring_empty(kgem)) {
4149 _kgem_submit(kgem);
4193 kgem_bo_blt_pitch_is_ok(&sna->kgem, src_bo)) {
4210 free_bo = kgem_create_2d(&sna->kgem,
4228 kgem_bo_destroy(&sna->kgem, free_bo);
4240 kgem_bo_blt_pitch_is_ok(&sna->kgem, src_bo)) {
4254 kgem_bo_blt_pitch_is_ok(&sna->kgem, dst_bo)) {
4275 kgem_bo_destroy(&sna->kgem, free_bo);