[Mesa-dev] [PATCH] i965: Advertise 65536 for GL_MAX_UNIFORM_BLOCK_SIZE.

Tapani Pälli tapani.palli at intel.com
Tue Sep 8 23:19:45 PDT 2015


On 09/09/2015 04:04 AM, Kenneth Graunke wrote:
> Our old value of 16384 is the minimum value.  DirectX apparently
> requires 65536 at a minimum; that's also what nVidia and the Intel
> Windows driver advertise.  AMD advertises MAX_INT.
>
> Ilia Mirkin noticed that "Shadow Warrior" uses UBOs larger than 16k
> on Nouveau, which advertises 65536 bytes for this limit.  Traces
> captured on Nouveau don't work on i965 because our lower limit causes
> the GLSL linker to reject the captured shaders.  While this isn't
> important in and of itself, it does suggest that raising the limit
> would be beneficial.

There's also one unreleased Linux game that asserts for this.

Reviewed-by: Tapani Pälli <tapani.palli at intel.com>

> We can read linear buffers up to 2^27 bytes in size, so raising this
> should be safe; we could probably even go larger.  For now, matching
> nVidia and Intel/Windows seems like a good plan.
>
> We have to reinitialize MaxCombinedUniformComponents as core Mesa will
> have set it based on a stale value for MaxUniformBlockSize.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>   src/mesa/drivers/dri/i965/brw_context.c | 9 +++++++++
>   1 file changed, 9 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
> index 907b2a0..7c1c133 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.c
> +++ b/src/mesa/drivers/dri/i965/brw_context.c
> @@ -323,6 +323,15 @@ brw_initialize_context_constants(struct brw_context *brw)
>   
>      ctx->Const.StripTextureBorder = true;
>   
> +   ctx->Const.MaxUniformBlockSize = 65536;
> +   for (int i = 0; i < MESA_SHADER_STAGES; i++) {
> +      struct gl_program_constants *prog = &ctx->Const.Program[i];
> +      prog->MaxUniformBlocks = 12;
> +      prog->MaxCombinedUniformComponents =
> +         prog->MaxUniformComponents +
> +         ctx->Const.MaxUniformBlockSize / 4 * prog->MaxUniformBlocks;
> +   }
> +
>      ctx->Const.MaxDualSourceDrawBuffers = 1;
>      ctx->Const.MaxDrawBuffers = BRW_MAX_DRAW_BUFFERS;
>      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = max_samplers;



More information about the mesa-dev mailing list