aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shared/OpenglCodecCommon/GLClientState.cpp274
-rw-r--r--shared/OpenglCodecCommon/GLClientState.h19
-rw-r--r--shared/OpenglCodecCommon/StateTrackingSupport.h90
3 files changed, 144 insertions, 239 deletions
diff --git a/shared/OpenglCodecCommon/GLClientState.cpp b/shared/OpenglCodecCommon/GLClientState.cpp
index 903a4378..2dfc80e3 100644
--- a/shared/OpenglCodecCommon/GLClientState.cpp
+++ b/shared/OpenglCodecCommon/GLClientState.cpp
@@ -123,7 +123,7 @@ void GLClientState::init() {
m_tex.activeUnit = &m_tex.unit[0];
m_tex.textureRecs = NULL;
- mRboState.boundRenderbuffer = 0;
+ mRboState.boundRenderbuffer = nullptr;
mFboState.boundDrawFramebuffer = 0;
mFboState.boundReadFramebuffer = 0;
@@ -1915,11 +1915,12 @@ GLenum GLClientState::checkFramebufferAttachmentCompleteness(GLenum target, GLen
// Check dimensions
GLuint id;
+ std::shared_ptr<RboProps> rbo;
switch (fbo_format_info.type) {
case FBO_ATTACHMENT_RENDERBUFFER:
- id = getFboAttachmentRboId(target, attachment);
+ rbo = getFboAttachmentRbo(target, attachment);
if (!fbo_format_info.rb_external) {
- if (0 == queryRboWidth(id) || 0 == queryRboHeight(id)) {
+ if (!rbo || 0 == rbo->width || 0 == rbo->height) {
ALOGD("%s: rbo has zero dimension\n", __func__);
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
}
@@ -2090,25 +2091,27 @@ void GLClientState::addRenderbuffers(GLsizei n, GLuint* renderbuffers) {
}
void GLClientState::removeRenderbuffers(GLsizei n, const GLuint* renderbuffers) {
- std::vector<GLuint> to_remove;
- for (size_t i = 0; i < n; i++) {
- if (renderbuffers[i] != 0) { // Never remove the zero rb.
- to_remove.push_back(renderbuffers[i]);
- setFboCompletenessDirtyForRbo(renderbuffers[i]);
- }
- }
-
+ std::vector<std::shared_ptr<RboProps>> to_remove;
bool unbindCurrent = false;
{
RenderbufferInfo::ScopedView view(mRboState.rboData);
- for (size_t i = 0; i < to_remove.size(); i++) {
- view.unref(to_remove[i]);
+ for (size_t i = 0; i < n; i++) {
+ if (renderbuffers[i] != 0) { // Never remove the zero rb.
+ auto rboPtr = view.get_shared_ptr(renderbuffers[i]);
+ if (!rboPtr) {
+ continue;
+ }
+ to_remove.push_back(rboPtr);
+ setFboCompletenessDirtyForRbo(rboPtr);
+ }
}
+
for (size_t i = 0; i < to_remove.size(); i++) {
- if (mRboState.boundRenderbuffer == renderbuffers[i]) {
+ if (mRboState.boundRenderbuffer == to_remove[i]) {
unbindCurrent = true;
break;
}
+ view.remove(to_remove[i]->id);
}
}
@@ -2128,90 +2131,32 @@ void GLClientState::bindRenderbuffer(GLenum target, GLuint name) {
(void)target; // Must be GL_RENDERBUFFER
RenderbufferInfo::ScopedView view(mRboState.rboData);
- if (name == mRboState.boundRenderbuffer) {
- return;
- }
- view.unref(mRboState.boundRenderbuffer);
-
- mRboState.boundRenderbuffer = name;
-
- if (!name) return;
-
- view.bind(name);
+ mRboState.boundRenderbuffer = view.bind(name);
}
GLuint GLClientState::boundRenderbuffer() const {
- return mRboState.boundRenderbuffer;
+ return mRboState.boundRenderbuffer->id;
}
void GLClientState::setBoundRenderbufferFormat(GLenum format) {
- RenderbufferInfo::ScopedView view(mRboState.rboData);
- RboProps* props = view.get(mRboState.boundRenderbuffer);
- if (!props) return;
- props->format = format;
+ mRboState.boundRenderbuffer->format = format;
}
void GLClientState::setBoundRenderbufferSamples(GLsizei samples) {
- RenderbufferInfo::ScopedView view(mRboState.rboData);
- RboProps* props = view.get(mRboState.boundRenderbuffer);
- if (!props) return;
- props->multisamples = samples;
+ mRboState.boundRenderbuffer->multisamples = samples;
}
void GLClientState::setBoundRenderbufferDimensions(GLsizei width, GLsizei height) {
- RenderbufferInfo::ScopedView view(mRboState.rboData);
- RboProps* props = view.get(mRboState.boundRenderbuffer);
- if (!props) return;
- props->width = width;
- props->height = height;
+ mRboState.boundRenderbuffer->width = width;
+ mRboState.boundRenderbuffer->height = height;
}
void GLClientState::setBoundRenderbufferEGLImageBacked() {
- RenderbufferInfo::ScopedView view(mRboState.rboData);
- RboProps* props = view.get(mRboState.boundRenderbuffer);
- if (!props) return;
- props->boundEGLImage = true;
+ mRboState.boundRenderbuffer->boundEGLImage = true;
}
// FBO//////////////////////////////////////////////////////////////////////////
-// Format querying
-
-GLenum GLClientState::queryRboFormat(GLuint rbo_name) const {
- RenderbufferInfo::ScopedView view(mRboState.rboData);
- const RboProps* props = view.get(rbo_name);
- if (!props) return 0;
- return props->format;
-}
-
-GLsizei GLClientState::queryRboSamples(GLuint rbo_name) const {
- RenderbufferInfo::ScopedView view(mRboState.rboData);
- const RboProps* props = view.get(rbo_name);
- if (!props) return 0;
- return props->multisamples;
-}
-
-GLsizei GLClientState::queryRboWidth(GLuint rbo_name) const {
- RenderbufferInfo::ScopedView view(mRboState.rboData);
- const RboProps* props = view.get(rbo_name);
- if (!props) return 0;
- return props->width;
-}
-
-GLsizei GLClientState::queryRboHeight(GLuint rbo_name) const {
- RenderbufferInfo::ScopedView view(mRboState.rboData);
- const RboProps* props = view.get(rbo_name);
- if (!props) return 0;
- return props->height;
-}
-
-bool GLClientState::queryRboEGLImageBacked(GLuint rbo_name) const {
- RenderbufferInfo::ScopedView view(mRboState.rboData);
- const RboProps* props = view.get(rbo_name);
- if (!props) return 0;
- return props->boundEGLImage;
-}
-
GLint GLClientState::queryTexInternalFormat(GLuint tex_name) const {
TextureRec* texrec = getTextureRec(tex_name);
if (!texrec) return -1;
@@ -2289,15 +2234,11 @@ void GLClientState::getBoundFramebufferFormat(
if (colorAttachmentIndex != -1) {
if (props.colorAttachmenti_hasRbo[colorAttachmentIndex]) {
res_info->type = FBO_ATTACHMENT_RENDERBUFFER;
- res_info->rb_format =
- queryRboFormat(
- props.colorAttachmenti_rbos[colorAttachmentIndex]);
+ res_info->rb_format = props.colorAttachmenti_rbos[colorAttachmentIndex]->format;
res_info->rb_multisamples =
- queryRboSamples(
- props.colorAttachmenti_rbos[colorAttachmentIndex]);
+ props.colorAttachmenti_rbos[colorAttachmentIndex]->multisamples;
res_info->rb_external =
- queryRboEGLImageBacked(
- props.colorAttachmenti_rbos[colorAttachmentIndex]);
+ props.colorAttachmenti_rbos[colorAttachmentIndex]->boundEGLImage;
} else if (props.colorAttachmenti_hasTex[colorAttachmentIndex]) {
res_info->type = FBO_ATTACHMENT_TEXTURE;
res_info->tex_external = queryTexEGLImageBacked(
@@ -2323,13 +2264,9 @@ void GLClientState::getBoundFramebufferFormat(
case GL_DEPTH_ATTACHMENT:
if (props.depthAttachment_hasRbo) {
res_info->type = FBO_ATTACHMENT_RENDERBUFFER;
- res_info->rb_format = queryRboFormat(props.depthAttachment_rbo);
- res_info->rb_multisamples =
- queryRboSamples(
- props.depthAttachment_rbo);
- res_info->rb_external =
- queryRboEGLImageBacked(
- props.depthAttachment_rbo);
+ res_info->rb_format = props.depthAttachment_rbo->format;
+ res_info->rb_multisamples = props.depthAttachment_rbo->multisamples;
+ res_info->rb_external = props.depthAttachment_rbo->boundEGLImage;
} else if (props.depthAttachment_hasTexObj) {
res_info->type = FBO_ATTACHMENT_TEXTURE;
res_info->tex_external = queryTexEGLImageBacked(props.depthAttachment_texture);
@@ -2347,13 +2284,9 @@ void GLClientState::getBoundFramebufferFormat(
case GL_STENCIL_ATTACHMENT:
if (props.stencilAttachment_hasRbo) {
res_info->type = FBO_ATTACHMENT_RENDERBUFFER;
- res_info->rb_format = queryRboFormat(props.stencilAttachment_rbo);
- res_info->rb_multisamples =
- queryRboSamples(
- props.stencilAttachment_rbo);
- res_info->rb_external =
- queryRboEGLImageBacked(
- props.stencilAttachment_rbo);
+ res_info->rb_format = props.stencilAttachment_rbo->format;
+ res_info->rb_multisamples = props.stencilAttachment_rbo->multisamples;
+ res_info->rb_external = props.stencilAttachment_rbo->boundEGLImage;
} else if (props.stencilAttachment_hasTexObj) {
res_info->type = FBO_ATTACHMENT_TEXTURE;
res_info->tex_external = queryTexEGLImageBacked(props.stencilAttachment_texture);
@@ -2371,13 +2304,9 @@ void GLClientState::getBoundFramebufferFormat(
case GL_DEPTH_STENCIL_ATTACHMENT:
if (props.depthstencilAttachment_hasRbo) {
res_info->type = FBO_ATTACHMENT_RENDERBUFFER;
- res_info->rb_format = queryRboFormat(props.depthstencilAttachment_rbo);
- res_info->rb_multisamples =
- queryRboSamples(
- props.depthstencilAttachment_rbo);
- res_info->rb_external =
- queryRboEGLImageBacked(
- props.depthstencilAttachment_rbo);
+ res_info->rb_format = props.depthstencilAttachment_rbo->format;
+ res_info->rb_multisamples = props.depthstencilAttachment_rbo->multisamples;
+ res_info->rb_external = props.depthstencilAttachment_rbo->boundEGLImage;
} else if (props.depthstencilAttachment_hasTexObj) {
res_info->type = FBO_ATTACHMENT_TEXTURE;
res_info->tex_external = queryTexEGLImageBacked(props.depthstencilAttachment_texture);
@@ -2506,22 +2435,6 @@ void GLClientState::removeFramebuffers(GLsizei n, const GLuint* framebuffers) {
if (framebuffers[i] == mFboState.boundReadFramebuffer) {
bindFramebuffer(GL_READ_FRAMEBUFFER, 0);
}
- // Remove references to all attachments
- auto fboProps = mFboState.fboData.find(framebuffers[i]);
- if (fboProps != mFboState.fboData.end()) {
- for (size_t j = 0; j < fboProps->second.colorAttachmenti_hasRbo.size(); j++) {
- view.unref(fboProps->second.colorAttachmenti_rbos[j]);
- }
- if (fboProps->second.depthAttachment_hasRbo && fboProps->second.depthAttachment_rbo) {
- view.unref(fboProps->second.depthAttachment_rbo);
- }
- if (fboProps->second.stencilAttachment_hasRbo && fboProps->second.stencilAttachment_rbo) {
- view.unref(fboProps->second.stencilAttachment_rbo);
- }
- if (fboProps->second.depthstencilAttachment_hasRbo && fboProps->second.depthstencilAttachment_rbo) {
- view.unref(fboProps->second.depthstencilAttachment_rbo);
- }
- }
mFboState.fboData.erase(framebuffers[i]);
}
}
@@ -2715,50 +2628,46 @@ void GLClientState::detachRboFromFbo(GLenum target, GLenum attachment, GLuint re
boundFboProps(target).completenessDirty = true;
RenderbufferInfo::ScopedView view(mRboState.rboData);
+ auto renderBufferSharedPtr = view.get_shared_ptr(renderbuffer);
if (colorAttachmentIndex != -1) {
if (boundFboProps(target).colorAttachmenti_hasRbo[colorAttachmentIndex] &&
- boundFboProps(target).colorAttachmenti_rbos[colorAttachmentIndex] == renderbuffer) {
- boundFboProps(target).colorAttachmenti_rbos[colorAttachmentIndex] = 0;
+ boundFboProps(target).colorAttachmenti_rbos[colorAttachmentIndex]
+ == renderBufferSharedPtr) {
+ boundFboProps(target).colorAttachmenti_rbos[colorAttachmentIndex] = nullptr;
boundFboProps(target).colorAttachmenti_hasRbo[colorAttachmentIndex] = false;
- view.unref(renderbuffer);
}
}
switch (attachment) {
case GL_DEPTH_ATTACHMENT:
- if (boundFboProps(target).depthAttachment_rbo == renderbuffer &&
+ if (boundFboProps(target).depthAttachment_rbo == renderBufferSharedPtr &&
boundFboProps(target).depthAttachment_hasRbo) {
- boundFboProps(target).depthAttachment_rbo = 0;
+ boundFboProps(target).depthAttachment_rbo = nullptr;
boundFboProps(target).depthAttachment_hasRbo = false;
- view.unref(renderbuffer);
}
break;
case GL_STENCIL_ATTACHMENT:
- if (boundFboProps(target).stencilAttachment_rbo == renderbuffer &&
+ if (boundFboProps(target).stencilAttachment_rbo == renderBufferSharedPtr &&
boundFboProps(target).stencilAttachment_hasRbo) {
- boundFboProps(target).stencilAttachment_rbo = 0;
+ boundFboProps(target).stencilAttachment_rbo = nullptr;
boundFboProps(target).stencilAttachment_hasRbo = false;
- view.unref(renderbuffer);
}
break;
case GL_DEPTH_STENCIL_ATTACHMENT:
- if (boundFboProps(target).depthAttachment_rbo == renderbuffer &&
+ if (boundFboProps(target).depthAttachment_rbo == renderBufferSharedPtr &&
boundFboProps(target).depthAttachment_hasRbo) {
- boundFboProps(target).depthAttachment_rbo = 0;
+ boundFboProps(target).depthAttachment_rbo = nullptr;
boundFboProps(target).depthAttachment_hasRbo = false;
- view.unref(renderbuffer);
}
- if (boundFboProps(target).stencilAttachment_rbo == renderbuffer &&
+ if (boundFboProps(target).stencilAttachment_rbo == renderBufferSharedPtr &&
boundFboProps(target).stencilAttachment_hasRbo) {
- boundFboProps(target).stencilAttachment_rbo = 0;
+ boundFboProps(target).stencilAttachment_rbo = nullptr;
boundFboProps(target).stencilAttachment_hasRbo = false;
- view.unref(renderbuffer);
}
- if (boundFboProps(target).depthstencilAttachment_rbo == renderbuffer &&
+ if (boundFboProps(target).depthstencilAttachment_rbo == renderBufferSharedPtr &&
boundFboProps(target).depthstencilAttachment_hasRbo) {
- boundFboProps(target).depthstencilAttachment_rbo = 0;
+ boundFboProps(target).depthstencilAttachment_rbo = nullptr;
boundFboProps(target).depthstencilAttachment_hasRbo = false;
- view.unref(renderbuffer);
}
break;
}
@@ -2774,65 +2683,51 @@ void GLClientState::attachRbo(GLenum target, GLenum attachment, GLuint renderbuf
boundFboProps(target).completenessDirty = true;
RenderbufferInfo::ScopedView view(mRboState.rboData);
+ auto rboSharedPtr = view.get_or_add_shared_ptr(renderbuffer);
if (colorAttachmentIndex != -1) {
- view.unref(boundFboProps(target).colorAttachmenti_rbos[colorAttachmentIndex]);
- view.ref(renderbuffer);
- boundFboProps(target).colorAttachmenti_rbos[colorAttachmentIndex] = renderbuffer;
+ boundFboProps(target).colorAttachmenti_rbos[colorAttachmentIndex] = rboSharedPtr;
boundFboProps(target).colorAttachmenti_hasRbo[colorAttachmentIndex] = attach;
}
switch (attachment) {
case GL_DEPTH_ATTACHMENT:
- view.unref(boundFboProps(target).depthAttachment_rbo);
- view.ref(renderbuffer);
- boundFboProps(target).depthAttachment_rbo = renderbuffer;
+ boundFboProps(target).depthAttachment_rbo = rboSharedPtr;
boundFboProps(target).depthAttachment_hasRbo = attach;
break;
case GL_STENCIL_ATTACHMENT:
- view.unref(boundFboProps(target).stencilAttachment_rbo);
- view.ref(renderbuffer);
- boundFboProps(target).stencilAttachment_rbo = renderbuffer;
+ boundFboProps(target).stencilAttachment_rbo = rboSharedPtr;
boundFboProps(target).stencilAttachment_hasRbo = attach;
break;
case GL_DEPTH_STENCIL_ATTACHMENT:
- view.unref(boundFboProps(target).depthAttachment_rbo);
- view.ref(renderbuffer);
- view.unref(boundFboProps(target).stencilAttachment_rbo);
- view.ref(renderbuffer);
- view.unref(boundFboProps(target).depthstencilAttachment_rbo);
- view.ref(renderbuffer);
- boundFboProps(target).depthAttachment_rbo = renderbuffer;
+ boundFboProps(target).depthAttachment_rbo = rboSharedPtr;
boundFboProps(target).depthAttachment_hasRbo = attach;
- boundFboProps(target).stencilAttachment_rbo = renderbuffer;
+ boundFboProps(target).stencilAttachment_rbo = rboSharedPtr;
boundFboProps(target).stencilAttachment_hasRbo = attach;
- boundFboProps(target).depthstencilAttachment_rbo = renderbuffer;
+ boundFboProps(target).depthstencilAttachment_rbo = rboSharedPtr;
boundFboProps(target).depthstencilAttachment_hasRbo = attach;
break;
}
}
-GLuint GLClientState::getFboAttachmentRboId(GLenum target, GLenum attachment) const {
- GLuint res = 0; // conservative
-
+std::shared_ptr<RboProps> GLClientState::getFboAttachmentRbo(GLenum target, GLenum attachment) const {
int colorAttachmentIndex =
glUtilsColorAttachmentIndex(attachment);
if (colorAttachmentIndex != -1) {
- res = boundFboProps_const(target).colorAttachmenti_rbos[colorAttachmentIndex];
+ return boundFboProps_const(target).colorAttachmenti_rbos[colorAttachmentIndex];
}
switch (attachment) {
case GL_DEPTH_ATTACHMENT:
- res = boundFboProps_const(target).depthAttachment_rbo;
- break;
+ return boundFboProps_const(target).depthAttachment_rbo;
case GL_STENCIL_ATTACHMENT:
- res = boundFboProps_const(target).stencilAttachment_rbo;
- break;
+ return boundFboProps_const(target).stencilAttachment_rbo;
case GL_DEPTH_STENCIL_ATTACHMENT:
- res = boundFboProps_const(target).depthstencilAttachment_rbo;
- break;
+ return boundFboProps_const(target).depthstencilAttachment_rbo;
}
- return res;
+
+ // Bad attachment enum. Should be unreachable.
+ return nullptr;
}
void GLClientState::setFboCompletenessDirtyForTexture(GLuint texture) {
@@ -2872,12 +2767,12 @@ void GLClientState::setFboCompletenessDirtyForTexture(GLuint texture) {
}
}
-void GLClientState::setFboCompletenessDirtyForRbo(GLuint rbo) {
+void GLClientState::setFboCompletenessDirtyForRbo(std::shared_ptr<RboProps> rbo) {
std::map<GLuint, FboProps>::iterator it = mFboState.fboData.begin();
while (it != mFboState.fboData.end()) {
FboProps& props = it->second;
for (int i = 0; i < m_hostDriverCaps.max_color_attachments; ++i) {
- if (props.colorAttachmenti_hasTex[i]) {
+ if (props.colorAttachmenti_hasRbo[i]) {
if (rbo == props.colorAttachmenti_rbos[i]) {
props.completenessDirty = true;
return;
@@ -2885,14 +2780,14 @@ void GLClientState::setFboCompletenessDirtyForRbo(GLuint rbo) {
}
}
- if (props.depthAttachment_hasTexObj) {
+ if (props.depthAttachment_hasRbo) {
if (rbo == props.depthAttachment_rbo) {
props.completenessDirty = true;
return;
}
}
- if (props.stencilAttachment_hasTexObj) {
+ if (props.stencilAttachment_hasRbo) {
if (rbo == props.stencilAttachment_rbo) {
props.completenessDirty = true;
return;
@@ -2947,7 +2842,7 @@ GLuint GLClientState::objectOfAttachment(GLenum target, GLenum attachment) const
if (props.colorAttachmenti_hasTex[colorAttachmentIndex]) {
return props.colorAttachmenti_textures[colorAttachmentIndex];
} else if (props.colorAttachmenti_hasRbo[colorAttachmentIndex]) {
- return props.colorAttachmenti_rbos[colorAttachmentIndex];
+ return props.colorAttachmenti_rbos[colorAttachmentIndex]->id;
} else {
return 0;
}
@@ -2958,7 +2853,7 @@ GLuint GLClientState::objectOfAttachment(GLenum target, GLenum attachment) const
if (props.depthAttachment_hasTexObj) {
return props.depthAttachment_texture;
} else if (props.depthAttachment_hasRbo) {
- return props.depthAttachment_rbo;
+ return props.depthAttachment_rbo->id;
} else {
return 0;
}
@@ -2967,7 +2862,7 @@ GLuint GLClientState::objectOfAttachment(GLenum target, GLenum attachment) const
if (props.stencilAttachment_hasTexObj) {
return props.stencilAttachment_texture;
} else if (props.stencilAttachment_hasRbo) {
- return props.stencilAttachment_rbo;
+ return props.stencilAttachment_rbo->id;
} else {
return 0;
}
@@ -2975,7 +2870,7 @@ GLuint GLClientState::objectOfAttachment(GLenum target, GLenum attachment) const
if (props.depthstencilAttachment_hasTexObj) {
return props.depthstencilAttachment_texture;
} else if (props.depthstencilAttachment_hasRbo) {
- return props.depthstencilAttachment_rbo;
+ return props.depthstencilAttachment_rbo->id;
} else {
return 0;
}
@@ -3056,6 +2951,11 @@ void GLClientState::setTextureData(SharedTextureDataMap* sharedTexData) {
void GLClientState::setRenderbufferInfo(RenderbufferInfo* rbInfo) {
mRboState.rboData = rbInfo;
+ if (rbInfo) {
+ RenderbufferInfo::ScopedView view(mRboState.rboData);
+ auto rbo = view.get_or_add_shared_ptr(0);
+ mRboState.boundRenderbuffer = rbo;
+ }
}
void GLClientState::setSamplerInfo(SamplerInfo* samplerInfo) {
@@ -3072,6 +2972,19 @@ bool GLClientState::compressedTexImageSizeCompatible(GLenum internalformat, GLsi
void GLClientState::fromMakeCurrent() {
if (mFboState.fboData.find(0) == mFboState.fboData.end()) {
addFreshFramebuffer(0);
+ FboProps& default_fb_props = mFboState.fboData[0];
+ default_fb_props.colorAttachmenti_hasRbo[0] = true;
+ default_fb_props.depthAttachment_hasRbo = true;
+ default_fb_props.stencilAttachment_hasRbo = true;
+ default_fb_props.depthstencilAttachment_hasRbo = true;
+ RenderbufferInfo::ScopedView view(mRboState.rboData);
+ // Use RBO 0 as placeholder
+ auto rbo0 = view.get_or_add_shared_ptr(0);
+ default_fb_props.colorAttachmenti_rbos[0] = rbo0;
+ default_fb_props.depthAttachment_rbo = rbo0;
+ default_fb_props.stencilAttachment_rbo = rbo0;
+ default_fb_props.depthstencilAttachment_rbo = rbo0;
+
}
if (!samplerExists(0)) {
@@ -3079,11 +2992,6 @@ void GLClientState::fromMakeCurrent() {
setExistence(ObjectType::Sampler, true, 1, &id);
}
- FboProps& default_fb_props = mFboState.fboData[0];
- default_fb_props.colorAttachmenti_hasRbo[0] = true;
- default_fb_props.depthAttachment_hasRbo = true;
- default_fb_props.stencilAttachment_hasRbo = true;
- default_fb_props.depthstencilAttachment_hasRbo = true;
}
void GLClientState::initFromCaps(
diff --git a/shared/OpenglCodecCommon/GLClientState.h b/shared/OpenglCodecCommon/GLClientState.h
index a9da8d09..b71054f0 100644
--- a/shared/OpenglCodecCommon/GLClientState.h
+++ b/shared/OpenglCodecCommon/GLClientState.h
@@ -99,10 +99,10 @@ struct FboProps {
bool stencilAttachment_hasTexObj;
bool depthstencilAttachment_hasTexObj;
- std::vector<GLuint> colorAttachmenti_rbos;
- GLuint depthAttachment_rbo = 0;
- GLuint stencilAttachment_rbo = 0;
- GLuint depthstencilAttachment_rbo = 0;
+ std::vector<std::shared_ptr<RboProps>> colorAttachmenti_rbos;
+ std::shared_ptr<RboProps> depthAttachment_rbo = 0;
+ std::shared_ptr<RboProps> stencilAttachment_rbo = 0;
+ std::shared_ptr<RboProps> depthstencilAttachment_rbo = 0;
std::vector<bool> colorAttachmenti_hasRbo;
bool depthAttachment_hasRbo = false;
@@ -495,7 +495,7 @@ public:
void detachRbo(GLuint renderbuffer);
void detachRboFromFbo(GLenum target, GLenum attachment, GLuint renderbuffer);
void attachRbo(GLenum target, GLenum attachment, GLuint renderbuffer);
- GLuint getFboAttachmentRboId(GLenum target, GLenum attachment) const;
+ std::shared_ptr<RboProps> getFboAttachmentRbo(GLenum target, GLenum attachment) const;
// FBO attachments in general
bool attachmentHasObject(GLenum target, GLenum attachment) const;
@@ -503,7 +503,7 @@ public:
// Dirty FBO completeness
void setFboCompletenessDirtyForTexture(GLuint texture);
- void setFboCompletenessDirtyForRbo(GLuint rbo_name);
+ void setFboCompletenessDirtyForRbo(std::shared_ptr<RboProps> rbo);
// Transform feedback state
void setTransformFeedbackActive(bool active);
@@ -712,7 +712,7 @@ private:
GLenum internalformat);
struct RboState {
- GLuint boundRenderbuffer;
+ std::shared_ptr<RboProps> boundRenderbuffer;
// Connects to share group.
// Expected that share group lifetime outlives this context.
RenderbufferInfo* rboData;
@@ -734,11 +734,6 @@ private:
const FboProps& boundFboProps_const(GLenum target) const;
// Querying framebuffer format
- GLenum queryRboFormat(GLuint name) const;
- GLsizei queryRboSamples(GLuint name) const;
- GLsizei queryRboWidth(GLuint name) const;
- GLsizei queryRboHeight(GLuint name) const;
- bool queryRboEGLImageBacked(GLuint name) const;
GLenum queryTexType(GLuint name) const;
GLsizei queryTexSamples(GLuint name) const;
diff --git a/shared/OpenglCodecCommon/StateTrackingSupport.h b/shared/OpenglCodecCommon/StateTrackingSupport.h
index 7a009d89..6ed8460b 100644
--- a/shared/OpenglCodecCommon/StateTrackingSupport.h
+++ b/shared/OpenglCodecCommon/StateTrackingSupport.h
@@ -20,6 +20,7 @@
#include "android/base/synchronization/AndroidLock.h"
#include <GLES2/gl2.h>
+#include <memory>
template <class IndexType, bool initialIsTrue>
class PredicateMap {
@@ -104,8 +105,8 @@ struct RboProps {
GLsizei width;
GLsizei height;
bool previouslyBound;
- uint32_t refcount;
bool boundEGLImage;
+ GLuint id;
};
struct SamplerProps {
@@ -130,7 +131,7 @@ protected:
struct RenderbufferInfo {
android::base::guest::Lock infoLock;
- android::base::HybridComponentManager<1000, uint32_t, RboProps> component;
+ android::base::HybridComponentManager<1000, uint32_t, std::shared_ptr<RboProps>> component;
void lock() { infoLock.lock(); }
void unlock() { infoLock.unlock(); }
@@ -139,62 +140,63 @@ struct RenderbufferInfo {
public:
ScopedView(RenderbufferInfo* info) : ScopedLockedView<RenderbufferInfo>(info) { }
bool hasRbo(GLuint id) const {
- const RboProps* info = internalInfo_const()->component.get_const(id);
- if (!info) return false;
- return 0 != info->refcount;
+ return nullptr != internalInfo_const()->component.get_const(id);
}
virtual ~ScopedView() = default;
RboProps* get(GLuint id) {
- return internalInfo()->component.get(id);
+ auto rboPropPtr = internalInfo()->component.get(id);
+ if (!rboPropPtr) {
+ return nullptr;
+ }
+ return rboPropPtr->get();
+ }
+ std::shared_ptr<RboProps> get_or_add_shared_ptr(GLuint id) {
+ auto rboPropPtr = internalInfo()->component.get(id);
+ if (!rboPropPtr) {
+ addFresh(id);
+ rboPropPtr = internalInfo()->component.get(id);
+ }
+ return *rboPropPtr;
+ }
+ std::shared_ptr<RboProps> get_shared_ptr(GLuint id) {
+ auto rboPropPtr = internalInfo()->component.get(id);
+ if (!internalInfo()->component.get(id)) {
+ return nullptr;
+ }
+ return *rboPropPtr;
}
const RboProps* get_const(GLuint id) {
- return internalInfo_const()->component.get_const(id);
+ auto rboPropPtr = internalInfo()->component.get_const(id);
+ if (!rboPropPtr) {
+ return nullptr;
+ }
+ return rboPropPtr->get();
}
void addFresh(GLuint id) {
- RboProps props;
- props.format = GL_NONE;
- props.multisamples = 0;
- props.width = 0;
- props.height = 0;
- props.previouslyBound = false;
- props.refcount = 1;
- props.boundEGLImage = false;
- internalInfo()->component.add(id, props);
+ std::shared_ptr<RboProps> props(new RboProps());
+ props->format = GL_NONE;
+ props->multisamples = 0;
+ props->width = 0;
+ props->height = 0;
+ props->previouslyBound = false;
+ props->boundEGLImage = false;
+ props->id = id;
+ internalInfo()->component.add(id, std::move(props));
}
- RboProps* bind(GLuint id) {
- if (!hasRbo(id)) addFresh(id);
- ref(id);
- RboProps* res = get(id);
+ std::shared_ptr<RboProps> bind(GLuint id) {
+ auto res = get_shared_ptr(id);
+ if (!res) {
+ addFresh(id);
+ res = get_shared_ptr(id);
+ }
res->previouslyBound = true;
return res;
}
- void ref(GLuint id) {
+ void remove(GLuint id) {
if (id == 0) {
return;
}
- if (!hasRbo(id)) addFresh(id);
- RboProps* props = get(id);
- if (!props) return;
- ++props->refcount;
- }
- bool unref(GLuint id) {
- if (id == 0) {
- return false;
- }
- RboProps* props = get(id);
- if (!props) return false;
- if (!props->refcount) return false;
- --props->refcount;
- bool gone = 0 == props->refcount;
- if (gone) {
- props->format = 0;
- props->multisamples = 0;
- props->width = 0;
- props->height = 0;
- props->previouslyBound = false;
- props->boundEGLImage = false;
- }
- return gone;
+ internalInfo()->component.remove(id);
}
};
};