4c1fcdb4e8
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>
324 lines
9.8 KiB
Go
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
|
|
`
|