xref: /aosp_15_r20/external/angle/src/common/angleutils.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 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 
7*8975f5c5SAndroid Build Coastguard Worker // angleutils.h: Common ANGLE utilities.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #ifndef COMMON_ANGLEUTILS_H_
10*8975f5c5SAndroid Build Coastguard Worker #define COMMON_ANGLEUTILS_H_
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "common/platform.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_WITH_LSAN)
15*8975f5c5SAndroid Build Coastguard Worker #    include <sanitizer/lsan_interface.h>
16*8975f5c5SAndroid Build Coastguard Worker #endif  // defined(ANGLE_WITH_LSAN)
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_WITH_MSAN)
19*8975f5c5SAndroid Build Coastguard Worker #    include <sanitizer/msan_interface.h>
20*8975f5c5SAndroid Build Coastguard Worker #endif  // defined(ANGLE_WITH_MSAN)
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker #include <climits>
23*8975f5c5SAndroid Build Coastguard Worker #include <cstdarg>
24*8975f5c5SAndroid Build Coastguard Worker #include <cstddef>
25*8975f5c5SAndroid Build Coastguard Worker #include <mutex>
26*8975f5c5SAndroid Build Coastguard Worker #include <set>
27*8975f5c5SAndroid Build Coastguard Worker #include <sstream>
28*8975f5c5SAndroid Build Coastguard Worker #include <string>
29*8975f5c5SAndroid Build Coastguard Worker #include <thread>
30*8975f5c5SAndroid Build Coastguard Worker #include <vector>
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker namespace angle
33*8975f5c5SAndroid Build Coastguard Worker {
34*8975f5c5SAndroid Build Coastguard Worker 
35*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11)
36*8975f5c5SAndroid Build Coastguard Worker using Microsoft::WRL::ComPtr;
37*8975f5c5SAndroid Build Coastguard Worker #endif  // defined(ANGLE_ENABLE_D3D9) || defined(ANGLE_ENABLE_D3D11)
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker // Forward declaration. Implementation in system_utils.h
40*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_LINUX) || defined(ANGLE_PLATFORM_WINDOWS)
41*8975f5c5SAndroid Build Coastguard Worker using ThreadId = uint64_t;
42*8975f5c5SAndroid Build Coastguard Worker #else
43*8975f5c5SAndroid Build Coastguard Worker using ThreadId = std::thread::id;
44*8975f5c5SAndroid Build Coastguard Worker #endif
45*8975f5c5SAndroid Build Coastguard Worker 
46*8975f5c5SAndroid Build Coastguard Worker // A helper class to disallow copy and assignment operators
47*8975f5c5SAndroid Build Coastguard Worker class NonCopyable
48*8975f5c5SAndroid Build Coastguard Worker {
49*8975f5c5SAndroid Build Coastguard Worker   protected:
50*8975f5c5SAndroid Build Coastguard Worker     constexpr NonCopyable() = default;
51*8975f5c5SAndroid Build Coastguard Worker     ~NonCopyable()          = default;
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker   private:
54*8975f5c5SAndroid Build Coastguard Worker     NonCopyable(const NonCopyable &)    = delete;
55*8975f5c5SAndroid Build Coastguard Worker     void operator=(const NonCopyable &) = delete;
56*8975f5c5SAndroid Build Coastguard Worker };
57*8975f5c5SAndroid Build Coastguard Worker 
58*8975f5c5SAndroid Build Coastguard Worker extern const uintptr_t DirtyPointer;
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker // AMD_performance_monitor helpers.
61*8975f5c5SAndroid Build Coastguard Worker constexpr char kPerfMonitorExtensionName[] = "GL_AMD_performance_monitor";
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker struct PerfMonitorCounter
64*8975f5c5SAndroid Build Coastguard Worker {
65*8975f5c5SAndroid Build Coastguard Worker     PerfMonitorCounter();
66*8975f5c5SAndroid Build Coastguard Worker     ~PerfMonitorCounter();
67*8975f5c5SAndroid Build Coastguard Worker 
68*8975f5c5SAndroid Build Coastguard Worker     std::string name;
69*8975f5c5SAndroid Build Coastguard Worker     uint64_t value;
70*8975f5c5SAndroid Build Coastguard Worker };
71*8975f5c5SAndroid Build Coastguard Worker using PerfMonitorCounters = std::vector<PerfMonitorCounter>;
72*8975f5c5SAndroid Build Coastguard Worker 
73*8975f5c5SAndroid Build Coastguard Worker struct PerfMonitorCounterGroup
74*8975f5c5SAndroid Build Coastguard Worker {
75*8975f5c5SAndroid Build Coastguard Worker     PerfMonitorCounterGroup();
76*8975f5c5SAndroid Build Coastguard Worker     ~PerfMonitorCounterGroup();
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker     std::string name;
79*8975f5c5SAndroid Build Coastguard Worker     PerfMonitorCounters counters;
80*8975f5c5SAndroid Build Coastguard Worker };
81*8975f5c5SAndroid Build Coastguard Worker using PerfMonitorCounterGroups = std::vector<PerfMonitorCounterGroup>;
82*8975f5c5SAndroid Build Coastguard Worker 
83*8975f5c5SAndroid Build Coastguard Worker uint32_t GetPerfMonitorCounterIndex(const PerfMonitorCounters &counters, const std::string &name);
84*8975f5c5SAndroid Build Coastguard Worker const PerfMonitorCounter &GetPerfMonitorCounter(const PerfMonitorCounters &counters,
85*8975f5c5SAndroid Build Coastguard Worker                                                 const std::string &name);
86*8975f5c5SAndroid Build Coastguard Worker PerfMonitorCounter &GetPerfMonitorCounter(PerfMonitorCounters &counters, const std::string &name);
87*8975f5c5SAndroid Build Coastguard Worker uint32_t GetPerfMonitorCounterGroupIndex(const PerfMonitorCounterGroups &groups,
88*8975f5c5SAndroid Build Coastguard Worker                                          const std::string &name);
89*8975f5c5SAndroid Build Coastguard Worker const PerfMonitorCounterGroup &GetPerfMonitorCounterGroup(const PerfMonitorCounterGroups &groups,
90*8975f5c5SAndroid Build Coastguard Worker                                                           const std::string &name);
91*8975f5c5SAndroid Build Coastguard Worker PerfMonitorCounterGroup &GetPerfMonitorCounterGroup(PerfMonitorCounterGroups &groups,
92*8975f5c5SAndroid Build Coastguard Worker                                                     const std::string &name);
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker struct PerfMonitorTriplet
95*8975f5c5SAndroid Build Coastguard Worker {
96*8975f5c5SAndroid Build Coastguard Worker     uint32_t group;
97*8975f5c5SAndroid Build Coastguard Worker     uint32_t counter;
98*8975f5c5SAndroid Build Coastguard Worker     uint64_t value;
99*8975f5c5SAndroid Build Coastguard Worker };
100*8975f5c5SAndroid Build Coastguard Worker 
101*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_VK_PERF_COUNTERS_X(FN)               \
102*8975f5c5SAndroid Build Coastguard Worker     FN(commandQueueSubmitCallsTotal)               \
103*8975f5c5SAndroid Build Coastguard Worker     FN(commandQueueSubmitCallsPerFrame)            \
104*8975f5c5SAndroid Build Coastguard Worker     FN(vkQueueSubmitCallsTotal)                    \
105*8975f5c5SAndroid Build Coastguard Worker     FN(vkQueueSubmitCallsPerFrame)                 \
106*8975f5c5SAndroid Build Coastguard Worker     FN(commandQueueWaitSemaphoresTotal)            \
107*8975f5c5SAndroid Build Coastguard Worker     FN(renderPasses)                               \
108*8975f5c5SAndroid Build Coastguard Worker     FN(writeDescriptorSets)                        \
109*8975f5c5SAndroid Build Coastguard Worker     FN(flushedOutsideRenderPassCommandBuffers)     \
110*8975f5c5SAndroid Build Coastguard Worker     FN(swapchainResolveInSubpass)                  \
111*8975f5c5SAndroid Build Coastguard Worker     FN(swapchainResolveOutsideSubpass)             \
112*8975f5c5SAndroid Build Coastguard Worker     FN(resolveImageCommands)                       \
113*8975f5c5SAndroid Build Coastguard Worker     FN(colorLoadOpClears)                          \
114*8975f5c5SAndroid Build Coastguard Worker     FN(colorLoadOpLoads)                           \
115*8975f5c5SAndroid Build Coastguard Worker     FN(colorLoadOpNones)                           \
116*8975f5c5SAndroid Build Coastguard Worker     FN(colorStoreOpStores)                         \
117*8975f5c5SAndroid Build Coastguard Worker     FN(colorStoreOpNones)                          \
118*8975f5c5SAndroid Build Coastguard Worker     FN(colorClearAttachments)                      \
119*8975f5c5SAndroid Build Coastguard Worker     FN(depthLoadOpClears)                          \
120*8975f5c5SAndroid Build Coastguard Worker     FN(depthLoadOpLoads)                           \
121*8975f5c5SAndroid Build Coastguard Worker     FN(depthLoadOpNones)                           \
122*8975f5c5SAndroid Build Coastguard Worker     FN(depthStoreOpStores)                         \
123*8975f5c5SAndroid Build Coastguard Worker     FN(depthStoreOpNones)                          \
124*8975f5c5SAndroid Build Coastguard Worker     FN(depthClearAttachments)                      \
125*8975f5c5SAndroid Build Coastguard Worker     FN(stencilLoadOpClears)                        \
126*8975f5c5SAndroid Build Coastguard Worker     FN(stencilLoadOpLoads)                         \
127*8975f5c5SAndroid Build Coastguard Worker     FN(stencilLoadOpNones)                         \
128*8975f5c5SAndroid Build Coastguard Worker     FN(stencilStoreOpStores)                       \
129*8975f5c5SAndroid Build Coastguard Worker     FN(stencilStoreOpNones)                        \
130*8975f5c5SAndroid Build Coastguard Worker     FN(stencilClearAttachments)                    \
131*8975f5c5SAndroid Build Coastguard Worker     FN(colorAttachmentUnresolves)                  \
132*8975f5c5SAndroid Build Coastguard Worker     FN(depthAttachmentUnresolves)                  \
133*8975f5c5SAndroid Build Coastguard Worker     FN(stencilAttachmentUnresolves)                \
134*8975f5c5SAndroid Build Coastguard Worker     FN(colorAttachmentResolves)                    \
135*8975f5c5SAndroid Build Coastguard Worker     FN(depthAttachmentResolves)                    \
136*8975f5c5SAndroid Build Coastguard Worker     FN(stencilAttachmentResolves)                  \
137*8975f5c5SAndroid Build Coastguard Worker     FN(readOnlyDepthStencilRenderPasses)           \
138*8975f5c5SAndroid Build Coastguard Worker     FN(pipelineCreationCacheHits)                  \
139*8975f5c5SAndroid Build Coastguard Worker     FN(pipelineCreationCacheMisses)                \
140*8975f5c5SAndroid Build Coastguard Worker     FN(pipelineCreationTotalCacheHitsDurationNs)   \
141*8975f5c5SAndroid Build Coastguard Worker     FN(pipelineCreationTotalCacheMissesDurationNs) \
142*8975f5c5SAndroid Build Coastguard Worker     FN(monolithicPipelineCreation)                 \
143*8975f5c5SAndroid Build Coastguard Worker     FN(descriptorSetAllocations)                   \
144*8975f5c5SAndroid Build Coastguard Worker     FN(descriptorSetCacheTotalSize)                \
145*8975f5c5SAndroid Build Coastguard Worker     FN(descriptorSetCacheKeySizeBytes)             \
146*8975f5c5SAndroid Build Coastguard Worker     FN(uniformsAndXfbDescriptorSetCacheHits)       \
147*8975f5c5SAndroid Build Coastguard Worker     FN(uniformsAndXfbDescriptorSetCacheMisses)     \
148*8975f5c5SAndroid Build Coastguard Worker     FN(uniformsAndXfbDescriptorSetCacheTotalSize)  \
149*8975f5c5SAndroid Build Coastguard Worker     FN(textureDescriptorSetCacheHits)              \
150*8975f5c5SAndroid Build Coastguard Worker     FN(textureDescriptorSetCacheMisses)            \
151*8975f5c5SAndroid Build Coastguard Worker     FN(textureDescriptorSetCacheTotalSize)         \
152*8975f5c5SAndroid Build Coastguard Worker     FN(shaderResourcesDescriptorSetCacheHits)      \
153*8975f5c5SAndroid Build Coastguard Worker     FN(deviceMemoryImageAllocationFallbacks)       \
154*8975f5c5SAndroid Build Coastguard Worker     FN(mutableTexturesUploaded)                    \
155*8975f5c5SAndroid Build Coastguard Worker     FN(fullImageClears)                            \
156*8975f5c5SAndroid Build Coastguard Worker     FN(shaderResourcesDescriptorSetCacheMisses)    \
157*8975f5c5SAndroid Build Coastguard Worker     FN(shaderResourcesDescriptorSetCacheTotalSize) \
158*8975f5c5SAndroid Build Coastguard Worker     FN(buffersGhosted)                             \
159*8975f5c5SAndroid Build Coastguard Worker     FN(vertexArraySyncStateCalls)                  \
160*8975f5c5SAndroid Build Coastguard Worker     FN(allocateNewBufferBlockCalls)                \
161*8975f5c5SAndroid Build Coastguard Worker     FN(bufferSuballocationCalls)                   \
162*8975f5c5SAndroid Build Coastguard Worker     FN(dynamicBufferAllocations)                   \
163*8975f5c5SAndroid Build Coastguard Worker     FN(framebufferCacheSize)                       \
164*8975f5c5SAndroid Build Coastguard Worker     FN(pendingSubmissionGarbageObjects)
165*8975f5c5SAndroid Build Coastguard Worker 
166*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_DECLARE_PERF_COUNTER(COUNTER) uint64_t COUNTER;
167*8975f5c5SAndroid Build Coastguard Worker 
168*8975f5c5SAndroid Build Coastguard Worker struct VulkanPerfCounters
169*8975f5c5SAndroid Build Coastguard Worker {
170*8975f5c5SAndroid Build Coastguard Worker     ANGLE_VK_PERF_COUNTERS_X(ANGLE_DECLARE_PERF_COUNTER)
171*8975f5c5SAndroid Build Coastguard Worker };
172*8975f5c5SAndroid Build Coastguard Worker 
173*8975f5c5SAndroid Build Coastguard Worker #undef ANGLE_DECLARE_PERF_COUNTER
174*8975f5c5SAndroid Build Coastguard Worker 
175*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
176*8975f5c5SAndroid Build Coastguard Worker 
177*8975f5c5SAndroid Build Coastguard Worker template <typename T, size_t N>
ArraySize(T (&)[N])178*8975f5c5SAndroid Build Coastguard Worker constexpr inline size_t ArraySize(T (&)[N])
179*8975f5c5SAndroid Build Coastguard Worker {
180*8975f5c5SAndroid Build Coastguard Worker     return N;
181*8975f5c5SAndroid Build Coastguard Worker }
182*8975f5c5SAndroid Build Coastguard Worker 
183*8975f5c5SAndroid Build Coastguard Worker template <typename T>
184*8975f5c5SAndroid Build Coastguard Worker class WrappedArray final : angle::NonCopyable
185*8975f5c5SAndroid Build Coastguard Worker {
186*8975f5c5SAndroid Build Coastguard Worker   public:
187*8975f5c5SAndroid Build Coastguard Worker     template <size_t N>
WrappedArray(const T (& data)[N])188*8975f5c5SAndroid Build Coastguard Worker     constexpr WrappedArray(const T (&data)[N]) : mArray(&data[0]), mSize(N)
189*8975f5c5SAndroid Build Coastguard Worker     {}
190*8975f5c5SAndroid Build Coastguard Worker 
WrappedArray()191*8975f5c5SAndroid Build Coastguard Worker     constexpr WrappedArray() : mArray(nullptr), mSize(0) {}
WrappedArray(const T * data,size_t size)192*8975f5c5SAndroid Build Coastguard Worker     constexpr WrappedArray(const T *data, size_t size) : mArray(data), mSize(size) {}
193*8975f5c5SAndroid Build Coastguard Worker 
WrappedArray(WrappedArray && other)194*8975f5c5SAndroid Build Coastguard Worker     WrappedArray(WrappedArray &&other) : WrappedArray()
195*8975f5c5SAndroid Build Coastguard Worker     {
196*8975f5c5SAndroid Build Coastguard Worker         std::swap(mArray, other.mArray);
197*8975f5c5SAndroid Build Coastguard Worker         std::swap(mSize, other.mSize);
198*8975f5c5SAndroid Build Coastguard Worker     }
199*8975f5c5SAndroid Build Coastguard Worker 
~WrappedArray()200*8975f5c5SAndroid Build Coastguard Worker     ~WrappedArray() {}
201*8975f5c5SAndroid Build Coastguard Worker 
get()202*8975f5c5SAndroid Build Coastguard Worker     constexpr const T *get() const { return mArray; }
size()203*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t size() const { return mSize; }
204*8975f5c5SAndroid Build Coastguard Worker 
205*8975f5c5SAndroid Build Coastguard Worker   private:
206*8975f5c5SAndroid Build Coastguard Worker     const T *mArray;
207*8975f5c5SAndroid Build Coastguard Worker     size_t mSize;
208*8975f5c5SAndroid Build Coastguard Worker };
209*8975f5c5SAndroid Build Coastguard Worker 
210*8975f5c5SAndroid Build Coastguard Worker template <typename T, unsigned int N>
SafeRelease(T (& resourceBlock)[N])211*8975f5c5SAndroid Build Coastguard Worker void SafeRelease(T (&resourceBlock)[N])
212*8975f5c5SAndroid Build Coastguard Worker {
213*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < N; i++)
214*8975f5c5SAndroid Build Coastguard Worker     {
215*8975f5c5SAndroid Build Coastguard Worker         SafeRelease(resourceBlock[i]);
216*8975f5c5SAndroid Build Coastguard Worker     }
217*8975f5c5SAndroid Build Coastguard Worker }
218*8975f5c5SAndroid Build Coastguard Worker 
219*8975f5c5SAndroid Build Coastguard Worker template <typename T>
SafeRelease(T & resource)220*8975f5c5SAndroid Build Coastguard Worker void SafeRelease(T &resource)
221*8975f5c5SAndroid Build Coastguard Worker {
222*8975f5c5SAndroid Build Coastguard Worker     if (resource)
223*8975f5c5SAndroid Build Coastguard Worker     {
224*8975f5c5SAndroid Build Coastguard Worker         resource->Release();
225*8975f5c5SAndroid Build Coastguard Worker         resource = nullptr;
226*8975f5c5SAndroid Build Coastguard Worker     }
227*8975f5c5SAndroid Build Coastguard Worker }
228*8975f5c5SAndroid Build Coastguard Worker 
229*8975f5c5SAndroid Build Coastguard Worker template <typename T>
SafeDelete(T * & resource)230*8975f5c5SAndroid Build Coastguard Worker void SafeDelete(T *&resource)
231*8975f5c5SAndroid Build Coastguard Worker {
232*8975f5c5SAndroid Build Coastguard Worker     delete resource;
233*8975f5c5SAndroid Build Coastguard Worker     resource = nullptr;
234*8975f5c5SAndroid Build Coastguard Worker }
235*8975f5c5SAndroid Build Coastguard Worker 
236*8975f5c5SAndroid Build Coastguard Worker template <typename T>
SafeDeleteContainer(T & resource)237*8975f5c5SAndroid Build Coastguard Worker void SafeDeleteContainer(T &resource)
238*8975f5c5SAndroid Build Coastguard Worker {
239*8975f5c5SAndroid Build Coastguard Worker     for (auto &element : resource)
240*8975f5c5SAndroid Build Coastguard Worker     {
241*8975f5c5SAndroid Build Coastguard Worker         SafeDelete(element);
242*8975f5c5SAndroid Build Coastguard Worker     }
243*8975f5c5SAndroid Build Coastguard Worker     resource.clear();
244*8975f5c5SAndroid Build Coastguard Worker }
245*8975f5c5SAndroid Build Coastguard Worker 
246*8975f5c5SAndroid Build Coastguard Worker template <typename T>
SafeDeleteArray(T * & resource)247*8975f5c5SAndroid Build Coastguard Worker void SafeDeleteArray(T *&resource)
248*8975f5c5SAndroid Build Coastguard Worker {
249*8975f5c5SAndroid Build Coastguard Worker     delete[] resource;
250*8975f5c5SAndroid Build Coastguard Worker     resource = nullptr;
251*8975f5c5SAndroid Build Coastguard Worker }
252*8975f5c5SAndroid Build Coastguard Worker 
253*8975f5c5SAndroid Build Coastguard Worker // Provide a less-than function for comparing structs
254*8975f5c5SAndroid Build Coastguard Worker // Note: struct memory must be initialized to zero, because of packing gaps
255*8975f5c5SAndroid Build Coastguard Worker template <typename T>
StructLessThan(const T & a,const T & b)256*8975f5c5SAndroid Build Coastguard Worker inline bool StructLessThan(const T &a, const T &b)
257*8975f5c5SAndroid Build Coastguard Worker {
258*8975f5c5SAndroid Build Coastguard Worker     return (memcmp(&a, &b, sizeof(T)) < 0);
259*8975f5c5SAndroid Build Coastguard Worker }
260*8975f5c5SAndroid Build Coastguard Worker 
261*8975f5c5SAndroid Build Coastguard Worker // Provide a less-than function for comparing structs
262*8975f5c5SAndroid Build Coastguard Worker // Note: struct memory must be initialized to zero, because of packing gaps
263*8975f5c5SAndroid Build Coastguard Worker template <typename T>
StructEquals(const T & a,const T & b)264*8975f5c5SAndroid Build Coastguard Worker inline bool StructEquals(const T &a, const T &b)
265*8975f5c5SAndroid Build Coastguard Worker {
266*8975f5c5SAndroid Build Coastguard Worker     return (memcmp(&a, &b, sizeof(T)) == 0);
267*8975f5c5SAndroid Build Coastguard Worker }
268*8975f5c5SAndroid Build Coastguard Worker 
269*8975f5c5SAndroid Build Coastguard Worker template <typename T>
StructZero(T * obj)270*8975f5c5SAndroid Build Coastguard Worker inline void StructZero(T *obj)
271*8975f5c5SAndroid Build Coastguard Worker {
272*8975f5c5SAndroid Build Coastguard Worker     memset(obj, 0, sizeof(T));
273*8975f5c5SAndroid Build Coastguard Worker }
274*8975f5c5SAndroid Build Coastguard Worker 
275*8975f5c5SAndroid Build Coastguard Worker template <typename T>
IsMaskFlagSet(T mask,T flag)276*8975f5c5SAndroid Build Coastguard Worker inline bool IsMaskFlagSet(T mask, T flag)
277*8975f5c5SAndroid Build Coastguard Worker {
278*8975f5c5SAndroid Build Coastguard Worker     // Handles multibit flags as well
279*8975f5c5SAndroid Build Coastguard Worker     return (mask & flag) == flag;
280*8975f5c5SAndroid Build Coastguard Worker }
281*8975f5c5SAndroid Build Coastguard Worker 
MakeStaticString(const std::string & str)282*8975f5c5SAndroid Build Coastguard Worker inline const char *MakeStaticString(const std::string &str)
283*8975f5c5SAndroid Build Coastguard Worker {
284*8975f5c5SAndroid Build Coastguard Worker     // On the heap so that no destructor runs on application exit.
285*8975f5c5SAndroid Build Coastguard Worker     static std::set<std::string> *strings = new std::set<std::string>;
286*8975f5c5SAndroid Build Coastguard Worker     std::set<std::string>::iterator it    = strings->find(str);
287*8975f5c5SAndroid Build Coastguard Worker     if (it != strings->end())
288*8975f5c5SAndroid Build Coastguard Worker     {
289*8975f5c5SAndroid Build Coastguard Worker         return it->c_str();
290*8975f5c5SAndroid Build Coastguard Worker     }
291*8975f5c5SAndroid Build Coastguard Worker 
292*8975f5c5SAndroid Build Coastguard Worker     return strings->insert(str).first->c_str();
293*8975f5c5SAndroid Build Coastguard Worker }
294*8975f5c5SAndroid Build Coastguard Worker 
295*8975f5c5SAndroid Build Coastguard Worker std::string ArrayString(unsigned int i);
296*8975f5c5SAndroid Build Coastguard Worker 
297*8975f5c5SAndroid Build Coastguard Worker // Indices are stored in vectors with the outermost index in the back. In the output of the function
298*8975f5c5SAndroid Build Coastguard Worker // the indices are reversed.
299*8975f5c5SAndroid Build Coastguard Worker std::string ArrayIndexString(const std::vector<unsigned int> &indices);
300*8975f5c5SAndroid Build Coastguard Worker 
Str(int i)301*8975f5c5SAndroid Build Coastguard Worker inline std::string Str(int i)
302*8975f5c5SAndroid Build Coastguard Worker {
303*8975f5c5SAndroid Build Coastguard Worker     std::stringstream strstr;
304*8975f5c5SAndroid Build Coastguard Worker     strstr << i;
305*8975f5c5SAndroid Build Coastguard Worker     return strstr.str();
306*8975f5c5SAndroid Build Coastguard Worker }
307*8975f5c5SAndroid Build Coastguard Worker 
308*8975f5c5SAndroid Build Coastguard Worker template <typename T>
ToString(const T & value)309*8975f5c5SAndroid Build Coastguard Worker std::string ToString(const T &value)
310*8975f5c5SAndroid Build Coastguard Worker {
311*8975f5c5SAndroid Build Coastguard Worker     std::ostringstream o;
312*8975f5c5SAndroid Build Coastguard Worker     o << value;
313*8975f5c5SAndroid Build Coastguard Worker     return o.str();
314*8975f5c5SAndroid Build Coastguard Worker }
315*8975f5c5SAndroid Build Coastguard Worker 
IsLittleEndian()316*8975f5c5SAndroid Build Coastguard Worker inline bool IsLittleEndian()
317*8975f5c5SAndroid Build Coastguard Worker {
318*8975f5c5SAndroid Build Coastguard Worker     constexpr uint32_t kEndiannessTest = 1;
319*8975f5c5SAndroid Build Coastguard Worker     const bool isLittleEndian          = *reinterpret_cast<const uint8_t *>(&kEndiannessTest) == 1;
320*8975f5c5SAndroid Build Coastguard Worker     return isLittleEndian;
321*8975f5c5SAndroid Build Coastguard Worker }
322*8975f5c5SAndroid Build Coastguard Worker 
323*8975f5c5SAndroid Build Coastguard Worker // Helper macro that casts to a bitfield type then verifies no bits were dropped.
324*8975f5c5SAndroid Build Coastguard Worker #define SetBitField(lhs, rhs)                                                         \
325*8975f5c5SAndroid Build Coastguard Worker     do                                                                                \
326*8975f5c5SAndroid Build Coastguard Worker     {                                                                                 \
327*8975f5c5SAndroid Build Coastguard Worker         auto ANGLE_LOCAL_VAR = rhs;                                                   \
328*8975f5c5SAndroid Build Coastguard Worker         lhs = static_cast<typename std::decay<decltype(lhs)>::type>(ANGLE_LOCAL_VAR); \
329*8975f5c5SAndroid Build Coastguard Worker         ASSERT(static_cast<decltype(ANGLE_LOCAL_VAR)>(lhs) == ANGLE_LOCAL_VAR);       \
330*8975f5c5SAndroid Build Coastguard Worker     } while (0)
331*8975f5c5SAndroid Build Coastguard Worker 
332*8975f5c5SAndroid Build Coastguard Worker // snprintf is not defined with MSVC prior to to msvc14
333*8975f5c5SAndroid Build Coastguard Worker #if defined(_MSC_VER) && _MSC_VER < 1900
334*8975f5c5SAndroid Build Coastguard Worker #    define snprintf _snprintf
335*8975f5c5SAndroid Build Coastguard Worker #endif
336*8975f5c5SAndroid Build Coastguard Worker 
337*8975f5c5SAndroid Build Coastguard Worker #define GL_A1RGB5_ANGLEX 0x6AC5
338*8975f5c5SAndroid Build Coastguard Worker #define GL_BGRX8_ANGLEX 0x6ABA
339*8975f5c5SAndroid Build Coastguard Worker #define GL_BGR565_ANGLEX 0x6ABB
340*8975f5c5SAndroid Build Coastguard Worker #define GL_BGRA4_ANGLEX 0x6ABC
341*8975f5c5SAndroid Build Coastguard Worker #define GL_BGR5_A1_ANGLEX 0x6ABD
342*8975f5c5SAndroid Build Coastguard Worker #define GL_INT_64_ANGLEX 0x6ABE
343*8975f5c5SAndroid Build Coastguard Worker #define GL_UINT_64_ANGLEX 0x6ABF
344*8975f5c5SAndroid Build Coastguard Worker #define GL_BGRA8_SRGB_ANGLEX 0x6AC0
345*8975f5c5SAndroid Build Coastguard Worker #define GL_BGR10_A2_ANGLEX 0x6AF9
346*8975f5c5SAndroid Build Coastguard Worker #define GL_BGRX8_SRGB_ANGLEX 0x6AFC
347*8975f5c5SAndroid Build Coastguard Worker // fake format for GL_ANGLE_rgbx_internal_format
348*8975f5c5SAndroid Build Coastguard Worker #define GL_RGBX8_SRGB_ANGLEX 0x6AFA
349*8975f5c5SAndroid Build Coastguard Worker 
350*8975f5c5SAndroid Build Coastguard Worker // These are fake formats used to fit typeless D3D textures that can be bound to EGL pbuffers into
351*8975f5c5SAndroid Build Coastguard Worker // the format system (for extension EGL_ANGLE_d3d_texture_client_buffer):
352*8975f5c5SAndroid Build Coastguard Worker #define GL_RGBA8_TYPELESS_ANGLEX 0x6AC1
353*8975f5c5SAndroid Build Coastguard Worker #define GL_RGBA8_TYPELESS_SRGB_ANGLEX 0x6AC2
354*8975f5c5SAndroid Build Coastguard Worker #define GL_BGRA8_TYPELESS_ANGLEX 0x6AC3
355*8975f5c5SAndroid Build Coastguard Worker #define GL_BGRA8_TYPELESS_SRGB_ANGLEX 0x6AC4
356*8975f5c5SAndroid Build Coastguard Worker 
357*8975f5c5SAndroid Build Coastguard Worker #define GL_R8_SSCALED_ANGLEX 0x6AC6
358*8975f5c5SAndroid Build Coastguard Worker #define GL_RG8_SSCALED_ANGLEX 0x6AC7
359*8975f5c5SAndroid Build Coastguard Worker #define GL_RGB8_SSCALED_ANGLEX 0x6AC8
360*8975f5c5SAndroid Build Coastguard Worker #define GL_RGBA8_SSCALED_ANGLEX 0x6AC9
361*8975f5c5SAndroid Build Coastguard Worker #define GL_R8_USCALED_ANGLEX 0x6ACA
362*8975f5c5SAndroid Build Coastguard Worker #define GL_RG8_USCALED_ANGLEX 0x6ACB
363*8975f5c5SAndroid Build Coastguard Worker #define GL_RGB8_USCALED_ANGLEX 0x6ACC
364*8975f5c5SAndroid Build Coastguard Worker #define GL_RGBA8_USCALED_ANGLEX 0x6ACD
365*8975f5c5SAndroid Build Coastguard Worker 
366*8975f5c5SAndroid Build Coastguard Worker #define GL_R16_SSCALED_ANGLEX 0x6ACE
367*8975f5c5SAndroid Build Coastguard Worker #define GL_RG16_SSCALED_ANGLEX 0x6ACF
368*8975f5c5SAndroid Build Coastguard Worker #define GL_RGB16_SSCALED_ANGLEX 0x6AD0
369*8975f5c5SAndroid Build Coastguard Worker #define GL_RGBA16_SSCALED_ANGLEX 0x6AD1
370*8975f5c5SAndroid Build Coastguard Worker #define GL_R16_USCALED_ANGLEX 0x6AD2
371*8975f5c5SAndroid Build Coastguard Worker #define GL_RG16_USCALED_ANGLEX 0x6AD3
372*8975f5c5SAndroid Build Coastguard Worker #define GL_RGB16_USCALED_ANGLEX 0x6AD4
373*8975f5c5SAndroid Build Coastguard Worker #define GL_RGBA16_USCALED_ANGLEX 0x6AD5
374*8975f5c5SAndroid Build Coastguard Worker 
375*8975f5c5SAndroid Build Coastguard Worker #define GL_R32_SSCALED_ANGLEX 0x6AD6
376*8975f5c5SAndroid Build Coastguard Worker #define GL_RG32_SSCALED_ANGLEX 0x6AD7
377*8975f5c5SAndroid Build Coastguard Worker #define GL_RGB32_SSCALED_ANGLEX 0x6AD8
378*8975f5c5SAndroid Build Coastguard Worker #define GL_RGBA32_SSCALED_ANGLEX 0x6AD9
379*8975f5c5SAndroid Build Coastguard Worker #define GL_R32_USCALED_ANGLEX 0x6ADA
380*8975f5c5SAndroid Build Coastguard Worker #define GL_RG32_USCALED_ANGLEX 0x6ADB
381*8975f5c5SAndroid Build Coastguard Worker #define GL_RGB32_USCALED_ANGLEX 0x6ADC
382*8975f5c5SAndroid Build Coastguard Worker #define GL_RGBA32_USCALED_ANGLEX 0x6ADD
383*8975f5c5SAndroid Build Coastguard Worker 
384*8975f5c5SAndroid Build Coastguard Worker #define GL_R32_SNORM_ANGLEX 0x6ADE
385*8975f5c5SAndroid Build Coastguard Worker #define GL_RG32_SNORM_ANGLEX 0x6ADF
386*8975f5c5SAndroid Build Coastguard Worker #define GL_RGB32_SNORM_ANGLEX 0x6AE0
387*8975f5c5SAndroid Build Coastguard Worker #define GL_RGBA32_SNORM_ANGLEX 0x6AE1
388*8975f5c5SAndroid Build Coastguard Worker #define GL_R32_UNORM_ANGLEX 0x6AE2
389*8975f5c5SAndroid Build Coastguard Worker #define GL_RG32_UNORM_ANGLEX 0x6AE3
390*8975f5c5SAndroid Build Coastguard Worker #define GL_RGB32_UNORM_ANGLEX 0x6AE4
391*8975f5c5SAndroid Build Coastguard Worker #define GL_RGBA32_UNORM_ANGLEX 0x6AE5
392*8975f5c5SAndroid Build Coastguard Worker 
393*8975f5c5SAndroid Build Coastguard Worker #define GL_R32_FIXED_ANGLEX 0x6AE6
394*8975f5c5SAndroid Build Coastguard Worker #define GL_RG32_FIXED_ANGLEX 0x6AE7
395*8975f5c5SAndroid Build Coastguard Worker #define GL_RGB32_FIXED_ANGLEX 0x6AE8
396*8975f5c5SAndroid Build Coastguard Worker #define GL_RGBA32_FIXED_ANGLEX 0x6AE9
397*8975f5c5SAndroid Build Coastguard Worker 
398*8975f5c5SAndroid Build Coastguard Worker #define GL_RGB10_A2_SINT_ANGLEX 0x6AEA
399*8975f5c5SAndroid Build Coastguard Worker #define GL_RGB10_A2_SNORM_ANGLEX 0x6AEB
400*8975f5c5SAndroid Build Coastguard Worker #define GL_RGB10_A2_SSCALED_ANGLEX 0x6AEC
401*8975f5c5SAndroid Build Coastguard Worker #define GL_RGB10_A2_USCALED_ANGLEX 0x6AED
402*8975f5c5SAndroid Build Coastguard Worker 
403*8975f5c5SAndroid Build Coastguard Worker // These are fake formats for OES_vertex_type_10_10_10_2
404*8975f5c5SAndroid Build Coastguard Worker #define GL_A2_RGB10_UNORM_ANGLEX 0x6AEF
405*8975f5c5SAndroid Build Coastguard Worker #define GL_A2_RGB10_SNORM_ANGLEX 0x6AF0
406*8975f5c5SAndroid Build Coastguard Worker #define GL_A2_RGB10_USCALED_ANGLEX 0x6AF1
407*8975f5c5SAndroid Build Coastguard Worker #define GL_A2_RGB10_SSCALED_ANGLEX 0x6AF2
408*8975f5c5SAndroid Build Coastguard Worker #define GL_X2_RGB10_UINT_ANGLEX 0x6AF3
409*8975f5c5SAndroid Build Coastguard Worker #define GL_X2_RGB10_SINT_ANGLEX 0x6AF4
410*8975f5c5SAndroid Build Coastguard Worker #define GL_X2_RGB10_USCALED_ANGLEX 0x6AF5
411*8975f5c5SAndroid Build Coastguard Worker #define GL_X2_RGB10_SSCALED_ANGLEX 0x6AF6
412*8975f5c5SAndroid Build Coastguard Worker #define GL_X2_RGB10_UNORM_ANGLEX 0x6AF7
413*8975f5c5SAndroid Build Coastguard Worker #define GL_X2_RGB10_SNORM_ANGLEX 0x6AF8
414*8975f5c5SAndroid Build Coastguard Worker 
415*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_CHECK_GL_ALLOC(context, result) \
416*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CHECK(context, result, "Failed to allocate host memory", GL_OUT_OF_MEMORY)
417*8975f5c5SAndroid Build Coastguard Worker 
418*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_CHECK_GL_MATH(context, result) \
419*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CHECK(context, result, "Integer overflow.", GL_INVALID_OPERATION)
420*8975f5c5SAndroid Build Coastguard Worker 
421*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_GL_UNREACHABLE(context) \
422*8975f5c5SAndroid Build Coastguard Worker     UNREACHABLE();                    \
423*8975f5c5SAndroid Build Coastguard Worker     ANGLE_CHECK(context, false, "Unreachable Code.", GL_INVALID_OPERATION)
424*8975f5c5SAndroid Build Coastguard Worker 
425*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_WITH_LSAN)
426*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_SCOPED_DISABLE_LSAN() __lsan::ScopedDisabler lsanDisabler
427*8975f5c5SAndroid Build Coastguard Worker #else
428*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_SCOPED_DISABLE_LSAN()
429*8975f5c5SAndroid Build Coastguard Worker #endif
430*8975f5c5SAndroid Build Coastguard Worker 
431*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_WITH_MSAN)
432*8975f5c5SAndroid Build Coastguard Worker class MsanScopedDisableInterceptorChecks final : angle::NonCopyable
433*8975f5c5SAndroid Build Coastguard Worker {
434*8975f5c5SAndroid Build Coastguard Worker   public:
MsanScopedDisableInterceptorChecks()435*8975f5c5SAndroid Build Coastguard Worker     MsanScopedDisableInterceptorChecks() { __msan_scoped_disable_interceptor_checks(); }
~MsanScopedDisableInterceptorChecks()436*8975f5c5SAndroid Build Coastguard Worker     ~MsanScopedDisableInterceptorChecks() { __msan_scoped_enable_interceptor_checks(); }
437*8975f5c5SAndroid Build Coastguard Worker };
438*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_SCOPED_DISABLE_MSAN() \
439*8975f5c5SAndroid Build Coastguard Worker         MsanScopedDisableInterceptorChecks msanScopedDisableInterceptorChecks
440*8975f5c5SAndroid Build Coastguard Worker #else
441*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_SCOPED_DISABLE_MSAN()
442*8975f5c5SAndroid Build Coastguard Worker #endif
443*8975f5c5SAndroid Build Coastguard Worker 
444*8975f5c5SAndroid Build Coastguard Worker // The ANGLE_NO_SANITIZE_MEMORY macro suppresses MemorySanitizer checks for
445*8975f5c5SAndroid Build Coastguard Worker // use-of-uninitialized-data. It can be used to decorate functions with known
446*8975f5c5SAndroid Build Coastguard Worker // false positives.
447*8975f5c5SAndroid Build Coastguard Worker #ifdef __clang__
448*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory))
449*8975f5c5SAndroid Build Coastguard Worker #else
450*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_NO_SANITIZE_MEMORY
451*8975f5c5SAndroid Build Coastguard Worker #endif
452*8975f5c5SAndroid Build Coastguard Worker 
453*8975f5c5SAndroid Build Coastguard Worker // Similar to the above, but for thread sanitization.
454*8975f5c5SAndroid Build Coastguard Worker #ifdef __clang__
455*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread))
456*8975f5c5SAndroid Build Coastguard Worker #else
457*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_NO_SANITIZE_THREAD
458*8975f5c5SAndroid Build Coastguard Worker #endif
459*8975f5c5SAndroid Build Coastguard Worker 
460*8975f5c5SAndroid Build Coastguard Worker // Similar to the above, but for cfi-icall.
461*8975f5c5SAndroid Build Coastguard Worker #ifdef __clang__
462*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_NO_SANITIZE_CFI_ICALL __attribute__((no_sanitize("cfi-icall")))
463*8975f5c5SAndroid Build Coastguard Worker #else
464*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_NO_SANITIZE_CFI_ICALL
465*8975f5c5SAndroid Build Coastguard Worker #endif
466*8975f5c5SAndroid Build Coastguard Worker 
467*8975f5c5SAndroid Build Coastguard Worker // The below inlining code lifted from V8.
468*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__) || (defined(__GNUC__) && defined(__has_attribute))
469*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline))
470*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_HAS___FORCEINLINE 0
471*8975f5c5SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
472*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_HAS_ATTRIBUTE_ALWAYS_INLINE 0
473*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_HAS___FORCEINLINE 1
474*8975f5c5SAndroid Build Coastguard Worker #else
475*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_HAS_ATTRIBUTE_ALWAYS_INLINE 0
476*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_HAS___FORCEINLINE 0
477*8975f5c5SAndroid Build Coastguard Worker #endif
478*8975f5c5SAndroid Build Coastguard Worker 
479*8975f5c5SAndroid Build Coastguard Worker #if defined(NDEBUG) && ANGLE_HAS_ATTRIBUTE_ALWAYS_INLINE
480*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_INLINE inline __attribute__((always_inline))
481*8975f5c5SAndroid Build Coastguard Worker #elif defined(NDEBUG) && ANGLE_HAS___FORCEINLINE
482*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_INLINE __forceinline
483*8975f5c5SAndroid Build Coastguard Worker #else
484*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_INLINE inline
485*8975f5c5SAndroid Build Coastguard Worker #endif
486*8975f5c5SAndroid Build Coastguard Worker 
487*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__) || (defined(__GNUC__) && defined(__has_attribute))
488*8975f5c5SAndroid Build Coastguard Worker #    if __has_attribute(noinline)
489*8975f5c5SAndroid Build Coastguard Worker #        define ANGLE_NOINLINE __attribute__((noinline))
490*8975f5c5SAndroid Build Coastguard Worker #    else
491*8975f5c5SAndroid Build Coastguard Worker #        define ANGLE_NOINLINE
492*8975f5c5SAndroid Build Coastguard Worker #    endif
493*8975f5c5SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
494*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_NOINLINE __declspec(noinline)
495*8975f5c5SAndroid Build Coastguard Worker #else
496*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_NOINLINE
497*8975f5c5SAndroid Build Coastguard Worker #endif
498*8975f5c5SAndroid Build Coastguard Worker 
499*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__) || (defined(__GNUC__) && defined(__has_attribute))
500*8975f5c5SAndroid Build Coastguard Worker #    if __has_attribute(format)
501*8975f5c5SAndroid Build Coastguard Worker #        define ANGLE_FORMAT_PRINTF(fmt, args) __attribute__((format(__printf__, fmt, args)))
502*8975f5c5SAndroid Build Coastguard Worker #    else
503*8975f5c5SAndroid Build Coastguard Worker #        define ANGLE_FORMAT_PRINTF(fmt, args)
504*8975f5c5SAndroid Build Coastguard Worker #    endif
505*8975f5c5SAndroid Build Coastguard Worker #else
506*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_FORMAT_PRINTF(fmt, args)
507*8975f5c5SAndroid Build Coastguard Worker #endif
508*8975f5c5SAndroid Build Coastguard Worker 
509*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__) || (defined(__GNUC__) && defined(__has_attribute))
510*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_HAS_ATTRIBUTE_CONSTRUCTOR (__has_attribute(constructor))
511*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_HAS_ATTRIBUTE_DESTRUCTOR (__has_attribute(destructor))
512*8975f5c5SAndroid Build Coastguard Worker #else
513*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_HAS_ATTRIBUTE_CONSTRUCTOR 0
514*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_HAS_ATTRIBUTE_DESTRUCTOR 0
515*8975f5c5SAndroid Build Coastguard Worker #endif
516*8975f5c5SAndroid Build Coastguard Worker 
517*8975f5c5SAndroid Build Coastguard Worker #if ANGLE_HAS_ATTRIBUTE_CONSTRUCTOR
518*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_CONSTRUCTOR __attribute__((constructor))
519*8975f5c5SAndroid Build Coastguard Worker #endif
520*8975f5c5SAndroid Build Coastguard Worker 
521*8975f5c5SAndroid Build Coastguard Worker #if ANGLE_HAS_ATTRIBUTE_DESTRUCTOR
522*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_DESTRUCTOR __attribute__((destructor))
523*8975f5c5SAndroid Build Coastguard Worker #endif
524*8975f5c5SAndroid Build Coastguard Worker 
525*8975f5c5SAndroid Build Coastguard Worker ANGLE_FORMAT_PRINTF(1, 0)
526*8975f5c5SAndroid Build Coastguard Worker size_t FormatStringIntoVector(const char *fmt, va_list vararg, std::vector<char> &buffer);
527*8975f5c5SAndroid Build Coastguard Worker 
528*8975f5c5SAndroid Build Coastguard Worker // Format messes up the # inside the macro.
529*8975f5c5SAndroid Build Coastguard Worker // clang-format off
530*8975f5c5SAndroid Build Coastguard Worker #ifndef ANGLE_STRINGIFY
531*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_STRINGIFY(x) #x
532*8975f5c5SAndroid Build Coastguard Worker #endif
533*8975f5c5SAndroid Build Coastguard Worker // clang-format on
534*8975f5c5SAndroid Build Coastguard Worker 
535*8975f5c5SAndroid Build Coastguard Worker #ifndef ANGLE_MACRO_STRINGIFY
536*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_MACRO_STRINGIFY(x) ANGLE_STRINGIFY(x)
537*8975f5c5SAndroid Build Coastguard Worker #endif
538*8975f5c5SAndroid Build Coastguard Worker 
539*8975f5c5SAndroid Build Coastguard Worker // The ANGLE_MAYBE_UNUSED_PRIVATE_FIELD can be used to hint 'unused private field'
540*8975f5c5SAndroid Build Coastguard Worker // instead of 'maybe_unused' attribute for the compatibility with GCC because
541*8975f5c5SAndroid Build Coastguard Worker // GCC doesn't have '-Wno-unused-private-field' whereas Clang has.
542*8975f5c5SAndroid Build Coastguard Worker #if defined(__clang__) || defined(_MSC_VER)
543*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_MAYBE_UNUSED_PRIVATE_FIELD [[maybe_unused]]
544*8975f5c5SAndroid Build Coastguard Worker #else
545*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_MAYBE_UNUSED_PRIVATE_FIELD
546*8975f5c5SAndroid Build Coastguard Worker #endif
547*8975f5c5SAndroid Build Coastguard Worker 
548*8975f5c5SAndroid Build Coastguard Worker #if __has_cpp_attribute(clang::require_constant_initialization)
549*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_REQUIRE_CONSTANT_INIT [[clang::require_constant_initialization]]
550*8975f5c5SAndroid Build Coastguard Worker #else
551*8975f5c5SAndroid Build Coastguard Worker #    define ANGLE_REQUIRE_CONSTANT_INIT
552*8975f5c5SAndroid Build Coastguard Worker #endif  // __has_cpp_attribute(require_constant_initialization)
553*8975f5c5SAndroid Build Coastguard Worker 
554*8975f5c5SAndroid Build Coastguard Worker // Compiler configs.
IsASan()555*8975f5c5SAndroid Build Coastguard Worker inline bool IsASan()
556*8975f5c5SAndroid Build Coastguard Worker {
557*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_WITH_ASAN)
558*8975f5c5SAndroid Build Coastguard Worker     return true;
559*8975f5c5SAndroid Build Coastguard Worker #else
560*8975f5c5SAndroid Build Coastguard Worker     return false;
561*8975f5c5SAndroid Build Coastguard Worker #endif  // defined(ANGLE_WITH_ASAN)
562*8975f5c5SAndroid Build Coastguard Worker }
563*8975f5c5SAndroid Build Coastguard Worker 
IsMSan()564*8975f5c5SAndroid Build Coastguard Worker inline bool IsMSan()
565*8975f5c5SAndroid Build Coastguard Worker {
566*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_WITH_MSAN)
567*8975f5c5SAndroid Build Coastguard Worker     return true;
568*8975f5c5SAndroid Build Coastguard Worker #else
569*8975f5c5SAndroid Build Coastguard Worker     return false;
570*8975f5c5SAndroid Build Coastguard Worker #endif  // defined(ANGLE_WITH_MSAN)
571*8975f5c5SAndroid Build Coastguard Worker }
572*8975f5c5SAndroid Build Coastguard Worker 
IsTSan()573*8975f5c5SAndroid Build Coastguard Worker inline bool IsTSan()
574*8975f5c5SAndroid Build Coastguard Worker {
575*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_WITH_TSAN)
576*8975f5c5SAndroid Build Coastguard Worker     return true;
577*8975f5c5SAndroid Build Coastguard Worker #else
578*8975f5c5SAndroid Build Coastguard Worker     return false;
579*8975f5c5SAndroid Build Coastguard Worker #endif  // defined(ANGLE_WITH_TSAN)
580*8975f5c5SAndroid Build Coastguard Worker }
581*8975f5c5SAndroid Build Coastguard Worker 
IsUBSan()582*8975f5c5SAndroid Build Coastguard Worker inline bool IsUBSan()
583*8975f5c5SAndroid Build Coastguard Worker {
584*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_WITH_UBSAN)
585*8975f5c5SAndroid Build Coastguard Worker     return true;
586*8975f5c5SAndroid Build Coastguard Worker #else
587*8975f5c5SAndroid Build Coastguard Worker     return false;
588*8975f5c5SAndroid Build Coastguard Worker #endif  // defined(ANGLE_WITH_UBSAN)
589*8975f5c5SAndroid Build Coastguard Worker }
590*8975f5c5SAndroid Build Coastguard Worker #endif  // COMMON_ANGLEUTILS_H_
591