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 ...@@ -530,35 +530,14 @@ GLenum Framebuffer::completeness(const gl::Data &data) const
return GL_FRAMEBUFFER_COMPLETE; 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 mImpl->invalidate(count, attachments);
return invalidateSub(numAttachments, attachments, 0, 0, maxDimension, maxDimension);
} }
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) return mImpl->invalidateSub(count, attachments, area);
{
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);
} }
int Framebuffer::getSamples(const gl::Data &data) const int Framebuffer::getSamples(const gl::Data &data) const
......
...@@ -36,6 +36,7 @@ struct Caps; ...@@ -36,6 +36,7 @@ struct Caps;
struct Extensions; struct Extensions;
class TextureCapsMap; class TextureCapsMap;
struct Data; struct Data;
struct Rectangle;
typedef std::vector<FramebufferAttachment *> ColorbufferInfo; typedef std::vector<FramebufferAttachment *> ColorbufferInfo;
...@@ -80,8 +81,8 @@ class Framebuffer ...@@ -80,8 +81,8 @@ class Framebuffer
GLenum completeness(const gl::Data &data) const; GLenum completeness(const gl::Data &data) const;
bool hasValidDepthStencil() const; bool hasValidDepthStencil() const;
Error invalidate(const Caps &caps, GLsizei numAttachments, const GLenum *attachments); Error invalidate(size_t count, const GLenum *attachments);
Error invalidateSub(GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &area);
// Use this method to retrieve the color buffer map when doing rendering. // Use this method to retrieve the color buffer map when doing rendering.
// It will apply a workaround for poor shader performance on some systems // It will apply a workaround for poor shader performance on some systems
......
...@@ -9,8 +9,15 @@ ...@@ -9,8 +9,15 @@
#ifndef LIBANGLE_RENDERER_FRAMBUFFERIMPL_H_ #ifndef LIBANGLE_RENDERER_FRAMBUFFERIMPL_H_
#define LIBANGLE_RENDERER_FRAMBUFFERIMPL_H_ #define LIBANGLE_RENDERER_FRAMBUFFERIMPL_H_
#include "libANGLE/Error.h"
#include "angle_gl.h" #include "angle_gl.h"
namespace gl
{
struct Rectangle;
}
namespace rx namespace rx
{ {
...@@ -30,6 +37,9 @@ class FramebufferImpl ...@@ -30,6 +37,9 @@ class FramebufferImpl
{ {
public: public:
virtual ~FramebufferImpl() {}; 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 ...@@ -29,8 +29,6 @@ class RenderTarget
virtual GLsizei getSamples() const = 0; virtual GLsizei getSamples() const = 0;
gl::Extents getExtents() const { return gl::Extents(getWidth(), getHeight(), getDepth()); } 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; virtual unsigned int getSerial() const;
static unsigned int issueSerials(unsigned int count); static unsigned int issueSerials(unsigned int count);
......
...@@ -71,4 +71,16 @@ FramebufferD3D::~FramebufferD3D() ...@@ -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 ...@@ -42,6 +42,9 @@ class FramebufferD3D : public FramebufferImpl
FramebufferD3D(RendererD3D *renderer); FramebufferD3D(RendererD3D *renderer);
virtual ~FramebufferD3D(); 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: private:
RendererD3D *const mRenderer; RendererD3D *const mRenderer;
}; };
......
...@@ -182,11 +182,6 @@ RenderTarget11 *RenderTarget11::makeRenderTarget11(RenderTarget *target) ...@@ -182,11 +182,6 @@ RenderTarget11 *RenderTarget11::makeRenderTarget11(RenderTarget *target)
return static_cast<RenderTarget11*>(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, TextureRenderTarget11::TextureRenderTarget11(ID3D11RenderTargetView *rtv, ID3D11Resource *resource, ID3D11ShaderResourceView *srv,
GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples) GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei samples)
: mWidth(width), : mWidth(width),
......
...@@ -24,8 +24,6 @@ class RenderTarget11 : public RenderTarget ...@@ -24,8 +24,6 @@ class RenderTarget11 : public RenderTarget
static RenderTarget11 *makeRenderTarget11(RenderTarget *renderTarget); static RenderTarget11 *makeRenderTarget11(RenderTarget *renderTarget);
void invalidate(GLint x, GLint y, GLsizei width, GLsizei height) override;
virtual ID3D11Resource *getTexture() const = 0; virtual ID3D11Resource *getTexture() const = 0;
virtual ID3D11RenderTargetView *getRenderTargetView() const = 0; virtual ID3D11RenderTargetView *getRenderTargetView() const = 0;
virtual ID3D11DepthStencilView *getDepthStencilView() const = 0; virtual ID3D11DepthStencilView *getDepthStencilView() const = 0;
......
...@@ -22,11 +22,6 @@ RenderTarget9 *RenderTarget9::makeRenderTarget9(RenderTarget *target) ...@@ -22,11 +22,6 @@ RenderTarget9 *RenderTarget9::makeRenderTarget9(RenderTarget *target)
return static_cast<RenderTarget9*>(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. // 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, TextureRenderTarget9::TextureRenderTarget9(IDirect3DSurface9 *surface, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth,
GLsizei samples) GLsizei samples)
......
...@@ -25,8 +25,6 @@ class RenderTarget9 : public RenderTarget ...@@ -25,8 +25,6 @@ class RenderTarget9 : public RenderTarget
static RenderTarget9 *makeRenderTarget9(RenderTarget *renderTarget); static RenderTarget9 *makeRenderTarget9(RenderTarget *renderTarget);
void invalidate(GLint x, GLint y, GLsizei width, GLsizei height) override;
virtual IDirect3DSurface9 *getSurface() = 0; virtual IDirect3DSurface9 *getSurface() = 0;
private: private:
......
...@@ -8204,7 +8204,7 @@ void GL_APIENTRY glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, ...@@ -8204,7 +8204,7 @@ void GL_APIENTRY glInvalidateFramebuffer(GLenum target, GLsizei numAttachments,
if (framebuffer->completeness(context->getData()) == GL_FRAMEBUFFER_COMPLETE) 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()) if (error.isError())
{ {
context->recordError(error); context->recordError(error);
...@@ -8239,7 +8239,8 @@ void GL_APIENTRY glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachment ...@@ -8239,7 +8239,8 @@ void GL_APIENTRY glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachment
if (framebuffer->completeness(context->getData()) == GL_FRAMEBUFFER_COMPLETE) 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()) if (error.isError())
{ {
context->recordError(error); 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