// // 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 #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 &getDrawBufferStates() const { return mDrawBufferStates; } GLenum getReadBufferState() const { return mReadBufferState; } const std::vector &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 mColorAttachments; FramebufferAttachment mDepthAttachment; FramebufferAttachment mStencilAttachment; std::vector 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 &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 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 mCachedStatus; std::vector mDirtyColorAttachmentBindings; angle::ChannelBinding mDirtyDepthAttachmentBinding; angle::ChannelBinding mDirtyStencilAttachmentBinding; DirtyBits mDirtyBits; }; } // namespace gl #endif // LIBANGLE_FRAMEBUFFER_H_