| Index: src/gpu/gl/GrGLCaps.cpp
|
| diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp
|
| index 890b816752a1be093570d28169e10428778f11c9..f577e9d740398dc5ca53fec9379b2e7266f544db 100644
|
| --- a/src/gpu/gl/GrGLCaps.cpp
|
| +++ b/src/gpu/gl/GrGLCaps.cpp
|
| @@ -24,6 +24,7 @@ void GrGLCaps::reset() {
|
| fMSFBOType = kNone_MSFBOType;
|
| fFBFetchType = kNone_FBFetchType;
|
| fInvalidateFBType = kNone_InvalidateFBType;
|
| + fMapBufferType = kNone_MapBufferType;
|
| fMaxFragmentUniformVectors = 0;
|
| fMaxVertexAttributes = 0;
|
| fMaxFragmentTextureUnits = 0;
|
| @@ -47,7 +48,6 @@ void GrGLCaps::reset() {
|
| fIsCoreProfile = false;
|
| fFullClearIsFree = false;
|
| fDropsTileOnZeroDivide = false;
|
| - fMapSubSupport = false;
|
| }
|
|
|
| GrGLCaps::GrGLCaps(const GrGLCaps& caps) : GrDrawTargetCaps() {
|
| @@ -66,6 +66,7 @@ GrGLCaps& GrGLCaps::operator= (const GrGLCaps& caps) {
|
| fMSFBOType = caps.fMSFBOType;
|
| fFBFetchType = caps.fFBFetchType;
|
| fInvalidateFBType = caps.fInvalidateFBType;
|
| + fMapBufferType = caps.fMapBufferType;
|
| fRGBA8RenderbufferSupport = caps.fRGBA8RenderbufferSupport;
|
| fBGRAFormatSupport = caps.fBGRAFormatSupport;
|
| fBGRAIsInternalFormat = caps.fBGRAIsInternalFormat;
|
| @@ -85,7 +86,6 @@ GrGLCaps& GrGLCaps::operator= (const GrGLCaps& caps) {
|
| fIsCoreProfile = caps.fIsCoreProfile;
|
| fFullClearIsFree = caps.fFullClearIsFree;
|
| fDropsTileOnZeroDivide = caps.fDropsTileOnZeroDivide;
|
| - fMapSubSupport = caps.fMapSubSupport;
|
|
|
| return *this;
|
| }
|
| @@ -290,12 +290,27 @@ bool GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) {
|
| }
|
|
|
| if (kGL_GrGLStandard == standard) {
|
| - fBufferLockSupport = true; // we require VBO support and the desktop VBO extension includes
|
| - // glMapBuffer.
|
| - fMapSubSupport = false;
|
| + fMapBufferFlags = kCanMap_MapFlag; // we require VBO support and the desktop VBO
|
| + // extension includes glMapBuffer.
|
| + if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_ARB_map_buffer_range")) {
|
| + fMapBufferFlags |= kSubset_MapFlag;
|
| + fMapBufferType = kMapBufferRange_MapBufferType;
|
| + } else {
|
| + fMapBufferType = kMapBuffer_MapBufferType;
|
| + }
|
| } else {
|
| - fBufferLockSupport = ctxInfo.hasExtension("GL_OES_mapbuffer");
|
| - fMapSubSupport = ctxInfo.hasExtension("GL_CHROMIUM_map_sub");
|
| + // Unextended GLES2 doesn't have any buffer mapping.
|
| + fMapBufferFlags = kNone_MapBufferType;
|
| + if (ctxInfo.hasExtension("GL_CHROMIUM_map_sub")) {
|
| + fMapBufferFlags = kCanMap_MapFlag | kSubset_MapFlag;
|
| + fMapBufferType = kChromium_MapBufferType;
|
| + } else if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_EXT_map_buffer_range")) {
|
| + fMapBufferFlags = kCanMap_MapFlag | kSubset_MapFlag;
|
| + fMapBufferType = kMapBufferRange_MapBufferType;
|
| + } else if (ctxInfo.hasExtension("GL_OES_mapbuffer")) {
|
| + fMapBufferFlags = kCanMap_MapFlag;
|
| + fMapBufferType = kMapBuffer_MapBufferType;
|
| + }
|
| }
|
|
|
| if (kGL_GrGLStandard == standard) {
|
| @@ -655,10 +670,23 @@ SkString GrGLCaps::dump() const {
|
| GR_STATIC_ASSERT(2 == kInvalidate_InvalidateFBType);
|
| GR_STATIC_ASSERT(SK_ARRAY_COUNT(kInvalidateFBTypeStr) == kLast_InvalidateFBType + 1);
|
|
|
| + static const char* kMapBufferTypeStr[] = {
|
| + "None",
|
| + "MapBuffer",
|
| + "MapBufferRange",
|
| + "Chromium",
|
| + };
|
| + GR_STATIC_ASSERT(0 == kNone_MapBufferType);
|
| + GR_STATIC_ASSERT(1 == kMapBuffer_MapBufferType);
|
| + GR_STATIC_ASSERT(2 == kMapBufferRange_MapBufferType);
|
| + GR_STATIC_ASSERT(3 == kChromium_MapBufferType);
|
| + GR_STATIC_ASSERT(SK_ARRAY_COUNT(kMapBufferTypeStr) == kLast_MapBufferType + 1);
|
| +
|
| r.appendf("Core Profile: %s\n", (fIsCoreProfile ? "YES" : "NO"));
|
| r.appendf("MSAA Type: %s\n", kMSFBOExtStr[fMSFBOType]);
|
| r.appendf("FB Fetch Type: %s\n", kFBFetchTypeStr[fFBFetchType]);
|
| r.appendf("Invalidate FB Type: %s\n", kInvalidateFBTypeStr[fInvalidateFBType]);
|
| + r.appendf("Map Buffer Type: %s\n", kMapBufferTypeStr[fMapBufferType]);
|
| r.appendf("Max FS Uniform Vectors: %d\n", fMaxFragmentUniformVectors);
|
| r.appendf("Max FS Texture Units: %d\n", fMaxFragmentTextureUnits);
|
| if (!fIsCoreProfile) {
|
|
|