Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(220)

Unified Diff: gpu/command_buffer/service/texture_manager.cc

Issue 2149523002: Make invalidateFramebuffer no-op for DEPTH_STENCIL attachment (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add depth_cleared_ and stencil_cleared_ for class texture and renderbuffer. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: gpu/command_buffer/service/texture_manager.cc
diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc
index f6a75dd40e91325cd5bc88ee00c8f5b83fb822d3..bba568f5dd6cb3a922cb4f456b5682d550aa88d9 100644
--- a/gpu/command_buffer/service/texture_manager.cc
+++ b/gpu/command_buffer/service/texture_manager.cc
@@ -803,6 +803,52 @@ void Texture::SetLevelCleared(GLenum target, GLint level, bool cleared) {
UpdateCleared();
}
+void Texture::SetLevelCleared(GLenum target,
+ GLint level,
+ GLenum attachment,
+ bool cleared) {
+ DCHECK_GE(level, 0);
+ // Only take effect when the format is DEPTH_STENCIL
+ size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
+ DCHECK_LT(static_cast<size_t>(face_index), face_infos_.size());
+ DCHECK_LT(static_cast<size_t>(level),
+ face_infos_[face_index].level_infos.size());
+ Texture::LevelInfo& info = face_infos_[face_index].level_infos[level];
+ if (info.format != GL_DEPTH_STENCIL)
qiankun 2016/07/14 06:48:21 Will this be true in any conditions? I think only
+ return;
+ // cleared_ is true only when both depth and stencil part are cleared.
+ if (attachment == GL_DEPTH_ATTACHMENT) {
+ if (cleared == stencil_cleared_) {
+ // SetLevelCleared(target, level, cleared);
qiankun 2016/07/14 06:48:22 remove unused code.
+ UpdateMipCleared(&info, info.width, info.height,
+ cleared ? gfx::Rect(info.width, info.height) :
+ gfx::Rect());
+ UpdateCleared();
+ } else {
+ // SetLevelCleared(target, level, false);
+ UpdateMipCleared(&info, info.width, info.height, gfx::Rect());
+ UpdateCleared();
+ depth_cleared_ = cleared;
+ stencil_cleared_ = !cleared;
qiankun 2016/07/14 06:48:21 Should depth_cleared_ be updated in if branch? ste
+ }
+ }
+ else if (attachment == GL_STENCIL_ATTACHMENT) {
+ if (cleared == depth_cleared_) {
+ // SetLevelCleared(target, level, cleared);
+ UpdateMipCleared(&info, info.width, info.height,
+ cleared ? gfx::Rect(info.width, info.height) :
+ gfx::Rect());
+ UpdateCleared();
+ } else {
+ // SetLevelCleared(target, level, false);
+ UpdateMipCleared(&info, info.width, info.height, gfx::Rect());
+ UpdateCleared();
+ stencil_cleared_ = cleared;
+ depth_cleared_ = !cleared;
qiankun 2016/07/14 06:48:22 Same here.
+ }
+ }
+}
+
void Texture::UpdateCleared() {
if (face_infos_.empty()) {
return;
@@ -826,6 +872,9 @@ void Texture::UpdateSafeToRenderFrom(bool cleared) {
int delta = cleared ? -1 : +1;
for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it)
(*it)->manager()->UpdateSafeToRenderFrom(delta);
+
+ depth_cleared_ = cleared;
+ stencil_cleared_ = cleared;
}
void Texture::UpdateMipCleared(LevelInfo* info,
@@ -1403,6 +1452,26 @@ bool Texture::IsLevelCleared(GLenum target, GLint level) const {
return info.cleared_rect == gfx::Rect(info.width, info.height);
}
+bool Texture::IsLevelCleared(GLenum target,
+ GLint level,
+ GLenum attachment) const {
qiankun 2016/07/14 06:48:21 ASSERT(attachment == GL_DEPTH_ATTACHMENT || attach
+ size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
+ if (face_index >= face_infos_.size() ||
+ level < 0 ||
+ level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) {
+ return true;
+ }
+ const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level];
+ if (info.format != GL_DEPTH_STENCIL)
+ return info.cleared_rect == gfx::Rect(info.width, info.height);
+ if (attachment == GL_DEPTH_ATTACHMENT)
+ return depth_cleared_;
+ else if (attachment == GL_STENCIL_ATTACHMENT)
+ return stencil_cleared_;
+ // Should not be reached
+ return info.cleared_rect == gfx::Rect(info.width, info.height);
qiankun 2016/07/14 06:48:21 change to return attachment == GL_DEPTH_ATTACHMEN
+}
+
bool Texture::IsLevelPartiallyCleared(GLenum target, GLint level) const {
size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
if (face_index >= face_infos_.size() ||
@@ -1907,6 +1976,15 @@ void TextureManager::SetLevelCleared(TextureRef* ref,
ref->texture()->SetLevelCleared(target, level, cleared);
}
+void TextureManager::SetLevelCleared(TextureRef* ref,
+ GLenum target,
+ GLint level,
+ GLenum attachment,
+ bool cleared) {
+ DCHECK(ref);
+ ref->texture()->SetLevelCleared(target, level, attachment, cleared);
+}
+
bool TextureManager::ClearRenderableLevels(
GLES2Decoder* decoder, TextureRef* ref) {
DCHECK(ref);

Powered by Google App Engine
This is Rietveld 408576698