| /*------------------------------------------------------------------------- |
| * drawElements Quality Program EGL Utilities |
| * ------------------------------------------ |
| * |
| * Copyright 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| *//*! |
| * \file |
| * \brief EGL call wrapper for logging. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "egluCallLogWrapper.hpp" |
| #include "egluStrUtil.hpp" |
| #include "eglwLibrary.hpp" |
| #include "eglwEnums.hpp" |
| #include "deStringUtil.hpp" |
| #include "deInt32.h" |
| |
| namespace eglu |
| { |
| |
| using tcu::toHex; |
| using tcu::TestLog; |
| |
| CallLogWrapper::CallLogWrapper (const eglw::Library& egl, TestLog& log) |
| : m_egl (egl) |
| , m_log (log) |
| , m_enableLog (false) |
| { |
| } |
| |
| CallLogWrapper::~CallLogWrapper (void) |
| { |
| } |
| |
| // Pointer formatter. |
| |
| template <typename T> |
| class PointerFmt |
| { |
| public: |
| const T* arr; |
| deUint32 size; |
| |
| PointerFmt (const T* arr_, deUint32 size_) : arr(arr_), size(size_) {} |
| }; |
| |
| template <typename T> |
| std::ostream& operator<< (std::ostream& str, PointerFmt<T> fmt) |
| { |
| if (fmt.arr != DE_NULL) |
| { |
| str << "{ "; |
| for (deUint32 ndx = 0; ndx < fmt.size; ndx++) |
| { |
| if (ndx != 0) |
| str << ", "; |
| str << fmt.arr[ndx]; |
| } |
| str << " }"; |
| return str; |
| } |
| else |
| return str << "(null)"; |
| } |
| |
| template <typename T> |
| inline PointerFmt<T> getPointerStr (const T* arr, deUint32 size) |
| { |
| return PointerFmt<T>(arr, size); |
| } |
| |
| typedef const char* (*GetEnumNameFunc) (int value); |
| |
| // Enum pointer formatter. |
| |
| class EnumPointerFmt |
| { |
| public: |
| const int* value; |
| GetEnumNameFunc getName; |
| |
| EnumPointerFmt (const int* value_, GetEnumNameFunc getName_) : value(value_), getName(getName_) {} |
| }; |
| |
| inline std::ostream& operator<< (std::ostream& str, EnumPointerFmt fmt) |
| { |
| if (fmt.value) |
| return str << tcu::Format::Enum<int, 2>(fmt.getName, *fmt.value); |
| else |
| return str << "(null)"; |
| } |
| |
| inline EnumPointerFmt getEnumPointerStr (const int* value, GetEnumNameFunc getName) |
| { |
| return EnumPointerFmt(value, getName); |
| } |
| |
| // String formatter. |
| |
| class StringFmt |
| { |
| public: |
| const char* str; |
| StringFmt (const char* str_) : str(str_) {} |
| }; |
| |
| inline std::ostream& operator<< (std::ostream& str, StringFmt fmt) |
| { |
| return str << (fmt.str ? fmt.str : "NULL"); |
| } |
| |
| inline StringFmt getStringStr (const char* value) { return StringFmt(value); } |
| |
| // Config attrib pointer formatter |
| |
| class ConfigAttribValuePointerFmt |
| { |
| public: |
| deUint32 attrib; |
| const int* value; |
| ConfigAttribValuePointerFmt (deUint32 attrib_, const int* value_) : attrib(attrib_), value(value_) {} |
| }; |
| |
| inline ConfigAttribValuePointerFmt getConfigAttribValuePointerStr (deUint32 attrib, const int* value) { return ConfigAttribValuePointerFmt(attrib, value); } |
| |
| inline std::ostream& operator<< (std::ostream& str, const ConfigAttribValuePointerFmt& fmt) |
| { |
| if (fmt.value) |
| return str << getConfigAttribValueStr(fmt.attrib, *fmt.value); |
| else |
| return str << "NULL"; |
| } |
| |
| // Context attrib pointer formatter |
| |
| class ContextAttribValuePointerFmt |
| { |
| public: |
| deUint32 attrib; |
| const int* value; |
| ContextAttribValuePointerFmt (deUint32 attrib_, const int* value_) : attrib(attrib_), value(value_) {} |
| }; |
| |
| inline ContextAttribValuePointerFmt getContextAttribValuePointerStr (deUint32 attrib, const int* value) { return ContextAttribValuePointerFmt(attrib, value); } |
| |
| inline std::ostream& operator<< (std::ostream& str, const ContextAttribValuePointerFmt& fmt) |
| { |
| if (fmt.value) |
| return str << getContextAttribValueStr(fmt.attrib, *fmt.value); |
| else |
| return str << "NULL"; |
| } |
| |
| // Surface attrib pointer formatter |
| |
| class SurfaceAttribValuePointerFmt |
| { |
| public: |
| deUint32 attrib; |
| const int* value; |
| SurfaceAttribValuePointerFmt (deUint32 attrib_, const int* value_) : attrib(attrib_), value(value_) {} |
| }; |
| |
| inline SurfaceAttribValuePointerFmt getSurfaceAttribValuePointerStr (deUint32 attrib, const int* value) { return SurfaceAttribValuePointerFmt(attrib, value); } |
| |
| inline std::ostream& operator<< (std::ostream& str, const SurfaceAttribValuePointerFmt& fmt) |
| { |
| if (fmt.value) |
| return str << getSurfaceAttribValueStr(fmt.attrib, *fmt.value); |
| else |
| return str << "NULL"; |
| } |
| |
| // EGLDisplay formatter |
| |
| class EGLDisplayFmt |
| { |
| public: |
| eglw::EGLDisplay display; |
| EGLDisplayFmt (eglw::EGLDisplay display_) : display(display_) {} |
| }; |
| |
| inline EGLDisplayFmt getEGLDisplayStr (eglw::EGLDisplay display) { return EGLDisplayFmt(display); } |
| |
| inline std::ostream& operator<< (std::ostream& str, const EGLDisplayFmt& fmt) |
| { |
| if (fmt.display == EGL_NO_DISPLAY) |
| return str << "EGL_NO_DISPLAY"; |
| else |
| return str << toHex(fmt.display); |
| } |
| |
| // EGLSurface formatter |
| |
| class EGLSurfaceFmt |
| { |
| public: |
| eglw::EGLSurface surface; |
| EGLSurfaceFmt (eglw::EGLSurface surface_) : surface(surface_) {} |
| }; |
| |
| inline EGLSurfaceFmt getEGLSurfaceStr (eglw::EGLSurface surface) { return EGLSurfaceFmt(surface); } |
| |
| inline std::ostream& operator<< (std::ostream& str, const EGLSurfaceFmt& fmt) |
| { |
| if (fmt.surface == EGL_NO_SURFACE) |
| return str << "EGL_NO_SURFACE"; |
| else |
| return str << toHex(fmt.surface); |
| } |
| |
| // EGLContext formatter |
| |
| class EGLContextFmt |
| { |
| public: |
| eglw::EGLContext context; |
| EGLContextFmt (eglw::EGLContext context_) : context(context_) {} |
| }; |
| |
| inline EGLContextFmt getEGLContextStr (eglw::EGLContext context) { return EGLContextFmt(context); } |
| |
| inline std::ostream& operator<< (std::ostream& str, const EGLContextFmt& fmt) |
| { |
| if (fmt.context == EGL_NO_CONTEXT) |
| return str << "EGL_NO_CONTEXT"; |
| else |
| return str << toHex(fmt.context); |
| } |
| |
| // API entry-point implementations are auto-generated |
| #include "egluCallLogWrapper.inl" |
| |
| } // eglu |