From dc84c31d748e39387774a0719bf9a51b24acfbd7 Mon Sep 17 00:00:00 2001 From: Jeff Gilbert Date: Tue, 5 Sep 2017 17:34:22 -0700 Subject: [PATCH] Bug 1396704 - Support GLBlitHelper without VAOs. - r=daoshengmu MozReview-Commit-ID: HB5p6Kt0zTb --- gfx/gl/GLBlitHelper.cpp | 85 ++++++++++++++++++++++++++--------------- gfx/gl/GLBlitHelper.h | 1 + 2 files changed, 55 insertions(+), 31 deletions(-) diff --git a/gfx/gl/GLBlitHelper.cpp b/gfx/gl/GLBlitHelper.cpp index 07711eef2a8a..21b9f7419687 100644 --- a/gfx/gl/GLBlitHelper.cpp +++ b/gfx/gl/GLBlitHelper.cpp @@ -185,27 +185,6 @@ public: // -- -class ScopedBindVAO final -{ - GLContext& mGL; - const GLuint mOldVAO; - -public: - ScopedBindVAO(GLContext* const gl, const GLuint vao) - : mGL(*gl) - , mOldVAO(mGL.GetIntAs(LOCAL_GL_VERTEX_ARRAY_BINDING)) - { - mGL.fBindVertexArray(vao); - } - - ~ScopedBindVAO() - { - mGL.fBindVertexArray(mOldVAO); - } -}; - -// -- - class ScopedShader final { GLContext& mGL; @@ -367,8 +346,43 @@ DrawBlitProg::Draw(const BaseArgs& args, const YUVArgs* const argsYUV) const // -- const ScopedDrawBlitState drawState(gl, args.destSize); - const ScopedBindVAO bindVAO(gl, mParent.mQuadVAO); + + GLuint oldVAO; + GLint vaa0Enabled; + GLint vaa0Size; + GLenum vaa0Type; + GLint vaa0Normalized; + GLsizei vaa0Stride; + GLvoid* vaa0Pointer; + if (mParent.mQuadVAO) { + oldVAO = gl->GetIntAs(LOCAL_GL_VERTEX_ARRAY_BINDING); + gl->fBindVertexArray(mParent.mQuadVAO); + } else { + gl->fGetVertexAttribiv(0, LOCAL_GL_VERTEX_ATTRIB_ARRAY_ENABLED, &vaa0Enabled); + gl->fGetVertexAttribiv(0, LOCAL_GL_VERTEX_ATTRIB_ARRAY_SIZE, &vaa0Size); + gl->fGetVertexAttribiv(0, LOCAL_GL_VERTEX_ATTRIB_ARRAY_TYPE, (GLint*)&vaa0Type); + gl->fGetVertexAttribiv(0, LOCAL_GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &vaa0Normalized); + gl->fGetVertexAttribiv(0, LOCAL_GL_VERTEX_ATTRIB_ARRAY_STRIDE, (GLint*)&vaa0Stride); + gl->fGetVertexAttribPointerv(0, LOCAL_GL_VERTEX_ATTRIB_ARRAY_POINTER, &vaa0Pointer); + + gl->fEnableVertexAttribArray(0); + const ScopedBindArrayBuffer bindVBO(gl, mParent.mQuadVBO); + gl->fVertexAttribPointer(0, 2, LOCAL_GL_FLOAT, false, 0, 0); + } + gl->fDrawArrays(LOCAL_GL_TRIANGLE_STRIP, 0, 4); + + if (mParent.mQuadVAO) { + gl->fBindVertexArray(oldVAO); + } else { + if (vaa0Enabled) { + gl->fEnableVertexAttribArray(0); + } else { + gl->fDisableVertexAttribArray(0); + } + gl->fVertexAttribPointer(0, vaa0Size, vaa0Type, bool(vaa0Normalized), vaa0Stride, + vaa0Pointer); + } } // -- @@ -376,6 +390,7 @@ DrawBlitProg::Draw(const BaseArgs& args, const YUVArgs* const argsYUV) const GLBlitHelper::GLBlitHelper(GLContext* const gl) : mGL(gl) , mQuadVAO(0) + , mQuadVBO(0) , mDrawBlitProg_VertShader(mGL->fCreateShader(LOCAL_GL_VERTEX_SHADER)) , mYuvUploads{0} , mYuvUploads_YSize(0, 0) @@ -386,10 +401,9 @@ GLBlitHelper::GLBlitHelper(GLContext* const gl) return; } - GLuint vbo = 0; - mGL->fGenBuffers(1, &vbo); + mGL->fGenBuffers(1, &mQuadVBO); { - const ScopedBindArrayBuffer bindVBO(mGL, vbo); + const ScopedBindArrayBuffer bindVBO(mGL, mQuadVBO); const float quadData[] = { 0, 0, @@ -401,12 +415,17 @@ GLBlitHelper::GLBlitHelper(GLContext* const gl) mGL->fBufferData(LOCAL_GL_ARRAY_BUFFER, heapQuadData.ByteLength(), heapQuadData.Data(), LOCAL_GL_STATIC_DRAW); - mGL->fGenVertexArrays(1, &mQuadVAO); - const ScopedBindVAO bindVAO(mGL, mQuadVAO); - mGL->fEnableVertexAttribArray(0); - mGL->fVertexAttribPointer(0, 2, LOCAL_GL_FLOAT, false, 0, 0); + if (mGL->IsSupported(GLFeature::vertex_array_object)) { + const auto prev = mGL->GetIntAs(LOCAL_GL_VERTEX_ARRAY_BINDING); + + mGL->fGenVertexArrays(1, &mQuadVAO); + mGL->fBindVertexArray(mQuadVAO); + mGL->fEnableVertexAttribArray(0); + mGL->fVertexAttribPointer(0, 2, LOCAL_GL_FLOAT, false, 0, 0); + + mGL->fBindVertexArray(prev); + } } - mGL->fDeleteBuffers(1, &vbo); // -- @@ -471,7 +490,11 @@ GLBlitHelper::~GLBlitHelper() return; mGL->fDeleteShader(mDrawBlitProg_VertShader); - mGL->fDeleteVertexArrays(1, &mQuadVAO); + mGL->fDeleteBuffers(1, &mQuadVBO); + + if (mQuadVAO) { + mGL->fDeleteVertexArrays(1, &mQuadVAO); + } } // -- diff --git a/gfx/gl/GLBlitHelper.h b/gfx/gl/GLBlitHelper.h index 81a1a0462f17..b08ae31cd19f 100644 --- a/gfx/gl/GLBlitHelper.h +++ b/gfx/gl/GLBlitHelper.h @@ -108,6 +108,7 @@ class GLBlitHelper final mutable std::map mDrawBlitProgs; GLuint mQuadVAO; + GLuint mQuadVBO; nsCString mDrawBlitProg_VersionLine; const GLuint mDrawBlitProg_VertShader;