526 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			526 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
| 
 | |
| #include <dix-config.h>
 | |
| #include <dix.h>
 | |
| #include "vndserver.h"
 | |
| 
 | |
| // HACK: The opcode in old glxproto.h has a typo in it.
 | |
| #if !defined(X_GLXCreateContextAttribsARB)
 | |
| #define X_GLXCreateContextAttribsARB X_GLXCreateContextAtrribsARB
 | |
| #endif
 | |
| 
 | |
| static int dispatch_Render(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xGLXRenderReq);
 | |
|     CARD32 contextTag;
 | |
|     GlxServerVendor *vendor = NULL;
 | |
|     REQUEST_AT_LEAST_SIZE(*stuff);
 | |
|     contextTag = GlxCheckSwap(client, stuff->contextTag);
 | |
|     vendor = glxServer.getContextTag(client, contextTag);
 | |
|     if (vendor != NULL) {
 | |
|         int ret;
 | |
|         ret = glxServer.forwardRequest(vendor, client);
 | |
|         return ret;
 | |
|     } else {
 | |
|         client->errorValue = contextTag;
 | |
|         return GlxErrorBase + GLXBadContextTag;
 | |
|     }
 | |
| }
 | |
| static int dispatch_RenderLarge(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xGLXRenderLargeReq);
 | |
|     CARD32 contextTag;
 | |
|     GlxServerVendor *vendor = NULL;
 | |
|     REQUEST_AT_LEAST_SIZE(*stuff);
 | |
|     contextTag = GlxCheckSwap(client, stuff->contextTag);
 | |
|     vendor = glxServer.getContextTag(client, contextTag);
 | |
|     if (vendor != NULL) {
 | |
|         int ret;
 | |
|         ret = glxServer.forwardRequest(vendor, client);
 | |
|         return ret;
 | |
|     } else {
 | |
|         client->errorValue = contextTag;
 | |
|         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;
 | |
|     }
 | |
| }
 | |
| static int dispatch_DestroyContext(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xGLXDestroyContextReq);
 | |
|     CARD32 context;
 | |
|     GlxServerVendor *vendor = NULL;
 | |
|     REQUEST_SIZE_MATCH(*stuff);
 | |
|     context = GlxCheckSwap(client, stuff->context);
 | |
|     vendor = glxServer.getXIDMap(context);
 | |
|     if (vendor != NULL) {
 | |
|         int ret;
 | |
|         ret = glxServer.forwardRequest(vendor, client);
 | |
|         if (ret == Success) {
 | |
|             glxServer.removeXIDMap(context);
 | |
|         }
 | |
|         return ret;
 | |
|     } else {
 | |
|         client->errorValue = context;
 | |
|         return GlxErrorBase + GLXBadContext;
 | |
|     }
 | |
| }
 | |
| static int dispatch_WaitGL(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xGLXWaitGLReq);
 | |
|     CARD32 contextTag;
 | |
|     GlxServerVendor *vendor = NULL;
 | |
|     REQUEST_SIZE_MATCH(*stuff);
 | |
|     contextTag = GlxCheckSwap(client, stuff->contextTag);
 | |
|     vendor = glxServer.getContextTag(client, contextTag);
 | |
|     if (vendor != NULL) {
 | |
|         int ret;
 | |
|         ret = glxServer.forwardRequest(vendor, client);
 | |
|         return ret;
 | |
|     } else {
 | |
|         client->errorValue = contextTag;
 | |
|         return GlxErrorBase + GLXBadContextTag;
 | |
|     }
 | |
| }
 | |
| static int dispatch_WaitX(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xGLXWaitXReq);
 | |
|     CARD32 contextTag;
 | |
|     GlxServerVendor *vendor = NULL;
 | |
|     REQUEST_SIZE_MATCH(*stuff);
 | |
|     contextTag = GlxCheckSwap(client, stuff->contextTag);
 | |
|     vendor = glxServer.getContextTag(client, contextTag);
 | |
