1bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/*-------------------------------------------------------------------------
2bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * OpenGL Conformance Test Suite
3bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * -----------------------------
4bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
5bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * Copyright (c) 2017 The Khronos Group Inc.
6bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
7bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * Licensed under the Apache License, Version 2.0 (the "License");
8bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * you may not use this file except in compliance with the License.
9bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * You may obtain a copy of the License at
10bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
11bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *      http://www.apache.org/licenses/LICENSE-2.0
12bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
13bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * Unless required by applicable law or agreed to in writing, software
14bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * distributed under the License is distributed on an "AS IS" BASIS,
15bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * See the License for the specific language governing permissions and
17bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * limitations under the License.
18bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
19bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */ /*!
20bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * \file
21bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * \brief
22bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */ /*-------------------------------------------------------------------*/
23bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
24bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/**
25bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */ /*!
26bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * \file  glcTextureFilterAnisotropicTests.cpp
27bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * \brief Conformance tests for the GL_EXT_texture_filter_anisotropic functionality.
28bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */ /*-------------------------------------------------------------------*/
29bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
30bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna#include "deMath.h"
31bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
32bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna#include "glcTextureFilterAnisotropicTests.hpp"
33bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna#include "gluContextInfo.hpp"
34bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna#include "gluDefs.hpp"
35bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna#include "gluShaderProgram.hpp"
36bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna#include "gluStrUtil.hpp"
37bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna#include "gluTextureUtil.hpp"
38bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna#include "glwEnums.hpp"
39bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna#include "glwFunctions.hpp"
40bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna#include "tcuRGBA.hpp"
41bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna#include "tcuRenderTarget.hpp"
42bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna#include "tcuTestLog.hpp"
43bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna#include "tcuTexture.hpp"
44bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
45bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynausing namespace glw;
46bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynausing namespace glu;
47bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
48bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynanamespace glcts
49bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
50bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
51bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynanamespace TextureFilterAnisotropicUtils
52bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
53bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
54bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Replace all occurrence of <token> with <text> in <str>
55bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
56bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param token           Token string
57bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param text            String that will be used as replacement for <token>
58bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param string          String to work on
59bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna **/
60bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynavoid replaceToken(const GLchar* token, const GLchar* text, std::string& str)
61bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
62bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	const size_t text_length  = strlen(text);
63bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	const size_t token_length = strlen(token);
64bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
65bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	size_t token_position;
66bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	while ((token_position = str.find(token, 0)) != std::string::npos)
67bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
68bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		str.replace(token_position, token_length, text, text_length);
69bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
70bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
71bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
72bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Allocate storage for texture
73bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
74bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param target           Texture target
75bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param refTexCoordType  GLSL texture coord type
76bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param refSamplerType   GLSL texture sampler type
77bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna **/
78bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynavoid generateTokens(GLenum target, std::string& refTexCoordType, std::string& refSamplerType)
79bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
80bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	switch (target)
81bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
82bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	case GL_TEXTURE_2D:
83bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		refTexCoordType = "vec2";
84bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		refSamplerType  = "sampler2D";
85bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		break;
86bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	case GL_TEXTURE_2D_ARRAY:
87bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		refTexCoordType = "vec3";
88bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		refSamplerType  = "sampler2DArray";
89bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		break;
90bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	default:
91bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		refTexCoordType = "vec2";
92bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		refSamplerType  = "sampler2D";
93bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		break;
94bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
95bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
96bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
97bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Set contents of texture
98bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
99bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param gl              GL functions
100bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param target          Texture target
101bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param level           Mipmap level
102bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param internal_format Format of data
103bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param width           Width of texture
104bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param height          Height of texture
105bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param depth           Depth of texture
106bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param format          Format of data
107bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param type            Type of data
108bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param data            Buffer with image data
109bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna **/
110bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynavoid texImage(const Functions& gl, GLenum target, GLint level, GLenum internal_format, GLuint width, GLuint height,
111bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			  GLuint depth, GLenum format, GLenum type, const GLvoid* data)
112bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
113bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	switch (target)
114bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
115bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	case GL_TEXTURE_2D:
116bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		gl.texImage2D(target, level, internal_format, width, height, 0 /* border */, format, type, data);
117bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		GLU_EXPECT_NO_ERROR(gl.getError(), "texImage");
118bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		break;
119bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	case GL_TEXTURE_2D_ARRAY:
120bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		gl.texImage3D(target, level, internal_format, width, height, depth, 0 /* border */, format, type, data);
121bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		GLU_EXPECT_NO_ERROR(gl.getError(), "texImage");
122bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		break;
123bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	default:
124bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		TCU_FAIL("Invalid enum");
125bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		break;
126bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
127bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
128bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
129bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Set contents of texture
130bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
131bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param gl              GL functions
132bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param target          Texture target
133bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param level           Mipmap level
134bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param x               X offset
135bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param y               Y offset
136bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param z               Z offset
137bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param width           Width of texture
138bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param height          Height of texture
139bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param depth           Depth of texture
140bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param format          Format of data
141bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param type            Type of data
142bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna * @param pixels          Buffer with image data
143bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna **/
144bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynavoid subImage(const Functions& gl, GLenum target, GLint level, GLint x, GLint y, GLint z, GLsizei width, GLsizei height,
145bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			  GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels)
146bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
147bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	switch (target)
148bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
149bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	case GL_TEXTURE_2D:
150bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		gl.texSubImage2D(target, level, x, y, width, height, format, type, pixels);
151bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		GLU_EXPECT_NO_ERROR(gl.getError(), "TexSubImage2D");
152bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		break;
153bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	case GL_TEXTURE_2D_ARRAY:
154bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		gl.texSubImage3D(target, level, x, y, z, width, height, depth, format, type, pixels);
155bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		GLU_EXPECT_NO_ERROR(gl.getError(), "TexSubImage3D");
156bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		break;
157bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	default:
158bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		TCU_FAIL("Invalid enum");
159bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		break;
160bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
161bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
162bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
163bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna} // TextureFilterAnisotropicUtils namespace
164bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
165bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Constructor.
166bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
167bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param context     Rendering context
168bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */
169bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam CzuprynaTextureFilterAnisotropicQueriesTestCase::TextureFilterAnisotropicQueriesTestCase(deqp::Context& context)
170bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	: TestCase(context, "queries", "Verifies if queries for GL_EXT_texture_filter_anisotropic tokens works as expected")
171bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
172bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	/* Left blank intentionally */
173bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
174bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
175bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Stub deinit method. */
176bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynavoid TextureFilterAnisotropicQueriesTestCase::deinit()
177bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
178bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
179bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
180bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Stub init method */
181bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynavoid TextureFilterAnisotropicQueriesTestCase::init()
182bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
1835e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	glu::ContextType contextType = m_context.getRenderContext().getType();
1845e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	if (!glu::contextSupports(contextType, glu::ApiType::core(4, 6)) &&
1855e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski		!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_filter_anisotropic") &&
1865e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski		!m_context.getContextInfo().isExtensionSupported("GL_ARB_texture_filter_anisotropic"))
1875e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	{
1885e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski		TCU_THROW(NotSupportedError, "texture filter anisotropic functionality not supported");
1895e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	}
190bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
191bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
192bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Executes test iteration.
193bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
194bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
195bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */
196bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynatcu::TestNode::IterateResult TextureFilterAnisotropicQueriesTestCase::iterate()
197bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
198bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
199bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
200bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLuint texture;
201bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.genTextures(1, &texture);
202bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "genTextures");
203bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.bindTexture(GL_TEXTURE_2D, texture);
204bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "bindTexture");
205bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	TextureFilterAnisotropicUtils::texImage(gl, GL_TEXTURE_2D, 0, GL_RGBA8, 16, 16, 1, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
206bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
207bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (verifyTexParameters(gl) && verifyGet(gl))
208bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
209bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	else
210bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
211bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
212bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.deleteTextures(1, &texture);
213bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "deleteTextures");
214bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
215bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	return STOP;
216bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
217bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
218bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Verify if texParameter*, getTexParameter* queries for GL_TEXTURE_MAX_ANISOTROPY_EXT pname works as expected.
219bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
220bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param gl   OpenGL functions wrapper
221bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
222bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @return Returns true if queries test passed, false otherwise.
223bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */
224bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynabool TextureFilterAnisotropicQueriesTestCase::verifyTexParameters(const glw::Functions& gl)
225bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
226bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLint iValue;
227bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.getTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &iValue);
228bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "getTexParameteriv");
229bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
230bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	// Verify initial integer value which should be equal to 1
231bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (iValue != 1)
232bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
233bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		m_testCtx.getLog() << tcu::TestLog::Message
234bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << "GetTexParameteriv failed. Expected value: 1, Queried value: " << iValue
235bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << tcu::TestLog::EndMessage;
236bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		return false;
237bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
238bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
239bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLfloat fValue;
240bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.getTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &fValue);
241bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "getTexParameterfv");
242bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
243bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	// Verify initial float value which should be equal to 1.0f
244bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (fValue != 1.0f)
245bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
246bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		m_testCtx.getLog() << tcu::TestLog::Message
247bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << "GetTexParameterfv failed. Expected value: 1.0, Queried value: " << iValue
248bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << tcu::TestLog::EndMessage;
249bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		return false;
250bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
251bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
252bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	// Set custom integer value and verify it
253bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	iValue = 2;
254bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, iValue);
255bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "texParameteri");
256bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
257bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.getTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &iValue);
258bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "getTexParameteriv");
259bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
260bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (iValue != 2)
261bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
262bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		m_testCtx.getLog() << tcu::TestLog::Message
263bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << "texParameteri failed. Expected value: 2, Queried value: " << iValue
264bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << tcu::TestLog::EndMessage;
265bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		return false;
266bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
267bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
268bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	// Set custom float value and verify it
269bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	fValue = 1.5f;
270bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.texParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, fValue);
271bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "texParameterf");
272bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
273bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.getTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &fValue);
274bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "getTexParameterfv");
275bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
276bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (fValue != 1.5f)
277bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
278bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		m_testCtx.getLog() << tcu::TestLog::Message
279bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << "texParameterf failed. Expected value: 1.5, Queried value: " << fValue
280bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << tcu::TestLog::EndMessage;
281bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		return false;
282bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
283bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
284bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	// Set custom integer value and verify it
285bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	iValue = 1;
286bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.texParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &iValue);
287bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "texParameteriv");
288bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
289bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.getTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &iValue);
290bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "getTexParameteriv");
291bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
292bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (iValue != 1)
293bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
294bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		m_testCtx.getLog() << tcu::TestLog::Message
295bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << "texParameteriv failed. Expected value: 1, Queried value: " << iValue
296bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << tcu::TestLog::EndMessage;
297bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		return false;
298bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
299bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
300bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	// Set custom float value and verify it
301bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	fValue = 2.0f;
302bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.texParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &fValue);
303bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "texParameterfv");
304bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
305bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.getTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &fValue);
306bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "getTexParameterfv");
307bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
308bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (fValue != 2.0f)
309bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
310bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		m_testCtx.getLog() << tcu::TestLog::Message
311bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << "texParameterfv failed. Expected value: 2.0, Queried value: " << fValue
312bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << tcu::TestLog::EndMessage;
313bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		return false;
314bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
315bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
316bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	// Set texture filter anisotropic to 0.9f and check if INVALID_VALUE error is generated
317bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	fValue = 0.9f;
318bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.texParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &fValue);
319bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLint error = gl.getError();
320bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (error != GL_INVALID_VALUE)
321bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
322bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		m_testCtx.getLog()
323bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			<< tcu::TestLog::Message
324bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			<< "texParameterfv failed for values less then 1.0f. Expected INVALID_VALUE error. Generated error: "
325bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			<< glu::getErrorName(error) << tcu::TestLog::EndMessage;
326bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		return false;
327bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
328bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
329bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	return true;
330bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
331bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
332bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Verify if get* queries for GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT pname works as expected.
333bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
334bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param gl   OpenGL functions wrapper
335bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
336bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @return Returns true if queries test passed, false otherwise.
337bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */
338bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynabool TextureFilterAnisotropicQueriesTestCase::verifyGet(const glw::Functions& gl)
339bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
340bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLboolean bValue;
341bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLint	 iValue;
342bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLfloat   fValue;
343bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLdouble  dValue;
344bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
345bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.getBooleanv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &bValue);
346bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "getBooleanv");
347bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
348bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.getIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &iValue);
349bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "getIntegerv");
350bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
351bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.getFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &fValue);
352bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "getFloatv");
353bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
354bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (glu::isContextTypeGLCore(m_context.getRenderContext().getType()))
355bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
356bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		gl.getDoublev(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &dValue);
357bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		GLU_EXPECT_NO_ERROR(gl.getError(), "getDoublev");
358bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
359bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
360bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	return true;
361bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
362bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
363bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Constructor.
364bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
365bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param context     Rendering context
366bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */
367bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam CzuprynaTextureFilterAnisotropicDrawingTestCase::TextureFilterAnisotropicDrawingTestCase(deqp::Context& context)
368bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	: TestCase(context, "drawing", "Verifies if drawing texture with anisotropic filtering is performed as expected")
369bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	, m_vertex(DE_NULL)
370bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	, m_fragment(DE_NULL)
371bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	, m_texture(0)
372bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
373bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	/* Left blank intentionally */
374bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
375bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
376bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Stub deinit method. */
377bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynavoid TextureFilterAnisotropicDrawingTestCase::deinit()
378bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
379bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	/* Left blank intentionally */
380bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
381bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
382bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Stub init method */
383bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynavoid TextureFilterAnisotropicDrawingTestCase::init()
384bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
3855e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	glu::ContextType contextType = m_context.getRenderContext().getType();
3865e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	if (!glu::contextSupports(contextType, glu::ApiType::core(4, 6)) &&
3875e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski		!m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_filter_anisotropic") &&
3885e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski		!m_context.getContextInfo().isExtensionSupported("GL_ARB_texture_filter_anisotropic"))
3895e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	{
3905e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski		TCU_THROW(NotSupportedError, "texture filter anisotropic functionality not supported");
3915e30a0c40b29675e3503ce94018e53bd4cf705bfPiotr Byszewski	}
392bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
393bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	const tcu::RenderTarget& rt = m_context.getRenderTarget();
394bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
395bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLint width  = rt.getWidth();
396bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLint height = rt.getHeight();
397bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
398bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (width < 32 || height < 32)
399bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		TCU_THROW(NotSupportedError, "Config not supported - render buffer size should be at least 32x32");
400bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
401bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_vertex = "#version <VERSION>\n"
402bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			   "\n"
403bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			   "in highp vec3 vertex;\n"
404bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			   "in highp <TEXCOORD_TYPE> inTexCoord;\n"
405bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			   "out highp <TEXCOORD_TYPE> commonTexCoord;\n"
406bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			   "\n"
407bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			   "uniform highp mat4 projectionMatrix;\n"
408bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			   "\n"
409bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			   "void main()\n"
410bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			   "{\n"
411bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			   "    commonTexCoord = inTexCoord;\n"
412bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			   "    gl_Position = vec4(vertex, 1.0) * projectionMatrix;\n"
413bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			   "}\n";
414bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
415bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_fragment = "#version <VERSION>\n"
416bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				 "\n"
417bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				 "in highp <TEXCOORD_TYPE> commonTexCoord;\n"
418bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				 "out highp vec4 fragColor;\n"
419bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				 "\n"
420bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				 "uniform highp <SAMPLER_TYPE> tex;\n"
421bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				 "\n"
422bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				 "void main()\n"
423bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				 "{\n"
424bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				 "    fragColor = texture(tex, commonTexCoord);\n"
425bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				 "}\n"
426bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				 "\n";
427bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
428bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedTargets.clear();
429bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedTargets.push_back(GL_TEXTURE_2D);
430bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedTargets.push_back(GL_TEXTURE_2D_ARRAY);
431bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
432bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.clear();
433bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_R8);
434bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_R8_SNORM);
435bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_RG8);
436bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_RG8_SNORM);
437bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_RGB8);
438bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_RGB8_SNORM);
439bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_RGB565);
440bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_RGBA4);
441bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_RGB5_A1);
442bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_RGBA8);
443bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_RGBA8_SNORM);
444bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_RGB10_A2);
445bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_SRGB8);
446bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_SRGB8_ALPHA8);
447bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_R16F);
448bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_RG16F);
449bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_RGB16F);
450bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_RGBA16F);
451bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_R11F_G11F_B10F);
452bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_supportedInternalFormats.push_back(GL_RGB9_E5);
453bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
454bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
455bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Executes test iteration.
456bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
457bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
458bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */
459bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynatcu::TestNode::IterateResult TextureFilterAnisotropicDrawingTestCase::iterate()
460bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
461bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
462bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
463bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	bool result = true;
464bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
465bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLfloat maxAnisoDegree = 2.0;
466bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
467bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.getFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisoDegree);
468bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "getFloatv");
469bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
470bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	std::vector<GLfloat> anisoVec;
471bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	anisoVec.push_back(1.0f);
472bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	anisoVec.push_back(2.0f);
473bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
474bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	for (deUint32 iTarget = 0; iTarget < m_supportedTargets.size(); ++iTarget)
475bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
476bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		GLenum target = m_supportedTargets[iTarget];
477bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
478bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		for (deUint32 iFormat = 0; iFormat < m_supportedInternalFormats.size(); ++iFormat)
479bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		{
480bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			GLenum format = m_supportedInternalFormats[iFormat];
481bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
482bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			// Generate texture
483bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			generateTexture(gl, target);
484bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
485bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			// Fill texture with strips pattern
486bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			fillTexture(gl, target, format);
487bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
488bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			// Draw scene
489bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			GLuint lastPoints = 0xFFFFFFFF;
490bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			for (deUint32 i = 0; i < anisoVec.size(); ++i)
491bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			{
492bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				GLfloat aniso = anisoVec[i];
493bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
494bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				if (result)
495bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna					result = result && drawTexture(gl, target, aniso);
496bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
497bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				// Verify result
498bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				if (result)
499bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				{
500bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna					GLuint currentPoints = verifyScene(gl);
501bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
502bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna					if (lastPoints <= currentPoints)
503bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna					{
504bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						m_testCtx.getLog()
505bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna							<< tcu::TestLog::Message
506bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna							<< "Anisotropy verification failed (lastPoints <= currentPoints) for "
507bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna							<< "anisotropy: " << aniso << ", "
508bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna							<< "target: " << glu::getTextureTargetName(target) << ", "
509bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna							<< "internalFormat: " << glu::getUncompressedTextureFormatName(format) << ", "
510bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna							<< "lastPoints: " << lastPoints << ", "
511bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna							<< "currentPoints: " << currentPoints << tcu::TestLog::EndMessage;
512bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
513bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						result = false;
514bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						break;
515bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna					}
516bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
517bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna					lastPoints = currentPoints;
518bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				}
519bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			}
520bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
521bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			// Release texture
522bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			releaseTexture(gl);
523bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
524bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			if (!result)
525bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			{
526bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				// Stop loops
527bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				iTarget = m_supportedTargets.size();
528bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				iFormat = m_supportedInternalFormats.size();
529bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			}
530bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		}
531bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
532bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
533bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (result)
534bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
535bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	else
536bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
537bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	return STOP;
538bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
539bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
540bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Generate texture and set filtering parameters.
541bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
542bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param gl              OpenGL functions wrapper
543bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param target          Texture target
544bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param internalFormat  Texture internal format
545bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */
546bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynavoid TextureFilterAnisotropicDrawingTestCase::generateTexture(const glw::Functions& gl, GLenum target)
547bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
548bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.genTextures(1, &m_texture);
549bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures");
550bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.bindTexture(target, m_texture);
551bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture");
552bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
553bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.texParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
554bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexParameteri");
555bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.texParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
556bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexParameteri");
557bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.texParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
558bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexParameteri");
559bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.texParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
560bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexParameteri");
561bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.texParameteri(target, GL_TEXTURE_MAX_LEVEL, 1);
562bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glTexParameteri");
563bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
564bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
565bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Fill texture with strips pattern.
566bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
567bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param gl              OpenGL functions wrapper
568bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param target          Texture target
569bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param internalFormat  Texture internal format
570bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */
571bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynavoid TextureFilterAnisotropicDrawingTestCase::fillTexture(const glw::Functions& gl, GLenum target,
572bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna														  GLenum internalFormat)
573bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
574bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	tcu::TextureFormat  texFormat   = glu::mapGLInternalFormat(internalFormat);
575bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	glu::TransferFormat transFormat = glu::getTransferFormat(texFormat);
576bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
577bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	for (int l = 0; l < 2; ++l)
578bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
579bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		GLuint texSize = 32 / (l + 1);
580bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
581bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		std::vector<GLubyte> vecData;
582bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		vecData.resize(texSize * texSize * texFormat.getPixelSize() * 2);
583bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
584bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		tcu::PixelBufferAccess bufferAccess(texFormat, texSize, texSize, 1, vecData.data());
585bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
586bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		for (GLuint x = 0; x < texSize; ++x)
587bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		{
588bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			for (GLuint y = 0; y < texSize; ++y)
589bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			{
590bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				int		  value = ((x * (l + 1)) % 8 < 4) ? 255 : 0;
591bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				tcu::RGBA rgbaColor(value, value, value, 255);
592bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				tcu::Vec4 color = rgbaColor.toVec();
593bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				bufferAccess.setPixel(color, x, y);
594bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			}
595bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		}
596bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
597bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		TextureFilterAnisotropicUtils::texImage(gl, target, l, internalFormat, texSize, texSize, 1, transFormat.format,
598bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna												transFormat.dataType, vecData.data());
599bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
600bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
601bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
602bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Render polygon with anisotropic filtering.
603bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
604bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param gl           OpenGL functions wrapper
605bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param target       Texture target
606bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param anisoDegree  Degree of anisotropy
607bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
608bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @return Returns true if no error occured, false otherwise.
609bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */
610bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynabool TextureFilterAnisotropicDrawingTestCase::drawTexture(const glw::Functions& gl, GLenum target, GLfloat anisoDegree)
611bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
612bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	const GLfloat vertices2[] = { -1.0f, 0.0f, -0.5f, 0.0f, 0.0f, -4.0f, 4.0f, -2.0f, 0.0f, 1.0f,
613bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna								  1.0f,  0.0f, -0.5f, 1.0f, 0.0f, -2.0f, 4.0f, -2.0f, 1.0f, 1.0f };
614bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	const GLfloat vertices3[] = { -1.0f, 0.0f, -0.5f, 0.0f, 0.0f, 0.0f, -4.0f, 4.0f, -2.0f, 0.0f, 1.0f, 0.0f,
615bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna								  1.0f,  0.0f, -0.5f, 1.0f, 0.0f, 0.0f, -2.0f, 4.0f, -2.0f, 1.0f, 1.0f, 0.0f };
616bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
617bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	// Projection values.
618bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	const GLfloat projectionMatrix[] = { 0.5f, 0.0f, 0.0f,		   0.0f,		 0.0f, 0.5f, 0.0f,  0.0f,
619bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna										 0.0f, 0.0f, -2.5f / 1.5f, -2.0f / 1.5f, 0.0f, 0.0f, -1.0f, 0.0f };
620bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
621bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.viewport(0, 0, 32, 32);
622bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
623bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	std::string vertexShader   = m_vertex;
624bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	std::string fragmentShader = m_fragment;
625bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
626bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	std::string texCoordType;
627bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	std::string samplerType;
628bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	TextureFilterAnisotropicUtils::generateTokens(target, texCoordType, samplerType);
629bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
630bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	TextureFilterAnisotropicUtils::replaceToken("<TEXCOORD_TYPE>", texCoordType.c_str(), vertexShader);
631bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	TextureFilterAnisotropicUtils::replaceToken("<TEXCOORD_TYPE>", texCoordType.c_str(), fragmentShader);
632bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	TextureFilterAnisotropicUtils::replaceToken("<SAMPLER_TYPE>", samplerType.c_str(), vertexShader);
633bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	TextureFilterAnisotropicUtils::replaceToken("<SAMPLER_TYPE>", samplerType.c_str(), fragmentShader);
634bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
635bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (glu::isContextTypeGLCore(m_context.getRenderContext().getType()))
636bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
637bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		TextureFilterAnisotropicUtils::replaceToken("<VERSION>", "130", vertexShader);
638bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		TextureFilterAnisotropicUtils::replaceToken("<VERSION>", "130", fragmentShader);
639bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
640bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	else
641bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
642bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		TextureFilterAnisotropicUtils::replaceToken("<VERSION>", "300 es", vertexShader);
643bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		TextureFilterAnisotropicUtils::replaceToken("<VERSION>", "300 es", fragmentShader);
644bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
645bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
646bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	ProgramSources sources = makeVtxFragSources(vertexShader, fragmentShader);
647bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	ShaderProgram  program(gl, sources);
648bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
649bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (!program.isOk())
650bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
651bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		m_testCtx.getLog() << tcu::TestLog::Message << "Shader build failed.\n"
652bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << "Vertex: " << program.getShaderInfo(SHADERTYPE_VERTEX).infoLog << "\n"
653bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << vertexShader << "\n"
654bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << "Fragment: " << program.getShaderInfo(SHADERTYPE_FRAGMENT).infoLog << "\n"
655bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << fragmentShader << "\n"
656bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   << "Program: " << program.getProgramInfo().infoLog << tcu::TestLog::EndMessage;
657bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		return false;
658bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
659bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
660bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLuint vao;
661bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.genVertexArrays(1, &vao);
662bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenVertexArrays");
663bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.bindVertexArray(vao);
664bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindVertexArray");
665bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
666bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLuint vbo;
667bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.genBuffers(1, &vbo);
668bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers");
669bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.bindBuffer(GL_ARRAY_BUFFER, vbo);
670bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer");
671bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
672bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	std::vector<GLfloat> vboData;
673bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	vboData.resize(24);
674bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
675bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLuint texCoordDim;
676bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (texCoordType == "vec2")
677bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
678bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		texCoordDim = 2;
679bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		deMemcpy((void*)vboData.data(), (void*)vertices2, sizeof(vertices2));
680bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
681bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	else
682bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
683bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		texCoordDim = 3;
684bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		deMemcpy((void*)vboData.data(), (void*)vertices3, sizeof(vertices3));
685bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
686bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
687bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.bufferData(GL_ARRAY_BUFFER, vboData.size() * sizeof(GLfloat), (GLvoid*)vboData.data(), GL_DYNAMIC_DRAW);
688bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData");
689bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
690bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.useProgram(program.getProgram());
691bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram");
692bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
693bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLuint matrixLocation = gl.getUniformLocation(program.getProgram(), "projectionMatrix");
694bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLuint texLocation	= gl.getUniformLocation(program.getProgram(), "tex");
695bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
696bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.activeTexture(GL_TEXTURE0);
697bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glActiveTexture");
698bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.bindTexture(target, m_texture);
699bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture");
700bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.uniformMatrix4fv(matrixLocation, 1, GL_FALSE, projectionMatrix);
701bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glUniformMatrix4fv");
702bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.uniform1i(texLocation, 0);
703bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i");
704bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
705bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.texParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisoDegree);
706bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "texParameterfv");
707bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
708bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
709bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glClearColor");
710bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.clear(GL_COLOR_BUFFER_BIT);
711bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glClear");
712bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
713bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.enableVertexAttribArray(0);
714bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray");
715bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.enableVertexAttribArray(1);
716bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glEnableVertexAttribArray");
717bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
718bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLint attrLocationVertex = gl.getAttribLocation(program.getProgram(), "vertex");
719bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation");
720bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLint attrLocationInTexCoord = gl.getAttribLocation(program.getProgram(), "inTexCoord");
721bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation");
722bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
723bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLuint strideSize = (3 + texCoordDim) * sizeof(GLfloat);
724bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.vertexAttribPointer(attrLocationVertex, 3, GL_FLOAT, GL_FALSE, strideSize, DE_NULL);
725bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer");
726bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.vertexAttribPointer(attrLocationInTexCoord, texCoordDim, GL_FLOAT, GL_FALSE, strideSize,
727bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna						   (GLvoid*)(3 * sizeof(GLfloat)));
728bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glVertexAttribPointer");
729bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
730bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
731bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArray");
732bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
733bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.disableVertexAttribArray(0);
734bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glDisableVertexAttribArray");
735bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.disableVertexAttribArray(1);
736bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glDisableVertexAttribArray");
737bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
738bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (vbo)
739bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
740bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		gl.deleteBuffers(1, &vbo);
741bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteBuffers");
742bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
743bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
744bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (vao)
745bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
746bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		gl.deleteVertexArrays(1, &vao);
747bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteVertexArrays");
748bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
749bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
750bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	return true;
751bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
752bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
753bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Verify rendered polygon anisotropy.
754bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
755bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param gl  OpenGL functions wrapper
756bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
757bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @return Returns points value. Less points means better anisotropy (smoother strips).
758bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */
759bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam CzuprynaGLuint TextureFilterAnisotropicDrawingTestCase::verifyScene(const glw::Functions& gl)
760bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
761bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	std::vector<GLubyte> pixels;
762bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	pixels.resize(32 * 8 * 4);
763bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
764bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	gl.readPixels(0, 23, 32, 8, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data());
765bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");
766bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
767bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLuint sum = 0;
768bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
769bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLubyte last	= 0;
770bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	GLubyte current = 0;
771bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	for (int j = 0; j < 8; ++j)
772bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	{
773bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		for (int i = 0; i < 32; ++i)
774bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		{
775bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			current = pixels[(i + j * 32) * 4];
776bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
777bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			if (i > 0)
778bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna				sum += deAbs32((int)current - (int)last);
779bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
780bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna			last = current;
781bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		}
782bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	}
783bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
784bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	return sum;
785bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
786bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
787bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Release texture.
788bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
789bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param gl  OpenGL functions wrapper
790bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */
791bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynavoid TextureFilterAnisotropicDrawingTestCase::releaseTexture(const glw::Functions& gl)
792bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
793bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	if (m_texture)
794bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna		gl.deleteTextures(1, &m_texture);
795bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
796bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	m_texture = 0;
797bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
798bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
799bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Constructor.
800bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *
801bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna *  @param context Rendering context.
802bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna */
803bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam CzuprynaTextureFilterAnisotropicTests::TextureFilterAnisotropicTests(deqp::Context& context)
804bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	: TestCaseGroup(context, "texture_filter_anisotropic",
805bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna					"Verify conformance of CTS_EXT_texture_filter_anisotropic implementation")
806bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
807bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
808bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
809bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna/** Initializes the test group contents. */
810bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czuprynavoid TextureFilterAnisotropicTests::init()
811bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna{
812bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	addChild(new TextureFilterAnisotropicQueriesTestCase(m_context));
813bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna	addChild(new TextureFilterAnisotropicDrawingTestCase(m_context));
814bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna}
815bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna
816bd28b3cc34acabb5eb13ef6dbb7757deb9b11c4eAdam Czupryna} /* glcts namespace */
817