"Fossies" - the Fresh Open Source Software Archive

Member "mesa-20.1.8/src/egl/main/egldispatchstubs.c" (16 Sep 2020, 3169 Bytes) of package /linux/misc/mesa-20.1.8.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "egldispatchstubs.c" see the Fossies "Dox" file reference documentation.

    1 #include "egldispatchstubs.h"
    2 #include "g_egldispatchstubs.h"
    3 
    4 #include <string.h>
    5 #include <stdlib.h>
    6 
    7 #include "eglcurrent.h"
    8 
    9 static const __EGLapiExports *exports;
   10 
   11 const int __EGL_DISPATCH_FUNC_COUNT = __EGL_DISPATCH_COUNT;
   12 int __EGL_DISPATCH_FUNC_INDICES[__EGL_DISPATCH_COUNT + 1];
   13 
   14 static int Compare(const void *l, const void *r)
   15 {
   16     const char *s = *(const char **)r;
   17     return strcmp(l, s);
   18 }
   19 
   20 static int FindProcIndex(const char *name)
   21 {
   22     const char **match = bsearch(name, __EGL_DISPATCH_FUNC_NAMES,
   23             __EGL_DISPATCH_COUNT, sizeof(const char *), Compare);
   24 
   25     if (match == NULL)
   26         return __EGL_DISPATCH_COUNT;
   27 
   28     return match - __EGL_DISPATCH_FUNC_NAMES;
   29 }
   30 
   31 void __eglInitDispatchStubs(const __EGLapiExports *exportsTable)
   32 {
   33     int i;
   34     exports = exportsTable;
   35     for (i=0; i<__EGL_DISPATCH_FUNC_COUNT; i++) {
   36         __EGL_DISPATCH_FUNC_INDICES[i] = -1;
   37     }
   38 }
   39 
   40 void __eglSetDispatchIndex(const char *name, int dispatchIndex)
   41 {
   42     int index = FindProcIndex(name);
   43     __EGL_DISPATCH_FUNC_INDICES[index] = dispatchIndex;
   44 }
   45 
   46 void *__eglDispatchFindDispatchFunction(const char *name)
   47 {
   48     int index = FindProcIndex(name);
   49     return (void *) __EGL_DISPATCH_FUNCS[index];
   50 }
   51 
   52 static __eglMustCastToProperFunctionPointerType FetchVendorFunc(__EGLvendorInfo *vendor,
   53         int index, EGLint errorCode)
   54 {
   55     __eglMustCastToProperFunctionPointerType func = NULL;
   56 
   57     if (vendor != NULL) {
   58         func = exports->fetchDispatchEntry(vendor, __EGL_DISPATCH_FUNC_INDICES[index]);
   59     }
   60     if (func == NULL) {
   61         if (errorCode != EGL_SUCCESS) {
   62             // Since we have no vendor, the follow-up eglGetError() call will
   63             // end up using the GLVND error code. Set it here.
   64             if (vendor == NULL) {
   65                 exports->setEGLError(errorCode);
   66             }
   67             _eglError(errorCode, __EGL_DISPATCH_FUNC_NAMES[index]);
   68         }
   69         return NULL;
   70     }
   71 
   72     if (!exports->setLastVendor(vendor)) {
   73         // Don't bother trying to set an error code in libglvnd. If
   74         // setLastVendor failed, then setEGLError would also fail.
   75         _eglError(errorCode, __EGL_DISPATCH_FUNC_NAMES[index]);
   76         return NULL;
   77     }
   78 
   79     return func;
   80 }
   81 
   82 __eglMustCastToProperFunctionPointerType __eglDispatchFetchByCurrent(int index)
   83 {
   84     __EGLvendorInfo *vendor;
   85 
   86     // Note: This is only used for the eglWait* functions. For those, if
   87     // there's no current context, then they're supposed to do nothing but
   88     // return success.
   89     exports->threadInit();
   90     vendor = exports->getCurrentVendor();
   91     return FetchVendorFunc(vendor, index, EGL_SUCCESS);
   92 }
   93 
   94 __eglMustCastToProperFunctionPointerType __eglDispatchFetchByDisplay(EGLDisplay dpy, int index)
   95 {
   96     __EGLvendorInfo *vendor;
   97 
   98     exports->threadInit();
   99     vendor = exports->getVendorFromDisplay(dpy);
  100     return FetchVendorFunc(vendor, index, EGL_BAD_DISPLAY);
  101 }
  102 
  103 __eglMustCastToProperFunctionPointerType __eglDispatchFetchByDevice(EGLDeviceEXT dev, int index)
  104 {
  105     __EGLvendorInfo *vendor;
  106 
  107     exports->threadInit();
  108     vendor = exports->getVendorFromDevice(dev);
  109     return FetchVendorFunc(vendor, index, EGL_BAD_DEVICE_EXT);
  110 }
  111