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