Lines Matching defs:sna_crtc
192 struct sna_crtc {
316 static void sna_crtc_disable_cursor(struct sna *sna, struct sna_crtc *crtc);
317 static bool sna_crtc_flip(struct sna *sna, struct sna_crtc *crtc,
417 static inline struct sna_crtc *to_sna_crtc(xf86CrtcPtr crtc)
422 static inline unsigned __sna_crtc_pipe(struct sna_crtc *crtc)
427 static inline unsigned __sna_crtc_id(struct sna_crtc *crtc)
470 static struct plane *lookup_sprite(struct sna_crtc *crtc, unsigned idx)
497 static inline bool msc64(struct sna_crtc *sna_crtc, uint32_t seq, uint64_t *msc)
500 if (seq < sna_crtc->last_seq) {
501 if (sna_crtc->last_seq - seq > 0x40000000) {
502 sna_crtc->wrap_seq++;
504 __FUNCTION__, __sna_crtc_pipe(sna_crtc),
505 sna_crtc->last_seq, seq, sna_crtc->wrap_seq));
508 __FUNCTION__, __sna_crtc_pipe(sna_crtc), sna_crtc->last_seq, seq));
513 *msc = (uint64_t)sna_crtc->wrap_seq << 32 | seq;
520 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
523 assert(sna_crtc);
525 if (msc64(sna_crtc, seq, &msc)) {
527 __FUNCTION__, __sna_crtc_pipe(sna_crtc), seq, (long long)msc,
529 sna_crtc->swap.tv_sec = tv_sec;
530 sna_crtc->swap.tv_usec = tv_usec;
531 sna_crtc->swap.msc = msc;
534 __FUNCTION__, __sna_crtc_pipe(sna_crtc), seq, (long long)msc,
548 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
549 assert(sna_crtc);
550 return &sna_crtc->swap;
575 static void assert_crtc_fb(struct sna *sna, struct sna_crtc *crtc)
1513 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
1523 __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc),
1524 sna_crtc->bo->handle));
1525 if (!sna_crtc->kmode.clock) {
1527 __FUNCTION__, __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc)));
1535 sna_crtc_disable_cursor(sna, sna_crtc);
1537 if (!rotation_set(sna, &sna_crtc->primary, sna_crtc->rotation)) {
1539 arg.crtc_id = __sna_crtc_id(sna_crtc);
1543 if (!rotation_set(sna, &sna_crtc->primary, sna_crtc->rotation)) {
1545 __FUNCTION__, sna_crtc->primary.rotation.prop, sna_crtc->rotation, __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc), errno));
1546 sna_crtc->primary.rotation.supported &= ~sna_crtc->rotation;
1550 __FUNCTION__, __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc), sna_crtc->rotation));
1575 __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc),
1579 assert(output->possible_crtcs & (1 << __sna_crtc_pipe(sna_crtc)) ||
1595 arg.crtc_id = __sna_crtc_id(sna_crtc);
1596 arg.fb_id = fb_id(sna_crtc->bo);
1597 if (sna_crtc->transform || sna_crtc->slave_pixmap) {
1600 sna_crtc->offset = 0;
1604 sna_crtc->offset = arg.y << 16 | arg.x;
1608 arg.mode = sna_crtc->kmode;
1612 __FUNCTION__, __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc),
1618 sna_crtc->shadow ? " [shadow]" : "",
1619 sna_crtc->transform ? " [transformed]" : "",
1628 sna_crtc->mode_serial++;
1720 struct sna_crtc *crtc;
1761 struct sna_crtc *crtc;
1816 struct sna_crtc *crtc =
1817 list_first_entry(&sna->mode.shadow_crtc, struct sna_crtc, shadow_link);
2016 struct sna_crtc *crtc = closure;
2035 static bool sna_crtc_enable_shadow(struct sna *sna, struct sna_crtc *crtc)
2074 static void sna_crtc_disable_override(struct sna *sna, struct sna_crtc *crtc)
2100 static void sna_crtc_disable_shadow(struct sna *sna, struct sna_crtc *crtc)
2125 __sna_crtc_disable(struct sna *sna, struct sna_crtc *sna_crtc)
2127 sna_crtc->mode_serial++;
2129 sna_crtc_disable_cursor(sna, sna_crtc);
2130 rotation_set(sna, &sna_crtc->primary, RR_Rotate_0);
2131 sna_crtc_disable_shadow(sna, sna_crtc);
2133 if (sna_crtc->bo) {
2135 __FUNCTION__,sna_crtc->bo->handle, sna_crtc->bo->active_scanout-1));
2136 assert(sna_crtc->public.flags & CRTC_ON);
2137 assert(sna_crtc->bo->active_scanout);
2138 assert(sna_crtc->bo->refcnt >= sna_crtc->bo->active_scanout);
2139 sna_crtc->bo->active_scanout--;
2140 kgem_bo_destroy(&sna->kgem, sna_crtc->bo);
2141 sna_crtc->bo = NULL;
2142 sna_crtc->public.flags &= ~CRTC_ON;
2155 if (sna_crtc->shadow_bo) {
2156 kgem_bo_destroy(&sna->kgem, sna_crtc->shadow_bo);
2157 sna_crtc->shadow_bo = NULL;
2159 if (sna_crtc->transform) {
2162 sna_crtc->transform = false;
2165 sna_crtc->cursor_transform = false;
2166 sna_crtc->hwcursor = true;
2167 assert(!sna_crtc->shadow);
2174 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
2177 if (sna_crtc == NULL)
2180 if (!force && sna_crtc->bo == NULL)
2184 __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc), force));
2189 arg.crtc_id = __sna_crtc_id(sna_crtc);
2192 __sna_crtc_disable(sna, sna_crtc);
2291 struct sna_crtc *crtc = to_sna_crtc(config->crtc[i]);
2575 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
2580 if (sna_crtc->transform) {
2582 sna_crtc->transform = false;
2585 sna_crtc->rotation = RR_Rotate_0;
2587 if (sna_crtc->cache_bo) {
2588 kgem_bo_destroy(&sna->kgem, sna_crtc->cache_bo);
2589 sna_crtc->cache_bo = NULL;
2598 if (!sna_crtc_enable_shadow(sna, sna_crtc)) {
2606 bo = sna_crtc->shadow_bo;
2608 if (sna_crtc->shadow_bo_width == crtc->mode.HDisplay &&
2609 sna_crtc->shadow_bo_height == crtc->mode.VDisplay) {
2616 sna_crtc->shadow_bo = NULL;
2652 front = sna_crtc->slave_pixmap ?: sna->front;
2697 sna_crtc->shadow_bo_width = crtc->mode.HDisplay;
2698 sna_crtc->shadow_bo_height = crtc->mode.VDisplay;
2699 sna_crtc->shadow_bo = bo;
2701 sna_crtc->transform = true;
2705 if (sna_crtc->shadow_bo) {
2706 kgem_bo_destroy(&sna->kgem, sna_crtc->shadow_bo);
2707 sna_crtc->shadow_bo = NULL;
2710 if (sna_crtc->slave_pixmap) {
2712 bo = get_scanout_bo(sna, sna_crtc->slave_pixmap);
2715 sna_crtc->fallback_shadow = true;
2720 sna_crtc->slave_pixmap->drawable.width,
2721 sna_crtc->slave_pixmap->drawable.height)) {
2723 sna_crtc->fallback_shadow = true;
2731 sna_crtc->fallback_shadow = true;
2737 sna_crtc->fallback_shadow = true;
2745 assert(sna_crtc->slave_pixmap == NULL);
2754 if (!sna_crtc_enable_shadow(sna, sna_crtc)) {
2775 sna_crtc->fallback_shadow = true;
2784 sna_crtc->fallback_shadow = true;
2795 sna_crtc_disable_override(sna, sna_crtc);
2797 sna_crtc_disable_shadow(sna, sna_crtc);
2799 sna_crtc->rotation = rotation_reduce(&sna_crtc->primary, crtc->rotation);
2800 assert(sna_crtc->primary.rotation.supported & sna_crtc->rotation);
2838 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
2862 if (sna_crtc->transform) {
2879 crtc->transform_in_use = sna_crtc->rotation != RR_Rotate_0;
2882 if (sna_crtc->cursor) {
2883 assert(sna_crtc->cursor->ref > 0);
2884 sna_crtc->cursor->ref--;
2885 sna_crtc->cursor = NULL;
2889 sna_crtc->hwcursor = is_affine(&f_fb_to_crtc);
2890 sna_crtc->cursor_transform =
2891 sna_crtc->hwcursor &&
2894 sna_crtc->hwcursor = true;
2895 sna_crtc->cursor_transform = false;
2898 __FUNCTION__, sna_crtc->hwcursor, sna_crtc->cursor_transform));
3033 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
3042 __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc), sna->mode.hidden));
3046 saved_bo = sna_crtc->bo;
3047 saved_transform = sna_crtc->transform;
3048 saved_cursor_transform = sna_crtc->cursor_transform;
3049 saved_hwcursor = sna_crtc->hwcursor;
3050 saved_offset = sna_crtc->offset;
3052 sna_crtc->fallback_shadow = false;
3067 sna_crtc->bo = bo;
3072 if (!sna_crtc->fallback_shadow) {
3073 sna_crtc->fallback_shadow = true;
3082 sna_crtc->public.flags |= CRTC_ON;
3095 if (sna_crtc->transform)
3097 if (sna_crtc->cursor && /* Reload cursor if RandR maybe changed */
3098 (!sna_crtc->hwcursor ||
3099 saved_cursor_transform || sna_crtc->cursor_transform ||
3100 sna_crtc->cursor->rotation != crtc->rotation))
3101 sna_crtc_disable_cursor(sna, sna_crtc);
3112 sna_crtc->offset = saved_offset;
3113 if (sna_crtc->transform) {
3119 sna_crtc->transform = saved_transform;
3120 sna_crtc->cursor_transform = saved_cursor_transform;
3121 sna_crtc->hwcursor = saved_hwcursor;
3122 sna_crtc->bo = saved_bo;
3133 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
3140 assert(sna_crtc);
3145 outputs_for_crtc(crtc, outputs, sizeof(outputs)), __sna_crtc_pipe(sna_crtc),
3152 drmModeCrtcSetGamma(sna->kgem.fd, __sna_crtc_id(sna_crtc),
3159 saved_kmode = sna_crtc->kmode;
3160 mode_to_kmode(&sna_crtc->kmode, mode);
3164 sna_crtc->kmode = saved_kmode;
3225 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
3228 if (sna_crtc == NULL)
3231 list_for_each_entry_safe(sprite, sn, &sna_crtc->sprites, link)
3234 free(sna_crtc);
3242 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
3244 if (sna_crtc == NULL)
3247 if (pixmap == sna_crtc->slave_pixmap)
3251 __FUNCTION__, __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc),
3255 sna_crtc_disable_shadow(to_sna(crtc->scrn), sna_crtc);
3257 sna_crtc->slave_pixmap = pixmap;
3468 static void add_sprite_plane(struct sna_crtc *crtc,
3480 sna_crtc_find_planes(struct sna *sna, struct sna_crtc *crtc)
3584 struct sna_crtc *sna_crtc = to_sna_crtc(config->crtc[i]);
3587 list_for_each_entry(plane, &sna_crtc->sprites, link) {
3638 sna_crtc_init__rotation(struct sna *sna, struct sna_crtc *crtc)
3646 sna_crtc_init__cursor(struct sna *sna, struct sna_crtc *crtc)
3665 struct sna_crtc *sna_crtc;
3670 sna_crtc = calloc(sizeof(struct sna_crtc), 1);
3671 if (sna_crtc == NULL)
3674 list_init(&sna_crtc->public.vblank_queue);
3675 sna_crtc->id = id;
3683 free(sna_crtc);
3687 sna_crtc->public.flags |= get_pipe.pipe << 8;
3691 free(sna_crtc);
3695 list_init(&sna_crtc->sprites);
3696 sna_crtc_init__rotation(sna, sna_crtc);
3697 sna_crtc_find_planes(sna, sna_crtc);
3701 sna_crtc->primary.id, sna_crtc->primary.rotation.supported, sna_crtc->primary.rotation.current));
3703 list_init(&sna_crtc->shadow_link);
3707 free(sna_crtc);
3711 sna_crtc_init__cursor(sna, sna_crtc);
3713 crtc->driver_private = sna_crtc;
3714 sna_crtc->base = crtc;
3716 __FUNCTION__, id, __sna_crtc_pipe(sna_crtc)));
5483 struct sna_crtc *crtc = to_sna_crtc(output->base->crtc);
6333 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
6337 assert(sna_crtc != NULL);
6338 if (sna_crtc->bo == NULL)
6349 (sna_crtc->cursor == cursor && sna_crtc->last_cursor_size == cursor->size)) {
6360 arg.crtc_id = __sna_crtc_id(sna_crtc);
6366 if (sna_crtc->cursor) {
6367 assert(sna_crtc->cursor->ref > 0);
6368 sna_crtc->cursor->ref--;
6371 sna_crtc->cursor = cursor;
6372 sna_crtc->last_cursor_size = cursor->size;
6417 sna_crtc_disable_cursor(struct sna *sna, struct sna_crtc *crtc)
6522 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
6526 assert(sna_crtc != NULL);
6530 arg.crtc_id = __sna_crtc_id(sna_crtc);
6533 if (sna_crtc->bo == NULL)
6538 cursor = sna_crtc->cursor;
6557 pixman_f_transform_point(&sna_crtc->fb_to_cursor, &hot);
6568 if (sna_crtc->cursor != cursor || sna_crtc->last_cursor_size != cursor->size) {
6579 if (sna_crtc->cursor) {
6587 __FUNCTION__, __sna_crtc_id(sna_crtc), arg.x, arg.y, arg.handle, arg.flags, sna_crtc->cursor ? sna_crtc->cursor->handle : 0,
6596 if (sna_crtc->cursor) {
6597 assert(sna_crtc->cursor->ref > 0);
6598 sna_crtc->cursor->ref--;
6600 sna_crtc->cursor = cursor;
6602 sna_crtc->last_cursor_size = cursor->size;
6605 sna_crtc->last_cursor_size = 0;
6905 sna_crtc_flip(struct sna *sna, struct sna_crtc *crtc, struct kgem_bo *bo, int x, int y)
7007 struct sna_crtc *crtc = config->crtc[i]->driver_private;
7051 struct sna_crtc *crtc = config->crtc[i]->driver_private;
7260 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
7264 assert(sna_crtc);
7266 lut.crtc_id = __sna_crtc_id(sna_crtc);
7280 __FUNCTION__, __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc),
7365 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
7375 mode.crtc_id = __sna_crtc_id(sna_crtc);
7380 __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc),
7387 crtc->desiredRotation = sna_crtc->primary.rotation.current;
8444 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
8447 list_for_each_entry(plane, &sna_crtc->sprites, link) {
8493 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
8497 assert(sna_crtc);
8500 assert(sna_crtc->bo == NULL || crtc->active);
8502 expected[0] = sna_crtc->bo ? fb_id(sna_crtc->bo) : 0;
8503 expected[1] = sna_crtc->flip_bo ? fb_id(sna_crtc->flip_bo) : -1;
8506 mode.crtc_id = __sna_crtc_id(sna_crtc);
8540 sna_crtc_hide_planes(struct sna *sna, struct sna_crtc *crtc)
8579 struct sna_crtc *sna_crtc = to_sna_crtc(config->crtc[i]);
8582 assert(sna_crtc != NULL);
8585 rotation_reset(&sna_crtc->primary);
8586 list_for_each_entry(plane, &sna_crtc->sprites, link)
8630 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
8631 if (sna_crtc->slave_pixmap) {
8634 sna_crtc->slave_pixmap->drawable.serialNumber,
8638 return &sna_crtc->slave_pixmap->drawable;
8971 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
8974 assert(sna_crtc);
8976 __FUNCTION__, __sna_crtc_id(sna_crtc), bo->handle));
8979 assert(!sna_crtc->transform);
8981 if (sna_crtc->client_bo != bo) {
8982 if (sna_crtc->client_bo) {
8983 assert(sna_crtc->client_bo->refcnt >= sna_crtc->client_bo->active_scanout);
8984 sna_crtc->client_bo->active_scanout--;
8985 kgem_bo_destroy(&sna->kgem, sna_crtc->client_bo);
8988 sna_crtc->client_bo = kgem_bo_reference(bo);
8989 sna_crtc->client_bo->active_scanout++;
8990 assert(sna_crtc->client_bo->refcnt >= sna_crtc->client_bo->active_scanout);
8994 list_move(&sna_crtc->shadow_link, &sna->mode.shadow_crtc);
9008 struct sna_crtc *crtc =
9010 struct sna_crtc,
9025 struct sna_crtc *crtc =
9027 struct sna_crtc,
9037 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
9040 __FUNCTION__, __sna_crtc_id(sna_crtc)));
9042 if (sna_crtc->client_bo == NULL)
9045 assert(sna_crtc->client_bo->refcnt >= sna_crtc->client_bo->active_scanout);
9046 sna_crtc->client_bo->active_scanout--;
9047 kgem_bo_destroy(&sna->kgem, sna_crtc->client_bo);
9048 sna_crtc->client_bo = NULL;
9049 list_del(&sna_crtc->shadow_link);
9061 struct sna_crtc *crtc = to_sna_crtc(config->crtc[i]);
9139 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
9142 assert(sna_crtc != NULL);
9143 if (!sna_crtc->shadow)
9147 assert(sna_crtc->transform || sna->flags & SNA_TEAR_FREE);
9154 __FUNCTION__, __sna_crtc_pipe(sna_crtc),
9160 sna_crtc->bo);
9164 if (sna_crtc->slave_damage)
9165 DamageEmpty(sna_crtc->slave_damage);
9199 struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
9203 assert(sna_crtc != NULL);
9205 __FUNCTION__, i, sna_crtc->transform));
9207 if (!sna_crtc->transform)
9211 assert(sna_crtc->bo);
9233 bo = sna_crtc->cache_bo;
9241 sna_crtc->bo->tiling,
9246 RegionUnion(&damage, &damage, &sna_crtc->crtc_damage);
9247 sna_crtc->crtc_damage = new_damage;
9253 assert_crtc_fb(sna, sna_crtc);
9254 arg.crtc_id = __sna_crtc_id(sna_crtc);
9261 arg.user_data = (uintptr_t)sna_crtc;
9266 if (sna_crtc_flip(sna, sna_crtc, bo, 0, 0)) {
9268 __FUNCTION__, sna_crtc->bo->handle, sna_crtc->bo->active_scanout - 1,
9270 assert(sna_crtc->bo->active_scanout);
9271 assert(sna_crtc->bo->refcnt >= sna_crtc->bo->active_scanout);
9272 sna_crtc->bo->active_scanout--;
9273 kgem_bo_destroy(&sna->kgem, sna_crtc->bo);
9275 sna_crtc->bo = kgem_bo_reference(bo);
9276 sna_crtc->bo->active_scanout++;
9282 __FUNCTION__, arg.fb_id, i, __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc), errno));
9297 &tmp, sna_crtc->bo, 0, 0,
9301 __FUNCTION__, __sna_crtc_id(sna_crtc), __sna_crtc_pipe(sna_crtc));
9307 sna_crtc->cache_bo = NULL;
9312 assert(sna_crtc->flip_bo == NULL);
9313 sna_crtc->flip_handler = shadow_flip_handler;
9314 sna_crtc->flip_data = sna;
9315 sna_crtc->flip_bo = bo;
9316 sna_crtc->flip_bo->active_scanout++;
9317 sna_crtc->flip_serial = sna_crtc->mode_serial;
9318 sna_crtc->flip_pending = true;
9320 if (sna_crtc->bo != sna->mode.shadow) {
9321 assert_scanout(&sna->kgem, sna_crtc->bo,
9323 sna_crtc->cache_bo = kgem_bo_reference(sna_crtc->bo);
9326 __FUNCTION__, __sna_crtc_id(sna_crtc), sna_crtc->flip_bo->handle, sna_crtc->flip_bo->active_scanout, sna_crtc->flip_serial));
9328 sna_crtc_redisplay(crtc, &damage, sna_crtc->bo);
9329 kgem_scanout_flush(&sna->kgem, sna_crtc->bo);
9335 if (sna_crtc->slave_damage)
9336 DamageEmpty(sna_crtc->slave_damage);
9360 struct sna_crtc *crtc = config->crtc[i]->driver_private;
9562 struct sna_crtc *crtc = (void *)(uintptr_t)vbl->user_data;