Support for the largePoints feature in Vulkan
Bug: b/149537975
Tests: dEQP-VK.*point*
Change-Id: I22ee0c0ebc4e7b414e055e2b87010004dfc8741a
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/41948
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Marc-Antoine Desroches <madesroches@google.com>
diff --git a/src/Pipeline/PixelProgram.cpp b/src/Pipeline/PixelProgram.cpp
index fff8b93..b92d48e 100644
--- a/src/Pipeline/PixelProgram.cpp
+++ b/src/Pipeline/PixelProgram.cpp
@@ -66,10 +66,7 @@
routine.fragCoord[1] = SIMD::Float(Float(y)) + SIMD::Float(0.5f, 0.5f, 1.5f, 1.5f);
routine.fragCoord[2] = z[0]; // sample 0
routine.fragCoord[3] = w;
- routine.pointCoord[0] = SIMD::Float(0.5f) +
- SIMD::Float(Float(x) - (*Pointer<Float>(primitive + OFFSET(Primitive, pointCoordX))));
- routine.pointCoord[1] = SIMD::Float(0.5f) +
- SIMD::Float(Float(y) - (*Pointer<Float>(primitive + OFFSET(Primitive, pointCoordY))));
+
routine.invocationsPerSubgroup = SIMD::Width;
routine.helperInvocation = ~maskAny(cMask);
routine.windowSpacePosition[0] = x + SIMD::Int(0, 1, 0, 1);
@@ -91,10 +88,10 @@
routine.setInputBuiltin(spirvShader, spv::BuiltInPointCoord, [&](const SpirvShader::BuiltinMapping &builtin, Array<SIMD::Float> &value) {
assert(builtin.SizeInComponents == 2);
- value[builtin.FirstComponent + 0] = SIMD::Float(0.5f, 1.5f, 0.5f, 1.5f) +
- SIMD::Float(Float(x) - (*Pointer<Float>(primitive + OFFSET(Primitive, pointCoordX))));
- value[builtin.FirstComponent + 1] = SIMD::Float(0.5f, 0.5f, 1.5f, 1.5f) +
- SIMD::Float(Float(y) - (*Pointer<Float>(primitive + OFFSET(Primitive, pointCoordY))));
+ Float pointSizeFactor = *Pointer<Float>(primitive + OFFSET(Primitive, pointSizeInv));
+ value[builtin.FirstComponent + 0] = SIMD::Float(0.5f) + SIMD::Float(pointSizeFactor) * (((SIMD::Float(Float(x)) + SIMD::Float(0.f, 1.f, 0.f, 1.f)) - SIMD::Float(*Pointer<Float>(primitive + OFFSET(Primitive, pointCoordX)))));
+
+ value[builtin.FirstComponent + 1] = SIMD::Float(0.5f) + SIMD::Float(pointSizeFactor) * (((SIMD::Float(Float(y)) + SIMD::Float(0.f, 0.f, 1.f, 1.f)) - SIMD::Float(*Pointer<Float>(primitive + OFFSET(Primitive, pointCoordY)))));
});
routine.setInputBuiltin(spirvShader, spv::BuiltInSubgroupSize, [&](const SpirvShader::BuiltinMapping &builtin, Array<SIMD::Float> &value) {