2012-10-04 13:35:54 -07:00
|
|
|
|
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
2012-12-09 03:58:41 -08:00
|
|
|
|
#include "WebGLFramebuffer.h"
|
2014-07-14 16:55:33 -07:00
|
|
|
|
|
2014-11-13 20:03:50 -08:00
|
|
|
|
#include "GLContext.h"
|
|
|
|
|
#include "mozilla/dom/WebGLRenderingContextBinding.h"
|
2014-07-14 16:55:33 -07:00
|
|
|
|
#include "WebGLContext.h"
|
|
|
|
|
#include "WebGLContextUtils.h"
|
2013-06-21 16:44:17 -07:00
|
|
|
|
#include "WebGLExtensions.h"
|
2013-06-10 13:00:35 -07:00
|
|
|
|
#include "WebGLRenderbuffer.h"
|
2013-06-21 16:44:17 -07:00
|
|
|
|
#include "WebGLTexture.h"
|
2014-07-14 16:55:33 -07:00
|
|
|
|
|
2014-11-13 20:03:50 -08:00
|
|
|
|
namespace mozilla {
|
2012-10-04 13:35:54 -07:00
|
|
|
|
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::WebGLFBAttachPoint(WebGLFramebuffer* fb,
|
|
|
|
|
FBAttachment attachmentPoint)
|
2015-03-24 16:00:28 -07:00
|
|
|
|
: mFB(fb)
|
|
|
|
|
, mAttachmentPoint(attachmentPoint)
|
2014-09-18 16:14:22 -07:00
|
|
|
|
, mTexImageTarget(LOCAL_GL_NONE)
|
2015-03-24 16:00:28 -07:00
|
|
|
|
{ }
|
2014-07-30 12:52:07 -07:00
|
|
|
|
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::~WebGLFBAttachPoint()
|
2014-07-30 12:52:07 -07:00
|
|
|
|
{
|
2015-03-24 16:00:28 -07:00
|
|
|
|
MOZ_ASSERT(!mRenderbufferPtr);
|
|
|
|
|
MOZ_ASSERT(!mTexturePtr);
|
2014-07-30 12:52:07 -07:00
|
|
|
|
}
|
|
|
|
|
|
2012-12-09 03:58:41 -08:00
|
|
|
|
bool
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::IsDeleteRequested() const
|
2014-01-22 19:59:34 -08:00
|
|
|
|
{
|
2012-12-09 03:58:41 -08:00
|
|
|
|
return Texture() ? Texture()->IsDeleteRequested()
|
|
|
|
|
: Renderbuffer() ? Renderbuffer()->IsDeleteRequested()
|
|
|
|
|
: false;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-23 10:48:27 -07:00
|
|
|
|
bool
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::IsDefined() const
|
2014-09-23 10:48:27 -07:00
|
|
|
|
{
|
|
|
|
|
return Renderbuffer() ||
|
|
|
|
|
(Texture() && Texture()->HasImageInfoAt(ImageTarget(), 0));
|
|
|
|
|
}
|
|
|
|
|
|
2012-12-09 03:58:41 -08:00
|
|
|
|
bool
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::HasAlpha() const
|
2014-01-22 19:59:34 -08:00
|
|
|
|
{
|
2014-02-13 15:07:59 -08:00
|
|
|
|
MOZ_ASSERT(HasImage());
|
|
|
|
|
|
2014-11-13 20:03:50 -08:00
|
|
|
|
if (Texture() &&
|
|
|
|
|
Texture()->HasImageInfoAt(mTexImageTarget, mTexImageLevel))
|
|
|
|
|
{
|
|
|
|
|
return FormatHasAlpha(Texture()->ImageInfoAt(mTexImageTarget,
|
|
|
|
|
mTexImageLevel).EffectiveInternalFormat());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Renderbuffer())
|
2014-09-23 10:48:27 -07:00
|
|
|
|
return FormatHasAlpha(Renderbuffer()->InternalFormat());
|
2014-11-13 20:03:50 -08:00
|
|
|
|
|
|
|
|
|
return false;
|
2012-12-09 03:58:41 -08:00
|
|
|
|
}
|
|
|
|
|
|
2014-08-20 13:38:42 -07:00
|
|
|
|
GLenum
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFramebuffer::GetFormatForAttachment(const WebGLFBAttachPoint& attachment) const
|
2014-08-20 13:38:42 -07:00
|
|
|
|
{
|
|
|
|
|
MOZ_ASSERT(attachment.IsDefined());
|
|
|
|
|
MOZ_ASSERT(attachment.Texture() || attachment.Renderbuffer());
|
|
|
|
|
|
|
|
|
|
if (attachment.Texture()) {
|
|
|
|
|
const WebGLTexture& tex = *attachment.Texture();
|
2014-09-18 16:14:22 -07:00
|
|
|
|
MOZ_ASSERT(tex.HasImageInfoAt(attachment.ImageTarget(), 0));
|
2014-08-20 13:38:42 -07:00
|
|
|
|
|
2014-11-13 20:03:50 -08:00
|
|
|
|
const WebGLTexture::ImageInfo& imgInfo = tex.ImageInfoAt(attachment.ImageTarget(),
|
|
|
|
|
0);
|
2014-10-07 16:52:58 -07:00
|
|
|
|
return imgInfo.EffectiveInternalFormat().get();
|
2014-08-20 13:38:42 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (attachment.Renderbuffer())
|
|
|
|
|
return attachment.Renderbuffer()->InternalFormat();
|
|
|
|
|
|
|
|
|
|
return LOCAL_GL_NONE;
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-07 16:52:58 -07:00
|
|
|
|
TexInternalFormat
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::EffectiveInternalFormat() const
|
2014-03-07 13:26:17 -08:00
|
|
|
|
{
|
2014-05-06 20:11:18 -07:00
|
|
|
|
const WebGLTexture* tex = Texture();
|
|
|
|
|
if (tex && tex->HasImageInfoAt(mTexImageTarget, mTexImageLevel)) {
|
2014-11-13 20:03:50 -08:00
|
|
|
|
return tex->ImageInfoAt(mTexImageTarget,
|
|
|
|
|
mTexImageLevel).EffectiveInternalFormat();
|
2014-03-07 13:26:17 -08:00
|
|
|
|
}
|
|
|
|
|
|
2014-05-06 20:11:18 -07:00
|
|
|
|
const WebGLRenderbuffer* rb = Renderbuffer();
|
2014-11-13 20:03:50 -08:00
|
|
|
|
if (rb)
|
2014-10-07 16:52:58 -07:00
|
|
|
|
return rb->InternalFormat();
|
2014-03-07 13:26:17 -08:00
|
|
|
|
|
2014-10-07 16:52:58 -07:00
|
|
|
|
return LOCAL_GL_NONE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::IsReadableFloat() const
|
2014-10-07 16:52:58 -07:00
|
|
|
|
{
|
|
|
|
|
TexInternalFormat internalformat = EffectiveInternalFormat();
|
|
|
|
|
MOZ_ASSERT(internalformat != LOCAL_GL_NONE);
|
|
|
|
|
TexType type = TypeFromInternalFormat(internalformat);
|
|
|
|
|
return type == LOCAL_GL_FLOAT ||
|
2015-02-24 14:09:09 -08:00
|
|
|
|
type == LOCAL_GL_HALF_FLOAT_OES ||
|
2014-10-07 16:52:58 -07:00
|
|
|
|
type == LOCAL_GL_HALF_FLOAT;
|
2014-03-07 13:26:17 -08:00
|
|
|
|
}
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
static void
|
2015-07-14 17:37:28 -07:00
|
|
|
|
UnmarkAttachment(WebGLFBAttachPoint& attachment)
|
2015-03-24 16:00:28 -07:00
|
|
|
|
{
|
|
|
|
|
WebGLFramebufferAttachable* maybe = attachment.Texture();
|
|
|
|
|
if (!maybe)
|
|
|
|
|
maybe = attachment.Renderbuffer();
|
|
|
|
|
|
|
|
|
|
if (maybe)
|
|
|
|
|
maybe->UnmarkAttachment(attachment);
|
|
|
|
|
}
|
|
|
|
|
|
2012-12-09 03:58:41 -08:00
|
|
|
|
void
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::SetTexImage(WebGLTexture* tex, TexImageTarget target,
|
2015-03-24 16:00:28 -07:00
|
|
|
|
GLint level)
|
2014-01-22 19:59:34 -08:00
|
|
|
|
{
|
2015-03-24 16:00:28 -07:00
|
|
|
|
mFB->InvalidateFramebufferStatus();
|
|
|
|
|
|
|
|
|
|
UnmarkAttachment(*this);
|
|
|
|
|
|
2012-12-09 03:58:41 -08:00
|
|
|
|
mTexturePtr = tex;
|
|
|
|
|
mRenderbufferPtr = nullptr;
|
2013-10-01 17:30:38 -07:00
|
|
|
|
mTexImageTarget = target;
|
|
|
|
|
mTexImageLevel = level;
|
2014-03-11 16:10:59 -07:00
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (tex)
|
|
|
|
|
tex->MarkAttachment(*this);
|
2014-03-11 16:10:59 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::SetRenderbuffer(WebGLRenderbuffer* rb)
|
2014-03-11 16:10:59 -07:00
|
|
|
|
{
|
2015-03-24 16:00:28 -07:00
|
|
|
|
mFB->InvalidateFramebufferStatus();
|
|
|
|
|
|
|
|
|
|
UnmarkAttachment(*this);
|
|
|
|
|
|
2014-03-11 16:10:59 -07:00
|
|
|
|
mTexturePtr = nullptr;
|
|
|
|
|
mRenderbufferPtr = rb;
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (rb)
|
|
|
|
|
rb->MarkAttachment(*this);
|
2012-12-09 03:58:41 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::HasUninitializedImageData() const
|
2014-01-22 19:59:34 -08:00
|
|
|
|
{
|
|
|
|
|
if (!HasImage())
|
2013-10-11 06:16:43 -07:00
|
|
|
|
return false;
|
2014-01-22 19:59:34 -08:00
|
|
|
|
|
2014-11-13 20:03:50 -08:00
|
|
|
|
if (Renderbuffer())
|
2014-01-22 19:59:34 -08:00
|
|
|
|
return Renderbuffer()->HasUninitializedImageData();
|
2014-02-13 15:07:59 -08:00
|
|
|
|
|
|
|
|
|
if (Texture()) {
|
2014-01-22 19:59:34 -08:00
|
|
|
|
MOZ_ASSERT(Texture()->HasImageInfoAt(mTexImageTarget, mTexImageLevel));
|
2014-11-13 20:03:50 -08:00
|
|
|
|
return Texture()->ImageInfoAt(mTexImageTarget,
|
|
|
|
|
mTexImageLevel).HasUninitializedImageData();
|
2013-10-11 06:16:43 -07:00
|
|
|
|
}
|
2014-01-22 19:59:34 -08:00
|
|
|
|
|
|
|
|
|
MOZ_ASSERT(false, "Should not get here.");
|
|
|
|
|
return false;
|
2013-10-11 06:16:43 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::SetImageDataStatus(WebGLImageDataStatus newStatus)
|
2014-01-22 19:59:34 -08:00
|
|
|
|
{
|
|
|
|
|
if (!HasImage())
|
|
|
|
|
return;
|
|
|
|
|
|
2014-02-13 15:07:59 -08:00
|
|
|
|
if (Renderbuffer()) {
|
|
|
|
|
Renderbuffer()->SetImageDataStatus(newStatus);
|
2014-01-22 19:59:34 -08:00
|
|
|
|
return;
|
2014-02-13 15:07:59 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Texture()) {
|
2014-11-13 20:03:50 -08:00
|
|
|
|
Texture()->SetImageDataStatus(mTexImageTarget, mTexImageLevel,
|
|
|
|
|
newStatus);
|
2014-01-22 19:59:34 -08:00
|
|
|
|
return;
|
2013-10-11 06:16:43 -07:00
|
|
|
|
}
|
2014-01-22 19:59:34 -08:00
|
|
|
|
|
|
|
|
|
MOZ_ASSERT(false, "Should not get here.");
|
2012-12-09 03:58:41 -08:00
|
|
|
|
}
|
|
|
|
|
|
2014-01-22 19:59:34 -08:00
|
|
|
|
bool
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::HasImage() const
|
2014-01-22 19:59:34 -08:00
|
|
|
|
{
|
2013-10-01 17:30:38 -07:00
|
|
|
|
if (Texture() && Texture()->HasImageInfoAt(mTexImageTarget, mTexImageLevel))
|
2014-01-22 19:59:34 -08:00
|
|
|
|
return true;
|
2014-02-13 15:07:59 -08:00
|
|
|
|
|
|
|
|
|
if (Renderbuffer())
|
2014-01-22 19:59:34 -08:00
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
return false;
|
2012-12-09 03:58:41 -08:00
|
|
|
|
}
|
|
|
|
|
|
2014-01-22 19:59:34 -08:00
|
|
|
|
const WebGLRectangleObject&
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::RectangleObject() const
|
2014-01-22 19:59:34 -08:00
|
|
|
|
{
|
2014-11-13 20:03:50 -08:00
|
|
|
|
MOZ_ASSERT(HasImage(),
|
|
|
|
|
"Make sure it has an image before requesting the rectangle.");
|
2014-01-22 19:59:34 -08:00
|
|
|
|
|
|
|
|
|
if (Texture()) {
|
|
|
|
|
MOZ_ASSERT(Texture()->HasImageInfoAt(mTexImageTarget, mTexImageLevel));
|
|
|
|
|
return Texture()->ImageInfoAt(mTexImageTarget, mTexImageLevel);
|
2014-02-13 15:07:59 -08:00
|
|
|
|
}
|
|
|
|
|
|
2014-11-13 20:03:50 -08:00
|
|
|
|
if (Renderbuffer())
|
2014-01-22 19:59:34 -08:00
|
|
|
|
return *Renderbuffer();
|
|
|
|
|
|
|
|
|
|
MOZ_CRASH("Should not get here.");
|
2012-12-09 03:58:41 -08:00
|
|
|
|
}
|
|
|
|
|
|
2014-11-13 20:03:50 -08:00
|
|
|
|
// The following IsValidFBOTextureXXX functions check the internal format that
|
|
|
|
|
// is used by GL or GL ES texture formats. This corresponds to the state that
|
|
|
|
|
// is stored in WebGLTexture::ImageInfo::InternalFormat()
|
2014-01-23 19:53:53 -08:00
|
|
|
|
|
|
|
|
|
static inline bool
|
2014-10-07 16:52:58 -07:00
|
|
|
|
IsValidFBOTextureDepthFormat(GLenum internalformat)
|
2014-01-23 22:28:47 -08:00
|
|
|
|
{
|
2014-10-07 16:52:58 -07:00
|
|
|
|
return IsGLDepthFormat(internalformat);
|
2014-01-23 19:53:53 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline bool
|
2014-10-07 16:52:58 -07:00
|
|
|
|
IsValidFBOTextureDepthStencilFormat(GLenum internalformat)
|
2014-01-23 22:28:47 -08:00
|
|
|
|
{
|
2014-10-07 16:52:58 -07:00
|
|
|
|
return IsGLDepthStencilFormat(internalformat);
|
2014-01-23 19:53:53 -08:00
|
|
|
|
}
|
|
|
|
|
|
2014-11-13 20:03:50 -08:00
|
|
|
|
// The following IsValidFBORenderbufferXXX functions check the internal format
|
|
|
|
|
// that is stored by WebGLRenderbuffer::InternalFormat(). Valid values can be
|
|
|
|
|
// found in WebGLContext::RenderbufferStorage.
|
2014-01-23 19:53:53 -08:00
|
|
|
|
|
|
|
|
|
static inline bool
|
2014-01-23 22:28:47 -08:00
|
|
|
|
IsValidFBORenderbufferDepthFormat(GLenum internalFormat)
|
|
|
|
|
{
|
2014-01-23 19:53:53 -08:00
|
|
|
|
return internalFormat == LOCAL_GL_DEPTH_COMPONENT16;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline bool
|
2014-01-23 22:28:47 -08:00
|
|
|
|
IsValidFBORenderbufferDepthStencilFormat(GLenum internalFormat)
|
|
|
|
|
{
|
|
|
|
|
return internalFormat == LOCAL_GL_DEPTH_STENCIL;
|
2014-01-23 19:53:53 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline bool
|
2014-01-23 22:28:47 -08:00
|
|
|
|
IsValidFBORenderbufferStencilFormat(GLenum internalFormat)
|
|
|
|
|
{
|
2014-01-23 19:53:53 -08:00
|
|
|
|
return internalFormat == LOCAL_GL_STENCIL_INDEX8;
|
2013-11-04 13:05:04 -08:00
|
|
|
|
}
|
|
|
|
|
|
2014-11-21 15:04:08 -08:00
|
|
|
|
bool
|
|
|
|
|
WebGLContext::IsFormatValidForFB(GLenum sizedFormat) const
|
|
|
|
|
{
|
|
|
|
|
switch (sizedFormat) {
|
|
|
|
|
case LOCAL_GL_RGB8:
|
|
|
|
|
case LOCAL_GL_RGBA8:
|
|
|
|
|
case LOCAL_GL_RGB565:
|
|
|
|
|
case LOCAL_GL_RGB5_A1:
|
|
|
|
|
case LOCAL_GL_RGBA4:
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
case LOCAL_GL_SRGB8:
|
|
|
|
|
case LOCAL_GL_SRGB8_ALPHA8_EXT:
|
|
|
|
|
return IsExtensionEnabled(WebGLExtensionID::EXT_sRGB);
|
|
|
|
|
|
|
|
|
|
case LOCAL_GL_RGB32F:
|
|
|
|
|
case LOCAL_GL_RGBA32F:
|
|
|
|
|
return IsExtensionEnabled(WebGLExtensionID::WEBGL_color_buffer_float);
|
|
|
|
|
|
|
|
|
|
case LOCAL_GL_RGB16F:
|
|
|
|
|
case LOCAL_GL_RGBA16F:
|
|
|
|
|
return IsExtensionEnabled(WebGLExtensionID::EXT_color_buffer_half_float);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2012-12-09 03:58:41 -08:00
|
|
|
|
bool
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::IsComplete() const
|
2014-01-22 19:59:34 -08:00
|
|
|
|
{
|
|
|
|
|
if (!HasImage())
|
|
|
|
|
return false;
|
2012-12-09 03:58:41 -08:00
|
|
|
|
|
2014-01-22 19:59:34 -08:00
|
|
|
|
const WebGLRectangleObject& rect = RectangleObject();
|
|
|
|
|
|
|
|
|
|
if (!rect.Width() ||
|
|
|
|
|
!rect.Height())
|
|
|
|
|
{
|
2012-12-09 03:58:41 -08:00
|
|
|
|
return false;
|
2014-01-22 19:59:34 -08:00
|
|
|
|
}
|
2012-12-09 03:58:41 -08:00
|
|
|
|
|
2014-02-13 15:07:59 -08:00
|
|
|
|
if (Texture()) {
|
|
|
|
|
MOZ_ASSERT(Texture()->HasImageInfoAt(mTexImageTarget, mTexImageLevel));
|
2014-01-23 19:53:53 -08:00
|
|
|
|
const WebGLTexture::ImageInfo& imageInfo =
|
2014-02-13 15:07:59 -08:00
|
|
|
|
Texture()->ImageInfoAt(mTexImageTarget, mTexImageLevel);
|
2014-11-21 15:04:08 -08:00
|
|
|
|
GLenum sizedFormat = imageInfo.EffectiveInternalFormat().get();
|
2014-01-23 19:53:53 -08:00
|
|
|
|
|
|
|
|
|
if (mAttachmentPoint == LOCAL_GL_DEPTH_ATTACHMENT)
|
2014-11-21 15:04:08 -08:00
|
|
|
|
return IsValidFBOTextureDepthFormat(sizedFormat);
|
2014-01-23 19:53:53 -08:00
|
|
|
|
|
2014-11-13 20:03:50 -08:00
|
|
|
|
if (mAttachmentPoint == LOCAL_GL_STENCIL_ATTACHMENT) {
|
|
|
|
|
// Textures can't have the correct format for stencil buffers.
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2014-08-19 13:24:39 -07:00
|
|
|
|
|
2014-11-13 20:03:50 -08:00
|
|
|
|
if (mAttachmentPoint == LOCAL_GL_DEPTH_STENCIL_ATTACHMENT)
|
2014-11-21 15:04:08 -08:00
|
|
|
|
return IsValidFBOTextureDepthStencilFormat(sizedFormat);
|
2014-01-23 19:53:53 -08:00
|
|
|
|
|
|
|
|
|
if (mAttachmentPoint >= LOCAL_GL_COLOR_ATTACHMENT0 &&
|
2014-09-25 08:21:33 -07:00
|
|
|
|
mAttachmentPoint <= FBAttachment(LOCAL_GL_COLOR_ATTACHMENT0 - 1 +
|
|
|
|
|
WebGLContext::kMaxColorAttachments))
|
2014-01-22 19:59:34 -08:00
|
|
|
|
{
|
2014-11-21 15:04:08 -08:00
|
|
|
|
WebGLContext* webgl = Texture()->Context();
|
|
|
|
|
return webgl->IsFormatValidForFB(sizedFormat);
|
2013-06-21 16:44:17 -07:00
|
|
|
|
}
|
2014-01-22 19:59:34 -08:00
|
|
|
|
MOZ_ASSERT(false, "Invalid WebGL attachment point?");
|
|
|
|
|
return false;
|
2012-12-09 03:58:41 -08:00
|
|
|
|
}
|
|
|
|
|
|
2014-02-13 15:07:59 -08:00
|
|
|
|
if (Renderbuffer()) {
|
|
|
|
|
GLenum internalFormat = Renderbuffer()->InternalFormat();
|
2014-01-23 19:53:53 -08:00
|
|
|
|
|
|
|
|
|
if (mAttachmentPoint == LOCAL_GL_DEPTH_ATTACHMENT)
|
|
|
|
|
return IsValidFBORenderbufferDepthFormat(internalFormat);
|
|
|
|
|
|
|
|
|
|
if (mAttachmentPoint == LOCAL_GL_STENCIL_ATTACHMENT)
|
|
|
|
|
return IsValidFBORenderbufferStencilFormat(internalFormat);
|
|
|
|
|
|
|
|
|
|
if (mAttachmentPoint == LOCAL_GL_DEPTH_STENCIL_ATTACHMENT)
|
|
|
|
|
return IsValidFBORenderbufferDepthStencilFormat(internalFormat);
|
|
|
|
|
|
|
|
|
|
if (mAttachmentPoint >= LOCAL_GL_COLOR_ATTACHMENT0 &&
|
2014-09-25 08:21:33 -07:00
|
|
|
|
mAttachmentPoint <= FBAttachment(LOCAL_GL_COLOR_ATTACHMENT0 - 1 +
|
|
|
|
|
WebGLContext::kMaxColorAttachments))
|
2014-01-22 19:59:34 -08:00
|
|
|
|
{
|
2014-11-21 15:04:08 -08:00
|
|
|
|
WebGLContext* webgl = Renderbuffer()->Context();
|
|
|
|
|
return webgl->IsFormatValidForFB(internalFormat);
|
2013-06-21 16:44:17 -07:00
|
|
|
|
}
|
2014-01-22 19:59:34 -08:00
|
|
|
|
MOZ_ASSERT(false, "Invalid WebGL attachment point?");
|
|
|
|
|
return false;
|
2012-12-09 03:58:41 -08:00
|
|
|
|
}
|
2014-01-22 19:59:34 -08:00
|
|
|
|
MOZ_ASSERT(false, "Should not get here.");
|
2012-12-09 03:58:41 -08:00
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-01 17:30:05 -07:00
|
|
|
|
void
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint::FinalizeAttachment(gl::GLContext* gl,
|
2014-11-13 20:03:50 -08:00
|
|
|
|
FBAttachment attachmentLoc) const
|
2014-01-22 19:59:34 -08:00
|
|
|
|
{
|
2014-03-11 16:10:59 -07:00
|
|
|
|
if (!HasImage()) {
|
2015-03-24 16:00:28 -07:00
|
|
|
|
switch (attachmentLoc.get()) {
|
|
|
|
|
case LOCAL_GL_DEPTH_ATTACHMENT:
|
|
|
|
|
case LOCAL_GL_STENCIL_ATTACHMENT:
|
|
|
|
|
case LOCAL_GL_DEPTH_STENCIL_ATTACHMENT:
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
gl->fFramebufferRenderbuffer(LOCAL_GL_FRAMEBUFFER, attachmentLoc.get(),
|
2014-03-11 16:10:59 -07:00
|
|
|
|
LOCAL_GL_RENDERBUFFER, 0);
|
2015-03-24 16:00:28 -07:00
|
|
|
|
break;
|
2014-03-11 16:10:59 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
2014-01-22 19:59:34 -08:00
|
|
|
|
MOZ_ASSERT(HasImage());
|
|
|
|
|
|
2013-10-01 17:30:05 -07:00
|
|
|
|
if (Texture()) {
|
2014-10-26 16:40:37 -07:00
|
|
|
|
MOZ_ASSERT(gl == Texture()->Context()->GL());
|
2014-03-11 16:10:59 -07:00
|
|
|
|
|
2014-09-18 16:14:22 -07:00
|
|
|
|
const GLenum imageTarget = ImageTarget().get();
|
|
|
|
|
const GLint mipLevel = MipLevel();
|
2015-05-20 16:55:34 -07:00
|
|
|
|
const GLuint glName = Texture()->mGLName;
|
2014-09-18 16:14:22 -07:00
|
|
|
|
|
2013-10-01 17:31:09 -07:00
|
|
|
|
if (attachmentLoc == LOCAL_GL_DEPTH_STENCIL_ATTACHMENT) {
|
2015-03-24 16:00:28 -07:00
|
|
|
|
gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_DEPTH_ATTACHMENT,
|
|
|
|
|
imageTarget, glName, mipLevel);
|
|
|
|
|
gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_STENCIL_ATTACHMENT,
|
|
|
|
|
imageTarget, glName, mipLevel);
|
2013-10-01 17:31:09 -07:00
|
|
|
|
} else {
|
2014-09-25 08:21:33 -07:00
|
|
|
|
gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, attachmentLoc.get(),
|
2014-09-18 16:14:22 -07:00
|
|
|
|
imageTarget, glName, mipLevel);
|
2013-10-01 17:31:09 -07:00
|
|
|
|
}
|
2013-10-01 17:30:05 -07:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Renderbuffer()) {
|
2013-10-01 17:31:09 -07:00
|
|
|
|
Renderbuffer()->FramebufferRenderbuffer(attachmentLoc);
|
2013-10-01 17:30:05 -07:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
MOZ_CRASH();
|
2013-10-01 17:30:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// WebGLFramebuffer
|
2015-03-16 21:32:52 -07:00
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
WebGLFramebuffer::WebGLFramebuffer(WebGLContext* webgl, GLuint fbo)
|
2015-05-20 16:50:28 -07:00
|
|
|
|
: WebGLContextBoundObject(webgl)
|
|
|
|
|
, mGLName(fbo)
|
2015-03-24 16:00:28 -07:00
|
|
|
|
, mStatus(0)
|
|
|
|
|
, mReadBufferMode(LOCAL_GL_COLOR_ATTACHMENT0)
|
|
|
|
|
, mColorAttachment0(this, LOCAL_GL_COLOR_ATTACHMENT0)
|
|
|
|
|
, mDepthAttachment(this, LOCAL_GL_DEPTH_ATTACHMENT)
|
|
|
|
|
, mStencilAttachment(this, LOCAL_GL_STENCIL_ATTACHMENT)
|
|
|
|
|
, mDepthStencilAttachment(this, LOCAL_GL_DEPTH_STENCIL_ATTACHMENT)
|
2015-05-20 16:50:28 -07:00
|
|
|
|
#ifdef ANDROID
|
|
|
|
|
, mIsFB(false)
|
|
|
|
|
#endif
|
|
|
|
|
|
2015-03-16 18:03:40 -07:00
|
|
|
|
{
|
2015-03-24 16:00:28 -07:00
|
|
|
|
mContext->mFramebuffers.insertBack(this);
|
2015-03-16 21:32:52 -07:00
|
|
|
|
}
|
2015-03-16 18:22:17 -07:00
|
|
|
|
|
2015-03-16 21:32:52 -07:00
|
|
|
|
void
|
2015-03-24 16:00:28 -07:00
|
|
|
|
WebGLFramebuffer::Delete()
|
2015-03-16 21:32:52 -07:00
|
|
|
|
{
|
2015-03-24 16:00:28 -07:00
|
|
|
|
mColorAttachment0.Clear();
|
|
|
|
|
mDepthAttachment.Clear();
|
|
|
|
|
mStencilAttachment.Clear();
|
|
|
|
|
mDepthStencilAttachment.Clear();
|
|
|
|
|
|
|
|
|
|
const size_t moreColorAttachmentCount = mMoreColorAttachments.Length();
|
|
|
|
|
for (size_t i = 0; i < moreColorAttachmentCount; i++) {
|
|
|
|
|
mMoreColorAttachments[i].Clear();
|
2014-06-24 00:15:44 -07:00
|
|
|
|
}
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
mContext->MakeContextCurrent();
|
|
|
|
|
mContext->gl->fDeleteFramebuffers(1, &mGLName);
|
|
|
|
|
LinkedListElement<WebGLFramebuffer>::removeFrom(mContext->mFramebuffers);
|
2015-05-20 16:50:28 -07:00
|
|
|
|
|
|
|
|
|
#ifdef ANDROID
|
|
|
|
|
mIsFB = false;
|
|
|
|
|
#endif
|
2014-06-24 00:15:44 -07:00
|
|
|
|
}
|
|
|
|
|
|
2012-12-09 03:58:41 -08:00
|
|
|
|
void
|
2015-03-24 16:00:28 -07:00
|
|
|
|
WebGLFramebuffer::FramebufferRenderbuffer(FBAttachment attachPointEnum,
|
2014-09-25 08:21:33 -07:00
|
|
|
|
RBTarget rbtarget,
|
2014-11-13 20:03:50 -08:00
|
|
|
|
WebGLRenderbuffer* rb)
|
2012-12-09 03:58:41 -08:00
|
|
|
|
{
|
2015-01-12 15:05:21 -08:00
|
|
|
|
MOZ_ASSERT(mContext->mBoundDrawFramebuffer == this ||
|
|
|
|
|
mContext->mBoundReadFramebuffer == this);
|
2014-03-03 23:14:35 -08:00
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (!mContext->ValidateObjectAllowNull("framebufferRenderbuffer: renderbuffer", rb))
|
2012-12-09 03:58:41 -08:00
|
|
|
|
return;
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
// `attachPoint` is validated by ValidateFramebufferAttachment().
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint& attachPoint = GetAttachPoint(attachPointEnum);
|
2015-03-24 16:00:28 -07:00
|
|
|
|
attachPoint.SetRenderbuffer(rb);
|
2014-11-13 20:03:50 -08:00
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
InvalidateFramebufferStatus();
|
2012-12-09 03:58:41 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2015-03-24 16:00:28 -07:00
|
|
|
|
WebGLFramebuffer::FramebufferTexture2D(FBAttachment attachPointEnum,
|
2014-09-18 16:14:22 -07:00
|
|
|
|
TexImageTarget texImageTarget,
|
2014-11-13 20:03:50 -08:00
|
|
|
|
WebGLTexture* tex, GLint level)
|
2012-12-09 03:58:41 -08:00
|
|
|
|
{
|
2015-01-12 15:05:21 -08:00
|
|
|
|
MOZ_ASSERT(mContext->mBoundDrawFramebuffer == this ||
|
|
|
|
|
mContext->mBoundReadFramebuffer == this);
|
2014-03-03 23:14:35 -08:00
|
|
|
|
|
2015-02-17 15:52:51 -08:00
|
|
|
|
if (!mContext->ValidateObjectAllowNull("framebufferTexture2D: texture", tex))
|
2012-12-09 03:58:41 -08:00
|
|
|
|
return;
|
|
|
|
|
|
2014-11-13 20:03:50 -08:00
|
|
|
|
if (tex) {
|
|
|
|
|
bool isTexture2D = tex->Target() == LOCAL_GL_TEXTURE_2D;
|
2014-09-18 16:14:22 -07:00
|
|
|
|
bool isTexTarget2D = texImageTarget == LOCAL_GL_TEXTURE_2D;
|
2013-10-31 10:01:41 -07:00
|
|
|
|
if (isTexture2D != isTexTarget2D) {
|
2014-11-13 20:03:50 -08:00
|
|
|
|
mContext->ErrorInvalidOperation("framebufferTexture2D: Mismatched"
|
|
|
|
|
" texture and texture target.");
|
|
|
|
|
return;
|
2013-10-31 10:01:41 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint& attachPoint = GetAttachPoint(attachPointEnum);
|
2015-03-24 16:00:28 -07:00
|
|
|
|
attachPoint.SetTexImage(tex, texImageTarget, level);
|
2014-11-13 20:03:50 -08:00
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
InvalidateFramebufferStatus();
|
2014-03-03 23:14:35 -08:00
|
|
|
|
}
|
|
|
|
|
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFBAttachPoint&
|
2015-03-24 16:00:28 -07:00
|
|
|
|
WebGLFramebuffer::GetAttachPoint(FBAttachment attachPoint)
|
2014-03-03 23:14:35 -08:00
|
|
|
|
{
|
2014-11-13 20:03:50 -08:00
|
|
|
|
switch (attachPoint.get()) {
|
2015-03-24 16:00:28 -07:00
|
|
|
|
case LOCAL_GL_COLOR_ATTACHMENT0:
|
|
|
|
|
return mColorAttachment0;
|
2015-03-16 21:32:52 -07:00
|
|
|
|
|
2014-11-13 20:03:50 -08:00
|
|
|
|
case LOCAL_GL_DEPTH_STENCIL_ATTACHMENT:
|
2012-12-09 03:58:41 -08:00
|
|
|
|
return mDepthStencilAttachment;
|
2014-11-13 20:03:50 -08:00
|
|
|
|
|
|
|
|
|
case LOCAL_GL_DEPTH_ATTACHMENT:
|
2012-12-09 03:58:41 -08:00
|
|
|
|
return mDepthAttachment;
|
2014-11-13 20:03:50 -08:00
|
|
|
|
|
|
|
|
|
case LOCAL_GL_STENCIL_ATTACHMENT:
|
2012-12-09 03:58:41 -08:00
|
|
|
|
return mStencilAttachment;
|
|
|
|
|
|
2014-11-13 20:03:50 -08:00
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (attachPoint >= LOCAL_GL_COLOR_ATTACHMENT1) {
|
|
|
|
|
size_t colorAttachmentId = attachPoint.get() - LOCAL_GL_COLOR_ATTACHMENT0;
|
|
|
|
|
if (colorAttachmentId < WebGLContext::kMaxColorAttachments) {
|
|
|
|
|
EnsureColorAttachPoints(colorAttachmentId);
|
|
|
|
|
return mMoreColorAttachments[colorAttachmentId - 1];
|
|
|
|
|
}
|
2013-06-21 16:44:17 -07:00
|
|
|
|
}
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
MOZ_CRASH("bad `attachPoint` validation");
|
2012-12-09 03:58:41 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2014-01-22 19:59:34 -08:00
|
|
|
|
WebGLFramebuffer::DetachTexture(const WebGLTexture* tex)
|
|
|
|
|
{
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (mColorAttachment0.Texture() == tex)
|
|
|
|
|
mColorAttachment0.Clear();
|
2015-03-16 18:22:17 -07:00
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (mDepthAttachment.Texture() == tex)
|
|
|
|
|
mDepthAttachment.Clear();
|
|
|
|
|
|
|
|
|
|
if (mStencilAttachment.Texture() == tex)
|
|
|
|
|
mStencilAttachment.Clear();
|
|
|
|
|
|
|
|
|
|
if (mDepthStencilAttachment.Texture() == tex)
|
|
|
|
|
mDepthStencilAttachment.Clear();
|
|
|
|
|
|
|
|
|
|
const size_t moreColorAttachmentCount = mMoreColorAttachments.Length();
|
|
|
|
|
for (size_t i = 0; i < moreColorAttachmentCount; i++) {
|
|
|
|
|
if (mMoreColorAttachments[i].Texture() == tex)
|
|
|
|
|
mMoreColorAttachments[i].Clear();
|
2014-11-13 20:03:50 -08:00
|
|
|
|
}
|
2012-12-09 03:58:41 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2014-01-22 19:59:34 -08:00
|
|
|
|
WebGLFramebuffer::DetachRenderbuffer(const WebGLRenderbuffer* rb)
|
|
|
|
|
{
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (mColorAttachment0.Renderbuffer() == rb)
|
|
|
|
|
mColorAttachment0.Clear();
|
2015-03-16 18:22:17 -07:00
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (mDepthAttachment.Renderbuffer() == rb)
|
|
|
|
|
mDepthAttachment.Clear();
|
|
|
|
|
|
|
|
|
|
if (mStencilAttachment.Renderbuffer() == rb)
|
|
|
|
|
mStencilAttachment.Clear();
|
|
|
|
|
|
|
|
|
|
if (mDepthStencilAttachment.Renderbuffer() == rb)
|
|
|
|
|
mDepthStencilAttachment.Clear();
|
|
|
|
|
|
|
|
|
|
const size_t moreColorAttachmentCount = mMoreColorAttachments.Length();
|
|
|
|
|
for (size_t i = 0; i < moreColorAttachmentCount; i++) {
|
|
|
|
|
if (mMoreColorAttachments[i].Renderbuffer() == rb)
|
|
|
|
|
mMoreColorAttachments[i].Clear();
|
2014-11-13 20:03:50 -08:00
|
|
|
|
}
|
2012-12-09 03:58:41 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
2014-01-22 19:59:34 -08:00
|
|
|
|
WebGLFramebuffer::HasDefinedAttachments() const
|
|
|
|
|
{
|
|
|
|
|
bool hasAttachments = false;
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
hasAttachments |= mColorAttachment0.IsDefined();
|
2014-01-22 19:59:34 -08:00
|
|
|
|
hasAttachments |= mDepthAttachment.IsDefined();
|
|
|
|
|
hasAttachments |= mStencilAttachment.IsDefined();
|
|
|
|
|
hasAttachments |= mDepthStencilAttachment.IsDefined();
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
const size_t moreColorAttachmentCount = mMoreColorAttachments.Length();
|
|
|
|
|
for (size_t i = 0; i < moreColorAttachmentCount; i++) {
|
|
|
|
|
hasAttachments |= mMoreColorAttachments[i].IsDefined();
|
|
|
|
|
}
|
|
|
|
|
|
2014-01-22 19:59:34 -08:00
|
|
|
|
return hasAttachments;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool
|
2015-07-14 17:37:28 -07:00
|
|
|
|
IsIncomplete(const WebGLFBAttachPoint& cur)
|
2014-01-22 19:59:34 -08:00
|
|
|
|
{
|
2014-02-13 15:07:59 -08:00
|
|
|
|
return cur.IsDefined() && !cur.IsComplete();
|
2014-01-22 19:59:34 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
WebGLFramebuffer::HasIncompleteAttachments() const
|
|
|
|
|
{
|
|
|
|
|
bool hasIncomplete = false;
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
hasIncomplete |= IsIncomplete(mColorAttachment0);
|
2014-01-22 19:59:34 -08:00
|
|
|
|
hasIncomplete |= IsIncomplete(mDepthAttachment);
|
|
|
|
|
hasIncomplete |= IsIncomplete(mStencilAttachment);
|
|
|
|
|
hasIncomplete |= IsIncomplete(mDepthStencilAttachment);
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
const size_t moreColorAttachmentCount = mMoreColorAttachments.Length();
|
|
|
|
|
for (size_t i = 0; i < moreColorAttachmentCount; i++) {
|
|
|
|
|
hasIncomplete |= IsIncomplete(mMoreColorAttachments[i]);
|
|
|
|
|
}
|
|
|
|
|
|
2014-01-22 19:59:34 -08:00
|
|
|
|
return hasIncomplete;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const WebGLRectangleObject&
|
|
|
|
|
WebGLFramebuffer::GetAnyRectObject() const
|
|
|
|
|
{
|
|
|
|
|
MOZ_ASSERT(HasDefinedAttachments());
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (mColorAttachment0.HasImage())
|
|
|
|
|
return mColorAttachment0.RectangleObject();
|
2014-01-22 19:59:34 -08:00
|
|
|
|
|
|
|
|
|
if (mDepthAttachment.HasImage())
|
|
|
|
|
return mDepthAttachment.RectangleObject();
|
|
|
|
|
|
|
|
|
|
if (mStencilAttachment.HasImage())
|
|
|
|
|
return mStencilAttachment.RectangleObject();
|
|
|
|
|
|
|
|
|
|
if (mDepthStencilAttachment.HasImage())
|
|
|
|
|
return mDepthStencilAttachment.RectangleObject();
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
const size_t moreColorAttachmentCount = mMoreColorAttachments.Length();
|
|
|
|
|
for (size_t i = 0; i < moreColorAttachmentCount; i++) {
|
|
|
|
|
if (mMoreColorAttachments[i].HasImage())
|
|
|
|
|
return mMoreColorAttachments[i].RectangleObject();
|
|
|
|
|
}
|
|
|
|
|
|
2014-01-22 19:59:34 -08:00
|
|
|
|
MOZ_CRASH("Should not get here.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool
|
2015-07-14 17:37:28 -07:00
|
|
|
|
RectsMatch(const WebGLFBAttachPoint& attachment,
|
2014-01-22 19:59:34 -08:00
|
|
|
|
const WebGLRectangleObject& rect)
|
|
|
|
|
{
|
|
|
|
|
return attachment.RectangleObject().HasSameDimensionsAs(rect);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
WebGLFramebuffer::AllImageRectsMatch() const
|
|
|
|
|
{
|
|
|
|
|
MOZ_ASSERT(HasDefinedAttachments());
|
|
|
|
|
MOZ_ASSERT(!HasIncompleteAttachments());
|
|
|
|
|
|
|
|
|
|
const WebGLRectangleObject& rect = GetAnyRectObject();
|
|
|
|
|
|
|
|
|
|
// Alright, we have *a* rect, let's check all the others.
|
|
|
|
|
bool imageRectsMatch = true;
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (mColorAttachment0.HasImage())
|
|
|
|
|
imageRectsMatch &= RectsMatch(mColorAttachment0, rect);
|
2014-01-22 19:59:34 -08:00
|
|
|
|
|
|
|
|
|
if (mDepthAttachment.HasImage())
|
|
|
|
|
imageRectsMatch &= RectsMatch(mDepthAttachment, rect);
|
|
|
|
|
|
|
|
|
|
if (mStencilAttachment.HasImage())
|
|
|
|
|
imageRectsMatch &= RectsMatch(mStencilAttachment, rect);
|
|
|
|
|
|
|
|
|
|
if (mDepthStencilAttachment.HasImage())
|
|
|
|
|
imageRectsMatch &= RectsMatch(mDepthStencilAttachment, rect);
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
const size_t moreColorAttachmentCount = mMoreColorAttachments.Length();
|
|
|
|
|
for (size_t i = 0; i < moreColorAttachmentCount; i++) {
|
|
|
|
|
if (mMoreColorAttachments[i].HasImage())
|
|
|
|
|
imageRectsMatch &= RectsMatch(mMoreColorAttachments[i], rect);
|
|
|
|
|
}
|
|
|
|
|
|
2014-01-22 19:59:34 -08:00
|
|
|
|
return imageRectsMatch;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const WebGLRectangleObject&
|
|
|
|
|
WebGLFramebuffer::RectangleObject() const
|
|
|
|
|
{
|
|
|
|
|
// If we're using this as the RectObj of an FB, we need to be sure the FB
|
|
|
|
|
// has a consistent rect.
|
|
|
|
|
MOZ_ASSERT(AllImageRectsMatch(), "Did you mean `GetAnyRectObject`?");
|
|
|
|
|
return GetAnyRectObject();
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-25 08:21:33 -07:00
|
|
|
|
FBStatus
|
2014-01-22 19:59:34 -08:00
|
|
|
|
WebGLFramebuffer::PrecheckFramebufferStatus() const
|
2012-12-09 03:58:41 -08:00
|
|
|
|
{
|
2015-01-12 15:05:21 -08:00
|
|
|
|
MOZ_ASSERT(mContext->mBoundDrawFramebuffer == this ||
|
|
|
|
|
mContext->mBoundReadFramebuffer == this);
|
2014-01-22 19:59:34 -08:00
|
|
|
|
|
|
|
|
|
if (!HasDefinedAttachments())
|
|
|
|
|
return LOCAL_GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; // No attachments
|
|
|
|
|
|
|
|
|
|
if (HasIncompleteAttachments())
|
|
|
|
|
return LOCAL_GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
|
|
|
|
|
|
|
|
|
if (!AllImageRectsMatch())
|
2014-02-13 15:07:59 -08:00
|
|
|
|
return LOCAL_GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS; // Inconsistent sizes
|
2014-01-22 19:59:34 -08:00
|
|
|
|
|
2012-12-09 03:58:41 -08:00
|
|
|
|
if (HasDepthStencilConflict())
|
2014-01-22 19:59:34 -08:00
|
|
|
|
return LOCAL_GL_FRAMEBUFFER_UNSUPPORTED;
|
2012-12-09 03:58:41 -08:00
|
|
|
|
|
2014-01-22 19:59:34 -08:00
|
|
|
|
return LOCAL_GL_FRAMEBUFFER_COMPLETE;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-25 08:21:33 -07:00
|
|
|
|
FBStatus
|
2014-01-22 19:59:34 -08:00
|
|
|
|
WebGLFramebuffer::CheckFramebufferStatus() const
|
|
|
|
|
{
|
2014-03-03 23:14:35 -08:00
|
|
|
|
if (mStatus != 0)
|
|
|
|
|
return mStatus;
|
|
|
|
|
|
2014-09-25 08:21:33 -07:00
|
|
|
|
mStatus = PrecheckFramebufferStatus().get();
|
2014-03-03 23:14:35 -08:00
|
|
|
|
if (mStatus != LOCAL_GL_FRAMEBUFFER_COMPLETE)
|
|
|
|
|
return mStatus;
|
2012-12-09 03:58:41 -08:00
|
|
|
|
|
2014-01-22 19:59:34 -08:00
|
|
|
|
// Looks good on our end. Let's ask the driver.
|
2013-10-01 17:31:37 -07:00
|
|
|
|
mContext->MakeContextCurrent();
|
|
|
|
|
|
|
|
|
|
// Ok, attach our chosen flavor of {DEPTH, STENCIL, DEPTH_STENCIL}.
|
|
|
|
|
FinalizeAttachments();
|
|
|
|
|
|
2015-02-24 14:09:09 -08:00
|
|
|
|
// TODO: This should not be unconditionally GL_FRAMEBUFFER.
|
2014-03-03 23:14:35 -08:00
|
|
|
|
mStatus = mContext->gl->fCheckFramebufferStatus(LOCAL_GL_FRAMEBUFFER);
|
|
|
|
|
return mStatus;
|
2014-01-22 19:59:34 -08:00
|
|
|
|
}
|
|
|
|
|
|
2014-02-28 18:51:43 -08:00
|
|
|
|
bool
|
|
|
|
|
WebGLFramebuffer::HasCompletePlanes(GLbitfield mask)
|
|
|
|
|
{
|
|
|
|
|
if (CheckFramebufferStatus() != LOCAL_GL_FRAMEBUFFER_COMPLETE)
|
|
|
|
|
return false;
|
|
|
|
|
|
2015-01-12 15:05:21 -08:00
|
|
|
|
MOZ_ASSERT(mContext->mBoundDrawFramebuffer == this ||
|
|
|
|
|
mContext->mBoundReadFramebuffer == this);
|
|
|
|
|
|
2014-02-28 18:51:43 -08:00
|
|
|
|
bool hasPlanes = true;
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (mask & LOCAL_GL_COLOR_BUFFER_BIT)
|
|
|
|
|
hasPlanes &= mColorAttachment0.IsDefined();
|
2014-02-28 18:51:43 -08:00
|
|
|
|
|
|
|
|
|
if (mask & LOCAL_GL_DEPTH_BUFFER_BIT) {
|
2015-03-24 16:00:28 -07:00
|
|
|
|
hasPlanes &= mDepthAttachment.IsDefined() ||
|
|
|
|
|
mDepthStencilAttachment.IsDefined();
|
2014-02-28 18:51:43 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mask & LOCAL_GL_STENCIL_BUFFER_BIT) {
|
2015-03-24 16:00:28 -07:00
|
|
|
|
hasPlanes &= mStencilAttachment.IsDefined() ||
|
|
|
|
|
mDepthStencilAttachment.IsDefined();
|
2014-02-28 18:51:43 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return hasPlanes;
|
|
|
|
|
}
|
2014-01-22 19:59:34 -08:00
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
WebGLFramebuffer::CheckAndInitializeAttachments()
|
|
|
|
|
{
|
2015-01-12 15:05:21 -08:00
|
|
|
|
MOZ_ASSERT(mContext->mBoundDrawFramebuffer == this ||
|
|
|
|
|
mContext->mBoundReadFramebuffer == this);
|
2014-01-22 19:59:34 -08:00
|
|
|
|
|
|
|
|
|
if (CheckFramebufferStatus() != LOCAL_GL_FRAMEBUFFER_COMPLETE)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// Cool! We've checked out ok. Just need to initialize.
|
2015-03-24 16:00:28 -07:00
|
|
|
|
const size_t moreColorAttachmentCount = mMoreColorAttachments.Length();
|
2013-06-21 16:44:17 -07:00
|
|
|
|
|
2014-01-22 19:59:34 -08:00
|
|
|
|
// Check if we need to initialize anything
|
2013-06-21 16:44:17 -07:00
|
|
|
|
{
|
2014-01-22 19:59:34 -08:00
|
|
|
|
bool hasUninitializedAttachments = false;
|
2013-06-21 16:44:17 -07:00
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (mColorAttachment0.HasImage())
|
|
|
|
|
hasUninitializedAttachments |= mColorAttachment0.HasUninitializedImageData();
|
2014-01-22 19:59:34 -08:00
|
|
|
|
if (mDepthAttachment.HasImage())
|
|
|
|
|
hasUninitializedAttachments |= mDepthAttachment.HasUninitializedImageData();
|
|
|
|
|
if (mStencilAttachment.HasImage())
|
|
|
|
|
hasUninitializedAttachments |= mStencilAttachment.HasUninitializedImageData();
|
|
|
|
|
if (mDepthStencilAttachment.HasImage())
|
|
|
|
|
hasUninitializedAttachments |= mDepthStencilAttachment.HasUninitializedImageData();
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
for (size_t i = 0; i < moreColorAttachmentCount; i++) {
|
|
|
|
|
if (mMoreColorAttachments[i].HasImage())
|
|
|
|
|
hasUninitializedAttachments |= mMoreColorAttachments[i].HasUninitializedImageData();
|
|
|
|
|
}
|
|
|
|
|
|
2014-01-22 19:59:34 -08:00
|
|
|
|
if (!hasUninitializedAttachments)
|
2013-06-21 16:44:17 -07:00
|
|
|
|
return true;
|
|
|
|
|
}
|
2012-12-09 03:58:41 -08:00
|
|
|
|
|
2014-01-22 19:59:34 -08:00
|
|
|
|
// Get buffer-bit-mask and color-attachment-mask-list
|
2012-12-09 03:58:41 -08:00
|
|
|
|
uint32_t mask = 0;
|
2014-04-30 14:30:23 -07:00
|
|
|
|
bool colorAttachmentsMask[WebGLContext::kMaxColorAttachments] = { false };
|
2015-03-24 16:00:28 -07:00
|
|
|
|
MOZ_ASSERT(1 + moreColorAttachmentCount <= WebGLContext::kMaxColorAttachments);
|
2013-06-21 16:44:17 -07:00
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (mColorAttachment0.HasUninitializedImageData()) {
|
|
|
|
|
colorAttachmentsMask[0] = true;
|
|
|
|
|
mask |= LOCAL_GL_COLOR_BUFFER_BIT;
|
2013-06-21 16:44:17 -07:00
|
|
|
|
}
|
2012-12-09 03:58:41 -08:00
|
|
|
|
|
2013-10-11 06:16:43 -07:00
|
|
|
|
if (mDepthAttachment.HasUninitializedImageData() ||
|
|
|
|
|
mDepthStencilAttachment.HasUninitializedImageData())
|
2012-12-09 03:58:41 -08:00
|
|
|
|
{
|
|
|
|
|
mask |= LOCAL_GL_DEPTH_BUFFER_BIT;
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-11 06:16:43 -07:00
|
|
|
|
if (mStencilAttachment.HasUninitializedImageData() ||
|
|
|
|
|
mDepthStencilAttachment.HasUninitializedImageData())
|
2012-12-09 03:58:41 -08:00
|
|
|
|
{
|
|
|
|
|
mask |= LOCAL_GL_STENCIL_BUFFER_BIT;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
for (size_t i = 0; i < moreColorAttachmentCount; i++) {
|
|
|
|
|
if (mMoreColorAttachments[i].HasUninitializedImageData()) {
|
|
|
|
|
colorAttachmentsMask[1 + i] = true;
|
|
|
|
|
mask |= LOCAL_GL_COLOR_BUFFER_BIT;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-01-22 19:59:34 -08:00
|
|
|
|
// Clear!
|
2015-04-30 17:30:26 -07:00
|
|
|
|
mContext->ForceClearFramebufferWithDefaultValues(false, mask, colorAttachmentsMask);
|
2012-12-09 03:58:41 -08:00
|
|
|
|
|
2014-01-22 19:59:34 -08:00
|
|
|
|
// Mark all the uninitialized images as initialized.
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (mColorAttachment0.HasUninitializedImageData())
|
|
|
|
|
mColorAttachment0.SetImageDataStatus(WebGLImageDataStatus::InitializedImageData);
|
2013-10-11 06:16:43 -07:00
|
|
|
|
if (mDepthAttachment.HasUninitializedImageData())
|
|
|
|
|
mDepthAttachment.SetImageDataStatus(WebGLImageDataStatus::InitializedImageData);
|
|
|
|
|
if (mStencilAttachment.HasUninitializedImageData())
|
|
|
|
|
mStencilAttachment.SetImageDataStatus(WebGLImageDataStatus::InitializedImageData);
|
|
|
|
|
if (mDepthStencilAttachment.HasUninitializedImageData())
|
|
|
|
|
mDepthStencilAttachment.SetImageDataStatus(WebGLImageDataStatus::InitializedImageData);
|
2012-12-09 03:58:41 -08:00
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
for (size_t i = 0; i < moreColorAttachmentCount; i++) {
|
|
|
|
|
if (mMoreColorAttachments[i].HasUninitializedImageData())
|
|
|
|
|
mMoreColorAttachments[i].SetImageDataStatus(WebGLImageDataStatus::InitializedImageData);
|
|
|
|
|
}
|
|
|
|
|
|
2012-12-09 03:58:41 -08:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
void WebGLFramebuffer::EnsureColorAttachPoints(size_t colorAttachmentId)
|
2014-01-22 19:59:34 -08:00
|
|
|
|
{
|
2014-04-30 14:30:23 -07:00
|
|
|
|
MOZ_ASSERT(colorAttachmentId < WebGLContext::kMaxColorAttachments);
|
2013-06-21 16:44:17 -07:00
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (colorAttachmentId < ColorAttachmentCount())
|
2013-06-21 16:44:17 -07:00
|
|
|
|
return;
|
|
|
|
|
|
2015-04-08 18:55:16 -07:00
|
|
|
|
while (ColorAttachmentCount() < WebGLContext::kMaxColorAttachments) {
|
|
|
|
|
GLenum nextAttachPoint = LOCAL_GL_COLOR_ATTACHMENT0 + ColorAttachmentCount();
|
2015-07-14 17:37:28 -07:00
|
|
|
|
mMoreColorAttachments.AppendElement(WebGLFBAttachPoint(this, nextAttachPoint));
|
2013-06-21 16:44:17 -07:00
|
|
|
|
}
|
|
|
|
|
|
2015-04-08 18:55:16 -07:00
|
|
|
|
MOZ_ASSERT(ColorAttachmentCount() == WebGLContext::kMaxColorAttachments);
|
2014-03-03 23:14:35 -08:00
|
|
|
|
}
|
|
|
|
|
|
2014-01-23 20:02:07 -08:00
|
|
|
|
static void
|
2014-11-13 20:03:50 -08:00
|
|
|
|
FinalizeDrawAndReadBuffers(gl::GLContext* gl, bool isColorBufferDefined)
|
2014-01-23 20:02:07 -08:00
|
|
|
|
{
|
2014-11-13 20:03:50 -08:00
|
|
|
|
MOZ_ASSERT(gl, "Expected a valid GLContext ptr.");
|
2014-01-23 20:02:07 -08:00
|
|
|
|
// GLES don't support DrawBuffer()/ReadBuffer.
|
|
|
|
|
// According to http://www.opengl.org/wiki/Framebuffer_Object
|
|
|
|
|
//
|
|
|
|
|
// Each draw buffers must either specify color attachment points that have images
|
|
|
|
|
// attached or must be GL_NONE​. (GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER​ when false).
|
|
|
|
|
//
|
|
|
|
|
// If the read buffer is set, then it must specify an attachment point that has an
|
|
|
|
|
// image attached. (GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER​ when false).
|
|
|
|
|
//
|
|
|
|
|
// Note that this test is not performed if OpenGL 4.2 or ARB_ES2_compatibility is
|
|
|
|
|
// available.
|
2014-11-13 20:03:50 -08:00
|
|
|
|
if (gl->IsGLES() ||
|
|
|
|
|
gl->IsSupported(gl::GLFeature::ES2_compatibility) ||
|
|
|
|
|
gl->IsAtLeast(gl::ContextProfile::OpenGL, 420))
|
2014-01-23 20:02:07 -08:00
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO(djg): Assert that fDrawBuffer/fReadBuffer is not NULL.
|
2014-11-13 20:03:50 -08:00
|
|
|
|
GLenum colorBufferSource = isColorBufferDefined ? LOCAL_GL_COLOR_ATTACHMENT0
|
|
|
|
|
: LOCAL_GL_NONE;
|
|
|
|
|
gl->fDrawBuffer(colorBufferSource);
|
|
|
|
|
gl->fReadBuffer(colorBufferSource);
|
2014-01-23 20:02:07 -08:00
|
|
|
|
}
|
|
|
|
|
|
2013-10-01 17:30:05 -07:00
|
|
|
|
void
|
2014-01-22 19:59:34 -08:00
|
|
|
|
WebGLFramebuffer::FinalizeAttachments() const
|
|
|
|
|
{
|
2015-03-24 16:00:28 -07:00
|
|
|
|
MOZ_ASSERT(mContext->mBoundDrawFramebuffer == this ||
|
|
|
|
|
mContext->mBoundReadFramebuffer == this);
|
|
|
|
|
|
|
|
|
|
MOZ_ASSERT(mStatus == LOCAL_GL_FRAMEBUFFER_COMPLETE);
|
|
|
|
|
|
2014-11-13 20:03:50 -08:00
|
|
|
|
gl::GLContext* gl = mContext->gl;
|
2014-03-11 16:10:59 -07:00
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
// Nuke the depth and stencil attachment points.
|
|
|
|
|
gl->fFramebufferRenderbuffer(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_DEPTH_ATTACHMENT,
|
|
|
|
|
LOCAL_GL_RENDERBUFFER, 0);
|
|
|
|
|
gl->fFramebufferRenderbuffer(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_STENCIL_ATTACHMENT,
|
|
|
|
|
LOCAL_GL_RENDERBUFFER, 0);
|
2015-03-16 18:22:17 -07:00
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
// Call finalize.
|
|
|
|
|
mColorAttachment0.FinalizeAttachment(gl, LOCAL_GL_COLOR_ATTACHMENT0);
|
|
|
|
|
mDepthAttachment.FinalizeAttachment(gl, LOCAL_GL_DEPTH_ATTACHMENT);
|
|
|
|
|
mStencilAttachment.FinalizeAttachment(gl, LOCAL_GL_STENCIL_ATTACHMENT);
|
|
|
|
|
mDepthStencilAttachment.FinalizeAttachment(gl, LOCAL_GL_DEPTH_STENCIL_ATTACHMENT);
|
2015-03-16 21:32:52 -07:00
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
const size_t moreColorAttachmentCount = mMoreColorAttachments.Length();
|
|
|
|
|
for (size_t i = 0; i < moreColorAttachmentCount; i++) {
|
|
|
|
|
GLenum attachPoint = LOCAL_GL_COLOR_ATTACHMENT0 + 1 + i;
|
|
|
|
|
mMoreColorAttachments[i].FinalizeAttachment(gl, attachPoint);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FinalizeDrawAndReadBuffers(gl, mColorAttachment0.IsDefined());
|
2013-10-01 17:30:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
2015-02-18 16:57:05 -08:00
|
|
|
|
bool
|
|
|
|
|
WebGLFramebuffer::ValidateForRead(const char* info, TexInternalFormat* const out_format)
|
|
|
|
|
{
|
|
|
|
|
if (mReadBufferMode == LOCAL_GL_NONE) {
|
|
|
|
|
mContext->ErrorInvalidOperation("%s: Read buffer mode must not be"
|
|
|
|
|
" NONE.", info);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
const auto& attachPoint = GetAttachPoint(mReadBufferMode);
|
2015-02-18 16:57:05 -08:00
|
|
|
|
|
|
|
|
|
if (!CheckAndInitializeAttachments()) {
|
|
|
|
|
mContext->ErrorInvalidFramebufferOperation("readPixels: incomplete framebuffer");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GLenum readPlaneBits = LOCAL_GL_COLOR_BUFFER_BIT;
|
|
|
|
|
if (!HasCompletePlanes(readPlaneBits)) {
|
|
|
|
|
mContext->ErrorInvalidOperation("readPixels: Read source attachment doesn't have the"
|
|
|
|
|
" correct color/depth/stencil type.");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
if (!attachPoint.IsDefined()) {
|
2015-02-18 16:57:05 -08:00
|
|
|
|
mContext->ErrorInvalidOperation("readPixels: ");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
*out_format = attachPoint.EffectiveInternalFormat();
|
2015-02-18 16:57:05 -08:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-24 16:00:28 -07:00
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
// Goop.
|
|
|
|
|
|
|
|
|
|
JSObject*
|
2015-07-14 17:37:28 -07:00
|
|
|
|
WebGLFramebuffer::WrapObject(JSContext* cx, JS::Handle<JSObject*> givenProto)
|
2015-03-24 16:00:28 -07:00
|
|
|
|
{
|
2015-07-14 17:37:28 -07:00
|
|
|
|
return dom::WebGLFramebufferBinding::Wrap(cx, this, givenProto);
|
2015-03-24 16:00:28 -07:00
|
|
|
|
}
|
|
|
|
|
|
2013-06-21 16:44:17 -07:00
|
|
|
|
inline void
|
2015-07-14 17:37:28 -07:00
|
|
|
|
ImplCycleCollectionUnlink(mozilla::WebGLFBAttachPoint& field)
|
2013-06-21 16:44:17 -07:00
|
|
|
|
{
|
2015-03-24 16:00:28 -07:00
|
|
|
|
field.Unlink();
|
2013-06-21 16:44:17 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void
|
2014-11-13 20:03:50 -08:00
|
|
|
|
ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& callback,
|
2015-07-14 17:37:28 -07:00
|
|
|
|
mozilla::WebGLFBAttachPoint& field,
|
2014-11-13 20:03:50 -08:00
|
|
|
|
const char* name,
|
|
|
|
|
uint32_t flags = 0)
|
2013-06-21 16:44:17 -07:00
|
|
|
|
{
|
2015-03-24 16:00:28 -07:00
|
|
|
|
CycleCollectionNoteChild(callback, field.Texture(), name, flags);
|
|
|
|
|
CycleCollectionNoteChild(callback, field.Renderbuffer(), name, flags);
|
2013-06-21 16:44:17 -07:00
|
|
|
|
}
|
|
|
|
|
|
2014-04-29 01:57:00 -07:00
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(WebGLFramebuffer,
|
2015-03-24 16:00:28 -07:00
|
|
|
|
mColorAttachment0,
|
2014-11-13 20:03:50 -08:00
|
|
|
|
mDepthAttachment,
|
|
|
|
|
mStencilAttachment,
|
2015-03-24 16:00:28 -07:00
|
|
|
|
mDepthStencilAttachment,
|
|
|
|
|
mMoreColorAttachments)
|
2012-10-04 13:35:54 -07:00
|
|
|
|
|
2013-08-29 08:39:17 -07:00
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(WebGLFramebuffer, AddRef)
|
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(WebGLFramebuffer, Release)
|
2014-11-13 20:03:50 -08:00
|
|
|
|
|
|
|
|
|
} // namespace mozilla
|