1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2018 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker // entry_point_utils: 7*8975f5c5SAndroid Build Coastguard Worker // These helpers are used in GL/GLES entry point routines. 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_ENTRY_POINT_UTILS_H_ 10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_ENTRY_POINT_UTILS_H_ 11*8975f5c5SAndroid Build Coastguard Worker 12*8975f5c5SAndroid Build Coastguard Worker #include "angle_gl.h" 13*8975f5c5SAndroid Build Coastguard Worker #include "common/Optional.h" 14*8975f5c5SAndroid Build Coastguard Worker #include "common/PackedEnums.h" 15*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "common/entry_points_enum_autogen.h" 17*8975f5c5SAndroid Build Coastguard Worker #include "common/mathutil.h" 18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h" 19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Display.h" 20*8975f5c5SAndroid Build Coastguard Worker 21*8975f5c5SAndroid Build Coastguard Worker namespace gl 22*8975f5c5SAndroid Build Coastguard Worker { 23*8975f5c5SAndroid Build Coastguard Worker // A template struct for determining the default value to return for each entry point. 24*8975f5c5SAndroid Build Coastguard Worker template <angle::EntryPoint EP, typename ReturnType> 25*8975f5c5SAndroid Build Coastguard Worker struct DefaultReturnValue; 26*8975f5c5SAndroid Build Coastguard Worker 27*8975f5c5SAndroid Build Coastguard Worker // Default return values for each basic return type. 28*8975f5c5SAndroid Build Coastguard Worker template <angle::EntryPoint EP> 29*8975f5c5SAndroid Build Coastguard Worker struct DefaultReturnValue<EP, GLint> 30*8975f5c5SAndroid Build Coastguard Worker { 31*8975f5c5SAndroid Build Coastguard Worker static constexpr GLint kValue = -1; 32*8975f5c5SAndroid Build Coastguard Worker }; 33*8975f5c5SAndroid Build Coastguard Worker 34*8975f5c5SAndroid Build Coastguard Worker // This doubles as the GLenum return value. 35*8975f5c5SAndroid Build Coastguard Worker template <angle::EntryPoint EP> 36*8975f5c5SAndroid Build Coastguard Worker struct DefaultReturnValue<EP, GLuint> 37*8975f5c5SAndroid Build Coastguard Worker { 38*8975f5c5SAndroid Build Coastguard Worker static constexpr GLuint kValue = 0; 39*8975f5c5SAndroid Build Coastguard Worker }; 40*8975f5c5SAndroid Build Coastguard Worker 41*8975f5c5SAndroid Build Coastguard Worker template <angle::EntryPoint EP> 42*8975f5c5SAndroid Build Coastguard Worker struct DefaultReturnValue<EP, GLboolean> 43*8975f5c5SAndroid Build Coastguard Worker { 44*8975f5c5SAndroid Build Coastguard Worker static constexpr GLboolean kValue = GL_FALSE; 45*8975f5c5SAndroid Build Coastguard Worker }; 46*8975f5c5SAndroid Build Coastguard Worker 47*8975f5c5SAndroid Build Coastguard Worker template <angle::EntryPoint EP> 48*8975f5c5SAndroid Build Coastguard Worker struct DefaultReturnValue<EP, ShaderProgramID> 49*8975f5c5SAndroid Build Coastguard Worker { 50*8975f5c5SAndroid Build Coastguard Worker static constexpr ShaderProgramID kValue = {0}; 51*8975f5c5SAndroid Build Coastguard Worker }; 52*8975f5c5SAndroid Build Coastguard Worker 53*8975f5c5SAndroid Build Coastguard Worker // Catch-all rules for pointer types. 54*8975f5c5SAndroid Build Coastguard Worker template <angle::EntryPoint EP, typename PointerType> 55*8975f5c5SAndroid Build Coastguard Worker struct DefaultReturnValue<EP, const PointerType *> 56*8975f5c5SAndroid Build Coastguard Worker { 57*8975f5c5SAndroid Build Coastguard Worker static constexpr const PointerType *kValue = nullptr; 58*8975f5c5SAndroid Build Coastguard Worker }; 59*8975f5c5SAndroid Build Coastguard Worker 60*8975f5c5SAndroid Build Coastguard Worker template <angle::EntryPoint EP, typename PointerType> 61*8975f5c5SAndroid Build Coastguard Worker struct DefaultReturnValue<EP, PointerType *> 62*8975f5c5SAndroid Build Coastguard Worker { 63*8975f5c5SAndroid Build Coastguard Worker static constexpr PointerType *kValue = nullptr; 64*8975f5c5SAndroid Build Coastguard Worker }; 65*8975f5c5SAndroid Build Coastguard Worker 66*8975f5c5SAndroid Build Coastguard Worker // Overloaded to return invalid index 67*8975f5c5SAndroid Build Coastguard Worker template <> 68*8975f5c5SAndroid Build Coastguard Worker struct DefaultReturnValue<angle::EntryPoint::GLGetUniformBlockIndex, GLuint> 69*8975f5c5SAndroid Build Coastguard Worker { 70*8975f5c5SAndroid Build Coastguard Worker static constexpr GLuint kValue = GL_INVALID_INDEX; 71*8975f5c5SAndroid Build Coastguard Worker }; 72*8975f5c5SAndroid Build Coastguard Worker 73*8975f5c5SAndroid Build Coastguard Worker // Specialized enum error value. 74*8975f5c5SAndroid Build Coastguard Worker template <> 75*8975f5c5SAndroid Build Coastguard Worker struct DefaultReturnValue<angle::EntryPoint::GLClientWaitSync, GLenum> 76*8975f5c5SAndroid Build Coastguard Worker { 77*8975f5c5SAndroid Build Coastguard Worker static constexpr GLenum kValue = GL_WAIT_FAILED; 78*8975f5c5SAndroid Build Coastguard Worker }; 79*8975f5c5SAndroid Build Coastguard Worker 80*8975f5c5SAndroid Build Coastguard Worker // glTestFenceNV should still return TRUE for an invalid fence. 81*8975f5c5SAndroid Build Coastguard Worker template <> 82*8975f5c5SAndroid Build Coastguard Worker struct DefaultReturnValue<angle::EntryPoint::GLTestFenceNV, GLboolean> 83*8975f5c5SAndroid Build Coastguard Worker { 84*8975f5c5SAndroid Build Coastguard Worker static constexpr GLboolean kValue = GL_TRUE; 85*8975f5c5SAndroid Build Coastguard Worker }; 86*8975f5c5SAndroid Build Coastguard Worker 87*8975f5c5SAndroid Build Coastguard Worker template <angle::EntryPoint EP, typename ReturnType> 88*8975f5c5SAndroid Build Coastguard Worker constexpr ANGLE_INLINE ReturnType GetDefaultReturnValue() 89*8975f5c5SAndroid Build Coastguard Worker { 90*8975f5c5SAndroid Build Coastguard Worker return DefaultReturnValue<EP, ReturnType>::kValue; 91*8975f5c5SAndroid Build Coastguard Worker } 92*8975f5c5SAndroid Build Coastguard Worker 93*8975f5c5SAndroid Build Coastguard Worker #if ANGLE_CAPTURE_ENABLED 94*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_CAPTURE_GL(Func, ...) CaptureGLCallToFrameCapture(Capture##Func, __VA_ARGS__) 95*8975f5c5SAndroid Build Coastguard Worker #else 96*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_CAPTURE_GL(...) 97*8975f5c5SAndroid Build Coastguard Worker #endif // ANGLE_CAPTURE_ENABLED 98*8975f5c5SAndroid Build Coastguard Worker 99*8975f5c5SAndroid Build Coastguard Worker #define EGL_EVENT(EP, FMT, ...) EVENT(nullptr, EGL##EP, FMT, ##__VA_ARGS__) 100*8975f5c5SAndroid Build Coastguard Worker 101*8975f5c5SAndroid Build Coastguard Worker inline int CID(const Context *context) 102*8975f5c5SAndroid Build Coastguard Worker { 103*8975f5c5SAndroid Build Coastguard Worker return context == nullptr ? 0 : static_cast<int>(context->id().value); 104*8975f5c5SAndroid Build Coastguard Worker } 105*8975f5c5SAndroid Build Coastguard Worker 106*8975f5c5SAndroid Build Coastguard Worker bool GeneratePixelLocalStorageActiveError(const PrivateState &state, 107*8975f5c5SAndroid Build Coastguard Worker ErrorSet *errors, 108*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint); 109*8975f5c5SAndroid Build Coastguard Worker 110*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE bool ValidatePixelLocalStorageInactive(const PrivateState &state, 111*8975f5c5SAndroid Build Coastguard Worker ErrorSet *errors, 112*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint) 113*8975f5c5SAndroid Build Coastguard Worker { 114*8975f5c5SAndroid Build Coastguard Worker return state.getPixelLocalStorageActivePlanes() == 0 || 115*8975f5c5SAndroid Build Coastguard Worker GeneratePixelLocalStorageActiveError(state, errors, entryPoint); 116*8975f5c5SAndroid Build Coastguard Worker } 117*8975f5c5SAndroid Build Coastguard Worker } // namespace gl 118*8975f5c5SAndroid Build Coastguard Worker 119*8975f5c5SAndroid Build Coastguard Worker namespace egl 120*8975f5c5SAndroid Build Coastguard Worker { 121*8975f5c5SAndroid Build Coastguard Worker inline int CID(EGLDisplay display, EGLContext context) 122*8975f5c5SAndroid Build Coastguard Worker { 123*8975f5c5SAndroid Build Coastguard Worker const egl::Display *displayPtr = reinterpret_cast<const egl::Display *>(display); 124*8975f5c5SAndroid Build Coastguard Worker if (!Display::isValidDisplay(displayPtr)) 125*8975f5c5SAndroid Build Coastguard Worker { 126*8975f5c5SAndroid Build Coastguard Worker return -1; 127*8975f5c5SAndroid Build Coastguard Worker } 128*8975f5c5SAndroid Build Coastguard Worker gl::ContextID contextID = {static_cast<GLuint>(reinterpret_cast<uintptr_t>(context))}; 129*8975f5c5SAndroid Build Coastguard Worker if (!displayPtr->isValidContext(contextID)) 130*8975f5c5SAndroid Build Coastguard Worker { 131*8975f5c5SAndroid Build Coastguard Worker return -1; 132*8975f5c5SAndroid Build Coastguard Worker } 133*8975f5c5SAndroid Build Coastguard Worker return contextID.value; 134*8975f5c5SAndroid Build Coastguard Worker } 135*8975f5c5SAndroid Build Coastguard Worker 136*8975f5c5SAndroid Build Coastguard Worker #if ANGLE_CAPTURE_ENABLED 137*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_CAPTURE_EGL(Func, ...) CaptureEGLCallToFrameCapture(Capture##Func, __VA_ARGS__) 138*8975f5c5SAndroid Build Coastguard Worker #else 139*8975f5c5SAndroid Build Coastguard Worker # define ANGLE_CAPTURE_EGL(...) 140*8975f5c5SAndroid Build Coastguard Worker #endif // ANGLE_CAPTURE_ENABLED 141*8975f5c5SAndroid Build Coastguard Worker } // namespace egl 142*8975f5c5SAndroid Build Coastguard Worker 143*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_ENTRY_POINT_UTILS_H_ 144