18bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv/* 28bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv * Copyright (C) 2016 The Android Open Source Project 38bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv * 48bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv * Licensed under the Apache License, Version 2.0 (the "License"); 58bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv * you may not use this file except in compliance with the License. 68bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv * You may obtain a copy of the License at 78bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv * 88bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv * http://www.apache.org/licenses/LICENSE-2.0 98bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv * 108bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv * Unless required by applicable law or agreed to in writing, software 118bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv * distributed under the License is distributed on an "AS IS" BASIS, 128bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv * See the License for the specific language governing permissions and 148bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv * limitations under the License. 158bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv */ 168bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv 178bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv#include "GlesErrorCheckWrapper.h" 188bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv 196f773a0d8717162f81ff21d943baaa539a2d6c7eMark Salyzyn#include <log/log.h> 208bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv 218bd5edf804d5995fe266f3f612b70ee0ee104130sergeyvnamespace android { 228bd5edf804d5995fe266f3f612b70ee0ee104130sergeyvnamespace uirenderer { 238bd5edf804d5995fe266f3f612b70ee0ee104130sergeyvnamespace debug { 248bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv 258bd5edf804d5995fe266f3f612b70ee0ee104130sergeyvvoid GlesErrorCheckWrapper::assertNoErrors(const char* apicall) { 268bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv GLenum status = GL_NO_ERROR; 278bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv GLenum lastError = GL_NO_ERROR; 288bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv const char* lastErrorName = nullptr; 298bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv while ((status = mBase.glGetError_()) != GL_NO_ERROR) { 308bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv lastError = status; 318bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv switch (status) { 328bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv case GL_INVALID_ENUM: 338bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv ALOGE("GL error: GL_INVALID_ENUM"); 348bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv lastErrorName = "GL_INVALID_ENUM"; 358bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv break; 368bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv case GL_INVALID_VALUE: 378bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv ALOGE("GL error: GL_INVALID_VALUE"); 388bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv lastErrorName = "GL_INVALID_VALUE"; 398bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv break; 408bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv case GL_INVALID_OPERATION: 418bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv ALOGE("GL error: GL_INVALID_OPERATION"); 428bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv lastErrorName = "GL_INVALID_OPERATION"; 438bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv break; 448bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv case GL_OUT_OF_MEMORY: 458bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv ALOGE("GL error: Out of memory!"); 468bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv lastErrorName = "GL_OUT_OF_MEMORY"; 478bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv break; 488bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv default: 498bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv ALOGE("GL error: 0x%x", status); 508bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv lastErrorName = "UNKNOWN"; 518bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv } 528bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv } 538bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv LOG_ALWAYS_FATAL_IF(lastError != GL_NO_ERROR, 548bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv "%s error! %s (0x%x)", apicall, lastErrorName, lastError); 558bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv} 568bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv 578bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv#define API_ENTRY(x) GlesErrorCheckWrapper::x##_ 588bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv#define CALL_GL_API(x, ...) \ 598bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv mBase.x##_(__VA_ARGS__); assertNoErrors(#x) 608bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv 618bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv#define CALL_GL_API_RETURN(x, ...) \ 628bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv auto ret = mBase.x##_(__VA_ARGS__); \ 638bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv assertNoErrors(#x); \ 648bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv return ret 658bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv 668bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv#include "gles_stubs.in" 678bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv 688bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv#undef API_ENTRY 698bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv#undef CALL_GL_API 708bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv#undef CALL_GL_API_RETURN 718bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv 728bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv} // namespace debug 738bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv} // namespace uirenderer 748bd5edf804d5995fe266f3f612b70ee0ee104130sergeyv} // namespace android 75