コード例 #1
0
ファイル: context.c プロジェクト: Nicknekit/gl-wes-v2
void
wes_context_open(unsigned int  w, unsigned int  h, unsigned int  vsync)
{
    Device = (EGLNativeDisplayType) EGL_DEFAULT_DISPLAY;
    EGLint nConfigs;

    SDL_Init(SDL_INIT_EVERYTHING);
	if (SDL_SetVideoMode(w, h, 32, SDL_HWSURFACE) == NULL){
		PRINT_ERROR("\nCould not set Video Mode");
	}

	SDL_SysWMinfo info;
	SDL_VERSION(&info.version);
	SDL_GetWMInfo(&info);
	Handle = (EGLNativeWindowType) info.window;
	Device = GetDC(Handle);
    Display = eglGetDisplay((EGLNativeDisplayType) Device);

    if (Display == EGL_NO_DISPLAY){
        PRINT_ERROR("\nDisplay Get failed: %s", EGLErrorString());
    }

    if (!eglInitialize(Display, &VersionMajor, &VersionMinor)){
        PRINT_ERROR("\nDisplay Initialize failed: %s", EGLErrorString());
    }

    if (!eglChooseConfig(Display, ConfigAttribs, &Config, 1, &nConfigs)){
        PRINT_ERROR("\nConfiguration failed: %s", EGLErrorString());
    } else if (nConfigs != 1){
        PRINT_ERROR("\nConfiguration failed: nconfig %i, %s", nConfigs, EGLErrorString());
    }

    Surface = eglCreateWindowSurface(Display, Config, Handle, NULL);
    if (Surface == EGL_NO_SURFACE){
		PRINT_ERROR("\nSurface Creation failed: %s will attempt without window...", EGLErrorString());
        Surface = eglCreateWindowSurface(Display, Config, NULL, NULL);
        if (Surface == EGL_NO_SURFACE){
            PRINT_ERROR("\nSurface Creation failed: %s", EGLErrorString());
        }
    }
    eglBindAPI(EGL_OPENGL_ES_API);

    Context = eglCreateContext(Display, Config, EGL_NO_CONTEXT, ContextAttribs);
    if (Context == EGL_NO_CONTEXT){
        PRINT_ERROR("\nContext Creation failed: %s", EGLErrorString());
    }

    if (!eglMakeCurrent(Display, Surface, Surface, Context)){
        PRINT_ERROR("\nMake Current failed: %s", EGLErrorString());
    };
    eglSwapInterval(Display, vsync);
    freopen( "CON", "w", stdout );
    freopen( "CON", "w", stderr );
}
コード例 #2
0
/* Must be called in the gl thread */
GstGLWindow *
gst_gl_window_new (gulong external_gl_context)
{
  GstGLWindow *window = g_object_new (GST_GL_TYPE_WINDOW, NULL);
  GstGLWindowPrivate *priv = window->priv;

  EGLint config_attrib[] = {
    EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
    EGL_DEPTH_SIZE, 16,
    EGL_NONE
  };

  EGLint context_attrib[] = {
    EGL_CONTEXT_CLIENT_VERSION, 2,
    EGL_NONE
  };

  EGLint majorVersion;
  EGLint minorVersion;
  EGLint numConfigs;
  EGLConfig config;

  XSetWindowAttributes win_attr;
  XTextProperty text_property;
  XWMHints wm_hints;
  unsigned long mask;
  const gchar *title = "OpenGL renderer";
  Atom wm_atoms[3];

  static gint x = 0;
  static gint y = 0;

  setlocale (LC_NUMERIC, "C");

  priv->x_lock = g_mutex_new ();
  priv->cond_send_message = g_cond_new ();
  priv->running = TRUE;
  priv->visible = FALSE;
  priv->parent = 0;
  priv->allow_extra_expose_events = TRUE;

  g_mutex_lock (priv->x_lock);

  priv->device = XOpenDisplay (priv->display_name);

  XSynchronize (priv->device, FALSE);

  g_debug ("gl device id: %ld\n", (gulong) priv->device);

  priv->disp_send = XOpenDisplay (priv->display_name);

  XSynchronize (priv->disp_send, FALSE);

  g_debug ("gl display sender: %ld\n", (gulong) priv->disp_send);

  priv->screen_num = DefaultScreen (priv->device);
  priv->root = RootWindow (priv->device, priv->screen_num);
  priv->depth = DefaultDepth (priv->device, priv->screen_num);

  g_debug ("gl root id: %lud\n", (gulong) priv->root);

  priv->device_width = DisplayWidth (priv->device, priv->screen_num);
  priv->device_height = DisplayHeight (priv->device, priv->screen_num);

  priv->visual_info = g_new0 (XVisualInfo, 1);
  XMatchVisualInfo (priv->device, priv->screen_num, priv->depth, TrueColor,
      priv->visual_info);

  win_attr.event_mask =
      StructureNotifyMask | ExposureMask | VisibilityChangeMask;
  win_attr.do_not_propagate_mask = NoEventMask;

  win_attr.background_pixmap = None;
  win_attr.background_pixel = 0;
  win_attr.border_pixel = 0;

  win_attr.colormap =
      XCreateColormap (priv->device, priv->root, priv->visual_info->visual,
      AllocNone);

  mask = CWBackPixmap | CWBorderPixel | CWColormap | CWEventMask;

  x += 20;
  y += 20;

  priv->internal_win_id = XCreateWindow (priv->device, priv->root, x, y,
      1, 1, 0, priv->visual_info->depth, InputOutput,
      priv->visual_info->visual, mask, &win_attr);

  XSync (priv->device, FALSE);

  XSetWindowBackgroundPixmap (priv->device, priv->internal_win_id, None);

  g_debug ("gl window id: %lud\n", (gulong) priv->internal_win_id);

  g_debug ("gl window props: x:%d y:%d\n", x, y);

  wm_atoms[0] = XInternAtom (priv->device, "WM_DELETE_WINDOW", True);
  if (wm_atoms[0] == None)
    g_debug ("Cannot create WM_DELETE_WINDOW\n");

  wm_atoms[1] = XInternAtom (priv->device, "WM_GL_WINDOW", False);
  if (wm_atoms[1] == None)
    g_debug ("Cannot create WM_GL_WINDOW\n");

  wm_atoms[2] = XInternAtom (priv->device, "WM_QUIT_LOOP", False);
  if (wm_atoms[2] == None)
    g_debug ("Cannot create WM_QUIT_LOOP\n");

  XSetWMProtocols (priv->device, priv->internal_win_id, wm_atoms, 2);

  wm_hints.flags = StateHint;
  wm_hints.initial_state = NormalState;
  wm_hints.input = False;

  XStringListToTextProperty ((char **) &title, 1, &text_property);

  XSetWMProperties (priv->device, priv->internal_win_id, &text_property,
      &text_property, 0, 0, NULL, &wm_hints, NULL);

  XFree (text_property.value);

  priv->gl_display = eglGetDisplay ((EGLNativeDisplayType) priv->device);

  if (eglInitialize (priv->gl_display, &majorVersion, &minorVersion))
    g_debug ("egl initialized: %d.%d\n", majorVersion, minorVersion);
  else
    g_debug ("failed to initialize egl %ld, %s\n", (gulong) priv->gl_display,
        EGLErrorString ());

  if (eglChooseConfig (priv->gl_display, config_attrib, &config, 1,
          &numConfigs))
    g_debug ("config set: %ld, %ld\n", (gulong) config, (gulong) numConfigs);
  else
    g_debug ("failed to set config %ld, %s\n", (gulong) priv->gl_display,
        EGLErrorString ());

  priv->gl_surface =
      eglCreateWindowSurface (priv->gl_display, config,
      (EGLNativeWindowType) priv->internal_win_id, NULL);
  if (priv->gl_surface != EGL_NO_SURFACE)
    g_debug ("surface created: %ld\n", (gulong) priv->gl_surface);
  else
    g_debug ("failed to create surface %ld, %ld, %ld, %s\n",
        (gulong) priv->gl_display, (gulong) priv->gl_surface,
        (gulong) priv->gl_display, EGLErrorString ());

  priv->gl_context =
      eglCreateContext (priv->gl_display, config,
      (EGLContext) (guint) external_gl_context, context_attrib);
  if (priv->gl_context != EGL_NO_CONTEXT)
    g_debug ("gl context created: %ld\n", (gulong) priv->gl_context);
  else
    g_debug ("failed to create glcontext %ld, %ld, %s\n",
        (gulong) priv->gl_context, (gulong) priv->gl_display,
        EGLErrorString ());

  if (!eglMakeCurrent (priv->gl_display, priv->gl_surface, priv->gl_surface,
          priv->gl_context))
    g_debug ("failed to make opengl context current %ld, %s\n",
        (gulong) priv->gl_display, EGLErrorString ());

  g_mutex_unlock (priv->x_lock);

  return window;
}