Rendering in geode

Huang, FrankR FrankR.Huang at amd.com
Thu Jun 24 02:21:31 PDT 2010


Jonathan, 

	Let me narrow down the firefox issue point. I found that that has relationship with my patch's function lx_do_composite_mask_opover()
	You know there is an EXA function exaGetPixmapPicth() which can get a pixmap's pitch.
	My method for handling PictOpOver is that 
		1)src' = src * mask
	src' is in the off-screen memory region, if the src pitch is PITCH( got from exaGetPixmapPitch), then the src' pitch is 4*PITCH( I set). 
		2)dest' = src' + (1 - alpha) * dest
	Src' is also 4 * PITCH, and dest picth is also gotten from exaGetPixmapPitch() function.
	The reason I use 4*PITCH is that the src is A8 picture, and the src' format is ARGB32, so it is 4*PITCH. I don't know if that is reasonable to appoint that pitch directly instead of exaGetPixmapPitch().
	Code details, see below.





------------------------------------------------
+static void
+lx_do_composite_mask_opover(PixmapPtr pxDst, unsigned long dstOffset,
+    unsigned int maskOffset, int width, int height) {
+    int apply, type;
+    struct blend_ops_t *opPtr;
+
+    /* Wait until the GP is idle - this will ensure that the scratch buffer
+     * isn't occupied */
+
+    gp_wait_until_idle();
+
+    /* Copy the source to the scratch buffer, and do a src * mask raster
+     * operation */
+
+    gp_declare_blt(0);
+    opPtr = &lx_alpha_ops[(exaScratch.op * 2) + 1];
+    gp_set_source_format(CIMGP_SOURCE_FMT_8_8_8_8);
+    gp_set_strides(exaScratch.srcPitch * 4, exaScratch.srcPitch);
+    gp_set_bpp(lx_get_bpp_from_format(CIMGP_SOURCE_FMT_8_8_8_8));
+    gp_set_solid_source(exaScratch.srcColor);
+    gp_blend_mask_blt(exaScratch.bufferOffset, 0, width, height, maskOffset,
+	exaScratch.srcPitch, opPtr->operation, exaScratch.fourBpp);
+
+    /* Do a PictOpOver operation(src + (1-a) * dst), and copy the operation
+     * result to destination */
+
+    gp_declare_blt(CIMGP_BLTFLAGS_HAZARD);
+    opPtr = &lx_alpha_ops[exaScratch.op * 2];
+    apply = (exaScratch.dstFormat->alphabits == 0) ?
+	CIMGP_APPLY_BLEND_TO_RGB : CIMGP_APPLY_BLEND_TO_ALL;
+    gp_set_source_format(CIMGP_SOURCE_FMT_8_8_8_8);
+    gp_set_strides(exaGetPixmapPitch(pxDst), exaScratch.srcPitch * 4);
+    gp_set_bpp(lx_get_bpp_from_format(exaScratch.dstFormat->fmt));
+    type = CIMGP_CONVERTED_ALPHA;
+    gp_set_alpha_operation(opPtr->operation, type, opPtr->channel, apply, 0);
+    gp_screen_to_screen_convert(dstOffset, exaScratch.bufferOffset, width,
+	height, 0);
+}
+

--------------------------------------------------------------------




-----Original Message-----
From: xorg-devel-bounces+frankr.huang=amd.com at lists.x.org [mailto:xorg-devel-bounces+frankr.huang=amd.com at lists.x.org] On Behalf Of Jonathan Morton
Sent: 2010?6?23? 20:57
To: Huang, FrankR
Cc: xorg-driver-geode at lists.x.org; xorg-devel at lists.x.org
Subject: RE: Rendering in geode

On Wed, 2010-06-23 at 15:54 +0800, Huang, FrankR wrote:
> ...the side effect is that firefox has some characters missing.

I would suspect a bug in your "coordinate range" handling code.  It may
be related to the dimensions of individual glyphs.

Text rendering goes through the following stages:

- A fresh temporary pixmap, A8 format, is allocated and cleared.

- Individual glyphs are placed in this pixmap using ADD operation,
sourced from a large (1024x320) pixmap serving as a glyph cache.

- The complete pixmap is used as a mask for an OVER operation onto the
original target.  The source is normally a solid colour.

- The temporary pixmap is thrown away.

If you accelerate the ADD operation, it should have the same coordinate
handling as the OVER operation; areas outside images are no-ops when
Repeat is disabled.

-- 
------
From: Jonathan Morton
      jonathan.morton at movial.com


_______________________________________________
xorg-devel at lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel




More information about the xorg-devel mailing list