void WebGLFBAttachPoint::FinalizeAttachment(gl::GLContext* gl, FBAttachment attachmentLoc) const { if (!HasImage()) { 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(), LOCAL_GL_RENDERBUFFER, 0); break; } return; } MOZ_ASSERT(HasImage()); if (Texture()) { MOZ_ASSERT(gl == Texture()->Context()->GL()); const GLenum imageTarget = ImageTarget().get(); const GLint mipLevel = MipLevel(); const GLuint glName = Texture()->mGLName; if (attachmentLoc == LOCAL_GL_DEPTH_STENCIL_ATTACHMENT) { gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_DEPTH_ATTACHMENT, imageTarget, glName, mipLevel); gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_STENCIL_ATTACHMENT, imageTarget, glName, mipLevel); } else { gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, attachmentLoc.get(), imageTarget, glName, mipLevel); } return; } if (Renderbuffer()) { Renderbuffer()->FramebufferRenderbuffer(attachmentLoc); return; } MOZ_CRASH(); }
JS::Value WebGLFBAttachPoint::GetParameter(const char* funcName, WebGLContext* webgl, JSContext* cx, GLenum target, GLenum attachment, GLenum pname, ErrorResult* const out_error) { const bool hasAttachment = (mTexturePtr || mRenderbufferPtr); if (!hasAttachment) { // Divergent between GLES 3 and 2. // GLES 2.0.25 p127: // "If the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is NONE, then querying any // other pname will generate INVALID_ENUM." // GLES 3.0.4 p240: // "If the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is NONE, no framebuffer is // bound to target. In this case querying pname // FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero, and all other queries // will generate an INVALID_OPERATION error." switch (pname) { case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: return JS::Int32Value(LOCAL_GL_NONE); case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: if (webgl->IsWebGL2()) return JS::NullValue(); break; default: break; } if (webgl->IsWebGL2()) { webgl->ErrorInvalidOperation("%s: No attachment at %s.", funcName, webgl->EnumName(attachment)); } else { webgl->ErrorInvalidEnum("%s: No attachment at %s.", funcName, webgl->EnumName(attachment)); } return JS::NullValue(); } bool isPNameValid = false; switch (pname) { case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: return JS::Int32Value(mTexturePtr ? LOCAL_GL_TEXTURE : LOCAL_GL_RENDERBUFFER); case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: return (mTexturePtr ? webgl->WebGLObjectAsJSValue(cx, mTexturePtr.get(), *out_error) : webgl->WebGLObjectAsJSValue(cx, mRenderbufferPtr.get(), *out_error)); //////////////// case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: isPNameValid = true; break; case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: MOZ_ASSERT(attachment != LOCAL_GL_DEPTH_STENCIL_ATTACHMENT); isPNameValid = true; break; case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: if (webgl->IsWebGL2() || webgl->IsExtensionEnabled(WebGLExtensionID::EXT_sRGB)) { const auto format = Format(); if (!format) return JS::NullValue(); return JS::Int32Value(format->format->isSRGB ? LOCAL_GL_SRGB : LOCAL_GL_LINEAR); } break; //////////////// case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: if (mTexturePtr) return JS::Int32Value(MipLevel()); break; case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: if (mTexturePtr) { GLenum face = 0; if (mTexturePtr->Target() == LOCAL_GL_TEXTURE_CUBE_MAP) { face = ImageTarget().get(); } return JS::Int32Value(face); } break; case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: if (mTexturePtr) { int32_t layer = 0; if (ImageTarget() == LOCAL_GL_TEXTURE_2D_ARRAY || ImageTarget() == LOCAL_GL_TEXTURE_3D) { layer = Layer(); } return JS::Int32Value(layer); } break; } if (!isPNameValid) { webgl->ErrorInvalidEnum("%s: Invalid pname: 0x%04x", funcName, pname); return JS::NullValue(); } gl::GLContext* gl = webgl->GL(); gl->MakeCurrent(); GLint ret = 0; gl->fGetFramebufferAttachmentParameteriv(target, attachment, pname, &ret); return JS::Int32Value(ret); }
void WebGLFBAttachPoint::FinalizeAttachment(gl::GLContext* gl, GLenum attachment) const { if (!HasImage()) { switch (attachment) { case LOCAL_GL_DEPTH_ATTACHMENT: case LOCAL_GL_STENCIL_ATTACHMENT: case LOCAL_GL_DEPTH_STENCIL_ATTACHMENT: break; default: gl->fFramebufferRenderbuffer(LOCAL_GL_FRAMEBUFFER, attachment, LOCAL_GL_RENDERBUFFER, 0); break; } return; } MOZ_ASSERT(HasImage()); if (Texture()) { MOZ_ASSERT(gl == Texture()->mContext->GL()); const GLenum imageTarget = ImageTarget().get(); const GLint mipLevel = MipLevel(); const GLint layer = Layer(); const GLuint glName = Texture()->mGLName; switch (imageTarget) { case LOCAL_GL_TEXTURE_2D: case LOCAL_GL_TEXTURE_CUBE_MAP_POSITIVE_X: case LOCAL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X: case LOCAL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y: case LOCAL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: case LOCAL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z: case LOCAL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: if (attachment == LOCAL_GL_DEPTH_STENCIL_ATTACHMENT) { gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_DEPTH_ATTACHMENT, imageTarget, glName, mipLevel); gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_STENCIL_ATTACHMENT, imageTarget, glName, mipLevel); } else { gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, attachment, imageTarget, glName, mipLevel); } break; case LOCAL_GL_TEXTURE_2D_ARRAY: case LOCAL_GL_TEXTURE_3D: if (attachment == LOCAL_GL_DEPTH_STENCIL_ATTACHMENT) { gl->fFramebufferTextureLayer(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_DEPTH_ATTACHMENT, glName, mipLevel, layer); gl->fFramebufferTextureLayer(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_STENCIL_ATTACHMENT, glName, mipLevel, layer); } else { gl->fFramebufferTextureLayer(LOCAL_GL_FRAMEBUFFER, attachment, glName, mipLevel, layer); } break; } return ; } if (Renderbuffer()) { Renderbuffer()->FramebufferRenderbuffer(attachment); return; } MOZ_CRASH(); }
bool WebGLFramebuffer::AttachPoint::IsDefined() const { return Renderbuffer() || (Texture() && Texture()->HasImageInfoAt(ImageTarget(), 0)); }