Lines Matching refs:kgem

46 	return width * height * 4 > sna->kgem.max_upload_tile_size;
56 static bool download_inplace__cpu(struct kgem *kgem,
64 if (!kgem->memcpy_from_tiled_x)
72 if (!kgem_bo_can_map__cpu(kgem, bo, false))
75 if (kgem->has_llc)
96 read_boxes_inplace__cpu(struct kgem *kgem,
105 if (!download_inplace__cpu(kgem, dst, bo, box, n))
108 assert(kgem_bo_can_map__cpu(kgem, bo, false));
111 src = kgem_bo_map__cpu(kgem, bo);
115 kgem_bo_sync__cpu_full(kgem, bo, 0);
124 memcpy_from_tiled_x(kgem, src, dst, bpp, src_pitch, dst_pitch,
144 static void read_boxes_inplace(struct kgem *kgem,
153 if (read_boxes_inplace__cpu(kgem, pixmap, bo, box, n))
158 if (!kgem_bo_can_map(kgem, bo))
161 kgem_bo_submit(kgem, bo);
163 src = kgem_bo_map(kgem, bo);
199 static bool download_inplace(struct kgem *kgem,
205 if (unlikely(kgem->wedged))
208 cpu = download_inplace__cpu(kgem, p, bo, box, nbox);
209 if (!cpu && !kgem_bo_can_map(kgem, bo))
218 if (kgem->can_blt_cpu && kgem->max_cpu_size)
221 return !__kgem_bo_is_busy(kgem, bo);
227 struct kgem *kgem = &sna->kgem;
261 if (download_inplace(kgem, dst, src_bo, box, nbox)) {
263 read_boxes_inplace(kgem, dst, src_bo, box, nbox);
267 can_blt = kgem_bo_can_blt(kgem, src_bo) &&
284 if (kgem_bo_can_map(kgem, src_bo)) {
291 if (!can_blt || kgem->ring == KGEM_RENDER ||
316 while (step * step * 4 > sna->kgem.max_upload_tile_size)
355 dst_bo = kgem_create_buffer_2d(kgem,
371 kgem_bo_destroy(&sna->kgem, dst_bo);
377 kgem_bo_submit(&sna->kgem, dst_bo);
378 kgem_buffer_read_sync(kgem, dst_bo);
393 kgem_bo_destroy(&sna->kgem, dst_bo);
400 dst_bo = kgem_create_buffer_2d(kgem,
413 kgem_bo_destroy(&sna->kgem, dst_bo);
417 kgem_bo_submit(&sna->kgem, dst_bo);
418 kgem_buffer_read_sync(kgem, dst_bo);
433 kgem_bo_destroy(&sna->kgem, dst_bo);
449 dst_bo = kgem_create_buffer(kgem, offset, KGEM_BUFFER_LAST, &ptr);
451 read_boxes_inplace(kgem, dst, src_bo, box, nbox);
457 if (kgem->gen >= 040 && src_bo->tiling) {
471 kgem_set_mode(kgem, KGEM_BLT, dst_bo);
472 if (!kgem_check_batch(kgem, 10) ||
473 !kgem_check_reloc_and_exec(kgem, 2) ||
474 !kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
475 kgem_submit(kgem);
476 if (!kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL))
478 _kgem_set_mode(kgem, KGEM_BLT);
484 if (sna->kgem.gen >= 0100) {
490 rem = kgem_batch_space(kgem);
493 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
494 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc) / 2;
498 assert(kgem->mode == KGEM_BLT);
503 uint32_t *b = kgem->batch + kgem->nbatch;
520 kgem_add_reloc64(kgem, kgem->nbatch + 4, dst_bo,
528 kgem_add_reloc64(kgem, kgem->nbatch + 8, src_bo,
532 kgem->nbatch += 10;
537 _kgem_submit(kgem);
541 _kgem_set_mode(kgem, KGEM_BLT);
550 rem = kgem_batch_space(kgem);
553 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
554 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc) / 2;
558 assert(kgem->mode == KGEM_BLT);
563 uint32_t *b = kgem->batch + kgem->nbatch;
579 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, dst_bo,
586 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, src_bo,
590 kgem->nbatch += 8;
595 _kgem_submit(kgem);
599 _kgem_set_mode(kgem, KGEM_BLT);
605 kgem_buffer_read_sync(kgem, dst_bo);
638 kgem_bo_destroy(kgem, dst_bo);
642 static bool upload_inplace__tiled(struct kgem *kgem, struct kgem_bo *bo)
649 if (!kgem->memcpy_to_tiled_x)
655 if (kgem->has_wc_mmap)
658 return kgem_bo_can_map__cpu(kgem, bo, true);
662 write_boxes_inplace__tiled(struct kgem *kgem,
669 assert(kgem->has_wc_mmap || kgem_bo_can_map__cpu(kgem, bo, true));
672 if (kgem_bo_can_map__cpu(kgem, bo, true)) {
673 dst = kgem_bo_map__cpu(kgem, bo);
677 kgem_bo_sync__cpu(kgem, bo);
679 dst = kgem_bo_map__wc(kgem, bo);
683 kgem_bo_sync__gtt(kgem, bo);
691 memcpy_to_tiled_x(kgem, src, dst, bpp, stride, bo->pitch,
711 static bool write_boxes_inplace(struct kgem *kgem,
721 if (upload_inplace__tiled(kgem, bo) &&
722 write_boxes_inplace__tiled(kgem, src, stride, bpp, src_dx, src_dy,
726 if (!kgem_bo_can_map(kgem, bo))
729 kgem_bo_submit(kgem, bo);
731 dst = kgem_bo_map(kgem, bo);
771 static bool __upload_inplace(struct kgem *kgem,
790 if (__kgem_bo_is_busy(kgem, bo))
791 return bytes * bpp >> 12 >= kgem->half_cpu_cache_pages;
796 static bool upload_inplace(struct kgem *kgem,
801 if (unlikely(kgem->wedged))
804 if (!kgem_bo_can_map(kgem, bo) && !upload_inplace__tiled(kgem, bo))
807 return __upload_inplace(kgem, bo, box, n,bpp);
815 struct kgem *kgem = &sna->kgem;
825 if (upload_inplace(kgem, dst_bo, box, nbox, dst->drawable.bitsPerPixel) &&
826 write_boxes_inplace(kgem,
835 can_blt = kgem_bo_can_blt(kgem, dst_bo) &&
854 if (!can_blt || kgem->ring == KGEM_RENDER ||
879 while (step * step * cpp > sna->kgem.max_upload_tile_size)
911 src_bo = kgem_create_buffer_2d(kgem,
959 kgem_bo_destroy(&sna->kgem, src_bo);
972 src_bo = kgem_create_buffer_2d(kgem,
1008 kgem_bo_destroy(&sna->kgem, src_bo);
1019 if (kgem->gen >= 040 && dst_bo->tiling) {
1032 kgem_set_mode(kgem, KGEM_BLT, dst_bo);
1033 if (!kgem_check_batch(kgem, 10) ||
1034 !kgem_check_reloc_and_exec(kgem, 2) ||
1035 !kgem_check_bo_fenced(kgem, dst_bo)) {
1036 kgem_submit(kgem);
1037 if (!kgem_check_bo_fenced(kgem, dst_bo))
1039 _kgem_set_mode(kgem, KGEM_BLT);
1042 if (kgem->gen >= 0100) {
1048 rem = kgem_batch_space(kgem);
1051 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
1052 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc) / 2;
1066 src_bo = kgem_create_buffer(kgem, offset,
1101 assert(kgem->mode == KGEM_BLT);
1102 b = kgem->batch + kgem->nbatch;
1108 kgem_add_reloc64(kgem, kgem->nbatch + 4, dst_bo,
1116 kgem_add_reloc64(kgem, kgem->nbatch + 8, src_bo,
1120 kgem->nbatch += 10;
1130 _kgem_submit(kgem);
1131 _kgem_set_mode(kgem, KGEM_BLT);
1134 kgem_bo_destroy(kgem, src_bo);
1142 rem = kgem_batch_space(kgem);
1145 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
1146 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc) / 2;
1160 src_bo = kgem_create_buffer(kgem, offset,
1167 kgem_bo_destroy(kgem, src_bo);
1199 assert(kgem->mode == KGEM_BLT);
1200 b = kgem->batch + kgem->nbatch;
1205 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, dst_bo,
1212 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, src_bo,
1216 kgem->nbatch += 8;
1225 _kgem_submit(kgem);
1226 _kgem_set_mode(kgem, KGEM_BLT);
1229 kgem_bo_destroy(kgem, src_bo);
1237 return write_boxes_inplace(kgem,
1244 write_boxes_inplace__xor(struct kgem *kgem,
1254 if (!kgem_bo_can_map(kgem, bo))
1257 kgem_bo_submit(kgem, bo);
1259 dst = kgem_bo_map(kgem, bo);
1298 static bool upload_inplace__xor(struct kgem *kgem,
1303 if (unlikely(kgem->wedged))
1306 if (!kgem_bo_can_map(kgem, bo))
1309 return __upload_inplace(kgem, bo, box, n, bpp);
1318 struct kgem *kgem = &sna->kgem;
1328 if (upload_inplace__xor(kgem, dst_bo, box, nbox, dst->drawable.bitsPerPixel) &&
1329 write_boxes_inplace__xor(kgem,
1339 can_blt = kgem_bo_can_blt(kgem, dst_bo) &&
1358 if (!can_blt || kgem->ring == KGEM_RENDER ||
1382 while (step * step * 4 > sna->kgem.max_upload_tile_size)
1411 src_bo = kgem_create_buffer_2d(kgem,
1461 kgem_bo_destroy(&sna->kgem, src_bo);
1474 src_bo = kgem_create_buffer_2d(kgem,
1511 kgem_bo_destroy(&sna->kgem, src_bo);
1522 if (kgem->gen >= 040 && dst_bo->tiling) {
1535 kgem_set_mode(kgem, KGEM_BLT, dst_bo);
1536 if (!kgem_check_batch(kgem, 10) ||
1537 !kgem_check_reloc_and_exec(kgem, 2) ||
1538 !kgem_check_bo_fenced(kgem, dst_bo)) {
1539 kgem_submit(kgem);
1540 if (!kgem_check_bo_fenced(kgem, dst_bo))
1542 _kgem_set_mode(kgem, KGEM_BLT);
1545 if (sna->kgem.gen >= 0100) {
1551 rem = kgem_batch_space(kgem);
1554 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
1555 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc) / 2;
1569 src_bo = kgem_create_buffer(kgem, offset,
1576 kgem_bo_destroy(kgem, src_bo);
1609 assert(kgem->mode == KGEM_BLT);
1610 b = kgem->batch + kgem->nbatch;
1616 kgem_add_reloc64(kgem, kgem->nbatch + 4, dst_bo,
1624 kgem_add_reloc64(kgem, kgem->nbatch + 8, src_bo,
1628 kgem->nbatch += 10;
1637 _kgem_submit(kgem);
1638 _kgem_set_mode(kgem, KGEM_BLT);
1641 kgem_bo_destroy(kgem, src_bo);
1649 rem = kgem_batch_space(kgem);
1652 if (2*nbox_this_time > KGEM_RELOC_SIZE(kgem) - kgem->nreloc)
1653 nbox_this_time = (KGEM_RELOC_SIZE(kgem) - kgem->nreloc) / 2;
1667 src_bo = kgem_create_buffer(kgem, offset,
1674 kgem_bo_destroy(kgem, src_bo);
1707 assert(kgem->mode == KGEM_BLT);
1708 b = kgem->batch + kgem->nbatch;
1713 b[4] = kgem_add_reloc(kgem, kgem->nbatch + 4, dst_bo,
1720 b[7] = kgem_add_reloc(kgem, kgem->nbatch + 7, src_bo,
1724 kgem->nbatch += 8;
1733 _kgem_submit(kgem);
1734 _kgem_set_mode(kgem, KGEM_BLT);
1737 kgem_bo_destroy(kgem, src_bo);
1745 return write_boxes_inplace__xor(kgem,
1758 struct kgem *kgem = &sna->kgem;
1767 kgem->half_cpu_cache_pages));
1769 if (stride * pixmap->drawable.height >> 12 > kgem->half_cpu_cache_pages)
1772 if (!kgem_bo_can_blt(kgem, bo) &&
1776 src_bo = kgem_create_buffer_2d(kgem,
1805 kgem_bo_destroy(kgem, src_bo);
1824 __kgem_bo_is_busy(&sna->kgem, bo)));
1828 kgem_bo_undo(&sna->kgem, bo);
1830 if (__kgem_bo_is_busy(&sna->kgem, bo)) {
1836 new_bo = kgem_create_2d(&sna->kgem,
1847 kgem_bo_write(&sna->kgem, bo, src,
1851 if (upload_inplace__tiled(&sna->kgem, bo)) {
1858 if (write_boxes_inplace__tiled(&sna->kgem, src,
1864 if (kgem_bo_can_map(&sna->kgem, bo) &&
1865 (dst = kgem_bo_map(&sna->kgem, bo)) != NULL &&
1878 kgem_bo_destroy(&sna->kgem, bo);
1896 kgem_bo_destroy(&sna->kgem, priv->gpu_bo);
1921 kgem_bo_undo(&sna->kgem, bo);
1923 if (!kgem_bo_can_map(&sna->kgem, bo) ||
1924 __kgem_bo_is_busy(&sna->kgem, bo)) {
1927 new_bo = kgem_create_2d(&sna->kgem,
1937 if (kgem_bo_can_map(&sna->kgem, bo) &&
1938 (dst = kgem_bo_map(&sna->kgem, bo)) != NULL &&
1952 kgem_bo_destroy(&sna->kgem, bo);
1970 kgem_bo_destroy(&sna->kgem, priv->gpu_bo);