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)