summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>2021-01-04 15:28:13 -0500
committerMarge Bot <eric+marge@anholt.net>2021-01-08 14:44:31 +0000
commit4e3e7f35f7eb4b923ea10e3208a3c4840757b855 (patch)
tree3791fce8ce9705d193dc32e0e7c760cb3c260e70
parentd95fe8a25e7a89bd78c4331a652c79057b7f626f (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.c50
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) {