This commit is contained in:
Enrico Weigelt, metux IT consult
2025-08-11 09:53:01 +02:00
parent e217d3dd70
commit 6ff81ff439
4 changed files with 198 additions and 287 deletions

View File

@@ -39,6 +39,7 @@ from Kaleb S. KEITHLEY
#include "dix/dix_priv.h"
#include "dix/rpcbuf_priv.h"
#include "dix/screenint_priv.h"
#include "os/log_priv.h"
#include "os/osdep.h"
@@ -216,7 +217,6 @@ static int
ProcVidModeGetModeLine(ClientPtr client)
{
REQUEST(xXF86VidModeGetModeLineReq);
ScreenPtr pScreen;
VidModePtr pVidMode;
DisplayModePtr mode;
int dotClock;
@@ -227,9 +227,10 @@ ProcVidModeGetModeLine(ClientPtr client)
ver = ClientMajorVersion(client);
REQUEST_SIZE_MATCH(xXF86VidModeGetModeLineReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
return BadImplementation;
@@ -341,7 +342,6 @@ static int
ProcVidModeGetAllModeLines(ClientPtr client)
{
REQUEST(xXF86VidModeGetAllModeLinesReq);
ScreenPtr pScreen;
VidModePtr pVidMode;
DisplayModePtr mode;
int modecount, dotClock;
@@ -351,9 +351,10 @@ ProcVidModeGetAllModeLines(ClientPtr client)
REQUEST_SIZE_MATCH(xXF86VidModeGetAllModeLinesReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
ver = ClientMajorVersion(client);
pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -466,7 +467,6 @@ ProcVidModeAddModeLine(ClientPtr client)
static int VidModeAddModeLine(ClientPtr client, xXF86VidModeAddModeLineReq* stuff)
{
ScreenPtr pScreen;
DisplayModePtr mode;
VidModePtr pVidMode;
int dotClock;
@@ -489,9 +489,9 @@ static int VidModeAddModeLine(ClientPtr client, xXF86VidModeAddModeLineReq* stuf
stuff->after_vsyncend, stuff->after_vtotal,
(unsigned long) stuff->after_flags);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
if (stuff->hsyncstart < stuff->hdisplay ||
stuff->hsyncend < stuff->hsyncstart ||
@@ -651,7 +651,6 @@ VidModeDeleteModeLine(ClientPtr client, xXF86VidModeDeleteModeLineReq* stuff)
int dotClock;
DisplayModePtr mode;
VidModePtr pVidMode;
ScreenPtr pScreen;
DebugF("DeleteModeLine - scrn: %d clock: %ld\n",
(int) stuff->screen, (unsigned long) stuff->dotclock);
@@ -662,9 +661,9 @@ VidModeDeleteModeLine(ClientPtr client, xXF86VidModeDeleteModeLineReq* stuff)
stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend, stuff->vtotal,
(unsigned long) stuff->flags);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -774,7 +773,6 @@ ProcVidModeModModeLine(ClientPtr client)
static int
VidModeModModeLine(ClientPtr client, xXF86VidModeModModeLineReq *stuff)
{
ScreenPtr pScreen;
VidModePtr pVidMode;
DisplayModePtr mode;
int dotClock;
@@ -793,9 +791,9 @@ VidModeModModeLine(ClientPtr client, xXF86VidModeModModeLineReq *stuff)
stuff->vsyncend < stuff->vsyncstart || stuff->vtotal < stuff->vsyncend)
return BadValue;
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -917,7 +915,6 @@ ProcVidModeValidateModeLine(ClientPtr client)
static int
VidModeValidateModeLine(ClientPtr client, xXF86VidModeValidateModeLineReq *stuff)
{
ScreenPtr pScreen;
VidModePtr pVidMode;
DisplayModePtr mode, modetmp = NULL;
int status, dotClock;
@@ -931,9 +928,9 @@ VidModeValidateModeLine(ClientPtr client, xXF86VidModeValidateModeLineReq *stuff
stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend, stuff->vtotal,
(unsigned long) stuff->flags);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
status = MODE_OK;
@@ -1000,7 +997,6 @@ static int
ProcVidModeSwitchMode(ClientPtr client)
{
REQUEST(xXF86VidModeSwitchModeReq);
ScreenPtr pScreen;
VidModePtr pVidMode;
DEBUG_P("XF86VidModeSwitchMode");
@@ -1011,9 +1007,9 @@ ProcVidModeSwitchMode(ClientPtr client)
if (!VidModeAllowNonLocal && !client->local)
return VidModeErrorBase + XF86VidModeClientNotLocal;
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -1080,7 +1076,6 @@ ProcVidModeSwitchToMode(ClientPtr client)
static int
VidModeSwitchToMode(ClientPtr client, xXF86VidModeSwitchToModeReq *stuff)
{
ScreenPtr pScreen;
VidModePtr pVidMode;
DisplayModePtr mode;
int dotClock;
@@ -1094,9 +1089,9 @@ VidModeSwitchToMode(ClientPtr client, xXF86VidModeSwitchToModeReq *stuff)
stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend, stuff->vtotal,
(unsigned long) stuff->flags);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -1145,7 +1140,6 @@ static int
ProcVidModeLockModeSwitch(ClientPtr client)
{
REQUEST(xXF86VidModeLockModeSwitchReq);
ScreenPtr pScreen;
VidModePtr pVidMode;
REQUEST_SIZE_MATCH(xXF86VidModeLockModeSwitchReq);
@@ -1156,9 +1150,9 @@ ProcVidModeLockModeSwitch(ClientPtr client)
if (!VidModeAllowNonLocal && !client->local)
return VidModeErrorBase + XF86VidModeClientNotLocal;
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -1187,9 +1181,9 @@ ProcVidModeGetMonitor(ClientPtr client)
REQUEST_SIZE_MATCH(xXF86VidModeGetMonitorReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
ScreenPtr pScreen = screenInfo.screens[stuff->screen];
VidModePtr pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -1238,7 +1232,6 @@ static int
ProcVidModeGetViewPort(ClientPtr client)
{
REQUEST(xXF86VidModeGetViewPortReq);
ScreenPtr pScreen;
VidModePtr pVidMode;
int x, y;
@@ -1246,9 +1239,9 @@ ProcVidModeGetViewPort(ClientPtr client)
REQUEST_SIZE_MATCH(xXF86VidModeGetViewPortReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -1273,7 +1266,6 @@ static int
ProcVidModeSetViewPort(ClientPtr client)
{
REQUEST(xXF86VidModeSetViewPortReq);
ScreenPtr pScreen;
VidModePtr pVidMode;
DEBUG_P("XF86VidModeSetViewPort");
@@ -1284,9 +1276,9 @@ ProcVidModeSetViewPort(ClientPtr client)
if (!VidModeAllowNonLocal && !client->local)
return VidModeErrorBase + XF86VidModeClientNotLocal;
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -1302,7 +1294,6 @@ static int
ProcVidModeGetDotClocks(ClientPtr client)
{
REQUEST(xXF86VidModeGetDotClocksReq);
ScreenPtr pScreen;
VidModePtr pVidMode;
int numClocks;
Bool ClockProg;
@@ -1311,9 +1302,9 @@ ProcVidModeGetDotClocks(ClientPtr client)
REQUEST_SIZE_MATCH(xXF86VidModeGetDotClocksReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -1361,7 +1352,6 @@ static int
ProcVidModeSetGamma(ClientPtr client)
{
REQUEST(xXF86VidModeSetGammaReq);
ScreenPtr pScreen;
VidModePtr pVidMode;
DEBUG_P("XF86VidModeSetGamma");
@@ -1372,9 +1362,9 @@ ProcVidModeSetGamma(ClientPtr client)
if (!VidModeAllowNonLocal && !client->local)
return VidModeErrorBase + XF86VidModeClientNotLocal;
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -1392,7 +1382,6 @@ static int
ProcVidModeGetGamma(ClientPtr client)
{
REQUEST(xXF86VidModeGetGammaReq);
ScreenPtr pScreen;
VidModePtr pVidMode;
float red, green, blue;
@@ -1400,9 +1389,9 @@ ProcVidModeGetGamma(ClientPtr client)
REQUEST_SIZE_MATCH(xXF86VidModeGetGammaReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -1430,7 +1419,6 @@ ProcVidModeSetGammaRamp(ClientPtr client)
{
CARD16 *r, *g, *b;
int length;
ScreenPtr pScreen;
VidModePtr pVidMode;
/* limited to local-only connections */
@@ -1440,9 +1428,9 @@ ProcVidModeSetGammaRamp(ClientPtr client)
REQUEST(xXF86VidModeSetGammaRampReq);
REQUEST_AT_LEAST_SIZE(xXF86VidModeSetGammaRampReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -1471,9 +1459,9 @@ ProcVidModeGetGammaRamp(ClientPtr client)
REQUEST(xXF86VidModeGetGammaRampReq);
REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
ScreenPtr pScreen = screenInfo.screens[stuff->screen];
VidModePtr pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -1517,16 +1505,15 @@ ProcVidModeGetGammaRamp(ClientPtr client)
static int
ProcVidModeGetGammaRampSize(ClientPtr client)
{
ScreenPtr pScreen;
VidModePtr pVidMode;
REQUEST(xXF86VidModeGetGammaRampSizeReq);
REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampSizeReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
pScreen = screenInfo.screens[stuff->screen];
pVidMode = VidModeGetPtr(pScreen);
if (pVidMode == NULL)
@@ -1548,7 +1535,8 @@ ProcVidModeGetPermissions(ClientPtr client)
REQUEST(xXF86VidModeGetPermissionsReq);
REQUEST_SIZE_MATCH(xXF86VidModeGetPermissionsReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
xXF86VidModeGetPermissionsReply rep = {

View File

@@ -9,6 +9,7 @@
#include <X11/Xdefs.h>
#include "screenint.h"
#include "include/scrnintstr.h"
typedef Bool (*ScreenInitProcPtr)(ScreenPtr pScreen, int argc, char **argv);
@@ -23,4 +24,11 @@ void DetachUnboundGPU(ScreenPtr unbound);
void AttachOffloadGPU(ScreenPtr pScreen, ScreenPtr newScreen);
void DetachOffloadGPU(ScreenPtr slave);
static inline ScreenPtr GetScreenPtr(unsigned int id)
{
if (id < screenInfo.numScreens)
return screenInfo.screens[id];
return NULL;
}
#endif /* _XSERVER_DIX_SCREENINT_PRIV_H */

View File

@@ -2,6 +2,7 @@
#include <dix-config.h>
#include "dix/dix_priv.h"
#include "dix/screenint_priv.h"
#include <dix.h>
#include "vndserver.h"
@@ -11,6 +12,69 @@
#define X_GLXCreateContextAttribsARB X_GLXCreateContextAtrribsARB
#endif
static GlxServerVendor *vendorForScreen(
ClientPtr pClient,
CARD32 raw_screen)
{
CARD32 screenId = GlxCheckSwap(pClient, raw_screen);
ScreenPtr pScreen = GetScreenPtr(screenId);
if (!pScreen) {
pClient->errorValue = screenId;
return NULL;
}
return glxServer.getVendorForScreen(pClient, pScreen);
}
static GlxServerVendor *vendorForTag(
ClientPtr pClient,
CARD32 raw_context)
{
CARD32 contextTag = GlxCheckSwap(client, raw_context);
GlxServerVendor *vendor = glxServer.getContextTag(client, contextTag);
if (!vendor) {
client->errorValue = contextTag;
return NULL;
}
return vendor;
}
static int forward_simple(ClientPtr pClient, CARD32 raw_screen)
{
GlxServerVendor *vendor = vendorForScreen(pClient, raw_screen);
if (!vendor)
return BadMatch;
return glxServer.forwardRequest(vendor, pClient);
}
static int forward_xidmap(ClientPtr pClient, CARD32 raw_screen, XID xid)
{
GlxServerVendor *vendor = vendorForScreen(pClient, raw_screen);
if (!vendor)
return BadMatch;
if (!glxServer.addXIDMap(xid, vendor)) {
return BadAlloc;
}
int ret = glxServer.forwardRequest(vendor, pClient);
if (ret != Success) {
glxServer.removeXIDMap(xid);
}
return ret;
}
static int forward_create(ClientPtr pClient, CARD32 raw_screen, XID raw_xid)
{
XID xid = GlxCheckSwap(pClient, raw_xid);
LEGAL_NEW_RESOURCE(xid, pClient);
return forward_xidmap(pClient, raw_screen, xid);
}
static int dispatch_Render(ClientPtr client)
{
REQUEST(xGLXRenderReq);
@@ -18,7 +82,8 @@ static int dispatch_Render(ClientPtr client)
GlxServerVendor *vendor = NULL;
REQUEST_AT_LEAST_SIZE(*stuff);
contextTag = GlxCheckSwap(client, stuff->contextTag);
vendor = glxServer.getContextTag(client, contextTag);
GlxServerVendor *vendor = glxServer.getContextTag(client, stuff->contextTag);
if (vendor != NULL) {
int ret;
ret = glxServer.forwardRequest(vendor, client);
@@ -28,6 +93,7 @@ static int dispatch_Render(ClientPtr client)
return GlxErrorBase + GLXBadContextTag;
}
}
static int dispatch_RenderLarge(ClientPtr client)
{
REQUEST(xGLXRenderLargeReq);
@@ -45,33 +111,15 @@ static int dispatch_RenderLarge(ClientPtr client)
return GlxErrorBase + GLXBadContextTag;
}
}
static int dispatch_CreateContext(ClientPtr client)
{
REQUEST(xGLXCreateContextReq);
CARD32 screen, context;
GlxServerVendor *vendor = NULL;
REQUEST_SIZE_MATCH(*stuff);
screen = GlxCheckSwap(client, stuff->screen);
context = GlxCheckSwap(client, stuff->context);
LEGAL_NEW_RESOURCE(context, client);
if (screen < screenInfo.numScreens) {
vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]);
}
if (vendor != NULL) {
int ret;
if (!glxServer.addXIDMap(context, vendor)) {
return BadAlloc;
}
ret = glxServer.forwardRequest(vendor, client);
if (ret != Success) {
glxServer.removeXIDMap(context);
}
return ret;
} else {
client->errorValue = screen;
return BadMatch;
}
return forward_create(client, stuff->screen, stuff->context);
}
static int dispatch_DestroyContext(ClientPtr client)
{
REQUEST(xGLXDestroyContextReq);
@@ -80,6 +128,7 @@ static int dispatch_DestroyContext(ClientPtr client)
REQUEST_SIZE_MATCH(*stuff);
context = GlxCheckSwap(client, stuff->context);
vendor = glxServer.getXIDMap(context);
if (vendor != NULL) {
int ret;
ret = glxServer.forwardRequest(vendor, client);
@@ -146,49 +195,19 @@ static int dispatch_UseXFont(ClientPtr client)
static int dispatch_CreateGLXPixmap(ClientPtr client)
{
REQUEST(xGLXCreateGLXPixmapReq);
CARD32 screen, glxpixmap;
GlxServerVendor *vendor = NULL;
REQUEST_SIZE_MATCH(*stuff);
screen = GlxCheckSwap(client, stuff->screen);
glxpixmap = GlxCheckSwap(client, stuff->glxpixmap);
LEGAL_NEW_RESOURCE(glxpixmap, client);
if (screen < screenInfo.numScreens) {
vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]);
}
if (vendor != NULL) {
int ret;
if (!glxServer.addXIDMap(glxpixmap, vendor)) {
return BadAlloc;
}
ret = glxServer.forwardRequest(vendor, client);
if (ret != Success) {
glxServer.removeXIDMap(glxpixmap);
}
return ret;
} else {
client->errorValue = screen;
return BadMatch;
}
return forward_xidmap(client, stuff->screen, stuff->glxpixmap);
}
static int dispatch_GetVisualConfigs(ClientPtr client)
{
REQUEST(xGLXGetVisualConfigsReq);
CARD32 screen;
GlxServerVendor *vendor = NULL;
REQUEST_SIZE_MATCH(*stuff);
screen = GlxCheckSwap(client, stuff->screen);
if (screen < screenInfo.numScreens) {
vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]);
}
if (vendor != NULL) {
int ret;
ret = glxServer.forwardRequest(vendor, client);
return ret;
} else {
client->errorValue = screen;
return BadMatch;
}
return forward_simple(client, stuff->screen);
}
static int dispatch_DestroyGLXPixmap(ClientPtr client)
{
REQUEST(xGLXDestroyGLXPixmapReq);
@@ -206,44 +225,23 @@ static int dispatch_DestroyGLXPixmap(ClientPtr client)
return GlxErrorBase + GLXBadPixmap;
}
}
static int dispatch_QueryExtensionsString(ClientPtr client)
{
REQUEST(xGLXQueryExtensionsStringReq);
CARD32 screen;
GlxServerVendor *vendor = NULL;
REQUEST_SIZE_MATCH(*stuff);
screen = GlxCheckSwap(client, stuff->screen);
if (screen < screenInfo.numScreens) {
vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]);
}
if (vendor != NULL) {
int ret;
ret = glxServer.forwardRequest(vendor, client);
return ret;
} else {
client->errorValue = screen;
return BadMatch;
}
return forward_simple(client, stuff->screen);
}
static int dispatch_QueryServerString(ClientPtr client)
{
REQUEST(xGLXQueryServerStringReq);
CARD32 screen;
GlxServerVendor *vendor = NULL;
REQUEST_SIZE_MATCH(*stuff);
screen = GlxCheckSwap(client, stuff->screen);
if (screen < screenInfo.numScreens) {
vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]);
}
if (vendor != NULL) {
int ret;
ret = glxServer.forwardRequest(vendor, client);
return ret;
} else {
client->errorValue = screen;
return BadMatch;
}
return forward_simple(client, stuff->screen);
}
static int dispatch_ChangeDrawableAttributes(ClientPtr client)
{
REQUEST(xGLXChangeDrawableAttributesReq);
@@ -264,138 +262,43 @@ static int dispatch_ChangeDrawableAttributes(ClientPtr client)
static int dispatch_CreateNewContext(ClientPtr client)
{
REQUEST(xGLXCreateNewContextReq);
CARD32 screen, context;
GlxServerVendor *vendor = NULL;
REQUEST_SIZE_MATCH(*stuff);
screen = GlxCheckSwap(client, stuff->screen);
context = GlxCheckSwap(client, stuff->context);
LEGAL_NEW_RESOURCE(context, client);
if (screen < screenInfo.numScreens) {
vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]);
}
if (vendor != NULL) {
int ret;
if (!glxServer.addXIDMap(context, vendor)) {
return BadAlloc;
}
ret = glxServer.forwardRequest(vendor, client);
if (ret != Success) {
glxServer.removeXIDMap(context);
}
return ret;
} else {
client->errorValue = screen;
return BadMatch;
}
return forward_xidmap(client, stuff->screen, stuff->context);
}
static int dispatch_CreatePbuffer(ClientPtr client)
{
REQUEST(xGLXCreatePbufferReq);
CARD32 screen, pbuffer;
GlxServerVendor *vendor = NULL;
REQUEST_AT_LEAST_SIZE(*stuff);
screen = GlxCheckSwap(client, stuff->screen);
pbuffer = GlxCheckSwap(client, stuff->pbuffer);
LEGAL_NEW_RESOURCE(pbuffer, client);
if (screen < screenInfo.numScreens) {
vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]);
}
if (vendor != NULL) {
int ret;
if (!glxServer.addXIDMap(pbuffer, vendor)) {
return BadAlloc;
}
ret = glxServer.forwardRequest(vendor, client);
if (ret != Success) {
glxServer.removeXIDMap(pbuffer);
}
return ret;
} else {
client->errorValue = screen;
return BadMatch;
}
return forward_xidmap(client, stuff->screen, stuff->pbuffer);
}
static int dispatch_CreatePixmap(ClientPtr client)
{
REQUEST(xGLXCreatePixmapReq);
CARD32 screen, glxpixmap;
GlxServerVendor *vendor = NULL;
REQUEST_AT_LEAST_SIZE(*stuff);
screen = GlxCheckSwap(client, stuff->screen);
glxpixmap = GlxCheckSwap(client, stuff->glxpixmap);
LEGAL_NEW_RESOURCE(glxpixmap, client);
if (screen < screenInfo.numScreens) {
vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]);
}
if (vendor != NULL) {
int ret;
if (!glxServer.addXIDMap(glxpixmap, vendor)) {
return BadAlloc;
}
ret = glxServer.forwardRequest(vendor, client);
if (ret != Success) {
glxServer.removeXIDMap(glxpixmap);
}
return ret;
} else {
client->errorValue = screen;
return BadMatch;
}
return forward_xidmap(client, stuff->screen, stuff->glxpixmap);
}
static int dispatch_CreateWindow(ClientPtr client)
{
REQUEST(xGLXCreateWindowReq);
CARD32 screen, glxwindow;
GlxServerVendor *vendor = NULL;
REQUEST_AT_LEAST_SIZE(*stuff);
screen = GlxCheckSwap(client, stuff->screen);
glxwindow = GlxCheckSwap(client, stuff->glxwindow);
LEGAL_NEW_RESOURCE(glxwindow, client);
if (screen < screenInfo.numScreens) {
vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]);
}
if (vendor != NULL) {
int ret;
if (!glxServer.addXIDMap(glxwindow, vendor)) {
return BadAlloc;
}
ret = glxServer.forwardRequest(vendor, client);
if (ret != Success) {
glxServer.removeXIDMap(glxwindow);
}
return ret;
} else {
client->errorValue = screen;
return BadMatch;
}
return forward_xidmap(client, stuff->screen, stuff->glxwindow);
}
static int dispatch_CreateContextAttribsARB(ClientPtr client)
{
REQUEST(xGLXCreateContextAttribsARBReq);
CARD32 screen, context;
GlxServerVendor *vendor = NULL;
REQUEST_AT_LEAST_SIZE(*stuff);
screen = GlxCheckSwap(client, stuff->screen);
context = GlxCheckSwap(client, stuff->context);
LEGAL_NEW_RESOURCE(context, client);
if (screen < screenInfo.numScreens) {
vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]);
}
if (vendor != NULL) {
int ret;
if (!glxServer.addXIDMap(context, vendor)) {
return BadAlloc;
}
ret = glxServer.forwardRequest(vendor, client);
if (ret != Success) {
glxServer.removeXIDMap(context);
}
return ret;
} else {
client->errorValue = screen;
return BadMatch;
}
return forward_xidmap(client, stuff->screen, stuff->context);
}
static int dispatch_DestroyPbuffer(ClientPtr client)
{
REQUEST(xGLXDestroyPbufferReq);
@@ -476,22 +379,11 @@ static int dispatch_GetDrawableAttributes(ClientPtr client)
static int dispatch_GetFBConfigs(ClientPtr client)
{
REQUEST(xGLXGetFBConfigsReq);
CARD32 screen;
GlxServerVendor *vendor = NULL;
REQUEST_SIZE_MATCH(*stuff);
screen = GlxCheckSwap(client, stuff->screen);
if (screen < screenInfo.numScreens) {
vendor = glxServer.getVendorForScreen(client, screenInfo.screens[screen]);
}
if (vendor != NULL) {
int ret;
ret = glxServer.forwardRequest(vendor, client);
return ret;
} else {
client->errorValue = screen;
return BadMatch;
}
return forward_simple(client, stuff->screen);
}
static int dispatch_QueryContext(ClientPtr client)
{
REQUEST(xGLXQueryContextReq);

View File

@@ -1242,7 +1242,8 @@ ProcXDGAOpenFramebuffer(ClientPtr client)
REQUEST_SIZE_MATCH(xXDGAOpenFramebufferReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
if (!DGAAvailable(stuff->screen))
@@ -1276,7 +1277,8 @@ ProcXDGACloseFramebuffer(ClientPtr client)
REQUEST_SIZE_MATCH(xXDGACloseFramebufferReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
if (!DGAAvailable(stuff->screen))
@@ -1299,7 +1301,8 @@ ProcXDGAQueryModes(ClientPtr client)
REQUEST_SIZE_MATCH(xXDGAQueryModesReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
rep.type = X_Reply;
@@ -1415,7 +1418,8 @@ ProcXDGASetMode(ClientPtr client)
REQUEST_SIZE_MATCH(xXDGASetModeReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
owner = DGA_GETCLIENT(stuff->screen);
@@ -1506,7 +1510,8 @@ ProcXDGASetViewport(ClientPtr client)
REQUEST_SIZE_MATCH(xXDGASetViewportReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client)
@@ -1527,7 +1532,8 @@ ProcXDGAInstallColormap(ClientPtr client)
REQUEST_SIZE_MATCH(xXDGAInstallColormapReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client)
@@ -1548,7 +1554,8 @@ ProcXDGASelectInput(ClientPtr client)
REQUEST_SIZE_MATCH(xXDGASelectInputReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client)
@@ -1567,7 +1574,8 @@ ProcXDGAFillRectangle(ClientPtr client)
REQUEST_SIZE_MATCH(xXDGAFillRectangleReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client)
@@ -1587,7 +1595,8 @@ ProcXDGACopyArea(ClientPtr client)
REQUEST_SIZE_MATCH(xXDGACopyAreaReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (pScreen)
return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client)
@@ -1608,7 +1617,8 @@ ProcXDGACopyTransparentArea(ClientPtr client)
REQUEST_SIZE_MATCH(xXDGACopyTransparentAreaReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client)
@@ -1630,7 +1640,8 @@ ProcXDGAGetViewportStatus(ClientPtr client)
REQUEST_SIZE_MATCH(xXDGAGetViewportStatusReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client)
@@ -1654,7 +1665,8 @@ ProcXDGASync(ClientPtr client)
REQUEST_SIZE_MATCH(xXDGASyncReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (pScreen)
return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client)
@@ -1700,7 +1712,8 @@ ProcXDGAChangePixmapMode(ClientPtr client)
REQUEST_SIZE_MATCH(xXDGAChangePixmapModeReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client)
@@ -1731,7 +1744,8 @@ ProcXDGACreateColormap(ClientPtr client)
REQUEST_SIZE_MATCH(xXDGACreateColormapReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client)
@@ -1767,7 +1781,8 @@ ProcXF86DGAGetVideoLL(ClientPtr client)
REQUEST_SIZE_MATCH(xXF86DGAGetVideoLLReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
rep.type = X_Reply;
@@ -1808,7 +1823,8 @@ ProcXF86DGADirectVideo(ClientPtr client)
REQUEST_SIZE_MATCH(xXF86DGADirectVideoReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
if (!DGAAvailable(stuff->screen))
@@ -1867,7 +1883,8 @@ ProcXF86DGAGetViewPortSize(ClientPtr client)
REQUEST_SIZE_MATCH(xXF86DGAGetViewPortSizeReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
rep.type = X_Reply;
@@ -1896,7 +1913,8 @@ ProcXF86DGASetViewPort(ClientPtr client)
REQUEST_SIZE_MATCH(xXF86DGASetViewPortReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client)
@@ -1923,7 +1941,8 @@ ProcXF86DGAGetVidPage(ClientPtr client)
REQUEST_SIZE_MATCH(xXF86DGAGetVidPageReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
rep.type = X_Reply;
@@ -1942,7 +1961,8 @@ ProcXF86DGASetVidPage(ClientPtr client)
REQUEST_SIZE_MATCH(xXF86DGASetVidPageReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
/* silently fail */
@@ -1960,7 +1980,8 @@ ProcXF86DGAInstallColormap(ClientPtr client)
REQUEST_SIZE_MATCH(xXF86DGAInstallColormapReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client)
@@ -1988,7 +2009,8 @@ ProcXF86DGAQueryDirectVideo(ClientPtr client)
REQUEST_SIZE_MATCH(xXF86DGAQueryDirectVideoReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
rep.type = X_Reply;
@@ -2011,7 +2033,8 @@ ProcXF86DGAViewPortChanged(ClientPtr client)
REQUEST_SIZE_MATCH(xXF86DGAViewPortChangedReq);
if (stuff->screen >= screenInfo.numScreens)
ScreenPtr pScreen = GetScreenPtr(stuff->screen);
if (!pScreen)
return BadValue;
if (DGA_GETCLIENT(stuff->screen) != client)