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);