Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2011 Intel Corporation
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  16.  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  17.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  18.  * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  19.  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  20.  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21.  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  22.  * DEALINGS IN THE SOFTWARE.
  23.  *
  24.  * Authors:
  25.  *    Benjamin Franzke <benjaminfranzke@googlemail.com>
  26.  */
  27.  
  28. #include <stdio.h>
  29. #include <stddef.h>
  30. #include <stdlib.h>
  31. #include <string.h>
  32. #include <limits.h>
  33.  
  34. #include "backend.h"
  35.  
  36. #define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
  37.  
  38. extern const struct gbm_backend gbm_dri_backend;
  39.  
  40. struct backend_desc {
  41.    const char *name;
  42.    const struct gbm_backend *builtin;
  43. };
  44.  
  45. static const struct backend_desc backends[] = {
  46.    { "gbm_dri.so", &gbm_dri_backend },
  47. };
  48.  
  49. static const void *
  50. load_backend(const struct backend_desc *backend)
  51. {
  52.    const void *init = NULL;
  53.  
  54.    if (backend == NULL)
  55.       return NULL;
  56.  
  57.    if (backend->builtin) {
  58.       init = backend->builtin;
  59.    }
  60.  
  61.    return init;
  62. }
  63.  
  64. static const struct backend_desc *
  65. find_backend(const char *name)
  66. {
  67.    const struct backend_desc *backend = NULL;
  68.    int i;
  69.  
  70.    for (i = 0; i < ARRAY_SIZE(backends); ++i) {
  71.       if (strcmp(backends[i].name, name) == 0) {
  72.          backend = &backends[i];
  73.          break;
  74.       }
  75.    }
  76.  
  77.    return backend;
  78. }
  79.  
  80. struct gbm_device *
  81. _gbm_create_device(int fd)
  82. {
  83.    const struct gbm_backend *backend = NULL;
  84.    struct gbm_device *dev = NULL;
  85.    int i;
  86.    const char *b;
  87.  
  88.    b = getenv("GBM_BACKEND");
  89.    if (b)
  90.       backend = load_backend(find_backend(b));
  91.  
  92.    if (backend)
  93.       dev = backend->create_device(fd);
  94.  
  95.    for (i = 0; i < ARRAY_SIZE(backends) && dev == NULL; ++i) {
  96.       backend = load_backend(&backends[i]);
  97.       if (backend == NULL)
  98.          continue;
  99.  
  100.       dev = backend->create_device(fd);
  101.    }
  102.    
  103.    return dev;
  104. }
  105.