struct kgem_bo * sna_video_buffer(struct sna_video *video, struct sna_video_frame *frame) { /* Free the current buffer if we're going to have to reallocate */ if (video->buf && __kgem_bo_size(video->buf) < frame->size) sna_video_free_buffers(video); if (video->buf && video->buf->scanout) { if (frame->width != video->width || frame->height != video->height || frame->id != video->format) sna_video_free_buffers(video); } if (video->buf == NULL) { if (video->tiled) { video->buf = kgem_create_2d(&video->sna->kgem, frame->width, frame->height, 32, I915_TILING_X, CREATE_EXACT); } else { video->buf = kgem_create_linear(&video->sna->kgem, frame->size, CREATE_GTT_MAP); } } video->width = frame->width; video->height = frame->height; video->format = frame->id; return video->buf; }
struct kgem_bo * sna_video_buffer(struct sna *sna, struct sna_video *video, struct sna_video_frame *frame) { /* Free the current buffer if we're going to have to reallocate */ if (video->buf && __kgem_bo_size(video->buf) < frame->size) sna_video_free_buffers(sna, video); if (video->buf == NULL) video->buf = kgem_create_linear(&sna->kgem, frame->size, CREATE_GTT_MAP); return video->buf; }
struct kgem_bo * sna_video_buffer(struct sna *sna, struct sna_video *video, struct sna_video_frame *frame) { /* Free the current buffer if we're going to have to reallocate */ if (video->buf && __kgem_bo_size(video->buf) < frame->size) sna_video_free_buffers(sna, video); if (video->buf == NULL) { if (video->tiled) { video->buf = kgem_create_2d(&sna->kgem, frame->width, frame->height, 32, I915_TILING_X, CREATE_EXACT); } else { video->buf = kgem_create_linear(&sna->kgem, frame->size, CREATE_GTT_MAP); } } return video->buf; }
static bool download_inplace__cpu(struct kgem *kgem, PixmapPtr p, struct kgem_bo *bo, const BoxRec *box, int nbox) { BoxRec extents; switch (bo->tiling) { case I915_TILING_X: if (!kgem->memcpy_from_tiled_x) return false; case I915_TILING_NONE: break; default: return false; } if (!kgem_bo_can_map__cpu(kgem, bo, false)) return false; if (kgem->has_llc) return true; extents = *box; while (--nbox) { ++box; if (box->x1 < extents.x1) extents.x1 = box->x1; if (box->x2 > extents.x2) extents.x2 = box->x2; extents.y2 = box->y2; } if (extents.x2 - extents.x1 == p->drawable.width && extents.y2 - extents.y1 == p->drawable.height) return true; return __kgem_bo_size(bo) <= PAGE_SIZE; }