Lines Matching refs:sna

47 #include "sna.h"
193 static Bool sna_set_desired_mode(struct sna *sna)
195 ScrnInfoPtr scrn = sna->scrn;
205 sna_mode_check(sna);
217 struct sna *sna = to_sna_from_screen(screen);
224 assert(sna->scrn == xf86ScreenToScrn(screen));
225 assert(sna->scrn->pScreen == screen);
231 sna_accel_create(sna);
234 if (sna->flags & SNA_IS_HOSTED)
260 assert(sna->front == new_front);
263 sna_mode_set_primary(sna);
271 if (intel_get_master(sna->dev) == 0) {
273 if (serverGeneration == 1 && (sna->flags & SNA_IS_HOSTED) == 0)
274 sna_copy_fbcon(sna);
276 (void)sna_set_desired_mode(sna);
310 static bool has_vsync(struct sna *sna)
312 if (sna->flags & SNA_IS_HOSTED)
372 static Bool sna_option_cast_to_bool(struct sna *sna, int id, Bool val)
374 const char *str = xf86GetOptValString(sna->Options, id);
403 static unsigned sna_option_cast_to_unsigned(struct sna *sna, int id, unsigned val)
405 const char *str = xf86GetOptValString(sna->Options, id);
468 static void setup_dri(struct sna *sna)
472 sna->dri2.available = false;
473 sna->dri3.available = false;
475 level = sna_option_cast_to_unsigned(sna, OPTION_DRI, ~0);
478 sna->dri3.available = !!xf86LoadSubModule(sna->scrn, "dri3");
482 sna->dri2.available = !!xf86LoadSubModule(sna->scrn, "dri2");
486 static bool enable_tear_free(struct sna *sna)
488 if (sna->flags & SNA_LINEAR_FB)
495 if (sna_mode_wants_tear_free(sna))
501 static void setup_tear_free(struct sna *sna)
506 if (sna->flags & SNA_LINEAR_FB)
509 if ((sna->flags & SNA_HAS_FLIP) == 0) {
514 if (!xf86GetOptValBool(sna->Options, OPTION_TEAR_FREE, &enable)) {
515 enable = enable_tear_free(sna);
521 sna->flags |= SNA_TEAR_FREE;
524 xf86DrvMsg(sna->scrn->scrnIndex, from, "TearFree %sabled\n",
525 sna->flags & SNA_TEAR_FREE ? "en" : "dis");
543 struct sna *sna;
578 if (posix_memalign((void **)&sna, 4096, sizeof(*sna)))
581 memset(sna, 0, sizeof(*sna)); /* should be unnecessary */
583 sna->info = (void *)((uintptr_t)scrn->driverPrivate & ~3);
584 scrn->driverPrivate = sna;
586 sna->cpu_features = sna_cpu_detect();
587 sna->acpi.fd = sna_acpi_open();
589 sna = to_sna(scrn);
590 sna->scrn = scrn;
591 sna->pEnt = pEnt;
592 sna->flags = probe;
600 sna->dev = intel_get_device(scrn, &fd);
601 if (sna->dev == NULL) {
608 if (hosted() && (sna->flags & SNA_IS_HOSTED) == 0) {
614 intel_detect_chipset(scrn, sna->dev);
616 sna_cpu_features_to_string(sna->cpu_features, buf));
629 if ((sna->flags & SNA_IS_HOSTED) ||
645 sna->Options = intel_options_get(scrn);
646 if (sna->Options == NULL)
651 kgem_init(&sna->kgem, fd,
653 sna->info->gen);
654 if (xf86ReturnOptValBool(sna->Options, OPTION_ACCEL_DISABLE, FALSE) ||
655 !sna_option_cast_to_bool(sna, OPTION_ACCEL_METHOD, TRUE)) {
656 xf86DrvMsg(sna->scrn->scrnIndex, X_CONFIG,
658 sna->kgem.wedged = true;
661 if (xf86ReturnOptValBool(sna->Options, OPTION_TILING_FB, FALSE))
662 sna->flags |= SNA_LINEAR_FB;
664 if (xf86ReturnOptValBool(sna->Options, OPTION_DELETE_DP12, FALSE))
665 sna->flags |= SNA_REMOVE_OUTPUTS;
667 if (!xf86ReturnOptValBool(sna->Options, OPTION_SWAPBUFFERS_WAIT, TRUE))
668 sna->flags |= SNA_NO_WAIT;
669 DBG(("%s: swapbuffer wait? %s\n", __FUNCTION__, sna->flags & SNA_NO_WAIT ? "disabled" : "enabled"));
671 if (!has_vsync(sna) ||
672 !xf86ReturnOptValBool(sna->Options, OPTION_VSYNC, TRUE))
673 sna->flags |= SNA_NO_VSYNC;
674 DBG(("%s: vsync? %s\n", __FUNCTION__, sna->flags & SNA_NO_VSYNC ? "disabled" : "enabled"));
676 if (sna->flags & SNA_IS_HOSTED ||
677 !xf86ReturnOptValBool(sna->Options, OPTION_PAGEFLIP, TRUE))
678 sna->flags |= SNA_NO_FLIP;
679 DBG(("%s: page flips? %s\n", __FUNCTION__, sna->flags & SNA_NO_FLIP ? "disabled" : "enabled"));
681 if ((sna->flags & (SNA_NO_VSYNC | SNA_NO_FLIP | SNA_NO_WAIT)) == 0 &&
682 xf86ReturnOptValBool(sna->Options, OPTION_TRIPLE_BUFFER, TRUE))
683 sna->flags |= SNA_TRIPLE_BUFFER;
684 DBG(("%s: triple buffer? %s\n", __FUNCTION__, sna->flags & SNA_TRIPLE_BUFFER ? "enabled" : "disabled"));
686 if (xf86ReturnOptValBool(sna->Options, OPTION_CRTC_PIXMAPS, FALSE)) {
688 sna->flags |= SNA_FORCE_SHADOW;
691 if (!sna_mode_pre_init(scrn, sna)) {
698 setup_tear_free(sna);
703 setup_dri(sna);
705 sna->present.available = false;
706 if (xf86ReturnOptValBool(sna->Options, OPTION_PRESENT, TRUE)) {
708 sna->present.available = !!xf86LoadSubModule(scrn, "present");
712 sna_acpi_init(sna);
717 scrn->driverPrivate = (void *)((uintptr_t)sna->info | (sna->flags & SNA_IS_SLAVED) | 2);
718 if (sna->dev)
719 intel_put_device(sna->dev);
720 free(sna);
724 static bool has_shadow(struct sna *sna)
726 if (!sna->mode.shadow_damage)
729 if (RegionNil(DamageRegion(sna->mode.shadow_damage)))
732 return sna->mode.flip_active == 0;
739 struct sna *sna = to_sna(xf86Screens[arg]);
741 struct sna *sna = to_sna_from_screen(arg);
755 sna->BlockHandler(BLOCKHANDLER_ARGS);
758 if (*tv == NULL || ((*tv)->tv_usec | (*tv)->tv_sec) || has_shadow(sna))
760 sna_accel_block_handler(sna, tv);
767 struct sna *sna = to_sna(xf86Screens[arg]);
769 struct sna *sna = to_sna_from_screen(arg);
778 sna_acpi_wakeup(sna);
780 sna->WakeupHandler(WAKEUPHANDLER_ARGS);
782 sna_accel_wakeup_handler(sna);
784 sna_mode_wakeup(sna);
791 struct sna *sna = closure;
799 dev = udev_monitor_receive_device(sna->uevent_monitor);
804 if (fstat(sna->kgem.fd, &s) || memcmp(&s.st_rdev, &udev_devnum, sizeof (dev_t))) {
811 ScrnInfoPtr scrn = sna->scrn;
816 sna_mode_discover(sna);
817 sna_mode_check(sna);
820 sna->flags |= SNA_REPROBE;
827 sna_uevent_init(struct sna *sna)
833 if (sna->flags & SNA_IS_HOSTED)
845 if (xf86ReturnOptValBool(sna->Options, OPTION_HOTPLUG, TRUE))
862 sna->uevent_handler = xf86AddGeneralHandler(udev_monitor_get_fd(mon),
863 sna_handle_uevents, sna);
864 if (!sna->uevent_handler)
867 sna->uevent_monitor = mon;
869 xf86DrvMsg(sna->scrn->scrnIndex, from, "display hotplug detection %s\n",
870 sna->uevent_monitor ? "enabled" : "disabled");
880 static bool sna_uevent_poll(struct sna *sna)
884 if (sna->uevent_monitor == NULL)
887 pfd.fd = udev_monitor_get_fd(sna->uevent_monitor);
891 sna_handle_uevents(pfd.fd, sna);
897 sna_uevent_fini(struct sna *sna)
901 if (sna->uevent_handler == NULL)
904 xf86RemoveGeneralHandler(sna->uevent_handler);
906 u = udev_monitor_get_udev(sna->uevent_monitor);
907 udev_monitor_unref(sna->uevent_monitor);
910 sna->uevent_handler = NULL;
911 sna->uevent_monitor = NULL;
916 static void sna_uevent_init(struct sna *sna) { }
917 static bool sna_uevent_poll(struct sna *sna) { return false; }
918 static void sna_uevent_fini(struct sna *sna) { }
924 struct sna *sna = to_sna_from_screen(screen);
926 if (!sna_uevent_poll(sna))
927 sna_mode_discover(sna);
929 return sna->mode.rrGetInfo(screen, rotations);
935 struct sna *sna = to_sna(scrn);
939 sna_accel_leave(sna);
940 sna_mode_reset(sna);
942 if (intel_put_master(sna->dev))
950 struct sna *sna = to_sna(scrn);
956 sna_uevent_fini(sna);
957 sna_mode_close(sna);
959 if (sna->present.open) {
960 sna_present_close(sna, screen);
961 sna->present.open = false;
964 if (sna->dri3.open) {
965 sna_dri3_close(sna, screen);
966 sna->dri3.open = false;
969 if (sna->dri2.open) {
970 sna_dri2_close(sna, screen);
971 sna->dri2.open = false;
974 if (sna->front) {
975 screen->DestroyPixmap(sna->front);
976 sna->front = NULL;
980 intel_put_master(sna->dev);
984 return sna->CloseScreen(CLOSE_SCREEN_ARGS);
989 struct sna *sna = to_sna_from_screen(screen);
995 sna_accel_close(sna);
996 sna_video_close(sna);
1051 static void sna_dri_init(struct sna *sna, ScreenPtr screen)
1055 if (sna->dri2.available)
1056 sna->dri2.open = sna_dri2_open(sna, screen);
1057 if (sna->dri2.open)
1060 if (sna->dri3.available)
1061 sna->dri3.open = sna_dri3_open(sna, screen);
1062 if (sna->dri3.open)
1066 xf86DrvMsg(sna->scrn->scrnIndex, X_INFO,
1071 sna_mode_init(struct sna *sna, ScreenPtr screen)
1084 sna->mode.rrGetInfo = rp->rrGetInfo;
1095 struct sna *sna = to_sna(scrn);
1105 assert(sna->scrn == scrn);
1108 assert(sna->freed_pixmap == NULL);
1113 scrn->videoRam = sna->kgem.aperture_mappable * 4; /* Page to KiB */
1154 if (!sna_accel_init(screen, sna)) {
1167 if (sna_cursors_init(screen, sna))
1174 sna->BlockHandler = screen->BlockHandler;
1177 sna->WakeupHandler = screen->WakeupHandler;
1183 sna->CloseScreen = screen->CloseScreen;
1186 if (!sna_mode_init(sna, screen))
1192 if (sna->mode.num_real_crtc &&
1200 sna_uevent_init(sna);
1201 sna_video_init(sna, screen);
1202 sna_dri_init(sna, screen);
1204 if (sna->present.available)
1205 sna->present.open = sna_present_open(sna, screen);
1206 if (sna->present.open)
1207 xf86DrvMsg(sna->scrn->scrnIndex, X_INFO,
1213 sna->suspended = FALSE;
1228 struct sna *sna = to_sna(scrn);
1230 DBG(("%s [scrn=%p, sna=%p]\n", __FUNCTION__, scrn, sna));
1231 if (sna == NULL || (uintptr_t)sna & 3) /* beware thieves */
1234 scrn->driverPrivate = (void *)((uintptr_t)sna->info | (sna->flags & SNA_IS_SLAVED) | 2);
1236 sna_mode_fini(sna);
1237 sna_acpi_fini(sna);
1239 intel_put_device(sna->dev);
1240 free(sna);
1246 struct sna *sna = to_sna(scrn);
1249 if (intel_get_master(sna->dev))
1252 if (sna->flags & SNA_REPROBE) {
1255 sna_mode_discover(sna);
1257 sna->flags &= ~SNA_REPROBE;
1260 if (!sna_set_desired_mode(sna)) {
1261 intel_put_master(sna->dev);
1265 sna_accel_enter(sna);
1297 struct sna *sna = to_sna(scrn);
1307 if (!undo && !sna->suspended) {
1309 sna->suspended = TRUE;
1311 } else if (undo && sna->suspended) {
1314 sna->suspended = FALSE;
1320 if (sna->suspended) {
1323 sna->suspended = FALSE;