From 3169843ccd596c63751cd51297d7fec4da1c2020 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Fri, 26 May 2017 15:28:05 -0400 Subject: wip: wire up si backend for vfb --- glx/glxext.c | 132 +++++++++++++++++++++++++++++++---------------------- hw/vfb/meson.build | 1 + 2 files changed, 78 insertions(+), 55 deletions(-) diff --git a/glx/glxext.c b/glx/glxext.c index 2eb596cdb..f872b2ebe 100644 --- a/glx/glxext.c +++ b/glx/glxext.c @@ -46,6 +46,7 @@ #include "glxext.h" #include "indirect_table.h" #include "indirect_util.h" +#include "glxfe.h" /* ** X resources. @@ -60,7 +61,6 @@ static DevPrivateKeyRec glxClientPrivateKeyRec; /* ** Forward declarations. */ -static int __glXDispatch(ClientPtr); static GLboolean __glXFreeContext(__GLXcontext * cx); /* @@ -223,18 +223,16 @@ __glXErrorOccured(void) return errorOccured; } -static ExtensionEntry *GLXExtensionEntry; - int __glXError(int error) { - return GLXExtensionEntry->errorBase + error; + return GlxExtension->errorBase + error; } int __glXEvent(int event) { - return GLXExtensionEntry->eventBase + event; + return GlxExtension->eventBase + event; } __GLXclientState * @@ -322,13 +320,80 @@ GetGLXDrawableBytes(void *value, XID id, ResourceSizePtr size) } } +/* "sample implementation" */ +static int +siGlxDispatch(ClientPtr client) +{ + REQUEST(xGLXSingleReq); + CARD8 opcode; + __GLXdispatchSingleProcPtr proc; + __GLXclientState *cl; + int retval; + + opcode = stuff->glxCode; + cl = glxGetClient(client); + + /* + ** Use the opcode to index into the procedure table. + */ + proc = __glXGetProtocolDecodeFunction(&Single_dispatch_info, opcode, + client->swapped); + if (proc != NULL) { + retval = (*proc) (cl, (GLbyte *) stuff); + } + else { + retval = BadRequest; + } + + return retval; +} + +static const GlxBackend siGlxBackend = { + /* Dispatched to every backend */ + .ClientInfo = siGlxDispatch, + .SetClientInfoARB = siGlxDispatch, + .SetClientInfo2ARB = siGlxDispatch, + + /* Dispatched to one backend */ + .Render = siGlxDispatch, + .RenderLarge = siGlxDispatch, + .CreateContext = siGlxDispatch, + .DestroyContext = siGlxDispatch, + .MakeCurrent = siGlxDispatch, + .IsDirect = siGlxDispatch, + .WaitGL = siGlxDispatch, + .WaitX = siGlxDispatch, + .CopyContext = siGlxDispatch, + .SwapBuffers = siGlxDispatch, + .UseXFont = siGlxDispatch, + .CreateGLXPixmap = siGlxDispatch, + .GetVisualConfigs = siGlxDispatch, + .DestroyGLXPixmap = siGlxDispatch, + .VendorPrivate = siGlxDispatch, + .QueryExtensionsString = siGlxDispatch, + .QueryServerString = siGlxDispatch, + .GetFBConfigs = siGlxDispatch, + .CreatePixmap = siGlxDispatch, + .DestroyPixmap = siGlxDispatch, + .CreateNewContext = siGlxDispatch, + .QueryContext = siGlxDispatch, + .MakeContextCurrent = siGlxDispatch, + .CreatePbuffer = siGlxDispatch, + .DestroyPbuffer = siGlxDispatch, + .GetDrawableAttributes = siGlxDispatch, + .ChangeDrawableAttributes = siGlxDispatch, + .CreateWindow = siGlxDispatch, + .DestroyWindow = siGlxDispatch, + .CreateContextAttribsARB = siGlxDispatch, + .Single = siGlxDispatch, +}; + /* ** Initialize the GLX extension. */ void -GlxExtensionInit(void) +GlxBackendInit(void) { - ExtensionEntry *extEntry; ScreenPtr pScreen; int i; __GLXprovider *p, **stack; @@ -367,12 +432,12 @@ GlxExtensionInit(void) glxScreen = p->screenProbe(pScreen); if (glxScreen != NULL) { + GlxSetBackend(pScreen, &siGlxBackend); LogMessage(X_INFO, "GLX: Initialized %s GL provider for screen %d\n", p->name, i); break; } - } if (!p) @@ -382,25 +447,12 @@ GlxExtensionInit(void) glx_provided = True; } - /* don't register extension if GL is not provided on any screen */ - if (!glx_provided) - return; - - /* - ** Add extension to server extensions. - */ - extEntry = AddExtension(GLX_EXTENSION_NAME, __GLX_NUMBER_EVENTS, - __GLX_NUMBER_ERRORS, __glXDispatch, - __glXDispatch, ResetExtension, StandardMinorOpcode); - if (!extEntry) { - FatalError("__glXExtensionInit: AddExtensions failed\n"); - return; - } - - GLXExtensionEntry = extEntry; + /* don't register hooks if GL is not provided on any screen */ + if (glx_provided) { #if PRESENT - __glXregisterPresentCompleteNotify(); + __glXregisterPresentCompleteNotify(); #endif + } } /************************************************************************/ @@ -480,33 +532,3 @@ void *__glGetProcAddress(const char *proc) return ret ? ret : (void *) NoopDDA; } - -/* -** Top level dispatcher; all commands are executed from here down. -*/ -static int -__glXDispatch(ClientPtr client) -{ - REQUEST(xGLXSingleReq); - CARD8 opcode; - __GLXdispatchSingleProcPtr proc; - __GLXclientState *cl; - int retval; - - opcode = stuff->glxCode; - cl = glxGetClient(client); - - /* - ** Use the opcode to index into the procedure table. - */ - proc = __glXGetProtocolDecodeFunction(&Single_dispatch_info, opcode, - client->swapped); - if (proc != NULL) { - retval = (*proc) (cl, (GLbyte *) stuff); - } - else { - retval = BadRequest; - } - - return retval; -} diff --git a/hw/vfb/meson.build b/hw/vfb/meson.build index 6566b4590..c796fe7c5 100644 --- a/hw/vfb/meson.build +++ b/hw/vfb/meson.build @@ -15,6 +15,7 @@ executable( libxserver, libxserver_xkb_stubs, libxserver_xi_stubs, + libglxfe, libxserver_glx ], install: true, -- cgit v1.2.3