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