mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 11:30:21 +01:00
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>
This commit is contained in:
parent
d95fe8a25e
commit
4e3e7f35f7
1 changed files with 28 additions and 22 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue