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 Fbo state query tests.
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "es2fFboStateQueryTests.hpp"
     25 #include "glsStateQueryUtil.hpp"
     26 #include "es2fApiCase.hpp"
     27 #include "gluRenderContext.hpp"
     28 #include "glwEnums.hpp"
     29 #include "glwFunctions.hpp"
     30 #include "tcuRenderTarget.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 checkIntEquals (tcu::TestContext& testCtx, GLint got, GLint expected)
     47 {
     48 	using tcu::TestLog;
     49 
     50 	if (got != expected)
     51 	{
     52 		testCtx.getLog() << TestLog::Message << "// ERROR: Expected " << expected << "; got " << got << TestLog::EndMessage;
     53 		if (testCtx.getTestResult() == QP_TEST_RESULT_PASS)
     54 			testCtx.setTestResult(QP_TEST_RESULT_FAIL, "got invalid value");
     55 	}
     56 }
     57 
     58 void checkAttachmentParam(tcu::TestContext& testCtx, glu::CallLogWrapper& gl, GLenum target, GLenum attachment, GLenum pname, GLenum reference)
     59 {
     60 	StateQueryMemoryWriteGuard<GLint> state;
     61 	gl.glGetFramebufferAttachmentParameteriv(target, attachment, pname, &state);
     62 
     63 	if (state.verifyValidity(testCtx))
     64 		checkIntEquals(testCtx, state, reference);
     65 }
     66 
     67 void checkColorAttachmentParam(tcu::TestContext& testCtx, glu::CallLogWrapper& gl, GLenum target, GLenum pname, GLenum reference)
     68 {
     69 	checkAttachmentParam(testCtx, gl, target, GL_COLOR_ATTACHMENT0, pname, reference);
     70 }
     71 
     72 class AttachmentObjectCase : public ApiCase
     73 {
     74 public:
     75 	AttachmentObjectCase (Context& context, const char* name, const char* description)
     76 		: ApiCase(context, name, description)
     77 	{
     78 	}
     79 
     80 	void test (void)
     81 	{
     82 		GLuint framebufferID = 0;
     83 		glGenFramebuffers(1, &framebufferID);
     84 		glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
     85 		expectError(GL_NO_ERROR);
     86 
     87 		// texture
     88 		{
     89 			GLuint textureID = 0;
     90 			glGenTextures(1, &textureID);
     91 			glBindTexture(GL_TEXTURE_2D, textureID);
     92 			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
     93 			expectError(GL_NO_ERROR);
     94 
     95 			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0);
     96 			expectError(GL_NO_ERROR);
     97 
     98 			checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_TEXTURE);
     99 			checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, textureID);
    100 
    101 			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
    102 			glDeleteTextures(1, &textureID);
    103 		}
    104 
    105 		// rb
    106 		{
    107 			GLuint renderbufferID = 0;
    108 			glGenRenderbuffers(1, &renderbufferID);
    109 			glBindRenderbuffer(GL_RENDERBUFFER, renderbufferID);
    110 			glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, 128, 128);
    111 			expectError(GL_NO_ERROR);
    112 
    113 			glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbufferID);
    114 			expectError(GL_NO_ERROR);
    115 
    116 			checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_RENDERBUFFER);
    117 			checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, renderbufferID);
    118 
    119 			glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
    120 			glDeleteRenderbuffers(1, &renderbufferID);
    121 		}
    122 
    123 		glDeleteFramebuffers(1, &framebufferID);
    124 		expectError(GL_NO_ERROR);
    125 	}
    126 };
    127 
    128 class AttachmentTextureLevelCase : public ApiCase
    129 {
    130 public:
    131 	AttachmentTextureLevelCase (Context& context, const char* name, const char* description)
    132 		: ApiCase(context, name, description)
    133 	{
    134 	}
    135 
    136 	void test (void)
    137 	{
    138 		GLuint framebufferID = 0;
    139 		glGenFramebuffers(1, &framebufferID);
    140 		glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
    141 		expectError(GL_NO_ERROR);
    142 
    143 		// GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL can only be 0
    144 		{
    145 			GLuint textureID = 0;
    146 
    147 			glGenTextures(1, &textureID);
    148 			glBindTexture(GL_TEXTURE_2D, textureID);
    149 			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 64, 64, 0, GL_RGB, GL_UNSIGNED_BYTE, DE_NULL);
    150 			expectError(GL_NO_ERROR);
    151 
    152 			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0);
    153 			expectError(GL_NO_ERROR);
    154 
    155 			checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, 0);
    156 
    157 			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
    158 			glDeleteTextures(1, &textureID);
    159 		}
    160 
    161 		glDeleteFramebuffers(1, &framebufferID);
    162 		expectError(GL_NO_ERROR);
    163 	}
    164 };
    165 
    166 class AttachmentTextureCubeMapFaceCase : public ApiCase
    167 {
    168 public:
    169 	AttachmentTextureCubeMapFaceCase (Context& context, const char* name, const char* description)
    170 		: ApiCase(context, name, description)
    171 	{
    172 	}
    173 
    174 	void test (void)
    175 	{
    176 		GLuint framebufferID = 0;
    177 		glGenFramebuffers(1, &framebufferID);
    178 		glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
    179 		expectError(GL_NO_ERROR);
    180 
    181 		{
    182 			GLuint textureID = 0;
    183 			glGenTextures(1, &textureID);
    184 			glBindTexture(GL_TEXTURE_CUBE_MAP, textureID);
    185 			expectError(GL_NO_ERROR);
    186 
    187 			const GLenum faces[] =
    188 			{
    189 				GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
    190 				GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
    191 				GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
    192 			};
    193 
    194 			for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(faces); ++ndx)
    195 				glTexImage2D(faces[ndx], 0, GL_RGB, 64, 64, 0, GL_RGB, GL_UNSIGNED_BYTE, DE_NULL);
    196 			expectError(GL_NO_ERROR);
    197 
    198 			for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(faces); ++ndx)
    199 			{
    200 				glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, faces[ndx], textureID, 0);
    201 				checkColorAttachmentParam(m_testCtx, *this, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, faces[ndx]);
    202 			}
    203 
    204 			glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
    205 			glDeleteTextures(1, &textureID);
    206 		}
    207 
    208 		glDeleteFramebuffers(1, &framebufferID);
    209 		expectError(GL_NO_ERROR);
    210 	}
    211 };
    212 
    213 } // anonymous
    214 
    215 
    216 FboStateQueryTests::FboStateQueryTests (Context& context)
    217 	: TestCaseGroup(context, "fbo", "Fbo State Query tests")
    218 {
    219 }
    220 
    221 void FboStateQueryTests::init (void)
    222 {
    223 	addChild(new AttachmentObjectCase				(m_context, "framebuffer_attachment_object",				"FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE and FRAMEBUFFER_ATTACHMENT_OBJECT_NAME"));
    224 	addChild(new AttachmentTextureLevelCase			(m_context, "framebuffer_attachment_texture_level",			"FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL"));
    225 	addChild(new AttachmentTextureCubeMapFaceCase	(m_context, "framebuffer_attachment_texture_cube_map_face",	"FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE"));
    226 }
    227 
    228 } // Functional
    229 } // gles2
    230 } // deqp
    231