glamor-for-ddx: Exports all rendering/drawing functions.
This commit exports all the rest rendering/drawing functions to the DDX drivers. And introduce some new pixmap type. For a pixmap which has a separated texture, we never fallback it to the DDX layer. This commit also adds the following new functions: glamor_composite_rects, glamor_get_image_nf which are needed by UXA framework. Just a simple wrapper function of miXXX. Will consider to optimize them next few weeks. This commit also Fixed a glyphs rendering bug pointed by Chris. Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
This commit is contained in:
parent
f7539d9bff
commit
8c7fcefb96
|
@ -34,11 +34,13 @@ libglamor_la_SOURCES = \
|
|||
glamor_setspans.c \
|
||||
glamor_render.c \
|
||||
glamor_tile.c \
|
||||
glamor_triangles.c\
|
||||
glamor_pixmap.c\
|
||||
glamor_picture.c\
|
||||
glamor_triangles.c\
|
||||
glamor_addtraps.c\
|
||||
glamor_getimage.c\
|
||||
glamor_pixmap.c\
|
||||
glamor_picture.c\
|
||||
glamor_window.c\
|
||||
glamor_gl_dispatch.c\
|
||||
glamor_gl_dispatch.c\
|
||||
glamor.h
|
||||
|
||||
sdk_HEADERS = glamor.h
|
||||
|
|
|
@ -374,7 +374,7 @@ glamor_init(ScreenPtr screen, unsigned int flags)
|
|||
screen->GetSpans = glamor_get_spans;
|
||||
|
||||
glamor_priv->saved_get_image = screen->GetImage;
|
||||
screen->GetImage = miGetImage;
|
||||
screen->GetImage = glamor_get_image;
|
||||
|
||||
glamor_priv->saved_change_window_attributes =
|
||||
screen->ChangeWindowAttributes;
|
||||
|
@ -402,6 +402,9 @@ glamor_init(ScreenPtr screen, unsigned int flags)
|
|||
glamor_priv->saved_triangles = ps->Triangles;
|
||||
ps->Triangles = glamor_triangles;
|
||||
|
||||
glamor_priv->saved_addtraps = ps->AddTraps;
|
||||
ps->AddTraps = glamor_add_traps;
|
||||
|
||||
glamor_priv->saved_unrealize_glyph = ps->UnrealizeGlyph;
|
||||
ps->UnrealizeGlyph = glamor_glyph_unrealize;
|
||||
}
|
||||
|
|
|
@ -41,9 +41,30 @@
|
|||
|
||||
#endif /* GLAMOR_H */
|
||||
|
||||
/* @GLAMOR_INVERTED_Y_AXIS:
|
||||
* set 1 means the GL env's origin (0,0) is at top-left.
|
||||
* EGL/DRM platform is an example need to set this bit.
|
||||
* glx platform's origin is at bottom-left thus need to
|
||||
* clear this bit.*/
|
||||
|
||||
#define GLAMOR_INVERTED_Y_AXIS 1
|
||||
|
||||
/* @GLAMOR_USE_SCREEN:
|
||||
* If want to let glamor to do everything including the
|
||||
* create/destroy pixmap and handle the gc ops. need to
|
||||
* set this bit. Standalone glamor DDX driver need to set
|
||||
* this bit.
|
||||
* Otherwise, need to clear this bit, as the intel video
|
||||
* driver with glamor enabled.
|
||||
* */
|
||||
#define GLAMOR_USE_SCREEN 2
|
||||
/* @GLAMOR_USE_PICTURE_SCREEN:
|
||||
* If want to let glamor to do all the composition related
|
||||
* things, need to set this bit. Just as standalone glamor
|
||||
* DDX driver.
|
||||
* Otherwise, need to clear this bit, as the intel video
|
||||
* driver with glamor enabled.
|
||||
*/
|
||||
#define GLAMOR_USE_PICTURE_SCREEN 4
|
||||
|
||||
#define GLAMOR_VALID_FLAGS (GLAMOR_INVERTED_Y_AXIS \
|
||||
|
@ -54,12 +75,16 @@
|
|||
* glamor_pixmap_type : glamor pixmap's type.
|
||||
* @MEMORY: pixmap is in memory.
|
||||
* @TEXTURE_DRM: pixmap is in a texture created from a DRM buffer.
|
||||
* @SEPARATE_TEXTURE: The texture is created from a DRM buffer, but
|
||||
* the format is incompatible, so this type of pixmap
|
||||
* will never fallback to DDX layer.
|
||||
* @DRM_ONLY: pixmap is in a external DRM buffer.
|
||||
* @TEXTURE_ONLY: pixmap is in an internal texture.
|
||||
*/
|
||||
typedef enum glamor_pixmap_type {
|
||||
GLAMOR_MEMORY,
|
||||
GLAMOR_TEXTURE_DRM,
|
||||
GLAMOR_SEPARATE_TEXTURE,
|
||||
GLAMOR_DRM_ONLY,
|
||||
GLAMOR_TEXTURE_ONLY
|
||||
} glamor_pixmap_type_t;
|
||||
|
@ -96,6 +121,11 @@ extern _X_EXPORT Bool glamor_egl_init_textured_pixmap(ScreenPtr screen);
|
|||
extern _X_EXPORT void glamor_egl_destroy_textured_pixmap(PixmapPtr pixmap);
|
||||
#endif
|
||||
|
||||
/* Glamor rendering/drawing functions with XXX_nf.
|
||||
* nf means no fallback within glamor internal if possible. If glamor
|
||||
* fail to accelerate the operation, glamor will return a false, and the
|
||||
* caller need to implement fallback method. Return a true means the
|
||||
* rendering request get done successfully. */
|
||||
extern _X_EXPORT Bool glamor_fill_spans_nf(DrawablePtr drawable,
|
||||
GCPtr gc,
|
||||
int n, DDXPointPtr points,
|
||||
|
@ -157,4 +187,22 @@ extern _X_EXPORT Bool glamor_triangles_nf(CARD8 op,
|
|||
|
||||
extern _X_EXPORT void glamor_glyph_unrealize(ScreenPtr screen, GlyphPtr glyph);
|
||||
|
||||
extern _X_EXPORT Bool glamor_set_spans_nf(DrawablePtr drawable, GCPtr gc, char *src,
|
||||
DDXPointPtr points, int *widths, int n, int sorted);
|
||||
|
||||
extern _X_EXPORT Bool glamor_get_spans_nf(DrawablePtr drawable, int wmax,
|
||||
DDXPointPtr points, int *widths, int count, char *dst);
|
||||
|
||||
extern _X_EXPORT Bool glamor_composite_rects_nf (CARD8 op,
|
||||
PicturePtr pDst,
|
||||
xRenderColor *color,
|
||||
int nRect,
|
||||
xRectangle *rects);
|
||||
|
||||
extern _X_EXPORT Bool glamor_get_image_nf(DrawablePtr pDrawable, int x, int y, int w, int h,
|
||||
unsigned int format, unsigned long planeMask, char *d);
|
||||
|
||||
extern _X_EXPORT Bool glamor_add_traps_nf(PicturePtr pPicture,
|
||||
INT16 x_off,
|
||||
INT16 y_off, int ntrap, xTrap * traps);
|
||||
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* Copyright © 2009 Intel Corporation
|
||||
* Copyright © 1998 Keith Packard
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Zhigang Gong <zhigang.gong@gmail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "glamor_priv.h"
|
||||
|
||||
static Bool
|
||||
_glamor_add_traps(PicturePtr pPicture,
|
||||
INT16 x_off,
|
||||
INT16 y_off, int ntrap, xTrap * traps,
|
||||
Bool fallback)
|
||||
{
|
||||
if (!fallback
|
||||
&& ( !pPicture->pDrawable
|
||||
|| glamor_ddx_fallback_check_pixmap(pPicture->pDrawable)))
|
||||
return FALSE;
|
||||
|
||||
if (glamor_prepare_access_picture(pPicture, GLAMOR_ACCESS_RW)) {
|
||||
fbAddTraps(pPicture, x_off, y_off, ntrap, traps);
|
||||
glamor_finish_access_picture(pPicture, GLAMOR_ACCESS_RW);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
glamor_add_traps(PicturePtr pPicture,
|
||||
INT16 x_off,
|
||||
INT16 y_off, int ntrap, xTrap * traps)
|
||||
{
|
||||
_glamor_add_traps(pPicture, x_off, y_off, ntrap, traps, TRUE);
|
||||
}
|
||||
|
||||
Bool
|
||||
glamor_add_traps_nf(PicturePtr pPicture,
|
||||
INT16 x_off,
|
||||
INT16 y_off, int ntrap, xTrap * traps)
|
||||
{
|
||||
return _glamor_add_traps(pPicture, x_off, y_off, ntrap, traps, FALSE);
|
||||
}
|
||||
|
|
@ -317,15 +317,17 @@ _glamor_copy_n_to_n(DrawablePtr src,
|
|||
src_pixmap_priv = glamor_get_pixmap_private(src_pixmap);
|
||||
screen = dst_pixmap->drawable.pScreen;
|
||||
|
||||
if (!dst_pixmap_priv || !src_pixmap_priv)
|
||||
goto fail;
|
||||
|
||||
if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dst_pixmap_priv)) {
|
||||
if (!dst_pixmap_priv || !GLAMOR_PIXMAP_PRIV_HAS_FBO(dst_pixmap_priv)) {
|
||||
glamor_fallback("dest pixmap %p has no fbo. \n",
|
||||
dst_pixmap);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (!src_pixmap_priv) {
|
||||
glamor_set_pixmap_type(src_pixmap, GLAMOR_MEMORY);
|
||||
src_pixmap_priv = glamor_get_pixmap_private(src_pixmap);
|
||||
}
|
||||
|
||||
glamor_get_drawable_deltas(src, src_pixmap, &src_x_off,
|
||||
&src_y_off);
|
||||
glamor_get_drawable_deltas(dst, dst_pixmap, &dst_x_off,
|
||||
|
@ -398,7 +400,9 @@ _glamor_copy_n_to_n(DrawablePtr src,
|
|||
|
||||
fail:
|
||||
|
||||
if (!fallback) {
|
||||
if (!fallback
|
||||
&& glamor_ddx_fallback_check_pixmap(src)
|
||||
&& glamor_ddx_fallback_check_pixmap(dst)) {
|
||||
ret = FALSE;
|
||||
goto done;
|
||||
}
|
||||
|
|
|
@ -65,8 +65,7 @@
|
|||
static const char glamor_name[] = "glamor";
|
||||
|
||||
static DevPrivateKeyRec glamor_egl_pixmap_private_key_index;
|
||||
DevPrivateKey glamor_egl_pixmap_private_key =
|
||||
&glamor_egl_pixmap_private_key_index;
|
||||
DevPrivateKey glamor_egl_pixmap_private_key = &glamor_egl_pixmap_private_key_index;
|
||||
|
||||
static void
|
||||
glamor_identify(int flags)
|
||||
|
@ -121,8 +120,6 @@ _glamor_egl_create_image(struct glamor_egl_screen_private *glamor_egl,
|
|||
EGL_DRM_BUFFER_USE_SCANOUT_MESA,
|
||||
EGL_NONE
|
||||
};
|
||||
|
||||
|
||||
attribs[1] = width;
|
||||
attribs[3] = height;
|
||||
attribs[5] = stride;
|
||||
|
@ -221,14 +218,15 @@ glamor_egl_create_textured_pixmap(PixmapPtr pixmap, int handle, int stride)
|
|||
EGLImageKHR image;
|
||||
GLuint texture;
|
||||
int name;
|
||||
int ret;
|
||||
glamor_pixmap_type_t type;
|
||||
|
||||
if (!glamor_get_flink_name(glamor_egl->fd, handle, &name)) {
|
||||
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
|
||||
"Couldn't flink pixmap handle\n");
|
||||
glamor_set_pixmap_type(pixmap, GLAMOR_MEMORY);
|
||||
return FALSE;
|
||||
glamor_set_pixmap_type(pixmap, GLAMOR_DRM_ONLY);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
image = _glamor_egl_create_image(glamor_egl,
|
||||
pixmap->drawable.width,
|
||||
pixmap->drawable.height,
|
||||
|
@ -236,18 +234,41 @@ glamor_egl_create_textured_pixmap(PixmapPtr pixmap, int handle, int stride)
|
|||
name,
|
||||
pixmap->drawable.depth);
|
||||
if (image == EGL_NO_IMAGE_KHR) {
|
||||
glamor_set_pixmap_type(pixmap, GLAMOR_DRM_ONLY);
|
||||
return FALSE;
|
||||
GLenum format;
|
||||
/* we have to create separated texture here. The reason is, if
|
||||
* a DRM-buffer-only pixmap exist, and given a texture only
|
||||
* pixmap as a source, then we will don't know how to render it
|
||||
* within glamor, and we even can't find a good way to fallback
|
||||
* to DDX driver, as DDX driver don't understand a texture only
|
||||
* pixmap. */
|
||||
type = GLAMOR_SEPARATE_TEXTURE;
|
||||
if (pixmap->drawable.depth == 24)
|
||||
format = GL_RGB;
|
||||
else
|
||||
format = GL_RGBA;
|
||||
glamor_egl->dispatch->glGenTextures(1, &texture);
|
||||
glamor_egl->dispatch->glBindTexture(GL_TEXTURE_2D, texture);
|
||||
glamor_egl->dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
|
||||
GL_NEAREST);
|
||||
glamor_egl->dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
|
||||
GL_NEAREST);
|
||||
glamor_egl->dispatch->glTexImage2D(GL_TEXTURE_2D, 0, format, pixmap->drawable.width,
|
||||
pixmap->drawable.height, 0, format,
|
||||
GL_UNSIGNED_BYTE, NULL);
|
||||
ret = FALSE;
|
||||
} else {
|
||||
type = GLAMOR_TEXTURE_DRM;
|
||||
glamor_create_texture_from_image(glamor_egl, image, &texture);
|
||||
ret = TRUE;
|
||||
}
|
||||
|
||||
glamor_create_texture_from_image(glamor_egl, image, &texture);
|
||||
glamor_set_pixmap_type(pixmap, type);
|
||||
glamor_set_pixmap_texture(pixmap, pixmap->drawable.width,
|
||||
pixmap->drawable.height, texture);
|
||||
|
||||
glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM);
|
||||
dixSetPrivate(&pixmap->devPrivates, glamor_egl_pixmap_private_key,
|
||||
image);
|
||||
return TRUE;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -261,7 +282,7 @@ glamor_egl_destroy_textured_pixmap(PixmapPtr pixmap)
|
|||
if (pixmap->refcnt == 1) {
|
||||
image = dixLookupPrivate(&pixmap->devPrivates,
|
||||
glamor_egl_pixmap_private_key);
|
||||
if (image != EGL_NO_IMAGE_KHR)
|
||||
if (image != EGL_NO_IMAGE_KHR && image != NULL)
|
||||
eglDestroyImageKHR(glamor_egl->display, image);
|
||||
}
|
||||
glamor_destroy_textured_pixmap(pixmap);
|
||||
|
@ -357,10 +378,10 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
|
|||
xf86Msg(X_INFO, "%s: EGL version %s:\n", glamor_name, version);
|
||||
|
||||
#define GLAMOR_CHECK_EGL_EXTENSION(EXT) \
|
||||
if (!glamor_egl_has_extension(glamor_egl, "EGL_" #EXT)) { \
|
||||
ErrorF("EGL_" #EXT "required.\n"); \
|
||||
return FALSE; \
|
||||
}
|
||||
if (!glamor_egl_has_extension(glamor_egl, "EGL_" #EXT)) { \
|
||||
ErrorF("EGL_" #EXT "required.\n"); \
|
||||
return FALSE; \
|
||||
}
|
||||
|
||||
GLAMOR_CHECK_EGL_EXTENSION(MESA_drm_image);
|
||||
GLAMOR_CHECK_EGL_EXTENSION(KHR_gl_renderbuffer_image);
|
||||
|
|
|
@ -82,7 +82,12 @@ glamor_fill(DrawablePtr drawable,
|
|||
return TRUE;
|
||||
|
||||
fail:
|
||||
if (!fallback) return FALSE;
|
||||
if (!fallback) {
|
||||
if (glamor_ddx_fallback_check_pixmap(&dst_pixmap->drawable)
|
||||
&& glamor_ddx_fallback_check_gc(gc))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
|
||||
if (glamor_prepare_access_gc(gc)) {
|
||||
fbFill(drawable, gc, x, y, width, height);
|
||||
|
|
|
@ -74,7 +74,10 @@ _glamor_fill_spans(DrawablePtr drawable,
|
|||
return TRUE;
|
||||
|
||||
fail:
|
||||
if (!fallback) return FALSE;
|
||||
if (!fallback
|
||||
&& glamor_ddx_fallback_check_pixmap(drawable)
|
||||
&& glamor_ddx_fallback_check_gc(gc))
|
||||
return FALSE;
|
||||
glamor_fallback("to %p (%c)\n", drawable,
|
||||
glamor_get_drawable_location(drawable));
|
||||
if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* Copyright © 2009 Intel Corporation
|
||||
* Copyright © 1998 Keith Packard
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* Authors:
|
||||
* Zhigang Gong <zhigang.gong@gmail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAVE_DIX_CONFIG_H
|
||||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include "glamor_priv.h"
|
||||
|
||||
|
||||
static Bool
|
||||
_glamor_get_image(DrawablePtr pDrawable, int x, int y, int w, int h,
|
||||
unsigned int format, unsigned long planeMask, char *d,
|
||||
Bool fallback)
|
||||
{
|
||||
miGetImage(pDrawable, x, y, w, h, format, planeMask, d);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
glamor_get_image(DrawablePtr pDrawable, int x, int y, int w, int h,
|
||||
unsigned int format, unsigned long planeMask, char *d)
|
||||
{
|
||||
_glamor_get_image(pDrawable, x, y, w, h, format, planeMask, d, TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
Bool
|
||||
glamor_get_image_nf(DrawablePtr pDrawable, int x, int y, int w, int h,
|
||||
unsigned int format, unsigned long planeMask, char *d)
|
||||
{
|
||||
return _glamor_get_image(pDrawable, x, y, w,
|
||||
h, format, planeMask, d, FALSE);
|
||||
}
|
|
@ -31,10 +31,11 @@
|
|||
|
||||
#include "glamor_priv.h"
|
||||
|
||||
void
|
||||
glamor_get_spans(DrawablePtr drawable,
|
||||
int wmax,
|
||||
DDXPointPtr points, int *widths, int count, char *dst)
|
||||
static Bool
|
||||
_glamor_get_spans(DrawablePtr drawable,
|
||||
int wmax,
|
||||
DDXPointPtr points, int *widths, int count, char *dst,
|
||||
Bool fallback)
|
||||
{
|
||||
PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
|
||||
GLenum format, type;
|
||||
|
@ -49,7 +50,7 @@ glamor_get_spans(DrawablePtr drawable,
|
|||
uint8_t *readpixels_dst = (uint8_t *) dst;
|
||||
int x_off, y_off;
|
||||
|
||||
if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) {
|
||||
if (!pixmap_priv || !GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) {
|
||||
glamor_fallback("pixmap has no fbo.\n");
|
||||
goto fail;
|
||||
}
|
||||
|
@ -94,14 +95,39 @@ glamor_get_spans(DrawablePtr drawable,
|
|||
}
|
||||
if (temp_pixmap)
|
||||
glamor_destroy_pixmap(temp_pixmap);
|
||||
return;
|
||||
return TRUE;
|
||||
|
||||
fail:
|
||||
|
||||
if (!fallback
|
||||
&& glamor_ddx_fallback_check_pixmap(drawable))
|
||||
return FALSE;
|
||||
glamor_fallback("from %p (%c)\n", drawable,
|
||||
glamor_get_drawable_location(drawable));
|
||||
if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RO)) {
|
||||
fbGetSpans(drawable, wmax, points, widths, count, dst);
|
||||
glamor_finish_access(drawable, GLAMOR_ACCESS_RO);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
glamor_get_spans(DrawablePtr drawable,
|
||||
int wmax,
|
||||
DDXPointPtr points, int *widths, int count, char *dst)
|
||||
{
|
||||
_glamor_get_spans(drawable, wmax, points,
|
||||
widths, count, dst, TRUE);
|
||||
}
|
||||
|
||||
Bool
|
||||
glamor_get_spans_nf(DrawablePtr drawable,
|
||||
int wmax,
|
||||
DDXPointPtr points, int *widths, int count, char *dst)
|
||||
{
|
||||
return _glamor_get_spans(drawable, wmax, points,
|
||||
widths, count, dst, FALSE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -184,7 +184,7 @@ glamor_realize_glyph_caches(ScreenPtr pScreen)
|
|||
CPComponentAlpha, &component_alpha,
|
||||
serverClient, &error);
|
||||
|
||||
glamor_destroy_pixmap(pixmap);
|
||||
pScreen->DestroyPixmap(pixmap);
|
||||
if (!picture)
|
||||
goto bail;
|
||||
|
||||
|
@ -239,12 +239,57 @@ glamor_glyph_cache_upload_glyph(ScreenPtr screen,
|
|||
ValidateGC(&pCachePixmap->drawable, gc);
|
||||
|
||||
scratch = pGlyphPixmap;
|
||||
if (pGlyphPixmap->drawable.depth != pCachePixmap->drawable.depth) {
|
||||
scratch = glamor_create_pixmap(screen,
|
||||
glyph->info.width,
|
||||
glyph->info.height,
|
||||
pCachePixmap->
|
||||
drawable.depth, 0);
|
||||
if (scratch) {
|
||||
if (pGlyphPixmap->drawable.depth !=
|
||||
pCachePixmap->drawable.depth) {
|
||||
PicturePtr picture;
|
||||
int error;
|
||||
|
||||
picture =
|
||||
CreatePicture(0,
|
||||
&scratch->drawable,
|
||||
PictureMatchFormat
|
||||
(screen,
|
||||
pCachePixmap->
|
||||
drawable.depth,
|
||||
cache->picture->format),
|
||||
0, NULL, serverClient,
|
||||
&error);
|
||||
if (picture) {
|
||||
ValidatePicture(picture);
|
||||
glamor_composite(PictOpSrc,
|
||||
pGlyphPicture,
|
||||
NULL, picture,
|
||||
0, 0, 0, 0, 0,
|
||||
0,
|
||||
glyph->info.width,
|
||||
glyph->info.height);
|
||||
FreePicture(picture, 0);
|
||||
}
|
||||
} else {
|
||||
glamor_copy_area(&pGlyphPixmap->drawable,
|
||||
&scratch->drawable,
|
||||
gc, 0, 0,
|
||||
glyph->info.width,
|
||||
glyph->info.height, 0, 0);
|
||||
}
|
||||
} else {
|
||||
scratch = pGlyphPixmap;
|
||||
}
|
||||
}
|
||||
|
||||
(*gc->ops->CopyArea)(&scratch->drawable, &pCachePixmap->drawable, gc,
|
||||
0, 0, glyph->info.width, glyph->info.height, x,
|
||||
y);
|
||||
|
||||
if (scratch != pGlyphPixmap)
|
||||
glamor_destroy_pixmap(scratch);
|
||||
screen->DestroyPixmap(scratch);
|
||||
|
||||
FreeScratchGC(gc);
|
||||
}
|
||||
|
@ -581,8 +626,8 @@ static void
|
|||
glamor_glyphs_flush_mask(PicturePtr mask, glamor_glyph_buffer_t * buffer)
|
||||
{
|
||||
#ifdef RENDER
|
||||
glamor_composite_rects(PictOpAdd, buffer->source, NULL, mask,
|
||||
buffer->count, buffer->rects);
|
||||
glamor_composite_glyph_rects(PictOpAdd, buffer->source, NULL, mask,
|
||||
buffer->count, buffer->rects);
|
||||
#endif
|
||||
buffer->count = 0;
|
||||
buffer->source = NULL;
|
||||
|
@ -638,7 +683,7 @@ glamor_glyphs_via_mask(CARD8 op,
|
|||
mask_format, CPComponentAlpha,
|
||||
&component_alpha, serverClient, &error);
|
||||
if (!mask) {
|
||||
glamor_destroy_pixmap(mask_pixmap);
|
||||
screen->DestroyPixmap(mask_pixmap);
|
||||
return;
|
||||
}
|
||||
gc = GetScratchGC(mask_pixmap->drawable.depth, screen);
|
||||
|
@ -695,7 +740,7 @@ glamor_glyphs_via_mask(CARD8 op,
|
|||
x_src + x - x_dst,
|
||||
y_src + y - y_dst, 0, 0, x, y, width, height);
|
||||
FreePicture(mask, 0);
|
||||
glamor_destroy_pixmap(mask_pixmap);
|
||||
screen->DestroyPixmap(mask_pixmap);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -714,7 +759,7 @@ glamor_glyphs_flush_dst(CARD8 op,
|
|||
rect->y_src = y_src + rect->y_dst - y_dst;
|
||||
}
|
||||
|
||||
glamor_composite_rects(op, src, buffer->source, dst,
|
||||
glamor_composite_glyph_rects(op, src, buffer->source, dst,
|
||||
buffer->count, &buffer->rects[0]);
|
||||
|
||||
buffer->count = 0;
|
||||
|
|
|
@ -42,7 +42,7 @@ glamor_finish_access_picture(PicturePtr picture, glamor_access_t access)
|
|||
}
|
||||
|
||||
/*
|
||||
* We should already has drawable attached to it, if it has one.
|
||||
* We should already have drawable attached to it, if it has one.
|
||||
* Then set the attached pixmap to is_picture format, and set
|
||||
* the pict format.
|
||||
* */
|
||||
|
@ -64,6 +64,10 @@ glamor_create_picture(PicturePtr picture)
|
|||
if (pixmap_priv) {
|
||||
pixmap_priv->is_picture = 1;
|
||||
pixmap_priv->pict_format = picture->format;
|
||||
/* XXX Some formats are compatible between glamor and ddx driver*/
|
||||
if (pixmap_priv->type == GLAMOR_TEXTURE_DRM
|
||||
/*&& pixmap_priv->pict_format != PICT_b8g8r8a8*/)
|
||||
glamor_set_pixmap_type(pixmap, GLAMOR_SEPARATE_TEXTURE);
|
||||
}
|
||||
return glamor_priv->saved_create_picture(picture);
|
||||
}
|
||||
|
|
|
@ -94,7 +94,12 @@ _glamor_poly_fill_rect(DrawablePtr drawable,
|
|||
return TRUE;
|
||||
|
||||
fail:
|
||||
if (!fallback) return FALSE;
|
||||
|
||||
if (!fallback
|
||||
&& glamor_ddx_fallback_check_pixmap(drawable)
|
||||
&& glamor_ddx_fallback_check_gc(gc))
|
||||
return FALSE;
|
||||
|
||||
glamor_fallback(" to %p (%c)\n",
|
||||
drawable, glamor_get_drawable_location(drawable));
|
||||
if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
|
||||
|
|
|
@ -147,6 +147,7 @@ typedef struct glamor_screen_private {
|
|||
CopyWindowProcPtr saved_copy_window;
|
||||
BitmapToRegionProcPtr saved_bitmap_to_region;
|
||||
TrianglesProcPtr saved_triangles;
|
||||
AddTrapsProcPtr saved_addtraps;
|
||||
CreatePictureProcPtr saved_create_picture;
|
||||
DestroyPictureProcPtr saved_destroy_picture;
|
||||
UnrealizeGlyphProcPtr saved_unrealize_glyph;
|
||||
|
@ -444,10 +445,16 @@ void glamor_trapezoids(CARD8 op,
|
|||
PictFormatPtr mask_format, INT16 x_src, INT16 y_src,
|
||||
int ntrap, xTrapezoid * traps);
|
||||
void glamor_init_composite_shaders(ScreenPtr screen);
|
||||
void glamor_composite_rects(CARD8 op,
|
||||
PicturePtr src, PicturePtr mask,
|
||||
PicturePtr dst, int nrect,
|
||||
glamor_composite_rect_t * rects);
|
||||
void glamor_composite_glyph_rects(CARD8 op,
|
||||
PicturePtr src, PicturePtr mask,
|
||||
PicturePtr dst, int nrect,
|
||||
glamor_composite_rect_t * rects);
|
||||
void glamor_composite_rects (CARD8 op,
|
||||
PicturePtr pDst,
|
||||
xRenderColor *color,
|
||||
int nRect,
|
||||
xRectangle *rects);
|
||||
|
||||
|
||||
/* glamor_tile.c */
|
||||
Bool glamor_tile(PixmapPtr pixmap, PixmapPtr tile,
|
||||
|
@ -536,10 +543,19 @@ enum glamor_pixmap_status
|
|||
glamor_upload_picture_to_texture(PicturePtr picture);
|
||||
|
||||
void
|
||||
|
||||
glamor_picture_format_fixup(PicturePtr picture,
|
||||
glamor_pixmap_private * pixmap_priv);
|
||||
|
||||
void
|
||||
glamor_get_image(DrawablePtr pDrawable, int x, int y, int w, int h,
|
||||
unsigned int format, unsigned long planeMask, char *d);
|
||||
|
||||
|
||||
void
|
||||
glamor_add_traps(PicturePtr pPicture,
|
||||
INT16 x_off,
|
||||
INT16 y_off, int ntrap, xTrap * traps);
|
||||
|
||||
#include"glamor_utils.h"
|
||||
|
||||
/* Dynamic pixmap upload to texture if needed.
|
||||
|
|
|
@ -395,7 +395,11 @@ _glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y,
|
|||
|
||||
fail:
|
||||
glamor_set_planemask(pixmap, ~0);
|
||||
if (!fallback) return FALSE;
|
||||
|
||||
if (!fallback
|
||||
&& glamor_ddx_fallback_check_pixmap(&pixmap->drawable))
|
||||
return FALSE;
|
||||
|
||||
glamor_fallback("to %p (%c)\n",
|
||||
drawable, glamor_get_drawable_location(drawable));
|
||||
if (glamor_prepare_access(&pixmap->drawable, GLAMOR_ACCESS_RW)) {
|
||||
|
|
|
@ -1155,7 +1155,6 @@ glamor_convert_gradient_picture(ScreenPtr screen,
|
|||
PicturePtr dst;
|
||||
int error;
|
||||
PictFormatShort format;
|
||||
|
||||
if (!source->pDrawable)
|
||||
format = PICT_a8r8g8b8;
|
||||
else
|
||||
|
@ -1176,7 +1175,7 @@ glamor_convert_gradient_picture(ScreenPtr screen,
|
|||
PIXMAN_FORMAT_DEPTH(format),
|
||||
format),
|
||||
0, 0, serverClient, &error);
|
||||
screen->DestroyPixmap(pixmap);
|
||||
glamor_destroy_pixmap(pixmap);
|
||||
if (!dst)
|
||||
return NULL;
|
||||
|
||||
|
@ -1226,18 +1225,24 @@ _glamor_composite(CARD8 op,
|
|||
}
|
||||
|
||||
if (source->pDrawable) {
|
||||
source_pixmap =
|
||||
glamor_get_drawable_pixmap(source->pDrawable);
|
||||
source_pixmap_priv =
|
||||
glamor_get_pixmap_private(source_pixmap);
|
||||
if (!source_pixmap_priv || source_pixmap_priv->type == GLAMOR_DRM_ONLY)
|
||||
source_pixmap = glamor_get_drawable_pixmap(source->pDrawable);
|
||||
source_pixmap_priv = glamor_get_pixmap_private(source_pixmap);
|
||||
if (!source_pixmap_priv) {
|
||||
glamor_set_pixmap_type(source_pixmap, GLAMOR_MEMORY);
|
||||
source_pixmap_priv = glamor_get_pixmap_private(source_pixmap);
|
||||
}
|
||||
if (source_pixmap_priv->type == GLAMOR_DRM_ONLY)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (mask && mask->pDrawable) {
|
||||
mask_pixmap = glamor_get_drawable_pixmap(mask->pDrawable);
|
||||
mask_pixmap_priv = glamor_get_pixmap_private(mask_pixmap);
|
||||
if (!mask_pixmap_priv || mask_pixmap_priv->type == GLAMOR_DRM_ONLY)
|
||||
if (!mask_pixmap_priv) {
|
||||
glamor_set_pixmap_type(mask_pixmap, GLAMOR_MEMORY);
|
||||
mask_pixmap_priv = glamor_get_pixmap_private(mask_pixmap);
|
||||
}
|
||||
if (mask_pixmap_priv->type == GLAMOR_DRM_ONLY)
|
||||
goto fail;
|
||||
}
|
||||
if ((!source->pDrawable
|
||||
|
@ -1336,10 +1341,17 @@ _glamor_composite(CARD8 op,
|
|||
|
||||
dispatch->glUseProgram(0);
|
||||
dispatch->glDisable(GL_BLEND);
|
||||
if (!fallback) {
|
||||
if (!fallback
|
||||
&& glamor_ddx_fallback_check_pixmap(&dest_pixmap->drawable)
|
||||
&& (!source_pixmap
|
||||
|| glamor_ddx_fallback_check_pixmap(&source_pixmap->drawable))
|
||||
&& (!mask_pixmap
|
||||
|| glamor_ddx_fallback_check_pixmap(&mask_pixmap->drawable))) {
|
||||
ret = FALSE;
|
||||
goto done;
|
||||
}
|
||||
|
||||
fallback:
|
||||
glamor_fallback
|
||||
("from picts %p:%p %dx%d / %p:%p %d x %d (%c,%c) to pict %p:%p %dx%d (%c)\n",
|
||||
source, source->pDrawable,
|
||||
|
@ -1564,9 +1576,9 @@ glamor_trapezoids_nf(CARD8 op,
|
|||
|
||||
|
||||
void
|
||||
glamor_composite_rects(CARD8 op,
|
||||
PicturePtr src, PicturePtr mask, PicturePtr dst,
|
||||
int nrect, glamor_composite_rect_t * rects)
|
||||
glamor_composite_glyph_rects(CARD8 op,
|
||||
PicturePtr src, PicturePtr mask, PicturePtr dst,
|
||||
int nrect, glamor_composite_rect_t * rects)
|
||||
{
|
||||
int n;
|
||||
glamor_composite_rect_t *r;
|
||||
|
@ -1592,4 +1604,38 @@ glamor_composite_rects(CARD8 op,
|
|||
}
|
||||
}
|
||||
|
||||
static Bool
|
||||
_glamor_composite_rects (CARD8 op,
|
||||
PicturePtr pDst,
|
||||
xRenderColor *color,
|
||||
int nRect,
|
||||
xRectangle *rects,
|
||||
Bool fallback)
|
||||
{
|
||||
miCompositeRects(op, pDst, color, nRect, rects);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
glamor_composite_rects (CARD8 op,
|
||||
PicturePtr pDst,
|
||||
xRenderColor *color,
|
||||
int nRect,
|
||||
xRectangle *rects)
|
||||
{
|
||||
_glamor_composite_rects(op, pDst, color, nRect, rects, TRUE);
|
||||
}
|
||||
|
||||
Bool
|
||||
glamor_composite_rects_nf (CARD8 op,
|
||||
PicturePtr pDst,
|
||||
xRenderColor *color,
|
||||
int nRect,
|
||||
xRectangle *rects)
|
||||
{
|
||||
return _glamor_composite_rects(op, pDst, color, nRect, rects, FALSE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif /* RENDER */
|
||||
|
|
|
@ -31,9 +31,10 @@
|
|||
|
||||
#include "glamor_priv.h"
|
||||
|
||||
void
|
||||
glamor_set_spans(DrawablePtr drawable, GCPtr gc, char *src,
|
||||
DDXPointPtr points, int *widths, int n, int sorted)
|
||||
static Bool
|
||||
_glamor_set_spans(DrawablePtr drawable, GCPtr gc, char *src,
|
||||
DDXPointPtr points, int *widths, int n, int sorted,
|
||||
Bool fallback)
|
||||
{
|
||||
PixmapPtr dest_pixmap = glamor_get_drawable_pixmap(drawable);
|
||||
glamor_screen_private *glamor_priv =
|
||||
|
@ -94,13 +95,32 @@ glamor_set_spans(DrawablePtr drawable, GCPtr gc, char *src,
|
|||
glamor_set_planemask(dest_pixmap, ~0);
|
||||
glamor_set_alu(dispatch, GXcopy);
|
||||
dispatch->glDisable(GL_SCISSOR_TEST);
|
||||
return;
|
||||
return TRUE;
|
||||
fail:
|
||||
|
||||
if (!fallback
|
||||
&& glamor_ddx_fallback_check_pixmap(drawable))
|
||||
return FALSE;
|
||||
glamor_fallback("to %p (%c)\n",
|
||||
drawable, glamor_get_drawable_location(drawable));
|
||||
if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
|
||||
fbSetSpans(drawable, gc, src, points, widths, n, sorted);
|
||||
glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
glamor_set_spans(DrawablePtr drawable, GCPtr gc, char *src,
|
||||
DDXPointPtr points, int *widths, int n, int sorted)
|
||||
{
|
||||
_glamor_set_spans(drawable, gc, src, points,
|
||||
widths, n, sorted, TRUE);
|
||||
}
|
||||
|
||||
Bool
|
||||
glamor_set_spans_nf(DrawablePtr drawable, GCPtr gc, char *src,
|
||||
DDXPointPtr points, int *widths, int n, int sorted)
|
||||
{
|
||||
return _glamor_set_spans(drawable, gc, src, points,
|
||||
widths, n, sorted, FALSE);
|
||||
}
|
||||
|
|
|
@ -39,20 +39,23 @@ _glamor_triangles(CARD8 op,
|
|||
PictFormatPtr maskFormat,
|
||||
INT16 xSrc, INT16 ySrc, int ntris, xTriangle * tris, Bool fallback)
|
||||
{
|
||||
if (!fallback)
|
||||
if (!fallback
|
||||
&& glamor_ddx_fallback_check_pixmap(pDst->pDrawable)
|
||||
&& (!pSrc->pDrawable
|
||||
|| glamor_ddx_fallback_check_pixmap(pSrc->pDrawable)))
|
||||
return FALSE;
|
||||
if (glamor_prepare_access(pDst->pDrawable, GLAMOR_ACCESS_RW)) {
|
||||
if (pSrc->pDrawable == NULL ||
|
||||
glamor_prepare_access(pSrc->pDrawable,
|
||||
GLAMOR_ACCESS_RO)) {
|
||||
|
||||
if (glamor_prepare_access_picture(pDst, GLAMOR_ACCESS_RW)) {
|
||||
if (glamor_prepare_access_picture(pSrc,
|
||||
GLAMOR_ACCESS_RO)) {
|
||||
|
||||
fbTriangles(op, pSrc, pDst, maskFormat, xSrc,
|
||||
ySrc, ntris, tris);
|
||||
}
|
||||
if (pSrc->pDrawable != NULL)
|
||||
glamor_finish_access(pSrc->pDrawable, GLAMOR_ACCESS_RO);
|
||||
|
||||
glamor_finish_access(pDst->pDrawable, GLAMOR_ACCESS_RW);
|
||||
glamor_finish_access_picture(pSrc, GLAMOR_ACCESS_RO);
|
||||
}
|
||||
|
||||
glamor_finish_access_picture(pDst, GLAMOR_ACCESS_RW);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -541,9 +541,34 @@ glamor_get_rgba_from_pixel(CARD32 pixel,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* return TRUE if we can access this pixmap at DDX driver. */
|
||||
inline static Bool glamor_ddx_fallback_check_pixmap(DrawablePtr drawable)
|
||||
{
|
||||
PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
|
||||
glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
|
||||
return (!pixmap_priv
|
||||
|| (pixmap_priv->type == GLAMOR_TEXTURE_DRM
|
||||
|| pixmap_priv->type == GLAMOR_MEMORY
|
||||
|| pixmap_priv->type == GLAMOR_DRM_ONLY));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
inline static Bool glamor_ddx_fallback_check_gc(GCPtr gc)
|
||||
{
|
||||
PixmapPtr pixmap;
|
||||
if (!gc)
|
||||
return TRUE;
|
||||
switch (gc->fillStyle) {
|
||||
case FillStippled:
|
||||
case FillOpaqueStippled:
|
||||
pixmap = gc->stipple;
|
||||
break;
|
||||
case FillTiled:
|
||||
pixmap = gc->tile.pixmap;
|
||||
break;
|
||||
default:
|
||||
pixmap = NULL;
|
||||
}
|
||||
return (!pixmap || glamor_ddx_fallback_check_pixmap(&pixmap->drawable));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue