Path: blob/main_old/src/tests/gl_tests/BlendMinMaxTest.cpp
1693 views
//1// Copyright 2015 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//56#include "test_utils/ANGLETest.h"78using namespace angle;910class BlendMinMaxTest : public ANGLETest11{12protected:13BlendMinMaxTest()14{15setWindowWidth(128);16setWindowHeight(128);17setConfigRedBits(8);18setConfigGreenBits(8);19setConfigBlueBits(8);20setConfigAlphaBits(8);21setConfigDepthBits(24);2223mProgram = 0;24mColorLocation = -1;25mFramebuffer = 0;26mColorRenderbuffer = 0;27}2829struct Color30{31float values[4];32};3334static float getExpected(bool blendMin, float curColor, float prevColor)35{36return blendMin ? std::min(curColor, prevColor) : std::max(curColor, prevColor);37}3839void runTest(GLenum colorFormat, GLenum type)40{41ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&42!IsGLExtensionEnabled("GL_EXT_blend_minmax"));4344SetUpFramebuffer(colorFormat);4546int minValue = 0;47int maxValue = 1;48if (type == GL_FLOAT)49{50minValue = -1024;51maxValue = 1024;52}5354const size_t colorCount = 128;55Color colors[colorCount];56for (size_t i = 0; i < colorCount; i++)57{58for (size_t j = 0; j < 4; j++)59{60colors[i].values[j] =61static_cast<float>(minValue + (rand() % (maxValue - minValue)));62}63}6465float prevColor[4];66for (size_t i = 0; i < colorCount; i++)67{68const Color &color = colors[i];69glUseProgram(mProgram);70glUniform4f(mColorLocation, color.values[0], color.values[1], color.values[2],71color.values[3]);7273bool blendMin = (rand() % 2 == 0);74glBlendEquation(blendMin ? GL_MIN : GL_MAX);7576drawQuad(mProgram, essl1_shaders::PositionAttrib(), 0.5f);7778float pixel[4];79if (type == GL_UNSIGNED_BYTE)80{81GLubyte ubytePixel[4];82glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, ubytePixel);83for (size_t componentIdx = 0; componentIdx < ArraySize(pixel); componentIdx++)84{85pixel[componentIdx] = ubytePixel[componentIdx] / 255.0f;86}87}88else if (type == GL_FLOAT)89{90glReadPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, pixel);91}92else93{94FAIL() << "Unexpected pixel type";95}9697if (i > 0)98{99const float errorRange = 1.0f / 255.0f;100for (size_t componentIdx = 0; componentIdx < ArraySize(pixel); componentIdx++)101{102EXPECT_NEAR(103getExpected(blendMin, color.values[componentIdx], prevColor[componentIdx]),104pixel[componentIdx], errorRange)105<< " blendMin=" << blendMin << " componentIdx=" << componentIdx << std::endl106<< " color.values[0]=" << color.values[0]107<< " prevColor[0]=" << prevColor[0] << std::endl108<< " color.values[1]=" << color.values[1]109<< " prevColor[1]=" << prevColor[1] << std::endl110<< " color.values[2]=" << color.values[2]111<< " prevColor[2]=" << prevColor[2] << std::endl112<< " color.values[3]=" << color.values[3]113<< " prevColor[3]=" << prevColor[3];114}115}116117memcpy(prevColor, pixel, sizeof(pixel));118}119}120121void testSetUp() override122{123mProgram = CompileProgram(essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());124if (mProgram == 0)125{126FAIL() << "shader compilation failed.";127}128129mColorLocation = glGetUniformLocation(mProgram, essl1_shaders::ColorUniform());130131glUseProgram(mProgram);132133glClearColor(0, 0, 0, 0);134glClearDepthf(0.0);135glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);136137glEnable(GL_BLEND);138glDisable(GL_DEPTH_TEST);139}140141void SetUpFramebuffer(GLenum colorFormat)142{143glGenFramebuffers(1, &mFramebuffer);144glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);145146glGenRenderbuffers(1, &mColorRenderbuffer);147glBindRenderbuffer(GL_RENDERBUFFER, mColorRenderbuffer);148glRenderbufferStorage(GL_RENDERBUFFER, colorFormat, getWindowWidth(), getWindowHeight());149glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,150mColorRenderbuffer);151152glClearColor(0.0f, 0.0f, 0.0f, 0.0f);153glClear(GL_COLOR_BUFFER_BIT);154155ASSERT_GL_NO_ERROR();156}157158void testTearDown() override159{160glDeleteProgram(mProgram);161glDeleteFramebuffers(1, &mFramebuffer);162glDeleteRenderbuffers(1, &mColorRenderbuffer);163}164165GLuint mProgram;166GLint mColorLocation;167168GLuint mFramebuffer;169GLuint mColorRenderbuffer;170};171172TEST_P(BlendMinMaxTest, RGBA8)173{174runTest(GL_RGBA8, GL_UNSIGNED_BYTE);175}176177TEST_P(BlendMinMaxTest, RGBA32F)178{179ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 || !IsGLExtensionEnabled("GL_EXT_float_blend") ||180!IsGLExtensionEnabled("GL_EXT_color_buffer_float"));181182// Ignore SDK layers messages on D3D11 FL 9.3 (http://anglebug.com/1284)183ANGLE_SKIP_TEST_IF(IsD3D11_FL93());184185runTest(GL_RGBA32F, GL_FLOAT);186}187188TEST_P(BlendMinMaxTest, RGBA16F)189{190ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&191!IsGLExtensionEnabled("GL_EXT_color_buffer_half_float"));192// http://anglebug.com/4092193ANGLE_SKIP_TEST_IF((IsAndroid() && IsVulkan()) || isSwiftshader());194195// http://anglebug.com/4185196ANGLE_SKIP_TEST_IF(IsMetal());197198// TODO(anglebug.com/5491) Context.cpp disallows GL_EXT_color_buffer_half_float on iOS because199// it doesn't support GL_EXT_color_buffer_float.200ANGLE_SKIP_TEST_IF(IsIOS() && IsOpenGLES());201202runTest(GL_RGBA16F, GL_FLOAT);203}204205// Use this to select which configurations (e.g. which renderer, which GLES major version) these206// tests should be run against.207ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(BlendMinMaxTest);208209210