fix bug for querying sample positions on D3D
BUG=angleproject:2290
TEST=dEQP-GLES31.functional.texture.multisample.samples_*.sample_position
TEST=TextureMultisampleTestES31.CheckSamplePositions*
Change-Id: If8b74c16d5c104215456e35b8922279be972cee3
Reviewed-on: https://chromium-review.googlesource.com/844062
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/tests/gl_tests/TextureMultisampleTest.cpp b/src/tests/gl_tests/TextureMultisampleTest.cpp
index 903b97d..546bbbf 100644
--- a/src/tests/gl_tests/TextureMultisampleTest.cpp
+++ b/src/tests/gl_tests/TextureMultisampleTest.cpp
@@ -13,6 +13,19 @@
namespace
{
+// Sample positions of d3d standard pattern. Some of the sample positions might not the same as
+// opengl.
+using SamplePositionsArray = std::array<float, 32>;
+static constexpr std::array<SamplePositionsArray, 5> kSamplePositions = {
+ {{{0.5f, 0.5f}},
+ {{0.75f, 0.75f, 0.25f, 0.25f}},
+ {{0.375f, 0.125f, 0.875f, 0.375f, 0.125f, 0.625f, 0.625f, 0.875f}},
+ {{0.5625f, 0.3125f, 0.4375f, 0.6875f, 0.8125f, 0.5625f, 0.3125f, 0.1875f, 0.1875f, 0.8125f,
+ 0.0625f, 0.4375f, 0.6875f, 0.9375f, 0.9375f, 0.0625f}},
+ {{0.5625f, 0.5625f, 0.4375f, 0.3125f, 0.3125f, 0.625f, 0.75f, 0.4375f,
+ 0.1875f, 0.375f, 0.625f, 0.8125f, 0.8125f, 0.6875f, 0.6875f, 0.1875f,
+ 0.375f, 0.875f, 0.5f, 0.0625f, 0.25f, 0.125f, 0.125f, 0.75f,
+ 0.0f, 0.5f, 0.9375f, 0.25f, 0.875f, 0.9375f, 0.0625f, 0.0f}}}};
class TextureMultisampleTest : public ANGLETest
{
@@ -170,6 +183,40 @@
EXPECT_NE(std::numeric_limits<GLint>::max(), maxDepthTextureSamples);
}
+// The value of sample position should be equal to standard pattern on D3D.
+TEST_P(TextureMultisampleTestES31, CheckSamplePositions)
+{
+ ANGLE_SKIP_TEST_IF(!IsD3D11());
+
+ GLsizei maxSamples = 0;
+ glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
+
+ GLfloat samplePosition[2];
+
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebuffer);
+
+ for (int sampleCount = 1; sampleCount <= maxSamples; sampleCount++)
+ {
+ GLTexture texture;
+ size_t indexKey = static_cast<size_t>(ceil(log2(sampleCount)));
+ glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
+ glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, sampleCount, GL_RGBA8, 1, 1, GL_TRUE);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE,
+ texture, 0);
+ EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
+ ASSERT_GL_NO_ERROR();
+
+ for (int sampleIndex = 0; sampleIndex < sampleCount; sampleIndex++)
+ {
+ glGetMultisamplefv(GL_SAMPLE_POSITION, sampleIndex, samplePosition);
+ EXPECT_EQ(samplePosition[0], kSamplePositions[indexKey][2 * sampleIndex]);
+ EXPECT_EQ(samplePosition[1], kSamplePositions[indexKey][2 * sampleIndex + 1]);
+ }
+ }
+
+ ASSERT_GL_NO_ERROR();
+}
+
ANGLE_INSTANTIATE_TEST(TextureMultisampleTest,
ES31_D3D11(),
ES3_OPENGL(),