Home | History | Annotate | Download | only in functional
      1 /*-------------------------------------------------------------------------
      2  * drawElements Quality Program OpenGL ES 2.0 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 Rbo state query tests.
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "es2fRboStateQueryTests.hpp"
     25 #include "glsStateQueryUtil.hpp"
     26 #include "es2fApiCase.hpp"
     27 #include "gluRenderContext.hpp"
     28 #include "glwEnums.hpp"
     29 #include "glwFunctions.hpp"
     30 #include "deRandom.hpp"
     31 #include "deMath.h"
     32 
     33 using namespace glw; // GLint and other GL types
     34 using deqp::gls::StateQueryUtil::StateQueryMemoryWriteGuard;
     35 
     36 
     37 namespace deqp
     38 {
     39 namespace gles2
     40 {
     41 namespace Functional
     42 {
     43 namespace
     44 {
     45 
     46 void checkRenderbufferComponentSize (tcu::TestContext& testCtx, glu::CallLogWrapper& gl, int r, int g, int b, int a, int d, int s)
     47 {
     48 	using tcu::TestLog;
     49 
     50 	const int referenceSizes[] = {r, g, b, a, d, s};
     51 	const GLenum paramNames[] =
     52 	{
     53 		GL_RENDERBUFFER_RED_SIZE,
     54 		GL_RENDERBUFFER_GREEN_SIZE,
     55 		GL_RENDERBUFFER_BLUE_SIZE,
     56 		GL_RENDERBUFFER_ALPHA_SIZE,
     57 		GL_RENDERBUFFER_DEPTH_SIZE,
     58 		GL_RENDERBUFFER_STENCIL_SIZE
     59 	};
     60 
     61 	DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(referenceSizes) == DE_LENGTH_OF_ARRAY(paramNames));
     62 
     63 	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(referenceSizes); ++ndx)
     64 	{
     65 		if (referenceSizes[ndx] == -1)
     66 			continue;
     67 
     68 		StateQueryMemoryWriteGuard<GLint> state;
     69 		gl.glGetRenderbufferParameteriv(GL_RENDERBUFFER, paramNames[ndx], &state);
     70 
     71 		if (!state.verifyValidity(testCtx))
     72 			return;
     73 
     74 		if (state < referenceSizes[ndx])
     75 		{
     76 			testCtx.getLog() << TestLog::Message << "// ERROR: Expected greater or equal to " << referenceSizes[ndx] << "; got " << state << TestLog::EndMessage;
     77 			if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
     78 				testCtx.setTestResult(QP_TEST_RESULT_FAIL, "got invalid value");
     79 		}
     80 	}
     81 }
     82 
     83 void checkIntEquals (tcu::TestContext& testCtx, GLint got, GLint expected)
     84 {
     85 	using tcu::TestLog;
     86 
     87 	if (got != expected)
     88 	{
     89 		testCtx.getLog() << TestLog::Message << "// ERROR: Expected " << expected << "; got " << got << TestLog::EndMessage;
     90 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
     91 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "got invalid value");
     92 	}
     93 }
     94 
     95 void checkRenderbufferParam (tcu::TestContext& testCtx, glu::CallLogWrapper& gl, GLenum pname, GLenum reference)
     96 {
     97 	StateQueryMemoryWriteGuard<GLint> state;
     98 	gl.glGetRenderbufferParameteriv(GL_RENDERBUFFER, pname, &state);
     99 
    100 	if (state.verifyValidity(testCtx))
    101 		checkIntEquals(testCtx, state, reference);
    102 }
    103 
    104 class RboSizeCase : public ApiCase
    105 {
    106 public:
    107 	RboSizeCase (Context& context, const char* name, const char* description)
    108 		: ApiCase(context, name, description)
    109 	{
    110 	}
    111 
    112 	void test (void)
    113 	{
    114 		de::Random rnd(0xabcdef);
    115 
    116 		GLuint renderbufferID = 0;
    117 		glGenRenderbuffers(1, &renderbufferID);
    118 		glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID);
    119 		expectError(GL_NO_ERROR);
    120 
    121 		checkRenderbufferParam(m_testCtx, *this, GL_RENDERBUFFER_WIDTH,		0);
    122 		checkRenderbufferParam(m_testCtx, *this, GL_RENDERBUFFER_HEIGHT,	0);
    123 		expectError(GL_NO_ERROR);
    124 
    125 		const int numIterations = 30;
    126 		for (int i = 0; i < numIterations; ++i)
    127 		{
    128 			const GLint w = rnd.getInt(0, 128);
    129 			const GLint h = rnd.getInt(0, 128);
    130 
    131 			glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, w, h);
    132 			expectError(GL_NO_ERROR);
    133 
    134 			checkRenderbufferParam(m_testCtx, *this, GL_RENDERBUFFER_WIDTH,		w);
    135 			checkRenderbufferParam(m_testCtx, *this, GL_RENDERBUFFER_HEIGHT,	h);
    136 		}
    137 
    138 		glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
    139 		glDeleteRenderbuffers(1, &renderbufferID);
    140 	}
    141 };
    142 
    143 class RboInternalFormatCase : public ApiCase
    144 {
    145 public:
    146 	RboInternalFormatCase (Context& context, const char* name, const char* description)
    147 		: ApiCase(context, name, description)
    148 	{
    149 	}
    150 
    151 	void test (void)
    152 	{
    153 		GLuint renderbufferID = 0;
    154 		glGenRenderbuffers(1, &renderbufferID);
    155 		glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID);
    156 		expectError(GL_NO_ERROR);
    157 
    158 		checkRenderbufferParam(m_testCtx, *this, GL_RENDERBUFFER_INTERNAL_FORMAT, GL_RGBA4);
    159 		expectError(GL_NO_ERROR);
    160 
    161 		const GLenum requiredColorformats[] =
    162 		{
    163 			GL_RGBA4, GL_RGB5_A1, GL_RGB565
    164 		};
    165 
    166 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(requiredColorformats); ++ndx)
    167 		{
    168 			glRenderbufferStorage(GL_RENDERBUFFER, requiredColorformats[ndx], 1, 1);
    169 			expectError(GL_NO_ERROR);
    170 
    171 			checkRenderbufferParam(m_testCtx, *this, GL_RENDERBUFFER_INTERNAL_FORMAT, requiredColorformats[ndx]);
    172 		}
    173 
    174 		glDeleteRenderbuffers(1, &renderbufferID);
    175 	}
    176 };
    177 
    178 class RboComponentSizeColorCase : public ApiCase
    179 {
    180 public:
    181 	RboComponentSizeColorCase (Context& context, const char* name, const char* description)
    182 		: ApiCase(context, name, description)
    183 	{
    184 	}
    185 
    186 	void test (void)
    187 	{
    188 		GLuint renderbufferID = 0;
    189 		glGenRenderbuffers(1, &renderbufferID);
    190 		glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID);
    191 		expectError(GL_NO_ERROR);
    192 
    193 		checkRenderbufferComponentSize(m_testCtx, *this, 0, 0, 0, 0, 0, 0);
    194 		expectError(GL_NO_ERROR);
    195 
    196 		const struct ColorFormat
    197 		{
    198 			GLenum	internalFormat;
    199 			int		bitsR, bitsG, bitsB, bitsA;
    200 		} requiredColorFormats[] =
    201 		{
    202 			{ GL_RGBA4,			4,	4,	4,	4	},
    203 			{ GL_RGB5_A1,		5,	5,	5,	1	},
    204 			{ GL_RGB565,		5,	6,	5,	0	},
    205 		};
    206 
    207 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(requiredColorFormats); ++ndx)
    208 		{
    209 			glRenderbufferStorage(GL_RENDERBUFFER, requiredColorFormats[ndx].internalFormat, 1, 1);
    210 			expectError(GL_NO_ERROR);
    211 
    212 			checkRenderbufferComponentSize(m_testCtx, *this, requiredColorFormats[ndx].bitsR, requiredColorFormats[ndx].bitsG, requiredColorFormats[ndx].bitsB, requiredColorFormats[ndx].bitsA, -1, -1);
    213 		}
    214 
    215 		glDeleteRenderbuffers(1, &renderbufferID);
    216 	}
    217 };
    218 
    219 class RboComponentSizeDepthCase : public ApiCase
    220 {
    221 public:
    222 	RboComponentSizeDepthCase (Context& context, const char* name, const char* description)
    223 		: ApiCase(context, name, description)
    224 	{
    225 	}
    226 
    227 	void test (void)
    228 	{
    229 		using tcu::TestLog;
    230 
    231 		GLuint renderbufferID = 0;
    232 		glGenRenderbuffers(1, &renderbufferID);
    233 		glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID);
    234 		expectError(GL_NO_ERROR);
    235 
    236 		const struct DepthFormat
    237 		{
    238 			GLenum	internalFormat;
    239 			int		dbits;
    240 			int		sbits;
    241 		} requiredDepthFormats[] =
    242 		{
    243 			{ GL_DEPTH_COMPONENT16,		16, 0 },
    244 		};
    245 
    246 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(requiredDepthFormats); ++ndx)
    247 		{
    248 			glRenderbufferStorage(GL_RENDERBUFFER, requiredDepthFormats[ndx].internalFormat, 1, 1);
    249 			expectError(GL_NO_ERROR);
    250 
    251 			checkRenderbufferComponentSize(m_testCtx, *this, -1, -1, -1, -1, requiredDepthFormats[ndx].dbits, requiredDepthFormats[ndx].sbits);
    252 		}
    253 
    254 		// STENCIL_INDEX8 is required, in that case sBits >= 8
    255 		{
    256 			glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, 1, 1);
    257 			expectError(GL_NO_ERROR);
    258 
    259 			StateQueryMemoryWriteGuard<GLint> state;
    260 			glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_STENCIL_SIZE, &state);
    261 
    262 			if (state.verifyValidity(m_testCtx) && state < 8)
    263 			{
    264 				m_testCtx.getLog() << TestLog::Message << "// ERROR: Expected greater or equal to 8; got " << state << TestLog::EndMessage;
    265 				if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    266 					m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "got invalid value");
    267 			}
    268 		}
    269 
    270 		glDeleteRenderbuffers(1, &renderbufferID);
    271 	}
    272 };
    273 
    274 } // anonymous
    275 
    276 
    277 RboStateQueryTests::RboStateQueryTests (Context& context)
    278 	: TestCaseGroup(context, "rbo", "Rbo State Query tests")
    279 {
    280 }
    281 
    282 void RboStateQueryTests::init (void)
    283 {
    284 	addChild(new RboSizeCase				(m_context, "renderbuffer_size",					"RENDERBUFFER_WIDTH and RENDERBUFFER_HEIGHT"));
    285 	addChild(new RboInternalFormatCase		(m_context, "renderbuffer_internal_format",			"RENDERBUFFER_INTERNAL_FORMAT"));
    286 	addChild(new RboComponentSizeColorCase	(m_context, "renderbuffer_component_size_color",	"RENDERBUFFER_x_SIZE"));
    287 	addChild(new RboComponentSizeDepthCase	(m_context, "renderbuffer_component_size_depth",	"RENDERBUFFER_x_SIZE"));
    288 }
    289 
    290 } // Functional
    291 } // gles2
    292 } // deqp
    293