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