"Fossies" - the Fresh Open Source Software Archive

Member "mesa-20.1.8/src/egl/main/egldriver.c" (16 Sep 2020, 3485 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 "egldriver.c" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 20.1.5_vs_20.2.0-rc1.

    1 /**************************************************************************
    2  *
    3  * Copyright 2008 VMware, Inc.
    4  * Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com>
    5  * Copyright 2010-2011 LunarG, Inc.
    6  * All Rights Reserved.
    7  *
    8  * Permission is hereby granted, free of charge, to any person obtaining a
    9  * copy of this software and associated documentation files (the
   10  * "Software"), to deal in the Software without restriction, including
   11  * without limitation the rights to use, copy, modify, merge, publish,
   12  * distribute, sub license, and/or sell copies of the Software, and to
   13  * permit persons to whom the Software is furnished to do so, subject to
   14  * the following conditions:
   15  *
   16  * The above copyright notice and this permission notice (including the
   17  * next paragraph) shall be included in all copies or substantial portions
   18  * of the Software.
   19  *
   20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   21  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
   23  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   24  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   25  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
   26  * DEALINGS IN THE SOFTWARE.
   27  *
   28  **************************************************************************/
   29 
   30 
   31 /**
   32  * Functions for choosing and opening/loading device drivers.
   33  */
   34 
   35 
   36 #include <assert.h>
   37 #include <string.h>
   38 #include <stdio.h>
   39 #include <stdlib.h>
   40 #include "c11/threads.h"
   41 
   42 #include "egldefines.h"
   43 #include "egldisplay.h"
   44 #include "egldriver.h"
   45 #include "egllog.h"
   46 
   47 #include "util/debug.h"
   48 
   49 static mtx_t _eglModuleMutex = _MTX_INITIALIZER_NP;
   50 static _EGLDriver *_eglDriver;
   51 
   52 static _EGLDriver *
   53 _eglGetDriver(void)
   54 {
   55    mtx_lock(&_eglModuleMutex);
   56 
   57    if (!_eglDriver) {
   58       _eglDriver = calloc(1, sizeof(*_eglDriver));
   59       if (!_eglDriver) {
   60          mtx_unlock(&_eglModuleMutex);
   61          return NULL;
   62       }
   63       _eglInitDriver(_eglDriver);
   64    }
   65 
   66    mtx_unlock(&_eglModuleMutex);
   67 
   68    return _eglDriver;
   69 }
   70 
   71 static _EGLDriver *
   72 _eglMatchAndInitialize(_EGLDisplay *disp)
   73 {
   74    if (_eglGetDriver())
   75       if (_eglDriver->API.Initialize(_eglDriver, disp))
   76          return _eglDriver;
   77 
   78    return NULL;
   79 }
   80 
   81 /**
   82  * Match a display to a driver.  The matching is done by finding the first
   83  * driver that can initialize the display.
   84  */
   85 _EGLDriver *
   86 _eglMatchDriver(_EGLDisplay *disp)
   87 {
   88    _EGLDriver *best_drv;
   89 
   90    assert(!disp->Initialized);
   91 
   92    /* set options */
   93    disp->Options.ForceSoftware =
   94       env_var_as_boolean("LIBGL_ALWAYS_SOFTWARE", false);
   95    if (disp->Options.ForceSoftware)
   96       _eglLog(_EGL_DEBUG, "Found 'LIBGL_ALWAYS_SOFTWARE' set, will use a CPU renderer");
   97 
   98    best_drv = _eglMatchAndInitialize(disp);
   99    if (!best_drv && !disp->Options.ForceSoftware) {
  100       disp->Options.ForceSoftware = EGL_TRUE;
  101       best_drv = _eglMatchAndInitialize(disp);
  102    }
  103 
  104    if (best_drv) {
  105       disp->Driver = best_drv;
  106       disp->Initialized = EGL_TRUE;
  107    }
  108 
  109    return best_drv;
  110 }
  111 
  112 __eglMustCastToProperFunctionPointerType
  113 _eglGetDriverProc(const char *procname)
  114 {
  115    if (_eglGetDriver() && _eglDriver->API.GetProcAddress)
  116       return _eglDriver->API.GetProcAddress(_eglDriver, procname);
  117 
  118    return NULL;
  119 }
  120 
  121 /**
  122  * Unload all drivers.
  123  */
  124 void
  125 _eglUnloadDrivers(void)
  126 {
  127    /* this is called at atexit time */
  128    free(_eglDriver);
  129    _eglDriver = NULL;
  130 }