diff options
Diffstat (limited to 'gfx/angle/src/libANGLE/Framebuffer.h')
-rwxr-xr-x | gfx/angle/src/libANGLE/Framebuffer.h | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/gfx/angle/src/libANGLE/Framebuffer.h b/gfx/angle/src/libANGLE/Framebuffer.h new file mode 100755 index 000000000..db0d6215f --- /dev/null +++ b/gfx/angle/src/libANGLE/Framebuffer.h @@ -0,0 +1,235 @@ +// +// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// Framebuffer.h: Defines the gl::Framebuffer class. Implements GL framebuffer +// objects and related functionality. [OpenGL ES 2.0.24] section 4.4 page 105. + +#ifndef LIBANGLE_FRAMEBUFFER_H_ +#define LIBANGLE_FRAMEBUFFER_H_ + +#include <vector> + +#include "common/Optional.h" +#include "common/angleutils.h" +#include "libANGLE/Constants.h" +#include "libANGLE/Debug.h" +#include "libANGLE/Error.h" +#include "libANGLE/FramebufferAttachment.h" +#include "libANGLE/RefCountObject.h" +#include "libANGLE/signal_utils.h" + +namespace rx +{ +class ContextImpl; +class GLImplFactory; +class FramebufferImpl; +class RenderbufferImpl; +class SurfaceImpl; +} + +namespace egl +{ +class Surface; +} + +namespace gl +{ +class Context; +class Framebuffer; +class Renderbuffer; +class State; +class Texture; +class TextureCapsMap; +struct Caps; +class ContextState; +struct Extensions; +struct ImageIndex; +struct Rectangle; + +class FramebufferState final : angle::NonCopyable +{ + public: + FramebufferState(); + explicit FramebufferState(const Caps &caps); + ~FramebufferState(); + + const std::string &getLabel(); + + const FramebufferAttachment *getAttachment(GLenum attachment) const; + const FramebufferAttachment *getReadAttachment() const; + const FramebufferAttachment *getFirstColorAttachment() const; + const FramebufferAttachment *getDepthOrStencilAttachment() const; + const FramebufferAttachment *getColorAttachment(size_t colorAttachment) const; + const FramebufferAttachment *getDepthAttachment() const; + const FramebufferAttachment *getStencilAttachment() const; + const FramebufferAttachment *getDepthStencilAttachment() const; + + const std::vector<GLenum> &getDrawBufferStates() const { return mDrawBufferStates; } + GLenum getReadBufferState() const { return mReadBufferState; } + const std::vector<FramebufferAttachment> &getColorAttachments() const + { + return mColorAttachments; + } + + bool attachmentsHaveSameDimensions() const; + bool colorAttachmentsAreUniqueImages() const; + + const FramebufferAttachment *getDrawBuffer(size_t drawBufferIdx) const; + size_t getDrawBufferCount() const; + + private: + friend class Framebuffer; + + std::string mLabel; + + std::vector<FramebufferAttachment> mColorAttachments; + FramebufferAttachment mDepthAttachment; + FramebufferAttachment mStencilAttachment; + + std::vector<GLenum> mDrawBufferStates; + GLenum mReadBufferState; +}; + +class Framebuffer final : public LabeledObject, public angle::SignalReceiver +{ + public: + Framebuffer(const Caps &caps, rx::GLImplFactory *factory, GLuint id); + Framebuffer(rx::SurfaceImpl *surface); + virtual ~Framebuffer(); + + void setLabel(const std::string &label) override; + const std::string &getLabel() const override; + + rx::FramebufferImpl *getImplementation() const { return mImpl; } + + GLuint id() const { return mId; } + + void setAttachment(GLenum type, + GLenum binding, + const ImageIndex &textureIndex, + FramebufferAttachmentObject *resource); + void resetAttachment(GLenum binding); + + void detachTexture(GLuint texture); + void detachRenderbuffer(GLuint renderbuffer); + + const FramebufferAttachment *getColorbuffer(size_t colorAttachment) const; + const FramebufferAttachment *getDepthbuffer() const; + const FramebufferAttachment *getStencilbuffer() const; + const FramebufferAttachment *getDepthStencilBuffer() const; + const FramebufferAttachment *getDepthOrStencilbuffer() const; + const FramebufferAttachment *getReadColorbuffer() const; + GLenum getReadColorbufferType() const; + const FramebufferAttachment *getFirstColorbuffer() const; + + const FramebufferAttachment *getAttachment(GLenum attachment) const; + + size_t getDrawbufferStateCount() const; + GLenum getDrawBufferState(size_t drawBuffer) const; + const std::vector<GLenum> &getDrawBufferStates() const; + void setDrawBuffers(size_t count, const GLenum *buffers); + const FramebufferAttachment *getDrawBuffer(size_t drawBuffer) const; + bool hasEnabledDrawBuffer() const; + + GLenum getReadBufferState() const; + void setReadBuffer(GLenum buffer); + + size_t getNumColorBuffers() const; + bool hasDepth() const; + bool hasStencil() const; + + bool usingExtendedDrawBuffers() const; + + // This method calls checkStatus. + int getSamples(const ContextState &state); + GLenum checkStatus(const ContextState &state); + + // Helper for checkStatus == GL_FRAMEBUFFER_COMPLETE. + bool complete(const ContextState &state); + + bool hasValidDepthStencil() const; + + Error discard(size_t count, const GLenum *attachments); + Error invalidate(size_t count, const GLenum *attachments); + Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &area); + + Error clear(rx::ContextImpl *context, GLbitfield mask); + Error clearBufferfv(rx::ContextImpl *context, + GLenum buffer, + GLint drawbuffer, + const GLfloat *values); + Error clearBufferuiv(rx::ContextImpl *context, + GLenum buffer, + GLint drawbuffer, + const GLuint *values); + Error clearBufferiv(rx::ContextImpl *context, + GLenum buffer, + GLint drawbuffer, + const GLint *values); + Error clearBufferfi(rx::ContextImpl *context, + GLenum buffer, + GLint drawbuffer, + GLfloat depth, + GLint stencil); + + GLenum getImplementationColorReadFormat() const; + GLenum getImplementationColorReadType() const; + Error readPixels(rx::ContextImpl *context, + const gl::Rectangle &area, + GLenum format, + GLenum type, + GLvoid *pixels) const; + + Error blit(rx::ContextImpl *context, + const Rectangle &sourceArea, + const Rectangle &destArea, + GLbitfield mask, + GLenum filter); + + enum DirtyBitType + { + DIRTY_BIT_COLOR_ATTACHMENT_0, + DIRTY_BIT_COLOR_ATTACHMENT_MAX = + DIRTY_BIT_COLOR_ATTACHMENT_0 + gl::IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS, + DIRTY_BIT_DEPTH_ATTACHMENT = DIRTY_BIT_COLOR_ATTACHMENT_MAX, + DIRTY_BIT_STENCIL_ATTACHMENT, + DIRTY_BIT_DRAW_BUFFERS, + DIRTY_BIT_READ_BUFFER, + DIRTY_BIT_UNKNOWN, + DIRTY_BIT_MAX = DIRTY_BIT_UNKNOWN, + }; + + typedef std::bitset<DIRTY_BIT_MAX> DirtyBits; + bool hasAnyDirtyBit() const { return mDirtyBits.any(); } + + void syncState(); + + // angle::SignalReceiver implementation + void signal(angle::SignalToken token) override; + + private: + void detachResourceById(GLenum resourceType, GLuint resourceId); + void detachMatchingAttachment(FramebufferAttachment *attachment, + GLenum matchType, + GLuint matchId, + size_t dirtyBit); + GLenum checkStatusImpl(const ContextState &state); + + FramebufferState mState; + rx::FramebufferImpl *mImpl; + GLuint mId; + + Optional<GLenum> mCachedStatus; + std::vector<angle::ChannelBinding> mDirtyColorAttachmentBindings; + angle::ChannelBinding mDirtyDepthAttachmentBinding; + angle::ChannelBinding mDirtyStencilAttachmentBinding; + + DirtyBits mDirtyBits; +}; + +} // namespace gl + +#endif // LIBANGLE_FRAMEBUFFER_H_ |