From bcfac68ce91a2c47391ff322786ae45976253dfd Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Tue, 1 Feb 2022 09:30:11 -0800 Subject: [PATCH] d3d12: Update max input, output, and varying caps The simple-varyings piglit test attempts to use GL_MAX_VARYING_FLOATS varyings, PLUS one additional vector for position (which is not used as input to the PS). "Reserve" that additional position vector by removing it from the max varyings and max PS inputs. Reviewed-by: Bill Kristiansen Reviewed-By: Sil Vilerino Part-of: --- src/gallium/drivers/d3d12/d3d12_screen.cpp | 31 +++++++++++++++------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp b/src/gallium/drivers/d3d12/d3d12_screen.cpp index e1e9d719c4e..aeffeee5435 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp @@ -295,7 +295,8 @@ d3d12_get_param(struct pipe_screen *pscreen, enum pipe_cap param) return D3D12_REQ_GS_INVOCATION_32BIT_OUTPUT_COMPONENT_LIMIT; case PIPE_CAP_MAX_VARYINGS: - return D3D12_PS_INPUT_REGISTER_COUNT; + /* Subtract one so that implicit position can be added */ + return D3D12_PS_INPUT_REGISTER_COUNT - 1; case PIPE_CAP_NIR_COMPACT_ARRAYS: return 1; @@ -389,18 +390,28 @@ d3d12_get_shader_param(struct pipe_screen *pscreen, return 0; case PIPE_SHADER_CAP_MAX_INPUTS: - return screen->max_feature_level >= D3D_FEATURE_LEVEL_10_1 ? 32 : 16; + switch (shader) { + case PIPE_SHADER_VERTEX: return D3D12_VS_INPUT_REGISTER_COUNT; + case PIPE_SHADER_FRAGMENT: return D3D12_PS_INPUT_REGISTER_COUNT; + case PIPE_SHADER_GEOMETRY: return D3D12_GS_INPUT_REGISTER_COUNT; + case PIPE_SHADER_TESS_CTRL: return D3D12_HS_CONTROL_POINT_PHASE_INPUT_REGISTER_COUNT; + case PIPE_SHADER_TESS_EVAL: return D3D12_DS_INPUT_CONTROL_POINT_REGISTER_COUNT; + case PIPE_SHADER_COMPUTE: return 0; + default: unreachable("Unexpected shader"); + } + break; case PIPE_SHADER_CAP_MAX_OUTPUTS: - if (shader == PIPE_SHADER_FRAGMENT) { - /* same as max MRTs (not sure if this is correct) */ - if (screen->max_feature_level >= D3D_FEATURE_LEVEL_10_0) - return 8; - else if (screen->max_feature_level == D3D_FEATURE_LEVEL_9_3) - return 4; - return 1; + switch (shader) { + case PIPE_SHADER_VERTEX: return D3D12_VS_OUTPUT_REGISTER_COUNT; + case PIPE_SHADER_FRAGMENT: return D3D12_PS_OUTPUT_REGISTER_COUNT; + case PIPE_SHADER_GEOMETRY: return D3D12_GS_OUTPUT_REGISTER_COUNT; + case PIPE_SHADER_TESS_CTRL: return D3D12_HS_CONTROL_POINT_PHASE_OUTPUT_REGISTER_COUNT; + case PIPE_SHADER_TESS_EVAL: return D3D12_DS_OUTPUT_REGISTER_COUNT; + case PIPE_SHADER_COMPUTE: return 0; + default: unreachable("Unexpected shader"); } - return screen->max_feature_level >= D3D_FEATURE_LEVEL_10_1 ? 32 : 16; + break; case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: if (screen->opts.ResourceBindingTier == D3D12_RESOURCE_BINDING_TIER_1)