summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChia-I Wu <[email protected]>2010-09-10 13:23:06 +0800
committerChia-I Wu <[email protected]>2010-09-10 15:43:34 +0800
commit0cd480f07639ec9ee01424aaa3e0c900b2204d4f (patch)
tree087ec60a0a29ebe5ba747f6f13c43616dac687d8 /src
parent4531356817ec8383ac35932903773de67af92e37 (diff)
st/dri: Use profiles to create OpenGL ES contexts.
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.
Diffstat (limited to 'src')
-rw-r--r--src/gallium/state_trackers/dri/common/dri_context.c34
-rw-r--r--src/gallium/state_trackers/dri/common/dri_screen.c18
-rw-r--r--src/gallium/state_trackers/dri/common/dri_screen.h2
-rw-r--r--src/gallium/state_trackers/dri/drm/dri2.c6
4 files changed, 14 insertions, 46 deletions
diff --git a/src/gallium/state_trackers/dri/common/dri_context.c b/src/gallium/state_trackers/dri/common/dri_context.c
index 8948cfc2ccb..22e1b6dd701 100644
--- a/src/gallium/state_trackers/dri/common/dri_context.c
+++ b/src/gallium/state_trackers/dri/common/dri_context.c
@@ -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;
}
diff --git a/src/gallium/state_trackers/dri/common/dri_screen.c b/src/gallium/state_trackers/dri/common/dri_screen.c
index 9d13d0d52e1..475a96d1967 100644
--- a/src/gallium/state_trackers/dri/common/dri_screen.c
+++ b/src/gallium/state_trackers/dri/common/dri_screen.c
@@ -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))
diff --git a/src/gallium/state_trackers/dri/common/dri_screen.h b/src/gallium/state_trackers/dri/common/dri_screen.h
index baa204cd10f..849f399b2f8 100644
--- a/src/gallium/state_trackers/dri/common/dri_screen.h
+++ b/src/gallium/state_trackers/dri/common/dri_screen.h
@@ -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;
diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
index 3ba7961d7c7..596309bfbd9 100644
--- a/src/gallium/state_trackers/dri/drm/dri2.c
+++ b/src/gallium/state_trackers/dri/drm/dri2.c
@@ -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);