Instead of one glTexSubImage2D call for each glyph.
This significantly reduces the amount of time it takes for xterm to start up on a fresh X server with the radeonsi driver. v2: Use GLYPHWIDTHBYTESPADDED instead of hardcoding 4 bytes glyph alignment (Keith Packard) Reviewed-by: Keith Packard <keithp@keithp.com> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com> Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
ac94cdb9df
commit
732e3b9c08
|
@ -45,6 +45,7 @@ glamor_font_get(ScreenPtr screen, FontPtr font)
|
||||||
unsigned char c[2];
|
unsigned char c[2];
|
||||||
CharInfoPtr glyph;
|
CharInfoPtr glyph;
|
||||||
unsigned long count;
|
unsigned long count;
|
||||||
|
char *bits;
|
||||||
|
|
||||||
if (glamor_priv->glsl_version < 130)
|
if (glamor_priv->glsl_version < 130)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -62,8 +63,6 @@ glamor_font_get(ScreenPtr screen, FontPtr font)
|
||||||
if (glamor_font->realized)
|
if (glamor_font->realized)
|
||||||
return glamor_font;
|
return glamor_font;
|
||||||
|
|
||||||
glamor_font->realized = TRUE;
|
|
||||||
|
|
||||||
/* Figure out how many glyphs are in the font */
|
/* Figure out how many glyphs are in the font */
|
||||||
num_cols = font->info.lastCol - font->info.firstCol + 1;
|
num_cols = font->info.lastCol - font->info.firstCol + 1;
|
||||||
num_rows = font->info.lastRow - font->info.firstRow + 1;
|
num_rows = font->info.lastRow - font->info.firstRow + 1;
|
||||||
|
@ -81,6 +80,10 @@ glamor_font_get(ScreenPtr screen, FontPtr font)
|
||||||
overall_width = glyph_width_bytes * num_cols;
|
overall_width = glyph_width_bytes * num_cols;
|
||||||
overall_height = glyph_height * num_rows;
|
overall_height = glyph_height * num_rows;
|
||||||
|
|
||||||
|
bits = malloc(overall_width * overall_height);
|
||||||
|
if (!bits)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
/* Check whether the font has a default character */
|
/* Check whether the font has a default character */
|
||||||
c[0] = font->info.lastRow + 1;
|
c[0] = font->info.lastRow + 1;
|
||||||
c[1] = font->info.lastCol + 1;
|
c[1] = font->info.lastCol + 1;
|
||||||
|
@ -100,12 +103,6 @@ glamor_font_get(ScreenPtr screen, FontPtr font)
|
||||||
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);
|
||||||
|
|
||||||
/* Allocate storage */
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8UI, overall_width, overall_height,
|
|
||||||
0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, NULL);
|
|
||||||
|
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
|
||||||
|
|
||||||
/* Paint all of the glyphs */
|
/* Paint all of the glyphs */
|
||||||
for (row = 0; row < num_rows; row++) {
|
for (row = 0; row < num_rows; row++) {
|
||||||
for (col = 0; col < num_cols; col++) {
|
for (col = 0; col < num_cols; col++) {
|
||||||
|
@ -114,13 +111,29 @@ glamor_font_get(ScreenPtr screen, FontPtr font)
|
||||||
|
|
||||||
(*font->get_glyphs)(font, 1, c, TwoD16Bit, &count, &glyph);
|
(*font->get_glyphs)(font, 1, c, TwoD16Bit, &count, &glyph);
|
||||||
|
|
||||||
if (count)
|
if (count) {
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, col * glyph_width_bytes, row * glyph_height,
|
char *dst = bits + row * glyph_height * overall_width +
|
||||||
GLYPHWIDTHBYTES(glyph), GLYPHHEIGHTPIXELS(glyph),
|
col * glyph_width_bytes;
|
||||||
GL_RED_INTEGER, GL_UNSIGNED_BYTE, glyph->bits);
|
char *src = glyph->bits;
|
||||||
|
unsigned y;
|
||||||
|
|
||||||
|
for (y = 0; y < GLYPHHEIGHTPIXELS(glyph); y++) {
|
||||||
|
memcpy(dst, src, GLYPHWIDTHBYTES(glyph));
|
||||||
|
dst += overall_width;
|
||||||
|
src += GLYPHWIDTHBYTESPADDED(glyph);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8UI, overall_width, overall_height,
|
||||||
|
0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, bits);
|
||||||
|
|
||||||
|
free(bits);
|
||||||
|
|
||||||
|
glamor_font->realized = TRUE;
|
||||||
|
|
||||||
return glamor_font;
|
return glamor_font;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue