GL: Use typedef for EGL/GLGetProcProc and use __stdcall on win32

This removes a lot of function pointer type syntax from the GL backend,
and make the OpenGLBackend.h type for the custom getProc more type safe
as it is exactly when egl.h uses (including the __stdcall on Windows)

Bug: 343870490
Change-Id: Icb78a12daacaac4ec6c47cdd7fd0d8ea47d8557f
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/191860
Auto-Submit: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Stephen White <senorblanco@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
diff --git a/generator/templates/opengl/OpenGLFunctionsBase.cpp b/generator/templates/opengl/OpenGLFunctionsBase.cpp
index 5789fcc..427b8be 100644
--- a/generator/templates/opengl/OpenGLFunctionsBase.cpp
+++ b/generator/templates/opengl/OpenGLFunctionsBase.cpp
@@ -30,7 +30,7 @@
 namespace dawn::native::opengl {
 
 template<typename T>
-MaybeError OpenGLFunctionsBase::LoadProc(GetProcAddress getProc, T* memberProc, const char* name) {
+MaybeError OpenGLFunctionsBase::LoadProc(GLGetProcProc getProc, T* memberProc, const char* name) {
     *memberProc = reinterpret_cast<T>(getProc(name));
     if (DAWN_UNLIKELY(memberProc == nullptr)) {
         return DAWN_INTERNAL_ERROR(std::string("Couldn't load GL proc: ") + name);
@@ -39,7 +39,7 @@
 }
 
 #if defined(DAWN_ENABLE_BACKEND_OPENGLES)
-MaybeError OpenGLFunctionsBase::LoadOpenGLESProcs(GetProcAddress getProc, int majorVersion, int minorVersion) {
+MaybeError OpenGLFunctionsBase::LoadOpenGLESProcs(GLGetProcProc getProc, int majorVersion, int minorVersion) {
     {% for block in gles_blocks %}
         // OpenGL ES {{block.version.major}}.{{block.version.minor}}
         if (majorVersion > {{block.version.major}} || (majorVersion == {{block.version.major}} && minorVersion >= {{block.version.minor}})) {
@@ -66,7 +66,7 @@
 #endif
 
 #if defined(DAWN_ENABLE_BACKEND_DESKTOP_GL)
-MaybeError OpenGLFunctionsBase::LoadDesktopGLProcs(GetProcAddress getProc, int majorVersion, int minorVersion) {
+MaybeError OpenGLFunctionsBase::LoadDesktopGLProcs(GLGetProcProc getProc, int majorVersion, int minorVersion) {
     {% for block in desktop_gl_blocks %}
         // Desktop OpenGL {{block.version.major}}.{{block.version.minor}}
         if (majorVersion > {{block.version.major}} || (majorVersion == {{block.version.major}} && minorVersion >= {{block.version.minor}})) {
diff --git a/generator/templates/opengl/OpenGLFunctionsBase.h b/generator/templates/opengl/OpenGLFunctionsBase.h
index 0f8b01f..9fc4265 100644
--- a/generator/templates/opengl/OpenGLFunctionsBase.h
+++ b/generator/templates/opengl/OpenGLFunctionsBase.h
@@ -34,7 +34,6 @@
 #include "dawn/native/opengl/opengl_platform.h"
 
 namespace dawn::native::opengl {
-    using GetProcAddress = void* (*) (const char*);
 
     struct OpenGLFunctionsBase {
       public:
@@ -50,15 +49,15 @@
 
       protected:
 #if defined(DAWN_ENABLE_BACKEND_DESKTOP_GL)
-        MaybeError LoadDesktopGLProcs(GetProcAddress getProc, int majorVersion, int minorVersion);
+        MaybeError LoadDesktopGLProcs(GLGetProcProc getProc, int majorVersion, int minorVersion);
 #endif
 #if defined(DAWN_ENABLE_BACKEND_OPENGLES)
-        MaybeError LoadOpenGLESProcs(GetProcAddress getProc, int majorVersion, int minorVersion);
+        MaybeError LoadOpenGLESProcs(GLGetProcProc getProc, int majorVersion, int minorVersion);
 #endif
 
       private:
         template<typename T>
-        MaybeError LoadProc(GetProcAddress getProc, T* memberProc, const char* name);
+        MaybeError LoadProc(GLGetProcProc getProc, T* memberProc, const char* name);
         void InitializeSupportedGLExtensions();
 
         std::unordered_set<std::string> mSupportedGLExtensionsSet;
diff --git a/generator/templates/opengl/opengl_platform.h b/generator/templates/opengl/opengl_platform.h
index d9bfe3e..dc53aa5 100644
--- a/generator/templates/opengl/opengl_platform.h
+++ b/generator/templates/opengl/opengl_platform.h
@@ -67,6 +67,9 @@
                                                const GLchar* message,
                                                void* userParam);
 
+using AnyGLProc = void (*)();
+using GLGetProcProc = AnyGLProc (KHRONOS_APIENTRY*) (const char*);
+
 {% for block in header_blocks %}
     // {{block.description}}
     {% for enum in block.enums %}
diff --git a/include/dawn/native/OpenGLBackend.h b/include/dawn/native/OpenGLBackend.h
index fb1eedb..9b40645 100644
--- a/include/dawn/native/OpenGLBackend.h
+++ b/include/dawn/native/OpenGLBackend.h
@@ -28,20 +28,32 @@
 #ifndef INCLUDE_DAWN_NATIVE_OPENGLBACKEND_H_
 #define INCLUDE_DAWN_NATIVE_OPENGLBACKEND_H_
 
-using EGLDisplay = void*;
-using EGLImage = void*;
-using GLuint = unsigned int;
-
 #include "dawn/native/DawnNative.h"
 #include "webgpu/webgpu_cpp_chained_struct.h"
 
 namespace dawn::native::opengl {
 
+using EGLDisplay = void*;
+using EGLImage = void*;
+using GLuint = unsigned int;
+
+// Define a GetProc function pointer that mirrors the one in egl.h
+#if defined(_WIN32)
+#define DAWN_STDCALL __stdcall
+#else  // defined(_WIN32)
+#define DAWN_STDCALL
+#endif  // defined(_WIN32)
+
+using EGLFunctionPointerType = void (*)();
+// NOLINTNEXTLINE(readability/casting): cpplint thinks this is a C-style cast but it isn't.
+using EGLGetProcProc = EGLFunctionPointerType(DAWN_STDCALL*)(const char*);
+#undef DAWN_STDCALL
+
 // Can be chained in WGPURequestAdapterOptions
 struct DAWN_NATIVE_EXPORT RequestAdapterOptionsGetGLProc : wgpu::ChainedStruct {
     RequestAdapterOptionsGetGLProc();
 
-    void* (*getProc)(const char*);
+    EGLGetProcProc getProc;
     EGLDisplay display;
 };
 
@@ -49,7 +61,7 @@
   public:
     ExternalImageDescriptorEGLImage();
 
-    ::EGLImage image;
+    EGLImage image;
 };
 
 DAWN_NATIVE_EXPORT WGPUTexture
diff --git a/src/dawn/common/egl_platform.h b/src/dawn/common/egl_platform.h
index 86c1a13..aca5860 100644
--- a/src/dawn/common/egl_platform.h
+++ b/src/dawn/common/egl_platform.h
@@ -51,4 +51,6 @@
 #include <EGL/egl.h>
 #include <EGL/eglext.h>
 
+using EGLGetProcProc = PFNEGLGETPROCADDRESSPROC;
+
 #endif  // SRC_DAWN_COMMON_EGL_PLATFORM_H_
diff --git a/src/dawn/native/opengl/BackendGL.cpp b/src/dawn/native/opengl/BackendGL.cpp
index 65e4d93..52fe436 100644
--- a/src/dawn/native/opengl/BackendGL.cpp
+++ b/src/dawn/native/opengl/BackendGL.cpp
@@ -51,7 +51,7 @@
         return std::vector<Ref<PhysicalDeviceBase>>{};
     }
 
-    void* (*getProc)(const char* name) = nullptr;
+    EGLGetProcProc getProc = nullptr;
     EGLDisplay display = EGL_NO_DISPLAY;
 
     if (auto* glGetProcOptions = options.Get<RequestAdapterOptionsGetGLProc>()) {
@@ -76,7 +76,7 @@
             return {};
         }
 
-        getProc = reinterpret_cast<void* (*)(const char*)>(mLibEGL.GetProc("eglGetProcAddress"));
+        getProc = reinterpret_cast<decltype(getProc)>(mLibEGL.GetProc("eglGetProcAddress"));
         if (!getProc) {
             GetInstance()->ConsumedErrorAndWarnOnce(
                 DAWN_VALIDATION_ERROR("eglGetProcAddress return nullptr"));
@@ -88,7 +88,7 @@
 }
 
 std::vector<Ref<PhysicalDeviceBase>> Backend::DiscoverPhysicalDevicesWithProcs(
-    void* (*getProc)(const char*),
+    EGLGetProcProc getProc,
     EGLDisplay display) {
     // TODO(cwallez@chromium.org): For now only create a single OpenGL physicalDevice because don't
     // know how to handle MakeCurrent.
diff --git a/src/dawn/native/opengl/BackendGL.h b/src/dawn/native/opengl/BackendGL.h
index a9d2c5a..c8dc2dc 100644
--- a/src/dawn/native/opengl/BackendGL.h
+++ b/src/dawn/native/opengl/BackendGL.h
@@ -32,6 +32,7 @@
 
 #include "dawn/common/DynamicLib.h"
 #include "dawn/native/BackendConnection.h"
+#include "dawn/native/OpenGLBackend.h"
 
 using EGLDisplay = void*;
 
@@ -46,12 +47,11 @@
         const UnpackedPtr<RequestAdapterOptions>& options) override;
 
   private:
-    std::vector<Ref<PhysicalDeviceBase>> DiscoverPhysicalDevicesWithProcs(
-        void* (*getProc)(const char*),
-        EGLDisplay display);
+    std::vector<Ref<PhysicalDeviceBase>> DiscoverPhysicalDevicesWithProcs(EGLGetProcProc getProc,
+                                                                          EGLDisplay display);
 
     Ref<PhysicalDevice> mPhysicalDevice = nullptr;
-    void* (*mGetProc)(const char*);
+    EGLGetProcProc mGetProc;
     EGLDisplay mDisplay;
     DynamicLib mLibEGL;
 };
diff --git a/src/dawn/native/opengl/EGLFunctions.cpp b/src/dawn/native/opengl/EGLFunctions.cpp
index e8cfbd2..243a9b4 100644
--- a/src/dawn/native/opengl/EGLFunctions.cpp
+++ b/src/dawn/native/opengl/EGLFunctions.cpp
@@ -29,8 +29,8 @@
 
 namespace dawn::native::opengl {
 
-void EGLFunctions::Init(void* (*getProc)(const char*)) {
-    GetProcAddress = reinterpret_cast<PFNEGLGETPROCADDRESSPROC>(getProc);
+void EGLFunctions::Init(EGLGetProcProc getProc) {
+    GetProcAddress = getProc;
     BindAPI = reinterpret_cast<PFNEGLBINDAPIPROC>(GetProcAddress("eglBindAPI"));
     ChooseConfig = reinterpret_cast<PFNEGLCHOOSECONFIGPROC>(GetProcAddress("eglChooseConfig"));
     CreateContext = reinterpret_cast<PFNEGLCREATECONTEXTPROC>(GetProcAddress("eglCreateContext"));
diff --git a/src/dawn/native/opengl/EGLFunctions.h b/src/dawn/native/opengl/EGLFunctions.h
index e42df8f8..b4b436c 100644
--- a/src/dawn/native/opengl/EGLFunctions.h
+++ b/src/dawn/native/opengl/EGLFunctions.h
@@ -33,7 +33,7 @@
 namespace dawn::native::opengl {
 
 struct EGLFunctions {
-    void Init(void* (*getProc)(const char*));
+    void Init(EGLGetProcProc getProc);
     PFNEGLBINDAPIPROC BindAPI;
     PFNEGLCHOOSECONFIGPROC ChooseConfig;
     PFNEGLCREATECONTEXTPROC CreateContext;
diff --git a/src/dawn/native/opengl/OpenGLFunctions.cpp b/src/dawn/native/opengl/OpenGLFunctions.cpp
index 226c0f4..550d1a1 100644
--- a/src/dawn/native/opengl/OpenGLFunctions.cpp
+++ b/src/dawn/native/opengl/OpenGLFunctions.cpp
@@ -31,7 +31,7 @@
 
 namespace dawn::native::opengl {
 
-MaybeError OpenGLFunctions::Initialize(GetProcAddress getProc) {
+MaybeError OpenGLFunctions::Initialize(GLGetProcProc getProc) {
     DAWN_TRY(mVersion.Initialize(getProc));
     if (mVersion.IsES()) {
 #if defined(DAWN_ENABLE_BACKEND_OPENGLES)
diff --git a/src/dawn/native/opengl/OpenGLFunctions.h b/src/dawn/native/opengl/OpenGLFunctions.h
index 60f3387..cd0e26e 100644
--- a/src/dawn/native/opengl/OpenGLFunctions.h
+++ b/src/dawn/native/opengl/OpenGLFunctions.h
@@ -37,7 +37,7 @@
 
 struct OpenGLFunctions : OpenGLFunctionsBase {
   public:
-    MaybeError Initialize(GetProcAddress getProc);
+    MaybeError Initialize(GLGetProcProc getProc);
 
     const OpenGLVersion& GetVersion() const;
     bool IsAtLeastGL(uint32_t majorVersion, uint32_t minorVersion) const;
diff --git a/src/dawn/native/opengl/OpenGLVersion.cpp b/src/dawn/native/opengl/OpenGLVersion.cpp
index a5e1348..ccfefec 100644
--- a/src/dawn/native/opengl/OpenGLVersion.cpp
+++ b/src/dawn/native/opengl/OpenGLVersion.cpp
@@ -33,7 +33,7 @@
 
 namespace dawn::native::opengl {
 
-MaybeError OpenGLVersion::Initialize(GetProcAddress getProc) {
+MaybeError OpenGLVersion::Initialize(GLGetProcProc getProc) {
     PFNGLGETSTRINGPROC getString = reinterpret_cast<PFNGLGETSTRINGPROC>(getProc("glGetString"));
     if (getString == nullptr) {
         return DAWN_INTERNAL_ERROR("Couldn't load glGetString");
diff --git a/src/dawn/native/opengl/OpenGLVersion.h b/src/dawn/native/opengl/OpenGLVersion.h
index aea36cf..7c7d8cd 100644
--- a/src/dawn/native/opengl/OpenGLVersion.h
+++ b/src/dawn/native/opengl/OpenGLVersion.h
@@ -39,7 +39,7 @@
         ES,
     };
 
-    MaybeError Initialize(GetProcAddress getProc);
+    MaybeError Initialize(GLGetProcProc getProc);
 
     bool IsDesktop() const;
     bool IsES() const;
diff --git a/src/dawn/native/opengl/PhysicalDeviceGL.cpp b/src/dawn/native/opengl/PhysicalDeviceGL.cpp
index f67b564..fc486b0 100644
--- a/src/dawn/native/opengl/PhysicalDeviceGL.cpp
+++ b/src/dawn/native/opengl/PhysicalDeviceGL.cpp
@@ -91,7 +91,7 @@
 
 // static
 ResultOrError<Ref<PhysicalDevice>> PhysicalDevice::Create(wgpu::BackendType backendType,
-                                                          void* (*getProc)(const char*),
+                                                          EGLGetProcProc getProc,
                                                           EGLDisplay display) {
     EGLFunctions egl;
     egl.Init(getProc);
@@ -126,7 +126,7 @@
 PhysicalDevice::PhysicalDevice(wgpu::BackendType backendType, EGLDisplay display)
     : PhysicalDeviceBase(backendType), mDisplay(display) {}
 
-MaybeError PhysicalDevice::InitializeGLFunctions(void* (*getProc)(const char*)) {
+MaybeError PhysicalDevice::InitializeGLFunctions(EGLGetProcProc getProc) {
     // Use getProc to populate the dispatch table
     mEGLFunctions.Init(getProc);
     return mFunctions.Initialize(getProc);
diff --git a/src/dawn/native/opengl/PhysicalDeviceGL.h b/src/dawn/native/opengl/PhysicalDeviceGL.h
index 1518af3..86c689f 100644
--- a/src/dawn/native/opengl/PhysicalDeviceGL.h
+++ b/src/dawn/native/opengl/PhysicalDeviceGL.h
@@ -37,7 +37,7 @@
 class PhysicalDevice : public PhysicalDeviceBase {
   public:
     static ResultOrError<Ref<PhysicalDevice>> Create(wgpu::BackendType backendType,
-                                                     void* (*getProc)(const char*),
+                                                     EGLGetProcProc getProc,
                                                      EGLDisplay display);
 
     ~PhysicalDevice() override = default;
@@ -51,7 +51,7 @@
 
   private:
     PhysicalDevice(wgpu::BackendType backendType, EGLDisplay display);
-    MaybeError InitializeGLFunctions(void* (*getProc)(const char*));
+    MaybeError InitializeGLFunctions(EGLGetProcProc getProc);
 
     MaybeError InitializeImpl() override;
     void InitializeSupportedFeaturesImpl() override;