GrGLCreateNativeInterface_win.cpp revision 0efcc37952afb7629a5c905cc597f1cb837b987c
1f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com */ 8f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com 9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 106c8c34e65ff8248ec7374e0d662d7f5684d800fatomhudson@google.com#include "gl/GrGLInterface.h" 119c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#include "../GrGLUtil.h" 12373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com#define WIN32_LEAN_AND_MEAN 13f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com#include <Windows.h> 14f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com#include <GL/GL.h> 15f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com 16f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com/* 17f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com * Windows makes the GL funcs all be __stdcall instead of __cdecl :( 18f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com * This implementation will only work if GR_GL_FUNCTION_TYPE is __stdcall. 19f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com * Otherwise, a springboard would be needed that hides the calling convention. 20f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com */ 21f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com 226fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com#define GR_GL_GET_PROC(F) interface->f ## F = (GrGL ## F ## Proc) wglGetProcAddress("gl" #F); 236fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com#define GR_GL_GET_PROC_SUFFIX(F, S) interface->f ## F = (GrGL ## F ## Proc) wglGetProcAddress("gl" #F #S); 24747bf293d47d7437791caed8e8990370b57a7766tomhudson@google.com 25373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.comconst GrGLInterface* GrGLCreateNativeInterface() { 260b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com // wglGetProcAddress requires a context. 276fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com // GL Function pointers retrieved in one context may not be valid in another 286fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com // context. For that reason we create a new GrGLInterface each time we're 296fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com // called. 300b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com if (NULL != wglGetCurrentContext()) { 310b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com const char* versionString = (const char*) glGetString(GL_VERSION); 320b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com const char* extString = (const char*) glGetString(GL_EXTENSIONS); 33c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com GrGLVersion glVer = GrGLGetVersionFromString(versionString); 34f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com 35c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com if (glVer < GR_GL_VER(1,5)) { 360b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com // We must have array and element_array buffer objects. 376fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com return NULL; 380b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com } 396fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com GrGLInterface* interface = new GrGLInterface(); 40f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com 410b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com // Functions that are part of GL 1.1 will return NULL in 420b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com // wglGetProcAddress 437d1276ff67bc8a03f1c62c10ed05dae87349f782bsalomon@google.com interface->fBindTexture = glBindTexture; 446fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fBlendFunc = glBlendFunc; 45e788430144d1474329878abd1ddb39cc0ca52a0arobertphillips@google.com 46e788430144d1474329878abd1ddb39cc0ca52a0arobertphillips@google.com if (glVer >= GR_GL_VER(1,4) || 470efcc37952afb7629a5c905cc597f1cb837b987cbsalomon@google.com GrGLHasExtensionFromString("GL_ARB_imaging", extString) || 480efcc37952afb7629a5c905cc597f1cb837b987cbsalomon@google.com GrGLHasExtensionFromString("GL_EXT_blend_color", extString)) { 49e788430144d1474329878abd1ddb39cc0ca52a0arobertphillips@google.com GR_GL_GET_PROC(BlendColor); 500efcc37952afb7629a5c905cc597f1cb837b987cbsalomon@google.com } 51e788430144d1474329878abd1ddb39cc0ca52a0arobertphillips@google.com 526fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fClear = glClear; 536fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fClearColor = glClearColor; 546fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fClearStencil = glClearStencil; 556fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fColorMask = glColorMask; 566fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fCullFace = glCullFace; 576fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fDeleteTextures = glDeleteTextures; 586fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fDepthMask = glDepthMask; 596fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fDisable = glDisable; 606fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fDrawArrays = glDrawArrays; 616fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fDrawElements = glDrawElements; 626fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fDrawBuffer = glDrawBuffer; 636fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fEnable = glEnable; 646fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fFrontFace = glFrontFace; 65373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com interface->fFinish = glFinish; 66373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com interface->fFlush = glFlush; 676fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fGenTextures = glGenTextures; 686fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fGetError = glGetError; 696fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fGetIntegerv = glGetIntegerv; 706fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fGetString = glGetString; 716fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fGetTexLevelParameteriv = glGetTexLevelParameteriv; 726fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fLineWidth = glLineWidth; 73fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com interface->fLoadIdentity = glLoadIdentity; 74fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com interface->fLoadMatrixf = glLoadMatrixf; 75fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com interface->fMatrixMode = glMatrixMode; 766fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fPixelStorei = glPixelStorei; 776fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fReadBuffer = glReadBuffer; 786fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fReadPixels = glReadPixels; 796fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fScissor = glScissor; 806fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fStencilFunc = glStencilFunc; 816fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fStencilMask = glStencilMask; 826fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fStencilOp = glStencilOp; 836fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fTexImage2D = glTexImage2D; 846fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fTexParameteri = glTexParameteri; 854d063dea5ee9d5a62e3566a07cb8386cb1a59585bsalomon@google.com interface->fTexParameteriv = glTexParameteriv; 86280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com if (glVer >= GR_GL_VER(4,2) || 87280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com GrGLHasExtensionFromString("GL_ARB_texture_storage", extString)) { 88280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com GR_GL_GET_PROC(TexStorage2D); 89280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com } else if (GrGLHasExtensionFromString("GL_EXT_texture_storage", extString)) { 90280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com GR_GL_GET_PROC_SUFFIX(TexStorage2D, EXT); 91280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com } 926fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fTexSubImage2D = glTexSubImage2D; 936fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fViewport = glViewport; 94f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com 950b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(ActiveTexture); 960b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(AttachShader); 97f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com GR_GL_GET_PROC(BeginQuery); 980b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(BindAttribLocation); 990b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(BindBuffer); 100bc5cf51627505f763586100675aa60b66d743c7ebsalomon@google.com GR_GL_GET_PROC(BindFragDataLocation); 1010b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(BufferData); 1020b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(BufferSubData); 1030b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(CompileShader); 1040b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(CompressedTexImage2D); 1050b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(CreateProgram); 1060b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(CreateShader); 1070b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(DeleteBuffers); 108f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com GR_GL_GET_PROC(DeleteQueries); 1090b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(DeleteProgram); 1100b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(DeleteShader); 1110b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(DisableVertexAttribArray); 1120b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(DrawBuffers); 1130b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(EnableVertexAttribArray); 114f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com GR_GL_GET_PROC(EndQuery); 1150b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(GenBuffers); 116f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com GR_GL_GET_PROC(GenQueries); 1170b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(GetBufferParameteriv); 118f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com GR_GL_GET_PROC(GetQueryiv); 119f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com GR_GL_GET_PROC(GetQueryObjectiv); 120f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com GR_GL_GET_PROC(GetQueryObjectuiv); 121f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com if (glVer > GR_GL_VER(3,3) || 122f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com GrGLHasExtensionFromString("GL_ARB_timer_query", extString)) { 123f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com GR_GL_GET_PROC(GetQueryObjecti64v); 124f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com GR_GL_GET_PROC(GetQueryObjectui64v); 125f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com GR_GL_GET_PROC(QueryCounter); 126f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com } else if (GrGLHasExtensionFromString("GL_EXT_timer_query", extString)) { 127f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetQueryObjecti64v, EXT); 128e173992c2319205fdc263ccd10d7a9018c23013cbsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetQueryObjectui64v, EXT); 129f97c194df7d38e45ae8bf03e276141c914ff6d8ebsalomon@google.com } 1300b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(GetProgramInfoLog); 1310b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(GetProgramiv); 1320b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(GetShaderInfoLog); 1330b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(GetShaderiv); 1340b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(GetUniformLocation); 1350b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(LinkProgram); 136c9668ecdb7188a90b050771727da899c54dc7013bsalomon@google.com if (GrGLHasExtensionFromString("GL_NV_framebuffer_multisample_coverage", extString)) { 137c9668ecdb7188a90b050771727da899c54dc7013bsalomon@google.com GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisampleCoverage, NV); 138c9668ecdb7188a90b050771727da899c54dc7013bsalomon@google.com } 1390b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(ShaderSource); 1400b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(StencilFuncSeparate); 1410b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(StencilMaskSeparate); 1420b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(StencilOpSeparate); 1430b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform1f); 1440b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform1i); 1450b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform1fv); 1460b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform1iv); 1470b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform2f); 1480b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform2i); 1490b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform2fv); 1500b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform2iv); 1510b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform3f); 1520b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform3i); 1530b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform3fv); 1540b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform3iv); 1550b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform4f); 1560b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform4i); 1570b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform4fv); 1580b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(Uniform4iv); 1590b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(UniformMatrix2fv); 1600b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(UniformMatrix3fv); 1610b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(UniformMatrix4fv); 1620b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(UseProgram); 1630b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(VertexAttrib4fv); 1640b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(VertexAttribPointer); 1650b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(BindFragDataLocationIndexed); 166f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com 1670b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com // First look for GL3.0 FBO or GL_ARB_framebuffer_object (same since 1680b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com // GL_ARB_framebuffer_object doesn't use ARB suffix.) 169c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com if (glVer > GR_GL_VER(3,0) || 170c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com GrGLHasExtensionFromString("GL_ARB_framebuffer_object", extString)) { 1710b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(GenFramebuffers); 1720b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(GetFramebufferAttachmentParameteriv); 1730b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(GetRenderbufferParameteriv); 1740b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(BindFramebuffer); 1750b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(FramebufferTexture2D); 1760b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(CheckFramebufferStatus); 1770b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(DeleteFramebuffers); 1780b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(RenderbufferStorage); 1790b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(GenRenderbuffers); 1800b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(DeleteRenderbuffers); 1810b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(FramebufferRenderbuffer); 1820b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(BindRenderbuffer); 1830b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(RenderbufferStorageMultisample); 1840b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(BlitFramebuffer); 185c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com } else if (GrGLHasExtensionFromString("GL_EXT_framebuffer_object", 186c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com extString)) { 1870b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GenFramebuffers, EXT); 1880b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetFramebufferAttachmentParameteriv, EXT); 1890b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetRenderbufferParameteriv, EXT); 1900b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC_SUFFIX(BindFramebuffer, EXT); 1910b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC_SUFFIX(FramebufferTexture2D, EXT); 1920b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC_SUFFIX(CheckFramebufferStatus, EXT); 1930b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC_SUFFIX(DeleteFramebuffers, EXT); 1940b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC_SUFFIX(RenderbufferStorage, EXT); 1950b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GenRenderbuffers, EXT); 1960b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC_SUFFIX(DeleteRenderbuffers, EXT); 1970b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC_SUFFIX(FramebufferRenderbuffer, EXT); 1980b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC_SUFFIX(BindRenderbuffer, EXT); 199c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com if (GrGLHasExtensionFromString("GL_EXT_framebuffer_multisample", extString)) { 2000b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC_SUFFIX(RenderbufferStorageMultisample, EXT); 2010b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com } 202c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com if (GrGLHasExtensionFromString("GL_EXT_framebuffer_blit", extString)) { 2030b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC_SUFFIX(BlitFramebuffer, EXT); 204f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com } 2050b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com } else { 2060b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com // we must have FBOs 2076fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com delete interface; 2086fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com return NULL; 2090b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com } 2100b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(MapBuffer); 2110b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com GR_GL_GET_PROC(UnmapBuffer); 212f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com 213fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com if (GrGLHasExtensionFromString("GL_NV_path_rendering", extString)) { 214fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathCommands, NV); 215fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathCoords, NV); 216fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathSubCommands, NV); 217fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathSubCoords, NV); 218fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathString, NV); 219fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathGlyphs, NV); 220fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathGlyphRange, NV); 221fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(WeightPaths, NV); 222fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(CopyPath, NV); 223fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(InterpolatePaths, NV); 224fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(TransformPath, NV); 225fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathParameteriv, NV); 226fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathParameteri, NV); 227fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathParameterfv, NV); 228fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathParameterf, NV); 229fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathDashArray, NV); 230fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GenPaths, NV); 231fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(DeletePaths, NV); 232fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(IsPath, NV); 233fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathStencilFunc, NV); 234fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathStencilDepthOffset, NV); 235fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(StencilFillPath, NV); 236fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(StencilStrokePath, NV); 237fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(StencilFillPathInstanced, NV); 238fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(StencilStrokePathInstanced, NV); 239fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathCoverDepthFunc, NV); 240fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathColorGen, NV); 241fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathTexGen, NV); 242fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PathFogGen, NV); 243fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(CoverFillPath, NV); 244fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(CoverStrokePath, NV); 245fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(CoverFillPathInstanced, NV); 246fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(CoverStrokePathInstanced, NV); 247fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetPathParameteriv, NV); 248fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetPathParameterfv, NV); 249fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetPathCommands, NV); 250fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetPathCoords, NV); 251fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetPathDashArray, NV); 252fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetPathMetrics, NV); 253fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetPathMetricRange, NV); 254fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetPathSpacing, NV); 255fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetPathColorGeniv, NV); 256fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetPathColorGenfv, NV); 257fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetPathTexGeniv, NV); 258fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetPathTexGenfv, NV); 259fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(IsPointInFillPath, NV); 260fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(IsPointInStrokePath, NV); 261fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(GetPathLength, NV); 262fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com GR_GL_GET_PROC_SUFFIX(PointAlongPath, NV); 263fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com } 264fe11cb6486adfccc1a9ca9658ae25907192a8642bsalomon@google.com 2656fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com interface->fBindingsExported = kDesktop_GrGLBinding; 266f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com 2676fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com return interface; 2686fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com } else { 2696fb736fc2ea5f3f7ac44494211cc6755180ca192bsalomon@google.com return NULL; 270f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com } 271f987d1b2348258970cae675135b6dedda079de48bsalomon@google.com} 272