Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • ryanneph/xserver
  • wjp/xserver
  • DemiMarie/xserver
  • alanc/xserver
  • uvas/xserver
  • cl91/xserver
  • heymiaoO/xserver
  • oreaus/xserver
  • miztake/xserver
  • stapelberg/xserver
  • PaulKocialkowski/xserver
  • CendioOssman/xserver
  • wiz/xserver
  • maos20008/xserver
  • dougvj/xserver
  • gldrk/xserver
  • TMR5454/xserver
  • cubanismo/xserver
  • agoins/xserver
  • kleinerm/xserver
  • zagursky/xserver
  • Kyawswat/xserver
  • hexiaodong/xserver
  • gilvbp/xserver
  • vliaskov/xserver
  • aarondill/xserver
  • zzyiwei/xserver
  • arichardson/xserver
  • jcherry/xserver
  • erwinou/xserver
  • nathankidd/xserver
  • jexposit/xserver
  • refi_64/xserver
  • kupper.pa/xserver
  • kbrenneman/xserver
  • thesamesam/xserver
  • metux/xserver
  • LickmeDown/xserver
  • meMuszr/xserver
  • Julia/xserver
  • twaik/xserver
  • fvalasiad/xserver
  • zzxyb/xserver
  • HermannSW/xserver
  • ekurzinger/xserver
  • NSUTanghaixiang/xserver
  • huxd1532/xserver
  • vinilokorlok/xserver
  • bbeckett/xserver
  • dslater38/xserver
  • emersion/xserver
  • zzag/xserver
  • ccullumbine2018/xserver
  • daniels/xserver
  • doraskayo/xserver
  • llandwerlin/xserver
  • XDXTHX/xserver
  • zboszor/xserver
  • jadahl/xserver
  • shadeslayer/xserver
  • ecurtin/xserver
  • pekdon/xserver
  • tomty89/xserver
  • russellcnv/xserver
  • orbea/xserver
  • lyudess/xserver
  • lucmann/xserver
  • tmlind/xserver
  • tholin/xserver
  • chema/xserver
  • J-Bu/xserver
  • chenhuacai/xserver
  • E5ten/xserver
  • haagch/xserver
  • whot/xserver
  • nacho.resa/xserver
  • strassek/xserver
  • tzimmermann/xserver
  • liyi42/xserver
  • YusufKhan-gamedev/xserver
  • mgorse1/xserver
  • iv-m/xserver
  • vanvugt/xserver
  • keithp/xserver
  • Rui511/xserver
  • catap/xserver
  • tjbp/xserver
  • webi123/xserver
  • djlucas/xserver
  • noblock/xserver
  • freemangordon/xserver
  • xdandys/xserver
  • afett/xserver
  • xexaxo/xserver
  • jbeich/xserver
  • zeising/xserver
  • romangg/xserver
  • mbiebl/xserver
  • pq/xserver
  • azhadchenko/xserver
  • manu/xserver
  • vsyrjala/xserver
  • Emantor/xserver
  • lostgoat/xserver
  • carlosg/xserver
  • yarivb/xserver
  • kwg/xserver
  • pichika/xserver
  • marv/xserver
  • jcristau/xserver
  • mntmn/xserver
  • klniu/xserver
  • TAAPArthur/xserver
  • sjoerd/xserver
  • Sjecai2/xserver
  • 3v1n0/xserver
  • awilfox/xserver
  • pkubaj/xserver
  • os369510/xserver
  • Gorg/xserver
  • Zamundaaa/xserver
  • lkundrak/xserver
  • niveditharau/xserver
  • ForTheReallys/xserver
  • jmonteiro/xserver
  • jocelyn/xserver
  • ThatMG393/xserver
  • fweimer/xserver
  • mlankhorst/xserver
  • dbn/xserver
  • jturney/xserver
  • mattrope/xserver
  • coypoop/xserver
  • schreibemirhalt/xserver
  • frog/xserver
  • mherrb/xserver
  • rarbab/xserver
  • yshui/xserver
  • muesli4/xserver
  • jannau/xserver
  • mikeroyal/xserver
  • andrebsguedes/xserver
  • JeffyCN/xserver
  • ipominov/xserver
  • gtrentalancia/xserver
  • lucyllewy/xserver
  • qarmin/xserver
  • tagr/xserver
  • zwenna/xserver
  • bkylerussell/xserver
  • mupuf/xserver
  • zubzub/xserver
  • galaxytgtabiday/xserver
  • OlCe/xserver
  • ashafer/xserver
  • dengbo/xserver
  • valpackett/xserver
  • andreyknyazev077/xserver
  • antonovitch/xserver
  • contactshashanksharma/xserver-fork-shashank
  • xorg/xserver
  • gsittyz/xserver
  • akihiko.odaki/xserver
  • sknsean/xserver
  • rnpnr/xserver
  • hitong602/xserver
  • halfline/xserver
  • ismailsiege/xserver
  • dongwonk/xserver
  • GermanAizek/xserver
  • FeepingCreature/xserver
  • Acidburn0zzz/xserver
  • mvlad/xserver
  • puleglot/xserver
  • smelenius/xserver
  • sewn/xserver
  • kaichuan.hsieh/xserver
  • Fatton1/xserver
  • aditj/xserver
  • SimonPilkington/xserver
  • adamdruppe/xserver
  • floppym/xserver
  • trevdave/xserver
  • headrush/xserver
  • luke-jr/xserver
  • davidriley/xserver
  • heitbaum/xserver
  • goosen78/xserver
  • Ma/xserver
  • gmbr3/xserver
  • tsutsui/xserver
  • sherrodejjohnson/xserver
  • ydc-dadada/xserver
  • wengxt/xserver
  • icenowy/xserver
  • denisfa/xserver
  • StarsGreen/xserver
  • adamjrichter/xserver
  • bigon/xserver
  • djacewicz/xserver
  • davidre/xserver
  • kylin0061/xserver
  • arrowd/xserver
  • p12tic/xserver
  • karlosrangel337/xserver
  • bbrezillon/xserver
  • penguin42/xserver
  • anarsoul/xserver
  • marvinjr35/xserver
  • gerddie/xserver
  • knisht/xserver
  • xry111/xserver
  • psyruss85/xserver
  • volkanorhan/xserver
  • luporl/xserver
  • cbur201592/xserver
  • bphaslett/xserver
  • guillem/xserver
  • haihao/xserver
  • zaps166/xserver
  • bentiss/xserver
  • rilian-la-te/xserver
  • wujiangGitHub/xserver
  • mrisaacb/xserver
  • ross/xserver
  • davidedmundson/xserver
  • topimiettinen/xserver
  • MisterDA/xserver
  • DPA/xserver
  • dkorkmazturk/xserver
  • karamjameelmoore/xserver
  • sthibaul/xserver
  • ydirson/xserver
  • lihongtao/xserver
  • RyzenDew/xserver
  • christian-rauch/xserver
  • Vivek/xserver
  • peigongdsd/xserver
  • peng.jin/xserver
  • dixler/xserver
  • mehdigh419/xserver
  • BBaoVanC/xserver
  • Drakulix/xserver
  • bafanahub/xserver
  • jengelh/xserver
  • yangxiaojuan-loongson/xserver
  • pepp/xserver
  • cgzones/xserver
  • luyn/xserver
  • ids1024/xserver
  • svalaskevicius/xserver
  • eschwartz/xserver
  • jayantpranjal0/xserver
  • hmazlan/xserver
  • kerneltoast/xserver
  • Michaelypk/xserver
  • dottedmag/xserver
  • hassoon1986/xserver
  • aplattner/xserver
  • sergiomb/xserver
  • looi/xserver
  • robclark/xserver
  • vitoux.pascal/xserver
  • kennylevinsen/xserver
  • Kishore409/xserver
  • msizanoen1/xserver
  • Daasin/xserver
  • xinbowang/xserver
  • mwei/xserver
  • SpikyCaterpillar1/xserver
  • devin11911191/xserver
  • alex-tu-cc/xserver
  • kaniini/xserver
  • alagner/xserver
  • jcourreges/xserver
  • n3rdopolis/xserver
  • cooperch/xserver
  • peterh/xserver
  • anholt/xserver
  • themaister/xserver
  • josch/xserver
  • jrtc27/xserver
  • JoseExposito/xserver
  • lanodan/xserver
  • Hi-Angel/xserver
  • City-busz/xserver
  • karolherbst/xserver
  • daenzer/xserver
  • dawnhan/xserver
  • avolkov/xserver
  • Tuetuopay/xserver
  • gabifalk/xserver
  • jeremyhu/xserver
  • road2react/xserver
  • 1480c1/xserver
  • Spintzyk/xserver
  • abono/xserver
  • ajax/xserver
  • dougg3/xserver
  • chenx_dust/xserver
  • ernstp/xserver
  • EXtremeExploit/xserver
  • starnight/xserver
  • dirbaio/xserver
  • jwrdegoede/xserver
  • vfjpl/xserver
  • acelan/xserver
  • airlied/xserver
  • justazarsky/xserver
  • sri-ka1ki/xserver
  • benpicco/xserver
  • kaocher82/xserver
  • rgfernandes/xserver
  • lynxeye/xserver
  • tintou/xserver
  • rmader/xserver
  • linkmauve/xserver
  • mattst88/xserver
  • kamarul6401/xserver
  • andy-zetier/xserver
  • bernhardu/xserver
  • causztic/xserver
  • cpmichael/modesetting
  • mwyraz/xserver
  • zhangyaning/xserver
  • olv/xserver
  • hongaoo/xserver
  • LiChenG-P/xserver
  • jsg/xserver
  • Ivaniku/x-taylan
  • dk/xserver
  • manuelcrack642/xserver
  • dkg/xserver
  • ofourdan/xserver
  • mahkoh/xserver
  • AkiSakurai/xserver
  • 1740301466jxz/xserver
  • ZhiJie.Zhang/xserver
  • chengbo7135/xserver
