xref: /aosp_15_r20/external/angle/include/platform/PlatformMethods.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 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 // PlatformMethods.h: The public interface ANGLE exposes to the API layer, for
7*8975f5c5SAndroid Build Coastguard Worker //   doing platform-specific tasks like gathering data, or for tracing.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #ifndef ANGLE_PLATFORMMETHODS_H
10*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_PLATFORMMETHODS_H
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include <stdint.h>
13*8975f5c5SAndroid Build Coastguard Worker #include <stdlib.h>
14*8975f5c5SAndroid Build Coastguard Worker #include <array>
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker #define EGL_PLATFORM_ANGLE_PLATFORM_METHODS_ANGLEX 0x6AFB
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker #if !defined(ANGLE_PLATFORM_EXPORT)
19*8975f5c5SAndroid Build Coastguard Worker #    if defined(_WIN32)
20*8975f5c5SAndroid Build Coastguard Worker #        if !defined(LIBANGLE_IMPLEMENTATION)
21*8975f5c5SAndroid Build Coastguard Worker #            define ANGLE_PLATFORM_EXPORT __declspec(dllimport)
22*8975f5c5SAndroid Build Coastguard Worker #        else
23*8975f5c5SAndroid Build Coastguard Worker #            define ANGLE_PLATFORM_EXPORT __declspec(dllexport)
24*8975f5c5SAndroid Build Coastguard Worker #        endif
25*8975f5c5SAndroid Build Coastguard Worker #    elif defined(__GNUC__) || defined(__clang__)
26*8975f5c5SAndroid Build Coastguard Worker #        define ANGLE_PLATFORM_EXPORT __attribute__((visibility("default")))
27*8975f5c5SAndroid Build Coastguard Worker #    endif
28*8975f5c5SAndroid Build Coastguard Worker #endif
29*8975f5c5SAndroid Build Coastguard Worker #if !defined(ANGLE_PLATFORM_EXPORT)
30*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_PLATFORM_EXPORT
31*8975f5c5SAndroid Build Coastguard Worker #endif
32*8975f5c5SAndroid Build Coastguard Worker 
33*8975f5c5SAndroid Build Coastguard Worker #if defined(_WIN32)
34*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_APIENTRY __stdcall
35*8975f5c5SAndroid Build Coastguard Worker #else
36*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_APIENTRY
37*8975f5c5SAndroid Build Coastguard Worker #endif
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker namespace angle
40*8975f5c5SAndroid Build Coastguard Worker {
41*8975f5c5SAndroid Build Coastguard Worker struct FeaturesD3D;
42*8975f5c5SAndroid Build Coastguard Worker struct FeaturesVk;
43*8975f5c5SAndroid Build Coastguard Worker struct FeaturesMtl;
44*8975f5c5SAndroid Build Coastguard Worker using TraceEventHandle = uint64_t;
45*8975f5c5SAndroid Build Coastguard Worker using EGLDisplayType   = void *;
46*8975f5c5SAndroid Build Coastguard Worker struct PlatformMethods;
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker // Use a C-like API to not trigger undefined calling behaviour.
49*8975f5c5SAndroid Build Coastguard Worker // Avoid using decltype here to work around sanitizer limitations.
50*8975f5c5SAndroid Build Coastguard Worker // TODO(jmadill): Use decltype here if/when UBSAN is fixed.
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker // System --------------------------------------------------------------
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker // Wall clock time in seconds since the epoch.
55*8975f5c5SAndroid Build Coastguard Worker // TODO(jmadill): investigate using an ANGLE internal time library
56*8975f5c5SAndroid Build Coastguard Worker using CurrentTimeFunc = double (*)(PlatformMethods *platform);
DefaultCurrentTime(PlatformMethods * platform)57*8975f5c5SAndroid Build Coastguard Worker inline double DefaultCurrentTime(PlatformMethods *platform)
58*8975f5c5SAndroid Build Coastguard Worker {
59*8975f5c5SAndroid Build Coastguard Worker     return 0.0;
60*8975f5c5SAndroid Build Coastguard Worker }
61*8975f5c5SAndroid Build Coastguard Worker 
62*8975f5c5SAndroid Build Coastguard Worker // Monotonically increasing time in seconds from an arbitrary fixed point in the past.
63*8975f5c5SAndroid Build Coastguard Worker // This function is expected to return at least millisecond-precision values. For this reason,
64*8975f5c5SAndroid Build Coastguard Worker // it is recommended that the fixed point be no further in the past than the epoch.
65*8975f5c5SAndroid Build Coastguard Worker using MonotonicallyIncreasingTimeFunc = double (*)(PlatformMethods *platform);
DefaultMonotonicallyIncreasingTime(PlatformMethods * platform)66*8975f5c5SAndroid Build Coastguard Worker inline double DefaultMonotonicallyIncreasingTime(PlatformMethods *platform)
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker     return 0.0;
69*8975f5c5SAndroid Build Coastguard Worker }
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker // Logging ------------------------------------------------------------
72*8975f5c5SAndroid Build Coastguard Worker 
73*8975f5c5SAndroid Build Coastguard Worker // Log an error message within the platform implementation.
74*8975f5c5SAndroid Build Coastguard Worker using LogErrorFunc = void (*)(PlatformMethods *platform, const char *errorMessage);
DefaultLogError(PlatformMethods * platform,const char * errorMessage)75*8975f5c5SAndroid Build Coastguard Worker inline void DefaultLogError(PlatformMethods *platform, const char *errorMessage) {}
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker // Log a warning message within the platform implementation.
78*8975f5c5SAndroid Build Coastguard Worker using LogWarningFunc = void (*)(PlatformMethods *platform, const char *warningMessage);
DefaultLogWarning(PlatformMethods * platform,const char * warningMessage)79*8975f5c5SAndroid Build Coastguard Worker inline void DefaultLogWarning(PlatformMethods *platform, const char *warningMessage) {}
80*8975f5c5SAndroid Build Coastguard Worker 
81*8975f5c5SAndroid Build Coastguard Worker // Log an info message within the platform implementation.
82*8975f5c5SAndroid Build Coastguard Worker using LogInfoFunc = void (*)(PlatformMethods *platform, const char *infoMessage);
DefaultLogInfo(PlatformMethods * platform,const char * infoMessage)83*8975f5c5SAndroid Build Coastguard Worker inline void DefaultLogInfo(PlatformMethods *platform, const char *infoMessage) {}
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker // Tracing --------
86*8975f5c5SAndroid Build Coastguard Worker 
87*8975f5c5SAndroid Build Coastguard Worker // Get a pointer to the enabled state of the given trace category. The
88*8975f5c5SAndroid Build Coastguard Worker // embedder can dynamically change the enabled state as trace event
89*8975f5c5SAndroid Build Coastguard Worker // recording is started and stopped by the application. Only long-lived
90*8975f5c5SAndroid Build Coastguard Worker // literal strings should be given as the category name. The implementation
91*8975f5c5SAndroid Build Coastguard Worker // expects the returned pointer to be held permanently in a local static. If
92*8975f5c5SAndroid Build Coastguard Worker // the unsigned char is non-zero, tracing is enabled. If tracing is enabled,
93*8975f5c5SAndroid Build Coastguard Worker // addTraceEvent is expected to be called by the trace event macros.
94*8975f5c5SAndroid Build Coastguard Worker using GetTraceCategoryEnabledFlagFunc = const unsigned char *(*)(PlatformMethods *platform,
95*8975f5c5SAndroid Build Coastguard Worker                                                                  const char *categoryName);
DefaultGetTraceCategoryEnabledFlag(PlatformMethods * platform,const char * categoryName)96*8975f5c5SAndroid Build Coastguard Worker inline const unsigned char *DefaultGetTraceCategoryEnabledFlag(PlatformMethods *platform,
97*8975f5c5SAndroid Build Coastguard Worker                                                                const char *categoryName)
98*8975f5c5SAndroid Build Coastguard Worker {
99*8975f5c5SAndroid Build Coastguard Worker     return nullptr;
100*8975f5c5SAndroid Build Coastguard Worker }
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker //
103*8975f5c5SAndroid Build Coastguard Worker // Add a trace event to the platform tracing system. Depending on the actual
104*8975f5c5SAndroid Build Coastguard Worker // enabled state, this event may be recorded or dropped.
105*8975f5c5SAndroid Build Coastguard Worker // - phase specifies the type of event:
106*8975f5c5SAndroid Build Coastguard Worker //   - BEGIN ('B'): Marks the beginning of a scoped event.
107*8975f5c5SAndroid Build Coastguard Worker //   - END ('E'): Marks the end of a scoped event.
108*8975f5c5SAndroid Build Coastguard Worker //   - COMPLETE ('X'): Marks the beginning of a scoped event, but doesn't
109*8975f5c5SAndroid Build Coastguard Worker //     need a matching END event. Instead, at the end of the scope,
110*8975f5c5SAndroid Build Coastguard Worker //     updateTraceEventDuration() must be called with the TraceEventHandle
111*8975f5c5SAndroid Build Coastguard Worker //     returned from addTraceEvent().
112*8975f5c5SAndroid Build Coastguard Worker //   - INSTANT ('I'): Standalone, instantaneous event.
113*8975f5c5SAndroid Build Coastguard Worker //   - START ('S'): Marks the beginning of an asynchronous event (the end
114*8975f5c5SAndroid Build Coastguard Worker //     event can occur in a different scope or thread). The id parameter is
115*8975f5c5SAndroid Build Coastguard Worker //     used to match START/FINISH pairs.
116*8975f5c5SAndroid Build Coastguard Worker //   - FINISH ('F'): Marks the end of an asynchronous event.
117*8975f5c5SAndroid Build Coastguard Worker //   - COUNTER ('C'): Used to trace integer quantities that change over
118*8975f5c5SAndroid Build Coastguard Worker //     time. The argument values are expected to be of type int.
119*8975f5c5SAndroid Build Coastguard Worker //   - METADATA ('M'): Reserved for internal use.
120*8975f5c5SAndroid Build Coastguard Worker // - categoryEnabled is the pointer returned by getTraceCategoryEnabledFlag.
121*8975f5c5SAndroid Build Coastguard Worker // - name is the name of the event. Also used to match BEGIN/END and
122*8975f5c5SAndroid Build Coastguard Worker //   START/FINISH pairs.
123*8975f5c5SAndroid Build Coastguard Worker // - id optionally allows events of the same name to be distinguished from
124*8975f5c5SAndroid Build Coastguard Worker //   each other. For example, to trace the construction and destruction of
125*8975f5c5SAndroid Build Coastguard Worker //   objects, specify the pointer as the id parameter.
126*8975f5c5SAndroid Build Coastguard Worker // - timestamp should be a time value returned from monotonicallyIncreasingTime.
127*8975f5c5SAndroid Build Coastguard Worker // - numArgs specifies the number of elements in argNames, argTypes, and
128*8975f5c5SAndroid Build Coastguard Worker //   argValues.
129*8975f5c5SAndroid Build Coastguard Worker // - argNames is the array of argument names. Use long-lived literal strings
130*8975f5c5SAndroid Build Coastguard Worker //   or specify the COPY flag.
131*8975f5c5SAndroid Build Coastguard Worker // - argTypes is the array of argument types:
132*8975f5c5SAndroid Build Coastguard Worker //   - BOOL (1): bool
133*8975f5c5SAndroid Build Coastguard Worker //   - UINT (2): unsigned long long
134*8975f5c5SAndroid Build Coastguard Worker //   - INT (3): long long
135*8975f5c5SAndroid Build Coastguard Worker //   - DOUBLE (4): double
136*8975f5c5SAndroid Build Coastguard Worker //   - POINTER (5): void*
137*8975f5c5SAndroid Build Coastguard Worker //   - STRING (6): char* (long-lived null-terminated char* string)
138*8975f5c5SAndroid Build Coastguard Worker //   - COPY_STRING (7): char* (temporary null-terminated char* string)
139*8975f5c5SAndroid Build Coastguard Worker //   - CONVERTABLE (8): WebConvertableToTraceFormat
140*8975f5c5SAndroid Build Coastguard Worker // - argValues is the array of argument values. Each value is the unsigned
141*8975f5c5SAndroid Build Coastguard Worker //   long long member of a union of all supported types.
142*8975f5c5SAndroid Build Coastguard Worker // - flags can be 0 or one or more of the following, ORed together:
143*8975f5c5SAndroid Build Coastguard Worker //   - COPY (0x1): treat all strings (name, argNames and argValues of type
144*8975f5c5SAndroid Build Coastguard Worker //     string) as temporary so that they will be copied by addTraceEvent.
145*8975f5c5SAndroid Build Coastguard Worker //   - HAS_ID (0x2): use the id argument to uniquely identify the event for
146*8975f5c5SAndroid Build Coastguard Worker //     matching with other events of the same name.
147*8975f5c5SAndroid Build Coastguard Worker //   - MANGLE_ID (0x4): specify this flag if the id parameter is the value
148*8975f5c5SAndroid Build Coastguard Worker //     of a pointer.
149*8975f5c5SAndroid Build Coastguard Worker using AddTraceEventFunc = angle::TraceEventHandle (*)(PlatformMethods *platform,
150*8975f5c5SAndroid Build Coastguard Worker                                                       char phase,
151*8975f5c5SAndroid Build Coastguard Worker                                                       const unsigned char *categoryEnabledFlag,
152*8975f5c5SAndroid Build Coastguard Worker                                                       const char *name,
153*8975f5c5SAndroid Build Coastguard Worker                                                       unsigned long long id,
154*8975f5c5SAndroid Build Coastguard Worker                                                       double timestamp,
155*8975f5c5SAndroid Build Coastguard Worker                                                       int numArgs,
156*8975f5c5SAndroid Build Coastguard Worker                                                       const char **argNames,
157*8975f5c5SAndroid Build Coastguard Worker                                                       const unsigned char *argTypes,
158*8975f5c5SAndroid Build Coastguard Worker                                                       const unsigned long long *argValues,
159*8975f5c5SAndroid Build Coastguard Worker                                                       unsigned char flags);
DefaultAddTraceEvent(PlatformMethods * platform,char phase,const unsigned char * categoryEnabledFlag,const char * name,unsigned long long id,double timestamp,int numArgs,const char ** argNames,const unsigned char * argTypes,const unsigned long long * argValues,unsigned char flags)160*8975f5c5SAndroid Build Coastguard Worker inline angle::TraceEventHandle DefaultAddTraceEvent(PlatformMethods *platform,
161*8975f5c5SAndroid Build Coastguard Worker                                                     char phase,
162*8975f5c5SAndroid Build Coastguard Worker                                                     const unsigned char *categoryEnabledFlag,
163*8975f5c5SAndroid Build Coastguard Worker                                                     const char *name,
164*8975f5c5SAndroid Build Coastguard Worker                                                     unsigned long long id,
165*8975f5c5SAndroid Build Coastguard Worker                                                     double timestamp,
166*8975f5c5SAndroid Build Coastguard Worker                                                     int numArgs,
167*8975f5c5SAndroid Build Coastguard Worker                                                     const char **argNames,
168*8975f5c5SAndroid Build Coastguard Worker                                                     const unsigned char *argTypes,
169*8975f5c5SAndroid Build Coastguard Worker                                                     const unsigned long long *argValues,
170*8975f5c5SAndroid Build Coastguard Worker                                                     unsigned char flags)
171*8975f5c5SAndroid Build Coastguard Worker {
172*8975f5c5SAndroid Build Coastguard Worker     return 0;
173*8975f5c5SAndroid Build Coastguard Worker }
174*8975f5c5SAndroid Build Coastguard Worker 
175*8975f5c5SAndroid Build Coastguard Worker // Set the duration field of a COMPLETE trace event.
176*8975f5c5SAndroid Build Coastguard Worker using UpdateTraceEventDurationFunc = void (*)(PlatformMethods *platform,
177*8975f5c5SAndroid Build Coastguard Worker                                               const unsigned char *categoryEnabledFlag,
178*8975f5c5SAndroid Build Coastguard Worker                                               const char *name,
179*8975f5c5SAndroid Build Coastguard Worker                                               angle::TraceEventHandle eventHandle);
DefaultUpdateTraceEventDuration(PlatformMethods * platform,const unsigned char * categoryEnabledFlag,const char * name,angle::TraceEventHandle eventHandle)180*8975f5c5SAndroid Build Coastguard Worker inline void DefaultUpdateTraceEventDuration(PlatformMethods *platform,
181*8975f5c5SAndroid Build Coastguard Worker                                             const unsigned char *categoryEnabledFlag,
182*8975f5c5SAndroid Build Coastguard Worker                                             const char *name,
183*8975f5c5SAndroid Build Coastguard Worker                                             angle::TraceEventHandle eventHandle)
184*8975f5c5SAndroid Build Coastguard Worker {}
185*8975f5c5SAndroid Build Coastguard Worker 
186*8975f5c5SAndroid Build Coastguard Worker // Callbacks for reporting histogram data.
187*8975f5c5SAndroid Build Coastguard Worker // CustomCounts histogram has exponential bucket sizes, so that min=1, max=1000000, bucketCount=50
188*8975f5c5SAndroid Build Coastguard Worker // would do.
189*8975f5c5SAndroid Build Coastguard Worker using HistogramCustomCountsFunc = void (*)(PlatformMethods *platform,
190*8975f5c5SAndroid Build Coastguard Worker                                            const char *name,
191*8975f5c5SAndroid Build Coastguard Worker                                            int sample,
192*8975f5c5SAndroid Build Coastguard Worker                                            int min,
193*8975f5c5SAndroid Build Coastguard Worker                                            int max,
194*8975f5c5SAndroid Build Coastguard Worker                                            int bucketCount);
DefaultHistogramCustomCounts(PlatformMethods * platform,const char * name,int sample,int min,int max,int bucketCount)195*8975f5c5SAndroid Build Coastguard Worker inline void DefaultHistogramCustomCounts(PlatformMethods *platform,
196*8975f5c5SAndroid Build Coastguard Worker                                          const char *name,
197*8975f5c5SAndroid Build Coastguard Worker                                          int sample,
198*8975f5c5SAndroid Build Coastguard Worker                                          int min,
199*8975f5c5SAndroid Build Coastguard Worker                                          int max,
200*8975f5c5SAndroid Build Coastguard Worker                                          int bucketCount)
201*8975f5c5SAndroid Build Coastguard Worker {}
202*8975f5c5SAndroid Build Coastguard Worker // Enumeration histogram buckets are linear, boundaryValue should be larger than any possible sample
203*8975f5c5SAndroid Build Coastguard Worker // value.
204*8975f5c5SAndroid Build Coastguard Worker using HistogramEnumerationFunc = void (*)(PlatformMethods *platform,
205*8975f5c5SAndroid Build Coastguard Worker                                           const char *name,
206*8975f5c5SAndroid Build Coastguard Worker                                           int sample,
207*8975f5c5SAndroid Build Coastguard Worker                                           int boundaryValue);
DefaultHistogramEnumeration(PlatformMethods * platform,const char * name,int sample,int boundaryValue)208*8975f5c5SAndroid Build Coastguard Worker inline void DefaultHistogramEnumeration(PlatformMethods *platform,
209*8975f5c5SAndroid Build Coastguard Worker                                         const char *name,
210*8975f5c5SAndroid Build Coastguard Worker                                         int sample,
211*8975f5c5SAndroid Build Coastguard Worker                                         int boundaryValue)
212*8975f5c5SAndroid Build Coastguard Worker {}
213*8975f5c5SAndroid Build Coastguard Worker // Unlike enumeration histograms, sparse histograms only allocate memory for non-empty buckets.
214*8975f5c5SAndroid Build Coastguard Worker using HistogramSparseFunc = void (*)(PlatformMethods *platform, const char *name, int sample);
DefaultHistogramSparse(PlatformMethods * platform,const char * name,int sample)215*8975f5c5SAndroid Build Coastguard Worker inline void DefaultHistogramSparse(PlatformMethods *platform, const char *name, int sample) {}
216*8975f5c5SAndroid Build Coastguard Worker // Boolean histograms track two-state variables.
217*8975f5c5SAndroid Build Coastguard Worker using HistogramBooleanFunc = void (*)(PlatformMethods *platform, const char *name, bool sample);
DefaultHistogramBoolean(PlatformMethods * platform,const char * name,bool sample)218*8975f5c5SAndroid Build Coastguard Worker inline void DefaultHistogramBoolean(PlatformMethods *platform, const char *name, bool sample) {}
219*8975f5c5SAndroid Build Coastguard Worker 
220*8975f5c5SAndroid Build Coastguard Worker // Callback on a successful program link with the program binary. Can be used to store
221*8975f5c5SAndroid Build Coastguard Worker // shaders to disk. Keys are a 160-bit SHA-1 hash.
222*8975f5c5SAndroid Build Coastguard Worker using ProgramKeyType   = std::array<uint8_t, 20>;
223*8975f5c5SAndroid Build Coastguard Worker using CacheProgramFunc = void (*)(PlatformMethods *platform,
224*8975f5c5SAndroid Build Coastguard Worker                                   const ProgramKeyType &key,
225*8975f5c5SAndroid Build Coastguard Worker                                   size_t programSize,
226*8975f5c5SAndroid Build Coastguard Worker                                   const uint8_t *programBytes);
DefaultCacheProgram(PlatformMethods * platform,const ProgramKeyType & key,size_t programSize,const uint8_t * programBytes)227*8975f5c5SAndroid Build Coastguard Worker inline void DefaultCacheProgram(PlatformMethods *platform,
228*8975f5c5SAndroid Build Coastguard Worker                                 const ProgramKeyType &key,
229*8975f5c5SAndroid Build Coastguard Worker                                 size_t programSize,
230*8975f5c5SAndroid Build Coastguard Worker                                 const uint8_t *programBytes)
231*8975f5c5SAndroid Build Coastguard Worker {}
232*8975f5c5SAndroid Build Coastguard Worker 
233*8975f5c5SAndroid Build Coastguard Worker using PostWorkerTaskCallback                       = void (*)(void *userData);
234*8975f5c5SAndroid Build Coastguard Worker using PostWorkerTaskFunc                           = void (*)(PlatformMethods *platform,
235*8975f5c5SAndroid Build Coastguard Worker                                     PostWorkerTaskCallback callback,
236*8975f5c5SAndroid Build Coastguard Worker                                     void *userData);
237*8975f5c5SAndroid Build Coastguard Worker constexpr PostWorkerTaskFunc DefaultPostWorkerTask = nullptr;
238*8975f5c5SAndroid Build Coastguard Worker 
239*8975f5c5SAndroid Build Coastguard Worker // Placeholder values where feature override callbacks used to be.  They are deprecated in favor of
240*8975f5c5SAndroid Build Coastguard Worker // EGL_ANGLE_feature_control.  The placeholders are there to keep the layout of the PlatformMethods
241*8975f5c5SAndroid Build Coastguard Worker // constant to support drop-in replacement of ANGLE's .so files in applications built with an older
242*8975f5c5SAndroid Build Coastguard Worker // header.
243*8975f5c5SAndroid Build Coastguard Worker using PlaceholderCallbackFunc = void (*)(...);
DefaultPlaceholderCallback(...)244*8975f5c5SAndroid Build Coastguard Worker inline void DefaultPlaceholderCallback(...) {}
245*8975f5c5SAndroid Build Coastguard Worker 
246*8975f5c5SAndroid Build Coastguard Worker // The boolean indicates whether the shader was in the cache or not. A value of true indicates it
247*8975f5c5SAndroid Build Coastguard Worker // was, where as false means it was not and needed to be compiled.
248*8975f5c5SAndroid Build Coastguard Worker using RecordShaderCacheUseFunc = void (*)(bool);
DefaultRecordShaderCacheUse(bool)249*8975f5c5SAndroid Build Coastguard Worker inline void DefaultRecordShaderCacheUse(bool) {}
250*8975f5c5SAndroid Build Coastguard Worker 
251*8975f5c5SAndroid Build Coastguard Worker // Platform methods are enumerated here once.
252*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_PLATFORM_OP(OP)                                    \
253*8975f5c5SAndroid Build Coastguard Worker     OP(currentTime, CurrentTime)                                 \
254*8975f5c5SAndroid Build Coastguard Worker     OP(monotonicallyIncreasingTime, MonotonicallyIncreasingTime) \
255*8975f5c5SAndroid Build Coastguard Worker     OP(logError, LogError)                                       \
256*8975f5c5SAndroid Build Coastguard Worker     OP(logWarning, LogWarning)                                   \
257*8975f5c5SAndroid Build Coastguard Worker     OP(logInfo, LogInfo)                                         \
258*8975f5c5SAndroid Build Coastguard Worker     OP(getTraceCategoryEnabledFlag, GetTraceCategoryEnabledFlag) \
259*8975f5c5SAndroid Build Coastguard Worker     OP(addTraceEvent, AddTraceEvent)                             \
260*8975f5c5SAndroid Build Coastguard Worker     OP(updateTraceEventDuration, UpdateTraceEventDuration)       \
261*8975f5c5SAndroid Build Coastguard Worker     OP(histogramCustomCounts, HistogramCustomCounts)             \
262*8975f5c5SAndroid Build Coastguard Worker     OP(histogramEnumeration, HistogramEnumeration)               \
263*8975f5c5SAndroid Build Coastguard Worker     OP(histogramSparse, HistogramSparse)                         \
264*8975f5c5SAndroid Build Coastguard Worker     OP(histogramBoolean, HistogramBoolean)                       \
265*8975f5c5SAndroid Build Coastguard Worker     OP(placeholder1, PlaceholderCallback)                        \
266*8975f5c5SAndroid Build Coastguard Worker     OP(placeholder2, PlaceholderCallback)                        \
267*8975f5c5SAndroid Build Coastguard Worker     OP(cacheProgram, CacheProgram)                               \
268*8975f5c5SAndroid Build Coastguard Worker     OP(placeholder3, PlaceholderCallback)                        \
269*8975f5c5SAndroid Build Coastguard Worker     OP(postWorkerTask, PostWorkerTask)                           \
270*8975f5c5SAndroid Build Coastguard Worker     OP(recordShaderCacheUse, RecordShaderCacheUse)
271*8975f5c5SAndroid Build Coastguard Worker 
272*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_PLATFORM_METHOD_DEF(Name, CapsName) CapsName##Func Name = Default##CapsName;
273*8975f5c5SAndroid Build Coastguard Worker 
274*8975f5c5SAndroid Build Coastguard Worker struct ANGLE_PLATFORM_EXPORT PlatformMethods
275*8975f5c5SAndroid Build Coastguard Worker {
276*8975f5c5SAndroid Build Coastguard Worker     inline PlatformMethods();
277*8975f5c5SAndroid Build Coastguard Worker 
278*8975f5c5SAndroid Build Coastguard Worker     // User data pointer for any implementation specific members. Put it at the start of the
279*8975f5c5SAndroid Build Coastguard Worker     // platform structure so it doesn't become overwritten if one version of the platform
280*8975f5c5SAndroid Build Coastguard Worker     // adds or removes new members.
281*8975f5c5SAndroid Build Coastguard Worker     void *context = 0;
282*8975f5c5SAndroid Build Coastguard Worker 
283*8975f5c5SAndroid Build Coastguard Worker     ANGLE_PLATFORM_OP(ANGLE_PLATFORM_METHOD_DEF)
284*8975f5c5SAndroid Build Coastguard Worker };
285*8975f5c5SAndroid Build Coastguard Worker 
286*8975f5c5SAndroid Build Coastguard Worker inline PlatformMethods::PlatformMethods() = default;
287*8975f5c5SAndroid Build Coastguard Worker 
288*8975f5c5SAndroid Build Coastguard Worker #undef ANGLE_PLATFORM_METHOD_DEF
289*8975f5c5SAndroid Build Coastguard Worker 
290*8975f5c5SAndroid Build Coastguard Worker // Subtract one to account for the context pointer.
291*8975f5c5SAndroid Build Coastguard Worker constexpr unsigned int g_NumPlatformMethods = (sizeof(PlatformMethods) / sizeof(uintptr_t)) - 1;
292*8975f5c5SAndroid Build Coastguard Worker 
293*8975f5c5SAndroid Build Coastguard Worker // No further uses of platform methods is allowed.  EGL extensions should be used instead.  While
294*8975f5c5SAndroid Build Coastguard Worker // methods are being removed, use PlaceholderCallback to keep the layout of PlatformMethods
295*8975f5c5SAndroid Build Coastguard Worker // constant.
296*8975f5c5SAndroid Build Coastguard Worker static_assert(g_NumPlatformMethods == 18, "Avoid adding methods to PlatformMethods");
297*8975f5c5SAndroid Build Coastguard Worker 
298*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_PLATFORM_METHOD_STRING(Name) #Name
299*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_PLATFORM_METHOD_STRING2(Name, CapsName) ANGLE_PLATFORM_METHOD_STRING(Name),
300*8975f5c5SAndroid Build Coastguard Worker 
301*8975f5c5SAndroid Build Coastguard Worker constexpr const char *const g_PlatformMethodNames[g_NumPlatformMethods] = {
302*8975f5c5SAndroid Build Coastguard Worker     ANGLE_PLATFORM_OP(ANGLE_PLATFORM_METHOD_STRING2)};
303*8975f5c5SAndroid Build Coastguard Worker 
304*8975f5c5SAndroid Build Coastguard Worker #undef ANGLE_PLATFORM_METHOD_STRING2
305*8975f5c5SAndroid Build Coastguard Worker #undef ANGLE_PLATFORM_METHOD_STRING
306*8975f5c5SAndroid Build Coastguard Worker 
307*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
308*8975f5c5SAndroid Build Coastguard Worker 
309*8975f5c5SAndroid Build Coastguard Worker extern "C" {
310*8975f5c5SAndroid Build Coastguard Worker 
311*8975f5c5SAndroid Build Coastguard Worker // Gets the platform methods on the passed-in EGL display. If the method name signature does not
312*8975f5c5SAndroid Build Coastguard Worker // match the compiled signature for this ANGLE, false is returned. On success true is returned.
313*8975f5c5SAndroid Build Coastguard Worker // The application should set any platform methods it cares about on the returned pointer.
314*8975f5c5SAndroid Build Coastguard Worker // If display is not valid, behaviour is undefined.
315*8975f5c5SAndroid Build Coastguard Worker 
316*8975f5c5SAndroid Build Coastguard Worker ANGLE_PLATFORM_EXPORT bool ANGLE_APIENTRY ANGLEGetDisplayPlatform(angle::EGLDisplayType display,
317*8975f5c5SAndroid Build Coastguard Worker                                                                   const char *const methodNames[],
318*8975f5c5SAndroid Build Coastguard Worker                                                                   unsigned int methodNameCount,
319*8975f5c5SAndroid Build Coastguard Worker                                                                   void *context,
320*8975f5c5SAndroid Build Coastguard Worker                                                                   void *platformMethodsOut);
321*8975f5c5SAndroid Build Coastguard Worker 
322*8975f5c5SAndroid Build Coastguard Worker // Sets the platform methods back to their defaults.
323*8975f5c5SAndroid Build Coastguard Worker // If display is not valid, behaviour is undefined.
324*8975f5c5SAndroid Build Coastguard Worker ANGLE_PLATFORM_EXPORT void ANGLE_APIENTRY ANGLEResetDisplayPlatform(angle::EGLDisplayType display);
325*8975f5c5SAndroid Build Coastguard Worker }  // extern "C"
326*8975f5c5SAndroid Build Coastguard Worker 
327*8975f5c5SAndroid Build Coastguard Worker namespace angle
328*8975f5c5SAndroid Build Coastguard Worker {
329*8975f5c5SAndroid Build Coastguard Worker typedef bool(ANGLE_APIENTRY *GetDisplayPlatformFunc)(angle::EGLDisplayType,
330*8975f5c5SAndroid Build Coastguard Worker                                                      const char *const *,
331*8975f5c5SAndroid Build Coastguard Worker                                                      unsigned int,
332*8975f5c5SAndroid Build Coastguard Worker                                                      void *,
333*8975f5c5SAndroid Build Coastguard Worker                                                      void *);
334*8975f5c5SAndroid Build Coastguard Worker typedef void(ANGLE_APIENTRY *ResetDisplayPlatformFunc)(angle::EGLDisplayType);
335*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
336*8975f5c5SAndroid Build Coastguard Worker 
337*8975f5c5SAndroid Build Coastguard Worker // This function is not exported
338*8975f5c5SAndroid Build Coastguard Worker angle::PlatformMethods *ANGLEPlatformCurrent();
339*8975f5c5SAndroid Build Coastguard Worker 
340*8975f5c5SAndroid Build Coastguard Worker #endif  // ANGLE_PLATFORMMETHODS_H
341