diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-09-05 23:44:09 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-09-05 23:44:09 +0000 |
commit | a8e5a06f69b7e0cb17a4b3203f0a7a1d52aa73ec (patch) | |
tree | 9832f6de86123cf15d0033f23be25ef89b3c0cf0 /src/gpu | |
parent | 67db510c9c7f006fb4ec5027e5c859cfd71f42c0 (diff) |
Add support for ES3 MSAA.
R=robertphillips@google.com, jvanverth@google.com
Author: bsalomon@google.com
Review URL: https://chromiumcodereview.appspot.com/23404002
git-svn-id: http://skia.googlecode.com/svn/trunk@11124 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/gpu')
-rw-r--r-- | src/gpu/gl/GrGLCaps.cpp | 34 | ||||
-rw-r--r-- | src/gpu/gl/GrGLCaps.h | 6 | ||||
-rw-r--r-- | src/gpu/gl/GrGLInterface.cpp | 24 | ||||
-rw-r--r-- | src/gpu/gl/GrGpuGL.cpp | 38 | ||||
-rw-r--r-- | src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp | 33 |
5 files changed, 118 insertions, 17 deletions
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp index 382bfba68d..1488e75c29 100644 --- a/src/gpu/gl/GrGLCaps.cpp +++ b/src/gpu/gl/GrGLCaps.cpp @@ -386,17 +386,21 @@ void GrGLCaps::initFSAASupport(const GrGLContextInfo& ctxInfo, const GrGLInterfa fMSFBOType = kNone_MSFBOType; if (kDesktop_GrGLBinding != ctxInfo.binding()) { - if (ctxInfo.hasExtension("GL_CHROMIUM_framebuffer_multisample")) { - // chrome's extension is equivalent to the EXT msaa - // and fbo_blit extensions. - fMSFBOType = kDesktop_EXT_MSFBOType; - } else if (ctxInfo.hasExtension("GL_APPLE_framebuffer_multisample")) { - fMSFBOType = kES_Apple_MSFBOType; - } else if (ctxInfo.hasExtension("GL_EXT_multisampled_render_to_texture")) { - fMSFBOType = kES_EXT_MsToTexture_MSFBOType; - } else if (ctxInfo.hasExtension("GL_IMG_multisampled_render_to_texture")) { - fMSFBOType = kES_IMG_MsToTexture_MSFBOType; - } + // We prefer the EXT/IMG extension over ES3 MSAA because we've observed + // ES3 driver bugs on at least one device with a tiled GPU (N10). + if (ctxInfo.hasExtension("GL_EXT_multisampled_render_to_texture")) { + fMSFBOType = kES_EXT_MsToTexture_MSFBOType; + } else if (ctxInfo.hasExtension("GL_IMG_multisampled_render_to_texture")) { + fMSFBOType = kES_IMG_MsToTexture_MSFBOType; + } else if (!GR_GL_IGNORE_ES3_MSAA && ctxInfo.version() >= GR_GL_VER(3,0)) { + fMSFBOType = GrGLCaps::kES_3_0_MSFBOType; + } else if (ctxInfo.hasExtension("GL_CHROMIUM_framebuffer_multisample")) { + // chrome's extension is equivalent to the EXT msaa + // and fbo_blit extensions. + fMSFBOType = kDesktop_EXT_MSFBOType; + } else if (ctxInfo.hasExtension("GL_APPLE_framebuffer_multisample")) { + fMSFBOType = kES_Apple_MSFBOType; + } } else { if ((ctxInfo.version() >= GR_GL_VER(3,0)) || ctxInfo.hasExtension("GL_ARB_framebuffer_object")) { @@ -569,6 +573,7 @@ void GrGLCaps::print() const { "None", "ARB", "EXT", + "ES 3.0", "Apple", "IMG MS To Texture", "EXT MS To Texture", @@ -576,9 +581,10 @@ void GrGLCaps::print() const { GR_STATIC_ASSERT(0 == kNone_MSFBOType); GR_STATIC_ASSERT(1 == kDesktop_ARB_MSFBOType); GR_STATIC_ASSERT(2 == kDesktop_EXT_MSFBOType); - GR_STATIC_ASSERT(3 == kES_Apple_MSFBOType); - GR_STATIC_ASSERT(4 == kES_IMG_MsToTexture_MSFBOType); - GR_STATIC_ASSERT(5 == kES_EXT_MsToTexture_MSFBOType); + GR_STATIC_ASSERT(3 == kES_3_0_MSFBOType); + GR_STATIC_ASSERT(4 == kES_Apple_MSFBOType); + GR_STATIC_ASSERT(5 == kES_IMG_MsToTexture_MSFBOType); + GR_STATIC_ASSERT(6 == kES_EXT_MsToTexture_MSFBOType); GR_STATIC_ASSERT(GR_ARRAY_COUNT(kMSFBOExtStr) == kLast_MSFBOType + 1); static const char* kFBFetchTypeStr[] = { diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h index a4d567351e..a05d2b6faa 100644 --- a/src/gpu/gl/GrGLCaps.h +++ b/src/gpu/gl/GrGLCaps.h @@ -54,7 +54,7 @@ public: */ kNone_MSFBOType = 0, /** - * GL3.0-style MSAA FBO (GL_ARB_framebuffer_object) + * GL3.0-style MSAA FBO (GL_ARB_framebuffer_object). */ kDesktop_ARB_MSFBOType, /** @@ -62,6 +62,10 @@ public: */ kDesktop_EXT_MSFBOType, /** + * Similar to kDesktop_ARB but with additional restrictions on glBlitFramebuffer. + */ + kES_3_0_MSFBOType, + /** * GL_APPLE_framebuffer_multisample ES extension */ kES_Apple_MSFBOType, diff --git a/src/gpu/gl/GrGLInterface.cpp b/src/gpu/gl/GrGLInterface.cpp index d15b4cc48b..7e557da4f5 100644 --- a/src/gpu/gl/GrGLInterface.cpp +++ b/src/gpu/gl/GrGLInterface.cpp @@ -336,25 +336,45 @@ bool GrGLInterface::validate(GrGLBinding binding) const { } } } else { +#if GR_GL_IGNORE_ES3_MSAA if (extensions.has("GL_CHROMIUM_framebuffer_multisample")) { if (NULL == fRenderbufferStorageMultisample || NULL == fBlitFramebuffer) { return false; } + } else if (extensions.has("GL_APPLE_framebuffer_multisample")) { + if (NULL == fRenderbufferStorageMultisample || + NULL == fResolveMultisampleFramebuffer) { + return false; + } + } else if (extensions.has("GL_IMG_multisampled_render_to_texture") || + extensions.has("GL_EXT_multisampled_render_to_texture")) { + if (NULL == fRenderbufferStorageMultisample || + NULL == fFramebufferTexture2DMultisample) { + return false; + } } - if (extensions.has("GL_APPLE_framebuffer_multisample")) { +#else + if (glVer >= GR_GL_VER(3,0) || extensions.has("GL_CHROMIUM_framebuffer_multisample")) { if (NULL == fRenderbufferStorageMultisample || + NULL == fBlitFramebuffer) { + return false; + } + } + if (extensions.has("GL_APPLE_framebuffer_multisample")) { + if (NULL == fRenderbufferStorageMultisampleES2APPLE || NULL == fResolveMultisampleFramebuffer) { return false; } } if (extensions.has("GL_IMG_multisampled_render_to_texture") || extensions.has("GL_EXT_multisampled_render_to_texture")) { - if (NULL == fRenderbufferStorageMultisample || + if (NULL == fRenderbufferStorageMultisampleES2EXT || NULL == fFramebufferTexture2DMultisample) { return false; } } +#endif } // On ES buffer mapping is an extension. On Desktop diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp index a9fd41ed5a..75b4191366 100644 --- a/src/gpu/gl/GrGpuGL.cpp +++ b/src/gpu/gl/GrGpuGL.cpp @@ -789,11 +789,43 @@ bool renderbuffer_storage_msaa(GrGLContext& ctx, created = (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(ctx.interface())); } if (!created) { +#if GR_GL_IGNORE_ES3_MSAA GL_ALLOC_CALL(ctx.interface(), RenderbufferStorageMultisample(GR_GL_RENDERBUFFER, sampleCount, format, width, height)); +#else + switch (ctx.info().caps()->msFBOType()) { + case GrGLCaps::kDesktop_ARB_MSFBOType: + case GrGLCaps::kDesktop_EXT_MSFBOType: + case GrGLCaps::kES_3_0_MSFBOType: + GL_ALLOC_CALL(ctx.interface(), + RenderbufferStorageMultisample(GR_GL_RENDERBUFFER, + sampleCount, + format, + width, height)); + break; + case GrGLCaps::kES_Apple_MSFBOType: + GL_ALLOC_CALL(ctx.interface(), + RenderbufferStorageMultisampleES2APPLE(GR_GL_RENDERBUFFER, + sampleCount, + format, + width, height)); + break; + case GrGLCaps::kES_EXT_MsToTexture_MSFBOType: + case GrGLCaps::kES_IMG_MsToTexture_MSFBOType: + GL_ALLOC_CALL(ctx.interface(), + RenderbufferStorageMultisampleES2EXT(GR_GL_RENDERBUFFER, + sampleCount, + format, + width, height)); + break; + case GrGLCaps::kNone_MSFBOType: + GrCrash("Shouldn't be here if we don't support multisampled renderbuffers."); + break; + } +#endif created = (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(ctx.interface())); } return created; @@ -2313,6 +2345,12 @@ inline bool can_blit_framebuffer(const GrSurface* dst, if (gpu->isConfigRenderable(dst->config()) && gpu->isConfigRenderable(src->config()) && gpu->glCaps().usesMSAARenderBuffers()) { + // ES3 doesn't allow framebuffer blits when the src has MSAA and the configs don't match + // or the rects are not the same (not just the same size but have the same edges). + if (GrGLCaps::kES_3_0_MSFBOType == gpu->glCaps().msFBOType() && + (src->desc().fSampleCnt > 0 || src->config() != dst->config())) { + return false; + } if (NULL != wouldNeedTempFBO) { *wouldNeedTempFBO = NULL == dst->asRenderTarget() || NULL == src->asRenderTarget(); } diff --git a/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp b/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp index 881a46b476..5e5411e54e 100644 --- a/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp +++ b/src/gpu/gl/android/GrGLCreateNativeInterface_android.cpp @@ -147,6 +147,8 @@ static const GrGLInterface* create_es_interface(GrGLVersion version, interface->fDeleteRenderbuffers = glDeleteRenderbuffers; interface->fFramebufferRenderbuffer = glFramebufferRenderbuffer; interface->fFramebufferTexture2D = glFramebufferTexture2D; +#if GR_GL_IGNORE_ES3_MSAA + if (extensions.has("GL_EXT_multisampled_render_to_texture")) { #if GL_EXT_multisampled_render_to_texture interface->fFramebufferTexture2DMultisample = glFramebufferTexture2DMultisampleEXT; @@ -164,6 +166,37 @@ static const GrGLInterface* create_es_interface(GrGLVersion version, interface->fRenderbufferStorageMultisample = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisampleIMG"); #endif } + +#else // GR_GL_IGNORE_ES3_MSAA + + if (version >= GR_GL_VER(3,0)) { +#if GL_ES_VERSION_3_0 + interface->fRenderbufferStorageMultisample = glRenderbufferStorageMultisample; + interface->fBlitFramebuffer = glBlitFramebuffer; +#else + interface->fRenderbufferStorageMultisample = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisample"); + interface->fBlitFramebuffer = (GrGLBlitFramebufferProc) eglGetProcAddress("glBlitFramebuffer"); +#endif + } + if (extensions.has("GL_EXT_multisampled_render_to_texture")) { +#if GL_EXT_multisampled_render_to_texture + interface->fFramebufferTexture2DMultisample = glFramebufferTexture2DMultisampleEXT; + interface->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleEXT; +#else + interface->fFramebufferTexture2DMultisample = (GrGLFramebufferTexture2DMultisampleProc) eglGetProcAddress("glFramebufferTexture2DMultisampleEXT"); + interface->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisampleEXT"); +#endif + } else if (extensions.has("GL_IMG_multisampled_render_to_texture")) { +#if GL_IMG_multisampled_render_to_texture + interface->fFramebufferTexture2DMultisample = glFramebufferTexture2DMultisampleIMG; + interface->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleIMG; +#else + interface->fFramebufferTexture2DMultisample = (GrGLFramebufferTexture2DMultisampleProc) eglGetProcAddress("glFramebufferTexture2DMultisampleIMG"); + interface->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) eglGetProcAddress("glRenderbufferStorageMultisampleIMG"); +#endif + } + +#endif // GR_GL_IGNORE_ES3_MSAA interface->fGenFramebuffers = glGenFramebuffers; interface->fGenRenderbuffers = glGenRenderbuffers; interface->fGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv; |