Commit 5565936c by Geoff Lang

Implement EGL_KHR_get_all_proc_addresses.

BUG=angleproject:1138 Change-Id: I0dd4e1a092e889cdb9de4773162e5416ac9be65d Reviewed-on: https://chromium-review.googlesource.com/295242Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 53b8aec0
...@@ -523,7 +523,8 @@ DisplayExtensions::DisplayExtensions() ...@@ -523,7 +523,8 @@ DisplayExtensions::DisplayExtensions()
glTexture2DImage(false), glTexture2DImage(false),
glTextureCubemapImage(false), glTextureCubemapImage(false),
glTexture3DImage(false), glTexture3DImage(false),
glRenderbufferImage(false) glRenderbufferImage(false),
getAllProcAddresses(false)
{ {
} }
...@@ -549,6 +550,7 @@ std::vector<std::string> DisplayExtensions::getStrings() const ...@@ -549,6 +550,7 @@ std::vector<std::string> DisplayExtensions::getStrings() const
InsertExtensionString("EGL_KHR_gl_texture_cubemap_image", glTextureCubemapImage, &extensionStrings); InsertExtensionString("EGL_KHR_gl_texture_cubemap_image", glTextureCubemapImage, &extensionStrings);
InsertExtensionString("EGL_KHR_gl_texture_3D_image", glTexture3DImage, &extensionStrings); InsertExtensionString("EGL_KHR_gl_texture_3D_image", glTexture3DImage, &extensionStrings);
InsertExtensionString("EGL_KHR_gl_renderbuffer_image", glRenderbufferImage, &extensionStrings); InsertExtensionString("EGL_KHR_gl_renderbuffer_image", glRenderbufferImage, &extensionStrings);
InsertExtensionString("EGL_KHR_get_all_proc_addresses", getAllProcAddresses, &extensionStrings);
// clang-format on // clang-format on
return extensionStrings; return extensionStrings;
...@@ -574,7 +576,8 @@ ClientExtensions::ClientExtensions() ...@@ -574,7 +576,8 @@ ClientExtensions::ClientExtensions()
platformBase(false), platformBase(false),
platformANGLE(false), platformANGLE(false),
platformANGLED3D(false), platformANGLED3D(false),
platformANGLEOpenGL(false) platformANGLEOpenGL(false),
clientGetAllProcAddresses(false)
{ {
} }
...@@ -589,6 +592,7 @@ std::vector<std::string> ClientExtensions::getStrings() const ...@@ -589,6 +592,7 @@ std::vector<std::string> ClientExtensions::getStrings() const
InsertExtensionString("EGL_ANGLE_platform_angle", platformANGLE, &extensionStrings); InsertExtensionString("EGL_ANGLE_platform_angle", platformANGLE, &extensionStrings);
InsertExtensionString("EGL_ANGLE_platform_angle_d3d", platformANGLED3D, &extensionStrings); InsertExtensionString("EGL_ANGLE_platform_angle_d3d", platformANGLED3D, &extensionStrings);
InsertExtensionString("EGL_ANGLE_platform_angle_opengl", platformANGLEOpenGL, &extensionStrings); InsertExtensionString("EGL_ANGLE_platform_angle_opengl", platformANGLEOpenGL, &extensionStrings);
InsertExtensionString("EGL_KHR_client_get_all_proc_addresses", clientGetAllProcAddresses, &extensionStrings);
// clang-format on // clang-format on
return extensionStrings; return extensionStrings;
......
...@@ -412,6 +412,9 @@ struct DisplayExtensions ...@@ -412,6 +412,9 @@ struct DisplayExtensions
// EGL_KHR_gl_renderbuffer_image // EGL_KHR_gl_renderbuffer_image
bool glRenderbufferImage; bool glRenderbufferImage;
// EGL_KHR_get_all_proc_addresses
bool getAllProcAddresses;
}; };
struct DeviceExtensions struct DeviceExtensions
...@@ -446,6 +449,9 @@ struct ClientExtensions ...@@ -446,6 +449,9 @@ struct ClientExtensions
// EGL_ANGLE_platform_angle_opengl // EGL_ANGLE_platform_angle_opengl
bool platformANGLEOpenGL; bool platformANGLEOpenGL;
// EGL_KHR_client_get_all_proc_addresses
bool clientGetAllProcAddresses;
}; };
} }
......
...@@ -725,6 +725,8 @@ static ClientExtensions GenerateClientExtensions() ...@@ -725,6 +725,8 @@ static ClientExtensions GenerateClientExtensions()
extensions.platformANGLEOpenGL = true; extensions.platformANGLEOpenGL = true;
#endif #endif
extensions.clientGetAllProcAddresses = true;
return extensions; return extensions;
} }
...@@ -753,6 +755,10 @@ const std::string &Display::getClientExtensionString() ...@@ -753,6 +755,10 @@ const std::string &Display::getClientExtensionString()
void Display::initDisplayExtensions() void Display::initDisplayExtensions()
{ {
mDisplayExtensions = mImplementation->getExtensions(); mDisplayExtensions = mImplementation->getExtensions();
// Force EGL_KHR_get_all_proc_addresses on.
mDisplayExtensions.getAllProcAddresses = true;
mDisplayExtensionString = GenerateExtensionsString(mDisplayExtensions); mDisplayExtensionString = GenerateExtensionsString(mDisplayExtensions);
} }
......
...@@ -8,7 +8,9 @@ ...@@ -8,7 +8,9 @@
#include "libGLESv2/entry_points_egl.h" #include "libGLESv2/entry_points_egl.h"
#include "libGLESv2/entry_points_egl_ext.h" #include "libGLESv2/entry_points_egl_ext.h"
#include "libGLESv2/entry_points_gles_2_0.h"
#include "libGLESv2/entry_points_gles_2_0_ext.h" #include "libGLESv2/entry_points_gles_2_0_ext.h"
#include "libGLESv2/entry_points_gles_3_0.h"
#include "libGLESv2/entry_points_gles_3_0_ext.h" #include "libGLESv2/entry_points_gles_3_0_ext.h"
#include "libGLESv2/global_state.h" #include "libGLESv2/global_state.h"
...@@ -1120,75 +1122,420 @@ __eglMustCastToProperFunctionPointerType EGLAPIENTRY GetProcAddress(const char * ...@@ -1120,75 +1122,420 @@ __eglMustCastToProperFunctionPointerType EGLAPIENTRY GetProcAddress(const char *
{ {
EVENT("(const char *procname = \"%s\")", procname); EVENT("(const char *procname = \"%s\")", procname);
struct Extension typedef std::map<std::string, __eglMustCastToProperFunctionPointerType> ProcAddressMap;
{ auto generateProcAddressMap = []()
const char *name; {
__eglMustCastToProperFunctionPointerType address; ProcAddressMap map;
#define INSERT_PROC_ADDRESS(ns, proc) \
map[#ns## #proc] = reinterpret_cast<__eglMustCastToProperFunctionPointerType>(ns::proc)
// GLES2 core
INSERT_PROC_ADDRESS(gl, ActiveTexture);
INSERT_PROC_ADDRESS(gl, AttachShader);
INSERT_PROC_ADDRESS(gl, BindAttribLocation);
INSERT_PROC_ADDRESS(gl, BindBuffer);
INSERT_PROC_ADDRESS(gl, BindFramebuffer);
INSERT_PROC_ADDRESS(gl, BindRenderbuffer);
INSERT_PROC_ADDRESS(gl, BindTexture);
INSERT_PROC_ADDRESS(gl, BlendColor);
INSERT_PROC_ADDRESS(gl, BlendEquation);
INSERT_PROC_ADDRESS(gl, BlendEquationSeparate);
INSERT_PROC_ADDRESS(gl, BlendFunc);
INSERT_PROC_ADDRESS(gl, BlendFuncSeparate);
INSERT_PROC_ADDRESS(gl, BufferData);
INSERT_PROC_ADDRESS(gl, BufferSubData);
INSERT_PROC_ADDRESS(gl, CheckFramebufferStatus);
INSERT_PROC_ADDRESS(gl, Clear);
INSERT_PROC_ADDRESS(gl, ClearColor);
INSERT_PROC_ADDRESS(gl, ClearDepthf);
INSERT_PROC_ADDRESS(gl, ClearStencil);
INSERT_PROC_ADDRESS(gl, ColorMask);
INSERT_PROC_ADDRESS(gl, CompileShader);
INSERT_PROC_ADDRESS(gl, CompressedTexImage2D);
INSERT_PROC_ADDRESS(gl, CompressedTexSubImage2D);
INSERT_PROC_ADDRESS(gl, CopyTexImage2D);
INSERT_PROC_ADDRESS(gl, CopyTexSubImage2D);
INSERT_PROC_ADDRESS(gl, CreateProgram);
INSERT_PROC_ADDRESS(gl, CreateShader);
INSERT_PROC_ADDRESS(gl, CullFace);
INSERT_PROC_ADDRESS(gl, DeleteBuffers);
INSERT_PROC_ADDRESS(gl, DeleteFramebuffers);
INSERT_PROC_ADDRESS(gl, DeleteProgram);
INSERT_PROC_ADDRESS(gl, DeleteRenderbuffers);
INSERT_PROC_ADDRESS(gl, DeleteShader);
INSERT_PROC_ADDRESS(gl, DeleteTextures);
INSERT_PROC_ADDRESS(gl, DepthFunc);
INSERT_PROC_ADDRESS(gl, DepthMask);
INSERT_PROC_ADDRESS(gl, DepthRangef);
INSERT_PROC_ADDRESS(gl, DetachShader);
INSERT_PROC_ADDRESS(gl, Disable);
INSERT_PROC_ADDRESS(gl, DisableVertexAttribArray);
INSERT_PROC_ADDRESS(gl, DrawArrays);
INSERT_PROC_ADDRESS(gl, DrawElements);
INSERT_PROC_ADDRESS(gl, Enable);
INSERT_PROC_ADDRESS(gl, EnableVertexAttribArray);
INSERT_PROC_ADDRESS(gl, Finish);
INSERT_PROC_ADDRESS(gl, Flush);
INSERT_PROC_ADDRESS(gl, FramebufferRenderbuffer);
INSERT_PROC_ADDRESS(gl, FramebufferTexture2D);
INSERT_PROC_ADDRESS(gl, FrontFace);
INSERT_PROC_ADDRESS(gl, GenBuffers);
INSERT_PROC_ADDRESS(gl, GenerateMipmap);
INSERT_PROC_ADDRESS(gl, GenFramebuffers);
INSERT_PROC_ADDRESS(gl, GenRenderbuffers);
INSERT_PROC_ADDRESS(gl, GenTextures);
INSERT_PROC_ADDRESS(gl, GetActiveAttrib);
INSERT_PROC_ADDRESS(gl, GetActiveUniform);
INSERT_PROC_ADDRESS(gl, GetAttachedShaders);
INSERT_PROC_ADDRESS(gl, GetAttribLocation);
INSERT_PROC_ADDRESS(gl, GetBooleanv);
INSERT_PROC_ADDRESS(gl, GetBufferParameteriv);
INSERT_PROC_ADDRESS(gl, GetError);
INSERT_PROC_ADDRESS(gl, GetFloatv);
INSERT_PROC_ADDRESS(gl, GetFramebufferAttachmentParameteriv);
INSERT_PROC_ADDRESS(gl, GetIntegerv);
INSERT_PROC_ADDRESS(gl, GetProgramiv);
INSERT_PROC_ADDRESS(gl, GetProgramInfoLog);
INSERT_PROC_ADDRESS(gl, GetRenderbufferParameteriv);
INSERT_PROC_ADDRESS(gl, GetShaderiv);
INSERT_PROC_ADDRESS(gl, GetShaderInfoLog);
INSERT_PROC_ADDRESS(gl, GetShaderPrecisionFormat);
INSERT_PROC_ADDRESS(gl, GetShaderSource);
INSERT_PROC_ADDRESS(gl, GetString);
INSERT_PROC_ADDRESS(gl, GetTexParameterfv);
INSERT_PROC_ADDRESS(gl, GetTexParameteriv);
INSERT_PROC_ADDRESS(gl, GetUniformfv);
INSERT_PROC_ADDRESS(gl, GetUniformiv);
INSERT_PROC_ADDRESS(gl, GetUniformLocation);
INSERT_PROC_ADDRESS(gl, GetVertexAttribfv);
INSERT_PROC_ADDRESS(gl, GetVertexAttribiv);
INSERT_PROC_ADDRESS(gl, GetVertexAttribPointerv);
INSERT_PROC_ADDRESS(gl, Hint);
INSERT_PROC_ADDRESS(gl, IsBuffer);
INSERT_PROC_ADDRESS(gl, IsEnabled);
INSERT_PROC_ADDRESS(gl, IsFramebuffer);
INSERT_PROC_ADDRESS(gl, IsProgram);
INSERT_PROC_ADDRESS(gl, IsRenderbuffer);
INSERT_PROC_ADDRESS(gl, IsShader);
INSERT_PROC_ADDRESS(gl, IsTexture);
INSERT_PROC_ADDRESS(gl, LineWidth);
INSERT_PROC_ADDRESS(gl, LinkProgram);
INSERT_PROC_ADDRESS(gl, PixelStorei);
INSERT_PROC_ADDRESS(gl, PolygonOffset);
INSERT_PROC_ADDRESS(gl, ReadPixels);
INSERT_PROC_ADDRESS(gl, ReleaseShaderCompiler);
INSERT_PROC_ADDRESS(gl, RenderbufferStorage);
INSERT_PROC_ADDRESS(gl, SampleCoverage);
INSERT_PROC_ADDRESS(gl, Scissor);
INSERT_PROC_ADDRESS(gl, ShaderBinary);
INSERT_PROC_ADDRESS(gl, ShaderSource);
INSERT_PROC_ADDRESS(gl, StencilFunc);
INSERT_PROC_ADDRESS(gl, StencilFuncSeparate);
INSERT_PROC_ADDRESS(gl, StencilMask);
INSERT_PROC_ADDRESS(gl, StencilMaskSeparate);
INSERT_PROC_ADDRESS(gl, StencilOp);
INSERT_PROC_ADDRESS(gl, StencilOpSeparate);
INSERT_PROC_ADDRESS(gl, TexImage2D);
INSERT_PROC_ADDRESS(gl, TexParameterf);
INSERT_PROC_ADDRESS(gl, TexParameterfv);
INSERT_PROC_ADDRESS(gl, TexParameteri);
INSERT_PROC_ADDRESS(gl, TexParameteriv);
INSERT_PROC_ADDRESS(gl, TexSubImage2D);
INSERT_PROC_ADDRESS(gl, Uniform1f);
INSERT_PROC_ADDRESS(gl, Uniform1fv);
INSERT_PROC_ADDRESS(gl, Uniform1i);
INSERT_PROC_ADDRESS(gl, Uniform1iv);
INSERT_PROC_ADDRESS(gl, Uniform2f);
INSERT_PROC_ADDRESS(gl, Uniform2fv);
INSERT_PROC_ADDRESS(gl, Uniform2i);
INSERT_PROC_ADDRESS(gl, Uniform2iv);
INSERT_PROC_ADDRESS(gl, Uniform3f);
INSERT_PROC_ADDRESS(gl, Uniform3fv);
INSERT_PROC_ADDRESS(gl, Uniform3i);
INSERT_PROC_ADDRESS(gl, Uniform3iv);
INSERT_PROC_ADDRESS(gl, Uniform4f);
INSERT_PROC_ADDRESS(gl, Uniform4fv);
INSERT_PROC_ADDRESS(gl, Uniform4i);
INSERT_PROC_ADDRESS(gl, Uniform4iv);
INSERT_PROC_ADDRESS(gl, UniformMatrix2fv);
INSERT_PROC_ADDRESS(gl, UniformMatrix3fv);
INSERT_PROC_ADDRESS(gl, UniformMatrix4fv);
INSERT_PROC_ADDRESS(gl, UseProgram);
INSERT_PROC_ADDRESS(gl, ValidateProgram);
INSERT_PROC_ADDRESS(gl, VertexAttrib1f);
INSERT_PROC_ADDRESS(gl, VertexAttrib1fv);
INSERT_PROC_ADDRESS(gl, VertexAttrib2f);
INSERT_PROC_ADDRESS(gl, VertexAttrib2fv);
INSERT_PROC_ADDRESS(gl, VertexAttrib3f);
INSERT_PROC_ADDRESS(gl, VertexAttrib3fv);
INSERT_PROC_ADDRESS(gl, VertexAttrib4f);
INSERT_PROC_ADDRESS(gl, VertexAttrib4fv);
INSERT_PROC_ADDRESS(gl, VertexAttribPointer);
INSERT_PROC_ADDRESS(gl, Viewport);
// GL_ANGLE_framebuffer_blit
INSERT_PROC_ADDRESS(gl, BlitFramebufferANGLE);
// GL_ANGLE_framebuffer_multisample
INSERT_PROC_ADDRESS(gl, RenderbufferStorageMultisampleANGLE);
// GL_EXT_discard_framebuffer
INSERT_PROC_ADDRESS(gl, DiscardFramebufferEXT);
// GL_NV_fence
INSERT_PROC_ADDRESS(gl, DeleteFencesNV);
INSERT_PROC_ADDRESS(gl, GenFencesNV);
INSERT_PROC_ADDRESS(gl, IsFenceNV);
INSERT_PROC_ADDRESS(gl, TestFenceNV);
INSERT_PROC_ADDRESS(gl, GetFenceivNV);
INSERT_PROC_ADDRESS(gl, FinishFenceNV);
INSERT_PROC_ADDRESS(gl, SetFenceNV);
// GL_ANGLE_translated_shader_source
INSERT_PROC_ADDRESS(gl, GetTranslatedShaderSourceANGLE);
// GL_EXT_texture_storage
INSERT_PROC_ADDRESS(gl, TexStorage2DEXT);
// GL_EXT_robustness
INSERT_PROC_ADDRESS(gl, GetGraphicsResetStatusEXT);
INSERT_PROC_ADDRESS(gl, ReadnPixelsEXT);
INSERT_PROC_ADDRESS(gl, GetnUniformfvEXT);
INSERT_PROC_ADDRESS(gl, GetnUniformivEXT);
// GL_EXT_occlusion_query_boolean
INSERT_PROC_ADDRESS(gl, GenQueriesEXT);
INSERT_PROC_ADDRESS(gl, DeleteQueriesEXT);
INSERT_PROC_ADDRESS(gl, IsQueryEXT);
INSERT_PROC_ADDRESS(gl, BeginQueryEXT);
INSERT_PROC_ADDRESS(gl, EndQueryEXT);
INSERT_PROC_ADDRESS(gl, GetQueryivEXT);
INSERT_PROC_ADDRESS(gl, GetQueryObjectuivEXT);
// GL_EXT_draw_buffers
INSERT_PROC_ADDRESS(gl, DrawBuffersEXT);
// GL_ANGLE_instanced_arrays
INSERT_PROC_ADDRESS(gl, DrawArraysInstancedANGLE);
INSERT_PROC_ADDRESS(gl, DrawElementsInstancedANGLE);
INSERT_PROC_ADDRESS(gl, VertexAttribDivisorANGLE);
// GL_OES_get_program_binary
INSERT_PROC_ADDRESS(gl, GetProgramBinaryOES);
INSERT_PROC_ADDRESS(gl, ProgramBinaryOES);
// GL_OES_mapbuffer
INSERT_PROC_ADDRESS(gl, MapBufferOES);
INSERT_PROC_ADDRESS(gl, UnmapBufferOES);
INSERT_PROC_ADDRESS(gl, GetBufferPointervOES);
// GL_EXT_map_buffer_range
INSERT_PROC_ADDRESS(gl, MapBufferRangeEXT);
INSERT_PROC_ADDRESS(gl, FlushMappedBufferRangeEXT);
// GL_EXT_debug_marker
INSERT_PROC_ADDRESS(gl, InsertEventMarkerEXT);
INSERT_PROC_ADDRESS(gl, PushGroupMarkerEXT);
INSERT_PROC_ADDRESS(gl, PopGroupMarkerEXT);
// GL_OES_EGL_image
INSERT_PROC_ADDRESS(gl, EGLImageTargetTexture2DOES);
INSERT_PROC_ADDRESS(gl, EGLImageTargetRenderbufferStorageOES);
// GLES3 core
INSERT_PROC_ADDRESS(gl, ReadBuffer);
INSERT_PROC_ADDRESS(gl, DrawRangeElements);
INSERT_PROC_ADDRESS(gl, TexImage3D);
INSERT_PROC_ADDRESS(gl, TexSubImage3D);
INSERT_PROC_ADDRESS(gl, CopyTexSubImage3D);
INSERT_PROC_ADDRESS(gl, CompressedTexImage3D);
INSERT_PROC_ADDRESS(gl, CompressedTexSubImage3D);
INSERT_PROC_ADDRESS(gl, GenQueries);
INSERT_PROC_ADDRESS(gl, DeleteQueries);
INSERT_PROC_ADDRESS(gl, IsQuery);
INSERT_PROC_ADDRESS(gl, BeginQuery);
INSERT_PROC_ADDRESS(gl, EndQuery);
INSERT_PROC_ADDRESS(gl, GetQueryiv);
INSERT_PROC_ADDRESS(gl, GetQueryObjectuiv);
INSERT_PROC_ADDRESS(gl, UnmapBuffer);
INSERT_PROC_ADDRESS(gl, GetBufferPointerv);
INSERT_PROC_ADDRESS(gl, DrawBuffers);
INSERT_PROC_ADDRESS(gl, UniformMatrix2x3fv);
INSERT_PROC_ADDRESS(gl, UniformMatrix3x2fv);
INSERT_PROC_ADDRESS(gl, UniformMatrix2x4fv);
INSERT_PROC_ADDRESS(gl, UniformMatrix4x2fv);
INSERT_PROC_ADDRESS(gl, UniformMatrix3x4fv);
INSERT_PROC_ADDRESS(gl, UniformMatrix4x3fv);
INSERT_PROC_ADDRESS(gl, BlitFramebuffer);
INSERT_PROC_ADDRESS(gl, RenderbufferStorageMultisample);
INSERT_PROC_ADDRESS(gl, FramebufferTextureLayer);
INSERT_PROC_ADDRESS(gl, MapBufferRange);
INSERT_PROC_ADDRESS(gl, FlushMappedBufferRange);
INSERT_PROC_ADDRESS(gl, BindVertexArray);
INSERT_PROC_ADDRESS(gl, DeleteVertexArrays);
INSERT_PROC_ADDRESS(gl, GenVertexArrays);
INSERT_PROC_ADDRESS(gl, IsVertexArray);
INSERT_PROC_ADDRESS(gl, GetIntegeri_v);
INSERT_PROC_ADDRESS(gl, BeginTransformFeedback);
INSERT_PROC_ADDRESS(gl, EndTransformFeedback);
INSERT_PROC_ADDRESS(gl, BindBufferRange);
INSERT_PROC_ADDRESS(gl, BindBufferBase);
INSERT_PROC_ADDRESS(gl, TransformFeedbackVaryings);
INSERT_PROC_ADDRESS(gl, GetTransformFeedbackVarying);
INSERT_PROC_ADDRESS(gl, VertexAttribIPointer);
INSERT_PROC_ADDRESS(gl, GetVertexAttribIiv);
INSERT_PROC_ADDRESS(gl, GetVertexAttribIuiv);
INSERT_PROC_ADDRESS(gl, VertexAttribI4i);
INSERT_PROC_ADDRESS(gl, VertexAttribI4ui);
INSERT_PROC_ADDRESS(gl, VertexAttribI4iv);
INSERT_PROC_ADDRESS(gl, VertexAttribI4uiv);
INSERT_PROC_ADDRESS(gl, GetUniformuiv);
INSERT_PROC_ADDRESS(gl, GetFragDataLocation);
INSERT_PROC_ADDRESS(gl, Uniform1ui);
INSERT_PROC_ADDRESS(gl, Uniform2ui);
INSERT_PROC_ADDRESS(gl, Uniform3ui);
INSERT_PROC_ADDRESS(gl, Uniform4ui);
INSERT_PROC_ADDRESS(gl, Uniform1uiv);
INSERT_PROC_ADDRESS(gl, Uniform2uiv);
INSERT_PROC_ADDRESS(gl, Uniform3uiv);
INSERT_PROC_ADDRESS(gl, Uniform4uiv);
INSERT_PROC_ADDRESS(gl, ClearBufferiv);
INSERT_PROC_ADDRESS(gl, ClearBufferuiv);
INSERT_PROC_ADDRESS(gl, ClearBufferfv);
INSERT_PROC_ADDRESS(gl, ClearBufferfi);
INSERT_PROC_ADDRESS(gl, GetStringi);
INSERT_PROC_ADDRESS(gl, CopyBufferSubData);
INSERT_PROC_ADDRESS(gl, GetUniformIndices);
INSERT_PROC_ADDRESS(gl, GetActiveUniformsiv);
INSERT_PROC_ADDRESS(gl, GetUniformBlockIndex);
INSERT_PROC_ADDRESS(gl, GetActiveUniformBlockiv);
INSERT_PROC_ADDRESS(gl, GetActiveUniformBlockName);
INSERT_PROC_ADDRESS(gl, UniformBlockBinding);
INSERT_PROC_ADDRESS(gl, DrawArraysInstanced);
INSERT_PROC_ADDRESS(gl, DrawElementsInstanced);
map["glFenceSync"] =
reinterpret_cast<__eglMustCastToProperFunctionPointerType>(gl::FenceSync_);
INSERT_PROC_ADDRESS(gl, IsSync);
INSERT_PROC_ADDRESS(gl, DeleteSync);
INSERT_PROC_ADDRESS(gl, ClientWaitSync);
INSERT_PROC_ADDRESS(gl, WaitSync);
INSERT_PROC_ADDRESS(gl, GetInteger64v);
INSERT_PROC_ADDRESS(gl, GetSynciv);
INSERT_PROC_ADDRESS(gl, GetInteger64i_v);
INSERT_PROC_ADDRESS(gl, GetBufferParameteri64v);
INSERT_PROC_ADDRESS(gl, GenSamplers);
INSERT_PROC_ADDRESS(gl, DeleteSamplers);
INSERT_PROC_ADDRESS(gl, IsSampler);
INSERT_PROC_ADDRESS(gl, BindSampler);
INSERT_PROC_ADDRESS(gl, SamplerParameteri);
INSERT_PROC_ADDRESS(gl, SamplerParameteriv);
INSERT_PROC_ADDRESS(gl, SamplerParameterf);
INSERT_PROC_ADDRESS(gl, SamplerParameterfv);
INSERT_PROC_ADDRESS(gl, GetSamplerParameteriv);
INSERT_PROC_ADDRESS(gl, GetSamplerParameterfv);
INSERT_PROC_ADDRESS(gl, VertexAttribDivisor);
INSERT_PROC_ADDRESS(gl, BindTransformFeedback);
INSERT_PROC_ADDRESS(gl, DeleteTransformFeedbacks);
INSERT_PROC_ADDRESS(gl, GenTransformFeedbacks);
INSERT_PROC_ADDRESS(gl, IsTransformFeedback);
INSERT_PROC_ADDRESS(gl, PauseTransformFeedback);
INSERT_PROC_ADDRESS(gl, ResumeTransformFeedback);
INSERT_PROC_ADDRESS(gl, GetProgramBinary);
INSERT_PROC_ADDRESS(gl, ProgramBinary);
INSERT_PROC_ADDRESS(gl, ProgramParameteri);
INSERT_PROC_ADDRESS(gl, InvalidateFramebuffer);
INSERT_PROC_ADDRESS(gl, InvalidateSubFramebuffer);
INSERT_PROC_ADDRESS(gl, TexStorage2D);
INSERT_PROC_ADDRESS(gl, TexStorage3D);
INSERT_PROC_ADDRESS(gl, GetInternalformativ);
// EGL 1.0
INSERT_PROC_ADDRESS(egl, ChooseConfig);
INSERT_PROC_ADDRESS(egl, CopyBuffers);
INSERT_PROC_ADDRESS(egl, CreateContext);
INSERT_PROC_ADDRESS(egl, CreatePbufferSurface);
INSERT_PROC_ADDRESS(egl, CreatePixmapSurface);
INSERT_PROC_ADDRESS(egl, CreateWindowSurface);
INSERT_PROC_ADDRESS(egl, DestroyContext);
INSERT_PROC_ADDRESS(egl, DestroySurface);
INSERT_PROC_ADDRESS(egl, GetConfigAttrib);
INSERT_PROC_ADDRESS(egl, GetConfigs);
INSERT_PROC_ADDRESS(egl, GetCurrentDisplay);
INSERT_PROC_ADDRESS(egl, GetCurrentSurface);
INSERT_PROC_ADDRESS(egl, GetDisplay);
INSERT_PROC_ADDRESS(egl, GetError);
INSERT_PROC_ADDRESS(egl, GetProcAddress);
INSERT_PROC_ADDRESS(egl, Initialize);
INSERT_PROC_ADDRESS(egl, MakeCurrent);
INSERT_PROC_ADDRESS(egl, QueryContext);
INSERT_PROC_ADDRESS(egl, QueryString);
INSERT_PROC_ADDRESS(egl, QuerySurface);
INSERT_PROC_ADDRESS(egl, SwapBuffers);
INSERT_PROC_ADDRESS(egl, Terminate);
INSERT_PROC_ADDRESS(egl, WaitGL);
INSERT_PROC_ADDRESS(egl, WaitNative);
// EGL 1.1
INSERT_PROC_ADDRESS(egl, BindTexImage);
INSERT_PROC_ADDRESS(egl, ReleaseTexImage);
INSERT_PROC_ADDRESS(egl, SurfaceAttrib);
INSERT_PROC_ADDRESS(egl, SwapInterval);
// EGL 1.2
INSERT_PROC_ADDRESS(egl, BindAPI);
INSERT_PROC_ADDRESS(egl, QueryAPI);
INSERT_PROC_ADDRESS(egl, CreatePbufferFromClientBuffer);
INSERT_PROC_ADDRESS(egl, ReleaseThread);
INSERT_PROC_ADDRESS(egl, WaitClient);
// EGL 1.4
INSERT_PROC_ADDRESS(egl, GetCurrentContext);
// EGL 1.5
INSERT_PROC_ADDRESS(egl, CreateSync);
INSERT_PROC_ADDRESS(egl, DestroySync);
INSERT_PROC_ADDRESS(egl, ClientWaitSync);
INSERT_PROC_ADDRESS(egl, GetSyncAttrib);
INSERT_PROC_ADDRESS(egl, CreateImage);
INSERT_PROC_ADDRESS(egl, DestroyImage);
INSERT_PROC_ADDRESS(egl, GetPlatformDisplay);
INSERT_PROC_ADDRESS(egl, CreatePlatformWindowSurface);
INSERT_PROC_ADDRESS(egl, CreatePlatformPixmapSurface);
INSERT_PROC_ADDRESS(egl, WaitSync);
// EGL_ANGLE_query_surface_pointer
INSERT_PROC_ADDRESS(egl, QuerySurfacePointerANGLE);
// EGL_NV_post_sub_buffer
INSERT_PROC_ADDRESS(egl, PostSubBufferNV);
// EGL_EXT_platform_base
INSERT_PROC_ADDRESS(egl, GetPlatformDisplayEXT);
// EGL_EXT_device_query
INSERT_PROC_ADDRESS(egl, QueryDisplayAttribEXT);
INSERT_PROC_ADDRESS(egl, QueryDeviceAttribEXT);
INSERT_PROC_ADDRESS(egl, QueryDeviceStringEXT);
// EGL_KHR_image_base/EGL_KHR_image
INSERT_PROC_ADDRESS(egl, CreateImageKHR);
INSERT_PROC_ADDRESS(egl, DestroyImageKHR);
#undef INSERT_PROC_ADDRESS
return map;
}; };
// clang-format off static const ProcAddressMap procAddressMap = generateProcAddressMap();
static const Extension extensions[] =
{
{ "eglQueryDeviceAttribEXT", (__eglMustCastToProperFunctionPointerType)QueryDeviceAttribEXT },
{ "eglQueryDeviceStringEXT", (__eglMustCastToProperFunctionPointerType)QueryDeviceStringEXT },
{ "eglQueryDisplayAttribEXT", (__eglMustCastToProperFunctionPointerType)QueryDisplayAttribEXT },
{ "eglQuerySurfacePointerANGLE", (__eglMustCastToProperFunctionPointerType)QuerySurfacePointerANGLE },
{ "eglPostSubBufferNV", (__eglMustCastToProperFunctionPointerType)PostSubBufferNV },
{ "eglGetPlatformDisplayEXT", (__eglMustCastToProperFunctionPointerType)GetPlatformDisplayEXT },
{ "eglCreateImageKHR", (__eglMustCastToProperFunctionPointerType)CreateImageKHR },
{ "eglDestroyImageKHR", (__eglMustCastToProperFunctionPointerType)DestroyImageKHR },
{ "glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)gl::BlitFramebufferANGLE },
{ "glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)gl::RenderbufferStorageMultisampleANGLE },
{ "glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)gl::DeleteFencesNV },
{ "glGenFencesNV", (__eglMustCastToProperFunctionPointerType)gl::GenFencesNV },
{ "glIsFenceNV", (__eglMustCastToProperFunctionPointerType)gl::IsFenceNV },
{ "glTestFenceNV", (__eglMustCastToProperFunctionPointerType)gl::TestFenceNV },
{ "glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)gl::GetFenceivNV },
{ "glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)gl::FinishFenceNV },
{ "glSetFenceNV", (__eglMustCastToProperFunctionPointerType)gl::SetFenceNV },
{ "glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)gl::GetTranslatedShaderSourceANGLE },
{ "glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)gl::TexStorage2DEXT },
{ "glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)gl::GetGraphicsResetStatusEXT },
{ "glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)gl::ReadnPixelsEXT },
{ "glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)gl::GetnUniformfvEXT },
{ "glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)gl::GetnUniformivEXT },
{ "glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)gl::GenQueriesEXT },
{ "glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)gl::DeleteQueriesEXT },
{ "glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)gl::IsQueryEXT },
{ "glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)gl::BeginQueryEXT },
{ "glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)gl::EndQueryEXT },
{ "glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)gl::GetQueryivEXT },
{ "glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)gl::GetQueryObjectuivEXT },
{ "glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)gl::DrawBuffersEXT },
{ "glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)gl::VertexAttribDivisorANGLE },
{ "glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)gl::DrawArraysInstancedANGLE },
{ "glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)gl::DrawElementsInstancedANGLE },
{ "glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)gl::GetProgramBinaryOES },
{ "glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)gl::ProgramBinaryOES },
{ "glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)gl::GetBufferPointervOES },
{ "glMapBufferOES", (__eglMustCastToProperFunctionPointerType)gl::MapBufferOES },
{ "glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)gl::UnmapBufferOES },
{ "glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)gl::MapBufferRangeEXT },
{ "glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)gl::FlushMappedBufferRangeEXT },
{ "glDiscardFramebufferEXT", (__eglMustCastToProperFunctionPointerType)gl::DiscardFramebufferEXT },
{ "glInsertEventMarkerEXT", (__eglMustCastToProperFunctionPointerType)gl::InsertEventMarkerEXT },
{ "glPushGroupMarkerEXT", (__eglMustCastToProperFunctionPointerType)gl::PushGroupMarkerEXT },
{ "glPopGroupMarkerEXT", (__eglMustCastToProperFunctionPointerType)gl::PopGroupMarkerEXT },
{ "glEGLImageTargetTexture2DOES", (__eglMustCastToProperFunctionPointerType)gl::EGLImageTargetTexture2DOES },
{ "glEGLImageTargetRenderbufferStorageOES", (__eglMustCastToProperFunctionPointerType)gl::EGLImageTargetRenderbufferStorageOES },
{ "", NULL },
};
// clang-format on
for (const Extension *extension = &extensions[0]; extension->address != nullptr; extension++) auto iter = procAddressMap.find(procname);
if (iter != procAddressMap.end())
{ {
if (strcmp(procname, extension->name) == 0) return iter->second;
{
return reinterpret_cast<__eglMustCastToProperFunctionPointerType>(extension->address);
} }
else
{
return nullptr;
} }
return NULL;
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment