1c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry/*------------------------------------------------------------------------- 2c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * drawElements Quality Program OpenGL ES 3.1 Module 3c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * ------------------------------------------------- 4c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * 5c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * Copyright 2015 The Android Open Source Project 6c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * 7c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * Licensed under the Apache License, Version 2.0 (the "License"); 8c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * you may not use this file except in compliance with the License. 9c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * You may obtain a copy of the License at 10c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * 11c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * http://www.apache.org/licenses/LICENSE-2.0 12c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * 13c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * Unless required by applicable law or agreed to in writing, software 14c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * distributed under the License is distributed on an "AS IS" BASIS, 15c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * See the License for the specific language governing permissions and 17c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * limitations under the License. 18c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * 19c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry *//*! 20c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * \file 21c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry * \brief Info log query shared utilities 22c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry *//*--------------------------------------------------------------------*/ 23c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 24c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "es31fInfoLogQueryShared.hpp" 25c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "glsStateQueryUtil.hpp" 26c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "tcuTestLog.hpp" 27c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "glwEnums.hpp" 28c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include "gluStrUtil.hpp" 29c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 30c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry#include <string> 31c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 32c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrynamespace deqp 33c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{ 34c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrynamespace gles31 35c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{ 36c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyrynamespace Functional 37c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{ 38c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 39c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyryvoid verifyInfoLogQuery (tcu::ResultCollector& result, 40c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry glu::CallLogWrapper& gl, 41c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry int logLen, 42c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry glw::GLuint object, 43c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry void (glu::CallLogWrapper::* getInfoLog)(glw::GLuint, glw::GLsizei, glw::GLsizei*, glw::GLchar*), 44c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const char* getterName) 45c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry{ 46c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry { 47c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const tcu::ScopedLogSection section (gl.getLog(), "QueryAll", "Query all"); 48c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry std::string buf (logLen + 2, 'X'); 49c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 50c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry buf[logLen + 1] = '\0'; 51c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry (gl.*getInfoLog)(object, logLen, DE_NULL, &buf[0]); 52c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GLS_COLLECT_GL_ERROR(result, gl.glGetError(), getterName); 53c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 54c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry if (logLen > 0 && buf[logLen-1] != '\0') 55c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("Return buffer was not INFO_LOG_LENGTH sized and null-terminated"); 56c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry else if (buf[logLen] != 'X' && buf[logLen+1] != '\0') 57c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("Buffer end guard modified, query wrote over the end of the buffer."); 58c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry } 59c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 60c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry { 61c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const tcu::ScopedLogSection section (gl.getLog(), "QueryMore", "Query more"); 62c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry std::string buf (logLen + 4, 'X'); 63c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry int written = -1; 64c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 65c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry buf[logLen + 3] = '\0'; 66c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry (gl.*getInfoLog)(object, logLen+2, &written, &buf[0]); 67c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GLS_COLLECT_GL_ERROR(result, gl.glGetError(), getterName); 68c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 69c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry if (written == -1) 70c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("'length' was not written to"); 71c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry else if (buf[written] != '\0') 72c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("Either length was incorrect or result was not null-terminated"); 73c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry else if (logLen != 0 && (written + 1) > logLen) 74c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("'length' characters + null terminator is larger than INFO_LOG_LENGTH"); 75c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry else if ((written + 1) < logLen) 76c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("'length' is not consistent with INFO_LOG_LENGTH"); 77c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry else if (buf[logLen+2] != 'X' && buf[logLen+3] != '\0') 78c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("Buffer end guard modified, query wrote over the end of the buffer."); 79c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry else if (written != (int)strlen(&buf[0])) 80c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("'length' and written string length do not match"); 81c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry } 82c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 83c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry if (logLen > 2) 84c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry { 85c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const tcu::ScopedLogSection section (gl.getLog(), "QueryLess", "Query less"); 86c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry std::string buf (logLen + 2, 'X'); 87c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry int written = -1; 88c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 89c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry (gl.*getInfoLog)(object, 2, &written, &buf[0]); 90c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GLS_COLLECT_GL_ERROR(result, gl.glGetError(), getterName); 91c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 92c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry if (written == -1) 93c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("'length' was not written to"); 94c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry else if (written != 1) 95c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("Expected 'length' = 1"); 96c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry else if (buf[1] != '\0') 97c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("Expected null terminator at index 1"); 98c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry } 99c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 100c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry if (logLen > 0) 101c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry { 102c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const tcu::ScopedLogSection section (gl.getLog(), "QueryOne", "Query one character"); 103c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry std::string buf (logLen + 2, 'X'); 104c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry int written = -1; 105c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 106c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry (gl.*getInfoLog)(object, 1, &written, &buf[0]); 107c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GLS_COLLECT_GL_ERROR(result, gl.glGetError(), getterName); 108c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 109c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry if (written == -1) 110c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("'length' was not written to"); 111c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry else if (written != 0) 112c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("Expected 'length' = 0"); 113c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry else if (buf[0] != '\0') 114c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("Expected null terminator at index 0"); 115c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry } 116c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 117c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry { 118c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry const tcu::ScopedLogSection section (gl.getLog(), "QueryNone", "Query to zero-sized buffer"); 119c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry std::string buf (logLen + 2, 'X'); 120c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry int written = -1; 121c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 122c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry (gl.*getInfoLog)(object, 0, &written, &buf[0]); 123c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry GLS_COLLECT_GL_ERROR(result, gl.glGetError(), getterName); 124c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 125c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry if (written == -1) 126c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("'length' was not written to"); 127c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry else if (written != 0) 128c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("Expected 'length' = 0"); 129c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry else if (buf[0] != 'X') 130c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry result.fail("Unexpected buffer mutation at index 0"); 131c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry } 132c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry} 133c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry 134c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry} // Functional 135c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry} // gles31 136c423ce6164cdd88c8c3e47bec4ec34476743042aJarkko Pöyry} // deqp 137