Specialize sampling routine for immutable sampler data Treat floating-point sampler values as state that is baked into the sampling routine, instead of reading it from memory. This offers more opportunities for optimizing the generated code. Bug: b/151957215 Change-Id: If41455dece60307a54d97463e9ad26ed052f2588 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/42588 Tested-by: Nicolas Capens <nicolascapens@google.com> Reviewed-by: Antonio Maiorano <amaiorano@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Device/Sampler.hpp b/src/Device/Sampler.hpp index a377ea0..3fb3607 100644 --- a/src/Device/Sampler.hpp +++ b/src/Device/Sampler.hpp
@@ -112,6 +112,11 @@ VkSamplerYcbcrModelConversion ycbcrModel; bool studioSwing; // Narrow range bool swappedChroma; // Cb/Cr components in reverse order + + float mipLodBias = 0.0f; + float maxAnisotropy = 0.0f; + float minLod = 0.0f; + float maxLod = 0.0f; }; } // namespace sw
diff --git a/src/Pipeline/SamplerCore.cpp b/src/Pipeline/SamplerCore.cpp index 811865a..c1031e1 100644 --- a/src/Pipeline/SamplerCore.cpp +++ b/src/Pipeline/SamplerCore.cpp
@@ -96,7 +96,7 @@ computeLod3D(texture, sampler, lod, uuuu, vvvv, wwww, dsx, dsy, function); } - Float bias = *Pointer<Float>(sampler + OFFSET(vk::Sampler, mipLodBias)); + Float bias = state.mipLodBias; if(function == Bias) { @@ -110,7 +110,7 @@ { // Vulkan 1.1: "The absolute value of mipLodBias must be less than or equal to VkPhysicalDeviceLimits::maxSamplerLodBias" // Hence no explicit clamping to maxSamplerLodBias is required in this case. - lod = lodOrBias + *Pointer<Float>(sampler + OFFSET(vk::Sampler, mipLodBias)); + lod = lodOrBias + state.mipLodBias; } else if(function == Fetch) { @@ -131,8 +131,8 @@ c.y = Float4(lod); // Unclamped LOD. } - lod = Max(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, minLod))); - lod = Min(lod, *Pointer<Float>(sampler + OFFSET(vk::Sampler, maxLod))); + lod = Max(lod, state.minLod); + lod = Min(lod, state.maxLod); if(function == Query) { @@ -1198,7 +1198,7 @@ vDelta = As<Float4>((As<Int4>(dvdx) & mask) | ((As<Int4>(dvdy) & ~mask))); anisotropy = lod * Rcp_pp(det); - anisotropy = Min(anisotropy, *Pointer<Float>(sampler + OFFSET(vk::Sampler, maxAnisotropy))); + anisotropy = Min(anisotropy, state.maxAnisotropy); lod *= Rcp_pp(anisotropy * anisotropy); }
diff --git a/src/Pipeline/SpirvShaderSampling.cpp b/src/Pipeline/SpirvShaderSampling.cpp index e2cb5b9..1cd77c3 100644 --- a/src/Pipeline/SpirvShaderSampling.cpp +++ b/src/Pipeline/SpirvShaderSampling.cpp
@@ -90,6 +90,11 @@ samplerState.studioSwing = (sampler->ycbcrConversion->ycbcrRange == VK_SAMPLER_YCBCR_RANGE_ITU_NARROW); samplerState.swappedChroma = (sampler->ycbcrConversion->components.r != VK_COMPONENT_SWIZZLE_R); } + + samplerState.mipLodBias = sampler->mipLodBias; + samplerState.maxAnisotropy = sampler->maxAnisotropy; + samplerState.minLod = sampler->minLod; + samplerState.maxLod = sampler->maxLod; } routine = emitSamplerRoutine(instruction, samplerState);