diff options
author | Marek Olšák <[email protected]> | 2018-08-08 15:17:26 -0400 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2018-08-23 16:56:17 -0400 |
commit | 80aecad0ca95c39d37a9a8003074dc9a2789bc52 (patch) | |
tree | ca92db41a55fbd13d2b5e3d53fcaf270cf472d2e | |
parent | cff290df4c09547cd2cb3b129ec59bdebdadba90 (diff) |
st/mesa: fix up uniform limits to be able to expose large UBOs
Tested-by: Dieter Nützel <[email protected]>
-rw-r--r-- | src/mesa/state_tracker/st_extensions.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 9c912b2df75..0705f25e007 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -154,6 +154,11 @@ void st_init_limits(struct pipe_screen *screen, c->MaxUniformBlockSize = screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE); + /* GL45-CTS.enhanced_layouts.ssb_member_invalid_offset_alignment fails if + * this is larger than INT_MAX - 100. Use a nicely aligned limit. + */ + c->MaxUniformBlockSize = MIN2(c->MaxUniformBlockSize, INT_MAX - 127); + if (c->MaxUniformBlockSize < 16384) { can_ubo = FALSE; } @@ -210,17 +215,20 @@ void st_init_limits(struct pipe_screen *screen, screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEMPS); pc->MaxAddressRegs = pc->MaxNativeAddressRegs = sh == PIPE_SHADER_VERTEX ? 1 : 0; - pc->MaxParameters = - pc->MaxNativeParameters = + + pc->MaxUniformComponents = screen->get_shader_param(screen, sh, - PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE) / sizeof(float[4]); + PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE) / 4; + pc->MaxUniformComponents = MIN2(pc->MaxUniformComponents, + MAX_UNIFORMS * 4); + + pc->MaxParameters = + pc->MaxNativeParameters = pc->MaxUniformComponents / 4; pc->MaxInputComponents = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INPUTS) * 4; pc->MaxOutputComponents = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_OUTPUTS) * 4; - pc->MaxUniformComponents = - 4 * MIN2(pc->MaxNativeParameters, MAX_UNIFORMS); pc->MaxUniformBlocks = screen->get_shader_param(screen, sh, @@ -229,9 +237,9 @@ void st_init_limits(struct pipe_screen *screen, pc->MaxUniformBlocks -= 1; /* The first one is for ordinary uniforms. */ pc->MaxUniformBlocks = _min(pc->MaxUniformBlocks, MAX_UNIFORM_BUFFERS); - pc->MaxCombinedUniformComponents = (pc->MaxUniformComponents + - c->MaxUniformBlockSize / 4 * - pc->MaxUniformBlocks); + pc->MaxCombinedUniformComponents = + pc->MaxUniformComponents + + (uint64_t)c->MaxUniformBlockSize / 4 * pc->MaxUniformBlocks; temp = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS); if (temp) { @@ -310,6 +318,13 @@ void st_init_limits(struct pipe_screen *screen, options->LowerBufferInterfaceBlocks = true; } + c->MaxUserAssignableUniformLocations = + c->Program[MESA_SHADER_VERTEX].MaxUniformComponents + + c->Program[MESA_SHADER_TESS_CTRL].MaxUniformComponents + + c->Program[MESA_SHADER_TESS_EVAL].MaxUniformComponents + + c->Program[MESA_SHADER_GEOMETRY].MaxUniformComponents + + c->Program[MESA_SHADER_FRAGMENT].MaxUniformComponents; + c->GLSLOptimizeConservatively = screen->get_param(screen, PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY); c->LowerTessLevel = true; |