On Thu, Aug 25, 2011 at 8:58 AM, Chad Versace <c...@chad-versace.us> wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Comments below. > > On 08/23/2011 08:10 PM, Chia-I Wu wrote: >> Add platform_android.c that supports _EGL_PLAFORM_ANDROID. It works >> with drm_gralloc, where back buffers of windows are backed by GEM >> objects. >> >> In Android a native window has a queue of back buffers allocated by the >> server, through drm_gralloc. For each frame, EGL needs to >> >> dequeue the next back buffer >> render to the buffer >> enqueue the buffer >> >> After enqueuing, the buffer is no longer valid to EGL. A window has no >> depth buffer or other aux buffers. They need to be allocated locally by >> EGL. >> --- >> src/egl/drivers/dri2/egl_dri2.c | 89 +++++ >> src/egl/drivers/dri2/egl_dri2.h | 18 + >> src/egl/drivers/dri2/platform_android.c | 588 >> +++++++++++++++++++++++++++++++ >> 3 files changed, 695 insertions(+), 0 deletions(-) >> create mode 100644 src/egl/drivers/dri2/platform_android.c >> >> diff --git a/src/egl/drivers/dri2/egl_dri2.c >> b/src/egl/drivers/dri2/egl_dri2.c >> index ba728a1..33c2330 100644 >> --- a/src/egl/drivers/dri2/egl_dri2.c >> +++ b/src/egl/drivers/dri2/egl_dri2.c > > [snip] > >> +static _EGLImage * >> +dri2_create_image_android_native_buffer(_EGLDisplay *disp, >> + EGLClientBuffer buffer) > > To reiterate Benjamin, I think dri2_create_image_android_native_buffer should > go > in android_platform.c. > > [snip] > >> diff --git a/src/egl/drivers/dri2/platform_android.c >> b/src/egl/drivers/dri2/platform_android.c >> new file mode 100644 >> index 0000000..d0de94c >> --- /dev/null >> +++ b/src/egl/drivers/dri2/platform_android.c > > [snip] > >> +static _EGLSurface * >> +droid_create_surface(_EGLDriver *drv, _EGLDisplay *disp, EGLint type, >> + _EGLConfig *conf, EGLNativeWindowType window, >> + const EGLint *attrib_list) >> +{ >> + struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); >> + struct dri2_egl_config *dri2_conf = dri2_egl_config(conf); >> + 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); >> + if (!dri2_surf) { >> + _eglError(EGL_BAD_ALLOC, "droid_create_surface"); >> + return NULL; >> + } >> + >> + if (!_eglInitSurface(&dri2_surf->base, disp, type, conf, attrib_list)) >> + goto cleanup_surf; > > It seems that droid_get_buffers_with_format() only supports single-buffered > surfaces. So eglCreateWindowSurface should reject requests for which > EGL_RENDER_BUFFER != EGL_SINGLE_BUFFER. > > if (dri2_surf->base.RenderBuffer != EGL_SINGLE_BUFFER) > goto cleanup_surf; [CC Benjamin] EGL_RENDER_BUFFER is a hint here. It is fine if the native window does not support EGL_SINGLE_BUFFER.
On the other hand, ctx->WindowRenderBuffer should be set. It is queried by eglQueryContext. I think it can be set in dri2_create_context: to EGL_BACK_BUFFER when there is dri_double_config and EGL_SINGLE_BUFFER when there is only dri_single_config. Idea? > I think the DRI2 surface type needs to be set here too. > > dri2_surf->type = DRI2_WINDOW_SURFACE; This field seems to be used by wayland only. For the other places, dri2_surf->Base.Type is used. >> + >> + dri2_surf->dri_drawable = >> + (*dri2_dpy->dri2->createNewDrawable)(dri2_dpy->dri_screen, >> + dri2_conf->dri_double_config, >> + dri2_surf); >> + if (dri2_surf->dri_drawable == NULL) { >> + _eglError(EGL_BAD_ALLOC, "dri2->createNewDrawable"); >> + goto cleanup_surf; >> + } >> + >> + 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; >> + >> + return &dri2_surf->base; >> + >> +cleanup_surf: >> + free(dri2_surf); >> + >> + return NULL; >> +} > > [snip] > >> +#include <xf86drm.h> >> +/* for i915 */ >> +#include <i915_drm.h> >> +/* for radeon */ >> +#include <radeon_drm.h> > > These includes should be moved to the top of the file. Will do and mention that they are only used by droid_get_pci_id. > - -- > Chad Versace > c...@chad-versace.us > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.11 (GNU/Linux) > Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ > > iQIcBAEBAgAGBQJOVZ4oAAoJEAIvNt057x8ibNwP/R+Y7zo3yhh0v4sLlrkbKiox > GbuVRg4L00vi7IZk9ia/YZK4yHJIfku8f5Kf62lnNGL+8XwiqPc+fLFsTqLgg8yy > b0lTlHcUbvqyGokpwpECATvmXQ/eUupHbN3F7LN4fT7DUyuONmAmUHM6DFgcAu8C > rrywDtZqqigCxvPwJ8WGqtebfBtn0893tneem4t4fS13C+jgxns9RuZ4x1f+5OxA > +jlQz207M7YLT7FZZSBRBq8KGlik+0rp3CNTJ9OWu3YrQaqQxt24Dn9deopw3SeZ > jzKxQfuDqZbMVY9z91kjlo/N+CnmmAi8OV56Y7XVOdlwOw70vbvdD6olirIE7JK6 > JOCvKqJucFf1cR/4dUXFOPLCl1V4UymHc3m5+KMSeqK5sp1UGjFGZCpsGlsbnWuP > Ygtbmw0lOqg0Gk15D2Xs8moAr8YI414aGCCyTXftxyf7qHR5OxxeD28cS3RIXq/o > fYvB37TKmkPyQ4dZxWZSfx/Rhqs8b0ZGFLswZpTa08AjFRnSLYUggsBy/zgqSEI8 > ZoAwV8dMidyi2hdfEfIbUA0wIY56QbZ5Lrw5R1iGl7lk1HOPe6r+d17V52h94Jvm > AZChsK5SEKuONmtpcn9Cqgs26URWakJ92oXP/eNY9x7HdGykr61LCMkrKWGV6eUn > kN3X/Gil4t/CJrc0xKHi > =+Lyq > -----END PGP SIGNATURE----- > -- o...@lunarg.com _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev