mesa/st: add ARB_uniform_buffer_object support (v2)
this adds UBO support to the state tracker, it works with softpipe as-is. It uses UARL + CONST[x][ADDR[0].x] type constructs. v2: don't disable UBOs if geom shaders don't exist (me) rename upload to bind (calim) fix 12 -> 13 comparison as comment (calim + brianp) fix signed->unsigned (Brian) remove assert (Brian) Reviewed-by: Brian Paul <brianp@vmware.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
@@ -70,6 +70,8 @@ void st_init_limits(struct st_context *st)
|
||||
struct pipe_screen *screen = st->pipe->screen;
|
||||
struct gl_constants *c = &st->ctx->Const;
|
||||
gl_shader_type sh;
|
||||
boolean can_ubo = TRUE;
|
||||
int max_const_buffers;
|
||||
|
||||
c->MaxTextureLevels
|
||||
= _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),
|
||||
@@ -218,6 +220,17 @@ void st_init_limits(struct st_context *st)
|
||||
options->EmitNoIndirectUniform = !screen->get_shader_param(screen, sh,
|
||||
PIPE_SHADER_CAP_INDIRECT_CONST_ADDR);
|
||||
|
||||
if (pc->MaxNativeInstructions) {
|
||||
if (options->EmitNoIndirectUniform)
|
||||
can_ubo = FALSE;
|
||||
|
||||
max_const_buffers = screen->get_shader_param(screen, sh,
|
||||
PIPE_SHADER_CAP_MAX_CONST_BUFFERS);
|
||||
/* we need 13 buffers - 1 constant, 12 UBO */
|
||||
if (max_const_buffers < 13)
|
||||
can_ubo = FALSE;
|
||||
}
|
||||
|
||||
if (options->EmitNoLoops)
|
||||
options->MaxUnrollIterations = MIN2(screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INSTRUCTIONS), 65536);
|
||||
else
|
||||
@@ -251,6 +264,9 @@ void st_init_limits(struct st_context *st)
|
||||
|
||||
c->GLSLSkipStrictMaxVaryingLimitCheck =
|
||||
screen->get_param(screen, PIPE_CAP_TGSI_CAN_COMPACT_VARYINGS);
|
||||
|
||||
if (can_ubo)
|
||||
st->ctx->Extensions.ARB_uniform_buffer_object = GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user