diff options
Diffstat (limited to 'chromium/third_party/angle/include')
8 files changed, 419 insertions, 329 deletions
diff --git a/chromium/third_party/angle/include/EGL/eglext_angle.h b/chromium/third_party/angle/include/EGL/eglext_angle.h index 03c39860dc6..4702d95a4c3 100644 --- a/chromium/third_party/angle/include/EGL/eglext_angle.h +++ b/chromium/third_party/angle/include/EGL/eglext_angle.h @@ -56,6 +56,7 @@ #define EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE 0x3209 #define EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE 0x320A #define EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE 0x345E +#define EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE 0x348F #endif /* EGL_ANGLE_platform_angle */ #ifndef EGL_ANGLE_platform_angle_d3d @@ -253,6 +254,14 @@ EGLAPI EGLBoolean EGLAPIENTRY eglGetMscRateANGLE(EGLDisplay dpy, #define EGL_POWER_PREFERENCE_ANGLE 0x3482 #define EGL_LOW_POWER_ANGLE 0x0001 #define EGL_HIGH_POWER_ANGLE 0x0002 +typedef void(EGLAPIENTRYP PFNEGLRELEASEHIGHPOWERGPUANGLEPROC) (EGLDisplay dpy, EGLContext ctx); +typedef void(EGLAPIENTRYP PFNEGLREACQUIREHIGHPOWERGPUANGLEPROC) (EGLDisplay dpy, EGLContext ctx); +typedef void(EGLAPIENTRYP PFNEGLHANDLEGPUSWITCHANGLEPROC) (EGLDisplay dpy); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI void EGLAPIENTRY eglReleaseHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx); +EGLAPI void EGLAPIENTRY eglReacquireHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx); +EGLAPI void EGLAPIENTRY eglHandleGPUSwitchANGLE(EGLDisplay dpy); +#endif #endif /* EGL_ANGLE_power_preference */ #ifndef EGL_ANGLE_feature_control diff --git a/chromium/third_party/angle/include/GLES2/gl2ext_angle.h b/chromium/third_party/angle/include/GLES2/gl2ext_angle.h index bc56c149faf..ed9612f85bc 100644 --- a/chromium/third_party/angle/include/GLES2/gl2ext_angle.h +++ b/chromium/third_party/angle/include/GLES2/gl2ext_angle.h @@ -510,6 +510,11 @@ GL_APICALL void GL_APIENTRY glImportSemaphoreZirconHandleANGLE(GLuint memory, #endif #endif /* GL_ANGLE_semaphore_fuchsia */ +#ifndef GL_CHROMIUM_texture_filtering_hint +#define GL_CHROMIUM_texture_filtering_hint +#define GL_TEXTURE_FILTERING_HINT_CHROMIUM 0x8AF0 +#endif /* GL_CHROMIUM_texture_filtering_hint */ + // clang-format on #endif // INCLUDE_GLES2_GL2EXT_ANGLE_H_ diff --git a/chromium/third_party/angle/include/GLSLANG/ShaderLang.h b/chromium/third_party/angle/include/GLSLANG/ShaderLang.h index 92bb2e20cbf..ca16898b2bc 100644 --- a/chromium/third_party/angle/include/GLSLANG/ShaderLang.h +++ b/chromium/third_party/angle/include/GLSLANG/ShaderLang.h @@ -26,7 +26,7 @@ // Version number for shader translation API. // It is incremented every time the API changes. -#define ANGLE_SH_VERSION 229 +#define ANGLE_SH_VERSION 230 enum ShShaderSpec { @@ -399,6 +399,8 @@ struct ShBuiltInResources int ANGLE_base_vertex_base_instance; int WEBGL_video_texture; int APPLE_clip_distance; + int OES_texture_cube_map_array; + int EXT_texture_cube_map_array; // Set to 1 to enable replacing GL_EXT_draw_buffers #extension directives // with GL_NV_draw_buffers in ESSL output. This flag can be used to emulate diff --git a/chromium/third_party/angle/include/GLSLANG/ShaderVars.h b/chromium/third_party/angle/include/GLSLANG/ShaderVars.h index 477d2d299da..9911546b90d 100644 --- a/chromium/third_party/angle/include/GLSLANG/ShaderVars.h +++ b/chromium/third_party/angle/include/GLSLANG/ShaderVars.h @@ -120,6 +120,10 @@ struct ShaderVariable const ShaderVariable **leafVar, std::string *originalFullName) const; + // Find the child field which matches 'fullName' == var.name + "." + field.name. + // Return nullptr if not found. + const sh::ShaderVariable *findField(const std::string &fullName, uint32_t *fieldIndexOut) const; + bool isBuiltIn() const; bool isEmulatedBuiltIn() const; diff --git a/chromium/third_party/angle/include/platform/FeaturesGL.h b/chromium/third_party/angle/include/platform/FeaturesGL.h index 4c7595bb428..403b733957f 100644 --- a/chromium/third_party/angle/include/platform/FeaturesGL.h +++ b/chromium/third_party/angle/include/platform/FeaturesGL.h @@ -436,6 +436,34 @@ struct FeaturesGL : FeatureSetBase Feature disableSemaphoreFd = {"disable_semaphore_fd", FeatureCategory::OpenGLWorkarounds, "Disable GL_EXT_semaphore_fd extension", &members, "https://crbug.com/1046462"}; + + // GL_EXT_disjoint_timer_query doesn't work properly with Linux VMWare drivers. + Feature disableTimestampQueries = { + "disable_timestamp_queries", FeatureCategory::OpenGLWorkarounds, + "Disable GL_EXT_disjoint_timer_query extension", &members, "https://crbug.com/811661"}; + + // Some drivers use linear blending when generating mipmaps for sRGB textures. Work around this + // by generating mipmaps in a linear texture and copying back to sRGB. + Feature encodeAndDecodeSRGBForGenerateMipmap = { + "decode_encode_srgb_for_generatemipmap", FeatureCategory::OpenGLWorkarounds, + "Decode and encode before generateMipmap for srgb format textures.", &members, + "http://anglebug.com/4646"}; + + Feature emulateCopyTexImage2DFromRenderbuffers = { + "emulate_copyteximage2d_from_renderbuffers", FeatureCategory::OpenGLWorkarounds, + "CopyTexImage2D spuriously returns errors on iOS when copying from renderbuffers.", + &members, "https://anglebug.com/4674"}; + + Feature disableGPUSwitchingSupport = { + "disable_gpu_switching_support", FeatureCategory::OpenGLWorkarounds, + "Disable GPU switching support (use only the low-power GPU) on older MacBook Pros.", + &members, "https://crbug.com/1091824"}; + + // KHR_parallel_shader_compile fails TSAN on Linux, so we avoid using it with this workaround. + Feature disableNativeParallelCompile = { + "disable_native_parallel_compile", FeatureCategory::OpenGLWorkarounds, + "Do not use native KHR_parallel_shader_compile even when available.", &members, + "http://crbug.com/1094869"}; }; inline FeaturesGL::FeaturesGL() = default; diff --git a/chromium/third_party/angle/include/platform/FeaturesVk.h b/chromium/third_party/angle/include/platform/FeaturesVk.h index 10457ba2cfc..fedca40886b 100644 --- a/chromium/third_party/angle/include/platform/FeaturesVk.h +++ b/chromium/third_party/angle/include/platform/FeaturesVk.h @@ -108,6 +108,12 @@ struct FeaturesVk : FeatureSetBase "VkDevice supports the VK_ANDROID_external_memory_android_hardware_buffer extension", &members}; + // Whether the VkDevice supports the VK_GGP_frame_token extension, on which + // the EGL_ANGLE_swap_with_frame_token extension can be layered. + Feature supportsGGPFrameToken = {"supports_ggp_frame_token", FeatureCategory::VulkanFeatures, + "VkDevice supports the VK_GGP_frame_token extension", + &members}; + // Whether the VkDevice supports the VK_KHR_external_memory_fd extension, on which the // GL_EXT_memory_object_fd extension can be layered. Feature supportsExternalMemoryFd = { @@ -120,6 +126,10 @@ struct FeaturesVk : FeatureSetBase "supports_external_memory_fuchsia", FeatureCategory::VulkanFeatures, "VkDevice supports the VK_FUCHSIA_external_memory extension", &members}; + angle::Feature supportsFilteringPrecision = { + "supports_filtering_precision_google", FeatureCategory::VulkanFeatures, + "VkDevice supports the VK_GOOGLE_sampler_filtering_precision extension", &members}; + // Whether the VkDevice supports the VK_KHR_external_fence_capabilities extension. Feature supportsExternalFenceCapabilities = { "supports_external_fence_capabilities", FeatureCategory::VulkanFeatures, @@ -304,6 +314,22 @@ struct FeaturesVk : FeatureSetBase Feature supportDepthStencilRenderingFeedbackLoops = { "support_depth_stencil_rendering_feedback_loops", FeatureCategory::VulkanFeatures, "Suport depth/stencil rendering feedback loops", &members, "http://anglebug.com/4490"}; + + // Desktop (at least NVIDIA) drivers prefer combining barriers into one vkCmdPipelineBarrier + // call over issuing multiple barrier calls with fine grained dependency information to have + // better performance. http://anglebug.com/4633 + Feature preferAggregateBarrierCalls = { + "prefer_aggregate_barrier_calls", FeatureCategory::VulkanWorkarounds, + "Single barrier call is preferred over multiple calls with " + "fine grained pipeline stage dependency information", + &members, "http://anglebug.com/4633"}; + + // Enable parallel thread that processes and submits vulkan command buffers. + // Currently off by default to enable testing. + Feature enableCommandProcessingThread = { + "enable_command_processing_thread", FeatureCategory::VulkanFeatures, + "Enable parallel processing and submission of Vulkan commands in worker thread", &members, + "http://anglebug.com/4324"}; }; inline FeaturesVk::FeaturesVk() = default; diff --git a/chromium/third_party/angle/include/platform/Platform.h b/chromium/third_party/angle/include/platform/Platform.h index 1316740085c..2c9537ed46b 100644 --- a/chromium/third_party/angle/include/platform/Platform.h +++ b/chromium/third_party/angle/include/platform/Platform.h @@ -1,333 +1,10 @@ // -// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Copyright 2020 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - -// Platform.h: The public interface ANGLE exposes to the API layer, for -// doing platform-specific tasks like gathering data, or for tracing. - -#ifndef ANGLE_PLATFORM_H -#define ANGLE_PLATFORM_H - -#include <stdint.h> -#include <stdlib.h> -#include <array> - -#define EGL_PLATFORM_ANGLE_PLATFORM_METHODS_ANGLEX 0x3482 - -#if !defined(ANGLE_PLATFORM_EXPORT) -# if defined(_WIN32) -# if !defined(LIBANGLE_IMPLEMENTATION) -# define ANGLE_PLATFORM_EXPORT __declspec(dllimport) -# else -# define ANGLE_PLATFORM_EXPORT __declspec(dllexport) -# endif -# elif defined(__GNUC__) || defined(__clang__) -# define ANGLE_PLATFORM_EXPORT __attribute__((visibility("default"))) -# endif -#endif -#if !defined(ANGLE_PLATFORM_EXPORT) -# define ANGLE_PLATFORM_EXPORT -#endif - -#if defined(_WIN32) -# define ANGLE_APIENTRY __stdcall -#else -# define ANGLE_APIENTRY -#endif - -namespace angle -{ -struct FeaturesD3D; -struct FeaturesVk; -struct FeaturesMtl; -using TraceEventHandle = uint64_t; -using EGLDisplayType = void *; -struct PlatformMethods; - -// Use a C-like API to not trigger undefined calling behaviour. -// Avoid using decltype here to work around sanitizer limitations. -// TODO(jmadill): Use decltype here if/when UBSAN is fixed. - -// System -------------------------------------------------------------- - -// Wall clock time in seconds since the epoch. -// TODO(jmadill): investigate using an ANGLE internal time library -using CurrentTimeFunc = double (*)(PlatformMethods *platform); -inline double DefaultCurrentTime(PlatformMethods *platform) -{ - return 0.0; -} - -// Monotonically increasing time in seconds from an arbitrary fixed point in the past. -// This function is expected to return at least millisecond-precision values. For this reason, -// it is recommended that the fixed point be no further in the past than the epoch. -using MonotonicallyIncreasingTimeFunc = double (*)(PlatformMethods *platform); -inline double DefaultMonotonicallyIncreasingTime(PlatformMethods *platform) -{ - return 0.0; -} - -// Logging ------------------------------------------------------------ - -// Log an error message within the platform implementation. -using LogErrorFunc = void (*)(PlatformMethods *platform, const char *errorMessage); -inline void DefaultLogError(PlatformMethods *platform, const char *errorMessage) {} - -// Log a warning message within the platform implementation. -using LogWarningFunc = void (*)(PlatformMethods *platform, const char *warningMessage); -inline void DefaultLogWarning(PlatformMethods *platform, const char *warningMessage) {} - -// Log an info message within the platform implementation. -using LogInfoFunc = void (*)(PlatformMethods *platform, const char *infoMessage); -inline void DefaultLogInfo(PlatformMethods *platform, const char *infoMessage) {} - -// Tracing -------- - -// Get a pointer to the enabled state of the given trace category. The -// embedder can dynamically change the enabled state as trace event -// recording is started and stopped by the application. Only long-lived -// literal strings should be given as the category name. The implementation -// expects the returned pointer to be held permanently in a local static. If -// the unsigned char is non-zero, tracing is enabled. If tracing is enabled, -// addTraceEvent is expected to be called by the trace event macros. -using GetTraceCategoryEnabledFlagFunc = const unsigned char *(*)(PlatformMethods *platform, - const char *categoryName); -inline const unsigned char *DefaultGetTraceCategoryEnabledFlag(PlatformMethods *platform, - const char *categoryName) -{ - return nullptr; -} - // -// Add a trace event to the platform tracing system. Depending on the actual -// enabled state, this event may be recorded or dropped. -// - phase specifies the type of event: -// - BEGIN ('B'): Marks the beginning of a scoped event. -// - END ('E'): Marks the end of a scoped event. -// - COMPLETE ('X'): Marks the beginning of a scoped event, but doesn't -// need a matching END event. Instead, at the end of the scope, -// updateTraceEventDuration() must be called with the TraceEventHandle -// returned from addTraceEvent(). -// - INSTANT ('I'): Standalone, instantaneous event. -// - START ('S'): Marks the beginning of an asynchronous event (the end -// event can occur in a different scope or thread). The id parameter is -// used to match START/FINISH pairs. -// - FINISH ('F'): Marks the end of an asynchronous event. -// - COUNTER ('C'): Used to trace integer quantities that change over -// time. The argument values are expected to be of type int. -// - METADATA ('M'): Reserved for internal use. -// - categoryEnabled is the pointer returned by getTraceCategoryEnabledFlag. -// - name is the name of the event. Also used to match BEGIN/END and -// START/FINISH pairs. -// - id optionally allows events of the same name to be distinguished from -// each other. For example, to trace the construction and destruction of -// objects, specify the pointer as the id parameter. -// - timestamp should be a time value returned from monotonicallyIncreasingTime. -// - numArgs specifies the number of elements in argNames, argTypes, and -// argValues. -// - argNames is the array of argument names. Use long-lived literal strings -// or specify the COPY flag. -// - argTypes is the array of argument types: -// - BOOL (1): bool -// - UINT (2): unsigned long long -// - INT (3): long long -// - DOUBLE (4): double -// - POINTER (5): void* -// - STRING (6): char* (long-lived null-terminated char* string) -// - COPY_STRING (7): char* (temporary null-terminated char* string) -// - CONVERTABLE (8): WebConvertableToTraceFormat -// - argValues is the array of argument values. Each value is the unsigned -// long long member of a union of all supported types. -// - flags can be 0 or one or more of the following, ORed together: -// - COPY (0x1): treat all strings (name, argNames and argValues of type -// string) as temporary so that they will be copied by addTraceEvent. -// - HAS_ID (0x2): use the id argument to uniquely identify the event for -// matching with other events of the same name. -// - MANGLE_ID (0x4): specify this flag if the id parameter is the value -// of a pointer. -using AddTraceEventFunc = angle::TraceEventHandle (*)(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); -inline angle::TraceEventHandle 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) -{ - return 0; -} - -// Set the duration field of a COMPLETE trace event. -using UpdateTraceEventDurationFunc = void (*)(PlatformMethods *platform, - const unsigned char *categoryEnabledFlag, - const char *name, - angle::TraceEventHandle eventHandle); -inline void DefaultUpdateTraceEventDuration(PlatformMethods *platform, - const unsigned char *categoryEnabledFlag, - const char *name, - angle::TraceEventHandle eventHandle) -{} - -// Callbacks for reporting histogram data. -// CustomCounts histogram has exponential bucket sizes, so that min=1, max=1000000, bucketCount=50 -// would do. -using HistogramCustomCountsFunc = void (*)(PlatformMethods *platform, - const char *name, - int sample, - int min, - int max, - int bucketCount); -inline void DefaultHistogramCustomCounts(PlatformMethods *platform, - const char *name, - int sample, - int min, - int max, - int bucketCount) -{} -// Enumeration histogram buckets are linear, boundaryValue should be larger than any possible sample -// value. -using HistogramEnumerationFunc = void (*)(PlatformMethods *platform, - const char *name, - int sample, - int boundaryValue); -inline void DefaultHistogramEnumeration(PlatformMethods *platform, - const char *name, - int sample, - int boundaryValue) -{} -// Unlike enumeration histograms, sparse histograms only allocate memory for non-empty buckets. -using HistogramSparseFunc = void (*)(PlatformMethods *platform, const char *name, int sample); -inline void DefaultHistogramSparse(PlatformMethods *platform, const char *name, int sample) {} -// Boolean histograms track two-state variables. -using HistogramBooleanFunc = void (*)(PlatformMethods *platform, const char *name, bool sample); -inline void DefaultHistogramBoolean(PlatformMethods *platform, const char *name, bool sample) {} - -// Allows us to programatically override ANGLE's default workarounds for testing purposes. -using OverrideWorkaroundsD3DFunc = void (*)(PlatformMethods *platform, - angle::FeaturesD3D *featuresD3D); -inline void DefaultOverrideWorkaroundsD3D(PlatformMethods *platform, - angle::FeaturesD3D *featuresD3D) -{} - -using OverrideFeaturesVkFunc = void (*)(PlatformMethods *platform, - angle::FeaturesVk *featuresVulkan); -inline void DefaultOverrideFeaturesVk(PlatformMethods *platform, angle::FeaturesVk *featuresVulkan) -{} - -using OverrideFeaturesMtlFunc = void (*)(PlatformMethods *platform, - angle::FeaturesMtl *featuresMetal); -inline void DefaultOverrideFeaturesMtl(PlatformMethods *platform, angle::FeaturesMtl *featuresMetal) -{} - -// Callback on a successful program link with the program binary. Can be used to store -// shaders to disk. Keys are a 160-bit SHA-1 hash. -using ProgramKeyType = std::array<uint8_t, 20>; -using CacheProgramFunc = void (*)(PlatformMethods *platform, - const ProgramKeyType &key, - size_t programSize, - const uint8_t *programBytes); -inline void DefaultCacheProgram(PlatformMethods *platform, - const ProgramKeyType &key, - size_t programSize, - const uint8_t *programBytes) -{} - -// Platform methods are enumerated here once. -#define ANGLE_PLATFORM_OP(OP) \ - OP(currentTime, CurrentTime) \ - OP(monotonicallyIncreasingTime, MonotonicallyIncreasingTime) \ - OP(logError, LogError) \ - OP(logWarning, LogWarning) \ - OP(logInfo, LogInfo) \ - OP(getTraceCategoryEnabledFlag, GetTraceCategoryEnabledFlag) \ - OP(addTraceEvent, AddTraceEvent) \ - OP(updateTraceEventDuration, UpdateTraceEventDuration) \ - OP(histogramCustomCounts, HistogramCustomCounts) \ - OP(histogramEnumeration, HistogramEnumeration) \ - OP(histogramSparse, HistogramSparse) \ - OP(histogramBoolean, HistogramBoolean) \ - OP(overrideWorkaroundsD3D, OverrideWorkaroundsD3D) \ - OP(overrideFeaturesVk, OverrideFeaturesVk) \ - OP(cacheProgram, CacheProgram) \ - OP(overrideFeaturesMtl, OverrideFeaturesMtl) - -#define ANGLE_PLATFORM_METHOD_DEF(Name, CapsName) CapsName##Func Name = Default##CapsName; - -struct ANGLE_PLATFORM_EXPORT PlatformMethods -{ - inline PlatformMethods(); - - // User data pointer for any implementation specific members. Put it at the start of the - // platform structure so it doesn't become overwritten if one version of the platform - // adds or removes new members. - void *context = 0; - - ANGLE_PLATFORM_OP(ANGLE_PLATFORM_METHOD_DEF) -}; - -inline PlatformMethods::PlatformMethods() = default; - -#undef ANGLE_PLATFORM_METHOD_DEF - -// Subtract one to account for the context pointer. -constexpr unsigned int g_NumPlatformMethods = (sizeof(PlatformMethods) / sizeof(uintptr_t)) - 1; - -#define ANGLE_PLATFORM_METHOD_STRING(Name) #Name -#define ANGLE_PLATFORM_METHOD_STRING2(Name, CapsName) ANGLE_PLATFORM_METHOD_STRING(Name), - -constexpr const char *const g_PlatformMethodNames[g_NumPlatformMethods] = { - ANGLE_PLATFORM_OP(ANGLE_PLATFORM_METHOD_STRING2)}; - -#undef ANGLE_PLATFORM_METHOD_STRING2 -#undef ANGLE_PLATFORM_METHOD_STRING - -} // namespace angle - -extern "C" { - -// Gets the platform methods on the passed-in EGL display. If the method name signature does not -// match the compiled signature for this ANGLE, false is returned. On success true is returned. -// The application should set any platform methods it cares about on the returned pointer. -// If display is not valid, behaviour is undefined. - -ANGLE_PLATFORM_EXPORT bool ANGLE_APIENTRY ANGLEGetDisplayPlatform(angle::EGLDisplayType display, - const char *const methodNames[], - unsigned int methodNameCount, - void *context, - void *platformMethodsOut); - -// Sets the platform methods back to their defaults. -// If display is not valid, behaviour is undefined. -ANGLE_PLATFORM_EXPORT void ANGLE_APIENTRY ANGLEResetDisplayPlatform(angle::EGLDisplayType display); - -} // extern "C" - -namespace angle -{ -typedef bool(ANGLE_APIENTRY *GetDisplayPlatformFunc)(angle::EGLDisplayType, - const char *const *, - unsigned int, - void *, - void *); -typedef void(ANGLE_APIENTRY *ResetDisplayPlatformFunc)(angle::EGLDisplayType); -} // namespace angle - -// This function is not exported -angle::PlatformMethods *ANGLEPlatformCurrent(); +// Platform.h: Simple forwarding header to PlatformMethods.h. +// Ideally we can remove this file at some point since "Platform.h" is overloaded. +// -#endif // ANGLE_PLATFORM_H +#include "PlatformMethods.h" diff --git a/chromium/third_party/angle/include/platform/PlatformMethods.h b/chromium/third_party/angle/include/platform/PlatformMethods.h new file mode 100644 index 00000000000..4697a87e458 --- /dev/null +++ b/chromium/third_party/angle/include/platform/PlatformMethods.h @@ -0,0 +1,339 @@ +// +// Copyright 2015 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// PlatformMethods.h: The public interface ANGLE exposes to the API layer, for +// doing platform-specific tasks like gathering data, or for tracing. + +#ifndef ANGLE_PLATFORMMETHODS_H +#define ANGLE_PLATFORMMETHODS_H + +#include <stdint.h> +#include <stdlib.h> +#include <array> + +#define EGL_PLATFORM_ANGLE_PLATFORM_METHODS_ANGLEX 0x3482 + +#if !defined(ANGLE_PLATFORM_EXPORT) +# if defined(_WIN32) +# if !defined(LIBANGLE_IMPLEMENTATION) +# define ANGLE_PLATFORM_EXPORT __declspec(dllimport) +# else +# define ANGLE_PLATFORM_EXPORT __declspec(dllexport) +# endif +# elif defined(__GNUC__) || defined(__clang__) +# define ANGLE_PLATFORM_EXPORT __attribute__((visibility("default"))) +# endif +#endif +#if !defined(ANGLE_PLATFORM_EXPORT) +# define ANGLE_PLATFORM_EXPORT +#endif + +#if defined(_WIN32) +# define ANGLE_APIENTRY __stdcall +#else +# define ANGLE_APIENTRY +#endif + +namespace angle +{ +struct FeaturesD3D; +struct FeaturesVk; +struct FeaturesMtl; +using TraceEventHandle = uint64_t; +using EGLDisplayType = void *; +struct PlatformMethods; + +// Use a C-like API to not trigger undefined calling behaviour. +// Avoid using decltype here to work around sanitizer limitations. +// TODO(jmadill): Use decltype here if/when UBSAN is fixed. + +// System -------------------------------------------------------------- + +// Wall clock time in seconds since the epoch. +// TODO(jmadill): investigate using an ANGLE internal time library +using CurrentTimeFunc = double (*)(PlatformMethods *platform); +inline double DefaultCurrentTime(PlatformMethods *platform) +{ + return 0.0; +} + +// Monotonically increasing time in seconds from an arbitrary fixed point in the past. +// This function is expected to return at least millisecond-precision values. For this reason, +// it is recommended that the fixed point be no further in the past than the epoch. +using MonotonicallyIncreasingTimeFunc = double (*)(PlatformMethods *platform); +inline double DefaultMonotonicallyIncreasingTime(PlatformMethods *platform) +{ + return 0.0; +} + +// Logging ------------------------------------------------------------ + +// Log an error message within the platform implementation. +using LogErrorFunc = void (*)(PlatformMethods *platform, const char *errorMessage); +inline void DefaultLogError(PlatformMethods *platform, const char *errorMessage) {} + +// Log a warning message within the platform implementation. +using LogWarningFunc = void (*)(PlatformMethods *platform, const char *warningMessage); +inline void DefaultLogWarning(PlatformMethods *platform, const char *warningMessage) {} + +// Log an info message within the platform implementation. +using LogInfoFunc = void (*)(PlatformMethods *platform, const char *infoMessage); +inline void DefaultLogInfo(PlatformMethods *platform, const char *infoMessage) {} + +// Tracing -------- + +// Get a pointer to the enabled state of the given trace category. The +// embedder can dynamically change the enabled state as trace event +// recording is started and stopped by the application. Only long-lived +// literal strings should be given as the category name. The implementation +// expects the returned pointer to be held permanently in a local static. If +// the unsigned char is non-zero, tracing is enabled. If tracing is enabled, +// addTraceEvent is expected to be called by the trace event macros. +using GetTraceCategoryEnabledFlagFunc = const unsigned char *(*)(PlatformMethods *platform, + const char *categoryName); +inline const unsigned char *DefaultGetTraceCategoryEnabledFlag(PlatformMethods *platform, + const char *categoryName) +{ + return nullptr; +} + +// +// Add a trace event to the platform tracing system. Depending on the actual +// enabled state, this event may be recorded or dropped. +// - phase specifies the type of event: +// - BEGIN ('B'): Marks the beginning of a scoped event. +// - END ('E'): Marks the end of a scoped event. +// - COMPLETE ('X'): Marks the beginning of a scoped event, but doesn't +// need a matching END event. Instead, at the end of the scope, +// updateTraceEventDuration() must be called with the TraceEventHandle +// returned from addTraceEvent(). +// - INSTANT ('I'): Standalone, instantaneous event. +// - START ('S'): Marks the beginning of an asynchronous event (the end +// event can occur in a different scope or thread). The id parameter is +// used to match START/FINISH pairs. +// - FINISH ('F'): Marks the end of an asynchronous event. +// - COUNTER ('C'): Used to trace integer quantities that change over +// time. The argument values are expected to be of type int. +// - METADATA ('M'): Reserved for internal use. +// - categoryEnabled is the pointer returned by getTraceCategoryEnabledFlag. +// - name is the name of the event. Also used to match BEGIN/END and +// START/FINISH pairs. +// - id optionally allows events of the same name to be distinguished from +// each other. For example, to trace the construction and destruction of +// objects, specify the pointer as the id parameter. +// - timestamp should be a time value returned from monotonicallyIncreasingTime. +// - numArgs specifies the number of elements in argNames, argTypes, and +// argValues. +// - argNames is the array of argument names. Use long-lived literal strings +// or specify the COPY flag. +// - argTypes is the array of argument types: +// - BOOL (1): bool +// - UINT (2): unsigned long long +// - INT (3): long long +// - DOUBLE (4): double +// - POINTER (5): void* +// - STRING (6): char* (long-lived null-terminated char* string) +// - COPY_STRING (7): char* (temporary null-terminated char* string) +// - CONVERTABLE (8): WebConvertableToTraceFormat +// - argValues is the array of argument values. Each value is the unsigned +// long long member of a union of all supported types. +// - flags can be 0 or one or more of the following, ORed together: +// - COPY (0x1): treat all strings (name, argNames and argValues of type +// string) as temporary so that they will be copied by addTraceEvent. +// - HAS_ID (0x2): use the id argument to uniquely identify the event for +// matching with other events of the same name. +// - MANGLE_ID (0x4): specify this flag if the id parameter is the value +// of a pointer. +using AddTraceEventFunc = angle::TraceEventHandle (*)(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); +inline angle::TraceEventHandle 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) +{ + return 0; +} + +// Set the duration field of a COMPLETE trace event. +using UpdateTraceEventDurationFunc = void (*)(PlatformMethods *platform, + const unsigned char *categoryEnabledFlag, + const char *name, + angle::TraceEventHandle eventHandle); +inline void DefaultUpdateTraceEventDuration(PlatformMethods *platform, + const unsigned char *categoryEnabledFlag, + const char *name, + angle::TraceEventHandle eventHandle) +{} + +// Callbacks for reporting histogram data. +// CustomCounts histogram has exponential bucket sizes, so that min=1, max=1000000, bucketCount=50 +// would do. +using HistogramCustomCountsFunc = void (*)(PlatformMethods *platform, + const char *name, + int sample, + int min, + int max, + int bucketCount); +inline void DefaultHistogramCustomCounts(PlatformMethods *platform, + const char *name, + int sample, + int min, + int max, + int bucketCount) +{} +// Enumeration histogram buckets are linear, boundaryValue should be larger than any possible sample +// value. +using HistogramEnumerationFunc = void (*)(PlatformMethods *platform, + const char *name, + int sample, + int boundaryValue); +inline void DefaultHistogramEnumeration(PlatformMethods *platform, + const char *name, + int sample, + int boundaryValue) +{} +// Unlike enumeration histograms, sparse histograms only allocate memory for non-empty buckets. +using HistogramSparseFunc = void (*)(PlatformMethods *platform, const char *name, int sample); +inline void DefaultHistogramSparse(PlatformMethods *platform, const char *name, int sample) {} +// Boolean histograms track two-state variables. +using HistogramBooleanFunc = void (*)(PlatformMethods *platform, const char *name, bool sample); +inline void DefaultHistogramBoolean(PlatformMethods *platform, const char *name, bool sample) {} + +// Allows us to programatically override ANGLE's default workarounds for testing purposes. +using OverrideWorkaroundsD3DFunc = void (*)(PlatformMethods *platform, + angle::FeaturesD3D *featuresD3D); +inline void DefaultOverrideWorkaroundsD3D(PlatformMethods *platform, + angle::FeaturesD3D *featuresD3D) +{} + +using OverrideFeaturesVkFunc = void (*)(PlatformMethods *platform, + angle::FeaturesVk *featuresVulkan); +inline void DefaultOverrideFeaturesVk(PlatformMethods *platform, angle::FeaturesVk *featuresVulkan) +{} + +using OverrideFeaturesMtlFunc = void (*)(PlatformMethods *platform, + angle::FeaturesMtl *featuresMetal); +inline void DefaultOverrideFeaturesMtl(PlatformMethods *platform, angle::FeaturesMtl *featuresMetal) +{} + +// Callback on a successful program link with the program binary. Can be used to store +// shaders to disk. Keys are a 160-bit SHA-1 hash. +using ProgramKeyType = std::array<uint8_t, 20>; +using CacheProgramFunc = void (*)(PlatformMethods *platform, + const ProgramKeyType &key, + size_t programSize, + const uint8_t *programBytes); +inline void DefaultCacheProgram(PlatformMethods *platform, + const ProgramKeyType &key, + size_t programSize, + const uint8_t *programBytes) +{} + +using PostWorkerTaskCallback = void (*)(void *userData); +using PostWorkerTaskFunc = void (*)(PlatformMethods *platform, + PostWorkerTaskCallback callback, + void *userData); +constexpr PostWorkerTaskFunc DefaultPostWorkerTask = nullptr; + +// Platform methods are enumerated here once. +#define ANGLE_PLATFORM_OP(OP) \ + OP(currentTime, CurrentTime) \ + OP(monotonicallyIncreasingTime, MonotonicallyIncreasingTime) \ + OP(logError, LogError) \ + OP(logWarning, LogWarning) \ + OP(logInfo, LogInfo) \ + OP(getTraceCategoryEnabledFlag, GetTraceCategoryEnabledFlag) \ + OP(addTraceEvent, AddTraceEvent) \ + OP(updateTraceEventDuration, UpdateTraceEventDuration) \ + OP(histogramCustomCounts, HistogramCustomCounts) \ + OP(histogramEnumeration, HistogramEnumeration) \ + OP(histogramSparse, HistogramSparse) \ + OP(histogramBoolean, HistogramBoolean) \ + OP(overrideWorkaroundsD3D, OverrideWorkaroundsD3D) \ + OP(overrideFeaturesVk, OverrideFeaturesVk) \ + OP(cacheProgram, CacheProgram) \ + OP(overrideFeaturesMtl, OverrideFeaturesMtl) \ + OP(postWorkerTask, PostWorkerTask) + +#define ANGLE_PLATFORM_METHOD_DEF(Name, CapsName) CapsName##Func Name = Default##CapsName; + +struct ANGLE_PLATFORM_EXPORT PlatformMethods +{ + inline PlatformMethods(); + + // User data pointer for any implementation specific members. Put it at the start of the + // platform structure so it doesn't become overwritten if one version of the platform + // adds or removes new members. + void *context = 0; + + ANGLE_PLATFORM_OP(ANGLE_PLATFORM_METHOD_DEF) +}; + +inline PlatformMethods::PlatformMethods() = default; + +#undef ANGLE_PLATFORM_METHOD_DEF + +// Subtract one to account for the context pointer. +constexpr unsigned int g_NumPlatformMethods = (sizeof(PlatformMethods) / sizeof(uintptr_t)) - 1; + +#define ANGLE_PLATFORM_METHOD_STRING(Name) #Name +#define ANGLE_PLATFORM_METHOD_STRING2(Name, CapsName) ANGLE_PLATFORM_METHOD_STRING(Name), + +constexpr const char *const g_PlatformMethodNames[g_NumPlatformMethods] = { + ANGLE_PLATFORM_OP(ANGLE_PLATFORM_METHOD_STRING2)}; + +#undef ANGLE_PLATFORM_METHOD_STRING2 +#undef ANGLE_PLATFORM_METHOD_STRING + +} // namespace angle + +extern "C" { + +// Gets the platform methods on the passed-in EGL display. If the method name signature does not +// match the compiled signature for this ANGLE, false is returned. On success true is returned. +// The application should set any platform methods it cares about on the returned pointer. +// If display is not valid, behaviour is undefined. + +ANGLE_PLATFORM_EXPORT bool ANGLE_APIENTRY ANGLEGetDisplayPlatform(angle::EGLDisplayType display, + const char *const methodNames[], + unsigned int methodNameCount, + void *context, + void *platformMethodsOut); + +// Sets the platform methods back to their defaults. +// If display is not valid, behaviour is undefined. +ANGLE_PLATFORM_EXPORT void ANGLE_APIENTRY ANGLEResetDisplayPlatform(angle::EGLDisplayType display); +} // extern "C" + +namespace angle +{ +typedef bool(ANGLE_APIENTRY *GetDisplayPlatformFunc)(angle::EGLDisplayType, + const char *const *, + unsigned int, + void *, + void *); +typedef void(ANGLE_APIENTRY *ResetDisplayPlatformFunc)(angle::EGLDisplayType); +} // namespace angle + +// This function is not exported +angle::PlatformMethods *ANGLEPlatformCurrent(); + +#endif // ANGLE_PLATFORMMETHODS_H |