diff options
author | bsalomon <bsalomon@google.com> | 2015-11-16 06:48:44 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-16 06:48:44 -0800 |
commit | b1a32ad51767d7639abc6ba16aae656145d7fc77 (patch) | |
tree | 37ff3a1e8efc0497cf0f6e96afc5d1773c291506 /src | |
parent | 0dfa62c97707ac9b0fc0bdba7acfc8405db5c836 (diff) |
Add support for EGLImage to GrGLInterface
BUG=skia:
Review URL: https://codereview.chromium.org/1434813002
Diffstat (limited to 'src')
-rw-r--r-- | src/gpu/gl/GrGLAssembleInterface.cpp | 39 | ||||
-rw-r--r-- | src/gpu/gl/GrGLCreateNullInterface.cpp | 2 | ||||
-rw-r--r-- | src/gpu/gl/GrGLDefines.h | 4 | ||||
-rw-r--r-- | src/gpu/gl/GrGLExtensions.cpp | 50 | ||||
-rw-r--r-- | src/gpu/gl/GrGLInterface.cpp | 7 | ||||
-rw-r--r-- | src/gpu/gl/SkNullGLContext.cpp | 2 | ||||
-rw-r--r-- | src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp | 4 | ||||
-rw-r--r-- | src/gpu/gl/debug/GrGLCreateDebugInterface.cpp | 2 |
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; } |