| Index: gpu/command_buffer/tests/gl_chromium_path_rendering_unittest.cc
|
| diff --git a/gpu/command_buffer/tests/gl_chromium_path_rendering_unittest.cc b/gpu/command_buffer/tests/gl_chromium_path_rendering_unittest.cc
|
| index 57f5dd02ea7993eeb64602c590762d63426d4a23..d634449ab35fcbfa269771323702cec78604543e 100644
|
| --- a/gpu/command_buffer/tests/gl_chromium_path_rendering_unittest.cc
|
| +++ b/gpu/command_buffer/tests/gl_chromium_path_rendering_unittest.cc
|
| @@ -20,7 +20,7 @@ namespace gpu {
|
|
|
| class CHROMIUMPathRenderingTest : public testing::Test {
|
| public:
|
| - static const GLsizei kResolution = 100;
|
| + static const GLsizei kResolution = 300;
|
|
|
| protected:
|
| void SetUp() override {
|
| @@ -123,8 +123,9 @@ class CHROMIUMPathRenderingTest : public testing::Test {
|
| }
|
|
|
| void VerifyTestPatternFill(float x, float y) {
|
| - static const float kFillCoords[] = {
|
| - 55.0f, 55.0f, 50.0f, 28.0f, 66.0f, 63.0f};
|
| + SCOPED_TRACE(testing::Message() << "Verifying fill at " << x << "," << y);
|
| + static const float kFillCoords[] = {55.0f, 54.0f, 50.0f,
|
| + 28.0f, 66.0f, 63.0f};
|
| static const uint8 kBlue[] = {0, 0, 255, 255};
|
|
|
| for (size_t i = 0; i < arraysize(kFillCoords); i += 2) {
|
| @@ -136,6 +137,8 @@ class CHROMIUMPathRenderingTest : public testing::Test {
|
| }
|
|
|
| void VerifyTestPatternBg(float x, float y) {
|
| + SCOPED_TRACE(testing::Message() << "Verifying background at " << x << ","
|
| + << y);
|
| const float kBackgroundCoords[] = {80.0f, 80.0f, 20.0f, 20.0f, 90.0f, 1.0f};
|
| const uint8 kExpectedColor[] = {0, 0, 0, 0};
|
|
|
| @@ -149,6 +152,7 @@ class CHROMIUMPathRenderingTest : public testing::Test {
|
| }
|
|
|
| void VerifyTestPatternStroke(float x, float y) {
|
| + SCOPED_TRACE(testing::Message() << "Verifying stroke at " << x << "," << y);
|
| // Inside the stroke we should have green.
|
| const uint8 kGreen[] = {0, 255, 0, 255};
|
| EXPECT_TRUE(GLTestHelper::CheckPixels(x + 50, y + 53, 1, 1, 0, kGreen));
|
| @@ -525,6 +529,21 @@ TEST_F(CHROMIUMPathRenderingTest, TestPathRenderingInvalidArgs) {
|
| glStencilThenCoverFillPathCHROMIUM(path, GL_COUNT_UP_CHROMIUM, 0x7F,
|
| GL_BOUNDING_BOX_CHROMIUM + 1);
|
| EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), glGetError());
|
| + // For instanced variants, we need this to error the same way
|
| + // regardless of whether # of paths == 0 would cause an early return.
|
| + for (int path_count = 0; path_count <= 1; ++path_count) {
|
| + SCOPED_TRACE(testing::Message()
|
| + << "Invalid fillmode instanced test for path count "
|
| + << path_count);
|
| + glStencilFillPathInstancedCHROMIUM(path_count, GL_UNSIGNED_INT, &path, 0,
|
| + GL_COUNT_UP_CHROMIUM - 1, 0x7F, GL_NONE,
|
| + NULL);
|
| + EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), glGetError());
|
| + glStencilThenCoverFillPathInstancedCHROMIUM(
|
| + path_count, GL_UNSIGNED_INT, &path, 0, GL_COUNT_UP_CHROMIUM - 1, 0x7F,
|
| + GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM, GL_NONE, NULL);
|
| + EXPECT_EQ(static_cast<GLenum>(GL_INVALID_ENUM), glGetError());
|
| + }
|
|
|
| // Using mask+1 not being power of two causes INVALID_VALUE with up/down fill
|
| // mode.
|
| @@ -533,6 +552,19 @@ TEST_F(CHROMIUMPathRenderingTest, TestPathRenderingInvalidArgs) {
|
| glStencilThenCoverFillPathCHROMIUM(path, GL_COUNT_DOWN_CHROMIUM, 12,
|
| GL_BOUNDING_BOX_CHROMIUM);
|
| EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), glGetError());
|
| + for (int path_count = 0; path_count <= 1; ++path_count) {
|
| + SCOPED_TRACE(testing::Message()
|
| + << "Invalid mask instanced test for path count "
|
| + << path_count);
|
| + glStencilFillPathInstancedCHROMIUM(path_count, GL_UNSIGNED_INT, &path, 0,
|
| + GL_COUNT_UP_CHROMIUM, 0x30, GL_NONE,
|
| + NULL);
|
| + EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), glGetError());
|
| + glStencilThenCoverFillPathInstancedCHROMIUM(
|
| + path_count, GL_UNSIGNED_INT, &path, 0, GL_COUNT_DOWN_CHROMIUM, 0xFE,
|
| + GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM, GL_NONE, NULL);
|
| + EXPECT_EQ(static_cast<GLenum>(GL_INVALID_VALUE), glGetError());
|
| + }
|
|
|
| glDeletePathsCHROMIUM(path, 1);
|
| }
|
| @@ -619,4 +651,144 @@ TEST_F(CHROMIUMPathRenderingTest, TestPathRenderingThenFunctions) {
|
| VerifyTestPatternStroke(0.0f, 0.0f);
|
| }
|
|
|
| +// Tests that drawing with *Instanced functions work.
|
| +TEST_F(CHROMIUMPathRenderingTest, TestPathRenderingInstanced) {
|
| + if (!GLTestHelper::HasExtension("GL_CHROMIUM_path_rendering")) {
|
| + return;
|
| + }
|
| + static const float kBlue[] = {0.0f, 0.0f, 1.0f, 1.0f};
|
| + static const float kGreen[] = {0.0f, 1.0f, 0.0f, 1.0f};
|
| +
|
| + SetupStateForTestPattern();
|
| +
|
| + GLuint path = glGenPathsCHROMIUM(1);
|
| + SetupPathStateForTestPattern(path);
|
| +
|
| + const GLuint kPaths[] = {1, 1, 1, 1, 1};
|
| + const GLsizei kPathCount = arraysize(kPaths);
|
| + const GLfloat kShapeSize = 80.0f;
|
| + static const GLfloat kTransforms[kPathCount * 12] = {
|
| + 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
|
| + 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
|
| + 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
|
| + 0.0f, 0.0f, 1.0f, kShapeSize, 0.0f, 0.0f,
|
| + 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
|
| + 0.0f, 0.0f, 1.0f, kShapeSize * 2, 0.0f, 0.0f,
|
| + 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
|
| + 0.0f, 0.0f, 1.0f, 0.0f, kShapeSize, 0.0f,
|
| + 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
|
| + 0.0f, 0.0f, 1.0f, kShapeSize, kShapeSize, 0.0f};
|
| +
|
| + // The test pattern is the same as in the simple draw case above,
|
| + // except that the path is drawn kPathCount times with different offsets.
|
| + glPathStencilFuncCHROMIUM(GL_ALWAYS, 0, 0xFF);
|
| + glStencilStrokePathInstancedCHROMIUM(kPathCount, GL_UNSIGNED_INT, kPaths,
|
| + path - 1, 0x80, 0x80,
|
| + GL_AFFINE_3D_CHROMIUM, kTransforms);
|
| +
|
| + glPathStencilFuncCHROMIUM(GL_ALWAYS, 0, 0x7F);
|
| + glUniform4fv(color_loc_, 1, kBlue);
|
| + glStencilFillPathInstancedCHROMIUM(kPathCount, GL_UNSIGNED_INT, kPaths,
|
| + path - 1, GL_COUNT_UP_CHROMIUM, 0x7F,
|
| + GL_AFFINE_3D_CHROMIUM, kTransforms);
|
| + glStencilFunc(GL_LESS, 0, 0x7F);
|
| + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO);
|
| + glCoverFillPathInstancedCHROMIUM(kPathCount, GL_UNSIGNED_INT, kPaths,
|
| + path - 1,
|
| + GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM,
|
| + GL_AFFINE_3D_CHROMIUM, kTransforms);
|
| + glStencilFunc(GL_EQUAL, 0x80, 0x80);
|
| + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO);
|
| + glUniform4fv(color_loc_, 1, kGreen);
|
| + glCoverStrokePathInstancedCHROMIUM(kPathCount, GL_UNSIGNED_INT, kPaths,
|
| + path - 1,
|
| + GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM,
|
| + GL_AFFINE_3D_CHROMIUM, kTransforms);
|
| +
|
| + glDeletePathsCHROMIUM(path, 1);
|
| +
|
| + // Verify the image.
|
| + VerifyTestPatternFill(0.0f, 0.0f);
|
| + VerifyTestPatternBg(0.0f, 0.0f);
|
| + VerifyTestPatternStroke(0.0f, 0.0f);
|
| +
|
| + VerifyTestPatternFill(kShapeSize, 0.0f);
|
| + VerifyTestPatternBg(kShapeSize, 0.0f);
|
| + VerifyTestPatternStroke(kShapeSize, 0.0f);
|
| +
|
| + VerifyTestPatternFill(kShapeSize * 2, 0.0f);
|
| + VerifyTestPatternBg(kShapeSize * 2, 0.0f);
|
| + VerifyTestPatternStroke(kShapeSize * 2, 0.0f);
|
| +
|
| + VerifyTestPatternFill(0.0f, kShapeSize);
|
| + VerifyTestPatternBg(0.0f, kShapeSize);
|
| + VerifyTestPatternStroke(0.0f, kShapeSize);
|
| +
|
| + VerifyTestPatternFill(kShapeSize, kShapeSize);
|
| + VerifyTestPatternBg(kShapeSize, kShapeSize);
|
| + VerifyTestPatternStroke(kShapeSize, kShapeSize);
|
| +}
|
| +
|
| +TEST_F(CHROMIUMPathRenderingTest, TestPathRenderingThenFunctionsInstanced) {
|
| + if (!GLTestHelper::HasExtension("GL_CHROMIUM_path_rendering")) {
|
| + return;
|
| + }
|
| + static const float kBlue[] = {0.0f, 0.0f, 1.0f, 1.0f};
|
| + static const float kGreen[] = {0.0f, 1.0f, 0.0f, 1.0f};
|
| +
|
| + SetupStateForTestPattern();
|
| +
|
| + GLuint path = glGenPathsCHROMIUM(1);
|
| + SetupPathStateForTestPattern(path);
|
| +
|
| + const GLuint kPaths[] = {1, 1, 1, 1, 1};
|
| + const GLsizei kPathCount = arraysize(kPaths);
|
| + const GLfloat kShapeSize = 80.0f;
|
| + static const GLfloat kTransforms[] = {
|
| + 0.0f, 0.0f, kShapeSize, 0.0f, kShapeSize * 2,
|
| + 0.0f, 0.0f, kShapeSize, kShapeSize, kShapeSize,
|
| + };
|
| +
|
| + glPathStencilFuncCHROMIUM(GL_ALWAYS, 0, 0xFF);
|
| + glStencilFunc(GL_EQUAL, 0x80, 0x80);
|
| + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO);
|
| + glUniform4fv(color_loc_, 1, kGreen);
|
| + glStencilThenCoverStrokePathInstancedCHROMIUM(
|
| + kPathCount, GL_UNSIGNED_INT, kPaths, path - 1, 0x80, 0x80,
|
| + GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM, GL_TRANSLATE_2D_CHROMIUM,
|
| + kTransforms);
|
| +
|
| + glPathStencilFuncCHROMIUM(GL_ALWAYS, 0, 0x7F);
|
| + glStencilFunc(GL_LESS, 0, 0x7F);
|
| + glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO);
|
| + glUniform4fv(color_loc_, 1, kBlue);
|
| + glStencilThenCoverFillPathInstancedCHROMIUM(
|
| + kPathCount, GL_UNSIGNED_INT, kPaths, path - 1, GL_COUNT_UP_CHROMIUM, 0x7F,
|
| + GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM, GL_TRANSLATE_2D_CHROMIUM,
|
| + kTransforms);
|
| +
|
| + glDeletePathsCHROMIUM(path, 1);
|
| +
|
| + // Verify the image.
|
| + VerifyTestPatternFill(0.0f, 0.0f);
|
| + VerifyTestPatternBg(0.0f, 0.0f);
|
| + VerifyTestPatternStroke(0.0f, 0.0f);
|
| +
|
| + VerifyTestPatternFill(kShapeSize, 0.0f);
|
| + VerifyTestPatternBg(kShapeSize, 0.0f);
|
| + VerifyTestPatternStroke(kShapeSize, 0.0f);
|
| +
|
| + VerifyTestPatternFill(kShapeSize * 2, 0.0f);
|
| + VerifyTestPatternBg(kShapeSize * 2, 0.0f);
|
| + VerifyTestPatternStroke(kShapeSize * 2, 0.0f);
|
| +
|
| + VerifyTestPatternFill(0.0f, kShapeSize);
|
| + VerifyTestPatternBg(0.0f, kShapeSize);
|
| + VerifyTestPatternStroke(0.0f, kShapeSize);
|
| +
|
| + VerifyTestPatternFill(kShapeSize, kShapeSize);
|
| + VerifyTestPatternBg(kShapeSize, kShapeSize);
|
| + VerifyTestPatternStroke(kShapeSize, kShapeSize);
|
| +}
|
| +
|
| } // namespace gpu
|
|
|