blob: a4104b90373d729ad3ff32f1ab6fe2e82b07ab82 [file] [log] [blame]
/*
* 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 <GLES/gl.h>
#include <GLES/glext.h>
#include <GLES3/gl3.h>
#include <vector>
class SaveableTexture;
typedef std::shared_ptr<SaveableTexture> 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<GLenum> m_drawBuffers = {};
GLenum m_readBuffer = GL_COLOR_ATTACHMENT0;
};
#endif