Revert "EXA: Accumulate arbitrary number of glyphs without flushing."

This reverts commit c11678cc18.

Not sure what I was thinking, turns out alloca() of a size derived from client
input is a bad idea.

Signed-off-by: Michel Dänzer <daenzer@vmware.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Michel Dänzer 2009-11-30 13:17:51 +01:00 committed by Keith Packard
parent 99d88ef69d
commit 0e555a1033

View File

@ -62,10 +62,15 @@
*/ */
#define CACHE_PICTURE_WIDTH 1024 #define CACHE_PICTURE_WIDTH 1024
/* Maximum number of glyphs we buffer on the stack before flushing
* rendering to the mask or destination surface.
*/
#define GLYPH_BUFFER_SIZE 256
typedef struct { typedef struct {
PicturePtr mask; PicturePtr mask;
ExaCompositeRectRec rects[GLYPH_BUFFER_SIZE];
int count; int count;
ExaCompositeRectRec rects[0];
} ExaGlyphBuffer, *ExaGlyphBufferPtr; } ExaGlyphBuffer, *ExaGlyphBufferPtr;
typedef enum { typedef enum {
@ -552,13 +557,16 @@ exaBufferGlyph(ScreenPtr pScreen,
INT16 yDst) INT16 yDst)
{ {
ExaScreenPriv(pScreen); ExaScreenPriv(pScreen);
PicturePtr mask = GlyphPicture(pGlyph)[pScreen->myNum]; unsigned int format = (GlyphPicture(pGlyph)[pScreen->myNum])->format;
unsigned int format = mask->format;
int width = pGlyph->info.width; int width = pGlyph->info.width;
int height = pGlyph->info.height; int height = pGlyph->info.height;
ExaCompositeRectPtr rect; ExaCompositeRectPtr rect;
PicturePtr mask;
int i; int i;
if (buffer->count == GLYPH_BUFFER_SIZE)
return ExaGlyphNeedFlush;
if (PICT_FORMAT_BPP(format) == 1) if (PICT_FORMAT_BPP(format) == 1)
format = PICT_a8; format = PICT_a8;
@ -589,6 +597,7 @@ exaBufferGlyph(ScreenPtr pScreen,
/* Couldn't find the glyph in the cache, use the glyph picture directly */ /* Couldn't find the glyph in the cache, use the glyph picture directly */
mask = GlyphPicture(pGlyph)[pScreen->myNum];
if (buffer->mask && buffer->mask != mask) if (buffer->mask && buffer->mask != mask)
return ExaGlyphNeedFlush; return ExaGlyphNeedFlush;
@ -702,18 +711,12 @@ exaGlyphs (CARD8 op,
int width = 0, height = 0; int width = 0, height = 0;
int x, y; int x, y;
int first_xOff = list->xOff, first_yOff = list->yOff; int first_xOff = list->xOff, first_yOff = list->yOff;
int i, n; int n;
GlyphPtr glyph; GlyphPtr glyph;
int error; int error;
BoxRec extents = {0, 0, 0, 0}; BoxRec extents = {0, 0, 0, 0};
CARD32 component_alpha; CARD32 component_alpha;
ExaGlyphBufferPtr buffer; ExaGlyphBuffer buffer;
for (i = 0, n = 0; i < nlist; i++)
n += list[i].len;
buffer = alloca(sizeof(ExaGlyphBuffer) + n * sizeof(ExaCompositeRectRec));
if (!buffer)
return;
if (maskFormat) if (maskFormat)
{ {
@ -793,8 +796,8 @@ exaGlyphs (CARD8 op,
x = 0; x = 0;
y = 0; y = 0;
} }
buffer->count = 0; buffer.count = 0;
buffer->mask = NULL; buffer.mask = NULL;
while (nlist--) while (nlist--)
{ {
x += list->xOff; x += list->xOff;
@ -809,23 +812,23 @@ exaGlyphs (CARD8 op,
/* pGlyph->info.{x,y} compensate for empty space in the glyph. */ /* pGlyph->info.{x,y} compensate for empty space in the glyph. */
if (maskFormat) if (maskFormat)
{ {
if (exaBufferGlyph(pScreen, buffer, glyph, NULL, pMask, if (exaBufferGlyph(pScreen, &buffer, glyph, NULL, pMask,
0, 0, 0, 0, x - glyph->info.x, y - glyph->info.y) == ExaGlyphNeedFlush) 0, 0, 0, 0, x - glyph->info.x, y - glyph->info.y) == ExaGlyphNeedFlush)
{ {
exaGlyphsToMask(pMask, buffer); exaGlyphsToMask(pMask, &buffer);
exaBufferGlyph(pScreen, buffer, glyph, NULL, pMask, exaBufferGlyph(pScreen, &buffer, glyph, NULL, pMask,
0, 0, 0, 0, x - glyph->info.x, y - glyph->info.y); 0, 0, 0, 0, x - glyph->info.x, y - glyph->info.y);
} }
} }
else else
{ {
if (exaBufferGlyph(pScreen, buffer, glyph, pSrc, pDst, if (exaBufferGlyph(pScreen, &buffer, glyph, pSrc, pDst,
xSrc + (x - glyph->info.x) - first_xOff, ySrc + (y - glyph->info.y) - first_yOff, xSrc + (x - glyph->info.x) - first_xOff, ySrc + (y - glyph->info.y) - first_yOff,
0, 0, x - glyph->info.x, y - glyph->info.y) 0, 0, x - glyph->info.x, y - glyph->info.y)
== ExaGlyphNeedFlush) == ExaGlyphNeedFlush)
{ {
exaGlyphsToDst(pSrc, pDst, buffer); exaGlyphsToDst(pSrc, pDst, &buffer);
exaBufferGlyph(pScreen, buffer, glyph, pSrc, pDst, exaBufferGlyph(pScreen, &buffer, glyph, pSrc, pDst,
xSrc + (x - glyph->info.x) - first_xOff, ySrc + (y - glyph->info.y) - first_yOff, xSrc + (x - glyph->info.x) - first_xOff, ySrc + (y - glyph->info.y) - first_yOff,
0, 0, x - glyph->info.x, y - glyph->info.y); 0, 0, x - glyph->info.x, y - glyph->info.y);
} }
@ -838,11 +841,11 @@ exaGlyphs (CARD8 op,
list++; list++;
} }
if (buffer->count) { if (buffer.count) {
if (maskFormat) if (maskFormat)
exaGlyphsToMask(pMask, buffer); exaGlyphsToMask(pMask, &buffer);
else else
exaGlyphsToDst(pSrc, pDst, buffer); exaGlyphsToDst(pSrc, pDst, &buffer);
} }
if (maskFormat) if (maskFormat)