diff options
author | Mike Blumenkrantz <michael.blumenkrantz@gmail.com> | 2021-01-04 15:28:13 -0500 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2021-01-08 14:44:31 +0000 |
commit | 4e3e7f35f7eb4b923ea10e3208a3c4840757b855 (patch) | |
tree | 3791fce8ce9705d193dc32e0e7c760cb3c260e70 | |
parent | d95fe8a25e7a89bd78c4331a652c79057b7f626f (diff) |
zink: clamp shader input/output max values
some vulkan drivers (e.g., amdvlk) advertise absolutely huge values here,
resulting in bitmask overflows everywhere since gallium assumes a max of
32 for vertex inputs and nir uses 64bit types for others
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8318>
-rw-r--r-- | src/gallium/drivers/zink/zink_screen.c | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 27385e39c01..89b4e61fc2e 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -429,47 +429,53 @@ zink_get_shader_param(struct pipe_screen *pscreen, return INT_MAX; return 0; - case PIPE_SHADER_CAP_MAX_INPUTS: + case PIPE_SHADER_CAP_MAX_INPUTS: { + uint32_t max = 0; switch (shader) { case PIPE_SHADER_VERTEX: - return MIN2(screen->info.props.limits.maxVertexInputAttributes, - PIPE_MAX_SHADER_INPUTS); + max = MIN2(screen->info.props.limits.maxVertexInputAttributes, PIPE_MAX_ATTRIBS); + break; case PIPE_SHADER_TESS_CTRL: - return MIN2(screen->info.props.limits.maxTessellationControlPerVertexInputComponents / 4, - PIPE_MAX_SHADER_INPUTS); + max = screen->info.props.limits.maxTessellationControlPerVertexInputComponents / 4; + break; case PIPE_SHADER_TESS_EVAL: - return MIN2(screen->info.props.limits.maxTessellationEvaluationInputComponents / 4, - PIPE_MAX_SHADER_INPUTS); + max = screen->info.props.limits.maxTessellationEvaluationInputComponents / 4; + break; case PIPE_SHADER_GEOMETRY: - return MIN2(screen->info.props.limits.maxGeometryInputComponents, - PIPE_MAX_SHADER_INPUTS); + max = screen->info.props.limits.maxGeometryInputComponents; + break; case PIPE_SHADER_FRAGMENT: - return MIN2(screen->info.props.limits.maxFragmentInputComponents / 4, - PIPE_MAX_SHADER_INPUTS); + max = screen->info.props.limits.maxFragmentInputComponents / 4; + break; default: return 0; /* unsupported stage */ } + return MIN2(max, 64); // prevent overflowing struct shader_info::inputs_read + } - case PIPE_SHADER_CAP_MAX_OUTPUTS: + case PIPE_SHADER_CAP_MAX_OUTPUTS: { + uint32_t max = 0; switch (shader) { case PIPE_SHADER_VERTEX: - return MIN2(screen->info.props.limits.maxVertexOutputComponents / 4, - PIPE_MAX_SHADER_OUTPUTS); + max = screen->info.props.limits.maxVertexOutputComponents / 4; + break; case PIPE_SHADER_TESS_CTRL: - return MIN2(screen->info.props.limits.maxTessellationControlPerVertexOutputComponents / 4, - PIPE_MAX_SHADER_OUTPUTS); + max = screen->info.props.limits.maxTessellationControlPerVertexOutputComponents / 4; + break; case PIPE_SHADER_TESS_EVAL: - return MIN2(screen->info.props.limits.maxTessellationEvaluationOutputComponents / 4, - PIPE_MAX_SHADER_OUTPUTS); + max = screen->info.props.limits.maxTessellationEvaluationOutputComponents / 4; + break; case PIPE_SHADER_GEOMETRY: - return MIN2(screen->info.props.limits.maxGeometryOutputComponents / 4, - PIPE_MAX_SHADER_OUTPUTS); + max = screen->info.props.limits.maxGeometryOutputComponents / 4; + break; case PIPE_SHADER_FRAGMENT: - return MIN2(screen->info.props.limits.maxColorAttachments, - PIPE_MAX_SHADER_OUTPUTS); + max = screen->info.props.limits.maxColorAttachments; + break; default: return 0; /* unsupported stage */ } + return MIN2(max, 64); // prevent overflowing struct shader_info::outputs_read/written + } case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: switch (shader) { |