aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar bsalomon <bsalomon@google.com>2015-11-16 06:48:44 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-11-16 06:48:44 -0800
commitb1a32ad51767d7639abc6ba16aae656145d7fc77 (patch)
tree37ff3a1e8efc0497cf0f6e96afc5d1773c291506 /src
parent0dfa62c97707ac9b0fc0bdba7acfc8405db5c836 (diff)
Add support for EGLImage to GrGLInterface
Diffstat (limited to 'src')
-rw-r--r--src/gpu/gl/GrGLAssembleInterface.cpp39
-rw-r--r--src/gpu/gl/GrGLCreateNullInterface.cpp2
-rw-r--r--src/gpu/gl/GrGLDefines.h4
-rw-r--r--src/gpu/gl/GrGLExtensions.cpp50
-rw-r--r--src/gpu/gl/GrGLInterface.cpp7
-rw-r--r--src/gpu/gl/SkNullGLContext.cpp2
-rw-r--r--src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp4
-rw-r--r--src/gpu/gl/debug/GrGLCreateDebugInterface.cpp2
8 files changed, 87 insertions, 23 deletions
diff --git a/src/gpu/gl/GrGLAssembleInterface.cpp b/src/gpu/gl/GrGLAssembleInterface.cpp
index 1cb721b1bb..e606f4a29e 100644
--- a/src/gpu/gl/GrGLAssembleInterface.cpp
+++ b/src/gpu/gl/GrGLAssembleInterface.cpp
@@ -14,6 +14,8 @@
#define GET_PROC_SUFFIX(F, S) functions->f ## F = (GrGL ## F ## Proc) get(ctx, "gl" #F #S)
#define GET_PROC_LOCAL(F) GrGL ## F ## Proc F = (GrGL ## F ## Proc) get(ctx, "gl" #F)
+#define GET_EGL_PROC_SUFFIX(F, S) functions->f ## F = (GrEGL ## F ## Proc) get(ctx, "egl" #F #S)
+
const GrGLInterface* GrGLAssembleInterface(void* ctx, GrGLGetProc get) {
GET_PROC_LOCAL(GetString);
if (nullptr == GetString) {
@@ -35,6 +37,21 @@ const GrGLInterface* GrGLAssembleInterface(void* ctx, GrGLGetProc get) {
return nullptr;
}
+static void get_egl_query_and_display(GrEGLQueryStringProc* queryString, GrEGLDisplay* display,
+ void* ctx, GrGLGetProc get) {
+ *queryString = (GrEGLQueryStringProc) get(ctx, "eglQueryString");
+ *display = GR_EGL_NO_DISPLAY;
+ if (*queryString) {
+ GrEGLGetCurrentDisplayProc getCurrentDisplay =
+ (GrEGLGetCurrentDisplayProc) get(ctx, "eglGetCurrentDisplay");
+ if (getCurrentDisplay) {
+ *display = getCurrentDisplay();
+ } else {
+ *queryString = nullptr;
+ }
+ }
+}
+
const GrGLInterface* GrGLAssembleGLInterface(void* ctx, GrGLGetProc get) {
GET_PROC_LOCAL(GetString);
GET_PROC_LOCAL(GetStringi);
@@ -53,8 +70,12 @@ const GrGLInterface* GrGLAssembleGLInterface(void* ctx, GrGLGetProc get) {
return nullptr;
}
+ GrEGLQueryStringProc queryString;
+ GrEGLDisplay display;
+ get_egl_query_and_display(&queryString, &display, ctx, get);
GrGLExtensions extensions;
- if (!extensions.init(kGL_GrGLStandard, GetString, GetStringi, GetIntegerv)) {
+ if (!extensions.init(kGL_GrGLStandard, GetString, GetStringi, GetIntegerv, queryString,
+ display)) {
return nullptr;
}
@@ -462,6 +483,11 @@ const GrGLInterface* GrGLAssembleGLInterface(void* ctx, GrGLGetProc get) {
GET_PROC(ObjectLabel);
}
+ if (extensions.has("EGL_KHR_image") || extensions.has("EGL_KHR_image_base")) {
+ GET_EGL_PROC_SUFFIX(CreateImage, KHR);
+ GET_EGL_PROC_SUFFIX(DestroyImage, KHR);
+ }
+
interface->fStandard = kGL_GrGLStandard;
interface->fExtensions.swap(&extensions);
@@ -483,8 +509,12 @@ const GrGLInterface* GrGLAssembleGLESInterface(void* ctx, GrGLGetProc get) {
GET_PROC_LOCAL(GetIntegerv);
GET_PROC_LOCAL(GetStringi);
+ GrEGLQueryStringProc queryString;
+ GrEGLDisplay display;
+ get_egl_query_and_display(&queryString, &display, ctx, get);
GrGLExtensions extensions;
- if (!extensions.init(kGLES_GrGLStandard, GetString, GetStringi, GetIntegerv)) {
+ if (!extensions.init(kGLES_GrGLStandard, GetString, GetStringi, GetIntegerv, queryString,
+ display)) {
return nullptr;
}
@@ -766,6 +796,11 @@ const GrGLInterface* GrGLAssembleGLESInterface(void* ctx, GrGLGetProc get) {
GET_PROC_SUFFIX(BindUniformLocation, CHROMIUM);
}
+ if (extensions.has("EGL_KHR_image") || extensions.has("EGL_KHR_image_base")) {
+ GET_EGL_PROC_SUFFIX(CreateImage, KHR);
+ GET_EGL_PROC_SUFFIX(DestroyImage, KHR);
+ }
+
interface->fStandard = kGLES_GrGLStandard;
interface->fExtensions.swap(&extensions);
diff --git a/src/gpu/gl/GrGLCreateNullInterface.cpp b/src/gpu/gl/GrGLCreateNullInterface.cpp
index 1ed5f65e5c..f0a3e7d4bd 100644
--- a/src/gpu/gl/GrGLCreateNullInterface.cpp
+++ b/src/gpu/gl/GrGLCreateNullInterface.cpp
@@ -488,6 +488,6 @@ const GrGLInterface* GrGLCreateNullInterface() {
functions->fBindFragDataLocationIndexed = noOpGLBindFragDataLocationIndexed;
interface->fExtensions.init(kGL_GrGLStandard, functions->fGetString, functions->fGetStringi,
- functions->fGetIntegerv);
+ functions->fGetIntegerv, nullptr, GR_EGL_NO_DISPLAY);
return interface;
}
diff --git a/src/gpu/gl/GrGLDefines.h b/src/gpu/gl/GrGLDefines.h
index cc588b93b7..603a319ca0 100644
--- a/src/gpu/gl/GrGLDefines.h
+++ b/src/gpu/gl/GrGLDefines.h
@@ -928,4 +928,8 @@
#define GR_GL_PROGRAM_PIPELINE 0x82E4
#define GR_GL_SAMPLER 0x82E6
+/* EGL Defines */
+#define GR_EGL_NO_DISPLAY ((GrEGLDisplay)0)
+#define GR_EGL_EXTENSIONS 0x3055
+
#endif
diff --git a/src/gpu/gl/GrGLExtensions.cpp b/src/gpu/gl/GrGLExtensions.cpp
index 6d716d190f..e51fa04ce8 100644
--- a/src/gpu/gl/GrGLExtensions.cpp
+++ b/src/gpu/gl/GrGLExtensions.cpp
@@ -41,14 +41,36 @@ GrGLExtensions& GrGLExtensions::operator=(const GrGLExtensions& that) {
return *this;
}
+static void eat_space_sep_strings(SkTArray<SkString>* out, const char in[]) {
+ if (!in) {
+ return;
+ }
+ while (true) {
+ // skip over multiple spaces between extensions
+ while (' ' == *in) {
+ ++in;
+ }
+ // quit once we reach the end of the string.
+ if ('\0' == *in) {
+ break;
+ }
+ // we found an extension
+ size_t length = strcspn(in, " ");
+ out->push_back().set(in, length);
+ in += length;
+ }
+}
+
bool GrGLExtensions::init(GrGLStandard standard,
GrGLGetStringProc getString,
GrGLGetStringiProc getStringi,
- GrGLGetIntegervProc getIntegerv) {
+ GrGLGetIntegervProc getIntegerv,
+ GrEGLQueryStringProc queryString,
+ GrEGLDisplay eglDisplay) {
fInitialized = false;
fStrings->reset();
- if (nullptr == getString) {
+ if (!getString) {
return false;
}
@@ -62,7 +84,7 @@ bool GrGLExtensions::init(GrGLStandard standard,
bool indexed = version >= GR_GL_VER(3, 0);
if (indexed) {
- if (nullptr == getStringi || nullptr == getIntegerv) {
+ if (!getStringi || !getIntegerv) {
return false;
}
GrGLint extensionCnt = 0;
@@ -74,23 +96,15 @@ bool GrGLExtensions::init(GrGLStandard standard,
}
} else {
const char* extensions = (const char*) getString(GR_GL_EXTENSIONS);
- if (nullptr == extensions) {
+ if (!extensions) {
return false;
}
- while (true) {
- // skip over multiple spaces between extensions
- while (' ' == *extensions) {
- ++extensions;
- }
- // quit once we reach the end of the string.
- if ('\0' == *extensions) {
- break;
- }
- // we found an extension
- size_t length = strcspn(extensions, " ");
- fStrings->push_back().set(extensions, length);
- extensions += length;
- }
+ eat_space_sep_strings(fStrings, extensions);
+ }
+ if (queryString) {
+ const char* extensions = queryString(eglDisplay, GR_EGL_EXTENSIONS);
+
+ eat_space_sep_strings(fStrings, extensions);
}
if (!fStrings->empty()) {
SkTLessFunctionToFunctorAdaptor<SkString, extension_compare> cmp;
diff --git a/src/gpu/gl/GrGLInterface.cpp b/src/gpu/gl/GrGLInterface.cpp
index 7ffa6a17cf..c6c846abf8 100644
--- a/src/gpu/gl/GrGLInterface.cpp
+++ b/src/gpu/gl/GrGLInterface.cpp
@@ -726,5 +726,12 @@ bool GrGLInterface::validate() const {
}
}
+ if (fExtensions.has("EGL_KHR_image") || fExtensions.has("EGL_KHR_image_base")) {
+ if (nullptr == fFunctions.fCreateImage ||
+ nullptr == fFunctions.fDestroyImage) {
+ RETURN_FALSE_INTERFACE
+ }
+ }
+
return true;
}
diff --git a/src/gpu/gl/SkNullGLContext.cpp b/src/gpu/gl/SkNullGLContext.cpp
index 877eed9d77..e2a80ce2b3 100644
--- a/src/gpu/gl/SkNullGLContext.cpp
+++ b/src/gpu/gl/SkNullGLContext.cpp
@@ -491,7 +491,7 @@ static GrGLInterface* create_null_interface(State* state) {
functions->fBindFragDataLocationIndexed = noOpGLBindFragDataLocationIndexed;
interface->fExtensions.init(kGL_GrGLStandard, functions->fGetString, functions->fGetStringi,
- functions->fGetIntegerv);
+ functions->fGetIntegerv, nullptr, GR_EGL_NO_DISPLAY);
return interface;
}
diff --git a/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp b/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp
index 1df4a950c1..58a98090d5 100644
--- a/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp
+++ b/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp
@@ -223,6 +223,10 @@ static GrGLFuncPtr android_get_gl_proc(void* ctx, const char name[]) {
return (GrGLFuncPtr) glGetRenderbufferParameteriv;
} else if (0 == strcmp("glRenderbufferStorage", name)) {
return (GrGLFuncPtr) glRenderbufferStorage;
+ } else if (0 == strcmp("eglQueryString", name)) {
+ return (GrGLFuncPtr) eglQueryString;
+ } else if (0 == strcmp("eglGetCurrentDisplay", name)) {
+ return (GrGLFuncPtr) eglGetCurrentDisplay;
}
return eglGetProcAddress(name);
}
diff --git a/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp b/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp
index 75b673688d..f5440fe313 100644
--- a/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp
+++ b/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp
@@ -983,7 +983,7 @@ const GrGLInterface* GrGLCreateDebugInterface() {
noOpGLBindFragDataLocationIndexed;
interface->fExtensions.init(kGL_GrGLStandard, functions->fGetString, functions->fGetStringi,
- functions->fGetIntegerv);
+ functions->fGetIntegerv, nullptr, GR_EGL_NO_DISPLAY);
return interface;
}