|     if (vendor != NULL) {
 | |
|         int ret;
 | |
|         ret = glxServer.forwardRequest(vendor, client);
 | |
|         return ret;
 | |
|     } else {
 | |
|         client->errorValue = contextTag;
 | |
|         return GlxErrorBase + GLXBadContextTag;
 | |
|     }
 | |
| }
 | |
| static int dispatch_UseXFont(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xGLXUseXFontReq);
 | |
|     CARD32 contextTag;
 | |
|     GlxServerVendor *vendor = NULL;
 | |
|     REQUEST_SIZE_MATCH(*stuff);
 | |
|     contextTag = GlxCheckSwap(client, stuff->contextTag);
 | |
|     vendor = glxServer.getContextTag(client, contextTag);
 | |
|     if (vendor != NULL) {
 | |
|         int ret;
 | |
|         ret = glxServer.forwardRequest(vendor, client);
 | |
|         return ret;
 | |
|     } else {
 | |
|         client->errorValue = contextTag;
 | |
|         return GlxErrorBase + GLXBadContextTag;
 | |
|     }
 | |
| }
 | |
| 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;
 | |
|     }
 | |
| }
 | |
| 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;
 | |
|     }
 | |
| }
 | |
| static int dispatch_DestroyGLXPixmap(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xGLXDestroyGLXPixmapReq);
 | |
|     CARD32 glxpixmap;
 | |
|     GlxServerVendor *vendor = NULL;
 | |
|     REQUEST_SIZE_MATCH(*stuff);
 | |
|     glxpixmap = GlxCheckSwap(client, stuff->glxpixmap);
 | |
|     vendor = glxServer.getXIDMap(glxpixmap);
 | |
|     if (vendor != NULL) {
 | |
|         int ret;
 | |
|         ret = glxServer.forwardRequest(vendor, client);
 | |
|         return ret;
 | |
|     } else {
 | |
|         client->errorValue = glxpixmap;
 | |
|         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;
 | |
|     }
 | |
| }
 | |
| 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;
 | |
|     }
 | |
| }
 | |
| static int dispatch_ChangeDrawableAttributes(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xGLXChangeDrawableAttributesReq);
 | |
|     CARD32 drawable;
 | |
|     GlxServerVendor *vendor = NULL;
 | |
|     REQUEST_AT_LEAST_SIZE(*stuff);
 | |
|     drawable = GlxCheckSwap(client, stuff->drawable);
 | |
|     vendor = glxServer.getXIDMap(drawable);
 | |
|     if (vendor != NULL) {
 | |
|         int ret;
 | |
|         ret = glxServer.forwardRequest(vendor, client);
 | |
|         return ret;
 | |
|     } else {
 | |
|         client->errorValue = drawable;
 | |
|         return BadDrawable;
 | |
|     }
 | |
| }
 | |
| 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;
 | |
|     }
 | |
| }
 | |
| 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;
 | |
|     }
 | |
| }
 | |
| 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;
 | |
|     }
 | |
| }
 | |
| 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;
 | |
|     }
 | |
| }
 | |
| 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;
 | |
|     }
 | |
| }
 | |
| static int dispatch_DestroyPbuffer(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xGLXDestroyPbufferReq);
 | |
|     CARD32 pbuffer;
 | |
|     GlxServerVendor *vendor = NULL;
 | |
|     REQUEST_SIZE_MATCH(*stuff);
 | |
|     pbuffer = GlxCheckSwap(client, stuff->pbuffer);
 | |
|     vendor = glxServer.getXIDMap(pbuffer);
 | |
|     if (vendor != NULL) {
 | |
|         int ret;
 | |
|         ret = glxServer.forwardRequest(vendor, client);
 | |
|         if (ret == Success) {
 | |
|             glxServer.removeXIDMap(pbuffer);
 | |
|         }
 | |
|         return ret;
 | |
|     } else {
 | |
|         client->errorValue = pbuffer;
 | |
|         return GlxErrorBase + GLXBadPbuffer;
 | |
|     }
 | |
| }
 | |
