Bug 1097877. Move GLBlitTextureImageHelper from gfx/gl to gfx/layers/opengl. r=nical

The only user is in layers/opengl. This is needed to do better state tracking
in the compositor.

--HG--
rename : gfx/gl/GLBlitTextureImageHelper.cpp => gfx/layers/opengl/GLBlitTextureImageHelper.cpp
rename : gfx/gl/GLBlitTextureImageHelper.h => gfx/layers/opengl/GLBlitTextureImageHelper.h
extra : rebase_source : bba00cbfac9253ca933721659dadbda2bfbe65c5
This commit is contained in:
Jeff Muizelaar 2014-11-10 14:49:05 -05:00
parent 1a4b6b3cf2
commit f2786d3f9f
10 changed files with 93 additions and 76 deletions

View File

@ -11,7 +11,6 @@
#include "GLContext.h"
#include "GLBlitHelper.h"
#include "GLBlitTextureImageHelper.h"
#include "GLReadTexImageHelper.h"
#include "gfxCrashReporterUtils.h"
@ -2090,7 +2089,6 @@ GLContext::MarkDestroyed()
DestroyScreenBuffer();
mBlitHelper = nullptr;
mBlitTextureImageHelper = nullptr;
mReadTexImageHelper = nullptr;
mTexGarbageBin->GLContextTeardown();
@ -2413,16 +2411,6 @@ GLContext::BlitHelper()
return mBlitHelper.get();
}
GLBlitTextureImageHelper*
GLContext::BlitTextureImageHelper()
{
if (!mBlitTextureImageHelper) {
mBlitTextureImageHelper = MakeUnique<GLBlitTextureImageHelper>(this);
}
return mBlitTextureImageHelper.get();
}
GLReadTexImageHelper*
GLContext::ReadTexImageHelper()
{

View File

@ -3418,7 +3418,6 @@ protected:
#endif
UniquePtr<GLBlitHelper> mBlitHelper;
UniquePtr<GLBlitTextureImageHelper> mBlitTextureImageHelper;
UniquePtr<GLReadTexImageHelper> mReadTexImageHelper;
public:

View File

@ -33,7 +33,6 @@ EXPORTS += [
'ForceDiscreteGPUHelperCGL.h',
'GfxTexturesReporter.h',
'GLBlitHelper.h',
'GLBlitTextureImageHelper.h',
'GLConsts.h',
'GLContext.h',
'GLContextEGL.h',
@ -122,7 +121,6 @@ UNIFIED_SOURCES += [
'EGLUtils.cpp',
'GfxTexturesReporter.cpp',
'GLBlitHelper.cpp',
'GLBlitTextureImageHelper.cpp',
'GLContext.cpp',
'GLContextFeatures.cpp',
'GLContextTypes.cpp',

View File

@ -313,6 +313,7 @@ UNIFIED_SOURCES += [
'LayerSorter.cpp',
'opengl/CompositingRenderTargetOGL.cpp',
'opengl/CompositorOGL.cpp',
'opengl/GLBlitTextureImageHelper.cpp',
'opengl/OGLShaderProgram.cpp',
'opengl/TextureClientOGL.cpp',
'opengl/TextureHostOGL.cpp',

View File

@ -39,6 +39,7 @@
#include "nsString.h" // for nsString, nsAutoCString, etc
#include "ScopedGLHelpers.h"
#include "GLReadTexImageHelper.h"
#include "GLBlitTextureImageHelper.h"
#include "TiledLayerBuffer.h" // for TiledLayerComposer
#include "HeapCopyOfStackArray.h"
@ -174,6 +175,9 @@ CompositorOGL::CleanupResources()
}
mGLContext->MakeCurrent();
mBlitTextureImageHelper = nullptr;
mContextStateTracker.DestroyOGL(mGLContext);
// On the main thread the Widget will be destroyed soon and calling MakeCurrent
@ -1383,7 +1387,7 @@ TemporaryRef<DataTextureSource>
CompositorOGL::CreateDataTextureSource(TextureFlags aFlags)
{
RefPtr<DataTextureSource> result =
new TextureImageTextureSourceOGL(mGLContext, aFlags);
new TextureImageTextureSourceOGL(this, aFlags);
return result;
}
@ -1439,6 +1443,18 @@ CompositorOGL::BindAndDrawQuads(ShaderProgramOGL *aProg,
mGLContext->fDrawArrays(LOCAL_GL_TRIANGLES, 0, 6 * aQuads);
}
GLBlitTextureImageHelper*
CompositorOGL::BlitTextureImageHelper()
{
if (!mBlitTextureImageHelper) {
mBlitTextureImageHelper = MakeUnique<GLBlitTextureImageHelper>(this);
}
return mBlitTextureImageHelper.get();
}
GLuint
CompositorOGL::GetTemporaryTexture(GLenum aTarget, GLenum aUnit)
{

View File

@ -54,7 +54,7 @@ class GLManagerCompositor;
class TextureSource;
struct Effect;
struct EffectChain;
class GLBlitTextureImageHelper;
/**
* Interface for pools of temporary gl textures for the compositor.
* The textures are fully owned by the pool, so the latter is responsible
@ -259,6 +259,8 @@ public:
return gfx::SurfaceFormat::R8G8B8A8;
}
GLBlitTextureImageHelper* BlitTextureImageHelper();
/**
* The compositor provides with temporary textures for use with direct
* textruing like gralloc texture.
@ -280,6 +282,7 @@ private:
nsIWidget *mWidget;
nsIntSize mWidgetSize;
nsRefPtr<GLContext> mGLContext;
UniquePtr<GLBlitTextureImageHelper> mBlitTextureImageHelper;
gfx::Matrix4x4 mProjMatrix;
/** The size of the surface we are rendering to */

View File

@ -8,16 +8,20 @@
#include "GLUploadHelpers.h"
#include "DecomposeIntoNoRepeatTriangles.h"
#include "GLContext.h"
#include "GLTextureImage.h"
#include "ScopedGLHelpers.h"
#include "nsRect.h"
#include "gfx2DGlue.h"
#include "gfxUtils.h"
#include "CompositorOGL.h"
using namespace mozilla::gl;
namespace mozilla {
namespace gl {
namespace layers {
GLBlitTextureImageHelper::GLBlitTextureImageHelper(GLContext* gl)
: mGL(gl)
GLBlitTextureImageHelper::GLBlitTextureImageHelper(CompositorOGL* aCompositor)
: mCompositor(aCompositor)
, mBlitProgram(0)
, mBlitFramebuffer(0)
@ -26,15 +30,17 @@ GLBlitTextureImageHelper::GLBlitTextureImageHelper(GLContext* gl)
GLBlitTextureImageHelper::~GLBlitTextureImageHelper()
{
GLContext *gl = mCompositor->gl();
// Likely used by OGL Layers.
mGL->fDeleteProgram(mBlitProgram);
mGL->fDeleteFramebuffers(1, &mBlitFramebuffer);
gl->fDeleteProgram(mBlitProgram);
gl->fDeleteFramebuffers(1, &mBlitFramebuffer);
}
void
GLBlitTextureImageHelper::BlitTextureImage(TextureImage *aSrc, const nsIntRect& aSrcRect,
TextureImage *aDst, const nsIntRect& aDstRect)
{
GLContext *gl = mCompositor->gl();
NS_ASSERTION(!aSrc->InUpdate(), "Source texture is in update!");
NS_ASSERTION(!aDst->InUpdate(), "Destination texture is in update!");
@ -42,10 +48,10 @@ GLBlitTextureImageHelper::BlitTextureImage(TextureImage *aSrc, const nsIntRect&
return;
int savedFb = 0;
mGL->fGetIntegerv(LOCAL_GL_FRAMEBUFFER_BINDING, &savedFb);
gl->fGetIntegerv(LOCAL_GL_FRAMEBUFFER_BINDING, &savedFb);
ScopedGLState scopedScissorTestState(mGL, LOCAL_GL_SCISSOR_TEST, false);
ScopedGLState scopedBlendState(mGL, LOCAL_GL_BLEND, false);
ScopedGLState scopedScissorTestState(gl, LOCAL_GL_SCISSOR_TEST, false);
ScopedGLState scopedBlendState(gl, LOCAL_GL_BLEND, false);
// 2.0 means scale up by two
float blitScaleX = float(aDstRect.width) / float(aSrcRect.width);
@ -113,12 +119,12 @@ GLBlitTextureImageHelper::BlitTextureImage(TextureImage *aSrc, const nsIntRect&
float dy0 = 2.0f * float(srcSubInDstRect.y) / float(dstSize.height) - 1.0f;
float dx1 = 2.0f * float(srcSubInDstRect.x + srcSubInDstRect.width) / float(dstSize.width) - 1.0f;
float dy1 = 2.0f * float(srcSubInDstRect.y + srcSubInDstRect.height) / float(dstSize.height) - 1.0f;
ScopedViewportRect autoViewportRect(mGL, 0, 0, dstSize.width, dstSize.height);
ScopedViewportRect autoViewportRect(gl, 0, 0, dstSize.width, dstSize.height);
RectTriangles rects;
nsIntSize realTexSize = srcSize;
if (!CanUploadNonPowerOfTwo(mGL)) {
if (!CanUploadNonPowerOfTwo(gl)) {
realTexSize = nsIntSize(gfx::NextPowerOfTwo(srcSize.width),
gfx::NextPowerOfTwo(srcSize.height));
}
@ -144,12 +150,12 @@ GLBlitTextureImageHelper::BlitTextureImage(TextureImage *aSrc, const nsIntRect&
}
}
ScopedBindTextureUnit autoTexUnit(mGL, LOCAL_GL_TEXTURE0);
ScopedBindTexture autoTex(mGL, aSrc->GetTextureID());
ScopedVertexAttribPointer autoAttrib0(mGL, 0, 2, LOCAL_GL_FLOAT, LOCAL_GL_FALSE, 0, 0, rects.vertCoords().Elements());
ScopedVertexAttribPointer autoAttrib1(mGL, 1, 2, LOCAL_GL_FLOAT, LOCAL_GL_FALSE, 0, 0, rects.texCoords().Elements());
ScopedBindTextureUnit autoTexUnit(gl, LOCAL_GL_TEXTURE0);
ScopedBindTexture autoTex(gl, aSrc->GetTextureID());
ScopedVertexAttribPointer autoAttrib0(gl, 0, 2, LOCAL_GL_FLOAT, LOCAL_GL_FALSE, 0, 0, rects.vertCoords().Elements());
ScopedVertexAttribPointer autoAttrib1(gl, 1, 2, LOCAL_GL_FLOAT, LOCAL_GL_FALSE, 0, 0, rects.texCoords().Elements());
mGL->fDrawArrays(LOCAL_GL_TRIANGLES, 0, rects.elements());
gl->fDrawArrays(LOCAL_GL_TRIANGLES, 0, rects.elements());
} while (aSrc->NextTile());
} while (aDst->NextTile());
@ -157,24 +163,25 @@ GLBlitTextureImageHelper::BlitTextureImage(TextureImage *aSrc, const nsIntRect&
// unbind the previous texture from the framebuffer
SetBlitFramebufferForDestTexture(0);
mGL->fBindFramebuffer(LOCAL_GL_FRAMEBUFFER, savedFb);
gl->fBindFramebuffer(LOCAL_GL_FRAMEBUFFER, savedFb);
}
void
GLBlitTextureImageHelper::SetBlitFramebufferForDestTexture(GLuint aTexture)
{
GLContext *gl = mCompositor->gl();
if (!mBlitFramebuffer) {
mGL->fGenFramebuffers(1, &mBlitFramebuffer);
gl->fGenFramebuffers(1, &mBlitFramebuffer);
}
mGL->fBindFramebuffer(LOCAL_GL_FRAMEBUFFER, mBlitFramebuffer);
mGL->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER,
gl->fBindFramebuffer(LOCAL_GL_FRAMEBUFFER, mBlitFramebuffer);
gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER,
LOCAL_GL_COLOR_ATTACHMENT0,
LOCAL_GL_TEXTURE_2D,
aTexture,
0);
GLenum result = mGL->fCheckFramebufferStatus(LOCAL_GL_FRAMEBUFFER);
GLenum result = gl->fCheckFramebufferStatus(LOCAL_GL_FRAMEBUFFER);
if (aTexture && (result != LOCAL_GL_FRAMEBUFFER_COMPLETE)) {
nsAutoCString msg;
msg.AppendLiteral("Framebuffer not complete -- error 0x");
@ -190,16 +197,17 @@ GLBlitTextureImageHelper::SetBlitFramebufferForDestTexture(GLuint aTexture)
void
GLBlitTextureImageHelper::UseBlitProgram()
{
GLContext *gl = mCompositor->gl();
if (mBlitProgram) {
mGL->fUseProgram(mBlitProgram);
gl->fUseProgram(mBlitProgram);
return;
}
mBlitProgram = mGL->fCreateProgram();
mBlitProgram = gl->fCreateProgram();
GLuint shaders[2];
shaders[0] = mGL->fCreateShader(LOCAL_GL_VERTEX_SHADER);
shaders[1] = mGL->fCreateShader(LOCAL_GL_FRAGMENT_SHADER);
shaders[0] = gl->fCreateShader(LOCAL_GL_VERTEX_SHADER);
shaders[1] = gl->fCreateShader(LOCAL_GL_FRAGMENT_SHADER);
const char *blitVSSrc =
"attribute vec2 aVertex;"
@ -216,53 +224,53 @@ GLBlitTextureImageHelper::UseBlitProgram()
" gl_FragColor = texture2D(uSrcTexture, vTexCoord);"
"}";
mGL->fShaderSource(shaders[0], 1, (const GLchar**) &blitVSSrc, nullptr);
mGL->fShaderSource(shaders[1], 1, (const GLchar**) &blitFSSrc, nullptr);
gl->fShaderSource(shaders[0], 1, (const GLchar**) &blitVSSrc, nullptr);
gl->fShaderSource(shaders[1], 1, (const GLchar**) &blitFSSrc, nullptr);
for (int i = 0; i < 2; ++i) {
GLint success, len = 0;
mGL->fCompileShader(shaders[i]);
mGL->fGetShaderiv(shaders[i], LOCAL_GL_COMPILE_STATUS, &success);
gl->fCompileShader(shaders[i]);
gl->fGetShaderiv(shaders[i], LOCAL_GL_COMPILE_STATUS, &success);
NS_ASSERTION(success, "Shader compilation failed!");
if (!success) {
nsAutoCString log;
mGL->fGetShaderiv(shaders[i], LOCAL_GL_INFO_LOG_LENGTH, (GLint*) &len);
gl->fGetShaderiv(shaders[i], LOCAL_GL_INFO_LOG_LENGTH, (GLint*) &len);
log.SetCapacity(len);
mGL->fGetShaderInfoLog(shaders[i], len, (GLint*) &len, (char*) log.BeginWriting());
gl->fGetShaderInfoLog(shaders[i], len, (GLint*) &len, (char*) log.BeginWriting());
log.SetLength(len);
printf_stderr("Shader %d compilation failed:\n%s\n", i, log.get());
return;
}
mGL->fAttachShader(mBlitProgram, shaders[i]);
mGL->fDeleteShader(shaders[i]);
gl->fAttachShader(mBlitProgram, shaders[i]);
gl->fDeleteShader(shaders[i]);
}
mGL->fBindAttribLocation(mBlitProgram, 0, "aVertex");
mGL->fBindAttribLocation(mBlitProgram, 1, "aTexCoord");
gl->fBindAttribLocation(mBlitProgram, 0, "aVertex");
gl->fBindAttribLocation(mBlitProgram, 1, "aTexCoord");
mGL->fLinkProgram(mBlitProgram);
gl->fLinkProgram(mBlitProgram);
GLint success, len = 0;
mGL->fGetProgramiv(mBlitProgram, LOCAL_GL_LINK_STATUS, &success);
gl->fGetProgramiv(mBlitProgram, LOCAL_GL_LINK_STATUS, &success);
NS_ASSERTION(success, "Shader linking failed!");
if (!success) {
nsAutoCString log;
mGL->fGetProgramiv(mBlitProgram, LOCAL_GL_INFO_LOG_LENGTH, (GLint*) &len);
gl->fGetProgramiv(mBlitProgram, LOCAL_GL_INFO_LOG_LENGTH, (GLint*) &len);
log.SetCapacity(len);
mGL->fGetProgramInfoLog(mBlitProgram, len, (GLint*) &len, (char*) log.BeginWriting());
gl->fGetProgramInfoLog(mBlitProgram, len, (GLint*) &len, (char*) log.BeginWriting());
log.SetLength(len);
printf_stderr("Program linking failed:\n%s\n", log.get());
return;
}
mGL->fUseProgram(mBlitProgram);
mGL->fUniform1i(mGL->fGetUniformLocation(mBlitProgram, "uSrcTexture"), 0);
gl->fUseProgram(mBlitProgram);
gl->fUniform1i(gl->fGetUniformLocation(mBlitProgram, "uSrcTexture"), 0);
}
}

View File

@ -15,14 +15,17 @@ struct nsIntRect;
namespace mozilla {
namespace gl {
class GLContext;
class TextureImage;
}
namespace layers {
class GLContext;
class TextureImage;
class CompositorOGL;
class GLBlitTextureImageHelper MOZ_FINAL
{
// The GLContext is the sole owner of the GLBlitTextureImageHelper.
GLContext* mGL;
CompositorOGL* mCompositor;
// lazy-initialized things
GLuint mBlitProgram, mBlitFramebuffer;
@ -31,7 +34,7 @@ class GLBlitTextureImageHelper MOZ_FINAL
public:
explicit GLBlitTextureImageHelper(GLContext *gl);
explicit GLBlitTextureImageHelper(CompositorOGL *gl);
~GLBlitTextureImageHelper();
/**
@ -59,8 +62,8 @@ public:
* - active texture (will be 0)
* - texture 0 binding
*/
void BlitTextureImage(TextureImage *aSrc, const nsIntRect& aSrcRect,
TextureImage *aDst, const nsIntRect& aDstRect);
void BlitTextureImage(gl::TextureImage *aSrc, const nsIntRect& aSrcRect,
gl::TextureImage *aDst, const nsIntRect& aDstRect);
};
}

View File

@ -209,8 +209,9 @@ TextureImageTextureSourceOGL::Update(gfx::DataSourceSurface* aSurface,
nsIntRegion* aDestRegion,
gfx::IntPoint* aSrcOffset)
{
MOZ_ASSERT(mGL);
if (!mGL) {
GLContext *gl = mCompositor->gl();
MOZ_ASSERT(gl);
if (!gl) {
NS_WARNING("trying to update TextureImageTextureSourceOGL without a GLContext");
return false;
}
@ -222,7 +223,7 @@ TextureImageTextureSourceOGL::Update(gfx::DataSourceSurface* aSurface,
mTexImage->GetContentType() != gfx::ContentForFormat(aSurface->GetFormat())) {
if (mFlags & TextureFlags::DISALLOW_BIGIMAGE) {
GLint maxTextureSize;
mGL->fGetIntegerv(LOCAL_GL_MAX_TEXTURE_SIZE, &maxTextureSize);
gl->fGetIntegerv(LOCAL_GL_MAX_TEXTURE_SIZE, &maxTextureSize);
if (size.width > maxTextureSize || size.height > maxTextureSize) {
NS_WARNING("Texture exceeds maximum texture size, refusing upload");
return false;
@ -230,7 +231,7 @@ TextureImageTextureSourceOGL::Update(gfx::DataSourceSurface* aSurface,
// Explicitly use CreateBasicTextureImage instead of CreateTextureImage,
// because CreateTextureImage might still choose to create a tiled
// texture image.
mTexImage = CreateBasicTextureImage(mGL, size,
mTexImage = CreateBasicTextureImage(gl, size,
gfx::ContentForFormat(aSurface->GetFormat()),
LOCAL_GL_CLAMP_TO_EDGE,
FlagsToGLFlags(mFlags),
@ -240,7 +241,7 @@ TextureImageTextureSourceOGL::Update(gfx::DataSourceSurface* aSurface,
// require the size of the destination surface to be different from
// the size of aSurface.
// See bug 893300 (tracks the implementation of ContentHost for new textures).
mTexImage = CreateTextureImage(mGL,
mTexImage = CreateTextureImage(gl,
size,
gfx::ContentForFormat(aSurface->GetFormat()),
LOCAL_GL_CLAMP_TO_EDGE,
@ -275,7 +276,7 @@ TextureImageTextureSourceOGL::EnsureBuffer(const nsIntSize& aSize,
if (!mTexImage ||
mTexImage->GetSize() != aSize.ToIntSize() ||
mTexImage->GetContentType() != aContentType) {
mTexImage = CreateTextureImage(mGL,
mTexImage = CreateTextureImage(mCompositor->gl(),
aSize.ToIntSize(),
aContentType,
LOCAL_GL_CLAMP_TO_EDGE,
@ -294,7 +295,7 @@ TextureImageTextureSourceOGL::CopyTo(const nsIntRect& aSourceRect,
aDest->AsSourceOGL()->AsTextureImageTextureSource();
MOZ_ASSERT(dest, "Incompatible destination type!");
mGL->BlitTextureImageHelper()->BlitTextureImage(mTexImage, aSourceRect,
mCompositor->BlitTextureImageHelper()->BlitTextureImage(mTexImage, aSourceRect,
dest->mTexImage, aDestRect);
dest->mTexImage->MarkValid();
}
@ -304,9 +305,9 @@ TextureImageTextureSourceOGL::SetCompositor(Compositor* aCompositor)
{
CompositorOGL* glCompositor = static_cast<CompositorOGL*>(aCompositor);
if (!glCompositor || (mGL != glCompositor->gl())) {
if (!glCompositor || (mCompositor != glCompositor)) {
DeallocateDeviceData();
mGL = glCompositor ? glCompositor->gl() : nullptr;
mCompositor = glCompositor;
}
}
@ -344,7 +345,7 @@ TextureImageTextureSourceOGL::BindTexture(GLenum aTextureUnit, gfx::Filter aFilt
MOZ_ASSERT(mTexImage,
"Trying to bind a TextureSource that does not have an underlying GL texture.");
mTexImage->BindTexture(aTextureUnit);
SetFilter(mGL, aFilter);
SetFilter(mCompositor->gl(), aFilter);
}
////////////////////////////////////////////////////////////////////////

View File

@ -189,9 +189,9 @@ class TextureImageTextureSourceOGL MOZ_FINAL : public DataTextureSource
, public BigImageIterator
{
public:
explicit TextureImageTextureSourceOGL(gl::GLContext* aGL,
explicit TextureImageTextureSourceOGL(CompositorOGL *aCompositor,
TextureFlags aFlags = TextureFlags::DEFAULT)
: mGL(aGL)
: mCompositor(aCompositor)
, mFlags(aFlags)
, mIterating(false)
{}
@ -265,7 +265,7 @@ public:
protected:
nsRefPtr<gl::TextureImage> mTexImage;
gl::GLContext* mGL;
RefPtr<CompositorOGL> mCompositor;
TextureFlags mFlags;
bool mIterating;
};