summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChia-I Wu <olvaffe@gmail.com>2010-02-07 20:22:08 +0800
committerChia-I Wu <olvaffe@gmail.com>2010-02-07 20:24:05 +0800
commit8550c7f01e0ebe1f0dec5dcee4ce7fafbe73da95 (patch)
tree5cd04fe484560f6bcdc884f8b4bdc5450b05aae1
parent0dccfa6e51242d6e96ce8e7ad1a14720527bceba (diff)
Update SI again with experimental OpenGL support.
-rw-r--r--sample-implementation-tmp/0001-gallium-Add-st_api.h.patch2
-rw-r--r--sample-implementation-tmp/0002-st-vega-Implement-st_api-interface.patch2
-rw-r--r--sample-implementation-tmp/0003-st-egl-Add-support-for-loading-st_api-modules.patch2
-rw-r--r--sample-implementation-tmp/0004-st-egl-Use-st_api.h-instead-of-st_public.h.patch145
-rw-r--r--sample-implementation-tmp/0005-st-mesa-Implement-st_api.h.patch826
-rw-r--r--sample-implementation-tmp/0006-winsys-xlib-st-es-Advertise-st_api.h-support.patch79
6 files changed, 995 insertions, 61 deletions
diff --git a/sample-implementation-tmp/0001-gallium-Add-st_api.h.patch b/sample-implementation-tmp/0001-gallium-Add-st_api.h.patch
index 8dae1b4..ba3f6bc 100644
--- a/sample-implementation-tmp/0001-gallium-Add-st_api.h.patch
+++ b/sample-implementation-tmp/0001-gallium-Add-st_api.h.patch
@@ -1,7 +1,7 @@
From 505cf68e37db2a13503466221e70e999edd5b9eb Mon Sep 17 00:00:00 2001
From: Chia-I Wu <olv@lunarg.com>
Date: Sun, 7 Feb 2010 00:52:02 +0800
-Subject: [PATCH 1/4] gallium: Add st_api.h.
+Subject: [PATCH 1/6] gallium: Add st_api.h.
---
src/gallium/include/state_tracker/st_api.h | 410 ++++++++++++++++++++++++++++
diff --git a/sample-implementation-tmp/0002-st-vega-Implement-st_api-interface.patch b/sample-implementation-tmp/0002-st-vega-Implement-st_api-interface.patch
index 2289eee..d854474 100644
--- a/sample-implementation-tmp/0002-st-vega-Implement-st_api-interface.patch
+++ b/sample-implementation-tmp/0002-st-vega-Implement-st_api-interface.patch
@@ -1,7 +1,7 @@
From 15419adf260b9314f487bcb855585821fa6a0d73 Mon Sep 17 00:00:00 2001
From: Chia-I Wu <olvaffe@gmail.com>
Date: Thu, 14 Jan 2010 12:19:32 +0800
-Subject: [PATCH 2/4] st/vega: Implement st_api interface.
+Subject: [PATCH 2/6] st/vega: Implement st_api interface.
---
src/gallium/state_trackers/vega/Makefile | 1 +
diff --git a/sample-implementation-tmp/0003-st-egl-Add-support-for-loading-st_api-modules.patch b/sample-implementation-tmp/0003-st-egl-Add-support-for-loading-st_api-modules.patch
index 1db01c4..aa6446d 100644
--- a/sample-implementation-tmp/0003-st-egl-Add-support-for-loading-st_api-modules.patch
+++ b/sample-implementation-tmp/0003-st-egl-Add-support-for-loading-st_api-modules.patch
@@ -1,7 +1,7 @@
From 83339a659017402745437c03240d1837cad3649f Mon Sep 17 00:00:00 2001
From: Chia-I Wu <olvaffe@gmail.com>
Date: Thu, 14 Jan 2010 16:05:36 +0800
-Subject: [PATCH 3/4] st/egl: Add support for loading st_api modules.
+Subject: [PATCH 3/6] st/egl: Add support for loading st_api modules.
---
src/gallium/state_trackers/egl/common/egl_st_api.c | 116 ++++++++++++++++++++
diff --git a/sample-implementation-tmp/0004-st-egl-Use-st_api.h-instead-of-st_public.h.patch b/sample-implementation-tmp/0004-st-egl-Use-st_api.h-instead-of-st_public.h.patch
index 8cc9ba0..5c39b3c 100644
--- a/sample-implementation-tmp/0004-st-egl-Use-st_api.h-instead-of-st_public.h.patch
+++ b/sample-implementation-tmp/0004-st-egl-Use-st_api.h-instead-of-st_public.h.patch
@@ -1,22 +1,22 @@
-From 6134333acceea0f03bcd92869ab4e13210a4034f Mon Sep 17 00:00:00 2001
+From 2aa90754de3813d10d9a5ac2e066498283b09f2b Mon Sep 17 00:00:00 2001
From: Chia-I Wu <olv@lunarg.com>
Date: Sun, 7 Feb 2010 00:52:11 +0800
-Subject: [PATCH 4/4] st/egl: Use st_api.h instead of st_public.h.
+Subject: [PATCH 4/6] st/egl: Use st_api.h instead of st_public.h.
---
- src/gallium/state_trackers/egl/common/egl_g3d.c | 549 ++++++++------------
- src/gallium/state_trackers/egl/common/egl_g3d.h | 20 +-
+ src/gallium/state_trackers/egl/common/egl_g3d.c | 556 ++++++++------------
+ src/gallium/state_trackers/egl/common/egl_g3d.h | 21 +-
src/gallium/state_trackers/egl/common/egl_st.c | 131 -----
src/gallium/state_trackers/egl/common/egl_st.h | 73 ---
src/gallium/state_trackers/egl/common/egl_st_api.c | 13 +
.../state_trackers/egl/common/st_public_tmp.h | 20 -
- 6 files changed, 248 insertions(+), 558 deletions(-)
+ 6 files changed, 254 insertions(+), 560 deletions(-)
delete mode 100644 src/gallium/state_trackers/egl/common/egl_st.c
delete mode 100644 src/gallium/state_trackers/egl/common/egl_st.h
delete mode 100644 src/gallium/state_trackers/egl/common/st_public_tmp.h
diff --git a/src/gallium/state_trackers/egl/common/egl_g3d.c b/src/gallium/state_trackers/egl/common/egl_g3d.c
-index 7021617..3734756 100644
+index 7021617..deaab38 100644
--- a/src/gallium/state_trackers/egl/common/egl_g3d.c
+++ b/src/gallium/state_trackers/egl/common/egl_g3d.c
@@ -36,233 +36,26 @@
@@ -285,7 +285,47 @@ index 7021617..3734756 100644
}
if (gdrv->api_mask)
-@@ -507,36 +300,6 @@ egl_g3d_add_configs(_EGLDriver *drv, _EGLDisplay *dpy, EGLint id)
+@@ -379,6 +172,31 @@ get_mode_api_mask(const __GLcontextModes *mode, EGLint api_mask)
+ return api_mask;
+ }
+
++static void
++init_st_visual(_EGLConfig *conf)
++{
++ struct egl_g3d_config *gconf = egl_g3d_config(conf);
++ unsigned buffer_mask;
++
++ buffer_mask = ST_ATTACHMENT_FRONT_LEFT_MASK;
++ if (gconf->native->mode.doubleBufferMode)
++ buffer_mask |= ST_ATTACHMENT_BACK_LEFT_MASK;
++ if (gconf->native->mode.stereoMode) {
++ buffer_mask |= ST_ATTACHMENT_FRONT_RIGHT_MASK;
++ if (gconf->native->mode.doubleBufferMode)
++ buffer_mask |= ST_ATTACHMENT_BACK_RIGHT_MASK;
++ }
++
++ gconf->stvis.buffer_mask = buffer_mask;
++ gconf->stvis.color_format = gconf->native->color_format;
++ gconf->stvis.depth_stencil_format = gconf->native->depth_format;
++ gconf->stvis.accum_format = PIPE_FORMAT_NONE;
++ gconf->stvis.samples = 0;
++
++ gconf->stvis.render_buffer = (buffer_mask & ST_ATTACHMENT_BACK_LEFT) ?
++ ST_ATTACHMENT_BACK_LEFT : ST_ATTACHMENT_FRONT_LEFT;
++}
++
+ #ifdef EGL_MESA_screen_surface
+
+ static void
+@@ -499,6 +317,7 @@ egl_g3d_add_configs(_EGLDriver *drv, _EGLDisplay *dpy, EGLint id)
+ }
+
+ gconf->native = native_configs[i];
++ init_st_visual(&gconf->base);
+ _eglAddConfig(dpy, &gconf->base);
+ id++;
+ }
+@@ -507,36 +326,6 @@ egl_g3d_add_configs(_EGLDriver *drv, _EGLDisplay *dpy, EGLint id)
return id;
}
@@ -322,7 +362,7 @@ index 7021617..3734756 100644
static EGLBoolean
egl_g3d_terminate(_EGLDriver *drv, _EGLDisplay *dpy)
{
-@@ -555,6 +318,9 @@ egl_g3d_terminate(_EGLDriver *drv, _EGLDisplay *dpy)
+@@ -555,6 +344,9 @@ egl_g3d_terminate(_EGLDriver *drv, _EGLDisplay *dpy)
free(dpy->Screens);
}
@@ -332,7 +372,7 @@ index 7021617..3734756 100644
if (gdpy->native)
gdpy->native->destroy(gdpy->native);
-@@ -587,9 +353,6 @@ egl_g3d_initialize(_EGLDriver *drv, _EGLDisplay *dpy,
+@@ -587,9 +379,6 @@ egl_g3d_initialize(_EGLDriver *drv, _EGLDisplay *dpy,
goto fail;
}
@@ -342,7 +382,7 @@ index 7021617..3734756 100644
egl_g3d_init_st(&gdrv->base);
dpy->ClientAPIsMask = gdrv->api_mask;
-@@ -598,6 +361,13 @@ egl_g3d_initialize(_EGLDriver *drv, _EGLDisplay *dpy,
+@@ -598,6 +387,13 @@ egl_g3d_initialize(_EGLDriver *drv, _EGLDisplay *dpy,
goto fail;
}
@@ -356,18 +396,19 @@ index 7021617..3734756 100644
#ifdef EGL_MESA_screen_surface
/* enable MESA_screen_surface */
if (gdpy->native->modeset) {
-@@ -626,6 +396,7 @@ egl_g3d_create_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf,
+@@ -625,7 +421,6 @@ egl_g3d_create_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf,
+ struct egl_g3d_context *gshare = egl_g3d_context(share);
struct egl_g3d_config *gconf = egl_g3d_config(conf);
struct egl_g3d_context *gctx;
- const __GLcontextModes *mode;
-+ struct st_visual stvis;
+- const __GLcontextModes *mode;
gctx = CALLOC_STRUCT(egl_g3d_context);
if (!gctx) {
-@@ -645,17 +416,11 @@ egl_g3d_create_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf,
+@@ -644,18 +439,9 @@ egl_g3d_create_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf,
+ return NULL;
}
- mode = &gconf->native->mode;
+- mode = &gconf->native->mode;
- gctx->pipe =
- gdpy->native->create_context(gdpy->native, (void *) &gctx->base);
- if (!gctx->pipe) {
@@ -379,15 +420,13 @@ index 7021617..3734756 100644
- (gshare) ? gshare->st_ctx : NULL);
- if (!gctx->st_ctx) {
- gctx->pipe->destroy(gctx->pipe);
-+ /* not sure if a visual is needed */
-+ memset(&stvis, 0, sizeof(stvis));
+ gctx->stctxi = gctx->stapi->create_context(gctx->stapi, gdpy->smapi,
-+ &stvis, (gshare) ? gshare->stctxi : NULL);
++ &gconf->stvis, (gshare) ? gshare->stctxi : NULL);
+ if (!gctx->stctxi) {
free(gctx);
return NULL;
}
-@@ -675,9 +440,7 @@ destroy_context(_EGLDisplay *dpy, _EGLContext *ctx)
+@@ -675,9 +461,7 @@ destroy_context(_EGLDisplay *dpy, _EGLContext *ctx)
if (!dpy->Initialized)
_eglLog(_EGL_FATAL, "destroy a context with an unitialized display");
@@ -398,7 +437,7 @@ index 7021617..3734756 100644
free(gctx);
}
-@@ -690,6 +453,140 @@ egl_g3d_destroy_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx)
+@@ -690,6 +474,122 @@ egl_g3d_destroy_context(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx)
return EGL_TRUE;
}
@@ -499,32 +538,14 @@ index 7021617..3734756 100644
+ struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
+ struct egl_g3d_config *gconf = egl_g3d_config(conf);
+ struct st_framebuffer_iface *stfbi;
-+ unsigned buffer_mask;
+
+ stfbi = CALLOC_STRUCT(st_framebuffer_iface);
+ if (!stfbi)
+ return EGL_FALSE;
+
-+ buffer_mask = ST_ATTACHMENT_FRONT_LEFT_MASK;
-+ if (gconf->native->mode.doubleBufferMode)
-+ buffer_mask |= ST_ATTACHMENT_BACK_LEFT_MASK;
-+ if (gconf->native->mode.stereoMode) {
-+ buffer_mask |= ST_ATTACHMENT_FRONT_RIGHT_MASK;
-+ if (gconf->native->mode.doubleBufferMode)
-+ buffer_mask |= ST_ATTACHMENT_BACK_RIGHT_MASK;
-+ }
-+
-+ gsurf->stvis.buffer_mask = buffer_mask;
-+ gsurf->stvis.color_format = gconf->native->color_format;
-+ gsurf->stvis.depth_stencil_format = gconf->native->depth_format;
-+ gsurf->stvis.accum_format = PIPE_FORMAT_NONE;
-+ gsurf->stvis.samples = 0;
-+
-+ if (gsurf->base.RenderBuffer == EGL_SINGLE_BUFFER ||
-+ !(buffer_mask & ST_ATTACHMENT_BACK_LEFT))
++ gsurf->stvis = gconf->stvis;
++ if (gsurf->base.RenderBuffer == EGL_SINGLE_BUFFER)
+ gsurf->stvis.render_buffer = ST_ATTACHMENT_FRONT_LEFT;
-+ else
-+ gsurf->stvis.render_buffer = ST_ATTACHMENT_BACK_LEFT;
+
+ stfbi->visual = &gsurf->stvis;
+ stfbi->flush_front = egl_g3d_framebuffer_flush_front;
@@ -539,7 +560,7 @@ index 7021617..3734756 100644
static EGLBoolean
init_surface_geometry(_EGLSurface *surf)
{
-@@ -727,16 +624,13 @@ egl_g3d_create_window_surface(_EGLDriver *drv, _EGLDisplay *dpy,
+@@ -727,16 +627,13 @@ egl_g3d_create_window_surface(_EGLDriver *drv, _EGLDisplay *dpy,
return NULL;
}
@@ -558,7 +579,7 @@ index 7021617..3734756 100644
return &gsurf->base;
}
-@@ -767,14 +661,13 @@ egl_g3d_create_pixmap_surface(_EGLDriver *drv, _EGLDisplay *dpy,
+@@ -767,14 +664,13 @@ egl_g3d_create_pixmap_surface(_EGLDriver *drv, _EGLDisplay *dpy,
return NULL;
}
@@ -575,7 +596,7 @@ index 7021617..3734756 100644
return &gsurf->base;
}
-@@ -805,15 +698,13 @@ egl_g3d_create_pbuffer_surface(_EGLDriver *drv, _EGLDisplay *dpy,
+@@ -805,15 +701,13 @@ egl_g3d_create_pbuffer_surface(_EGLDriver *drv, _EGLDisplay *dpy,
return NULL;
}
@@ -593,7 +614,7 @@ index 7021617..3734756 100644
return &gsurf->base;
}
-@@ -831,6 +722,7 @@ destroy_surface(_EGLDisplay *dpy, _EGLSurface *surf)
+@@ -831,6 +725,7 @@ destroy_surface(_EGLDisplay *dpy, _EGLSurface *surf)
pipe_surface_reference(&gsurf->render_surface, NULL);
gsurf->native->destroy(gsurf->native);
@@ -601,7 +622,7 @@ index 7021617..3734756 100644
free(gsurf);
}
-@@ -848,6 +740,7 @@ egl_g3d_make_current(_EGLDriver *drv, _EGLDisplay *dpy,
+@@ -848,6 +743,7 @@ egl_g3d_make_current(_EGLDriver *drv, _EGLDisplay *dpy,
{
struct egl_g3d_context *gctx = egl_g3d_context(ctx);
struct egl_g3d_surface *gdraw = egl_g3d_surface(draw);
@@ -609,7 +630,7 @@ index 7021617..3734756 100644
struct egl_g3d_context *old_gctx;
EGLBoolean ok = EGL_TRUE;
-@@ -858,34 +751,29 @@ egl_g3d_make_current(_EGLDriver *drv, _EGLDisplay *dpy,
+@@ -858,34 +754,29 @@ egl_g3d_make_current(_EGLDriver *drv, _EGLDisplay *dpy,
if (old_gctx) {
/* flush old context */
@@ -658,7 +679,7 @@ index 7021617..3734756 100644
old_gctx->base.WindowRenderBuffer = EGL_NONE;
}
-@@ -912,15 +800,17 @@ egl_g3d_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
+@@ -912,15 +803,17 @@ egl_g3d_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
return EGL_TRUE;
/* or when the surface is single-buffered */
@@ -679,7 +700,7 @@ index 7021617..3734756 100644
/*
* We drew on the back buffer, unless there was no back buffer.
-@@ -933,11 +823,9 @@ egl_g3d_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
+@@ -933,11 +826,9 @@ egl_g3d_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
if (gctx) {
struct egl_g3d_config *gconf = egl_g3d_config(gsurf->base.Config);
@@ -694,7 +715,7 @@ index 7021617..3734756 100644
}
return EGL_TRUE;
-@@ -1011,7 +899,7 @@ egl_g3d_copy_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
+@@ -1011,7 +902,7 @@ egl_g3d_copy_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
/* flush if the surface is current */
if (ctx && ctx->DrawSurface == &gsurf->base) {
struct egl_g3d_context *gctx = egl_g3d_context(ctx);
@@ -703,7 +724,7 @@ index 7021617..3734756 100644
PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, NULL);
}
-@@ -1041,8 +929,16 @@ egl_g3d_copy_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
+@@ -1041,8 +932,16 @@ egl_g3d_copy_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
static EGLBoolean
egl_g3d_wait_client(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx)
{
@@ -721,7 +742,7 @@ index 7021617..3734756 100644
return EGL_TRUE;
}
-@@ -1072,10 +968,10 @@ egl_g3d_get_proc_address(_EGLDriver *drv, const char *procname)
+@@ -1072,10 +971,10 @@ egl_g3d_get_proc_address(_EGLDriver *drv, const char *procname)
/* in case this is called before a display is initialized */
egl_g3d_init_st(&gdrv->base);
@@ -735,7 +756,7 @@ index 7021617..3734756 100644
if (proc)
return proc;
}
-@@ -1091,8 +987,8 @@ egl_g3d_bind_tex_image(_EGLDriver *drv, _EGLDisplay *dpy,
+@@ -1091,8 +990,8 @@ egl_g3d_bind_tex_image(_EGLDriver *drv, _EGLDisplay *dpy,
struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
_EGLContext *es1 = _eglGetAPIContext(EGL_OPENGL_ES_API);
struct egl_g3d_context *gctx;
@@ -746,7 +767,7 @@ index 7021617..3734756 100644
if (!gsurf || gsurf->base.Type != EGL_PBUFFER_BIT)
return _eglError(EGL_BAD_SURFACE, "eglBindTexImage");
-@@ -1103,10 +999,10 @@ egl_g3d_bind_tex_image(_EGLDriver *drv, _EGLDisplay *dpy,
+@@ -1103,10 +1002,10 @@ egl_g3d_bind_tex_image(_EGLDriver *drv, _EGLDisplay *dpy,
switch (gsurf->base.TextureFormat) {
case EGL_TEXTURE_RGB:
@@ -759,7 +780,7 @@ index 7021617..3734756 100644
break;
default:
return _eglError(EGL_BAD_MATCH, "eglBindTexImage");
-@@ -1128,15 +1024,18 @@ egl_g3d_bind_tex_image(_EGLDriver *drv, _EGLDisplay *dpy,
+@@ -1128,15 +1027,18 @@ egl_g3d_bind_tex_image(_EGLDriver *drv, _EGLDisplay *dpy,
/* flush properly if the surface is bound */
if (gsurf->base.CurrentContext) {
gctx = egl_g3d_context(gsurf->base.CurrentContext);
@@ -783,7 +804,7 @@ index 7021617..3734756 100644
return EGL_TRUE;
}
-@@ -1158,9 +1057,10 @@ egl_g3d_release_tex_image(_EGLDriver *drv, _EGLDisplay *dpy,
+@@ -1158,9 +1060,10 @@ egl_g3d_release_tex_image(_EGLDriver *drv, _EGLDisplay *dpy,
struct egl_g3d_context *gctx = egl_g3d_context(ctx);
/* what if the context the surface binds to is no longer current? */
@@ -797,7 +818,7 @@ index 7021617..3734756 100644
}
gsurf->base.BoundToTexture = EGL_FALSE;
-@@ -1198,9 +1098,6 @@ egl_g3d_create_screen_surface(_EGLDriver *drv, _EGLDisplay *dpy,
+@@ -1198,9 +1101,6 @@ egl_g3d_create_screen_surface(_EGLDriver *drv, _EGLDisplay *dpy,
return NULL;
}
@@ -807,7 +828,7 @@ index 7021617..3734756 100644
return &gsurf->base;
}
-@@ -1294,6 +1191,12 @@ static void
+@@ -1294,6 +1194,12 @@ static void
egl_g3d_unload(_EGLDriver *drv)
{
struct egl_g3d_driver *gdrv = egl_g3d_driver(drv);
@@ -821,7 +842,7 @@ index 7021617..3734756 100644
egl_g3d_destroy_probe(drv, NULL);
free(gdrv);
diff --git a/src/gallium/state_trackers/egl/common/egl_g3d.h b/src/gallium/state_trackers/egl/common/egl_g3d.h
-index 5d2d9c4..ef92c34 100644
+index 5d2d9c4..8dba070 100644
--- a/src/gallium/state_trackers/egl/common/egl_g3d.h
+++ b/src/gallium/state_trackers/egl/common/egl_g3d.h
@@ -38,11 +38,11 @@
@@ -874,6 +895,14 @@ index 5d2d9c4..ef92c34 100644
struct pipe_surface *render_surface;
unsigned int sequence_number;
};
+@@ -79,6 +77,7 @@ struct egl_g3d_surface {
+ struct egl_g3d_config {
+ _EGLConfig base;
+ const struct native_config *native;
++ struct st_visual stvis;
+ };
+
+ struct egl_g3d_screen {
diff --git a/src/gallium/state_trackers/egl/common/egl_st.c b/src/gallium/state_trackers/egl/common/egl_st.c
deleted file mode 100644
index a88ff91..0000000
diff --git a/sample-implementation-tmp/0005-st-mesa-Implement-st_api.h.patch b/sample-implementation-tmp/0005-st-mesa-Implement-st_api.h.patch
new file mode 100644
index 0000000..21c07e9
--- /dev/null
+++ b/sample-implementation-tmp/0005-st-mesa-Implement-st_api.h.patch
@@ -0,0 +1,826 @@
+From 6fa73e237b48f8f9b2a6d3393386301c30996401 Mon Sep 17 00:00:00 2001
+From: Chia-I Wu <olv@lunarg.com>
+Date: Sun, 7 Feb 2010 19:20:52 +0800
+Subject: [PATCH 5/6] st/mesa: Implement st_api.h.
+
+---
+ src/mesa/SConscript | 1 +
+ src/mesa/es/sources.mak | 2 +
+ src/mesa/es/state_tracker/gl_api_es1.c | 7 +
+ src/mesa/es/state_tracker/gl_api_es2.c | 7 +
+ src/mesa/sources.mak | 1 +
+ src/mesa/state_tracker/gl_api.c | 639 ++++++++++++++++++++++++++++++++
+ src/mesa/state_tracker/gl_api.h | 22 ++
+ src/mesa/state_tracker/st_context.c | 1 +
+ src/mesa/state_tracker/st_context.h | 6 +
+ src/mesa/state_tracker/st_public.h | 2 +
+ 10 files changed, 688 insertions(+), 0 deletions(-)
+ create mode 100644 src/mesa/es/state_tracker/gl_api_es1.c
+ create mode 100644 src/mesa/es/state_tracker/gl_api_es2.c
+ create mode 100644 src/mesa/state_tracker/gl_api.c
+ create mode 100644 src/mesa/state_tracker/gl_api.h
+
+diff --git a/src/mesa/SConscript b/src/mesa/SConscript
+index ea5bad2..fbcbe95 100644
+--- a/src/mesa/SConscript
++++ b/src/mesa/SConscript
+@@ -144,6 +144,7 @@ if env['platform'] != 'winddk':
+ ]
+
+ statetracker_sources = [
++ 'state_tracker/gl_api.c',
+ 'state_tracker/st_atom.c',
+ 'state_tracker/st_atom_blend.c',
+ 'state_tracker/st_atom_clip.c',
+diff --git a/src/mesa/es/sources.mak b/src/mesa/es/sources.mak
+index 55bb31b..0c2e617 100644
+--- a/src/mesa/es/sources.mak
++++ b/src/mesa/es/sources.mak
+@@ -17,6 +17,7 @@ LOCAL_ES1_SOURCES := \
+
+ LOCAL_ES1_GALLIUM_SOURCES := \
+ $(LOCAL_ES1_SOURCES) \
++ state_tracker/gl_api_es1.c \
+ state_tracker/st_cb_drawtex.c
+
+ # always use local version of GLAPI_ASM_SOURCES
+@@ -38,6 +39,7 @@ LOCAL_ES2_SOURCES := \
+ glapi/glapi-es2/main/enums.c
+
+ LOCAL_ES2_GALLIUM_SOURCES := \
++ state_tracker/gl_api_es2.c \
+ $(LOCAL_ES2_SOURCES)
+
+ LOCAL_ES2_API_ASM := $(subst es1,es2, $(LOCAL_ES1_API_ASM))
+diff --git a/src/mesa/es/state_tracker/gl_api_es1.c b/src/mesa/es/state_tracker/gl_api_es1.c
+new file mode 100644
+index 0000000..b1abb52
+--- /dev/null
++++ b/src/mesa/es/state_tracker/gl_api_es1.c
+@@ -0,0 +1,7 @@
++#include "state_tracker/gl_api.h"
++
++void
++st_api_create_context_extra(struct st_context *st)
++{
++ st->iface.api = ST_API_OPENGL_ES1;
++}
+diff --git a/src/mesa/es/state_tracker/gl_api_es2.c b/src/mesa/es/state_tracker/gl_api_es2.c
+new file mode 100644
+index 0000000..0c3d1ff
+--- /dev/null
++++ b/src/mesa/es/state_tracker/gl_api_es2.c
+@@ -0,0 +1,7 @@
++#include "state_tracker/gl_api.h"
++
++void
++st_api_create_context_extra(struct st_context *st)
++{
++ st->iface.api = ST_API_OPENGL_ES2;
++}
+diff --git a/src/mesa/sources.mak b/src/mesa/sources.mak
+index 12d4c28..84afea4 100644
+--- a/src/mesa/sources.mak
++++ b/src/mesa/sources.mak
+@@ -174,6 +174,7 @@ VBO_SOURCES = \
+ vbo/vbo_save_loopback.c
+
+ STATETRACKER_SOURCES = \
++ state_tracker/gl_api.c \
+ state_tracker/st_atom.c \
+ state_tracker/st_atom_blend.c \
+ state_tracker/st_atom_clip.c \
+diff --git a/src/mesa/state_tracker/gl_api.c b/src/mesa/state_tracker/gl_api.c
+new file mode 100644
+index 0000000..358ffb2
+--- /dev/null
++++ b/src/mesa/state_tracker/gl_api.c
+@@ -0,0 +1,639 @@
++#include "state_tracker/st_api.h"
++
++#include "pipe/p_context.h"
++#include "pipe/p_screen.h"
++#include "util/u_format.h"
++#include "util/u_inlines.h"
++
++#include "main/mtypes.h"
++#include "main/context.h"
++#include "main/texobj.h"
++#include "main/teximage.h"
++#include "main/texstate.h"
++#include "main/texfetch.h"
++#include "main/fbobject.h"
++#include "main/framebuffer.h"
++#include "main/renderbuffer.h"
++#include "st_texture.h"
++
++#include "st_context.h"
++#include "st_format.h"
++#include "st_cb_fbo.h"
++#include "gl_api.h"
++
++/* these two functions are defined in st_context.c */
++struct st_context *
++st_create_context(struct pipe_context *pipe,
++ const __GLcontextModes *visual,
++ struct st_context *share);
++void st_destroy_context(struct st_context *st);
++
++/**
++ * Return a reference to the pipe texture of the EGLImage.
++ */
++struct pipe_texture *
++st_manager_reference_egl_image(struct st_context *st, void *eglimg)
++{
++ struct st_manager *smapi = st->iface.st_api_private;
++ struct pipe_texture *pt = NULL, *res;
++
++ if (!smapi)
++ return NULL;
++
++ res = (struct pipe_texture *) smapi->lock_resource(smapi, &st->iface,
++ ST_MANAGER_RESOURCE_EGL_IMAGE, eglimg);
++ pipe_texture_reference(&pt, res);
++ smapi->unlock_resource(smapi, &st->iface,
++ ST_MANAGER_RESOURCE_EGL_IMAGE, eglimg);
++
++ return pt;
++}
++
++/**
++ * Flush the front buffer if the current context renders to the front buffer.
++ */
++void
++st_flush_frontbuffer(struct st_context *st)
++{
++ struct st_framebuffer *stfb = (struct st_framebuffer *) st->ctx->DrawBuffer;
++ struct st_renderbuffer *strb = NULL;
++
++ if (stfb)
++ strb = st_renderbuffer(stfb->Base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer);
++ if (!strb)
++ return;
++
++ if (st->frontbuffer_status == FRONT_STATUS_DIRTY || strb->defined)
++ stfb->iface->flush_front(stfb->iface, ST_ATTACHMENT_FRONT_LEFT);
++}
++
++/**
++ * Re-validate the framebuffer.
++ */
++void
++st_validate_buffer(struct st_context *st)
++{
++ struct st_framebuffer *stfb =
++ (struct st_framebuffer *) st->ctx->DrawBuffer;
++
++ if (stfb)
++ st->iface.notify_invalid_framebuffer(&st->iface, stfb->iface);
++}
++
++
++/**
++ * Validate a framebuffer. After calling this function, all renderbuffer
++ * buffers are guaranteed to have up-to-date storage.
++ */
++static void
++st_validate_framebuffer(struct st_context *st, struct st_framebuffer *stfb)
++{
++ struct pipe_screen *screen = st->pipe->screen;
++ struct pipe_texture *textures[ST_ATTACHMENT_COUNT];
++ uint width, height;
++ unsigned i;
++
++ /* validate the fb */
++ if (!stfb->iface->validate(stfb->iface, stfb->statts, stfb->num_statts, textures))
++ return;
++
++ width = stfb->Base.Width;
++ height = stfb->Base.Height;
++
++ for (i = 0; i < stfb->num_statts; i++) {
++ struct pipe_surface *ps;
++ gl_buffer_index idx;
++
++ if (!textures[i])
++ continue;
++
++ switch (stfb->statts[i]) {
++ case ST_ATTACHMENT_FRONT_LEFT:
++ idx = BUFFER_FRONT_LEFT;
++ break;
++ case ST_ATTACHMENT_BACK_LEFT:
++ idx = BUFFER_BACK_LEFT;
++ break;
++ case ST_ATTACHMENT_FRONT_RIGHT:
++ idx = BUFFER_FRONT_RIGHT;
++ break;
++ case ST_ATTACHMENT_BACK_RIGHT:
++ idx = BUFFER_BACK_RIGHT;
++ break;
++ case ST_ATTACHMENT_DEPTH_STENCIL:
++ idx = BUFFER_DEPTH;
++ break;
++ case ST_ATTACHMENT_ACCUM:
++ idx = BUFFER_ACCUM;
++ break;
++ case ST_ATTACHMENT_SAMPLE:
++ default:
++ idx = BUFFER_COUNT;
++ break;
++ }
++ if (idx >= BUFFER_COUNT) {
++ pipe_texture_reference(&textures[i], NULL);
++ continue;
++ }
++
++ ps = screen->get_tex_surface(screen, textures[i], 0, 0, 0,
++ PIPE_BUFFER_USAGE_GPU_READ | PIPE_BUFFER_USAGE_GPU_WRITE);
++ if (ps) {
++ struct st_renderbuffer *strb;
++
++ strb = st_renderbuffer(stfb->Base.Attachment[idx].Renderbuffer);
++ assert(strb);
++
++ /* transfer the ownership */
++ pipe_surface_reference(&strb->surface, ps);
++ pipe_texture_reference(&strb->texture, ps->texture);
++ pipe_surface_reference(&ps, NULL);
++
++ st->dirty.st |= ST_NEW_FRAMEBUFFER;
++
++ strb->Base.Width = strb->surface->width;
++ strb->Base.Height = strb->surface->height;
++
++ width = strb->Base.Width;
++ height = strb->Base.Height;
++ }
++
++ pipe_texture_reference(&textures[i], NULL);
++ }
++
++ _mesa_resize_framebuffer(st->ctx, &stfb->Base, width, height);
++
++ assert(stfb->Base.Width == width);
++ assert(stfb->Base.Height == height);
++}
++
++static void
++st_context_notify_invalid_framebuffer(struct st_context_iface *stctxi,
++ struct st_framebuffer_iface *stfbi)
++{
++ struct st_context *st = (struct st_context *) stctxi;
++ struct st_framebuffer *stfb;
++
++ stfb = (struct st_framebuffer *) st->ctx->DrawBuffer;
++ if (!stfb || stfb->iface != stfbi)
++ stfb = (struct st_framebuffer *) st->ctx->ReadBuffer;
++
++ /* no binding surface */
++ if (!stfb)
++ return;
++
++ assert(stfb->iface == stfbi);
++ st_validate_framebuffer(st, stfb);
++}
++
++static void
++st_context_flush(struct st_context_iface *stctxi, unsigned flags,
++ struct pipe_fence_handle **fence)
++{
++ struct st_context *st = (struct st_context *) stctxi;
++ st->pipe->flush(st->pipe, flags, fence);
++}
++
++static boolean
++st_context_teximage(struct st_context_iface *stctxi, enum st_texture_type target,
++ int level, enum pipe_format internal_format,
++ struct pipe_texture *tex, boolean mipmap)
++{
++ return FALSE;
++ struct st_context *st = (struct st_context *) stctxi;
++ GLcontext *ctx = st->ctx;
++ struct gl_texture_unit *texUnit = _mesa_get_current_tex_unit(ctx);
++ struct gl_texture_object *texObj;
++ struct gl_texture_image *texImage;
++ struct st_texture_object *stObj;
++ struct st_texture_image *stImage;
++ GLenum internalFormat;
++
++ switch (target) {
++ case ST_TEXTURE_1D:
++ target = GL_TEXTURE_1D;
++ break;
++ case ST_TEXTURE_2D:
++ target = GL_TEXTURE_2D;
++ break;
++ case ST_TEXTURE_3D:
++ target = GL_TEXTURE_3D;
++ break;
++ case ST_TEXTURE_RECT:
++ target = GL_TEXTURE_RECTANGLE_ARB;
++ break;
++ default:
++ return FALSE;
++ break;
++ }
++
++ /* map pipe format to base format for now */
++ if (util_format_get_component_bits(internal_format,
++ UTIL_FORMAT_COLORSPACE_RGB, 3) > 0)
++ internalFormat = GL_RGBA;
++ else
++ internalFormat = GL_RGB;
++
++ texObj = _mesa_select_tex_object(ctx, texUnit, target);
++ _mesa_lock_texture(ctx, texObj);
++
++ stObj = st_texture_object(texObj);
++ /* switch to surface based */
++ if (!stObj->surface_based) {
++ _mesa_clear_texture_object(ctx, texObj);
++ stObj->surface_based = GL_TRUE;
++ }
++
++ texImage = _mesa_get_tex_image(ctx, texObj, target, level);
++ stImage = st_texture_image(texImage);
++
++ _mesa_init_teximage_fields(ctx, target, texImage,
++ tex->width0, tex->height0, 1, 0, internalFormat);
++ texImage->TexFormat = st_ChooseTextureFormat(ctx, internalFormat,
++ GL_RGBA, GL_UNSIGNED_BYTE);
++ _mesa_set_fetch_functions(texImage, 2);
++ pipe_texture_reference(&stImage->pt, tex);
++
++ _mesa_dirty_texobj(ctx, texObj, GL_TRUE);
++ _mesa_unlock_texture(ctx, texObj);
++
++ return 1;
++}
++
++static struct st_texture_object *
++st_context_lookup_texture_object(struct st_context *st, GLuint name,
++ enum st_context_resource_type type)
++{
++ struct gl_texture_object *texobj = _mesa_lookup_texture(st->ctx, name);
++ GLenum target;
++
++ if (!texobj)
++ return NULL;
++
++ switch (type) {
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_2D:
++ target = GL_TEXTURE_2D;
++ break;
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_3D:
++ target = GL_TEXTURE_3D;
++ break;
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_POSITIVE_X:
++ target = GL_TEXTURE_CUBE_MAP_POSITIVE_X;
++ break;
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_NEGATIVE_X:
++ target = GL_TEXTURE_CUBE_MAP_NEGATIVE_X;
++ break;
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_POSITIVE_Y:
++ target = GL_TEXTURE_CUBE_MAP_POSITIVE_Y;
++ break;
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
++ target = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y;
++ break;
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_POSITIVE_Z:
++ target = GL_TEXTURE_CUBE_MAP_POSITIVE_Z;
++ break;
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
++ target = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
++ break;
++ default:
++ return NULL;
++ break;
++ }
++
++ return (texobj->Target == target) ? st_texture_object(texobj) : NULL;
++}
++
++static struct pipe_texture *
++st_context_lookup_resource(struct st_context_iface *stctxi,
++ enum st_context_resource_type type, void *res)
++{
++ struct st_context *st = (struct st_context *) stctxi;
++ struct pipe_texture *pt = NULL;
++
++ switch (type) {
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_2D:
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_3D:
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_POSITIVE_X:
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_NEGATIVE_X:
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_POSITIVE_Y:
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_POSITIVE_Z:
++ case ST_CONTEXT_RESOURCE_OPENGL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
++ {
++ GLuint id = (GLuint) res;
++ struct st_texture_object *stobj;
++
++ stobj = st_context_lookup_texture_object(st, id, type);
++ if (stobj)
++ pt = stobj->pt;
++ }
++ break;
++ case ST_CONTEXT_RESOURCE_OPENGL_RENDERBUFFER:
++ {
++ GLuint id = (GLuint) res;
++ struct gl_renderbuffer *rb = _mesa_lookup_renderbuffer(st->ctx, id);
++ struct st_renderbuffer *strb = st_renderbuffer(rb);
++
++ if (strb)
++ pt = strb->texture;
++ }
++ break;
++ default:
++ break;
++ }
++
++ return pt;
++}
++
++static void *
++st_context_lock_resource(struct st_context_iface *stctxi,
++ enum st_context_resource_type type, void *res)
++{
++ struct pipe_texture *pt = st_context_lookup_resource(stctxi, type, res);
++ struct pipe_texture *ret = NULL;
++
++ pipe_texture_reference(&ret, pt);
++
++ return (void *) ret;
++}
++
++static void
++st_context_unlock_resource(struct st_context_iface *stctxi,
++ enum st_context_resource_type type, void *res)
++{
++ struct pipe_texture *pt = st_context_lookup_resource(stctxi, type, res);
++ pipe_texture_reference(&pt, NULL);
++}
++
++static void
++st_context_destroy(struct st_context_iface *stctxi)
++{
++ struct st_context *st = (struct st_context *) stctxi;
++ st_destroy_context(st);
++}
++
++static void
++st_api_init_mode_from_visual(__GLcontextModes *mode,
++ const struct st_visual *visual)
++{
++ memset(mode, 0, sizeof(*mode));
++
++ if (st_visual_have_buffers(visual, ST_ATTACHMENT_BACK_LEFT_MASK))
++ mode->doubleBufferMode = GL_TRUE;
++ if (st_visual_have_buffers(visual,
++ ST_ATTACHMENT_FRONT_RIGHT_MASK | ST_ATTACHMENT_BACK_RIGHT_MASK))
++ mode->stereoMode = GL_TRUE;
++
++ if (visual->color_format != PIPE_FORMAT_NONE) {
++ mode->rgbMode = GL_TRUE;
++
++ mode->redBits =
++ util_format_get_component_bits(visual->color_format,
++ UTIL_FORMAT_COLORSPACE_RGB, 0);
++ mode->greenBits =
++ util_format_get_component_bits(visual->color_format,
++ UTIL_FORMAT_COLORSPACE_RGB, 1);
++ mode->blueBits =
++ util_format_get_component_bits(visual->color_format,
++ UTIL_FORMAT_COLORSPACE_RGB, 2);
++ mode->alphaBits =
++ util_format_get_component_bits(visual->color_format,
++ UTIL_FORMAT_COLORSPACE_RGB, 3);
++
++ mode->rgbBits = mode->redBits +
++ mode->greenBits + mode->blueBits + mode->alphaBits;
++ }
++ else {
++ mode->colorIndexMode = GL_TRUE;
++ mode->indexBits = 16;
++ }
++
++ if (visual->depth_stencil_format != PIPE_FORMAT_NONE) {
++ mode->haveDepthBuffer = GL_TRUE;
++ mode->haveStencilBuffer = GL_TRUE;
++
++ mode->depthBits =
++ util_format_get_component_bits(visual->depth_stencil_format,
++ UTIL_FORMAT_COLORSPACE_ZS, 0);
++ mode->stencilBits =
++ util_format_get_component_bits(visual->depth_stencil_format,
++ UTIL_FORMAT_COLORSPACE_ZS, 1);
++ }
++
++ if (visual->accum_format != PIPE_FORMAT_NONE) {
++ mode->haveAccumBuffer = GL_TRUE;
++
++ mode->accumRedBits =
++ util_format_get_component_bits(visual->accum_format,
++ UTIL_FORMAT_COLORSPACE_RGB, 0);
++ mode->accumGreenBits =
++ util_format_get_component_bits(visual->accum_format,
++ UTIL_FORMAT_COLORSPACE_RGB, 1);
++ mode->accumBlueBits =
++ util_format_get_component_bits(visual->accum_format,
++ UTIL_FORMAT_COLORSPACE_RGB, 2);
++ mode->accumAlphaBits =
++ util_format_get_component_bits(visual->accum_format,
++ UTIL_FORMAT_COLORSPACE_RGB, 3);
++ }
++
++ if (visual->samples) {
++ mode->sampleBuffers = 1;
++ mode->samples = visual->samples;
++ }
++}
++
++static struct st_context_iface *
++st_api_create_context(struct st_api *stapi, struct st_manager *smapi,
++ const struct st_visual *visual,
++ struct st_context_iface *shared_stctxi)
++{
++ struct st_context *shared_ctx = (struct st_context *) shared_stctxi;
++ struct st_context *st;
++ struct pipe_context *pipe;
++ __GLcontextModes mode;
++
++ pipe = smapi->create_pipe_context(smapi);
++ if (!pipe)
++ return NULL;
++
++ st_api_init_mode_from_visual(&mode, visual);
++ st = st_create_context(pipe, &mode, shared_ctx);
++ if (!st) {
++ pipe->destroy(pipe);
++ return NULL;
++ }
++
++ st->iface.api = ST_API_OPENGL;
++ st->iface.destroy = st_context_destroy;
++ st->iface.lock_resource = st_context_lock_resource;
++ st->iface.unlock_resource = st_context_unlock_resource;
++
++ st->iface.notify_invalid_framebuffer =
++ st_context_notify_invalid_framebuffer;
++ st->iface.flush = st_context_flush;
++
++ st->iface.teximage = st_context_teximage;
++ st->iface.copy = NULL;
++
++ st->iface.st_api_private = (void *) smapi;
++
++#if FEATURE_extra_context_init
++ st_api_create_context_extra(st);
++#endif
++
++ return &st->iface;
++}
++
++static struct st_framebuffer *
++st_api_create_framebuffer(struct st_framebuffer_iface *stfbi)
++{
++ struct st_framebuffer *stfb;
++ struct gl_renderbuffer *rb;
++ __GLcontextModes mode;
++ int samples;
++
++ stfb = CALLOC_STRUCT(st_framebuffer);
++ if (!stfb)
++ return NULL;
++
++ st_api_init_mode_from_visual(&mode, stfbi->visual);
++ _mesa_initialize_window_framebuffer(&stfb->Base, &mode);
++
++ samples = stfbi->visual->samples;
++ if (!samples)
++ samples = st_get_msaa();
++
++ /* TODO other renderbuffers should be added on demand */
++ rb = st_new_renderbuffer_fb(stfbi->visual->color_format, samples, FALSE);
++ if (st_visual_have_buffers(stfbi->visual, ST_ATTACHMENT_BACK_LEFT_MASK)) {
++ _mesa_add_renderbuffer(&stfb->Base, BUFFER_BACK_LEFT, rb);
++ stfb->statts[stfb->num_statts++] = ST_ATTACHMENT_BACK_LEFT;
++ }
++ else {
++ _mesa_add_renderbuffer(&stfb->Base, BUFFER_FRONT_LEFT, rb);
++ stfb->statts[stfb->num_statts++] = ST_ATTACHMENT_FRONT_LEFT;
++ }
++
++ if (stfbi->visual->depth_stencil_format != PIPE_FORMAT_NONE) {
++ rb = st_new_renderbuffer_fb(stfbi->visual->depth_stencil_format,
++ samples, FALSE);
++ _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, rb);
++ _mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, rb);
++
++ if (st_visual_have_buffers(stfbi->visual,
++ ST_ATTACHMENT_DEPTH_STENCIL_MASK))
++ stfb->statts[stfb->num_statts++] = ST_ATTACHMENT_DEPTH_STENCIL;
++ }
++
++ if (stfbi->visual->accum_format != PIPE_FORMAT_NONE) {
++ rb = st_new_renderbuffer_fb(stfbi->visual->accum_format, 0, TRUE);
++ _mesa_add_renderbuffer(&stfb->Base, BUFFER_ACCUM, rb);
++
++ if (st_visual_have_buffers(stfbi->visual, ST_ATTACHMENT_ACCUM_MASK))
++ stfb->statts[stfb->num_statts++] = ST_ATTACHMENT_ACCUM;
++ }
++
++ stfb->iface = stfbi;
++ stfb->Base.Initialized = GL_TRUE;
++
++ return stfb;
++}
++
++static void
++st_api_destroy_framebuffer(struct st_framebuffer *stfb)
++{
++ GLframebuffer *fb = &stfb->Base;
++ _mesa_reference_framebuffer(&fb, NULL);
++}
++
++static boolean
++st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi,
++ struct st_framebuffer_iface *stdrawi,
++ struct st_framebuffer_iface *streadi)
++{
++ struct st_context *st = (struct st_context *) stctxi;
++ struct st_framebuffer *stdraw, *stread;
++
++ if (!st) {
++ _glapi_check_multithread();
++ return _mesa_make_current(NULL, NULL, NULL);
++ }
++
++ /* create draw fb */
++ stdraw = st_api_create_framebuffer(stdrawi);
++ if (!stdraw)
++ return FALSE;
++ st_validate_framebuffer(st, stdraw);
++
++ /* create read fb */
++ if (streadi != stdrawi) {
++ stread = st_api_create_framebuffer(streadi);
++ if (!stread) {
++ st_api_destroy_framebuffer(stdraw);
++ return FALSE;
++ }
++ st_validate_framebuffer(st, stread);
++ }
++ else {
++ stread = stdraw;
++ }
++
++ _glapi_check_multithread();
++ if (!_mesa_make_current(st->ctx, &stdraw->Base, &stread->Base)) {
++ st_api_destroy_framebuffer(stdraw);
++ if (stread != stdraw)
++ st_api_destroy_framebuffer(stread);
++ return FALSE;
++ }
++
++ return TRUE;
++}
++
++static struct st_context_iface *
++st_api_get_current(struct st_api *stapi)
++{
++ GET_CURRENT_CONTEXT(ctx);
++ struct st_context *st = (ctx) ? ctx->st : NULL;
++
++ return (st) ? &st->iface : NULL;
++}
++
++static st_proc_t
++st_api_get_proc_address(struct st_api *stapi, const char *procname)
++{
++ return (st_proc_t) _glapi_get_proc_address(procname);
++}
++
++static boolean
++st_api_is_visual_supported(struct st_api *stapi,
++ const struct st_visual *visual)
++{
++ return TRUE;
++}
++
++static void
++st_api_destroy(struct st_api *stapi)
++{
++ free(stapi);
++}
++
++struct st_api *
++st_module_create_api(void)
++{
++ struct st_api *stapi;
++
++ stapi = CALLOC_STRUCT(st_api);
++ if (stapi) {
++ stapi->destroy = st_api_destroy;
++ stapi->is_visual_supported = st_api_is_visual_supported;
++
++ stapi->create_context = st_api_create_context;
++ stapi->make_current = st_api_make_current;
++ stapi->get_current = st_api_get_current;
++
++ stapi->get_proc_address = st_api_get_proc_address;
++ }
++
++ return stapi;
++}
+diff --git a/src/mesa/state_tracker/gl_api.h b/src/mesa/state_tracker/gl_api.h
+new file mode 100644
+index 0000000..2584cb3
+--- /dev/null
++++ b/src/mesa/state_tracker/gl_api.h
+@@ -0,0 +1,22 @@
++#ifndef ST_API_H
++#define ST_API_H
++
++#include "pipe/p_state.h"
++#include "st_context.h"
++
++struct pipe_texture *
++st_manager_reference_egl_image(struct st_context *st, void *eglimg);
++
++void
++st_flush_frontbuffer(struct st_context *st);
++
++void
++st_validate_buffer(struct st_context *st);
++
++void
++st_api_create_context_extra(struct st_context *st);
++
++struct st_api *
++st_module_create_api(void);
++
++#endif /* ST_API_H */
+diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
+index 8f6a0c2..43a7154 100644
+--- a/src/mesa/state_tracker/st_context.c
++++ b/src/mesa/state_tracker/st_context.c
+@@ -30,6 +30,7 @@
+ #include "vbo/vbo.h"
+ #include "shader/shader_api.h"
+ #include "glapi/glapi.h"
++#define NO_ST_TEXTURE
+ #include "st_public.h"
+ #include "st_debug.h"
+ #include "st_context.h"
+diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
+index 50e98d7..24c7c05 100644
+--- a/src/mesa/state_tracker/st_context.h
++++ b/src/mesa/state_tracker/st_context.h
+@@ -31,6 +31,7 @@
+ #include "main/mtypes.h"
+ #include "shader/prog_cache.h"
+ #include "pipe/p_state.h"
++#include "state_tracker/st_api.h"
+
+
+ struct st_context;
+@@ -73,6 +74,8 @@ struct st_tracked_state {
+
+ struct st_context
+ {
++ struct st_context_iface iface;
++
+ GLcontext *ctx;
+
+ struct pipe_context *pipe;
+@@ -199,6 +202,9 @@ static INLINE struct st_context *st_context(GLcontext *ctx)
+ struct st_framebuffer
+ {
+ GLframebuffer Base;
++ struct st_framebuffer_iface *iface;
++ enum st_attachment_type statts[ST_ATTACHMENT_COUNT];
++ unsigned num_statts;
+ void *Private;
+ GLuint InitWidth, InitHeight;
+ };
+diff --git a/src/mesa/state_tracker/st_public.h b/src/mesa/state_tracker/st_public.h
+index 98c1981..e1ccd6d 100644
+--- a/src/mesa/state_tracker/st_public.h
++++ b/src/mesa/state_tracker/st_public.h
+@@ -41,8 +41,10 @@
+ #define ST_SURFACE_BACK_RIGHT 3
+ #define ST_SURFACE_DEPTH 8
+
++#ifndef NO_ST_TEXTURE
+ #define ST_TEXTURE_2D 0x2
+ #define ST_TEXTURE_RECT 0x4
++#endif
+
+ #define ST_TEXTURE_RGB 0x1
+ #define ST_TEXTURE_RGBA 0x2
+--
+1.6.4.3
+
diff --git a/sample-implementation-tmp/0006-winsys-xlib-st-es-Advertise-st_api.h-support.patch b/sample-implementation-tmp/0006-winsys-xlib-st-es-Advertise-st_api.h-support.patch
new file mode 100644
index 0000000..8229027
--- /dev/null
+++ b/sample-implementation-tmp/0006-winsys-xlib-st-es-Advertise-st_api.h-support.patch
@@ -0,0 +1,79 @@
+From 7a244a27fa8613acfb67d1e8cf08909136d2b4b3 Mon Sep 17 00:00:00 2001
+From: Chia-I Wu <olv@lunarg.com>
+Date: Sun, 7 Feb 2010 20:17:48 +0800
+Subject: [PATCH 6/6] winsys/xlib, st/es: Advertise st_api.h support.
+
+---
+ src/gallium/state_trackers/es/Makefile | 1 +
+ src/gallium/state_trackers/es/st_es1.c | 6 ++++++
+ src/gallium/state_trackers/es/st_es2.c | 6 ++++++
+ src/gallium/winsys/xlib/xlib.c | 6 ++++++
+ 4 files changed, 19 insertions(+), 0 deletions(-)
+
+diff --git a/src/gallium/state_trackers/es/Makefile b/src/gallium/state_trackers/es/Makefile
+index b036551..e33685d 100644
+--- a/src/gallium/state_trackers/es/Makefile
++++ b/src/gallium/state_trackers/es/Makefile
+@@ -38,6 +38,7 @@ SYS_LIBS = -lm -pthread
+
+
+ INCLUDE_DIRS = \
++ -I$(TOP)/src/mesa \
+ -I$(TOP)/src/gallium/include
+
+ .c.o:
+diff --git a/src/gallium/state_trackers/es/st_es1.c b/src/gallium/state_trackers/es/st_es1.c
+index 25bc53b..eb4d129 100644
+--- a/src/gallium/state_trackers/es/st_es1.c
++++ b/src/gallium/state_trackers/es/st_es1.c
+@@ -1,3 +1,9 @@
+ #include "pipe/p_compiler.h"
++#include "state_tracker/gl_api.h"
+
+ PUBLIC const int st_api_OpenGL_ES1 = 1;
++
++PUBLIC const struct st_module st_module_OpenGL_ES1 = {
++ .api = ST_API_OPENGL_ES1,
++ .create_api = st_module_create_api
++};
+diff --git a/src/gallium/state_trackers/es/st_es2.c b/src/gallium/state_trackers/es/st_es2.c
+index 171ea62..25626b7 100644
+--- a/src/gallium/state_trackers/es/st_es2.c
++++ b/src/gallium/state_trackers/es/st_es2.c
+@@ -1,3 +1,9 @@
+ #include "pipe/p_compiler.h"
++#include "state_tracker/gl_api.h"
+
+ PUBLIC const int st_api_OpenGL_ES2 = 1;
++
++PUBLIC const struct st_module st_module_OpenGL_ES2 = {
++ .api = ST_API_OPENGL_ES2,
++ .create_api = st_module_create_api
++};
+diff --git a/src/gallium/winsys/xlib/xlib.c b/src/gallium/winsys/xlib/xlib.c
+index 67617a4..fd66e2b 100644
+--- a/src/gallium/winsys/xlib/xlib.c
++++ b/src/gallium/winsys/xlib/xlib.c
+@@ -36,6 +36,7 @@
+
+ #include <stdlib.h>
+ #include <assert.h>
++#include "state_tracker/gl_api.h"
+
+ /* Todo, replace all this with callback-structs provided by the
+ * individual implementations.
+@@ -50,6 +51,11 @@ enum mode {
+ /* advertise OpenGL support */
+ PUBLIC const int st_api_OpenGL = 1;
+
++PUBLIC const struct st_module st_module_OpenGL = {
++ .api = ST_API_OPENGL,
++ .create_api = st_module_create_api
++};
++
+ static enum mode get_mode()
+ {
+ #ifdef GALLIUM_CELL
+--
+1.6.4.3
+