egl_dri2: check the surface type in platform_android

Check the surface type is EGL_WINDOW_BIT before doing anything, in
preparation for pbuffer support.

Reviewed-by: Chad Versace <chad@chad-versace.us>
This commit is contained in:
Chia-I Wu 2011-08-26 22:09:56 +08:00
parent 384f228a25
commit c8e18f85da

View file

@ -149,23 +149,6 @@ droid_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_config *dri2_conf = dri2_egl_config(conf); struct dri2_egl_config *dri2_conf = dri2_egl_config(conf);
struct dri2_egl_surface *dri2_surf; struct dri2_egl_surface *dri2_surf;
int format;
(void) drv;
if (!window || window->common.magic != ANDROID_NATIVE_WINDOW_MAGIC) {
_eglError(EGL_BAD_NATIVE_WINDOW, "droid_create_surface");
return NULL;
}
if (window->query(window, NATIVE_WINDOW_FORMAT, &format)) {
_eglError(EGL_BAD_NATIVE_WINDOW, "droid_create_surface");
return NULL;
}
if (format != dri2_conf->base.NativeVisualID) {
_eglLog(_EGL_WARNING, "Native format mismatch: 0x%x != 0x%x",
format, dri2_conf->base.NativeVisualID);
}
dri2_surf = calloc(1, sizeof *dri2_surf); dri2_surf = calloc(1, sizeof *dri2_surf);
if (!dri2_surf) { if (!dri2_surf) {
_eglError(EGL_BAD_ALLOC, "droid_create_surface"); _eglError(EGL_BAD_ALLOC, "droid_create_surface");
@ -173,7 +156,28 @@ droid_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
} }
if (!_eglInitSurface(&dri2_surf->base, disp, type, conf, attrib_list)) if (!_eglInitSurface(&dri2_surf->base, disp, type, conf, attrib_list))
goto cleanup_surf; goto cleanup_surface;
if (type == EGL_WINDOW_BIT) {
int format;
if (!window || window->common.magic != ANDROID_NATIVE_WINDOW_MAGIC) {
_eglError(EGL_BAD_NATIVE_WINDOW, "droid_create_surface");
goto cleanup_surface;
}
if (window->query(window, NATIVE_WINDOW_FORMAT, &format)) {
_eglError(EGL_BAD_NATIVE_WINDOW, "droid_create_surface");
goto cleanup_surface;
}
if (format != dri2_conf->base.NativeVisualID) {
_eglLog(_EGL_WARNING, "Native format mismatch: 0x%x != 0x%x",
format, dri2_conf->base.NativeVisualID);
}
window->query(window, NATIVE_WINDOW_WIDTH, &dri2_surf->base.Width);
window->query(window, NATIVE_WINDOW_HEIGHT, &dri2_surf->base.Height);
}
dri2_surf->dri_drawable = dri2_surf->dri_drawable =
(*dri2_dpy->dri2->createNewDrawable)(dri2_dpy->dri_screen, (*dri2_dpy->dri2->createNewDrawable)(dri2_dpy->dri_screen,
@ -181,18 +185,17 @@ droid_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type,
dri2_surf); dri2_surf);
if (dri2_surf->dri_drawable == NULL) { if (dri2_surf->dri_drawable == NULL) {
_eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable"); _eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable");
goto cleanup_surf; goto cleanup_surface;
} }
if (window) {
window->common.incRef(&window->common); window->common.incRef(&window->common);
window->query(window, NATIVE_WINDOW_WIDTH, &dri2_surf->base.Width);
window->query(window, NATIVE_WINDOW_HEIGHT, &dri2_surf->base.Height);
dri2_surf->window = window; dri2_surf->window = window;
}
return &dri2_surf->base; return &dri2_surf->base;
cleanup_surf: cleanup_surface:
free(dri2_surf); free(dri2_surf);
return NULL; return NULL;
@ -233,10 +236,12 @@ droid_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
droid_free_local_buffers(dri2_surf); droid_free_local_buffers(dri2_surf);
if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
if (dri2_surf->buffer) if (dri2_surf->buffer)
droid_window_cancel_buffer(dri2_surf); droid_window_cancel_buffer(dri2_surf);
dri2_surf->window->common.decRef(&dri2_surf->window->common); dri2_surf->window->common.decRef(&dri2_surf->window->common);
}
(*dri2_dpy->core->destroyDrawable)(dri2_surf->dri_drawable); (*dri2_dpy->core->destroyDrawable)(dri2_surf->dri_drawable);
@ -253,6 +258,9 @@ droid_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw); struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
_EGLContext *ctx; _EGLContext *ctx;
if (dri2_surf->base.Type != EGL_WINDOW_BIT)
return EGL_TRUE;
if (dri2_drv->glFlush) { if (dri2_drv->glFlush) {
ctx = _eglGetCurrentContext(); ctx = _eglGetCurrentContext();
if (ctx && ctx->DrawSurface == &dri2_surf->base) if (ctx && ctx->DrawSurface == &dri2_surf->base)
@ -384,6 +392,7 @@ droid_get_buffers_parse_attachments(struct dri2_egl_surface *dri2_surf,
switch (attachments[i]) { switch (attachments[i]) {
case __DRI_BUFFER_BACK_LEFT: case __DRI_BUFFER_BACK_LEFT:
if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
buf->attachment = attachments[i]; buf->attachment = attachments[i];
buf->name = get_native_buffer_name(dri2_surf->buffer); buf->name = get_native_buffer_name(dri2_surf->buffer);
buf->cpp = get_format_bpp(dri2_surf->buffer->format); buf->cpp = get_format_bpp(dri2_surf->buffer->format);
@ -392,6 +401,7 @@ droid_get_buffers_parse_attachments(struct dri2_egl_surface *dri2_surf,
if (buf->name) if (buf->name)
num_buffers++; num_buffers++;
}
break; break;
case __DRI_BUFFER_DEPTH: case __DRI_BUFFER_DEPTH:
case __DRI_BUFFER_STENCIL: case __DRI_BUFFER_STENCIL:
@ -431,10 +441,10 @@ droid_get_buffers_with_format(__DRIdrawable * driDrawable,
dri2_egl_display(dri2_surf->base.Resource.Display); dri2_egl_display(dri2_surf->base.Resource.Display);
int i; int i;
if (!dri2_surf->buffer) { if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
if (!droid_window_dequeue_buffer(dri2_surf)) /* try to dequeue the next back buffer */
if (!dri2_surf->buffer && !droid_window_dequeue_buffer(dri2_surf))
return NULL; return NULL;
}
/* free outdated buffers and update the surface size */ /* free outdated buffers and update the surface size */
if (dri2_surf->base.Width != dri2_surf->buffer->width || if (dri2_surf->base.Width != dri2_surf->buffer->width ||
@ -443,6 +453,7 @@ droid_get_buffers_with_format(__DRIdrawable * driDrawable,
dri2_surf->base.Width = dri2_surf->buffer->width; dri2_surf->base.Width = dri2_surf->buffer->width;
dri2_surf->base.Height = dri2_surf->buffer->height; dri2_surf->base.Height = dri2_surf->buffer->height;
} }
}
dri2_surf->buffer_count = dri2_surf->buffer_count =
droid_get_buffers_parse_attachments(dri2_surf, attachments, count); droid_get_buffers_parse_attachments(dri2_surf, attachments, count);