/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _FRAMEBUFFER_DATA_H #define _FRAMEBUFFER_DATA_H #include "ObjectData.h" #include #include #include #include class SaveableTexture; typedef std::shared_ptr SaveableTexturePtr; class RenderbufferData : public ObjectData { public: RenderbufferData() : ObjectData(RENDERBUFFER_DATA) { }; RenderbufferData(android::base::Stream* stream); void onSave(android::base::Stream* stream, unsigned int globalName) const override; void restore(ObjectLocalName localName, const getGlobalName_t& getGlobalName) override; // Mark the texture handles dirty void makeTextureDirty(); GLuint attachedFB = 0; GLenum attachedPoint = 0; NamedObjectPtr eglImageGlobalTexObject = 0; SaveableTexturePtr saveableTexture = {}; // We call on the dispatcher rather than returning these values when // glGetRenderbufferParameter is called, so the initial format values here // are unimportant; hostInternalFormat still being GL_NONE indicates // we can skip the glRenderbufferStorage call when restoring this state. GLenum internalformat = GL_RGBA4; GLenum hostInternalFormat = GL_NONE; GLsizei width = 0; GLsizei height = 0; GLint samples = 0; bool everBound = false; }; const int MAX_ATTACH_POINTS = 19; class FramebufferData : public ObjectData { public: explicit FramebufferData(GLuint name, GLuint globalName); FramebufferData(android::base::Stream* stream); ~FramebufferData(); void onSave(android::base::Stream* stream, unsigned int globalName) const override; void postLoad(const getObjDataPtr_t& getObjDataPtr) override; void restore(ObjectLocalName localName, const getGlobalName_t& getGlobalName) override; void setAttachment(class GLEScontext* ctx, GLenum attachment, GLenum target, GLuint name, ObjectDataPtr obj, bool takeOwnership = false); GLuint getAttachment(GLenum attachment, GLenum *outTarget, ObjectDataPtr *outObj); GLint getAttachmentSamples(class GLEScontext* ctx, GLenum attachment); void getAttachmentDimensions(class GLEScontext* ctx, GLenum attachment, GLint* width, GLint* height); GLint getAttachmentInternalFormat(class GLEScontext* ctx, GLenum attachment); void validate(class GLEScontext* ctx); void setBoundAtLeastOnce() { m_hasBeenBound = true; } bool hasBeenBoundAtLeastOnce() const { return m_hasBeenBound; } void setDrawBuffers(GLsizei n, const GLenum * bufs); void setReadBuffers(GLenum src); GLenum getReadBuffer() const { return m_readBuffer; } // Mark the texture handles dirty void makeTextureDirty(const getObjDataPtr_t& getObjDataPtr); void separateDepthStencilWorkaround(class GLEScontext* ctx); private: inline int attachmentPointIndex(GLenum attachment); void detachObject(int idx); void refreshSeparateDepthStencilAttachmentState(); private: GLuint m_fbName = 0; GLuint m_fbGlobalName = 0; struct attachPoint { GLenum target; // OGL if owned, GLES otherwise GLuint name; // OGL if owned, GLES otherwise GLuint globalName; // derived from |name| on attachment setting // objType is only used in snapshot postLoad, for retrieving obj. // objType's data is only valid between loading and postLoad snapshot NamedObjectType objType; ObjectDataPtr obj; bool owned; } m_attachPoints[MAX_ATTACH_POINTS+1] = {}; bool m_dirty = false; bool m_hasBeenBound = false; bool m_hasDrawBuffers = false; bool m_hasSeparateDepthStencil = false; // Invariant: m_separateDSEmulationRbo != 0 iff we are actively // emulating separate depth/stencil buffers. GLuint m_separateDSEmulationRbo = 0; std::vector m_drawBuffers = {}; GLenum m_readBuffer = GL_COLOR_ATTACHMENT0; }; #endif