Commit 9ad4bda0 by Geoff Lang

Move Framebuffer invalidation into the impl.

BUG=angle:841 Change-Id: Ibcf58c4f676491f3b2582198c6cf9fd4a7a38b42 Reviewed-on: https://chromium-review.googlesource.com/232392Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 164d54eb
......@@ -530,35 +530,14 @@ GLenum Framebuffer::completeness(const gl::Data &data) const
return GL_FRAMEBUFFER_COMPLETE;
}
Error Framebuffer::invalidate(const Caps &caps, GLsizei numAttachments, const GLenum *attachments)
Error Framebuffer::invalidate(size_t count, const GLenum *attachments)
{
GLuint maxDimension = caps.maxRenderbufferSize;
return invalidateSub(numAttachments, attachments, 0, 0, maxDimension, maxDimension);
return mImpl->invalidate(count, attachments);
}
Error Framebuffer::invalidateSub(GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
Error Framebuffer::invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &area)
{
for (GLsizei attachIndex = 0; attachIndex < numAttachments; ++attachIndex)
{
GLenum attachmentTarget = attachments[attachIndex];
FramebufferAttachment *attachment = (attachmentTarget == GL_DEPTH_STENCIL_ATTACHMENT) ? getDepthOrStencilbuffer()
: getAttachment(attachmentTarget);
if (attachment)
{
rx::RenderTarget *renderTarget = NULL;
Error error = rx::GetAttachmentRenderTarget(attachment, &renderTarget);
if (error.isError())
{
return error;
}
renderTarget->invalidate(x, y, width, height);
}
}
return Error(GL_NO_ERROR);
return mImpl->invalidateSub(count, attachments, area);
}
int Framebuffer::getSamples(const gl::Data &data) const
......
......@@ -36,6 +36,7 @@ struct Caps;
struct Extensions;
class TextureCapsMap;
struct Data;
struct Rectangle;
typedef std::vector<FramebufferAttachment *> ColorbufferInfo;
......@@ -80,8 +81,8 @@ class Framebuffer
GLenum completeness(const gl::Data &data) const;
bool hasValidDepthStencil() const;
Error invalidate(const Caps &caps, GLsizei numAttachments, const GLenum *attachments);
Error invalidateSub(GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
Error invalidate(size_t count, const GLenum *attachments);
Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &area);
// Use this method to retrieve the color buffer map when doing rendering.
// It will apply a workaround for poor shader performance on some systems
......
......@@ -9,8 +9,15 @@
#ifndef LIBANGLE_RENDERER_FRAMBUFFERIMPL_H_
#define LIBANGLE_RENDERER_FRAMBUFFERIMPL_H_
#include "libANGLE/Error.h"
#include "angle_gl.h"
namespace gl
{
struct Rectangle;
}
namespace rx
{
......@@ -30,6 +37,9 @@ class FramebufferImpl
{
public:
virtual ~FramebufferImpl() {};
virtual gl::Error invalidate(size_t count, const GLenum *attachments) = 0;
virtual gl::Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &area) = 0;
};
}
......
......@@ -29,8 +29,6 @@ class RenderTarget
virtual GLsizei getSamples() const = 0;
gl::Extents getExtents() const { return gl::Extents(getWidth(), getHeight(), getDepth()); }
virtual void invalidate(GLint x, GLint y, GLsizei width, GLsizei height) = 0;
virtual unsigned int getSerial() const;
static unsigned int issueSerials(unsigned int count);
......
......@@ -71,4 +71,16 @@ FramebufferD3D::~FramebufferD3D()
{
}
gl::Error FramebufferD3D::invalidate(size_t, const GLenum *)
{
// No-op in D3D
return gl::Error(GL_NO_ERROR);
}
gl::Error FramebufferD3D::invalidateSub(size_t, const GLenum *, const gl::Rectangle &)
{
// No-op in D3D
return gl::Error(GL_NO_ERROR);
}
}
......@@ -42,6 +42,9 @@ class FramebufferD3D : public FramebufferImpl
FramebufferD3D(RendererD3D *renderer);
virtual ~FramebufferD3D();
gl::Error invalidate(size_t count, const GLenum *attachments) override;
gl::Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &area) override;
private:
RendererD3D *const mRenderer;
};
......
......@@ -182,11 +182,6 @@ RenderTarget11 *RenderTarget11::makeRenderTarget11(RenderTarget *target)
return static_cast<RenderTarget11*>(target);
}
void RenderTarget11::invalidate(GLint x, GLint y, GLsizei width, GLsizei height)
{
// Currently a no-op
}
TextureRenderTarget11::TextureRenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples)
: mWidth(width),
......
......@@ -24,8 +24,6 @@ class RenderTarget11 : public RenderTarget
static RenderTarget11 *makeRenderTarget11(RenderTarget *renderTarget);
void invalidate(GLint x, GLint y, GLsizei width, GLsizei height) override;
virtual ID3D11Resource *getTexture() const = 0;
virtual ID3D11RenderTargetView *getRenderTargetView() const = 0;
virtual ID3D11DepthStencilView *getDepthStencilView() const = 0;
......
......@@ -22,11 +22,6 @@ RenderTarget9 *RenderTarget9::makeRenderTarget9(RenderTarget *target)
return static_cast<RenderTarget9*>(target);
}
void RenderTarget9::invalidate(GLint x, GLint y, GLsizei width, GLsizei height)
{
// Currently a no-op
}
// TODO: AddRef the incoming surface to take ownership instead of expecting that its ref is being given.
TextureRenderTarget9::TextureRenderTarget9(IDirect3DSurface9 *surface, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,
GLsizei samples)
......
......@@ -25,8 +25,6 @@ class RenderTarget9 : public RenderTarget
static RenderTarget9 *makeRenderTarget9(RenderTarget *renderTarget);
void invalidate(GLint x, GLint y, GLsizei width, GLsizei height) override;
virtual IDirect3DSurface9 *getSurface() = 0;
private:
......
......@@ -8204,7 +8204,7 @@ void GL_APIENTRY glInvalidateFramebuffer(GLenum target, GLsizei numAttachments,
if (framebuffer->completeness(context->getData()) == GL_FRAMEBUFFER_COMPLETE)
{
gl::Error error = framebuffer->invalidate(context->getCaps(), numAttachments, attachments);
gl::Error error = framebuffer->invalidate(numAttachments, attachments);
if (error.isError())
{
context->recordError(error);
......@@ -8239,7 +8239,8 @@ void GL_APIENTRY glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachment
if (framebuffer->completeness(context->getData()) == GL_FRAMEBUFFER_COMPLETE)
{
gl::Error error = framebuffer->invalidateSub(numAttachments, attachments, x, y, width, height);
gl::Rectangle area(x, y, width, height);
gl::Error error = framebuffer->invalidateSub(numAttachments, attachments, area);
if (error.isError())
{
context->recordError(error);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment