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
33using namespace glw; // GLint and other GL types
34using deqp::gls::StateQueryUtil::StateQueryMemoryWriteGuard;
35
36
37namespace deqp
38{
39namespace gles2
40{
41namespace Functional
42{
43namespace
44{
45
46void 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
58void 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
67void 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
72class AttachmentObjectCase : public ApiCase
73{
74public:
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
128class AttachmentTextureLevelCase : public ApiCase
129{
130public:
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
166class AttachmentTextureCubeMapFaceCase : public ApiCase
167{
168public:
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
216FboStateQueryTests::FboStateQueryTests (Context& context)
217	: TestCaseGroup(context, "fbo", "Fbo State Query tests")
218{
219}
220
221void 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