// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package main const ASSEMBLE_INTERFACE_GL_ES = `/* * Copyright 2019 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * * THIS FILE IS AUTOGENERATED * Make edits to tools/gpu/gl/interface/templates.go or they will * be overwritten. */ #include "include/gpu/gl/GrGLAssembleHelpers.h" #include "include/gpu/gl/GrGLAssembleInterface.h" #include "src/gpu/gl/GrGLUtil.h" #define GET_PROC(F) functions->f##F = (GrGL##F##Fn*)get(ctx, "gl" #F) #define GET_PROC_SUFFIX(F, S) functions->f##F = (GrGL##F##Fn*)get(ctx, "gl" #F #S) #define GET_PROC_LOCAL(F) GrGL##F##Fn* F = (GrGL##F##Fn*)get(ctx, "gl" #F) #define GET_EGL_PROC_SUFFIX(F, S) functions->fEGL##F = (GrEGL##F##Fn*)get(ctx, "egl" #F #S) #if SK_DISABLE_GL_ES_INTERFACE sk_sp GrGLMakeAssembledGLESInterface(void *ctx, GrGLGetProc get) { return nullptr; } #else sk_sp GrGLMakeAssembledGLESInterface(void *ctx, GrGLGetProc get) { GET_PROC_LOCAL(GetString); if (nullptr == GetString) { return nullptr; } const char* verStr = reinterpret_cast(GetString(GR_GL_VERSION)); GrGLVersion glVer = GrGLGetVersionFromString(verStr); if (glVer < GR_GL_VER(2,0)) { return nullptr; } GET_PROC_LOCAL(GetIntegerv); GET_PROC_LOCAL(GetStringi); GrEGLQueryStringFn* queryString; GrEGLDisplay display; GrGetEGLQueryAndDisplay(&queryString, &display, ctx, get); GrGLExtensions extensions; if (!extensions.init(kGLES_GrGLStandard, GetString, GetStringi, GetIntegerv, queryString, display)) { return nullptr; } sk_sp interface(new GrGLInterface); GrGLInterface::Functions* functions = &interface->fFunctions; // Autogenerated content follows [[content]] // End autogenerated content // TODO(kjlubick): Do we want a feature that removes the extension if it doesn't have // the function? This is common on some low-end GPUs. if (extensions.has("GL_KHR_debug")) { // In general we have a policy against removing extension strings when the driver does // not provide function pointers for an advertised extension. However, because there is a // known device that advertises GL_KHR_debug but fails to provide the functions and this is // a debugging- only extension we've made an exception. This also can happen when using // APITRACE. if (!interface->fFunctions.fDebugMessageControl) { extensions.remove("GL_KHR_debug"); } } interface->fStandard = kGLES_GrGLStandard; interface->fExtensions.swap(&extensions); return std::move(interface); } #endif ` const ASSEMBLE_INTERFACE_GL = `/* * Copyright 2019 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * * THIS FILE IS AUTOGENERATED * Make edits to tools/gpu/gl/interface/templates.go or they will * be overwritten. */ #include "include/gpu/gl/GrGLAssembleHelpers.h" #include "include/gpu/gl/GrGLAssembleInterface.h" #include "src/gpu/gl/GrGLUtil.h" #define GET_PROC(F) functions->f##F = (GrGL##F##Fn*)get(ctx, "gl" #F) #define GET_PROC_SUFFIX(F, S) functions->f##F = (GrGL##F##Fn*)get(ctx, "gl" #F #S) #define GET_PROC_LOCAL(F) GrGL##F##Fn* F = (GrGL##F##Fn*)get(ctx, "gl" #F) #define GET_EGL_PROC_SUFFIX(F, S) functions->fEGL##F = (GrEGL##F##Fn*)get(ctx, "egl" #F #S) #if SK_DISABLE_GL_INTERFACE sk_sp GrGLMakeAssembledGLInterface(void *ctx, GrGLGetProc get) { return nullptr; } #else sk_sp GrGLMakeAssembledGLInterface(void *ctx, GrGLGetProc get) { GET_PROC_LOCAL(GetString); GET_PROC_LOCAL(GetStringi); GET_PROC_LOCAL(GetIntegerv); // GetStringi may be nullptr depending on the GL version. if (nullptr == GetString || nullptr == GetIntegerv) { return nullptr; } const char* versionString = (const char*) GetString(GR_GL_VERSION); GrGLVersion glVer = GrGLGetVersionFromString(versionString); if (glVer < GR_GL_VER(2,0) || GR_GL_INVALID_VER == glVer) { // This is our minimum for non-ES GL. return nullptr; } GrEGLQueryStringFn* queryString; GrEGLDisplay display; GrGetEGLQueryAndDisplay(&queryString, &display, ctx, get); GrGLExtensions extensions; if (!extensions.init(kGL_GrGLStandard, GetString, GetStringi, GetIntegerv, queryString, display)) { return nullptr; } sk_sp interface(new GrGLInterface()); GrGLInterface::Functions* functions = &interface->fFunctions; // Autogenerated content follows [[content]] // End autogenerated content interface->fStandard = kGL_GrGLStandard; interface->fExtensions.swap(&extensions); return std::move(interface); } #endif ` const ASSEMBLE_INTERFACE_WEBGL = `/* * Copyright 2019 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * * THIS FILE IS AUTOGENERATED * Make edits to tools/gpu/gl/interface/templates.go or they will * be overwritten. */ #include "include/gpu/gl/GrGLAssembleHelpers.h" #include "include/gpu/gl/GrGLAssembleInterface.h" #include "src/gpu/gl/GrGLUtil.h" #if SK_DISABLE_WEBGL_INTERFACE || !defined(SK_USE_WEBGL) sk_sp GrGLMakeAssembledWebGLInterface(void *ctx, GrGLGetProc get) { return nullptr; } #else // Located https://github.com/emscripten-core/emscripten/tree/7ba7700902c46734987585409502f3c63beb650f/system/include/webgl #include "webgl/webgl1.h" #include "webgl/webgl1_ext.h" #include "webgl/webgl2.h" #include "webgl/webgl2_ext.h" #define GET_PROC(F) functions->f##F = emscripten_gl##F #define GET_PROC_SUFFIX(F, S) functions->f##F = emscripten_gl##F##S // Adapter from standard GL signature to emscripten. void emscripten_glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { uint32_t timeoutLo = timeout; uint32_t timeoutHi = timeout >> 32; emscripten_glWaitSync(sync, flags, timeoutLo, timeoutHi); } // Adapter from standard GL signature to emscripten. GLenum emscripten_glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { uint32_t timeoutLo = timeout; uint32_t timeoutHi = timeout >> 32; return emscripten_glClientWaitSync(sync, flags, timeoutLo, timeoutHi); } sk_sp GrGLMakeAssembledWebGLInterface(void *ctx, GrGLGetProc get) { const char* verStr = reinterpret_cast(emscripten_glGetString(GR_GL_VERSION)); GrGLVersion glVer = GrGLGetVersionFromString(verStr); if (glVer < GR_GL_VER(1,0)) { return nullptr; } GrGLExtensions extensions; if (!extensions.init(kWebGL_GrGLStandard, emscripten_glGetString, emscripten_glGetStringi, emscripten_glGetIntegerv)) { return nullptr; } sk_sp interface(new GrGLInterface); GrGLInterface::Functions* functions = &interface->fFunctions; // Autogenerated content follows [[content]] // End autogenerated content interface->fStandard = kWebGL_GrGLStandard; interface->fExtensions.swap(&extensions); return std::move(interface); } #endif ` const VALIDATE_INTERFACE = `/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * * THIS FILE IS AUTOGENERATED * Make edits to tools/gpu/gl/interface/templates.go or they will * be overwritten. */ #include "include/gpu/gl/GrGLExtensions.h" #include "include/gpu/gl/GrGLInterface.h" #include "src/gpu/gl/GrGLUtil.h" #include GrGLInterface::GrGLInterface() { fStandard = kNone_GrGLStandard; } #if GR_GL_CHECK_ERROR static const char* get_error_string(GrGLenum err) { switch (err) { case GR_GL_NO_ERROR: return ""; case GR_GL_INVALID_ENUM: return "Invalid Enum"; case GR_GL_INVALID_VALUE: return "Invalid Value"; case GR_GL_INVALID_OPERATION: return "Invalid Operation"; case GR_GL_OUT_OF_MEMORY: return "Out of Memory"; case GR_GL_CONTEXT_LOST: return "Context Lost"; } return "Unknown"; } GrGLenum GrGLInterface::checkError(const char* location, const char* call) const { GrGLenum error = fFunctions.fGetError(); if (error != GR_GL_NO_ERROR && !fSuppressErrorLogging) { SkDebugf("---- glGetError 0x%x(%s)", error, get_error_string(error)); if (location) { SkDebugf(" at\n\t%s", location); } if (call) { SkDebugf("\n\t\t%s", call); } SkDebugf("\n"); if (error == GR_GL_OUT_OF_MEMORY) { fOOMed = true; } } return error; } bool GrGLInterface::checkAndResetOOMed() const { if (fOOMed) { fOOMed = false; return true; } return false; } void GrGLInterface::suppressErrorLogging() { fSuppressErrorLogging = true; } #endif #define RETURN_FALSE_INTERFACE \ SkDEBUGF("%s:%d GrGLInterface::validate() failed.\n", __FILE__, __LINE__); \ return false bool GrGLInterface::validate() const { if (kNone_GrGLStandard == fStandard) { RETURN_FALSE_INTERFACE; } if (!fExtensions.isInitialized()) { RETURN_FALSE_INTERFACE; } GrGLVersion glVer = GrGLGetVersion(this); if (GR_GL_INVALID_VER == glVer) { RETURN_FALSE_INTERFACE; } // Autogenerated content follows [[content]] // End autogenerated content return true; } #if GR_TEST_UTILS void GrGLInterface::abandon() const { const_cast(this)->fFunctions = GrGLInterface::Functions(); } #endif // GR_TEST_UTILS `