glamor: Merged with latest xserver.

Merged with latest xserver, the major change is due to the API change of
the management of devPrivates.
This commit is contained in:
Zhigang Gong 2011-04-08 15:24:55 +08:00
parent 3105fe9f64
commit b3577a1c85

View File

@ -30,17 +30,13 @@
* functions not responsible for performing rendering. * functions not responsible for performing rendering.
*/ */
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include <stdlib.h> #include <stdlib.h>
#include "glamor_priv.h" #include "glamor_priv.h"
static int glamor_screen_private_key_index; static DevPrivateKeyRec glamor_screen_private_key_index;
DevPrivateKey glamor_screen_private_key = &glamor_screen_private_key_index; DevPrivateKey glamor_screen_private_key = &glamor_screen_private_key_index;
static int glamor_pixmap_private_key_index; static DevPrivateKeyRec glamor_pixmap_private_key_index;
DevPrivateKey glamor_pixmap_private_key = &glamor_pixmap_private_key_index; DevPrivateKey glamor_pixmap_private_key = &glamor_pixmap_private_key_index;
/** /**
@ -68,54 +64,59 @@ glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth,
unsigned int usage) unsigned int usage)
{ {
PixmapPtr pixmap; PixmapPtr pixmap;
glamor_pixmap_private *pixmap_priv; glamor_pixmap_private *pixmap_priv, *newpixmap_priv;
GLenum format; GLenum format;
if (w > 32767 || h > 32767) if (w > 32767 || h > 32767)
return NullPixmap; return NullPixmap;
pixmap = fbCreatePixmap (screen, 0, 0, depth, usage); pixmap = fbCreatePixmap (screen, 0, 0, depth, usage);
if (dixAllocatePrivates(pixmap->devPrivates, PRIVATE_PIXMAP) != TRUE) {
fbDestroyPixmap(pixmap);
ErrorF("Fail to allocate privates for PIXMAP.\n");
return NullPixmap;
}
pixmap_priv = glamor_get_pixmap_private(pixmap); pixmap_priv = glamor_get_pixmap_private(pixmap);
assert(pixmap_priv != NULL);
if (w == 0 || h == 0) if (w == 0 || h == 0)
return pixmap; return pixmap;
/* We should probably take advantage of ARB_fbo's allowance of GL_ALPHA. /* We should probably take advantage of ARB_fbo's allowance of GL_ALPHA.
* FBOs, which EXT_fbo forgot to do. * FBOs, which EXT_fbo forgot to do.
*/ */
switch (depth) { switch (depth) {
case 24: case 24:
format = GL_RGB; format = GL_RGB;
break; break;
default: default:
format = GL_RGBA; format = GL_RGBA;
break; break;
} }
/* Create the texture used to store the pixmap's data. */ /* Create the texture used to store the pixmap's data. */
glGenTextures(1, &pixmap_priv->tex); glGenTextures(1, &pixmap_priv->tex);
glBindTexture(GL_TEXTURE_2D, pixmap_priv->tex); glBindTexture(GL_TEXTURE_2D, pixmap_priv->tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, format, w, h, 0, glTexImage2D(GL_TEXTURE_2D, 0, format, w, h, 0,
format, GL_UNSIGNED_BYTE, NULL); format, GL_UNSIGNED_BYTE, NULL);
/* Create a framebuffer object wrapping the texture so that we can render /* Create a framebuffer object wrapping the texture so that we can render
* to it. ** to it.
*/ **/
glGenFramebuffersEXT(1, &pixmap_priv->fb); glGenFramebuffersEXT(1, &pixmap_priv->fb);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, pixmap_priv->fb); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, pixmap_priv->fb);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT0_EXT,
GL_TEXTURE_2D, GL_TEXTURE_2D,
pixmap_priv->tex, pixmap_priv->tex,
0); 0);
screen->ModifyPixmapHeader(pixmap, w, h, 0, 0, screen->ModifyPixmapHeader(pixmap, w, h, depth, 0,
(((w * pixmap->drawable.bitsPerPixel + (((w * pixmap->drawable.bitsPerPixel +
7) / 8) + 3) & ~3, 7) / 8) + 3) & ~3,
NULL); NULL);
return pixmap; return pixmap;
} }
@ -156,13 +157,22 @@ glamor_init(ScreenPtr screen)
if (glamor_priv == NULL) if (glamor_priv == NULL)
return FALSE; return FALSE;
dixSetPrivate(&screen->devPrivates, glamor_screen_private_key, glamor_priv);
if (!dixRequestPrivate(glamor_pixmap_private_key, if (!dixRegisterPrivateKey(glamor_screen_private_key,PRIVATE_SCREEN,
sizeof(glamor_pixmap_private))) { 0)) {
LogMessage(X_WARNING, LogMessage(X_WARNING,
"glamor%d: Failed to allocate pixmap private\n", "glamor%d: Failed to allocate screen private\n",
screen->myNum); screen->myNum);
} }
dixSetPrivate(&screen->devPrivates, glamor_screen_private_key, glamor_priv);
if (!dixRegisterPrivateKey(glamor_pixmap_private_key,PRIVATE_PIXMAP,
sizeof(glamor_pixmap_private))) {
LogMessage(X_WARNING,
"glamor%d: Failed to allocate pixmap private\n",
screen->myNum);
}
glewInit(); glewInit();
@ -224,16 +234,15 @@ glamor_init(ScreenPtr screen)
ps->Trapezoids = glamor_trapezoids; ps->Trapezoids = glamor_trapezoids;
glamor_priv->saved_glyphs = ps->Glyphs; glamor_priv->saved_glyphs = ps->Glyphs;
ps->Glyphs = glamor_glyphs; ps->Glyphs = glamor_glyphs;
glamor_init_composite_shaders(screen);
#endif #endif
glamor_init_solid_shader(screen); glamor_init_solid_shader(screen);
glamor_init_tile_shader(screen); glamor_init_tile_shader(screen);
glamor_init_putimage_shaders(screen); glamor_init_putimage_shaders(screen);
glamor_init_composite_shaders(screen);
glamor_init_finish_access_shaders(screen); glamor_init_finish_access_shaders(screen);
glamor_glyphs_init(screen); glamor_glyphs_init(screen);
return TRUE; return TRUE;
fail: fail: