Remove the old single-color-attachment calls from gl::Framebuffer, preferring the new multiple-attachment versions.
TRAC #22656
Signed-off-by: Nicolas Capens
Signed-off-by: Shannon Woods
Author: Jamie Madill
git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@2008 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index c0756e1..c274091 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -1421,7 +1421,7 @@
case GL_ALPHA_BITS:
{
gl::Framebuffer *framebuffer = getDrawFramebuffer();
- gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer();
+ gl::Renderbuffer *colorbuffer = framebuffer->getFirstColorBuffer();
if (colorbuffer)
{
@@ -1867,7 +1867,8 @@
{
mask &= ~GL_COLOR_BUFFER_BIT;
- if (framebufferObject->getColorbufferType() != GL_NONE)
+ // TODO: MRT clear
+ if (framebufferObject->getColorbufferType(0) != GL_NONE)
{
finalMask |= GL_COLOR_BUFFER_BIT;
}
@@ -2142,6 +2143,11 @@
return mRenderer->getMaxSupportedSamples();
}
+unsigned int Context::getMaximumRenderTargets() const
+{
+ return mRenderer->getMaxRenderTargets();
+}
+
bool Context::supportsEventQueries() const
{
return mSupportsEventQueries;
@@ -2270,7 +2276,7 @@
return gl::error(GL_INVALID_OPERATION, false);
}
- Renderbuffer *renderbuffer = framebuffer->getColorbuffer();
+ Renderbuffer *renderbuffer = framebuffer->getReadColorbuffer();
if (!renderbuffer)
{
return gl::error(GL_INVALID_OPERATION, false);
@@ -2618,6 +2624,7 @@
GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
GLbitfield mask)
{
+ // TODO: mrt support for blit
Framebuffer *readFramebuffer = getReadFramebuffer();
Framebuffer *drawFramebuffer = getDrawFramebuffer();
@@ -2632,10 +2639,10 @@
return gl::error(GL_INVALID_OPERATION);
}
- int readBufferWidth = readFramebuffer->getColorbuffer()->getWidth();
- int readBufferHeight = readFramebuffer->getColorbuffer()->getHeight();
- int drawBufferWidth = drawFramebuffer->getColorbuffer()->getWidth();
- int drawBufferHeight = drawFramebuffer->getColorbuffer()->getHeight();
+ int readBufferWidth = readFramebuffer->getColorbuffer(0)->getWidth();
+ int readBufferHeight = readFramebuffer->getColorbuffer(0)->getHeight();
+ int drawBufferWidth = drawFramebuffer->getColorbuffer(0)->getWidth();
+ int drawBufferHeight = drawFramebuffer->getColorbuffer(0)->getHeight();
Rectangle sourceRect;
Rectangle destRect;
@@ -2794,12 +2801,12 @@
if (mask & GL_COLOR_BUFFER_BIT)
{
- const bool validReadType = readFramebuffer->getColorbufferType() == GL_TEXTURE_2D ||
- readFramebuffer->getColorbufferType() == GL_RENDERBUFFER;
- const bool validDrawType = drawFramebuffer->getColorbufferType() == GL_TEXTURE_2D ||
- drawFramebuffer->getColorbufferType() == GL_RENDERBUFFER;
+ const bool validReadType = readFramebuffer->getColorbufferType(0) == GL_TEXTURE_2D ||
+ readFramebuffer->getColorbufferType(0) == GL_RENDERBUFFER;
+ const bool validDrawType = drawFramebuffer->getColorbufferType(0) == GL_TEXTURE_2D ||
+ drawFramebuffer->getColorbufferType(0) == GL_RENDERBUFFER;
if (!validReadType || !validDrawType ||
- readFramebuffer->getColorbuffer()->getActualFormat() != drawFramebuffer->getColorbuffer()->getActualFormat())
+ readFramebuffer->getColorbuffer(0)->getActualFormat() != drawFramebuffer->getColorbuffer(0)->getActualFormat())
{
ERR("Color buffer format conversion in BlitFramebufferANGLE not supported by this implementation");
return gl::error(GL_INVALID_OPERATION);
diff --git a/src/libGLESv2/Context.h b/src/libGLESv2/Context.h
index 770ad1c..9c222be 100644
--- a/src/libGLESv2/Context.h
+++ b/src/libGLESv2/Context.h
@@ -366,6 +366,7 @@
int getMaximumTextureDimension() const;
int getMaximumCubeTextureDimension() const;
int getMaximumTextureLevel() const;
+ unsigned int getMaximumRenderTargets() const;
GLsizei getMaxSupportedSamples() const;
const char *getExtensionString() const;
const char *getRendererString() const;
diff --git a/src/libGLESv2/Framebuffer.cpp b/src/libGLESv2/Framebuffer.cpp
index 947269b..e10ff58 100644
--- a/src/libGLESv2/Framebuffer.cpp
+++ b/src/libGLESv2/Framebuffer.cpp
@@ -77,11 +77,6 @@
mColorbufferPointers[colorAttachment].set(lookupRenderbuffer(type, colorbuffer));
}
-void Framebuffer::setColorbuffer(GLenum type, GLuint colorbuffer)
-{
- setColorbuffer(0, type, colorbuffer);
-}
-
void Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer)
{
mDepthbufferType = (depthbuffer != 0) ? type : GL_NONE;
@@ -156,11 +151,6 @@
return 0;
}
-unsigned int Framebuffer::getRenderTargetSerial() const
-{
- return getRenderTargetSerial(0);
-}
-
unsigned int Framebuffer::getDepthbufferSerial() const
{
Renderbuffer *depthbuffer = mDepthbufferPointer.get();
@@ -191,11 +181,6 @@
return mColorbufferPointers[colorAttachment].get();
}
-Renderbuffer *Framebuffer::getColorbuffer() const
-{
- return getColorbuffer(0);
-}
-
Renderbuffer *Framebuffer::getDepthbuffer() const
{
return mDepthbufferPointer.get();
@@ -243,11 +228,6 @@
return mColorbufferTypes[colorAttachment];
}
-GLenum Framebuffer::getColorbufferType() const
-{
- return getColorbufferType(0);
-}
-
GLenum Framebuffer::getDepthbufferType() const
{
return mDepthbufferType;
@@ -264,11 +244,6 @@
return mColorbufferPointers[colorAttachment].id();
}
-GLuint Framebuffer::getColorbufferHandle() const
-{
- return getColorbufferHandle(0);
-}
-
GLuint Framebuffer::getDepthbufferHandle() const
{
return mDepthbufferPointer.id();
diff --git a/src/libGLESv2/Framebuffer.h b/src/libGLESv2/Framebuffer.h
index 9a1bee0..24225ec 100644
--- a/src/libGLESv2/Framebuffer.h
+++ b/src/libGLESv2/Framebuffer.h
@@ -35,7 +35,6 @@
virtual ~Framebuffer();
void setColorbuffer(unsigned int colorAttachment, GLenum type, GLuint colorbuffer);
- void setColorbuffer(GLenum type, GLuint colorbuffer);
void setDepthbuffer(GLenum type, GLuint depthbuffer);
void setStencilbuffer(GLenum type, GLuint stencilbuffer);
@@ -43,12 +42,10 @@
void detachRenderbuffer(GLuint renderbuffer);
unsigned int getRenderTargetSerial(unsigned int colorAttachment) const;
- unsigned int getRenderTargetSerial() const;
unsigned int getDepthbufferSerial() const;
unsigned int getStencilbufferSerial() const;
Renderbuffer *getColorbuffer(unsigned int colorAttachment) const;
- Renderbuffer *getColorbuffer() const;
Renderbuffer *getDepthbuffer() const;
Renderbuffer *getStencilbuffer() const;
Renderbuffer *getDepthOrStencilbuffer() const;
@@ -56,12 +53,10 @@
Renderbuffer *getFirstColorBuffer() const;
GLenum getColorbufferType(unsigned int colorAttachment) const;
- GLenum getColorbufferType() const;
GLenum getDepthbufferType() const;
GLenum getStencilbufferType() const;
GLuint getColorbufferHandle(unsigned int colorAttachment) const;
- GLuint getColorbufferHandle() const;
GLuint getDepthbufferHandle() const;
GLuint getStencilbufferHandle() const;
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index cf9e7b4..2025b1d 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -1317,12 +1317,12 @@
return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
}
- if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
+ if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
{
return gl::error(GL_INVALID_OPERATION);
}
- gl::Renderbuffer *source = framebuffer->getColorbuffer();
+ gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
GLenum colorbufferFormat = source->getInternalFormat();
// [OpenGL ES 2.0.24] table 3.9
@@ -1493,12 +1493,12 @@
return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
}
- if (context->getReadFramebufferHandle() != 0 && framebuffer->getColorbuffer()->getSamples() != 0)
+ if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
{
return gl::error(GL_INVALID_OPERATION);
}
- gl::Renderbuffer *source = framebuffer->getColorbuffer();
+ gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
GLenum colorbufferFormat = source->getInternalFormat();
gl::Texture *texture = NULL;
GLenum textureFormat = GL_RGBA;
@@ -2398,19 +2398,30 @@
return gl::error(GL_INVALID_OPERATION);
}
- switch (attachment)
+ if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
{
- case GL_COLOR_ATTACHMENT0:
- framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer);
- break;
- case GL_DEPTH_ATTACHMENT:
- framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
- break;
- case GL_STENCIL_ATTACHMENT:
- framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
- break;
- default:
- return gl::error(GL_INVALID_ENUM);
+ const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
+
+ if (colorAttachment >= context->getMaximumRenderTargets())
+ {
+ return gl::error(GL_INVALID_VALUE);
+ }
+
+ framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer);
+ }
+ else
+ {
+ switch (attachment)
+ {
+ case GL_DEPTH_ATTACHMENT:
+ framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
+ break;
+ case GL_STENCIL_ATTACHMENT:
+ framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
+ break;
+ default:
+ return gl::error(GL_INVALID_ENUM);
+ }
}
}
}
@@ -2432,20 +2443,31 @@
return gl::error(GL_INVALID_ENUM);
}
- switch (attachment)
- {
- case GL_COLOR_ATTACHMENT0:
- case GL_DEPTH_ATTACHMENT:
- case GL_STENCIL_ATTACHMENT:
- break;
- default:
- return gl::error(GL_INVALID_ENUM);
- }
-
gl::Context *context = gl::getNonLostContext();
if (context)
{
+ if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
+ {
+ const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
+
+ if (colorAttachment >= context->getMaximumRenderTargets())
+ {
+ return gl::error(GL_INVALID_VALUE);
+ }
+ }
+ else
+ {
+ switch (attachment)
+ {
+ case GL_DEPTH_ATTACHMENT:
+ case GL_STENCIL_ATTACHMENT:
+ break;
+ default:
+ return gl::error(GL_INVALID_ENUM);
+ }
+ }
+
if (texture == 0)
{
textarget = GL_NONE;
@@ -2522,11 +2544,24 @@
return gl::error(GL_INVALID_OPERATION);
}
- switch (attachment)
+ if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
{
- case GL_COLOR_ATTACHMENT0: framebuffer->setColorbuffer(textarget, texture); break;
- case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
- case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
+ const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
+
+ if (colorAttachment >= context->getMaximumRenderTargets())
+ {
+ return gl::error(GL_INVALID_VALUE);
+ }
+
+ framebuffer->setColorbuffer(colorAttachment, textarget, texture);
+ }
+ else
+ {
+ switch (attachment)
+ {
+ case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
+ case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
+ }
}
}
}
@@ -3200,21 +3235,33 @@
GLenum attachmentType;
GLuint attachmentHandle;
- switch (attachment)
+
+ if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
{
- case GL_COLOR_ATTACHMENT0:
- attachmentType = framebuffer->getColorbufferType();
- attachmentHandle = framebuffer->getColorbufferHandle();
- break;
- case GL_DEPTH_ATTACHMENT:
- attachmentType = framebuffer->getDepthbufferType();
- attachmentHandle = framebuffer->getDepthbufferHandle();
- break;
- case GL_STENCIL_ATTACHMENT:
- attachmentType = framebuffer->getStencilbufferType();
- attachmentHandle = framebuffer->getStencilbufferHandle();
- break;
- default: return gl::error(GL_INVALID_ENUM);
+ const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
+
+ if (colorAttachment >= context->getMaximumRenderTargets())
+ {
+ return gl::error(GL_INVALID_ENUM);
+ }
+
+ attachmentType = framebuffer->getColorbufferType(colorAttachment);
+ attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
+ }
+ else
+ {
+ switch (attachment)
+ {
+ case GL_DEPTH_ATTACHMENT:
+ attachmentType = framebuffer->getDepthbufferType();
+ attachmentHandle = framebuffer->getDepthbufferHandle();
+ break;
+ case GL_STENCIL_ATTACHMENT:
+ attachmentType = framebuffer->getStencilbufferType();
+ attachmentHandle = framebuffer->getStencilbufferHandle();
+ break;
+ default: return gl::error(GL_INVALID_ENUM);
+ }
}
GLenum attachmentObjectType; // Type category
diff --git a/src/libGLESv2/renderer/Blit.cpp b/src/libGLESv2/renderer/Blit.cpp
index 17fa283..2a3ce39 100644
--- a/src/libGLESv2/renderer/Blit.cpp
+++ b/src/libGLESv2/renderer/Blit.cpp
@@ -215,7 +215,7 @@
{
RenderTarget9 *renderTarget = NULL;
IDirect3DSurface9 *source = NULL;
- gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer();
+ gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer(0);
if (colorbuffer)
{
@@ -251,7 +251,7 @@
{
RenderTarget9 *renderTarget = NULL;
IDirect3DSurface9 *source = NULL;
- gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer();
+ gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer(0);
if (colorbuffer)
{
diff --git a/src/libGLESv2/renderer/Image11.cpp b/src/libGLESv2/renderer/Image11.cpp
index 937ce4d..861eb20 100644
--- a/src/libGLESv2/renderer/Image11.cpp
+++ b/src/libGLESv2/renderer/Image11.cpp
@@ -278,7 +278,7 @@
void Image11::copy(GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source)
{
- if (source->getColorbuffer() && source->getColorbuffer()->getActualFormat() == (GLuint)mActualFormat)
+ if (source->getReadColorbuffer() && source->getReadColorbuffer()->getActualFormat() == (GLuint)mActualFormat)
{
// No conversion needed-- use copyback fastpath
ID3D11Texture2D *colorBufferTexture = NULL;
diff --git a/src/libGLESv2/renderer/Image9.cpp b/src/libGLESv2/renderer/Image9.cpp
index 0dd5ae6..b3dcc59 100644
--- a/src/libGLESv2/renderer/Image9.cpp
+++ b/src/libGLESv2/renderer/Image9.cpp
@@ -484,7 +484,7 @@
{
RenderTarget9 *renderTarget = NULL;
IDirect3DSurface9 *surface = NULL;
- gl::Renderbuffer *colorbuffer = source->getColorbuffer();
+ gl::Renderbuffer *colorbuffer = source->getColorbuffer(0);
if (colorbuffer)
{
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index a0439b2..3a56e2d 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -814,12 +814,13 @@
bool Renderer11::applyRenderTarget(gl::Framebuffer *framebuffer)
{
+ // TODO: mrt support
// Get the color render buffer and serial
gl::Renderbuffer *renderbufferObject = NULL;
unsigned int renderTargetSerial = 0;
- if (framebuffer->getColorbufferType() != GL_NONE)
+ if (framebuffer->getColorbufferType(0) != GL_NONE)
{
- renderbufferObject = framebuffer->getColorbuffer();
+ renderbufferObject = framebuffer->getColorbuffer(0);
if (!renderbufferObject)
{
@@ -1464,7 +1465,8 @@
{
if (clearParams.mask & GL_COLOR_BUFFER_BIT)
{
- gl::Renderbuffer *renderbufferObject = frameBuffer->getColorbuffer();
+ // TODO: mrt clear
+ gl::Renderbuffer *renderbufferObject = frameBuffer->getColorbuffer(0);
if (renderbufferObject)
{
RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(renderbufferObject->getRenderTarget());
@@ -2406,7 +2408,7 @@
bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
GLint xoffset, GLint yoffset, TextureStorageInterface2D *storage, GLint level)
{
- gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer();
+ gl::Renderbuffer *colorbuffer = framebuffer->getReadColorbuffer();
if (!colorbuffer)
{
ERR("Failed to retrieve the color buffer from the frame buffer.");
@@ -2469,7 +2471,7 @@
bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
GLint xoffset, GLint yoffset, TextureStorageInterfaceCube *storage, GLenum target, GLint level)
{
- gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer();
+ gl::Renderbuffer *colorbuffer = framebuffer->getReadColorbuffer();
if (!colorbuffer)
{
ERR("Failed to retrieve the color buffer from the frame buffer.");
@@ -2844,7 +2846,8 @@
bool Renderer11::getRenderTargetResource(gl::Framebuffer *framebuffer, unsigned int *subresourceIndex, ID3D11Texture2D **resource)
{
- gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer();
+ // TODO: mrt supprt
+ gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer(0);
if (colorbuffer)
{
RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(colorbuffer->getRenderTarget());
@@ -3320,13 +3323,14 @@
bool Renderer11::blitRect(gl::Framebuffer *readTarget, const gl::Rectangle &readRect, gl::Framebuffer *drawTarget,
const gl::Rectangle &drawRect, BlitTarget target)
{
+ // TODO: mrt support
ASSERT(readRect.width == drawRect.width && readRect.height == drawRect.height);
gl::Renderbuffer *readBuffer = NULL;
switch (target)
{
case BLIT_RENDERTARGET:
- readBuffer = readTarget->getColorbuffer();
+ readBuffer = readTarget->getColorbuffer(0);
break;
case BLIT_DEPTHSTENCIL:
readBuffer = readTarget->getDepthOrStencilbuffer();
@@ -3384,7 +3388,7 @@
switch (target)
{
case BLIT_RENDERTARGET:
- drawBuffer = drawTarget->getColorbuffer();
+ drawBuffer = drawTarget->getColorbuffer(0);
break;
case BLIT_DEPTHSTENCIL:
drawBuffer = drawTarget->getDepthOrStencilbuffer();
diff --git a/src/libGLESv2/renderer/Renderer9.cpp b/src/libGLESv2/renderer/Renderer9.cpp
index e3ed3a2..6c88f71 100644
--- a/src/libGLESv2/renderer/Renderer9.cpp
+++ b/src/libGLESv2/renderer/Renderer9.cpp
@@ -1221,9 +1221,9 @@
// if there is no color attachment we must synthesize a NULL colorattachment
// to keep the D3D runtime happy. This should only be possible if depth texturing.
gl::Renderbuffer *renderbufferObject = NULL;
- if (framebuffer->getColorbufferType() != GL_NONE)
+ if (framebuffer->getColorbufferType(0) != GL_NONE)
{
- renderbufferObject = framebuffer->getColorbuffer();
+ renderbufferObject = framebuffer->getColorbuffer(0);
}
else
{
@@ -2567,8 +2567,8 @@
if (blitRenderTarget)
{
- gl::Renderbuffer *readBuffer = readFramebuffer->getColorbuffer();
- gl::Renderbuffer *drawBuffer = drawFramebuffer->getColorbuffer();
+ gl::Renderbuffer *readBuffer = readFramebuffer->getColorbuffer(0);
+ gl::Renderbuffer *drawBuffer = drawFramebuffer->getColorbuffer(0);
RenderTarget9 *readRenderTarget = NULL;
RenderTarget9 *drawRenderTarget = NULL;
IDirect3DSurface9* readSurface = NULL;
@@ -2675,7 +2675,7 @@
{
RenderTarget9 *renderTarget = NULL;
IDirect3DSurface9 *surface = NULL;
- gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer();
+ gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer(0);
if (colorbuffer)
{