Merge pull request #3693 from ReinUsesLisp/clean-samplers

shader/texture: Support multiple unknown sampler properties
This commit is contained in:
bunnei
2020-05-02 00:45:41 -04:00
committed by GitHub
13 changed files with 260 additions and 337 deletions

View File

@ -32,11 +32,11 @@ void DeduceTextureHandlerSize(VideoCore::GuestDriverProfile& gpu_driver,
u32 count{};
std::vector<u32> bound_offsets;
for (const auto& sampler : used_samplers) {
if (sampler.IsBindless()) {
if (sampler.is_bindless) {
continue;
}
++count;
bound_offsets.emplace_back(sampler.GetOffset());
bound_offsets.emplace_back(sampler.offset);
}
if (count > 1) {
gpu_driver.DeduceTextureHandlerSize(std::move(bound_offsets));
@ -46,14 +46,14 @@ void DeduceTextureHandlerSize(VideoCore::GuestDriverProfile& gpu_driver,
std::optional<u32> TryDeduceSamplerSize(const Sampler& sampler_to_deduce,
VideoCore::GuestDriverProfile& gpu_driver,
const std::list<Sampler>& used_samplers) {
const u32 base_offset = sampler_to_deduce.GetOffset();
const u32 base_offset = sampler_to_deduce.offset;
u32 max_offset{std::numeric_limits<u32>::max()};
for (const auto& sampler : used_samplers) {
if (sampler.IsBindless()) {
if (sampler.is_bindless) {
continue;
}
if (sampler.GetOffset() > base_offset) {
max_offset = std::min(sampler.GetOffset(), max_offset);
if (sampler.offset > base_offset) {
max_offset = std::min(sampler.offset, max_offset);
}
}
if (max_offset == std::numeric_limits<u32>::max()) {
@ -353,14 +353,14 @@ void ShaderIR::PostDecode() {
return;
}
for (auto& sampler : used_samplers) {
if (!sampler.IsIndexed()) {
if (!sampler.is_indexed) {
continue;
}
if (const auto size = TryDeduceSamplerSize(sampler, gpu_driver, used_samplers)) {
sampler.SetSize(*size);
sampler.size = *size;
} else {
LOG_CRITICAL(HW_GPU, "Failed to deduce size of indexed sampler");
sampler.SetSize(1);
sampler.size = 1;
}
}
}