kms: Fix GLES2 support

There were two problems stopping the KMS winsys from working with a
GLES2 driver:

• When creating the EGL context, it was missing the attribute to
  select the client version so it would end up with the GLES1 API.

• When creating the depth buffer for the framebuffer it was using
  GL_DEPTH_COMPONENT but only GL_DEPTH_COMPONENT16 is supported on
  GLES. cogl-framebuffer already unconditionally uses this so it
  probably makes sense to do the same here.

Reviewed-by: Robert Bragg <robert@linux.intel.com>
This commit is contained in:
Neil Roberts 2011-12-08 11:40:58 +00:00
parent 1e7f536c40
commit 7adf7c5e38
3 changed files with 34 additions and 15 deletions

View File

@ -578,8 +578,8 @@ try_create_context (CoglDisplay *display,
CoglXlibDisplay *xlib_display = display->winsys;
CoglXlibRenderer *xlib_renderer = display->renderer->winsys;
#endif
CoglRendererEGL *egl_renderer = display->renderer->winsys;
#ifndef COGL_HAS_EGL_PLATFORM_KMS_SUPPORT
CoglRendererEGL *egl_renderer = display->renderer->winsys;
EGLDisplay edpy;
EGLConfig config;
EGLint config_count = 0;
@ -849,8 +849,8 @@ try_create_context (CoglDisplay *display,
&egl_display->egl_surface_height);
#elif defined (COGL_HAS_EGL_PLATFORM_KMS_SUPPORT)
if (!_cogl_winsys_kms_create_context (&egl_renderer->kms_renderer,
&egl_display->kms_display,
if (!_cogl_winsys_kms_create_context (display->renderer,
display,
error))
return FALSE;

View File

@ -185,11 +185,29 @@ _cogl_winsys_kms_display_setup (CoglDisplay *display, GError **error)
}
gboolean
_cogl_winsys_kms_create_context (CoglRendererKMS *kms_renderer,
CoglDisplayKMS *kms_display,
GError **error)
_cogl_winsys_kms_create_context (CoglRenderer *renderer,
CoglDisplay *display,
GError **error)
{
kms_display->egl_context = eglCreateContext (kms_renderer->dpy, NULL, EGL_NO_CONTEXT, NULL);
CoglRendererEGL *egl_renderer = renderer->winsys;
CoglDisplayEGL *egl_display = display->winsys;
CoglRendererKMS *kms_renderer = &egl_renderer->kms_renderer;
CoglDisplayKMS *kms_display = &egl_display->kms_display;
EGLint attribs[3];
if (renderer->driver == COGL_DRIVER_GLES2)
{
attribs[0] = EGL_CONTEXT_CLIENT_VERSION;
attribs[1] = 2;
attribs[2] = EGL_NONE;
}
else
attribs[0] = EGL_NONE;
kms_display->egl_context = eglCreateContext (kms_renderer->dpy,
NULL,
EGL_NO_CONTEXT,
attribs);
if (kms_display->egl_context == NULL)
{
@ -277,11 +295,12 @@ _cogl_winsys_kms_onscreen_init (CoglContext *context,
context->glGenFramebuffers (1, &kms_onscreen->fb);
context->glBindFramebuffer (GL_FRAMEBUFFER_EXT, kms_onscreen->fb);
context->glGenRenderbuffers(1, &kms_onscreen->depth_rb);
context->glBindRenderbuffer(GL_RENDERBUFFER_EXT, kms_onscreen->depth_rb);
context->glRenderbufferStorage(GL_RENDERBUFFER_EXT,
GL_DEPTH_COMPONENT,
kms_display->mode.hdisplay, kms_display->mode.vdisplay);
context->glGenRenderbuffers (1, &kms_onscreen->depth_rb);
context->glBindRenderbuffer (GL_RENDERBUFFER_EXT, kms_onscreen->depth_rb);
context->glRenderbufferStorage (GL_RENDERBUFFER_EXT,
GL_DEPTH_COMPONENT16,
kms_display->mode.hdisplay,
kms_display->mode.vdisplay);
context->glBindRenderbuffer (GL_RENDERBUFFER_EXT, 0);
context->glFramebufferRenderbuffer (GL_FRAMEBUFFER_EXT,

View File

@ -91,9 +91,9 @@ _cogl_winsys_kms_bind (CoglRendererKMS *kms_renderer,
CoglDisplayKMS *kms_display);
gboolean
_cogl_winsys_kms_create_context (CoglRendererKMS *kms_renderer,
CoglDisplayKMS *kms_display,
GError **error);
_cogl_winsys_kms_create_context (CoglRenderer *renderer,
CoglDisplay *display,
GError **error);
gboolean
_cogl_winsys_kms_destroy_context (CoglRendererKMS *kms_renderer,