glamor_gles2: Use gl_flavor to determine which version of GL.

Signed-off-by: Zhigang Gong <zhigang.gong@gmail.com>
This commit is contained in:
Zhigang Gong 2011-08-09 09:59:56 -04:00 committed by Zhigang Gong
parent 29e358f6b3
commit 36a93f62c7
2 changed files with 44 additions and 10 deletions

View File

@ -379,6 +379,12 @@ glamor_init(ScreenPtr screen, unsigned int flags)
glamor_glyphs_init(screen); glamor_glyphs_init(screen);
glamor_pixmap_init(screen); glamor_pixmap_init(screen);
#ifdef GLAMOR_GLES2
glamor_priv->gl_flavor = GLAMOR_GL_ES2;
#else
glamor_priv->gl_flavor = GLAMOR_GL_DESKTOP;
#endif
return TRUE; return TRUE;
fail: fail:

View File

@ -213,6 +213,7 @@ static void
__glamor_upload_pixmap_to_texture(PixmapPtr pixmap, GLenum format, GLenum type, GLuint tex) __glamor_upload_pixmap_to_texture(PixmapPtr pixmap, GLenum format, GLenum type, GLuint tex)
{ {
glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
glamor_screen_private *glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen);
unsigned int stride, row_length; unsigned int stride, row_length;
void *texels; void *texels;
GLenum iformat; GLenum iformat;
@ -229,15 +230,24 @@ __glamor_upload_pixmap_to_texture(PixmapPtr pixmap, GLenum format, GLenum type,
break; break;
} }
if (glamor_priv->gl_flavor == GLAMOR_GL_ES2) {
iformat = format;
type = GL_UNSIGNED_BYTE;
}
stride = pixmap->devKind; stride = pixmap->devKind;
row_length = (stride * 8) / pixmap->drawable.bitsPerPixel; row_length = (stride * 8) / pixmap->drawable.bitsPerPixel;
glBindTexture(GL_TEXTURE_2D, tex); glBindTexture(GL_TEXTURE_2D, tex);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
#ifndef GLAMOR_GLES2 if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
glPixelStorei(GL_UNPACK_ROW_LENGTH, row_length); glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
#endif glPixelStorei(GL_UNPACK_ROW_LENGTH, row_length);
}
else {
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
}
if (pixmap_priv->pbo && pixmap_priv->pbo_valid) { if (pixmap_priv->pbo && pixmap_priv->pbo_valid) {
texels = NULL; texels = NULL;
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pixmap_priv->pbo); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pixmap_priv->pbo);
@ -524,15 +534,26 @@ glamor_download_pixmap_to_cpu(PixmapPtr pixmap, glamor_access_t access)
ErrorF("Glamor: Invalid access code. %d\n", access); ErrorF("Glamor: Invalid access code. %d\n", access);
assert(0); assert(0);
} }
if (glamor_priv->gl_flavor == GLAMOR_GL_ES2)
data = malloc(stride * pixmap->drawable.height);
row_length = (stride * 8) / pixmap->drawable.bitsPerPixel; row_length = (stride * 8) / pixmap->drawable.bitsPerPixel;
glPixelStorei(GL_PACK_ALIGNMENT, 1); if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
glPixelStorei(GL_PACK_ROW_LENGTH, row_length); glPixelStorei(GL_PACK_ALIGNMENT, 1);
glPixelStorei(GL_PACK_ROW_LENGTH, row_length);
}
else {
glPixelStorei(GL_PACK_ALIGNMENT, 4);
// glPixelStorei(GL_PACK_ROW_LENGTH, 0);
}
if (GLEW_MESA_pack_invert || glamor_priv->yInverted) { if (GLEW_MESA_pack_invert || glamor_priv->yInverted) {
if (!glamor_priv->yInverted) if (!glamor_priv->yInverted) {
assert(glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP);
glPixelStorei(GL_PACK_INVERT_MESA, 1); glPixelStorei(GL_PACK_INVERT_MESA, 1);
}
if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
if (pixmap_priv->pbo == 0) if (pixmap_priv->pbo == 0)
glGenBuffers (1, &pixmap_priv->pbo); glGenBuffers (1, &pixmap_priv->pbo);
glBindBuffer (GL_PIXEL_PACK_BUFFER, pixmap_priv->pbo); glBindBuffer (GL_PIXEL_PACK_BUFFER, pixmap_priv->pbo);
@ -545,9 +566,16 @@ glamor_download_pixmap_to_cpu(PixmapPtr pixmap, glamor_access_t access)
data = glMapBuffer (GL_PIXEL_PACK_BUFFER, gl_access); data = glMapBuffer (GL_PIXEL_PACK_BUFFER, gl_access);
pixmap_priv->pbo_valid = TRUE; pixmap_priv->pbo_valid = TRUE;
if (!glamor_priv->yInverted) if (!glamor_priv->yInverted) {
assert(glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP);
glPixelStorei(GL_PACK_INVERT_MESA, 0); glPixelStorei(GL_PACK_INVERT_MESA, 0);
}
glBindBuffer (GL_PIXEL_PACK_BUFFER, 0); glBindBuffer (GL_PIXEL_PACK_BUFFER, 0);
} else {
glReadPixels (0, 0,
row_length, pixmap->drawable.height,
format, type, data);
}
} else { } else {
data = malloc(stride * pixmap->drawable.height); data = malloc(stride * pixmap->drawable.height);
assert(data); assert(data);
@ -588,7 +616,7 @@ _glamor_destroy_upload_pixmap(PixmapPtr pixmap)
assert(pixmap_priv->gl_fbo == 0); assert(pixmap_priv->gl_fbo == 0);
if (pixmap_priv->fb) if (pixmap_priv->fb)
glDeleteFramebuffersEXT(1, &pixmap_priv->fb); glDeleteFramebuffers(1, &pixmap_priv->fb);
if (pixmap_priv->tex) if (pixmap_priv->tex)
glDeleteTextures(1, &pixmap_priv->tex); glDeleteTextures(1, &pixmap_priv->tex);
if (pixmap_priv->pbo) if (pixmap_priv->pbo)