Specialize vertex attributes on dst_sel (#2580)

* Specialize vertex attributes on dst_sel

* compare vs attrib specs by default, ignore NumberFmt when vertex input dynamic state is supported

* specialize data_format when attribute uses step rates

* use num_components in data fmt instead of fmt itself
This commit is contained in:
baggins183 2025-03-02 19:17:11 -08:00 committed by GitHub
parent 951128389d
commit c59d5eef45
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -13,7 +13,9 @@
namespace Shader { namespace Shader {
struct VsAttribSpecialization { struct VsAttribSpecialization {
s32 num_components{};
AmdGpu::NumberClass num_class{}; AmdGpu::NumberClass num_class{};
AmdGpu::CompMapping dst_select{};
auto operator<=>(const VsAttribSpecialization&) const = default; auto operator<=>(const VsAttribSpecialization&) const = default;
}; };
@ -89,12 +91,17 @@ struct StageSpecialization {
Backend::Bindings start_) Backend::Bindings start_)
: info{&info_}, runtime_info{runtime_info_}, start{start_} { : info{&info_}, runtime_info{runtime_info_}, start{start_} {
fetch_shader_data = Gcn::ParseFetchShader(info_); fetch_shader_data = Gcn::ParseFetchShader(info_);
if (info_.stage == Stage::Vertex && fetch_shader_data && if (info_.stage == Stage::Vertex && fetch_shader_data) {
!profile_.support_legacy_vertex_attributes) {
// Specialize shader on VS input number types to follow spec. // Specialize shader on VS input number types to follow spec.
ForEachSharp(vs_attribs, fetch_shader_data->attributes, ForEachSharp(vs_attribs, fetch_shader_data->attributes,
[](auto& spec, const auto& desc, AmdGpu::Buffer sharp) { [&profile_](auto& spec, const auto& desc, AmdGpu::Buffer sharp) {
spec.num_class = AmdGpu::GetNumberClass(sharp.GetNumberFmt()); spec.num_components = desc.UsesStepRates()
? AmdGpu::NumComponents(sharp.GetDataFmt())
: 0;
spec.num_class = profile_.support_legacy_vertex_attributes
? AmdGpu::NumberClass{}
: AmdGpu::GetNumberClass(sharp.GetNumberFmt());
spec.dst_select = sharp.DstSelect();
}); });
} }
u32 binding{}; u32 binding{};