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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/texture_manager.h" 5 #include "gpu/command_buffer/service/texture_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 796 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
797 DCHECK_LT(static_cast<size_t>(face_index), face_infos_.size()); 797 DCHECK_LT(static_cast<size_t>(face_index), face_infos_.size());
798 DCHECK_LT(static_cast<size_t>(level), 798 DCHECK_LT(static_cast<size_t>(level),
799 face_infos_[face_index].level_infos.size()); 799 face_infos_[face_index].level_infos.size());
800 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; 800 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level];
801 UpdateMipCleared(&info, info.width, info.height, 801 UpdateMipCleared(&info, info.width, info.height,
802 cleared ? gfx::Rect(info.width, info.height) : gfx::Rect()); 802 cleared ? gfx::Rect(info.width, info.height) : gfx::Rect());
803 UpdateCleared(); 803 UpdateCleared();
804 } 804 }
805 805
806 void Texture::SetLevelCleared(GLenum target,
807 GLint level,
808 GLenum attachment,
809 bool cleared) {
810 DCHECK_GE(level, 0);
811 // Only take effect when the format is DEPTH_STENCIL
812 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
813 DCHECK_LT(static_cast<size_t>(face_index), face_infos_.size());
814 DCHECK_LT(static_cast<size_t>(level),
815 face_infos_[face_index].level_infos.size());
816 Texture::LevelInfo& info = face_infos_[face_index].level_infos[level];
817 if (info.format != GL_DEPTH_STENCIL)
qiankun 2016/07/14 06:48:21 Will this be true in any conditions? I think only
818 return;
819 // cleared_ is true only when both depth and stencil part are cleared.
820 if (attachment == GL_DEPTH_ATTACHMENT) {
821 if (cleared == stencil_cleared_) {
822 // SetLevelCleared(target, level, cleared);
qiankun 2016/07/14 06:48:22 remove unused code.
823 UpdateMipCleared(&info, info.width, info.height,
824 cleared ? gfx::Rect(info.width, info.height) :
825 gfx::Rect());
826 UpdateCleared();
827 } else {
828 // SetLevelCleared(target, level, false);
829 UpdateMipCleared(&info, info.width, info.height, gfx::Rect());
830 UpdateCleared();
831 depth_cleared_ = cleared;
832 stencil_cleared_ = !cleared;
qiankun 2016/07/14 06:48:21 Should depth_cleared_ be updated in if branch? ste
833 }
834 }
835 else if (attachment == GL_STENCIL_ATTACHMENT) {
836 if (cleared == depth_cleared_) {
837 // SetLevelCleared(target, level, cleared);
838 UpdateMipCleared(&info, info.width, info.height,
839 cleared ? gfx::Rect(info.width, info.height) :
840 gfx::Rect());
841 UpdateCleared();
842 } else {
843 // SetLevelCleared(target, level, false);
844 UpdateMipCleared(&info, info.width, info.height, gfx::Rect());
845 UpdateCleared();
846 stencil_cleared_ = cleared;
847 depth_cleared_ = !cleared;
qiankun 2016/07/14 06:48:22 Same here.
848 }
849 }
850 }
851
806 void Texture::UpdateCleared() { 852 void Texture::UpdateCleared() {
807 if (face_infos_.empty()) { 853 if (face_infos_.empty()) {
808 return; 854 return;
809 } 855 }
810 856
811 const bool cleared = (num_uncleared_mips_ == 0); 857 const bool cleared = (num_uncleared_mips_ == 0);
812 858
813 // If texture is uncleared and is attached to a framebuffer, 859 // If texture is uncleared and is attached to a framebuffer,
814 // that framebuffer must be marked possibly incomplete. 860 // that framebuffer must be marked possibly incomplete.
815 if (!cleared && IsAttachedToFramebuffer()) { 861 if (!cleared && IsAttachedToFramebuffer()) {
816 IncAllFramebufferStateChangeCount(); 862 IncAllFramebufferStateChangeCount();
817 } 863 }
818 864
819 UpdateSafeToRenderFrom(cleared); 865 UpdateSafeToRenderFrom(cleared);
820 } 866 }
821 867
822 void Texture::UpdateSafeToRenderFrom(bool cleared) { 868 void Texture::UpdateSafeToRenderFrom(bool cleared) {
823 if (cleared_ == cleared) 869 if (cleared_ == cleared)
824 return; 870 return;
825 cleared_ = cleared; 871 cleared_ = cleared;
826 int delta = cleared ? -1 : +1; 872 int delta = cleared ? -1 : +1;
827 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it) 873 for (RefSet::iterator it = refs_.begin(); it != refs_.end(); ++it)
828 (*it)->manager()->UpdateSafeToRenderFrom(delta); 874 (*it)->manager()->UpdateSafeToRenderFrom(delta);
875
876 depth_cleared_ = cleared;
877 stencil_cleared_ = cleared;
829 } 878 }
830 879
831 void Texture::UpdateMipCleared(LevelInfo* info, 880 void Texture::UpdateMipCleared(LevelInfo* info,
832 GLsizei width, 881 GLsizei width,
833 GLsizei height, 882 GLsizei height,
834 const gfx::Rect& cleared_rect) { 883 const gfx::Rect& cleared_rect) {
835 bool was_cleared = info->cleared_rect == gfx::Rect(info->width, info->height); 884 bool was_cleared = info->cleared_rect == gfx::Rect(info->width, info->height);
836 info->width = width; 885 info->width = width;
837 info->height = height; 886 info->height = height;
838 info->cleared_rect = cleared_rect; 887 info->cleared_rect = cleared_rect;
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after
1396 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 1445 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
1397 if (face_index >= face_infos_.size() || 1446 if (face_index >= face_infos_.size() ||
1398 level < 0 || 1447 level < 0 ||
1399 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { 1448 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) {
1400 return true; 1449 return true;
1401 } 1450 }
1402 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; 1451 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level];
1403 return info.cleared_rect == gfx::Rect(info.width, info.height); 1452 return info.cleared_rect == gfx::Rect(info.width, info.height);
1404 } 1453 }
1405 1454
1455 bool Texture::IsLevelCleared(GLenum target,
1456 GLint level,
1457 GLenum attachment) const {
qiankun 2016/07/14 06:48:21 ASSERT(attachment == GL_DEPTH_ATTACHMENT || attach
1458 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
1459 if (face_index >= face_infos_.size() ||
1460 level < 0 ||
1461 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) {
1462 return true;
1463 }
1464 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level];
1465 if (info.format != GL_DEPTH_STENCIL)
1466 return info.cleared_rect == gfx::Rect(info.width, info.height);
1467 if (attachment == GL_DEPTH_ATTACHMENT)
1468 return depth_cleared_;
1469 else if (attachment == GL_STENCIL_ATTACHMENT)
1470 return stencil_cleared_;
1471 // Should not be reached
1472 return info.cleared_rect == gfx::Rect(info.width, info.height);
qiankun 2016/07/14 06:48:21 change to return attachment == GL_DEPTH_ATTACHMEN
1473 }
1474
1406 bool Texture::IsLevelPartiallyCleared(GLenum target, GLint level) const { 1475 bool Texture::IsLevelPartiallyCleared(GLenum target, GLint level) const {
1407 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 1476 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
1408 if (face_index >= face_infos_.size() || 1477 if (face_index >= face_infos_.size() ||
1409 level < 0 || 1478 level < 0 ||
1410 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) { 1479 level >= static_cast<GLint>(face_infos_[face_index].level_infos.size())) {
1411 return false; 1480 return false;
1412 } 1481 }
1413 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level]; 1482 const Texture::LevelInfo& info = face_infos_[face_index].level_infos[level];
1414 return (info.cleared_rect != gfx::Rect(info.width, info.height) && 1483 return (info.cleared_rect != gfx::Rect(info.width, info.height) &&
1415 info.cleared_rect != gfx::Rect()); 1484 info.cleared_rect != gfx::Rect());
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
1900 } 1969 }
1901 1970
1902 void TextureManager::SetLevelCleared(TextureRef* ref, 1971 void TextureManager::SetLevelCleared(TextureRef* ref,
1903 GLenum target, 1972 GLenum target,
1904 GLint level, 1973 GLint level,
1905 bool cleared) { 1974 bool cleared) {
1906 DCHECK(ref); 1975 DCHECK(ref);
1907 ref->texture()->SetLevelCleared(target, level, cleared); 1976 ref->texture()->SetLevelCleared(target, level, cleared);
1908 } 1977 }
1909 1978
1979 void TextureManager::SetLevelCleared(TextureRef* ref,
1980 GLenum target,
1981 GLint level,
1982 GLenum attachment,
1983 bool cleared) {
1984 DCHECK(ref);
1985 ref->texture()->SetLevelCleared(target, level, attachment, cleared);
1986 }
1987
1910 bool TextureManager::ClearRenderableLevels( 1988 bool TextureManager::ClearRenderableLevels(
1911 GLES2Decoder* decoder, TextureRef* ref) { 1989 GLES2Decoder* decoder, TextureRef* ref) {
1912 DCHECK(ref); 1990 DCHECK(ref);
1913 return ref->texture()->ClearRenderableLevels(decoder); 1991 return ref->texture()->ClearRenderableLevels(decoder);
1914 } 1992 }
1915 1993
1916 bool TextureManager::ClearTextureLevel( 1994 bool TextureManager::ClearTextureLevel(
1917 GLES2Decoder* decoder, TextureRef* ref, 1995 GLES2Decoder* decoder, TextureRef* ref,
1918 GLenum target, GLint level) { 1996 GLenum target, GLint level) {
1919 DCHECK(ref); 1997 DCHECK(ref);
(...skipping 1444 matching lines...) Expand 10 before | Expand all | Expand 10 after
3364 uint32_t TextureManager::GetServiceIdGeneration() const { 3442 uint32_t TextureManager::GetServiceIdGeneration() const {
3365 return current_service_id_generation_; 3443 return current_service_id_generation_;
3366 } 3444 }
3367 3445
3368 void TextureManager::IncrementServiceIdGeneration() { 3446 void TextureManager::IncrementServiceIdGeneration() {
3369 current_service_id_generation_++; 3447 current_service_id_generation_++;
3370 } 3448 }
3371 3449
3372 } // namespace gles2 3450 } // namespace gles2
3373 } // namespace gpu 3451 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698