// // Copyright 2018 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // entry_point_utils: // These helpers are used in GL/GLES entry point routines. #ifndef LIBANGLE_ENTRY_POINT_UTILS_H_ #define LIBANGLE_ENTRY_POINT_UTILS_H_ #include "angle_gl.h" #include "common/Optional.h" #include "common/PackedEnums.h" #include "common/angleutils.h" #include "common/entry_points_enum_autogen.h" #include "common/mathutil.h" #include "libANGLE/Context.h" #include "libANGLE/Display.h" namespace gl { // A template struct for determining the default value to return for each entry point. template struct DefaultReturnValue; // Default return values for each basic return type. template struct DefaultReturnValue { static constexpr GLint kValue = -1; }; // This doubles as the GLenum return value. template struct DefaultReturnValue { static constexpr GLuint kValue = 0; }; template struct DefaultReturnValue { static constexpr GLboolean kValue = GL_FALSE; }; template struct DefaultReturnValue { static constexpr ShaderProgramID kValue = {0}; }; // Catch-all rules for pointer types. template struct DefaultReturnValue { static constexpr const PointerType *kValue = nullptr; }; template struct DefaultReturnValue { static constexpr PointerType *kValue = nullptr; }; // Overloaded to return invalid index template <> struct DefaultReturnValue { static constexpr GLuint kValue = GL_INVALID_INDEX; }; // Specialized enum error value. template <> struct DefaultReturnValue { static constexpr GLenum kValue = GL_WAIT_FAILED; }; // glTestFenceNV should still return TRUE for an invalid fence. template <> struct DefaultReturnValue { static constexpr GLboolean kValue = GL_TRUE; }; template constexpr ANGLE_INLINE ReturnType GetDefaultReturnValue() { return DefaultReturnValue::kValue; } #if ANGLE_CAPTURE_ENABLED # define ANGLE_CAPTURE_GL(Func, ...) CaptureCallToFrameCapture(Capture##Func, __VA_ARGS__) # define ANGLE_CAPTURE_EGL(Func, ...) CaptureCallToCaptureEGL(Capture##Func, __VA_ARGS__) #else # define ANGLE_CAPTURE_GL(...) # define ANGLE_CAPTURE_EGL(...) #endif // ANGLE_CAPTURE_ENABLED #define EGL_EVENT(EP, FMT, ...) EVENT(nullptr, EGL##EP, FMT, ##__VA_ARGS__) inline int CID(const Context *context) { return context == nullptr ? 0 : static_cast(context->id().value); } } // namespace gl namespace egl { inline int CID(EGLDisplay display, EGLContext context) { auto *displayPtr = reinterpret_cast(display); if (!Display::isValidDisplay(displayPtr)) { return -1; } auto *contextPtr = reinterpret_cast(context); if (!displayPtr->isValidContext(contextPtr)) { return -1; } return gl::CID(contextPtr); } } // namespace egl #endif // LIBANGLE_ENTRY_POINT_UTILS_H_