// // Copyright 2018 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // PointSpriteTest.cpp: Tests basic usage of GLES1 point sprites. #include "test_utils/ANGLETest.h" #include "test_utils/gl_raii.h" #include "util/random_utils.h" #include using namespace angle; class PointSpriteTest : public ANGLETest { protected: PointSpriteTest() { setWindowWidth(1); setWindowHeight(1); setConfigRedBits(8); setConfigGreenBits(8); setConfigBlueBits(8); setConfigAlphaBits(8); setConfigDepthBits(24); } }; // Checks that triangles are not treated as point sprites, and that cached state // is properly invalidated when the primitive mode changes. TEST_P(PointSpriteTest, TrianglesNotTreatedAsPointSprites) { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glEnable(GL_POINT_SPRITE_OES); glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_TRUE); glEnable(GL_TEXTURE_2D); GLuint tex; glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_2D, tex); // A 3x3 texture where the top right corner is green. Rendered with // triangles + texture coordinate 1,1 this is always green, but rendered as // a point sprite, red will be used as we are using nearest filtering and we // would be favoring only the red parts of the image in point coordinates. GLubyte texture[] = { 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, }; glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 3, 3, 0, GL_RGB, GL_UNSIGNED_BYTE, texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // The first coordinate, 0.9f 0.9f should be sufficiently shifted to the right // that the green part of the point sprite is hidden. std::vector mPositions = { 0.9f, 0.9f, -0.9f, 0.9f, 0.9f, -0.9f, }; glEnableClientState(GL_VERTEX_ARRAY); glMultiTexCoord4f(GL_TEXTURE0, 1.0f, 1.0f, 0.0f, 0.0f); glVertexPointer(2, GL_FLOAT, 0, mPositions.data()); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDrawArrays(GL_TRIANGLES, 0, 3); EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDrawArrays(GL_POINTS, 0, 1); EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); } ANGLE_INSTANTIATE_TEST_ES1(PointSpriteTest);