WebGLFramebuffer.h [plain text]
#pragma once
#include "WebGLContextObject.h"
#include "WebGLSharedObject.h"
#include <wtf/RefCounted.h>
namespace WebCore {
class WebGLRenderbuffer;
class WebGLTexture;
class WebGLFramebuffer final : public WebGLContextObject {
public:
class WebGLAttachment : public RefCounted<WebGLAttachment> {
public:
virtual ~WebGLAttachment();
virtual GC3Dsizei getWidth() const = 0;
virtual GC3Dsizei getHeight() const = 0;
virtual GC3Denum getFormat() const = 0;
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(GraphicsContext3D*) = 0;
virtual void attach(GraphicsContext3D*, GC3Denum attachment) = 0;
virtual void unattach(GraphicsContext3D*, GC3Denum attachment) = 0;
protected:
WebGLAttachment();
};
virtual ~WebGLFramebuffer();
static Ref<WebGLFramebuffer> create(WebGLRenderingContextBase&);
void setAttachmentForBoundFramebuffer(GC3Denum attachment, GC3Denum texTarget, WebGLTexture*, GC3Dint level);
void setAttachmentForBoundFramebuffer(GC3Denum attachment, WebGLRenderbuffer*);
void removeAttachmentFromBoundFramebuffer(WebGLSharedObject*);
void removeAttachmentFromBoundFramebuffer(GC3Denum);
WebGLSharedObject* getAttachmentObject(GC3Denum) const;
GC3Denum getColorBufferFormat() const;
GC3Dsizei getColorBufferWidth() const;
GC3Dsizei getColorBufferHeight() const;
bool onAccess(GraphicsContext3D*, const char** reason);
GC3Denum checkStatus(const char** reason) const;
bool hasEverBeenBound() const { return object() && m_hasEverBeenBound; }
void setHasEverBeenBound() { m_hasEverBeenBound = true; }
bool hasStencilBuffer() const;
void drawBuffers(const Vector<GC3Denum>& bufs);
GC3Denum getDrawBuffer(GC3Denum);
protected:
WebGLFramebuffer(WebGLRenderingContextBase&);
void deleteObjectImpl(GraphicsContext3D*, Platform3DObject) override;
private:
WebGLAttachment* getAttachment(GC3Denum) const;
bool initializeAttachments(GraphicsContext3D*, const char** reason);
bool isBound() const;
void attach(GC3Denum attachment, GC3Denum attachmentPoint);
void drawBuffersIfNecessary(bool force);
typedef WTF::HashMap<GC3Denum, RefPtr<WebGLAttachment>> AttachmentMap;
AttachmentMap m_attachments;
bool m_hasEverBeenBound;
Vector<GC3Denum> m_drawBuffers;
Vector<GC3Denum> m_filteredDrawBuffers;
};
}