Subversion Repositories Kolibri OS

Rev

Go to most recent revision | 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. //#include <dlfcn.h>
  34.  
  35. #include "backend.h"
  36.  
  37. #define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
  38.  
  39. extern const struct gbm_backend gbm_dri_backend;
  40.  
  41. struct backend_desc {
  42.    const char *name;
  43.    const struct gbm_backend *builtin;
  44. };
  45.  
  46. static const struct backend_desc backends[] = {
  47.    { "gbm_dri.so", &gbm_dri_backend }
  48. //   { "gbm_gallium_drm.so", NULL },
  49. };
  50.  
  51. #if 0
  52. static const void *
  53. load_backend(const struct backend_desc *backend)
  54. {
  55.    char path[PATH_MAX];
  56.    const void *init = NULL;
  57.    void *module;
  58.    const char *name;
  59.    const char *entrypoint = "gbm_backend";
  60.  
  61.    if (backend == NULL)
  62.       return NULL;
  63.  
  64.    name = backend->name;
  65.  
  66.    if (backend->builtin) {
  67.       init = backend->builtin;
  68.    } else {
  69. #if 0
  70.       if (name[0] != '/')
  71.          snprintf(path, sizeof path, MODULEDIR "/%s", name);
  72.       else
  73.          snprintf(path, sizeof path, "%s", name);
  74.  
  75.       module = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
  76.       if (!module) {
  77.          fprintf(stderr,
  78.                  "failed to load module: %s\n", dlerror());
  79.          return NULL;
  80.       }
  81.  
  82.       init = dlsym(module, entrypoint);
  83.       if (!init)
  84. #endif
  85.          return NULL;
  86.    }
  87.  
  88.    return init;
  89. }
  90.  
  91. static const struct backend_desc *
  92. find_backend(const char *name)
  93. {
  94.    const struct backend_desc *backend = NULL;
  95.    int i;
  96.  
  97.    for (i = 0; i < ARRAY_SIZE(backends); ++i) {
  98.       if (strcmp(backends[i].name, name) == 0) {
  99.          backend = &backends[i];
  100.          break;
  101.       }
  102.    }
  103.  
  104.    return backend;
  105. }
  106. #endif
  107.  
  108. struct gbm_device *
  109. _gbm_create_device(int fd)
  110. {
  111.    const struct gbm_backend *backend = NULL;
  112.    struct gbm_device *dev = NULL;
  113.  
  114. #if 0
  115.    int i;
  116.    const char *b;
  117.  
  118.    b = getenv("GBM_BACKEND");
  119.    if (b)
  120.       backend = load_backend(find_backend(b));
  121.  
  122.    if (backend)
  123.       dev = backend->create_device(fd);
  124.  
  125.    for (i = 0; i < ARRAY_SIZE(backends) && dev == NULL; ++i) {
  126.       backend = load_backend(&backends[i]);
  127.       if (backend == NULL)
  128.          continue;
  129.  
  130.       dev = backend->create_device(fd);
  131.    }
  132. #endif
  133.  
  134.    backend = &gbm_dri_backend;
  135.    dev = backend->create_device(fd);
  136.  
  137.    return dev;
  138. }
  139.