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 		int maxRenderbufferSize = 1;
    126 		glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &maxRenderbufferSize);
    127 		expectError(GL_NO_ERROR);
    128 
    129 		const int numIterations = 30;
    130 		for (int i = 0; i < numIterations; ++i)
    131 		{
    132 			const GLint w = rnd.getInt(0, maxRenderbufferSize);
    133 			const GLint h = rnd.getInt(0, maxRenderbufferSize);
    134 
    135 			glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, w, h);
    136 			expectError(GL_NO_ERROR);
    137 
    138 			checkRenderbufferParam(m_testCtx, *this, GL_RENDERBUFFER_WIDTH,		w);
    139 			checkRenderbufferParam(m_testCtx, *this, GL_RENDERBUFFER_HEIGHT,	h);
    140 		}
    141 
    142 		glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
    143 		glDeleteRenderbuffers(1, &renderbufferID);
    144 	}
    145 };
    146 
    147 class RboInternalFormatCase : public ApiCase
    148 {
    149 public:
    150 	RboInternalFormatCase (Context& context, const char* name, const char* description)
    151 		: ApiCase(context, name, description)
    152 	{
    153 	}
    154 
    155 	void test (void)
    156 	{
    157 		GLuint renderbufferID = 0;
    158 		glGenRenderbuffers(1, &renderbufferID);
    159 		glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID);
    160 		expectError(GL_NO_ERROR);
    161 
    162 		checkRenderbufferParam(m_testCtx, *this, GL_RENDERBUFFER_INTERNAL_FORMAT, GL_RGBA4);
    163 		expectError(GL_NO_ERROR);
    164 
    165 		const GLenum requiredColorformats[] =
    166 		{
    167 			GL_RGBA4, GL_RGB5_A1, GL_RGB565
    168 		};
    169 
    170 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(requiredColorformats); ++ndx)
    171 		{
    172 			glRenderbufferStorage(GL_RENDERBUFFER, requiredColorformats[ndx], 1, 1);
    173 			expectError(GL_NO_ERROR);
    174 
    175 			checkRenderbufferParam(m_testCtx, *this, GL_RENDERBUFFER_INTERNAL_FORMAT, requiredColorformats[ndx]);
    176 		}
    177 
    178 		glDeleteRenderbuffers(1, &renderbufferID);
    179 	}
    180 };
    181 
    182 class RboComponentSizeColorCase : public ApiCase
    183 {
    184 public:
    185 	RboComponentSizeColorCase (Context& context, const char* name, const char* description)
    186 		: ApiCase(context, name, description)
    187 	{
    188 	}
    189 
    190 	void test (void)
    191 	{
    192 		GLuint renderbufferID = 0;
    193 		glGenRenderbuffers(1, &renderbufferID);
    194 		glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID);
    195 		expectError(GL_NO_ERROR);
    196 
    197 		checkRenderbufferComponentSize(m_testCtx, *this, 0, 0, 0, 0, 0, 0);
    198 		expectError(GL_NO_ERROR);
    199 
    200 		const struct ColorFormat
    201 		{
    202 			GLenum	internalFormat;
    203 			int		bitsR, bitsG, bitsB, bitsA;
    204 		} requiredColorFormats[] =
    205 		{
    206 			{ GL_RGBA4,			4,	4,	4,	4	},
    207 			{ GL_RGB5_A1,		5,	5,	5,	1	},
    208 			{ GL_RGB565,		5,	6,	5,	0	},
    209 		};
    210 
    211 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(requiredColorFormats); ++ndx)
    212 		{
    213 			glRenderbufferStorage(GL_RENDERBUFFER, requiredColorFormats[ndx].internalFormat, 1, 1);
    214 			expectError(GL_NO_ERROR);
    215 
    216 			checkRenderbufferComponentSize(m_testCtx, *this, requiredColorFormats[ndx].bitsR, requiredColorFormats[ndx].bitsG, requiredColorFormats[ndx].bitsB, requiredColorFormats[ndx].bitsA, -1, -1);
    217 		}
    218 
    219 		glDeleteRenderbuffers(1, &renderbufferID);
    220 	}
    221 };
    222 
    223 class RboComponentSizeDepthCase : public ApiCase
    224 {
    225 public:
    226 	RboComponentSizeDepthCase (Context& context, const char* name, const char* description)
    227 		: ApiCase(context, name, description)
    228 	{
    229 	}
    230 
    231 	void test (void)
    232 	{
    233 		using tcu::TestLog;
    234 
    235 		GLuint renderbufferID = 0;
    236 		glGenRenderbuffers(1, &renderbufferID);
    237 		glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID);
    238 		expectError(GL_NO_ERROR);
    239 
    240 		const struct DepthFormat
    241 		{
    242 			GLenum	internalFormat;
    243 			int		dbits;
    244 			int		sbits;
    245 		} requiredDepthFormats[] =
    246 		{
    247 			{ GL_DEPTH_COMPONENT16,		16, 0 },
    248 		};
    249 
    250 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(requiredDepthFormats); ++ndx)
    251 		{
    252 			glRenderbufferStorage(GL_RENDERBUFFER, requiredDepthFormats[ndx].internalFormat, 1, 1);
    253 			expectError(GL_NO_ERROR);
    254 
    255 			checkRenderbufferComponentSize(m_testCtx, *this, -1, -1, -1, -1, requiredDepthFormats[ndx].dbits, requiredDepthFormats[ndx].sbits);
    256 		}
    257 
    258 		// STENCIL_INDEX8 is required, in that case sBits >= 8
    259 		{
    260 			glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, 1, 1);
    261 			expectError(GL_NO_ERROR);
    262 
    263 			StateQueryMemoryWriteGuard<GLint> state;
    264 			glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_STENCIL_SIZE, &state);
    265 
    266 			if (state.verifyValidity(m_testCtx) && state < 8)
    267 			{
    268 				m_testCtx.getLog() << TestLog::Message << "// ERROR: Expected greater or equal to 8; got " << state << TestLog::EndMessage;
    269 				if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
    270 					m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "got invalid value");
    271 			}
    272 		}
    273 
    274 		glDeleteRenderbuffers(1, &renderbufferID);
    275 	}
    276 };
    277 
    278 } // anonymous
    279 
    280 
    281 RboStateQueryTests::RboStateQueryTests (Context& context)
    282 	: TestCaseGroup(context, "rbo", "Rbo State Query tests")
    283 {
    284 }
    285 
    286 void RboStateQueryTests::init (void)
    287 {
    288 	addChild(new RboSizeCase				(m_context, "renderbuffer_size",					"RENDERBUFFER_WIDTH and RENDERBUFFER_HEIGHT"));
    289 	addChild(new RboInternalFormatCase		(m_context, "renderbuffer_internal_format",			"RENDERBUFFER_INTERNAL_FORMAT"));
    290 	addChild(new RboComponentSizeColorCase	(m_context, "renderbuffer_component_size_color",	"RENDERBUFFER_x_SIZE"));
    291 	addChild(new RboComponentSizeDepthCase	(m_context, "renderbuffer_component_size_depth",	"RENDERBUFFER_x_SIZE"));
    292 }
    293 
    294 } // Functional
    295 } // gles2
    296 } // deqp
    297