st/dri: Use profiles to create OpenGL ES contexts.
authorChia-I Wu <olv@lunarg.com>
Fri, 10 Sep 2010 05:23:06 +0000 (13:23 +0800)
committerChia-I Wu <olv@lunarg.com>
Fri, 10 Sep 2010 07:43:34 +0000 (15:43 +0800)
Having 3 st_api's to provide OpenGL, OpenGL ES 1.1, and OpenGL ES 2.0 is
not a sane abstraction, since all of them share glapi for current
context/dispatch management.

src/gallium/state_trackers/dri/common/dri_context.c
src/gallium/state_trackers/dri/common/dri_screen.c
src/gallium/state_trackers/dri/common/dri_screen.h
src/gallium/state_trackers/dri/drm/dri2.c

index 8948cfc2ccb8a4cc888af053d0729c0beaa9dbd4..22e1b6dd70117c0c1a97bd3d6c8a68dbfe44ff79 100644 (file)
@@ -54,31 +54,23 @@ dri_create_context(gl_api api, const __GLcontextModes * visual,
 {
    __DRIscreen *sPriv = cPriv->driScreenPriv;
    struct dri_screen *screen = dri_screen(sPriv);
-   struct st_api *stapi;
+   struct st_api *stapi = screen->st_api;
    struct dri_context *ctx = NULL;
    struct st_context_iface *st_share = NULL;
    struct st_context_attribs attribs;
 
    memset(&attribs, 0, sizeof(attribs));
    switch (api) {
-   case API_OPENGL:
-      stapi = screen->st_api[ST_API_OPENGL];
-      attribs.profile = ST_PROFILE_DEFAULT;
-      break;
    case API_OPENGLES:
-      stapi = screen->st_api[ST_API_OPENGL_ES1];
       attribs.profile = ST_PROFILE_OPENGL_ES1;
       break;
    case API_OPENGLES2:
-      stapi = screen->st_api[ST_API_OPENGL_ES2];
       attribs.profile = ST_PROFILE_OPENGL_ES2;
       break;
    default:
-      stapi = NULL;
+      attribs.profile = ST_PROFILE_DEFAULT;
       break;
    }
-   if (!stapi)
-      return GL_FALSE;
 
    if (sharedContextPrivate) {
       st_share = ((struct dri_context *)sharedContextPrivate)->st;
@@ -195,24 +187,10 @@ struct dri_context *
 dri_get_current(__DRIscreen *sPriv)
 {
    struct dri_screen *screen = dri_screen(sPriv);
-   struct st_api *stapi;
-   struct st_context_iface *st = NULL;
-   gl_api api;
-
-   /* XXX: How do we do this when the screen supports
-      multiple rendering API's? Pick the first one,
-      like this? (NB: all three API's use the same
-      implementation of get_current (see st_manager.c),
-      so maybe it doesn't matter right now since
-      they'll all return the same result.) */
-   for (api = API_OPENGL; api <= API_OPENGLES2; ++api) {
-      stapi = screen->st_api[api];
-      if (!stapi)
-         continue;
-      st = stapi->get_current(stapi);
-      if (st)
-         break;
-   }
+   struct st_api *stapi = screen->st_api;
+   struct st_context_iface *st;
+
+   st = stapi->get_current(stapi);
 
    return (struct dri_context *) (st) ? st->st_manager_private : NULL;
 }
index 9d13d0d52e13a46db516e382f59e503e95af17aa..475a96d196716dba502362ff6703d25ddd589744 100644 (file)
@@ -344,12 +344,8 @@ dri_destroy_option_cache(struct dri_screen * screen)
 void
 dri_destroy_screen_helper(struct dri_screen * screen)
 {
-   int i;
-
-   for (i = 0; i < ST_API_COUNT; i++) {
-      if (screen->st_api[i] && screen->st_api[i]->destroy)
-         screen->st_api[i]->destroy(screen->st_api[i]);
-   }
+   if (screen->st_api && screen->st_api->destroy)
+      screen->st_api->destroy(screen->st_api);
 
    if (screen->base.screen)
       screen->base.screen->destroy(screen->base.screen);
@@ -383,14 +379,8 @@ dri_init_screen_helper(struct dri_screen *screen,
    screen->base.get_egl_image = dri_get_egl_image;
    screen->base.get_param = dri_get_param;
 
-   screen->st_api[ST_API_OPENGL] = st_gl_api_create();
-   screen->st_api[ST_API_OPENGL_ES1] = st_gl_api_create_es1();
-   screen->st_api[ST_API_OPENGL_ES2] = st_gl_api_create_es2();
-   /* no ST_API_OPENVG */
-
-   if (!screen->st_api[ST_API_OPENGL] &&
-       !screen->st_api[ST_API_OPENGL_ES1] &&
-       !screen->st_api[ST_API_OPENGL_ES2])
+   screen->st_api = st_gl_api_create();
+   if (!screen->st_api)
       return NULL;
 
    if(pscreen->get_param(pscreen, PIPE_CAP_NPOT_TEXTURES))
index baa204cd10f5f7063b78724e0de3ef39c3b09874..849f399b2f8198674794ad3a5af9e95b25b919c3 100644 (file)
@@ -47,7 +47,7 @@ struct dri_screen
 {
    /* st_api */
    struct st_manager base;
-   struct st_api *st_api[ST_API_COUNT];
+   struct st_api *st_api;
 
    /* on old libGL's invalidate doesn't get called as it should */
    boolean broken_invalidate;
index 3ba7961d7c7c2dccc66ef34321580b1620357b2e..596309bfbd9fbdad0d8f434556b089a831aa3d53 100644 (file)
@@ -528,11 +528,11 @@ dri2_init_screen(__DRIscreen * sPriv)
       goto fail;
 
    sPriv->api_mask = 0;
-   if (screen->st_api[ST_API_OPENGL])
+   if (screen->st_api->profile_mask & ST_PROFILE_DEFAULT_MASK)
       sPriv->api_mask |= 1 << __DRI_API_OPENGL;
-   if (screen->st_api[ST_API_OPENGL_ES1])
+   if (screen->st_api->profile_mask & ST_PROFILE_OPENGL_ES1_MASK)
       sPriv->api_mask |= 1 << __DRI_API_GLES;
-   if (screen->st_api[ST_API_OPENGL_ES2])
+   if (screen->st_api->profile_mask & ST_PROFILE_OPENGL_ES2_MASK)
       sPriv->api_mask |= 1 << __DRI_API_GLES2;
 
    screen->auto_fake_front = dri_with_format(sPriv);