Path: blob/main_old/src/tests/gl_tests/BlendIntegerTest.cpp
1693 views
//1// Copyright 2020 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"7#include "test_utils/gl_raii.h"89using namespace angle;1011class BlendIntegerTest : public ANGLETest12{13protected:14BlendIntegerTest()15{16setWindowWidth(128);17setWindowHeight(128);18setConfigRedBits(8);19setConfigGreenBits(8);20setConfigBlueBits(8);21setConfigAlphaBits(8);22}2324template <typename T, GLuint components>25void compareValue(const T *value, const char *name, GLenum attachment)26{27T pixel[4];28glReadBuffer(attachment);29glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER,30std::is_same<T, int32_t>::value ? GL_INT : GL_UNSIGNED_INT, pixel);31for (size_t componentIdx = 0; componentIdx < components; componentIdx++)32{33EXPECT_EQ(value[componentIdx], pixel[componentIdx])34<< " componentIdx=" << componentIdx << std::endl35<< " " << name << "[0]=" << value[0] << " pixel[0]=" << pixel[0] << std::endl36<< " " << name << "[1]=" << value[1] << " pixel[1]=" << pixel[1] << std::endl37<< " " << name << "[2]=" << value[2] << " pixel[2]=" << pixel[2] << std::endl38<< " " << name << "[3]=" << value[3] << " pixel[3]=" << pixel[3];39}40}4142template <GLenum internalformat, GLuint components, bool isSigned>43void runTest()44{45constexpr char kFsui[] =46"#version 300 es\n"47"out highp uvec4 o_drawBuffer0;\n"48"void main(void)\n"49"{\n"50" o_drawBuffer0 = uvec4(1, 1, 1, 1);\n"51"}\n";5253constexpr char kFssi[] =54"#version 300 es\n"55"out highp ivec4 o_drawBuffer0;\n"56"void main(void)\n"57"{\n"58" o_drawBuffer0 = ivec4(-1, -1, -1, -1);\n"59"}\n";6061ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), isSigned ? kFssi : kFsui);62glUseProgram(program);6364GLFramebuffer framebuffer;65glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);6667GLRenderbuffer colorRenderbuffer;68glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);69glRenderbufferStorage(GL_RENDERBUFFER, internalformat, getWindowWidth(), getWindowHeight());70glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,71colorRenderbuffer);7273if (isSigned)74{75const int32_t clearValueSigned[4] = {-128, -128, -128, -128};76glClearBufferiv(GL_COLOR, 0, clearValueSigned);77ASSERT_GL_NO_ERROR();78compareValue<int32_t, components>(clearValueSigned, "clearValueSigned",79GL_COLOR_ATTACHMENT0);80}81else82{83const uint32_t clearValueUnsigned[4] = {127, 127, 127, 3};84glClearBufferuiv(GL_COLOR, 0, clearValueUnsigned);85ASSERT_GL_NO_ERROR();86compareValue<uint32_t, components>(clearValueUnsigned, "clearValueUnsigned",87GL_COLOR_ATTACHMENT0);88}8990glEnable(GL_BLEND);91glBlendEquation(GL_FUNC_ADD);92glBlendFunc(GL_ONE, GL_ONE);9394drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);9596ASSERT_GL_NO_ERROR();9798// Enabled blending must be ignored for integer color attachment.99if (isSigned)100{101const int32_t colorValueSigned[4] = {-1, -1, -1, -1};102compareValue<int32_t, components>(colorValueSigned, "colorValueSigned",103GL_COLOR_ATTACHMENT0);104}105else106{107const uint32_t colorValueUnsigned[4] = {1, 1, 1, 1};108compareValue<uint32_t, components>(colorValueUnsigned, "colorValueUnsigned",109GL_COLOR_ATTACHMENT0);110}111}112113template <bool isSigned>114void runTestMRT()115{116constexpr char kFragmentSigned[] = R"(#version 300 es117layout(location = 1) out highp vec4 o_drawBuffer1;118layout(location = 2) out highp ivec4 o_drawBuffer2;119layout(location = 3) out highp vec4 o_drawBuffer3;120void main(void)121{122o_drawBuffer1 = vec4(0, 0, 0, 0);123o_drawBuffer2 = ivec4(0, 0, 0, 0);124o_drawBuffer3 = vec4(0, 0, 0, 0);125})";126127constexpr char kFragmentUnsigned[] = R"(#version 300 es128layout(location = 1) out highp vec4 o_drawBuffer1;129layout(location = 2) out highp uvec4 o_drawBuffer2;130layout(location = 3) out highp vec4 o_drawBuffer3;131void main(void)132{133o_drawBuffer1 = vec4(0, 0, 0, 0);134o_drawBuffer2 = uvec4(0, 0, 0, 0);135o_drawBuffer3 = vec4(0, 0, 0, 0);136})";137138ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(),139isSigned ? kFragmentSigned : kFragmentUnsigned);140glUseProgram(program);141142GLFramebuffer framebuffer;143glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);144145GLRenderbuffer colorRenderbuffer1;146glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer1);147glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, getWindowWidth(), getWindowHeight());148glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER,149colorRenderbuffer1);150151GLRenderbuffer colorRenderbuffer2;152glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer2);153glRenderbufferStorage(GL_RENDERBUFFER, isSigned ? GL_RGBA32I : GL_RGBA32UI,154getWindowWidth(), getWindowHeight());155glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_RENDERBUFFER,156colorRenderbuffer2);157158GLRenderbuffer colorRenderbuffer3;159glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer3);160glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, getWindowWidth(), getWindowHeight());161glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_RENDERBUFFER,162colorRenderbuffer3);163164GLenum drawBuffers[] = {GL_NONE, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2,165GL_COLOR_ATTACHMENT3};166glDrawBuffers(4, drawBuffers);167168if (isSigned)169{170const int32_t clearValue[4] = {-1, 2, -3, 4};171glClearBufferiv(GL_COLOR, 2, clearValue);172ASSERT_GL_NO_ERROR();173compareValue<int32_t, 4>(clearValue, "clearValue", GL_COLOR_ATTACHMENT2);174}175else176{177const uint32_t clearValue[4] = {1, 2, 3, 4};178glClearBufferuiv(GL_COLOR, 2, clearValue);179ASSERT_GL_NO_ERROR();180compareValue<uint32_t, 4>(clearValue, "clearValue", GL_COLOR_ATTACHMENT2);181}182183glBlendEquation(GL_MAX);184glEnable(GL_BLEND);185186drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);187ASSERT_GL_NO_ERROR();188189if (isSigned)190{191const int32_t drawValue[4] = {0, 0, 0, 0};192compareValue<int32_t, 4>(drawValue, "drawValue", GL_COLOR_ATTACHMENT2);193}194else195{196const uint32_t drawValue[4] = {0, 0, 0, 0};197compareValue<uint32_t, 4>(drawValue, "drawValue", GL_COLOR_ATTACHMENT2);198}199}200};201202// Test that blending is not applied to signed integer attachments.203TEST_P(BlendIntegerTest, R8I)204{205runTest<GL_R8I, 1, true>();206}207208TEST_P(BlendIntegerTest, R16I)209{210runTest<GL_R16I, 1, true>();211}212213TEST_P(BlendIntegerTest, R32I)214{215runTest<GL_R32I, 1, true>();216}217218TEST_P(BlendIntegerTest, RG8I)219{220runTest<GL_RG8I, 2, true>();221}222223TEST_P(BlendIntegerTest, RG16I)224{225runTest<GL_RG16I, 2, true>();226}227228TEST_P(BlendIntegerTest, RG32I)229{230runTest<GL_RG32I, 2, true>();231}232233TEST_P(BlendIntegerTest, RGBA8I)234{235runTest<GL_RGBA8I, 4, true>();236}237238TEST_P(BlendIntegerTest, RGBA16I)239{240runTest<GL_RGBA16I, 4, true>();241}242243TEST_P(BlendIntegerTest, RGBA32I)244{245runTest<GL_RGBA32I, 4, true>();246}247248// Test that blending is not applied to unsigned integer attachments.249TEST_P(BlendIntegerTest, R8UI)250{251runTest<GL_R8UI, 1, false>();252}253254TEST_P(BlendIntegerTest, R16UI)255{256runTest<GL_R16UI, 1, false>();257}258259TEST_P(BlendIntegerTest, R32UI)260{261runTest<GL_R32UI, 1, false>();262}263264TEST_P(BlendIntegerTest, RG8UI)265{266runTest<GL_RG8UI, 2, false>();267}268269TEST_P(BlendIntegerTest, RG16UI)270{271runTest<GL_RG16UI, 2, false>();272}273274TEST_P(BlendIntegerTest, RG32UI)275{276runTest<GL_RG32UI, 2, false>();277}278279TEST_P(BlendIntegerTest, RGBA8UI)280{281runTest<GL_RGBA8UI, 4, false>();282}283284TEST_P(BlendIntegerTest, RGBA16UI)285{286runTest<GL_RGBA16UI, 4, false>();287}288289TEST_P(BlendIntegerTest, RGBA32UI)290{291runTest<GL_RGBA32UI, 4, false>();292}293294TEST_P(BlendIntegerTest, RGB10_A2UI)295{296runTest<GL_RGB10_A2UI, 4, false>();297}298299// Test that blending does not cancel draws on signed integer attachments.300TEST_P(BlendIntegerTest, MRTSigned)301{302// http://anglebug.com/5071303ANGLE_SKIP_TEST_IF(IsVulkan() && IsWindows() && IsIntel());304305// http://anglebug.com/5125306ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX() && IsIntel());307308// http://anglebug.com/5126309ANGLE_SKIP_TEST_IF(IsVulkan() && IsAdreno());310311runTestMRT<true>();312}313314// Test that blending does not cancel draws on unsigned integer attachments.315TEST_P(BlendIntegerTest, MRTUnsigned)316{317// http://anglebug.com/5071318ANGLE_SKIP_TEST_IF(IsVulkan() && IsWindows() && IsIntel());319320// http://anglebug.com/5125321ANGLE_SKIP_TEST_IF(IsOpenGL() && IsOSX() && IsIntel());322323// http://anglebug.com/5126324ANGLE_SKIP_TEST_IF(IsVulkan() && IsAdreno());325326runTestMRT<false>();327}328329// Use this to select which configurations (e.g. which renderer, which GLES major version) these330// tests should be run against.331GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BlendIntegerTest);332ANGLE_INSTANTIATE_TEST_ES3(BlendIntegerTest);333334335