WebGLFramebuffer.h [plain text]
#pragma once
#if ENABLE(WEBGL)
#include "WebGLContextObject.h"
#include "WebGLSharedObject.h"
#include <wtf/HashMap.h>
#include <wtf/RefCounted.h>
#include <wtf/Vector.h>
namespace JSC {
class SlotVisitor;
}
namespace WTF {
class AbstractLocker;
}
namespace WebCore {
class WebGLRenderbuffer;
class WebGLTexture;
class WebGLFramebuffer final : public WebGLContextObject {
public:
class WebGLAttachment : public RefCounted<WebGLAttachment> {
public:
virtual ~WebGLAttachment();
#if !USE(ANGLE)
virtual GCGLsizei getWidth() const = 0;
virtual GCGLsizei getHeight() const = 0;
virtual GCGLenum getFormat() const = 0;
#endif
virtual WebGLSharedObject* getObject() const = 0;
virtual bool isSharedObject(WebGLSharedObject*) const = 0;
virtual bool isValid() const = 0;
virtual bool isInitialized() const = 0;
virtual void setInitialized() = 0;
virtual void onDetached(const WTF::AbstractLocker&, GraphicsContextGL*) = 0;
virtual void attach(GraphicsContextGL*, GCGLenum target, GCGLenum attachment) = 0;
virtual void unattach(GraphicsContextGL*, GCGLenum target, GCGLenum attachment) = 0;
virtual void addMembersToOpaqueRoots(const WTF::AbstractLocker&, JSC::SlotVisitor&) = 0;
protected:
WebGLAttachment();
};
virtual ~WebGLFramebuffer();
static Ref<WebGLFramebuffer> create(WebGLRenderingContextBase&);
void setAttachmentForBoundFramebuffer(GCGLenum target, GCGLenum attachment, GCGLenum texTarget, WebGLTexture*, GCGLint level, GCGLint layer);
void setAttachmentForBoundFramebuffer(GCGLenum target, GCGLenum attachment, WebGLRenderbuffer*);
void removeAttachmentFromBoundFramebuffer(const WTF::AbstractLocker&, GCGLenum target, WebGLSharedObject*);
void removeAttachmentFromBoundFramebuffer(const WTF::AbstractLocker&, GCGLenum target, GCGLenum attachment);
WebGLSharedObject* getAttachmentObject(GCGLenum) const;
#if !USE(ANGLE)
GCGLenum getColorBufferFormat() const;
GCGLsizei getColorBufferWidth() const;
GCGLsizei getColorBufferHeight() const;
bool onAccess(GraphicsContextGL*, const char** reason);
GCGLenum checkStatus(const char** reason) const;
#endif
bool hasEverBeenBound() const { return object() && m_hasEverBeenBound; }
void setHasEverBeenBound() { m_hasEverBeenBound = true; }
bool hasStencilBuffer() const;
void drawBuffers(const Vector<GCGLenum>& bufs);
GCGLenum getDrawBuffer(GCGLenum);
void addMembersToOpaqueRoots(const WTF::AbstractLocker&, JSC::SlotVisitor&);
private:
WebGLFramebuffer(WebGLRenderingContextBase&);
void deleteObjectImpl(const WTF::AbstractLocker&, GraphicsContextGL*, PlatformGLObject) override;
WebGLAttachment* getAttachment(GCGLenum) const;
#if !USE(ANGLE)
bool initializeAttachments(GraphicsContextGL*, const char** reason);
#endif
bool isBound(GCGLenum target) const;
void attach(GCGLenum target, GCGLenum attachment, GCGLenum attachmentPoint);
void drawBuffersIfNecessary(bool force);
void setAttachmentInternal(GCGLenum attachment, GCGLenum texTarget, WebGLTexture*, GCGLint level, GCGLint layer);
void setAttachmentInternal(GCGLenum attachment, WebGLRenderbuffer*);
void removeAttachmentInternal(const WTF::AbstractLocker&, GCGLenum attachment);
typedef WTF::HashMap<GCGLenum, RefPtr<WebGLAttachment>> AttachmentMap;
AttachmentMap m_attachments;
bool m_hasEverBeenBound;
Vector<GCGLenum> m_drawBuffers;
Vector<GCGLenum> m_filteredDrawBuffers;
};
}
#endif