13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.0 Module 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ------------------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Advanced blending (GL_KHR_blend_equation_advanced) tests. 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es31fAdvancedBlendTests.hpp" 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluStrUtil.hpp" 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsFragmentOpUtil.hpp" 27c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "glsStateQueryUtil.hpp" 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluPixelTransfer.hpp" 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluObjectWrapper.hpp" 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluContextInfo.hpp" 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluShaderProgram.hpp" 32c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "gluCallLogWrapper.hpp" 33c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "gluStrUtil.hpp" 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuPixelFormat.hpp" 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTexture.hpp" 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTextureUtil.hpp" 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuImageCompare.hpp" 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuRenderTarget.hpp" 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp" 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuStringTemplate.hpp" 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.hpp" 42c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "deStringUtil.hpp" 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "rrFragmentOperations.hpp" 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "sglrReferenceUtils.hpp" 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp" 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwFunctions.hpp" 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <string> 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <vector> 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing gls::FragmentOpUtil::IntegerQuad; 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing gls::FragmentOpUtil::ReferenceQuadRenderer; 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::TextureLevel; 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::Vec2; 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::Vec4; 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::UVec4; 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::TestLog; 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing tcu::TextureFormat; 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string; 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector; 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::map; 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles31 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MAX_VIEWPORT_WIDTH = 128, 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MAX_VIEWPORT_HEIGHT = 128 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryenum RenderTargetType 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RENDERTARGETTYPE_DEFAULT = 0, //!< Default framebuffer 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RENDERTARGETTYPE_SRGB_FBO, 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RENDERTARGETTYPE_MSAA_FBO, 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RENDERTARGETTYPE_LAST 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 89c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrystatic const char* getEquationName (glw::GLenum equation) 90c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{ 91c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry switch (equation) 92c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry { 93c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_MULTIPLY_KHR: return "multiply"; 94c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_SCREEN_KHR: return "screen"; 95c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_OVERLAY_KHR: return "overlay"; 96c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_DARKEN_KHR: return "darken"; 97c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_LIGHTEN_KHR: return "lighten"; 98c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_COLORDODGE_KHR: return "colordodge"; 99c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_COLORBURN_KHR: return "colorburn"; 100c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_HARDLIGHT_KHR: return "hardlight"; 101c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_SOFTLIGHT_KHR: return "softlight"; 102c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_DIFFERENCE_KHR: return "difference"; 103c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_EXCLUSION_KHR: return "exclusion"; 104c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_HSL_HUE_KHR: return "hsl_hue"; 105c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_HSL_SATURATION_KHR: return "hsl_saturation"; 106c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_HSL_COLOR_KHR: return "hsl_color"; 107c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry case GL_HSL_LUMINOSITY_KHR: return "hsl_luminosity"; 108c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry default: 109c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry DE_ASSERT(false); 110c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry return DE_NULL; 111c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry } 112c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry} 113c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass AdvancedBlendCase : public TestCase 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry AdvancedBlendCase (Context& context, const char* name, const char* desc, deUint32 mode, int overdrawCount, bool coherent, RenderTargetType rtType); 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~AdvancedBlendCase (void); 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void init (void); 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void deinit (void); 1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry IterateResult iterate (void); 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry AdvancedBlendCase (const AdvancedBlendCase&); 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry AdvancedBlendCase& operator= (const AdvancedBlendCase&); 1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint32 m_blendMode; 1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int m_overdrawCount; 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool m_coherentBlending; 1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const RenderTargetType m_rtType; 1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int m_numIters; 1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13657c60b3189ce3ac3e738d715313313cd140ef87cJarkko Pöyry bool m_coherentExtensionSupported; 13757c60b3189ce3ac3e738d715313313cd140ef87cJarkko Pöyry 1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 m_colorRbo; 1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 m_fbo; 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 m_resolveColorRbo; 1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 m_resolveFbo; 1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::ShaderProgram* m_program; 1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ReferenceQuadRenderer* m_referenceRenderer; 1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureLevel* m_refColorBuffer; 1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int m_renderWidth; 1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int m_renderHeight; 1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int m_viewportWidth; 1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int m_viewportHeight; 1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int m_iterNdx; 1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1573c827367444ee418f129b2c238299f49d3264554Jarkko PoyryAdvancedBlendCase::AdvancedBlendCase (Context& context, 1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* name, 1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* desc, 1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 mode, 1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int overdrawCount, 1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool coherent, 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry RenderTargetType rtType) 1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCase (context, name, desc) 1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_blendMode (mode) 1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_overdrawCount (overdrawCount) 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_coherentBlending (coherent) 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_rtType (rtType) 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_numIters (5) 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_colorRbo (0) 1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_fbo (0) 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_resolveColorRbo (0) 1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_resolveFbo (0) 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_program (DE_NULL) 1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_referenceRenderer (DE_NULL) 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_refColorBuffer (DE_NULL) 1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_renderWidth (rtType != RENDERTARGETTYPE_DEFAULT ? 2*MAX_VIEWPORT_WIDTH : m_context.getRenderTarget().getWidth()) 1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_renderHeight (rtType != RENDERTARGETTYPE_DEFAULT ? 2*MAX_VIEWPORT_HEIGHT : m_context.getRenderTarget().getHeight()) 1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_viewportWidth (de::min<int>(m_renderWidth, MAX_VIEWPORT_WIDTH)) 1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_viewportHeight (de::min<int>(m_renderHeight, MAX_VIEWPORT_HEIGHT)) 1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_iterNdx (0) 1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyryconst char* getBlendLayoutQualifier (rr::BlendEquationAdvanced equation) 1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const char* s_qualifiers[] = 1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_multiply", 1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_screen", 1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_overlay", 1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_darken", 1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_lighten", 1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_colordodge", 1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_colorburn", 1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_hardlight", 1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_softlight", 1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_difference", 1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_exclusion", 2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_hsl_hue", 2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_hsl_saturation", 2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_hsl_color", 2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "blend_support_hsl_luminosity", 2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(s_qualifiers) == rr::BLENDEQUATION_ADVANCED_LAST); 2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(de::inBounds<int>(equation, 0, rr::BLENDEQUATION_ADVANCED_LAST)); 2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return s_qualifiers[equation]; 2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyryglu::ProgramSources getBlendProgramSrc (rr::BlendEquationAdvanced equation) 2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const char* s_vertSrc = "#version 310 es\n" 2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "in highp vec4 a_position;\n" 2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "in mediump vec4 a_color;\n" 2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "out mediump vec4 v_color;\n" 2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "void main()\n" 2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "{\n" 2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " gl_Position = a_position;\n" 2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " v_color = a_color;\n" 2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "}\n"; 2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static const char* s_fragSrc = "#version 310 es\n" 2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "#extension GL_KHR_blend_equation_advanced : require\n" 2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "in mediump vec4 v_color;\n" 2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "layout(${SUPPORT_QUALIFIER}) out;\n" 2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "layout(location = 0) out mediump vec4 o_color;\n" 2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "void main()\n" 2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "{\n" 2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry " o_color = v_color;\n" 2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "}\n"; 2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry map<string, string> args; 2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry args["SUPPORT_QUALIFIER"] = getBlendLayoutQualifier(equation); 2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return glu::ProgramSources() 2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << glu::VertexSource(s_vertSrc) 2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << glu::FragmentSource(tcu::StringTemplate(s_fragSrc).specialize(args)); 2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid AdvancedBlendCase::init (void) 2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool useFbo = m_rtType != RENDERTARGETTYPE_DEFAULT; 2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool useSRGB = m_rtType == RENDERTARGETTYPE_SRGB_FBO; 2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!m_context.getContextInfo().isExtensionSupported("GL_KHR_blend_equation_advanced")) 2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throw tcu::NotSupportedError("GL_KHR_blend_equation_advanced is not supported", DE_NULL, __FILE__, __LINE__); 2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_coherentBlending && !m_context.getContextInfo().isExtensionSupported("GL_KHR_blend_equation_advanced_coherent")) 2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throw tcu::NotSupportedError("GL_KHR_blend_equation_advanced_coherent is not supported", DE_NULL, __FILE__, __LINE__); 2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_CHECK(gl.blendBarrierKHR); 2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(!m_program); 2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(!m_referenceRenderer); 2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(!m_refColorBuffer); 2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 25857c60b3189ce3ac3e738d715313313cd140ef87cJarkko Pöyry m_coherentExtensionSupported = m_context.getContextInfo().isExtensionSupported("GL_KHR_blend_equation_advanced_coherent"); 25957c60b3189ce3ac3e738d715313313cd140ef87cJarkko Pöyry 2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_program = new glu::ShaderProgram(m_context.getRenderContext(), getBlendProgramSrc(sglr::rr_util::mapGLBlendEquationAdvanced(m_blendMode))); 2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.getLog() << *m_program; 2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!m_program->isOk()) 2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_program; 2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_program = DE_NULL; 2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_FAIL("Compile failed"); 2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_referenceRenderer = new ReferenceQuadRenderer; 2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_refColorBuffer = new TextureLevel(TextureFormat(useSRGB ? TextureFormat::sRGBA : TextureFormat::RGBA, TextureFormat::UNORM_INT8), m_viewportWidth, m_viewportHeight); 2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (useFbo) 2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint32 format = useSRGB ? GL_SRGB8_ALPHA8 : GL_RGBA8; 2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int numSamples = m_rtType == RENDERTARGETTYPE_MSAA_FBO ? 4 : 0; 2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.getLog() << TestLog::Message << "Using FBO of size (" << m_renderWidth << ", " << m_renderHeight << ") with format " 2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << glu::getPixelFormatStr(format) << " and " << numSamples << " samples" 2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << TestLog::EndMessage; 2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.genRenderbuffers(1, &m_colorRbo); 2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindRenderbuffer(GL_RENDERBUFFER, m_colorRbo); 2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.renderbufferStorageMultisample(GL_RENDERBUFFER, numSamples, format, m_renderWidth, m_renderHeight); 2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to create color RBO"); 2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.genFramebuffers(1, &m_fbo); 2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo); 2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_colorRbo); 2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to create FBO"); 2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_CHECK(gl.checkFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE); 2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (numSamples > 0) 2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Create resolve FBO 2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.genRenderbuffers(1, &m_resolveColorRbo); 2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindRenderbuffer(GL_RENDERBUFFER, m_resolveColorRbo); 2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.renderbufferStorageMultisample(GL_RENDERBUFFER, 0, format, m_renderWidth, m_renderHeight); 3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to create resolve color RBO"); 3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.genFramebuffers(1, &m_resolveFbo); 3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindFramebuffer(GL_FRAMEBUFFER, m_resolveFbo); 3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_resolveColorRbo); 3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to create FBO"); 3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_CHECK(gl.checkFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE); 3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo); 3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(m_rtType == RENDERTARGETTYPE_DEFAULT); 3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_iterNdx = 0; 3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3183c827367444ee418f129b2c238299f49d3264554Jarkko PoyryAdvancedBlendCase::~AdvancedBlendCase (void) 3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry AdvancedBlendCase::deinit(); 3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid AdvancedBlendCase::deinit (void) 3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_program; 3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_referenceRenderer; 3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_refColorBuffer; 3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_program = DE_NULL; 3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_referenceRenderer = DE_NULL; 3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_refColorBuffer = DE_NULL; 3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_colorRbo || m_fbo) 3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glw::Functions& gl = m_context.getRenderContext().getFunctions(); 3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindRenderbuffer(GL_RENDERBUFFER, 0); 3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindFramebuffer(GL_FRAMEBUFFER, 0); 3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_colorRbo != 0) 3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.deleteRenderbuffers(1, &m_colorRbo); 3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_colorRbo = 0; 3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_fbo != 0) 3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.deleteFramebuffers(1, &m_fbo); 3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_fbo = 0; 3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_resolveColorRbo) 3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.deleteRenderbuffers(1, &m_resolveColorRbo); 3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_resolveColorRbo = 0; 3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_resolveFbo) 3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.deleteRenderbuffers(1, &m_resolveFbo); 3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_resolveFbo = 0; 3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic tcu::Vec4 randomColor (de::Random* rnd) 3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const float rgbValues[] = { 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f }; 3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const float alphaValues[] = { 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f }; 3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 37124f9049882d302a83a4788f829863f123f2aeae1Pyry Haulos // \note Spec assumes premultiplied inputs. 3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const float a = rnd->choose<float>(DE_ARRAY_BEGIN(alphaValues), DE_ARRAY_END(alphaValues)); 37324f9049882d302a83a4788f829863f123f2aeae1Pyry Haulos const float r = a * rnd->choose<float>(DE_ARRAY_BEGIN(rgbValues), DE_ARRAY_END(rgbValues)); 37424f9049882d302a83a4788f829863f123f2aeae1Pyry Haulos const float g = a * rnd->choose<float>(DE_ARRAY_BEGIN(rgbValues), DE_ARRAY_END(rgbValues)); 37524f9049882d302a83a4788f829863f123f2aeae1Pyry Haulos const float b = a * rnd->choose<float>(DE_ARRAY_BEGIN(rgbValues), DE_ARRAY_END(rgbValues)); 3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return tcu::Vec4(r, g, b, a); 3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystatic tcu::ConstPixelBufferAccess getLinearAccess (const tcu::ConstPixelBufferAccess& access) 3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (access.getFormat().order == TextureFormat::sRGBA) 3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return tcu::ConstPixelBufferAccess(TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_INT8), 3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry access.getWidth(), access.getHeight(), access.getDepth(), 3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry access.getRowPitch(), access.getSlicePitch(), access.getDataPtr()); 3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return access; 3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3893c827367444ee418f129b2c238299f49d3264554Jarkko PoyryAdvancedBlendCase::IterateResult AdvancedBlendCase::iterate (void) 3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glu::RenderContext& renderCtx = m_context.getRenderContext(); 3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glw::Functions& gl = renderCtx.getFunctions(); 3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry de::Random rnd (deStringHash(getName()) ^ deInt32Hash(m_iterNdx)); 3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int viewportX = rnd.getInt(0, m_renderWidth - m_viewportWidth); 3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int viewportY = rnd.getInt(0, m_renderHeight - m_viewportHeight); 3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool useFbo = m_rtType != RENDERTARGETTYPE_DEFAULT; 3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool requiresResolve = m_rtType == RENDERTARGETTYPE_MSAA_FBO; 3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int numQuads = m_overdrawCount+1; 3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TextureLevel renderedImg (TextureFormat(TextureFormat::RGBA, TextureFormat::UNORM_INT8), m_viewportWidth, m_viewportHeight); 4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<Vec4> colors (numQuads*4); 4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (vector<Vec4>::iterator col = colors.begin(); col != colors.end(); ++col) 4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *col = randomColor(&rnd); 4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Render with GL. 4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint32 program = m_program->getProgram(); 4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int posLoc = gl.getAttribLocation(program, "a_position"); 4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const int colorLoc = gl.getAttribLocation(program, "a_color"); 4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glu::Buffer indexBuffer (renderCtx); 4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glu::Buffer positionBuffer (renderCtx); 4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glu::Buffer colorBuffer (renderCtx); 4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<Vec2> positions (numQuads*4); 4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<deUint16> indices (numQuads*6); 4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint16 singleQuadIndices[] = { 0, 2, 1, 1, 2, 3 }; 4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const Vec2 singleQuadPos[] = 4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec2(-1.0f, -1.0f), 4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec2(-1.0f, +1.0f), 4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec2(+1.0f, -1.0f), 4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Vec2(+1.0f, +1.0f), 4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_CHECK(posLoc >= 0 && colorLoc >= 0); 4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int quadNdx = 0; quadNdx < numQuads; quadNdx++) 4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::copy(DE_ARRAY_BEGIN(singleQuadPos), DE_ARRAY_END(singleQuadPos), &positions[quadNdx*4]); 4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(singleQuadIndices); ndx++) 4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry indices[quadNdx*6 + ndx] = (deUint16)(quadNdx*4 + singleQuadIndices[ndx]); 4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, *indexBuffer); 4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, (glw::GLsizeiptr)(indices.size()*sizeof(indices[0])), &indices[0], GL_STATIC_DRAW); 4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindBuffer(GL_ARRAY_BUFFER, *positionBuffer); 4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)(positions.size()*sizeof(positions[0])), &positions[0], GL_STATIC_DRAW); 4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.enableVertexAttribArray(posLoc); 4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.vertexAttribPointer(posLoc, 2, GL_FLOAT, GL_FALSE, 0, DE_NULL); 4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindBuffer(GL_ARRAY_BUFFER, *colorBuffer); 4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bufferData(GL_ARRAY_BUFFER, (glw::GLsizeiptr)(colors.size()*sizeof(colors[0])), &colors[0], GL_STATIC_DRAW); 4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.enableVertexAttribArray(colorLoc); 4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.vertexAttribPointer(colorLoc, 4, GL_FLOAT, GL_FALSE, 0, DE_NULL); 4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to create buffers"); 4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.useProgram(program); 4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.viewport(viewportX, viewportY, m_viewportWidth, m_viewportHeight); 4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.blendEquation(m_blendMode); 45057c60b3189ce3ac3e738d715313313cd140ef87cJarkko Pöyry 45157c60b3189ce3ac3e738d715313313cd140ef87cJarkko Pöyry // \note coherent extension enables GL_BLEND_ADVANCED_COHERENT_KHR by default 4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_coherentBlending) 4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.enable(GL_BLEND_ADVANCED_COHERENT_KHR); 45457c60b3189ce3ac3e738d715313313cd140ef87cJarkko Pöyry else if (m_coherentExtensionSupported) 45557c60b3189ce3ac3e738d715313313cd140ef87cJarkko Pöyry gl.disable(GL_BLEND_ADVANCED_COHERENT_KHR); 4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to set render state"); 4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 459f8540a99d85b322eb826249746f08111f0137fa8Pyry Haulos gl.clear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); 460f8540a99d85b322eb826249746f08111f0137fa8Pyry Haulos 4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.disable(GL_BLEND); 4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, DE_NULL); 4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.enable(GL_BLEND); 4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 465f8540a99d85b322eb826249746f08111f0137fa8Pyry Haulos if (!m_coherentBlending) 466f8540a99d85b322eb826249746f08111f0137fa8Pyry Haulos gl.blendBarrierKHR(); 467f8540a99d85b322eb826249746f08111f0137fa8Pyry Haulos 4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_coherentBlending) 4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.drawElements(GL_TRIANGLES, 6*(numQuads-1), GL_UNSIGNED_SHORT, (const void*)(deUintptr)(6*sizeof(deUint16))); 4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int quadNdx = 1; quadNdx < numQuads; quadNdx++) 4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (const void*)(deUintptr)(quadNdx*6*sizeof(deUint16))); 4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.blendBarrierKHR(); 4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.flush(); 4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_EXPECT_NO_ERROR(gl.getError(), "Render failed"); 4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Render reference. 4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry rr::FragmentOperationState referenceState; 4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::PixelBufferAccess colorAccess = gls::FragmentOpUtil::getMultisampleAccess(m_refColorBuffer->getAccess()); 4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const tcu::PixelBufferAccess nullAccess (TextureFormat(), 0, 0, 0, DE_NULL); 4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry IntegerQuad quad; 4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!useFbo && m_context.getRenderTarget().getPixelFormat().alphaBits == 0) 4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Emulate lack of alpha by clearing to 1 and masking out alpha writes 4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::clear(*m_refColorBuffer, tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); 4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry referenceState.colorMask = tcu::BVec4(true, true, true, false); 4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry referenceState.blendEquationAdvaced = sglr::rr_util::mapGLBlendEquationAdvanced(m_blendMode); 5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry quad.posA = tcu::IVec2(0, 0); 5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry quad.posB = tcu::IVec2(m_viewportWidth-1, m_viewportHeight-1); 5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int quadNdx = 0; quadNdx < numQuads; quadNdx++) 5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry referenceState.blendMode = quadNdx == 0 ? rr::BLENDMODE_NONE : rr::BLENDMODE_ADVANCED; 5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::copy(&colors[4*quadNdx], &colors[4*quadNdx] + 4, &quad.color[0]); 5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_referenceRenderer->render(colorAccess, nullAccess /* no depth */, nullAccess /* no stencil */, quad, referenceState); 5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (requiresResolve) 5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, m_resolveFbo); 5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.blitFramebuffer(0, 0, m_renderWidth, m_renderHeight, 0, 0, m_renderWidth, m_renderHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); 5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_EXPECT_NO_ERROR(gl.getError(), "Resolve blit failed"); 5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindFramebuffer(GL_READ_FRAMEBUFFER, m_resolveFbo); 5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::readPixels(renderCtx, viewportX, viewportY, renderedImg.getAccess()); 5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels()"); 5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (requiresResolve) 5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry gl.bindFramebuffer(GL_FRAMEBUFFER, m_fbo); 5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const bool isHSLMode = m_blendMode == GL_HSL_HUE_KHR || 5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_blendMode == GL_HSL_SATURATION_KHR || 5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_blendMode == GL_HSL_COLOR_KHR || 5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_blendMode == GL_HSL_LUMINOSITY_KHR; 5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool comparePass = false; 5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isHSLMode) 5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Compensate for more demanding HSL code by using fuzzy comparison. 5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const float threshold = 0.002f; 5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry comparePass = tcu::fuzzyCompare(m_testCtx.getLog(), "CompareResult", "Image Comparison Result", 5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry getLinearAccess(m_refColorBuffer->getAccess()), 5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry renderedImg.getAccess(), 5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry threshold, tcu::COMPARE_LOG_RESULT); 5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 545c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const UVec4 compareThreshold = (useFbo ? tcu::PixelFormat(8, 8, 8, 8) : m_context.getRenderTarget().getPixelFormat()).getColorThreshold().toIVec().asUint() 5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * UVec4(5) / UVec4(2) + UVec4(3 * m_overdrawCount); 5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry comparePass = tcu::bilinearCompare(m_testCtx.getLog(), "CompareResult", "Image Comparison Result", 5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry getLinearAccess(m_refColorBuffer->getAccess()), 5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry renderedImg.getAccess(), 5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::RGBA(compareThreshold[0], compareThreshold[1], compareThreshold[2], compareThreshold[3]), 5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::COMPARE_LOG_RESULT); 5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!comparePass) 5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Image comparison failed"); 5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return STOP; 5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_iterNdx += 1; 5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_iterNdx < m_numIters) 5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return CONTINUE; 5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return STOP; 5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 573c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass BlendAdvancedCoherentStateCase : public TestCase 574c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{ 575c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrypublic: 576c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry BlendAdvancedCoherentStateCase (Context& context, 577c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const char* name, 578c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const char* description, 579c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gls::StateQueryUtil::QueryType type); 580c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryprivate: 581c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry IterateResult iterate (void); 582c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 583c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const gls::StateQueryUtil::QueryType m_type; 584c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}; 585c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 586c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryBlendAdvancedCoherentStateCase::BlendAdvancedCoherentStateCase (Context& context, 587c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const char* name, 588c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const char* description, 589c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gls::StateQueryUtil::QueryType type) 590c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry : TestCase (context, name, description) 591c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry , m_type (type) 592c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{ 593c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry} 594c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 595c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryBlendAdvancedCoherentStateCase::IterateResult BlendAdvancedCoherentStateCase::iterate (void) 596c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{ 597c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry TCU_CHECK_AND_THROW(NotSupportedError, m_context.getContextInfo().isExtensionSupported("GL_KHR_blend_equation_advanced_coherent"), "GL_KHR_blend_equation_advanced_coherent is not supported"); 598c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 599c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 600c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 601c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 602c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gl.enableLogging(true); 603c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 604c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry // check inital value 605c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry { 606c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial"); 607c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gls::StateQueryUtil::verifyStateBoolean(result, gl, GL_BLEND_ADVANCED_COHERENT_KHR, true, m_type); 608c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry } 609c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 610c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry // check toggle 611c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry { 612c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const tcu::ScopedLogSection section(m_testCtx.getLog(), "Toggle", "Toggle"); 613c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gl.glDisable(GL_BLEND_ADVANCED_COHERENT_KHR); 614c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GLU_EXPECT_NO_ERROR(gl.glGetError(), "glDisable"); 615c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 616c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gls::StateQueryUtil::verifyStateBoolean(result, gl, GL_BLEND_ADVANCED_COHERENT_KHR, false, m_type); 617c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 618c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gl.glEnable(GL_BLEND_ADVANCED_COHERENT_KHR); 619c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GLU_EXPECT_NO_ERROR(gl.glGetError(), "glEnable"); 620c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 621c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gls::StateQueryUtil::verifyStateBoolean(result, gl, GL_BLEND_ADVANCED_COHERENT_KHR, true, m_type); 622c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry } 623c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 624c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.setTestContextResult(m_testCtx); 625c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry return STOP; 626c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry} 627c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 628c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass BlendEquationStateCase : public TestCase 629c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{ 630c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrypublic: 631c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry BlendEquationStateCase (Context& context, 632c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const char* name, 633c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const char* description, 634c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const glw::GLenum* equations, 635c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry int numEquations, 636c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gls::StateQueryUtil::QueryType type); 637c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryprivate: 638c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry IterateResult iterate (void); 639c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 640c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const gls::StateQueryUtil::QueryType m_type; 641c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const glw::GLenum* m_equations; 642c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const int m_numEquations; 643c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}; 644c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 645c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryBlendEquationStateCase::BlendEquationStateCase (Context& context, 646c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const char* name, 647c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const char* description, 648c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const glw::GLenum* equations, 649c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry int numEquations, 650c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gls::StateQueryUtil::QueryType type) 651c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry : TestCase (context, name, description) 652c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry , m_type (type) 653c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry , m_equations (equations) 654c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry , m_numEquations (numEquations) 655c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{ 656c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry} 657c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 658c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryBlendEquationStateCase::IterateResult BlendEquationStateCase::iterate (void) 659c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{ 660c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry TCU_CHECK_AND_THROW(NotSupportedError, m_context.getContextInfo().isExtensionSupported("GL_KHR_blend_equation_advanced"), "GL_KHR_blend_equation_advanced is not supported"); 661c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 662c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 663c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 664c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 665c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gl.enableLogging(true); 666c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 667c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry for (int ndx = 0; ndx < m_numEquations; ++ndx) 668c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry { 669c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const tcu::ScopedLogSection section(m_testCtx.getLog(), "Type", "Test " + de::toString(glu::getBlendEquationStr(m_equations[ndx]))); 670c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 671c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gl.glBlendEquation(m_equations[ndx]); 672c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GLU_EXPECT_NO_ERROR(gl.glGetError(), "glBlendEquation"); 673c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 674c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gls::StateQueryUtil::verifyStateInteger(result, gl, GL_BLEND_EQUATION, m_equations[ndx], m_type); 675c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry } 676c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 677c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.setTestContextResult(m_testCtx); 678c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry return STOP; 679c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry} 680c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 681c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryclass BlendEquationIndexedStateCase : public TestCase 682c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{ 683c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrypublic: 684c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry BlendEquationIndexedStateCase (Context& context, 685c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const char* name, 686c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const char* description, 687c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const glw::GLenum* equations, 688c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry int numEquations, 689c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gls::StateQueryUtil::QueryType type); 690c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryprivate: 691c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry IterateResult iterate (void); 692c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 693c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const gls::StateQueryUtil::QueryType m_type; 694c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const glw::GLenum* m_equations; 695c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const int m_numEquations; 696c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry}; 697c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 698c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryBlendEquationIndexedStateCase::BlendEquationIndexedStateCase (Context& context, 699c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const char* name, 700c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const char* description, 701c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const glw::GLenum* equations, 702c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry int numEquations, 703c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gls::StateQueryUtil::QueryType type) 704c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry : TestCase (context, name, description) 705c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry , m_type (type) 706c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry , m_equations (equations) 707c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry , m_numEquations (numEquations) 708c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{ 709c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry} 710c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 711c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko PöyryBlendEquationIndexedStateCase::IterateResult BlendEquationIndexedStateCase::iterate (void) 712c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{ 713c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry TCU_CHECK_AND_THROW(NotSupportedError, m_context.getContextInfo().isExtensionSupported("GL_KHR_blend_equation_advanced"), "GL_KHR_blend_equation_advanced is not supported"); 714c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry TCU_CHECK_AND_THROW(NotSupportedError, m_context.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"), "GL_EXT_draw_buffers_indexed is not supported"); 715c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 716c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry glu::CallLogWrapper gl (m_context.getRenderContext().getFunctions(), m_testCtx.getLog()); 717c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry tcu::ResultCollector result (m_testCtx.getLog(), " // ERROR: "); 718c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 719c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gl.enableLogging(true); 720c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 721c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry for (int ndx = 0; ndx < m_numEquations; ++ndx) 722c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry { 723c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const tcu::ScopedLogSection section(m_testCtx.getLog(), "Type", "Test " + de::toString(glu::getBlendEquationStr(m_equations[ndx]))); 724c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 725c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gl.glBlendEquationi(2, m_equations[ndx]); 726c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GLU_EXPECT_NO_ERROR(gl.glGetError(), "glBlendEquationi"); 727c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 728c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry gls::StateQueryUtil::verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION, 2, m_equations[ndx], m_type); 729c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry } 730c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 731c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.setTestContextResult(m_testCtx); 732c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry return STOP; 733c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry} 734c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous 7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7373c827367444ee418f129b2c238299f49d3264554Jarkko PoyryAdvancedBlendTests::AdvancedBlendTests (Context& context) 7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCaseGroup(context, "blend_equation_advanced", "GL_KHR_blend_equation_advanced Tests") 7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7423c827367444ee418f129b2c238299f49d3264554Jarkko PoyryAdvancedBlendTests::~AdvancedBlendTests (void) 7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid AdvancedBlendTests::init (void) 7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 748c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry static const glw::GLenum s_blendEquations[] = 7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 750c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_MULTIPLY_KHR, 751c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_SCREEN_KHR, 752c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_OVERLAY_KHR, 753c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_DARKEN_KHR, 754c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_LIGHTEN_KHR, 755c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_COLORDODGE_KHR, 756c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_COLORBURN_KHR, 757c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_HARDLIGHT_KHR, 758c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_SOFTLIGHT_KHR, 759c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_DIFFERENCE_KHR, 760c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_EXCLUSION_KHR, 761c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_HSL_HUE_KHR, 762c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_HSL_SATURATION_KHR, 763c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_HSL_COLOR_KHR, 764c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GL_HSL_LUMINOSITY_KHR, 7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 767c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry tcu::TestCaseGroup* const stateQueryGroup = new tcu::TestCaseGroup(m_testCtx, "state_query", "State query tests"); 7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* const basicGroup = new tcu::TestCaseGroup(m_testCtx, "basic", "Single quad only"); 7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* const srgbGroup = new tcu::TestCaseGroup(m_testCtx, "srgb", "Advanced blending with sRGB FBO"); 7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* const msaaGroup = new tcu::TestCaseGroup(m_testCtx, "msaa", "Advanced blending with MSAA FBO"); 7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* const barrierGroup = new tcu::TestCaseGroup(m_testCtx, "barrier", "Multiple overlapping quads with blend barriers"); 7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* const coherentGroup = new tcu::TestCaseGroup(m_testCtx, "coherent", "Overlapping quads with coherent blending"); 7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestCaseGroup* const coherentMsaaGroup = new tcu::TestCaseGroup(m_testCtx, "coherent_msaa", "Overlapping quads with coherent blending with MSAA FBO"); 7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 775c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry addChild(stateQueryGroup); 7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(basicGroup); 7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(srgbGroup); 7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(msaaGroup); 7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(barrierGroup); 7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(coherentGroup); 7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(coherentMsaaGroup); 7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 783c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry // .state_query 784c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry { 785c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry using namespace gls::StateQueryUtil; 786c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 787c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry stateQueryGroup->addChild(new BlendAdvancedCoherentStateCase(m_context, "blend_advanced_coherent_getboolean", "Test BLEND_ADVANCED_COHERENT_KHR", QUERY_BOOLEAN)); 788c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry stateQueryGroup->addChild(new BlendAdvancedCoherentStateCase(m_context, "blend_advanced_coherent_isenabled", "Test BLEND_ADVANCED_COHERENT_KHR", QUERY_ISENABLED)); 789c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry stateQueryGroup->addChild(new BlendAdvancedCoherentStateCase(m_context, "blend_advanced_coherent_getinteger", "Test BLEND_ADVANCED_COHERENT_KHR", QUERY_INTEGER)); 790c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry stateQueryGroup->addChild(new BlendAdvancedCoherentStateCase(m_context, "blend_advanced_coherent_getinteger64", "Test BLEND_ADVANCED_COHERENT_KHR", QUERY_INTEGER64)); 791c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry stateQueryGroup->addChild(new BlendAdvancedCoherentStateCase(m_context, "blend_advanced_coherent_getfloat", "Test BLEND_ADVANCED_COHERENT_KHR", QUERY_FLOAT)); 792c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 793c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry stateQueryGroup->addChild(new BlendEquationStateCase(m_context, "blend_equation_getboolean", "Test BLEND_EQUATION", s_blendEquations, DE_LENGTH_OF_ARRAY(s_blendEquations), QUERY_BOOLEAN)); 794c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry stateQueryGroup->addChild(new BlendEquationStateCase(m_context, "blend_equation_getinteger", "Test BLEND_EQUATION", s_blendEquations, DE_LENGTH_OF_ARRAY(s_blendEquations), QUERY_INTEGER)); 795c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry stateQueryGroup->addChild(new BlendEquationStateCase(m_context, "blend_equation_getinteger64", "Test BLEND_EQUATION", s_blendEquations, DE_LENGTH_OF_ARRAY(s_blendEquations), QUERY_INTEGER64)); 796c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry stateQueryGroup->addChild(new BlendEquationStateCase(m_context, "blend_equation_getfloat", "Test BLEND_EQUATION", s_blendEquations, DE_LENGTH_OF_ARRAY(s_blendEquations), QUERY_FLOAT)); 797c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 798c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry stateQueryGroup->addChild(new BlendEquationIndexedStateCase(m_context, "blend_equation_getbooleani_v", "Test per-attchment BLEND_EQUATION", s_blendEquations, DE_LENGTH_OF_ARRAY(s_blendEquations), QUERY_INDEXED_BOOLEAN)); 799c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry stateQueryGroup->addChild(new BlendEquationIndexedStateCase(m_context, "blend_equation_getintegeri_v", "Test per-attchment BLEND_EQUATION", s_blendEquations, DE_LENGTH_OF_ARRAY(s_blendEquations), QUERY_INDEXED_INTEGER)); 800c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry stateQueryGroup->addChild(new BlendEquationIndexedStateCase(m_context, "blend_equation_getinteger64i_v", "Test per-attchment BLEND_EQUATION", s_blendEquations, DE_LENGTH_OF_ARRAY(s_blendEquations), QUERY_INDEXED_INTEGER64)); 801c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry } 802c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 803c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry // others 804c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry for (int modeNdx = 0; modeNdx < DE_LENGTH_OF_ARRAY(s_blendEquations); modeNdx++) 8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 806c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const char* const name = getEquationName(s_blendEquations[modeNdx]); 8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* const desc = ""; 808c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const deUint32 mode = s_blendEquations[modeNdx]; 8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry basicGroup->addChild (new AdvancedBlendCase(m_context, name, desc, mode, 1, false, RENDERTARGETTYPE_DEFAULT)); 8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry srgbGroup->addChild (new AdvancedBlendCase(m_context, name, desc, mode, 1, false, RENDERTARGETTYPE_SRGB_FBO)); 8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry msaaGroup->addChild (new AdvancedBlendCase(m_context, name, desc, mode, 1, false, RENDERTARGETTYPE_MSAA_FBO)); 8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry barrierGroup->addChild (new AdvancedBlendCase(m_context, name, desc, mode, 4, false, RENDERTARGETTYPE_DEFAULT)); 8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry coherentGroup->addChild (new AdvancedBlendCase(m_context, name, desc, mode, 4, true, RENDERTARGETTYPE_DEFAULT)); 8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry coherentMsaaGroup->addChild (new AdvancedBlendCase(m_context, name, desc, mode, 4, true, RENDERTARGETTYPE_MSAA_FBO)); 8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional 8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles31 8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp 822