// // 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. // // BasicDrawTest.cpp: Tests basic fullscreen quad draw with and without // GL_TEXTURE_2D enabled. #include "test_utils/ANGLETest.h" #include "test_utils/gl_raii.h" #include using namespace angle; class BasicDrawTest : public ANGLETest<> { protected: BasicDrawTest() { setWindowWidth(32); setWindowHeight(32); setConfigRedBits(8); setConfigGreenBits(8); setConfigBlueBits(8); setConfigAlphaBits(8); setConfigDepthBits(24); } std::vector mPositions = { -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, }; void drawRedQuad() { glColor4f(1.0f, 0.0f, 0.0f, 1.0f); EXPECT_GL_NO_ERROR(); glEnableClientState(GL_VERTEX_ARRAY); EXPECT_GL_NO_ERROR(); glVertexPointer(2, GL_FLOAT, 0, mPositions.data()); EXPECT_GL_NO_ERROR(); glDrawArrays(GL_TRIANGLES, 0, 6); EXPECT_GL_NO_ERROR(); EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); } }; // Draws a fullscreen quad with a certain color. TEST_P(BasicDrawTest, DrawColor) { drawRedQuad(); } // Checks that textures can be enabled or disabled. TEST_P(BasicDrawTest, EnableDisableTexture) { GLuint tex; glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_2D, tex); // Green GLubyte texture[] = { 0x00, 0xff, 0x00, }; glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, texture); // Texturing is disabled; still red; drawRedQuad(); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Texturing enabled; is green (provided modulate w/ white) glEnable(GL_TEXTURE_2D); EXPECT_GL_NO_ERROR(); glDrawArrays(GL_TRIANGLES, 0, 6); EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); } // Check that glClearColorx, glClearDepthx, glLineWidthx, glPolygonOffsetx can work. TEST_P(BasicDrawTest, DepthTest) { glClearColorx(0x4000, 0x8000, 0x8000, 0x8000); EXPECT_GL_NO_ERROR(); glClearDepthx(0x8000); EXPECT_GL_NO_ERROR(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); EXPECT_PIXEL_NEAR(0, 0, 64, 128, 128, 128, 1.0); // Fail Depth Test and can't draw the red triangle std::vector Positions = {-1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f}; glEnable(GL_DEPTH_TEST); glLineWidthx(0x10000); EXPECT_GL_NO_ERROR(); glPolygonOffsetx(0, 0); EXPECT_GL_NO_ERROR(); glColor4f(1.0f, 0.0f, 0.0f, 1.0f); glEnableClientState(GL_VERTEX_ARRAY); EXPECT_GL_NO_ERROR(); glVertexPointer(3, GL_FLOAT, 0, Positions.data()); EXPECT_GL_NO_ERROR(); glDrawArrays(GL_TRIANGLES, 0, 3); EXPECT_GL_NO_ERROR(); EXPECT_PIXEL_NEAR(0, 0, 64, 128, 128, 128, 1.0); glDisable(GL_DEPTH_TEST); EXPECT_GL_NO_ERROR(); glDrawArrays(GL_TRIANGLES, 0, 3); EXPECT_GL_NO_ERROR(); EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); } // Check that depth range can be set by glDepthRangex. TEST_P(BasicDrawTest, SetDepthRangex) { glDepthRangex(0x8000, 0x10000); EXPECT_GL_NO_ERROR(); GLfixed depth_range[2]; glGetFixedv(GL_DEPTH_RANGE, depth_range); EXPECT_GL_NO_ERROR(); EXPECT_EQ(0x8000, depth_range[0]); EXPECT_EQ(0x10000, depth_range[1]); } // Check that sample coverage parameters can be set by glSampleCoveragex. TEST_P(BasicDrawTest, SetSampleCoveragex) { GLfixed isSampleCoverage; GLfixed samplecoveragevalue; GLfixed samplecoverageinvert; glEnable(GL_SAMPLE_COVERAGE); EXPECT_GL_NO_ERROR(); glGetFixedv(GL_SAMPLE_COVERAGE, &isSampleCoverage); EXPECT_GL_NO_ERROR(); EXPECT_EQ(0x10000, isSampleCoverage); glSampleCoveragex(0x8000, true); EXPECT_GL_NO_ERROR(); glGetFixedv(GL_SAMPLE_COVERAGE_VALUE, &samplecoveragevalue); EXPECT_GL_NO_ERROR(); EXPECT_EQ(0x8000, samplecoveragevalue); glGetFixedv(GL_SAMPLE_COVERAGE_INVERT, &samplecoverageinvert); EXPECT_GL_NO_ERROR(); EXPECT_EQ(0x10000, samplecoverageinvert); } ANGLE_INSTANTIATE_TEST_ES1(BasicDrawTest);