зеркало из https://github.com/mozilla/gecko-dev.git
Bug 984823 - Use clamp to edges with tiles on b2g. r=Cwiiis
This commit is contained in:
Родитель
a46fb0f8a7
Коммит
8178319bae
|
@ -1442,7 +1442,7 @@ CompositorOGL::BindAndDrawQuad(ShaderProgramOGL *aProg,
|
|||
}
|
||||
|
||||
GLuint
|
||||
CompositorOGL::GetTemporaryTexture(GLenum aUnit)
|
||||
CompositorOGL::GetTemporaryTexture(GLenum aTarget, GLenum aUnit)
|
||||
{
|
||||
if (!mTexturePool) {
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
|
@ -1451,12 +1451,17 @@ CompositorOGL::GetTemporaryTexture(GLenum aUnit)
|
|||
mTexturePool = new PerUnitTexturePoolOGL(gl());
|
||||
#endif
|
||||
}
|
||||
return mTexturePool->GetTexture(aUnit);
|
||||
return mTexturePool->GetTexture(aTarget, aUnit);
|
||||
}
|
||||
|
||||
GLuint
|
||||
PerUnitTexturePoolOGL::GetTexture(GLenum aTextureUnit)
|
||||
PerUnitTexturePoolOGL::GetTexture(GLenum aTarget, GLenum aTextureUnit)
|
||||
{
|
||||
if (mTextureTarget == 0) {
|
||||
mTextureTarget = aTarget;
|
||||
}
|
||||
MOZ_ASSERT(mTextureTarget == aTarget);
|
||||
|
||||
size_t index = aTextureUnit - LOCAL_GL_TEXTURE0;
|
||||
// lazily grow the array of temporary textures
|
||||
if (mTextures.Length() <= index) {
|
||||
|
@ -1472,6 +1477,9 @@ PerUnitTexturePoolOGL::GetTexture(GLenum aTextureUnit)
|
|||
return 0;
|
||||
}
|
||||
mGL->fGenTextures(1, &mTextures[index]);
|
||||
mGL->fBindTexture(aTarget, mTextures[index]);
|
||||
mGL->fTexParameteri(aTarget, LOCAL_GL_TEXTURE_WRAP_S, LOCAL_GL_CLAMP_TO_EDGE);
|
||||
mGL->fTexParameteri(aTarget, LOCAL_GL_TEXTURE_WRAP_T, LOCAL_GL_CLAMP_TO_EDGE);
|
||||
}
|
||||
return mTextures[index];
|
||||
}
|
||||
|
@ -1506,8 +1514,20 @@ PerFrameTexturePoolOGL::DestroyTextures()
|
|||
}
|
||||
|
||||
GLuint
|
||||
PerFrameTexturePoolOGL::GetTexture(GLenum)
|
||||
PerFrameTexturePoolOGL::GetTexture(GLenum aTarget, GLenum)
|
||||
{
|
||||
if (mTextureTarget == 0) {
|
||||
mTextureTarget = aTarget;
|
||||
}
|
||||
|
||||
// The pool should always use the same texture target because it is illegal
|
||||
// to change the target of an already exisiting gl texture.
|
||||
// If we need to use several targets, a pool with several sub-pools (one per
|
||||
// target) will have to be implemented.
|
||||
// At the moment this pool is only used with tiling on b2g so we always need
|
||||
// the same target.
|
||||
MOZ_ASSERT(mTextureTarget == aTarget);
|
||||
|
||||
GLuint texture = 0;
|
||||
|
||||
if (!mUnusedTextures.IsEmpty()) {
|
||||
|
@ -1517,6 +1537,9 @@ PerFrameTexturePoolOGL::GetTexture(GLenum)
|
|||
} else if (mGL->MakeCurrent()) {
|
||||
// There isn't one to reuse, create one.
|
||||
mGL->fGenTextures(1, &texture);
|
||||
mGL->fBindTexture(aTarget, texture);
|
||||
mGL->fTexParameteri(aTarget, LOCAL_GL_TEXTURE_WRAP_S, LOCAL_GL_CLAMP_TO_EDGE);
|
||||
mGL->fTexParameteri(aTarget, LOCAL_GL_TEXTURE_WRAP_T, LOCAL_GL_CLAMP_TO_EDGE);
|
||||
}
|
||||
|
||||
if (texture) {
|
||||
|
|
|
@ -73,7 +73,7 @@ public:
|
|||
|
||||
virtual void Clear() = 0;
|
||||
|
||||
virtual GLuint GetTexture(GLenum aUnit) = 0;
|
||||
virtual GLuint GetTexture(GLenum aTarget, GLenum aEnum) = 0;
|
||||
|
||||
virtual void EndFrame() = 0;
|
||||
};
|
||||
|
@ -86,7 +86,8 @@ class PerUnitTexturePoolOGL : public CompositorTexturePoolOGL
|
|||
{
|
||||
public:
|
||||
PerUnitTexturePoolOGL(gl::GLContext* aGL)
|
||||
: mGL(aGL)
|
||||
: mTextureTarget(0) // zero is never a valid texture target
|
||||
, mGL(aGL)
|
||||
{}
|
||||
|
||||
virtual ~PerUnitTexturePoolOGL()
|
||||
|
@ -99,13 +100,14 @@ public:
|
|||
DestroyTextures();
|
||||
}
|
||||
|
||||
virtual GLuint GetTexture(GLenum aUnit) MOZ_OVERRIDE;
|
||||
virtual GLuint GetTexture(GLenum aTarget, GLenum aUnit) MOZ_OVERRIDE;
|
||||
|
||||
virtual void EndFrame() MOZ_OVERRIDE {}
|
||||
|
||||
protected:
|
||||
void DestroyTextures();
|
||||
|
||||
GLenum mTextureTarget;
|
||||
nsTArray<GLuint> mTextures;
|
||||
RefPtr<gl::GLContext> mGL;
|
||||
};
|
||||
|
@ -123,7 +125,8 @@ class PerFrameTexturePoolOGL : public CompositorTexturePoolOGL
|
|||
{
|
||||
public:
|
||||
PerFrameTexturePoolOGL(gl::GLContext* aGL)
|
||||
: mGL(aGL)
|
||||
: mTextureTarget(0) // zero is never a valid texture target
|
||||
, mGL(aGL)
|
||||
{}
|
||||
|
||||
virtual ~PerFrameTexturePoolOGL()
|
||||
|
@ -136,13 +139,14 @@ public:
|
|||
DestroyTextures();
|
||||
}
|
||||
|
||||
virtual GLuint GetTexture(GLenum aUnit) MOZ_OVERRIDE;
|
||||
virtual GLuint GetTexture(GLenum aTarget, GLenum aUnit) MOZ_OVERRIDE;
|
||||
|
||||
virtual void EndFrame() MOZ_OVERRIDE;
|
||||
|
||||
protected:
|
||||
void DestroyTextures();
|
||||
|
||||
GLenum mTextureTarget;
|
||||
RefPtr<gl::GLContext> mGL;
|
||||
nsTArray<GLuint> mCreatedTextures;
|
||||
nsTArray<GLuint> mUnusedTextures;
|
||||
|
@ -267,7 +271,7 @@ public:
|
|||
* Doing so lets us use gralloc the way it has been designed to be used
|
||||
* (see https://wiki.mozilla.org/Platform/GFX/Gralloc)
|
||||
*/
|
||||
GLuint GetTemporaryTexture(GLenum aUnit);
|
||||
GLuint GetTemporaryTexture(GLenum aTarget, GLenum aUnit);
|
||||
|
||||
const gfx::Matrix4x4& GetProjMatrix() const {
|
||||
return mProjMatrix;
|
||||
|
|
|
@ -148,7 +148,7 @@ void GrallocTextureSourceOGL::Lock()
|
|||
|
||||
MOZ_ASSERT(IsValid());
|
||||
|
||||
mTexture = mCompositor->GetTemporaryTexture(LOCAL_GL_TEXTURE0);
|
||||
mTexture = mCompositor->GetTemporaryTexture(GetTextureTarget(), LOCAL_GL_TEXTURE0);
|
||||
|
||||
GLuint textureTarget = GetTextureTarget();
|
||||
|
||||
|
|
|
@ -90,7 +90,7 @@ MacIOSurfaceTextureSourceOGL::BindTexture(GLenum aTextureUnit, gfx::Filter aFilt
|
|||
NS_WARNING("Trying to bind a texture without a GLContext");
|
||||
return;
|
||||
}
|
||||
GLuint tex = mCompositor->GetTemporaryTexture(aTextureUnit);
|
||||
GLuint tex = mCompositor->GetTemporaryTexture(GetTextureTarget(), aTextureUnit);
|
||||
|
||||
gl()->fActiveTexture(aTextureUnit);
|
||||
gl()->fBindTexture(LOCAL_GL_TEXTURE_RECTANGLE_ARB, tex);
|
||||
|
|
|
@ -345,7 +345,7 @@ SharedTextureSourceOGL::BindTexture(GLenum aTextureUnit, gfx::Filter aFilter)
|
|||
NS_WARNING("Trying to bind a texture without a GLContext");
|
||||
return;
|
||||
}
|
||||
GLuint tex = mCompositor->GetTemporaryTexture(aTextureUnit);
|
||||
GLuint tex = mCompositor->GetTemporaryTexture(GetTextureTarget(), aTextureUnit);
|
||||
|
||||
gl()->fActiveTexture(aTextureUnit);
|
||||
gl()->fBindTexture(mTextureTarget, tex);
|
||||
|
|
Загрузка…
Ссылка в новой задаче