131
132
ScrnInfoPtr scrn = sna->scrn;
132
133
struct drm_mode_fb_cmd arg;
134
136
assert(bo->proxy == NULL);
136
138
DBG(("%s: reusing fb=%d for handle=%d\n",
152
154
arg.depth = scrn->depth;
153
155
arg.handle = bo->handle;
157
assert(sna->scrn->vtSema); /* must be master */
155
158
if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_ADDFB, &arg)) {
156
159
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
157
160
"%s: failed to add fb: %dx%d depth=%d, bpp=%d, pitch=%d: %d\n",
319
sna_output_backlight_init(xf86OutputPtr output)
322
has_device_backlight(xf86OutputPtr output, int *best_type)
324
struct sna_output *sna_output = output->driver_private;
325
struct sna *sna = to_sna(output->scrn);
326
struct pci_device *pci = sna->PciInfo;
328
char *best_iface = NULL;
332
snprintf(path, sizeof(path),
333
"/sys/bus/pci/devices/%04x:%02x:%02x.%d/backlight",
334
pci->domain, pci->bus, pci->dev, pci->func);
336
DBG(("%s: scanning %s\n", __FUNCTION__, path));
341
while ((de = readdir(dir))) {
345
if (*de->d_name == '.')
348
DBG(("%s: %s\n", __FUNCTION__, de->d_name));
349
snprintf(path, sizeof(path), "%s/%s/type",
350
BACKLIGHT_CLASS, de->d_name);
353
fd = open(path, O_RDONLY);
355
v = read(fd, buf, sizeof(buf)-1);
359
while (v > 0 && isspace(buf[v-1]))
363
if (strcmp(buf, "raw") == 0)
365
else if (strcmp(buf, "platform") == 0)
367
else if (strcmp(buf, "firmware") == 0)
374
if (v < *best_type) {
378
sna_output->backlight_iface = de->d_name;
379
max = sna_output_backlight_get_max(output);
380
sna_output->backlight_iface = NULL;
384
copy = strdup(de->d_name);
398
has_backlight(xf86OutputPtr output, int *best_type)
321
400
static const char *known_interfaces[] = {
322
401
"gmux_backlight",
333
412
"intel_backlight",
335
MessageType from = X_PROBED;
336
414
struct sna_output *sna_output = output->driver_private;
415
char *best_iface = NULL;
340
417
struct dirent *de;
343
best_iface = has_user_backlight_override(output);
347
419
dir = opendir(BACKLIGHT_CLASS);
351
423
while ((de = readdir(dir))) {
408
480
free(best_iface);
409
481
best_iface = copy;
492
sna_output_backlight_init(xf86OutputPtr output)
494
struct sna_output *sna_output = output->driver_private;
495
MessageType from = X_PROBED;
500
best_iface = has_user_backlight_override(output);
504
best_iface = has_device_backlight(output, &best_type);
508
best_iface = has_backlight(output, &best_type);
420
515
sna_output->backlight_iface = best_iface;
421
516
sna_output->backlight_max = sna_output_backlight_get_max(output);
422
517
sna_output->backlight_active_level = sna_output_backlight_get(output);
807
DBG(("%s: CRTC:%d (pipe %d) vrefresh=%d\n",
808
__FUNCTION__,i, to_sna_crtc(crtc)->pipe,
809
xf86ModeVRefresh(&crtc->mode)));
714
810
max_vrefresh = max(max_vrefresh, xf86ModeVRefresh(&crtc->mode));
939
1035
struct kgem_bo *bo;
941
1037
sna_crtc->transform = false;
942
if (use_shadow(sna, crtc)) {
1038
if (sna_crtc->scanout_pixmap) {
1039
DBG(("%s: attaching to scanout pixmap\n", __FUNCTION__));
1041
bo = sna_pixmap_pin(sna_crtc->scanout_pixmap, PIN_SCANOUT);
1045
if (!get_fb(sna, bo,
1046
sna_crtc->scanout_pixmap->drawable.width,
1047
sna_crtc->scanout_pixmap->drawable.height))
1050
sna_crtc->transform = true;
1051
return kgem_bo_reference(bo);
1052
} else if (use_shadow(sna, crtc)) {
943
1053
if (!sna_crtc_enable_shadow(sna, sna_crtc))
992
1102
DBG(("%s: attaching to framebuffer\n", __FUNCTION__));
993
1103
sna_crtc_disable_shadow(sna, sna_crtc);
994
bo = sna_pixmap_pin(sna->front);
1104
bo = sna_pixmap_pin(sna->front, PIN_SCANOUT);
1299
1409
crtc->driver_private = NULL;
1412
#if HAS_PIXMAP_SHARING
1414
sna_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr pixmap)
1416
DBG(("%s: CRTC:%d, pipe=%d setting scanout pixmap=%ld\n",
1417
__FUNCTION__,to_sna_crtc(crtc)->id, to_sna_crtc(crtc)->pipe,
1418
pixmap ? pixmap->drawable.serialNumber : 0));
1419
to_sna_crtc(crtc)->scanout_pixmap = pixmap;
1302
1424
static const xf86CrtcFuncsRec sna_crtc_funcs = {
1303
1425
.dpms = sna_crtc_dpms,
1304
1426
.set_mode_major = sna_crtc_set_mode_major,
1309
1431
.load_cursor_argb = sna_crtc_load_cursor_argb,
1310
1432
.gamma_set = sna_crtc_gamma_set,
1311
1433
.destroy = sna_crtc_destroy,
1434
#if HAS_PIXMAP_SHARING
1435
.set_scanout_pixmap = sna_set_scanout_pixmap,
1314
1439
static uint32_t
2144
2269
return WT_DONTWALKCHILDREN;
2148
sna_redirect_screen_pixmap(ScrnInfoPtr scrn, PixmapPtr old, PixmapPtr new)
2150
ScreenPtr screen = scrn->pScreen;
2151
struct sna_visit_set_pixmap_window visit;
2155
TraverseTree(screen->root, sna_visit_set_window_pixmap, &visit);
2157
screen->SetScreenPixmap(new);
2160
2272
static void copy_front(struct sna *sna, PixmapPtr old, PixmapPtr new)
2162
2274
struct sna_pixmap *old_priv, *new_priv;
2230
2342
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
2231
2343
struct sna *sna = to_sna(scrn);
2344
ScreenPtr screen = scrn->pScreen;
2232
2345
PixmapPtr old_front, new_front;
2235
DBG(("%s (%d, %d) -> (%d, %d)\n",
2348
DBG(("%s (%d, %d) -> (%d, %d)\n", __FUNCTION__,
2237
2349
scrn->virtualX, scrn->virtualY,
2238
2350
width, height));
2240
2352
if (scrn->virtualX == width && scrn->virtualY == height)
2243
assert(scrn->pScreen->GetScreenPixmap(scrn->pScreen) == sna->front);
2244
assert(scrn->pScreen->GetWindowPixmap(scrn->pScreen->root) == sna->front);
2356
assert(screen->GetScreenPixmap(screen) == sna->front);
2245
2358
DBG(("%s: creating new framebuffer %dx%d\n",
2246
2359
__FUNCTION__, width, height));
2248
2361
old_front = sna->front;
2249
new_front = scrn->pScreen->CreatePixmap(scrn->pScreen,
2362
new_front = screen->CreatePixmap(screen,
2363
width, height, scrn->depth,
2253
2365
if (!new_front)
2278
2390
sna_crtc_disable(crtc);
2281
sna_redirect_screen_pixmap(scrn, old_front, sna->front);
2282
assert(scrn->pScreen->GetScreenPixmap(scrn->pScreen) == sna->front);
2283
assert(scrn->pScreen->GetWindowPixmap(scrn->pScreen->root) == sna->front);
2285
scrn->pScreen->DestroyPixmap(old_front);
2394
struct sna_visit_set_pixmap_window visit;
2396
visit.old = old_front;
2397
visit.new = sna->front;
2398
TraverseTree(screen->root, sna_visit_set_window_pixmap, &visit);
2399
assert(screen->GetWindowPixmap(screen->root) == sna->front);
2401
screen->SetScreenPixmap(sna->front);
2402
assert(screen->GetScreenPixmap(screen) == sna->front);
2404
screen->DestroyPixmap(old_front);
2341
kgem_bo_destroy(&sna->kgem, crtc->bo);
2342
crtc->bo = kgem_bo_reference(bo);
2460
if (crtc->bo != bo) {
2461
kgem_bo_destroy(&sna->kgem, crtc->bo);
2462
crtc->bo = kgem_bo_reference(bo);
2412
2533
for (i = 0; i < mode->kmode->count_connectors; i++)
2413
2534
sna_output_init(scrn, mode, i);
2536
#if HAS_PIXMAP_SHARING
2537
xf86ProviderSetup(scrn, NULL, "Intel");
2415
2539
xf86InitialConfiguration(scrn, TRUE);