| static int dispatch_DestroyPixmap(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xGLXDestroyPixmapReq);
 | |
|     CARD32 glxpixmap;
 | |
|     GlxServerVendor *vendor = NULL;
 | |
|     REQUEST_SIZE_MATCH(*stuff);
 | |
|     glxpixmap = GlxCheckSwap(client, stuff->glxpixmap);
 | |
|     vendor = glxServer.getXIDMap(glxpixmap);
 | |
|     if (vendor != NULL) {
 | |
|         int ret;
 | |
|         ret = glxServer.forwardRequest(vendor, client);
 | |
|         if (ret == Success) {
 | |
|             glxServer.removeXIDMap(glxpixmap);
 | |
|         }
 | |
|         return ret;
 | |
|     } else {
 | |
|         client->errorValue = glxpixmap;
 | |
|         return GlxErrorBase + GLXBadPixmap;
 | |
|     }
 | |
| }
 | |
| static int dispatch_DestroyWindow(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xGLXDestroyWindowReq);
 | |
|     CARD32 glxwindow;
 | |
|     GlxServerVendor *vendor = NULL;
 | |
|     REQUEST_SIZE_MATCH(*stuff);
 | |
|     glxwindow = GlxCheckSwap(client, stuff->glxwindow);
 | |
|     vendor = glxServer.getXIDMap(glxwindow);
 | |
|     if (vendor != NULL) {
 | |
|         int ret;
 | |
|         ret = glxServer.forwardRequest(vendor, client);
 | |
|         if (ret == Success) {
 | |
|             glxServer.removeXIDMap(glxwindow);
 | |
|         }
 | |
|         return ret;
 | |
|     } else {
 | |
|         client->errorValue = glxwindow;
 | |
|         return GlxErrorBase + GLXBadWindow;
 | |
|     }
 | |
| }
 | |
| static int dispatch_GetDrawableAttributes(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xGLXGetDrawableAttributesReq);
 | |
|     CARD32 drawable;
 | |
|     GlxServerVendor *vendor = NULL;
 | |
|     REQUEST_SIZE_MATCH(*stuff);
 | |
|     drawable = GlxCheckSwap(client, stuff->drawable);
 | |
|     vendor = glxServer.getXIDMap(drawable);
 | |
|     if (vendor != NULL) {
 | |
|         int ret;
 | |
|         ret = glxServer.forwardRequest(vendor, client);
 | |
|         return ret;
 | |
|     } else {
 | |
|         client->errorValue = drawable;
 | |
|         return BadDrawable;
 | |
|     }
 | |
| }
 | |
| 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;
 | |
|     }
 | |
| }
 | |
| static int dispatch_QueryContext(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xGLXQueryContextReq);
 | |
|     CARD32 context;
 | |
|     GlxServerVendor *vendor = NULL;
 | |
|     REQUEST_SIZE_MATCH(*stuff);
 | |
|     context = GlxCheckSwap(client, stuff->context);
 | |
|     vendor = glxServer.getXIDMap(context);
 | |
|     if (vendor != NULL) {
 | |
|         int ret;
 | |
|         ret = glxServer.forwardRequest(vendor, client);
 | |
|         return ret;
 | |
|     } else {
 | |
|         client->errorValue = context;
 | |
|         return GlxErrorBase + GLXBadContext;
 | |
|     }
 | |
| }
 | |
| static int dispatch_IsDirect(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xGLXIsDirectReq);
 | |
|     CARD32 context;
 | |
|     GlxServerVendor *vendor = NULL;
 | |
|     REQUEST_SIZE_MATCH(*stuff);
 | |
|     context = GlxCheckSwap(client, stuff->context);
 | |
|     vendor = glxServer.getXIDMap(context);
 | |
|     if (vendor != NULL) {
 | |
|         int ret;
 | |
|         ret = glxServer.forwardRequest(vendor, client);
 | |
|         return ret;
 | |
|     } else {
 | |
|         client->errorValue = context;
 | |
|         return GlxErrorBase + GLXBadContext;
 | |
|     }
 | |
| }
 |