зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1031494 - Move the FBO texture clamping code so that the OGL CompositingRenderTarget gets the unclamped size. r=BenWa
This commit is contained in:
Родитель
51664e983d
Коммит
120f705ed7
|
@ -302,15 +302,6 @@ ContainerRender(ContainerT* aContainer,
|
|||
SurfaceInitMode mode = INIT_MODE_CLEAR;
|
||||
gfx::IntRect surfaceRect = gfx::IntRect(visibleRect.x, visibleRect.y,
|
||||
visibleRect.width, visibleRect.height);
|
||||
// we're about to create a framebuffer backed by textures to use as an intermediate
|
||||
// surface. What to do if its size (as given by framebufferRect) would exceed the
|
||||
// maximum texture size supported by the GL? The present code chooses the compromise
|
||||
// of just clamping the framebuffer's size to the max supported size.
|
||||
// This gives us a lower resolution rendering of the intermediate surface (children layers).
|
||||
// See bug 827170 for a discussion.
|
||||
int32_t maxTextureSize = compositor->GetMaxTextureSize();
|
||||
surfaceRect.width = std::min(maxTextureSize, surfaceRect.width);
|
||||
surfaceRect.height = std::min(maxTextureSize, surfaceRect.height);
|
||||
if (aContainer->GetEffectiveVisibleRegion().GetNumRects() == 1 &&
|
||||
(aContainer->GetContentFlags() & Layer::CONTENT_OPAQUE))
|
||||
{
|
||||
|
|
|
@ -800,6 +800,17 @@ CompositorOGL::CreateFBOWithTexture(const IntRect& aRect, bool aCopyFromSource,
|
|||
GLuint aSourceFrameBuffer,
|
||||
GLuint *aFBO, GLuint *aTexture)
|
||||
{
|
||||
// we're about to create a framebuffer backed by textures to use as an intermediate
|
||||
// surface. What to do if its size (as given by aRect) would exceed the
|
||||
// maximum texture size supported by the GL? The present code chooses the compromise
|
||||
// of just clamping the framebuffer's size to the max supported size.
|
||||
// This gives us a lower resolution rendering of the intermediate surface (children layers).
|
||||
// See bug 827170 for a discussion.
|
||||
IntRect clampedRect = aRect;
|
||||
int32_t maxTexSize = GetMaxTextureSize();
|
||||
clampedRect.width = std::min(clampedRect.width, maxTexSize);
|
||||
clampedRect.height = std::min(clampedRect.height, maxTexSize);
|
||||
|
||||
GLuint tex, fbo;
|
||||
|
||||
mGLContext->fActiveTexture(LOCAL_GL_TEXTURE0);
|
||||
|
@ -828,25 +839,25 @@ CompositorOGL::CreateFBOWithTexture(const IntRect& aRect, bool aCopyFromSource,
|
|||
mGLContext->fCopyTexImage2D(mFBOTextureTarget,
|
||||
0,
|
||||
LOCAL_GL_RGBA,
|
||||
aRect.x, FlipY(aRect.y + aRect.height),
|
||||
aRect.width, aRect.height,
|
||||
clampedRect.x, FlipY(clampedRect.y + clampedRect.height),
|
||||
clampedRect.width, clampedRect.height,
|
||||
0);
|
||||
} else {
|
||||
// Curses, incompatible formats. Take a slow path.
|
||||
|
||||
// RGBA
|
||||
size_t bufferSize = aRect.width * aRect.height * 4;
|
||||
size_t bufferSize = clampedRect.width * clampedRect.height * 4;
|
||||
nsAutoArrayPtr<uint8_t> buf(new uint8_t[bufferSize]);
|
||||
|
||||
mGLContext->fReadPixels(aRect.x, aRect.y,
|
||||
aRect.width, aRect.height,
|
||||
mGLContext->fReadPixels(clampedRect.x, clampedRect.y,
|
||||
clampedRect.width, clampedRect.height,
|
||||
LOCAL_GL_RGBA,
|
||||
LOCAL_GL_UNSIGNED_BYTE,
|
||||
buf);
|
||||
mGLContext->fTexImage2D(mFBOTextureTarget,
|
||||
0,
|
||||
LOCAL_GL_RGBA,
|
||||
aRect.width, aRect.height,
|
||||
clampedRect.width, clampedRect.height,
|
||||
0,
|
||||
LOCAL_GL_RGBA,
|
||||
LOCAL_GL_UNSIGNED_BYTE,
|
||||
|
@ -863,7 +874,7 @@ CompositorOGL::CreateFBOWithTexture(const IntRect& aRect, bool aCopyFromSource,
|
|||
mGLContext->fTexImage2D(mFBOTextureTarget,
|
||||
0,
|
||||
LOCAL_GL_RGBA,
|
||||
aRect.width, aRect.height,
|
||||
clampedRect.width, clampedRect.height,
|
||||
0,
|
||||
LOCAL_GL_RGBA,
|
||||
LOCAL_GL_UNSIGNED_BYTE,
|
||||
|
|
Загрузка…
Ссылка в новой задаче