skia2/tools/gpu/gl/interface/templates.go
Chris Dalton 4c1fcdb4e8 Don't cast emscripten pointers when assembling WebGL interface
Since we are now referencing the exact methods instead of calling
GetProcAddress, there is no need to cast the function pointers. This
also catches a bug where the emscripten signatures for glWaitSync and
glClientWaitSync did not match the OpenGL API.

Change-Id: If365a8f6090961cb4b44146d87e102430bc5b30f
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/320659
Commit-Queue: Chris Dalton <csmartdalton@google.com>
Reviewed-by: Kevin Lubick <kjlubick@google.com>
2020-09-30 14:31:07 +00:00

324 lines
9.8 KiB
Go

// 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<const GrGLInterface> GrGLMakeAssembledGLESInterface(void *ctx, GrGLGetProc get) {
return nullptr;
}
#else
sk_sp<const GrGLInterface> GrGLMakeAssembledGLESInterface(void *ctx, GrGLGetProc get) {
GET_PROC_LOCAL(GetString);
if (nullptr == GetString) {
return nullptr;
}
const char* verStr = reinterpret_cast<const char*>(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<GrGLInterface> 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<const GrGLInterface> GrGLMakeAssembledGLInterface(void *ctx, GrGLGetProc get) {
return nullptr;
}
#else
sk_sp<const GrGLInterface> 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<GrGLInterface> 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<const GrGLInterface> 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<const GrGLInterface> GrGLMakeAssembledWebGLInterface(void *ctx, GrGLGetProc get) {
const char* verStr = reinterpret_cast<const char*>(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<GrGLInterface> 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 <stdio.h>
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<GrGLInterface*>(this)->fFunctions = GrGLInterface::Functions();
}
#endif // GR_TEST_UTILS
`