339 results
Show changes
Commits on Source (19)
Showing
with 465 additions and 37 deletions
......@@ -42,6 +42,7 @@ Equipment Corporation.
#include "extinit.h"
#include "scrnintstr.h"
#include "windowstr.h"
#include "protocol-versions.h"
CARD16 DPMSPowerLevel = 0;
Bool DPMSDisabledSwitch = FALSE;
......@@ -50,6 +51,178 @@ CARD32 DPMSSuspendTime = -1;
CARD32 DPMSOffTime = -1;
Bool DPMSEnabled;
static int DPMSReqCode = 0;
static RESTYPE ClientType, DPMSEventType; /* resource types for event masks */
static XID eventResource;
typedef struct _DPMSEvent *DPMSEventPtr;
typedef struct _DPMSEvent {
DPMSEventPtr next;
ClientPtr client;
XID clientResource;
unsigned int mask;
} DPMSEventRec;
/*ARGSUSED*/ static int
DPMSFreeClient(void *data, XID id)
{
DPMSEventPtr pEvent;
DPMSEventPtr *pHead, pCur, pPrev;
pEvent = (DPMSEventPtr) data;
dixLookupResourceByType((void *) &pHead, eventResource, DPMSEventType,
NullClient, DixUnknownAccess);
if (pHead) {
pPrev = 0;
for (pCur = *pHead; pCur && pCur != pEvent; pCur = pCur->next)
pPrev = pCur;
if (pCur) {
if (pPrev)
pPrev->next = pEvent->next;
else
*pHead = pEvent->next;
}
}
free((void *) pEvent);
return 1;
}
/*ARGSUSED*/ static int
DPMSFreeEvents(void *data, XID id)
{
DPMSEventPtr *pHead, pCur, pNext;
pHead = (DPMSEventPtr *) data;
for (pCur = *pHead; pCur; pCur = pNext) {
pNext = pCur->next;
FreeResource(pCur->clientResource, ClientType);
free((void *) pCur);
}
free((void *) pHead);
return 1;
}
static void
SDPMSInfoNotifyEvent(xGenericEvent * from,
xGenericEvent * to)
{
*to = *from;
swaps(&to->sequenceNumber);
swapl(&to->length);
swaps(&to->evtype);
if (from->evtype == DPMSInfoNotify) {
xDPMSInfoNotifyEvent *c = (xDPMSInfoNotifyEvent *) to;
swapl(&c->timestamp);
swaps(&c->power_level);
}
}
static int
ProcDPMSSelectInput(register ClientPtr client)
{
REQUEST(xDPMSSelectInputReq);
DPMSEventPtr pEvent, pNewEvent, *pHead;
XID clientResource;
int i;
REQUEST_SIZE_MATCH(xDPMSSelectInputReq);
i = dixLookupResourceByType((void **)&pHead, eventResource, DPMSEventType,
client,
DixWriteAccess);
if (stuff->eventMask == DPMSInfoNotifyMask) {
if (i == Success && pHead) {
/* check for existing entry. */
for (pEvent = *pHead; pEvent; pEvent = pEvent->next) {
if (pEvent->client == client) {
pEvent->mask = stuff->eventMask;
return Success;
}
}
}
/* build the entry */
pNewEvent = (DPMSEventPtr)malloc(sizeof(DPMSEventRec));
if (!pNewEvent)
return BadAlloc;
pNewEvent->next = 0;
pNewEvent->client = client;
pNewEvent->mask = stuff->eventMask;
/*
* add a resource that will be deleted when
* the client goes away
*/
clientResource = FakeClientID(client->index);
pNewEvent->clientResource = clientResource;
if (!AddResource(clientResource, ClientType, (void *)pNewEvent))
return BadAlloc;
/*
* create a resource to contain a pointer to the list
* of clients selecting input
*/
if (i != Success || !pHead) {
pHead = (DPMSEventPtr *)malloc(sizeof(DPMSEventPtr));
if (!pHead ||
!AddResource(eventResource, DPMSEventType, (void *)pHead)) {
FreeResource(clientResource, RT_NONE);
return BadAlloc;
}
*pHead = 0;
}
pNewEvent->next = *pHead;
*pHead = pNewEvent;
}
else if (stuff->eventMask == 0) {
/* delete the interest */
if (i == Success && pHead) {
pNewEvent = 0;
for (pEvent = *pHead; pEvent; pEvent = pEvent->next) {
if (pEvent->client == client)
break;
pNewEvent = pEvent;
}
if (pEvent) {
FreeResource(pEvent->clientResource, ClientType);
if (pNewEvent)
pNewEvent->next = pEvent->next;
else
*pHead = pEvent->next;
free(pEvent);
}
}
}
else {
client->errorValue = stuff->eventMask;
return BadValue;
}
return Success;
}
static void
SendDPMSInfoNotify(void)
{
DPMSEventPtr *pHead, pEvent;
xDPMSInfoNotifyEvent se;
int i;
i = dixLookupResourceByType((void **)&pHead, eventResource, DPMSEventType,
serverClient,
DixReadAccess);
if (i != Success || !pHead)
return;
for (pEvent = *pHead; pEvent; pEvent = pEvent->next) {
if ((pEvent->mask & DPMSInfoNotifyMask) == 0)
continue;
se.type = GenericEvent;
se.extension = DPMSReqCode;
se.length = (sizeof(xDPMSInfoNotifyEvent) - 32) >> 2;
se.evtype = DPMSInfoNotify;
se.timestamp = currentTime.milliseconds;
se.power_level = DPMSPowerLevel;
se.state = DPMSEnabled;
WriteEventsToClient(pEvent->client, 1, (xEvent *)&se);
}
}
Bool
DPMSSupported(void)
{
......@@ -86,6 +259,7 @@ int
DPMSSet(ClientPtr client, int level)
{
int rc, i;
int old_level = DPMSPowerLevel;
DPMSPowerLevel = level;
......@@ -109,6 +283,9 @@ DPMSSet(ClientPtr client, int level)
if (screenInfo.gpuscreens[i]->DPMS != NULL)
screenInfo.gpuscreens[i]->DPMS(screenInfo.gpuscreens[i], level);
if (DPMSPowerLevel != old_level)
SendDPMSInfoNotify();
return Success;
}
......@@ -120,8 +297,8 @@ ProcDPMSGetVersion(ClientPtr client)
.type = X_Reply,
.sequenceNumber = client->sequence,
.length = 0,
.majorVersion = DPMSMajorVersion,
.minorVersion = DPMSMinorVersion
.majorVersion = SERVER_DPMS_MAJOR_VERSION,
.minorVersion = SERVER_DPMS_MINOR_VERSION
};
REQUEST_SIZE_MATCH(xDPMSGetVersionReq);
......@@ -212,8 +389,10 @@ ProcDPMSEnable(ClientPtr client)
REQUEST_SIZE_MATCH(xDPMSEnableReq);
DPMSEnabled = TRUE;
if (!was_enabled)
if (!was_enabled) {
SetScreenSaverTimer();
SendDPMSInfoNotify();
}
return Success;
}
......@@ -221,6 +400,8 @@ ProcDPMSEnable(ClientPtr client)
static int
ProcDPMSDisable(ClientPtr client)
{
Bool was_enabled = DPMSEnabled;
/* REQUEST(xDPMSDisableReq); */
REQUEST_SIZE_MATCH(xDPMSDisableReq);
......@@ -228,6 +409,8 @@ ProcDPMSDisable(ClientPtr client)
DPMSSet(client, DPMSModeOn);
DPMSEnabled = FALSE;
if (was_enabled)
SendDPMSInfoNotify();
return Success;
}
......@@ -298,6 +481,8 @@ ProcDPMSDispatch(ClientPtr client)
return ProcDPMSForceLevel(client);
case X_DPMSInfo:
return ProcDPMSInfo(client);
case X_DPMSSelectInput:
return ProcDPMSSelectInput(client);
default:
return BadRequest;
}
......@@ -397,6 +582,18 @@ SProcDPMSInfo(ClientPtr client)
return ProcDPMSInfo(client);
}
static int _X_COLD
SProcDPMSSelectInput(ClientPtr client)
{
REQUEST(xDPMSSelectInputReq);
swaps(&stuff->length);
REQUEST_SIZE_MATCH(xDPMSSelectInputReq);
swapl(&stuff->eventMask);
return ProcDPMSSelectInput(client);
}
static int _X_COLD
SProcDPMSDispatch(ClientPtr client)
{
......@@ -418,6 +615,8 @@ SProcDPMSDispatch(ClientPtr client)
return SProcDPMSForceLevel(client);
case X_DPMSInfo:
return SProcDPMSInfo(client);
case X_DPMSSelectInput:
return SProcDPMSSelectInput(client);
default:
return BadRequest;
}
......@@ -432,6 +631,8 @@ DPMSCloseDownExtension(ExtensionEntry *e)
void
DPMSExtensionInit(void)
{
ExtensionEntry *extEntry;
#define CONDITIONALLY_SET_DPMS_TIMEOUT(_timeout_value_) \
if (_timeout_value_ == -1) { /* not yet set from config */ \
_timeout_value_ = ScreenSaverTime; \
......@@ -444,8 +645,15 @@ DPMSExtensionInit(void)
DPMSPowerLevel = DPMSModeOn;
DPMSEnabled = DPMSSupported();
if (DPMSEnabled)
AddExtension(DPMSExtensionName, 0, 0,
ProcDPMSDispatch, SProcDPMSDispatch,
DPMSCloseDownExtension, StandardMinorOpcode);
ClientType = CreateNewResourceType(DPMSFreeClient, "DPMSClient");
DPMSEventType = CreateNewResourceType(DPMSFreeEvents, "DPMSEvent");
eventResource = FakeClientID(0);
if (DPMSEnabled && ClientType && DPMSEventType &&
(extEntry = AddExtension(DPMSExtensionName, 0, 0,
ProcDPMSDispatch, SProcDPMSDispatch,
DPMSCloseDownExtension, StandardMinorOpcode))) {
DPMSReqCode = extEntry->base;
GERegisterExtension(DPMSReqCode, SDPMSInfoNotifyEvent);
}
}
......@@ -927,7 +927,9 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx)
/* To do DRI3 device FD generation, we need to open a new fd
* to the same device we were handed in originally.
*/
glamor_egl->device_path = drmGetDeviceNameFromFd2(glamor_egl->fd);
glamor_egl->device_path = drmGetRenderDeviceNameFromFd(glamor_egl->fd);
if (!glamor_egl->device_path)
glamor_egl->device_path = drmGetDeviceNameFromFd2(glamor_egl->fd);
if (!dri3_screen_init(screen, &glamor_dri3_info)) {
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
......
......@@ -102,7 +102,11 @@ glamor_poly_glyph_blt_gl(DrawablePtr drawable, GCPtr gc,
int pt_x_i = glyph_x + xx;
int pt_y_i = glyph_y + yy;
#if BITMAP_BIT_ORDER == MSBFirst
if (!(*glyph & (128 >> (xx & 7))))
#else
if (!(*glyph & (1 << (xx & 7))))
#endif
continue;
if (!RegionContainsPoint(clip, pt_x_i, pt_y_i, NULL))
......@@ -209,7 +213,11 @@ glamor_push_pixels_gl(GCPtr gc, PixmapPtr bitmap,
for (yy = 0; yy < h; yy++) {
uint8_t *bitmap_row = bitmap_data + yy * bitmap_stride;
for (xx = 0; xx < w; xx++) {
#if BITMAP_BIT_ORDER == MSBFirst
if (bitmap_row[xx / 8] & (128 >> xx % 8) &&
#else
if (bitmap_row[xx / 8] & (1 << xx % 8) &&
#endif
RegionContainsPoint(clip,
x + xx,
y + yy,
......
......@@ -235,7 +235,11 @@ static const char fs_vars_text[] =
static const char fs_exec_text[] =
" ivec2 itile_texture = ivec2(glyph_pos);\n"
#if BITMAP_BIT_ORDER == MSBFirst
" uint x = uint(7) - uint(itile_texture.x & 7);\n"
#else
" uint x = uint(itile_texture.x & 7);\n"
#endif
" itile_texture.x >>= 3;\n"
" uint texel = texelFetch(font, itile_texture, 0).x;\n"
" uint bit = (texel >> x) & uint(1);\n"
......@@ -244,7 +248,11 @@ static const char fs_exec_text[] =
static const char fs_exec_te[] =
" ivec2 itile_texture = ivec2(glyph_pos);\n"
#if BITMAP_BIT_ORDER == MSBFirst
" uint x = uint(7) - uint(itile_texture.x & 7);\n"
#else
" uint x = uint(itile_texture.x & 7);\n"
#endif
" itile_texture.x >>= 3;\n"
" uint texel = texelFetch(font, itile_texture, 0).x;\n"
" uint bit = (texel >> x) & uint(1);\n"
......
......@@ -567,6 +567,7 @@ ephyrRandRSetConfig(ScreenPtr pScreen,
if (wasEnabled)
KdEnableScreen(pScreen);
RRGetInfo(pScreen, TRUE);
RRScreenSizeNotify(pScreen);
return TRUE;
......
......@@ -753,6 +753,8 @@ vfbRRScreenSetSize(ScreenPtr pScreen,
CARD32 mmWidth,
CARD32 mmHeight)
{
rrScrPrivPtr pScrPriv = rrGetScrPriv(pScreen);
// Prevent screen updates while we change things around
SetRootClip(pScreen, ROOT_CLIP_NONE);
......@@ -767,7 +769,7 @@ vfbRRScreenSetSize(ScreenPtr pScreen,
RRScreenSizeNotify (pScreen);
RRTellChanged(pScreen);
return TRUE;
return RROutputSetPhysicalSize(pScrPriv->outputs[pScreen->myNum], mmWidth, mmHeight);
}
static Bool
......@@ -803,6 +805,7 @@ vfbRandRInit(ScreenPtr pScreen)
xRRModeInfo modeInfo;
char name[64];
#endif
int mmWidth, mmHeight;
if (!RRScreenInit (pScreen))
return FALSE;
......@@ -818,6 +821,9 @@ vfbRandRInit(ScreenPtr pScreen)
pScrPriv->rrOutputValidateMode = vfbRROutputValidateMode;
pScrPriv->rrModeDestroy = NULL;
mmWidth = pScreen->width * 25.4 / monitorResolution;
mmHeight = pScreen->height * 25.4 / monitorResolution;
RRScreenSetSizeRange (pScreen,
1, 1,
pScreen->width, pScreen->height);
......@@ -850,6 +856,8 @@ vfbRandRInit(ScreenPtr pScreen)
return FALSE;
if (!RROutputSetConnection (output, RR_Connected))
return FALSE;
if (!RROutputSetPhysicalSize (output, mmWidth, mmHeight))
return FALSE;
RRCrtcNotify (crtc, mode, 0, 0, RR_Rotate_0, NULL, 1, &output);
#endif
return TRUE;
......@@ -958,6 +966,9 @@ InitOutput(ScreenInfo * screen_info, int argc, char **argv)
int i;
int NumFormats = 0;
if (!monitorResolution)
monitorResolution = 96;
/* initialize pixmap formats */
/* must have a pixmap depth to match every screen depth */
......
......@@ -579,6 +579,9 @@ xf86platformProbeDev(DriverPtr drvp)
/* Accept the device if the driver is hyperv_drm */
if (strcmp(xf86_platform_devices[j].attribs->driver, "hyperv_drm") == 0)
break;
/* Accept the device if the driver is ofdrm */
if (strcmp(xf86_platform_devices[j].attribs->driver, "ofdrm") == 0)
break;
/* Accept the device if the driver is simpledrm */
if (strcmp(xf86_platform_devices[j].attribs->driver, "simpledrm") == 0)
break;
......
......@@ -1100,16 +1100,21 @@ msShouldDoubleShadow(ScrnInfoPtr pScrn, modesettingPtr ms)
{
Bool ret = FALSE, asked;
int from;
drmVersionPtr v = drmGetVersion(ms->fd);
drmVersionPtr v;
if (!ms->drmmode.shadow_enable)
return FALSE;
if (!strcmp(v->name, "mgag200") ||
!strcmp(v->name, "ast")) /* XXX || rn50 */
ret = TRUE;
if ((v = drmGetVersion(ms->fd))) {
if (!strcmp(v->name, "mgag200") ||
!strcmp(v->name, "ast")) /* XXX || rn50 */
ret = TRUE;
drmFreeVersion(v);
drmFreeVersion(v);
}
else
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Failed to query DRM version.\n");
asked = xf86GetOptValBool(ms->drmmode.Options, OPTION_DOUBLE_SHADOW, &ret);
......@@ -1292,15 +1297,15 @@ PreInit(ScrnInfoPtr pScrn, int flags)
ms->drmmode.sw_cursor = TRUE;
}
ms->cursor_width = 64;
ms->cursor_height = 64;
ms->max_cursor_width = 64;
ms->max_cursor_height = 64;
ret = drmGetCap(ms->fd, DRM_CAP_CURSOR_WIDTH, &value);
if (!ret) {
ms->cursor_width = value;
ms->max_cursor_width = value;
}
ret = drmGetCap(ms->fd, DRM_CAP_CURSOR_HEIGHT, &value);
if (!ret) {
ms->cursor_height = value;
ms->max_cursor_height = value;
}
try_enable_glamor(pScrn);
......@@ -1381,7 +1386,7 @@ PreInit(ScrnInfoPtr pScrn, int flags)
"Atomic modesetting %sabled\n", ms->atomic_modeset ? "en" : "dis");
/* TearFree requires glamor and, if PageFlip is enabled, universal planes */
if (xf86ReturnOptValBool(ms->drmmode.Options, OPTION_TEARFREE, FALSE)) {
if (xf86ReturnOptValBool(ms->drmmode.Options, OPTION_TEARFREE, TRUE)) {
if (pScrn->is_gpu) {
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"TearFree cannot synchronize PRIME; use 'PRIME Synchronization' instead\n");
......@@ -2035,7 +2040,7 @@ ScreenInit(ScreenPtr pScreen, int argc, char **argv)
/* Need to extend HWcursor support to handle mask interleave */
if (!ms->drmmode.sw_cursor)
xf86_cursors_init(pScreen, ms->cursor_width, ms->cursor_height,
xf86_cursors_init(pScreen, ms->max_cursor_width, ms->max_cursor_height,
HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
HARDWARE_CURSOR_UPDATE_UNHIDDEN |
HARDWARE_CURSOR_ARGB);
......
......@@ -129,7 +129,8 @@ typedef struct _modesettingRec {
DamagePtr damage;
Bool dirty_enabled;
uint32_t cursor_width, cursor_height;
uint32_t min_cursor_width, min_cursor_height;
uint32_t max_cursor_width, max_cursor_height;
Bool has_queue_sequence;
Bool tried_queue_sequence;
......@@ -206,6 +207,8 @@ void ms_drm_abort(ScrnInfoPtr scrn,
void *match_data);
void ms_drm_abort_seq(ScrnInfoPtr scrn, uint32_t seq);
Bool ms_drm_queue_is_empty(void);
Bool xf86_crtc_on(xf86CrtcPtr crtc);
xf86CrtcPtr ms_dri2_crtc_covering_drawable(DrawablePtr pDraw);
......@@ -255,6 +258,7 @@ Bool ms_do_tearfree_flip(ScreenPtr screen, xf86CrtcPtr crtc);
#endif
int ms_flush_drm_events(ScreenPtr screen);
void ms_drain_drm_events(ScreenPtr screen);
Bool ms_window_has_variable_refresh(modesettingPtr ms, WindowPtr win);
void ms_present_set_screen_vrr(ScrnInfoPtr scrn, Bool vrr_enabled);
Bool ms_tearfree_is_active_on_crtc(xf86CrtcPtr crtc);
......@@ -1662,6 +1662,26 @@ drmmode_create_tearfree_shadow(xf86CrtcPtr crtc)
return TRUE;
}
static void drmmmode_prepare_modeset(ScrnInfoPtr scrn)
{
ScreenPtr pScreen = scrn->pScreen;
modesettingPtr ms = modesettingPTR(scrn);
if (ms->drmmode.pending_modeset)
return;
/*
* Force present to unflip everything before we might
* try lighting up new displays. This makes sure fancy
* modifiers can't cause the modeset to fail.
*/
ms->drmmode.pending_modeset = TRUE;
present_check_flips(pScreen->root);
ms->drmmode.pending_modeset = FALSE;
ms_drain_drm_events(pScreen);
}
static Bool
drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
Rotation rotation, int x, int y)
......@@ -1677,6 +1697,9 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
Bool can_test;
int i;
if (mode)
drmmmode_prepare_modeset(crtc->scrn);
saved_mode = crtc->mode;
saved_x = crtc->x;
saved_y = crtc->y;
......@@ -1767,12 +1790,11 @@ drmmode_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
}
static Bool
drmmode_set_cursor(xf86CrtcPtr crtc)
drmmode_set_cursor(xf86CrtcPtr crtc, int width, int height)
{
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
drmmode_ptr drmmode = drmmode_crtc->drmmode;
uint32_t handle = drmmode_crtc->cursor_bo->handle;
modesettingPtr ms = modesettingPTR(crtc->scrn);
CursorPtr cursor = xf86CurrentCursor(crtc->scrn->pScreen);
int ret = -EINVAL;
......@@ -1780,14 +1802,14 @@ drmmode_set_cursor(xf86CrtcPtr crtc)
return TRUE;
ret = drmModeSetCursor2(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
handle, ms->cursor_width, ms->cursor_height,
handle, width, height,
cursor->bits->xhot, cursor->bits->yhot);
/* -EINVAL can mean that an old kernel supports drmModeSetCursor but
* not drmModeSetCursor2, though it can mean other things too. */
if (ret == -EINVAL)
ret = drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
handle, ms->cursor_width, ms->cursor_height);
handle, width, height);
/* -ENXIO normally means that the current drm driver supports neither
* cursor_set nor cursor_set2. Disable hardware cursor support for
......@@ -1803,6 +1825,10 @@ drmmode_set_cursor(xf86CrtcPtr crtc)
if (ret)
/* fallback to swcursor */
return FALSE;
drmmode_crtc->cursor_width = width;
drmmode_crtc->cursor_height = height;
return TRUE;
}
......@@ -1819,31 +1845,55 @@ static Bool
drmmode_load_cursor_argb_check(xf86CrtcPtr crtc, CARD32 *image)
{
modesettingPtr ms = modesettingPTR(crtc->scrn);
CursorPtr cursor = xf86CurrentCursor(crtc->scrn->pScreen);
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
int i;
int width, height, x, y, i;
uint32_t *ptr;
/* cursor should be mapped already */
ptr = (uint32_t *) (drmmode_crtc->cursor_bo->ptr);
for (i = 0; i < ms->cursor_width * ms->cursor_height; i++)
ptr[i] = image[i]; // cpu_to_le32(image[i]);
/* FIXME deal with rotation */
if (crtc->rotation == RR_Rotate_0) {
for (width = ms->min_cursor_width; width < cursor->bits->width; )
width *= 2;
for (height = ms->min_cursor_height; height < cursor->bits->height; )
height *= 2;
/* assume only square works for now */
width = height = max(width, height);
/* if the max limits aren't square+POT we may have gone a bit over */
width = min(width, ms->max_cursor_width);
height = min(height, ms->max_cursor_height);
} else {
width = ms->max_cursor_width;
height = ms->max_cursor_height;
}
i = 0;
for (y = 0; y < height; y++) {
for (x = 0; x < width; x++)
ptr[i++] = image[y * ms->max_cursor_width + x]; // cpu_to_le32(image[i]);
}
/* clear the remainder for good measure */
for (; i < ms->max_cursor_width * ms->max_cursor_height; i++)
ptr[i++] = 0;
if (drmmode_crtc->cursor_up)
return drmmode_set_cursor(crtc);
return drmmode_set_cursor(crtc, width, height);
return TRUE;
}
static void
drmmode_hide_cursor(xf86CrtcPtr crtc)
{
modesettingPtr ms = modesettingPTR(crtc->scrn);
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
drmmode_ptr drmmode = drmmode_crtc->drmmode;
drmmode_crtc->cursor_up = FALSE;
drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 0,
ms->cursor_width, ms->cursor_height);
drmmode_crtc->cursor_width, drmmode_crtc->cursor_height);
}
static Bool
......@@ -1851,7 +1901,7 @@ drmmode_show_cursor(xf86CrtcPtr crtc)
{
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
drmmode_crtc->cursor_up = TRUE;
return drmmode_set_cursor(crtc);
return drmmode_set_cursor(crtc, drmmode_crtc->cursor_width, drmmode_crtc->cursor_height);
}
static void
......@@ -1872,6 +1922,7 @@ drmmode_set_gamma_lut(drmmode_crtc_private_ptr drmmode_crtc,
lut[i].red = red[i];
lut[i].green = green[i];
lut[i].blue = blue[i];
lut[i].reserved = 0;
}
if (drmModeCreatePropertyBlob(drmmode->fd, lut, sizeof(lut), &blob_id))
......@@ -3906,6 +3957,8 @@ drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode, Bool set_hw,
Bool success = TRUE;
int c;
drmmmode_prepare_modeset(pScrn);
for (c = 0; c < config->num_crtc; c++) {
xf86CrtcPtr crtc = config->crtc[c];
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
......@@ -4305,6 +4358,52 @@ drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode)
#endif
}
static void drmmode_probe_cursor_size(xf86CrtcPtr crtc)
{
modesettingPtr ms = modesettingPTR(crtc->scrn);
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
uint32_t handle = drmmode_crtc->cursor_bo->handle;
drmmode_ptr drmmode = drmmode_crtc->drmmode;
int width, height, size;
/* probe square min first */
for (size = 1; size <= ms->max_cursor_width &&
size <= ms->max_cursor_height; size *= 2) {
int ret;
ret = drmModeSetCursor2(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
handle, size, size, 0, 0);
if (ret == 0)
break;
}
/* check if smaller width works with non-square */
for (width = 1; width <= size; width *= 2) {
int ret;
ret = drmModeSetCursor2(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
handle, width, size, 0, 0);
if (ret == 0) {
ms->min_cursor_width = width;
break;
}
}
/* check if smaller height works with non-square */
for (height = 1; height <= size; height *= 2) {
int ret;
ret = drmModeSetCursor2(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
handle, size, height, 0, 0);
if (ret == 0) {
ms->min_cursor_height = height;
break;
}
}
drmModeSetCursor2(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 0, 0, 0, 0, 0);
}
/* create front and cursor BOs */
Bool
drmmode_create_initial_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
......@@ -4324,8 +4423,8 @@ drmmode_create_initial_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
return FALSE;
pScrn->displayWidth = drmmode_bo_get_pitch(&drmmode->front_bo) / cpp;
width = ms->cursor_width;
height = ms->cursor_height;
width = ms->max_cursor_width;
height = ms->max_cursor_height;
bpp = 32;
for (i = 0; i < xf86_config->num_crtc; i++) {
xf86CrtcPtr crtc = xf86_config->crtc[i];
......@@ -4334,6 +4433,14 @@ drmmode_create_initial_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
drmmode_crtc->cursor_bo =
dumb_bo_create(drmmode->fd, width, height, bpp);
}
drmmode_probe_cursor_size(xf86_config->crtc[0]);
xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, MS_LOGLEVEL_DEBUG,
"Supported cursor sizes %dx%d -> %dx%d\n",
ms->min_cursor_width, ms->min_cursor_height,
ms->max_cursor_width, ms->max_cursor_height);
return TRUE;
}
......
......@@ -139,6 +139,8 @@ typedef struct {
uint32_t vrr_prop_id;
Bool use_ctm;
Bool pending_modeset;
} drmmode_rec, *drmmode_ptr;
typedef struct {
......@@ -220,6 +222,8 @@ typedef struct {
uint64_t next_msc;
int cursor_width, cursor_height;
Bool need_modeset;
struct xorg_list mode_list;
......
......@@ -118,7 +118,7 @@ as rotated and scaled CRTCs. When PageFlip is enabled, fullscreen DRI
applications will still have the discretion to not use tearing prevention.
.br
The default is
.B off.
.B on.
.TP
.BI "Option \*qAtomic\*q \*q" boolean \*q
Enable atomic modesetting when supported. The default is
......
......@@ -69,6 +69,13 @@ ms_flush_drm_events(ScreenPtr screen)
return ms_flush_drm_events_timeout(screen, 0);
}
void
ms_drain_drm_events(ScreenPtr screen)
{
while (!ms_drm_queue_is_empty())
ms_flush_drm_events_timeout(screen, -1);
}
#ifdef GLAMOR_HAS_GBM
/*
......
......@@ -327,6 +327,9 @@ ms_present_check_flip(RRCrtcPtr crtc,
if (ms->drmmode.sprites_visible > 0)
goto no_flip;
if (ms->drmmode.pending_modeset)
goto no_flip;
if(!ms_present_check_unflip(crtc, window, pixmap, sync_flip, reason))
goto no_flip;
......
......@@ -642,6 +642,12 @@ ms_drm_handler(int fd, uint32_t frame, uint32_t sec, uint32_t usec,
FALSE, (uint32_t) (uintptr_t) user_ptr);
}
Bool
ms_drm_queue_is_empty(void)
{
return xorg_list_is_empty(&ms_drm_queue);
}
Bool
ms_vblank_screen_init(ScreenPtr screen)
{
......
......@@ -304,6 +304,31 @@ fbdev_open_pci(struct pci_device *pPci, char **namep)
return -1;
}
/* *
* Try to resolve a filename as symbolic link. If the file is not a link, the
* original filename is returned. NULL is returned if readlink raised an
* error.
*/
static const char *
resolve_link(const char *filename, char *resolve_buf, size_t resolve_buf_size)
{
ssize_t len = readlink(filename, resolve_buf, resolve_buf_size - 1);
/* if it is a link resolve it */
if (len >= 0) {
resolve_buf[len] = '\0';
return resolve_buf;
}
else {
if (errno == EINVAL) {
return filename;
}
else {
// Have caller handle error condition.
return NULL;
}
}
}
static int
fbdev_open(int scrnIndex, const char *dev, char **namep)
{
......@@ -331,9 +356,26 @@ fbdev_open(int scrnIndex, const char *dev, char **namep)
/* only touch non-PCI devices on this path */
{
char device_path_buf[PATH_MAX];
char buf[PATH_MAX] = {0};
char *sysfs_path = NULL;
char *node = strrchr(dev, '/') + 1;
char const *real_dev = resolve_link(dev, device_path_buf,
sizeof(device_path_buf));
if (real_dev == NULL) {
xf86DrvMsg(scrnIndex, X_ERROR,
"Failed resolving symbolic link for device '%s': %s",
dev, strerror(errno));
return -1;
}
const char *node = strrchr(real_dev, '/');
if (node == NULL) {
node = real_dev;
}
else {
node++;
}
if (asprintf(&sysfs_path, "/sys/class/graphics/%s", node) < 0 ||
readlink(sysfs_path, buf, sizeof(buf) - 1) < 0 ||
......
......@@ -300,7 +300,8 @@ setup_oeffis(struct xwl_ei_client *xwl_ei_client)
SetNotifyFd(xwl_ei_client->oeffis_fd, xwl_handle_oeffis_event,
X_NOTIFY_READ, xwl_ei_client);
oeffis_create_session(xwl_ei_client->oeffis, OEFFIS_DEVICE_ALL_DEVICES);
oeffis_create_session(xwl_ei_client->oeffis,
OEFFIS_DEVICE_KEYBOARD | OEFFIS_DEVICE_POINTER);
return true;
#else
......
......@@ -135,6 +135,7 @@ conf_data.set('HAVE_FNMATCH_H', cc.has_header('fnmatch.h') ? '1' : false)
conf_data.set('HAVE_LINUX_AGPGART_H', cc.has_header('linux/agpgart.h') ? '1' : false)
conf_data.set('HAVE_STRINGS_H', cc.has_header('strings.h') ? '1' : false)
conf_data.set('HAVE_SYS_AGPGART_H', cc.has_header('sys/agpgart.h') ? '1' : false)
conf_data.set('HAVE_SYS_UCRED_H', cc.has_header('sys/ucred.h') ? '1' : false)
conf_data.set('HAVE_SYS_UN_H', cc.has_header('sys/un.h') ? '1' : false)
conf_data.set('HAVE_SYS_UTSNAME_H', cc.has_header('sys/utsname.h') ? '1' : false)
conf_data.set('HAVE_SYS_SYSMACROS_H', cc.has_header('sys/sysmacros.h') ? '1' : false)
......@@ -176,6 +177,7 @@ conf_data.set('HAVE_TIMINGSAFE_MEMCMP', cc.has_function('timingsafe_memcmp') ? '
conf_data.set('HAVE_VASPRINTF', cc.has_function('vasprintf') ? '1' : false)
conf_data.set('HAVE_VSNPRINTF', cc.has_function('vsnprintf') ? '1' : false)
conf_data.set('HAVE_WALKCONTEXT', cc.has_function('walkcontext') ? '1' : false)
conf_data.set('HAVE_XUCRED_CR_PID', cc.has_member('struct xucred', 'cr_pid', prefix : '#include <sys/ucred.h>') ? '1' : false)
conf_data.set('BUSFAULT', conf_data.get('HAVE_SIGACTION'))
......
......@@ -46,6 +46,10 @@
#define SERVER_DAMAGE_MAJOR_VERSION 1
#define SERVER_DAMAGE_MINOR_VERSION 1
/* DPMS */
#define SERVER_DPMS_MAJOR_VERSION 1
#define SERVER_DPMS_MINOR_VERSION 2
/* DRI3 */
#define SERVER_DRI3_MAJOR_VERSION 1
#define SERVER_DRI3_MINOR_VERSION 2
......
......@@ -96,6 +96,7 @@ xf86vidmodeproto_dep = dependency('xf86vidmodeproto', version: '>= 2.2.99.1', fa
applewmproto_dep = dependency('applewmproto', version: '>= 1.4', fallback: ['xorgproto', 'ext_xorgproto'], required: false)
xshmfence_dep = dependency('xshmfence', version: '>= 1.1', required: false)
xwaylandproto_dep = dependency('xwaylandproto', version: '>= 1.0', fallback: ['xorgproto', 'ext_xorgproto'], required: false)
dpmsproto_dep = dependency('dpmsproto', version: '>= 1.2', required: get_option('dpms'))
pixman_dep = dependency('pixman-1')
libbsd_dep = dependency('libbsd-overlay', required: false)
......@@ -631,6 +632,7 @@ common_dep = [
xf86dgaproto_dep,
xf86vidmodeproto_dep,
applewmproto_dep,
dpmsproto_dep,
pixman_dep,
libbsd_dep,
......