Home | History | Annotate | Download | only in functional
      1 /*-------------------------------------------------------------------------
      2  * drawElements Quality Program OpenGL ES 3.1 Module
      3  * -------------------------------------------------
      4  *
      5  * Copyright 2014 The Android Open Source Project
      6  *
      7  * Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  *
     19  *//*!
     20  * \file
     21  * \brief Multisample interpolation state query tests
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "es31fShaderMultisampleInterpolationStateQueryTests.hpp"
     25 #include "tcuTestLog.hpp"
     26 #include "gluCallLogWrapper.hpp"
     27 #include "gluContextInfo.hpp"
     28 #include "gluRenderContext.hpp"
     29 #include "glsStateQueryUtil.hpp"
     30 #include "glwEnums.hpp"
     31 #include "glwFunctions.hpp"
     32 
     33 
     34 namespace deqp
     35 {
     36 namespace gles31
     37 {
     38 namespace Functional
     39 {
     40 namespace
     41 {
     42 
     43 using namespace gls::StateQueryUtil;
     44 
     45 class InterpolationOffsetCase : public TestCase
     46 {
     47 public:
     48 	enum TestType
     49 	{
     50 		TEST_MIN_OFFSET = 0,
     51 		TEST_MAX_OFFSET,
     52 
     53 		TEST_LAST
     54 	};
     55 
     56 						InterpolationOffsetCase		(Context& context, const char* name, const char* desc, QueryType verifier, TestType testType);
     57 						~InterpolationOffsetCase	(void);
     58 
     59 	void				init						(void);
     60 	IterateResult		iterate						(void);
     61 
     62 private:
     63 	const QueryType		m_verifier;
     64 	const TestType		m_testType;
     65 };
     66 
     67 InterpolationOffsetCase::InterpolationOffsetCase (Context& context, const char* name, const char* desc, QueryType verifier, TestType testType)
     68 	: TestCase		(context, name, desc)
     69 	, m_verifier	(verifier)
     70 	, m_testType	(testType)
     71 {
     72 	DE_ASSERT(m_testType < TEST_LAST);
     73 }
     74 
     75 InterpolationOffsetCase::~InterpolationOffsetCase (void)
     76 {
     77 }
     78 
     79 void InterpolationOffsetCase::init (void)
     80 {
     81 	if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
     82 		throw tcu::NotSupportedError("Test requires GL_OES_shader_multisample_interpolation extension");
     83 }
     84 
     85 InterpolationOffsetCase::IterateResult InterpolationOffsetCase::iterate (void)
     86 {
     87 	glu::CallLogWrapper 	gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
     88 	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
     89 	gl.enableLogging(true);
     90 
     91 	if (m_testType == TEST_MAX_OFFSET)
     92 		verifyStateFloatMin(result, gl, GL_MAX_FRAGMENT_INTERPOLATION_OFFSET, 0.5, m_verifier);
     93 	else if (m_testType == TEST_MIN_OFFSET)
     94 		verifyStateFloatMax(result, gl, GL_MIN_FRAGMENT_INTERPOLATION_OFFSET, -0.5, m_verifier);
     95 	else
     96 		DE_ASSERT(false);
     97 
     98 	result.setTestContextResult(m_testCtx);
     99 	return STOP;
    100 }
    101 
    102 class FragmentInterpolationOffsetBitsCase : public TestCase
    103 {
    104 public:
    105 						FragmentInterpolationOffsetBitsCase		(Context& context, const char* name, const char* desc, QueryType verifier);
    106 						~FragmentInterpolationOffsetBitsCase	(void);
    107 
    108 	void				init									(void);
    109 	IterateResult		iterate									(void);
    110 
    111 private:
    112 	const QueryType		m_verifier;
    113 };
    114 
    115 FragmentInterpolationOffsetBitsCase::FragmentInterpolationOffsetBitsCase (Context& context, const char* name, const char* desc, QueryType verifier)
    116 	: TestCase		(context, name, desc)
    117 	, m_verifier	(verifier)
    118 {
    119 }
    120 
    121 FragmentInterpolationOffsetBitsCase::~FragmentInterpolationOffsetBitsCase (void)
    122 {
    123 }
    124 
    125 void FragmentInterpolationOffsetBitsCase::init (void)
    126 {
    127 	if (!m_context.getContextInfo().isExtensionSupported("GL_OES_shader_multisample_interpolation"))
    128 		throw tcu::NotSupportedError("Test requires GL_OES_shader_multisample_interpolation extension");
    129 }
    130 
    131 FragmentInterpolationOffsetBitsCase::IterateResult FragmentInterpolationOffsetBitsCase::iterate (void)
    132 {
    133 	glu::CallLogWrapper 	gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
    134 	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
    135 	gl.enableLogging(true);
    136 
    137 	verifyStateIntegerMin(result, gl, GL_FRAGMENT_INTERPOLATION_OFFSET_BITS, 4, m_verifier);
    138 
    139 	result.setTestContextResult(m_testCtx);
    140 	return STOP;
    141 }
    142 
    143 } // anonymous
    144 
    145 ShaderMultisampleInterpolationStateQueryTests::ShaderMultisampleInterpolationStateQueryTests (Context& context)
    146 	: TestCaseGroup(context, "multisample_interpolation", "Test multisample interpolation states")
    147 {
    148 }
    149 
    150 ShaderMultisampleInterpolationStateQueryTests::~ShaderMultisampleInterpolationStateQueryTests (void)
    151 {
    152 }
    153 
    154 void ShaderMultisampleInterpolationStateQueryTests::init (void)
    155 {
    156 	static const struct Verifier
    157 	{
    158 		QueryType		verifier;
    159 		const char*		name;
    160 		const char*		desc;
    161 	} verifiers[] =
    162 	{
    163 		{ QUERY_BOOLEAN,	"get_boolean",		"Test using getBoolean"		},
    164 		{ QUERY_INTEGER,	"get_integer",		"Test using getInteger"		},
    165 		{ QUERY_FLOAT,		"get_float",		"Test using getFloat"		},
    166 		{ QUERY_INTEGER64,	"get_integer64",	"Test using getInteger64"	},
    167 	};
    168 
    169 	// .min_fragment_interpolation_offset
    170 	{
    171 		tcu::TestCaseGroup* const group = new tcu::TestCaseGroup(m_testCtx, "min_fragment_interpolation_offset", "Test MIN_FRAGMENT_INTERPOLATION_OFFSET");
    172 		addChild(group);
    173 
    174 		for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx)
    175 			group->addChild(new InterpolationOffsetCase(m_context, verifiers[verifierNdx].name, verifiers[verifierNdx].desc, verifiers[verifierNdx].verifier, InterpolationOffsetCase::TEST_MIN_OFFSET));
    176 	}
    177 
    178 	// .max_fragment_interpolation_offset
    179 	{
    180 		tcu::TestCaseGroup* const group = new tcu::TestCaseGroup(m_testCtx, "max_fragment_interpolation_offset", "Test MAX_FRAGMENT_INTERPOLATION_OFFSET");
    181 		addChild(group);
    182 
    183 		for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx)
    184 			group->addChild(new InterpolationOffsetCase(m_context, verifiers[verifierNdx].name, verifiers[verifierNdx].desc, verifiers[verifierNdx].verifier, InterpolationOffsetCase::TEST_MAX_OFFSET));
    185 	}
    186 
    187 	// .fragment_interpolation_offset_bits
    188 	{
    189 		tcu::TestCaseGroup* const group = new tcu::TestCaseGroup(m_testCtx, "fragment_interpolation_offset_bits", "Test FRAGMENT_INTERPOLATION_OFFSET_BITS");
    190 		addChild(group);
    191 
    192 		for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx)
    193 			group->addChild(new FragmentInterpolationOffsetBitsCase(m_context, verifiers[verifierNdx].name, verifiers[verifierNdx].desc, verifiers[verifierNdx].verifier));
    194 	}
    195 }
    196 
    197 } // Functional
    198 } // gles31
    199 } // deqp
    200