mesa: declare UniformBufferBindings as an array with a static size
Some Gallium drivers were crashing, because the array was not large enough. v2: clamp the per-shader maximum in st/mesa, then sum them all up NOTE: This is a candidate for the stable branches.
This commit is contained in:
@@ -619,13 +619,10 @@ _mesa_init_buffer_objects( struct gl_context *ctx )
|
|||||||
_mesa_reference_buffer_object(ctx, &ctx->CopyWriteBuffer,
|
_mesa_reference_buffer_object(ctx, &ctx->CopyWriteBuffer,
|
||||||
ctx->Shared->NullBufferObj);
|
ctx->Shared->NullBufferObj);
|
||||||
|
|
||||||
ctx->UniformBufferBindings = calloc(ctx->Const.MaxUniformBufferBindings,
|
|
||||||
sizeof(*ctx->UniformBufferBindings));
|
|
||||||
|
|
||||||
_mesa_reference_buffer_object(ctx, &ctx->UniformBuffer,
|
_mesa_reference_buffer_object(ctx, &ctx->UniformBuffer,
|
||||||
ctx->Shared->NullBufferObj);
|
ctx->Shared->NullBufferObj);
|
||||||
|
|
||||||
for (i = 0; i < ctx->Const.MaxUniformBufferBindings; i++) {
|
for (i = 0; i < MAX_COMBINED_UNIFORM_BUFFERS; i++) {
|
||||||
_mesa_reference_buffer_object(ctx,
|
_mesa_reference_buffer_object(ctx,
|
||||||
&ctx->UniformBufferBindings[i].BufferObject,
|
&ctx->UniformBufferBindings[i].BufferObject,
|
||||||
ctx->Shared->NullBufferObj);
|
ctx->Shared->NullBufferObj);
|
||||||
@@ -647,14 +644,11 @@ _mesa_free_buffer_objects( struct gl_context *ctx )
|
|||||||
|
|
||||||
_mesa_reference_buffer_object(ctx, &ctx->UniformBuffer, NULL);
|
_mesa_reference_buffer_object(ctx, &ctx->UniformBuffer, NULL);
|
||||||
|
|
||||||
for (i = 0; i < ctx->Const.MaxUniformBufferBindings; i++) {
|
for (i = 0; i < MAX_COMBINED_UNIFORM_BUFFERS; i++) {
|
||||||
_mesa_reference_buffer_object(ctx,
|
_mesa_reference_buffer_object(ctx,
|
||||||
&ctx->UniformBufferBindings[i].BufferObject,
|
&ctx->UniformBufferBindings[i].BufferObject,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(ctx->UniformBufferBindings);
|
|
||||||
ctx->UniformBufferBindings = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
@@ -168,6 +168,9 @@
|
|||||||
/*@{*/
|
/*@{*/
|
||||||
#define MAX_PROGRAM_LOCAL_PARAMS 4096
|
#define MAX_PROGRAM_LOCAL_PARAMS 4096
|
||||||
#define MAX_UNIFORMS 4096
|
#define MAX_UNIFORMS 4096
|
||||||
|
#define MAX_UNIFORM_BUFFERS 15 /* + 1 default uniform buffer */
|
||||||
|
/* 6 is for vertex, hull, domain, geometry, fragment, and compute shader. */
|
||||||
|
#define MAX_COMBINED_UNIFORM_BUFFERS (MAX_UNIFORM_BUFFERS * 6)
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -3544,7 +3544,8 @@ struct gl_context
|
|||||||
* associated with uniform blocks by glUniformBlockBinding()'s state in the
|
* associated with uniform blocks by glUniformBlockBinding()'s state in the
|
||||||
* shader program.
|
* shader program.
|
||||||
*/
|
*/
|
||||||
struct gl_uniform_buffer_binding *UniformBufferBindings;
|
struct gl_uniform_buffer_binding
|
||||||
|
UniformBufferBindings[MAX_COMBINED_UNIFORM_BUFFERS];
|
||||||
|
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
|
@@ -197,6 +197,7 @@ void st_init_limits(struct st_context *st)
|
|||||||
screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONST_BUFFERS);
|
screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONST_BUFFERS);
|
||||||
if (pc->MaxUniformBlocks)
|
if (pc->MaxUniformBlocks)
|
||||||
pc->MaxUniformBlocks -= 1; /* The first one is for ordinary uniforms. */
|
pc->MaxUniformBlocks -= 1; /* The first one is for ordinary uniforms. */
|
||||||
|
pc->MaxUniformBlocks = _min(pc->MaxUniformBlocks, MAX_UNIFORM_BUFFERS);
|
||||||
|
|
||||||
pc->MaxCombinedUniformComponents = (pc->MaxUniformComponents +
|
pc->MaxCombinedUniformComponents = (pc->MaxUniformComponents +
|
||||||
c->MaxUniformBlockSize / 4 *
|
c->MaxUniformBlockSize / 4 *
|
||||||
@@ -279,15 +280,11 @@ void st_init_limits(struct st_context *st)
|
|||||||
st->ctx->Extensions.ARB_uniform_buffer_object = GL_TRUE;
|
st->ctx->Extensions.ARB_uniform_buffer_object = GL_TRUE;
|
||||||
c->UniformBufferOffsetAlignment =
|
c->UniformBufferOffsetAlignment =
|
||||||
screen->get_param(screen, PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT);
|
screen->get_param(screen, PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT);
|
||||||
/* FIXME: _mesa_init_buffer_objects() already has been, and
|
|
||||||
* ctx->UniformBufferBindings allocated, so unfortunately we can't just
|
|
||||||
* change MaxUniformBufferBindings a posteriori. */
|
|
||||||
#if 0
|
|
||||||
c->MaxCombinedUniformBlocks = c->MaxUniformBufferBindings =
|
c->MaxCombinedUniformBlocks = c->MaxUniformBufferBindings =
|
||||||
c->VertexProgram.MaxUniformBlocks +
|
c->VertexProgram.MaxUniformBlocks +
|
||||||
c->GeometryProgram.MaxUniformBlocks +
|
c->GeometryProgram.MaxUniformBlocks +
|
||||||
c->FragmentProgram.MaxUniformBlocks;
|
c->FragmentProgram.MaxUniformBlocks;
|
||||||
#endif
|
assert(c->MaxCombinedUniformBlocks <= MAX_COMBINED_UNIFORM_BUFFERS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user