xref: /aosp_15_r20/external/angle/src/libANGLE/entry_points_utils.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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