[PATCH] glamor: fallback if font is too large for FBO size.
Dave Airlie
airlied at gmail.com
Mon Jan 11 23:24:01 PST 2016
On 12 January 2016 at 16:15, Keith Packard <keithp at keithp.com> wrote:
> Dave Airlie <airlied at gmail.com> writes:
>
>> From: Dave Airlie <airlied at redhat.com>
>>
>> running xfontsel on haswell here, with a max texture size
>> of 8kx8k, one font wants 9711 height. This fallsback to
>> sw in this case.
>>
>> A proper solution probably involves using an array texture.
>>
>> Signed-off-by: Dave Airlie <airlied at redhat.com>
>> ---
>> glamor/glamor_font.c | 4 ++++
>> 1 file changed, 4 insertions(+)
>>
>> diff --git a/glamor/glamor_font.c b/glamor/glamor_font.c
>> index 6753d50..bda1b58 100644
>> --- a/glamor/glamor_font.c
>> +++ b/glamor/glamor_font.c
>> @@ -80,6 +80,10 @@ glamor_font_get(ScreenPtr screen, FontPtr font)
>> overall_width = glyph_width_bytes * num_cols;
>> overall_height = glyph_height * num_rows;
>>
>> + if (overall_width > glamor_priv->max_fbo_size ||
>> + overall_height > glamor_priv->max_fbo_size) {
>> + return NULL;
>> + }
>
> I wonder why glTexImage2D didn't return GL_OUT_OF_MEMORY for this case;
> we check for that. Maybe there's a different error we should be looking
> for?
from glTexImage2D man page:
GL_INVALID_VALUE is generated if width is less than 0 or greater than
GL_MAX_TEXTURE_SIZE.
Granted we should bail early since we know we are going to fail.
>
> In any case, bailing early seems like a fine plan, and this looks like
> the right solution
>
>> bits = malloc(overall_width * overall_height);
>> if (!bits)
>> return NULL;
>
> I note that the case where GL_OUT_OF_MEMORY is returned fails to free
> the allocated bits (oops!). Here's a patch that just moves the free
> above the error return:
Reviewed-by: Dave Airlie <airlied at redhat.com> for your hunk to move bits.
Dave.
>
> diff --git a/glamor/glamor_font.c b/glamor/glamor_font.c
> index 6753d50..3925f2a 100644
> --- a/glamor/glamor_font.c
> +++ b/glamor/glamor_font.c
> @@ -132,11 +132,12 @@ glamor_font_get(ScreenPtr screen, FontPtr font)
> glTexImage2D(GL_TEXTURE_2D, 0, GL_R8UI, overall_width, overall_height,
> 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, bits);
> glamor_priv->suppress_gl_out_of_memory_logging = false;
> - if (glGetError() == GL_OUT_OF_MEMORY)
> - return NULL;
>
> free(bits);
>
> + if (glGetError() == GL_OUT_OF_MEMORY)
> + return NULL;
> +
> glamor_font->realized = TRUE;
>
> return glamor_font;
>
>
> --
> -keith
More information about the xorg-devel
mailing list