コード例 #1
0
ファイル: native_drm.c プロジェクト: ChillyWillyGuru/RSXGL
static struct native_display *
native_create_display(void *dpy, boolean use_sw)
{
   struct gbm_gallium_drm_device *gbm;
   int fd;
   int own_gbm = 0;

   gbm = dpy;

   if (gbm == NULL) {
      fd = open("/dev/dri/card0", O_RDWR);
      /* FIXME: Use an internal constructor to create a gbm
       * device with gallium backend directly, without setenv */
      setenv("GBM_BACKEND", "gbm_gallium_drm.so", 1);
      gbm = gbm_gallium_drm_device(gbm_create_device(fd));
      own_gbm = 1;
   }

   if (gbm == NULL)
      return NULL;
   
   if (strcmp(gbm_device_get_backend_name(&gbm->base.base), "drm") != 0 ||
       gbm->base.type != GBM_DRM_DRIVER_TYPE_GALLIUM) {
      if (own_gbm)
         gbm_device_destroy(&gbm->base.base);
      return NULL;
   }

   return drm_create_display(gbm, own_gbm, drm_event_handler);
}
コード例 #2
0
ファイル: native_drm.c プロジェクト: Bluerise/bitrig-xenocara
static struct native_display *
native_create_display(void *dpy, boolean use_sw)
{
   struct gbm_gallium_drm_device *gbm;
   int fd;
   int own_gbm = 0;

   gbm = dpy;

   if (gbm == NULL) {
      const char *device_name="/dev/dri/card0";
#ifdef O_CLOEXEC
      fd = open(device_name, O_RDWR | O_CLOEXEC);
      if (fd == -1 && errno == EINVAL)
#endif
      {
         fd = open(device_name, O_RDWR);
         if (fd != -1)
            fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
      }
      /* FIXME: Use an internal constructor to create a gbm
       * device with gallium backend directly, without setenv */
      setenv("GBM_BACKEND", "gbm_gallium_drm.so", 1);
      gbm = gbm_gallium_drm_device(gbm_create_device(fd));
      own_gbm = 1;
   }

   if (gbm == NULL)
      return NULL;
   
   if (strcmp(gbm_device_get_backend_name(&gbm->base.base), "drm") != 0 ||
       gbm->base.type != GBM_DRM_DRIVER_TYPE_GALLIUM) {
      if (own_gbm)
         gbm_device_destroy(&gbm->base.base);
      return NULL;
   }

   return drm_create_display(gbm, own_gbm, drm_event_handler);
}