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

Side by Side Diff: gpu/command_buffer/service/framebuffer_manager_unittest.cc

Issue 1278333003: Fix crash caused by concurrent access to framebuffer_combo_complete_map_. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments; return unittesting of cache behaviour. Created 5 years, 4 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/error_state_mock.h" 5 #include "gpu/command_buffer/service/error_state_mock.h"
6 #include "gpu/command_buffer/service/framebuffer_manager.h" 6 #include "gpu/command_buffer/service/framebuffer_manager.h"
7 #include "gpu/command_buffer/service/feature_info.h" 7 #include "gpu/command_buffer/service/feature_info.h"
8 #include "gpu/command_buffer/service/gpu_service_test.h" 8 #include "gpu/command_buffer/service/gpu_service_test.h"
9 #include "gpu/command_buffer/service/renderbuffer_manager.h" 9 #include "gpu/command_buffer/service/renderbuffer_manager.h"
10 #include "gpu/command_buffer/service/test_helper.h" 10 #include "gpu/command_buffer/service/test_helper.h"
(...skipping 16 matching lines...) Expand all
27 const GLint kMaxSamples = 4; 27 const GLint kMaxSamples = 4;
28 const uint32 kMaxDrawBuffers = 16; 28 const uint32 kMaxDrawBuffers = 16;
29 const uint32 kMaxColorAttachments = 16; 29 const uint32 kMaxColorAttachments = 16;
30 const bool kUseDefaultTextures = false; 30 const bool kUseDefaultTextures = false;
31 31
32 } // namespace 32 } // namespace
33 33
34 class FramebufferManagerTest : public GpuServiceTest { 34 class FramebufferManagerTest : public GpuServiceTest {
35 public: 35 public:
36 FramebufferManagerTest() 36 FramebufferManagerTest()
37 : manager_(1, 1, ContextGroup::CONTEXT_TYPE_UNDEFINED), 37 : manager_(1, 1, ContextGroup::CONTEXT_TYPE_UNDEFINED, NULL),
38 feature_info_(new FeatureInfo()) { 38 feature_info_(new FeatureInfo()) {
39 texture_manager_.reset(new TextureManager(NULL, 39 texture_manager_.reset(new TextureManager(NULL,
40 feature_info_.get(), 40 feature_info_.get(),
41 kMaxTextureSize, 41 kMaxTextureSize,
42 kMaxCubemapSize, 42 kMaxCubemapSize,
43 kMaxRectangleTextureSize, 43 kMaxRectangleTextureSize,
44 kMax3DTextureSize, 44 kMax3DTextureSize,
45 kUseDefaultTextures)); 45 kUseDefaultTextures));
46 renderbuffer_manager_.reset(new RenderbufferManager(NULL, 46 renderbuffer_manager_.reset(new RenderbufferManager(NULL,
47 kMaxRenderbufferSize, 47 kMaxRenderbufferSize,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 framebuffer1 = manager_.GetFramebuffer(kClient1Id); 104 framebuffer1 = manager_.GetFramebuffer(kClient1Id);
105 ASSERT_TRUE(framebuffer1 == NULL); 105 ASSERT_TRUE(framebuffer1 == NULL);
106 } 106 }
107 107
108 class FramebufferInfoTestBase : public GpuServiceTest { 108 class FramebufferInfoTestBase : public GpuServiceTest {
109 public: 109 public:
110 static const GLuint kClient1Id = 1; 110 static const GLuint kClient1Id = 1;
111 static const GLuint kService1Id = 11; 111 static const GLuint kService1Id = 11;
112 112
113 explicit FramebufferInfoTestBase(ContextGroup::ContextType context_type) 113 explicit FramebufferInfoTestBase(ContextGroup::ContextType context_type)
114 : manager_(kMaxDrawBuffers, kMaxColorAttachments, context_type), 114 : manager_(kMaxDrawBuffers, kMaxColorAttachments, context_type, NULL),
115 feature_info_(new FeatureInfo()) { 115 feature_info_(new FeatureInfo()) {
116 manager_.SetFramebufferComboCompleteCacheForTesting(
117 new FramebufferCompletenessCache);
116 texture_manager_.reset(new TextureManager(NULL, 118 texture_manager_.reset(new TextureManager(NULL,
117 feature_info_.get(), 119 feature_info_.get(),
118 kMaxTextureSize, 120 kMaxTextureSize,
119 kMaxCubemapSize, 121 kMaxCubemapSize,
120 kMaxRectangleTextureSize, 122 kMaxRectangleTextureSize,
121 kMax3DTextureSize, 123 kMax3DTextureSize,
122 kUseDefaultTextures)); 124 kUseDefaultTextures));
123 renderbuffer_manager_.reset(new RenderbufferManager(NULL, 125 renderbuffer_manager_.reset(new RenderbufferManager(NULL,
124 kMaxRenderbufferSize, 126 kMaxRenderbufferSize,
125 kMaxSamples, 127 kMaxSamples,
(...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after
828 texture_manager_->GetTexture(kTextureClient2Id)); 830 texture_manager_->GetTexture(kTextureClient2Id));
829 ASSERT_TRUE(texture2.get() != NULL); 831 ASSERT_TRUE(texture2.get() != NULL);
830 texture_manager_->SetTarget(texture2.get(), GL_TEXTURE_2D); 832 texture_manager_->SetTarget(texture2.get(), GL_TEXTURE_2D);
831 833
832 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) 834 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
833 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) 835 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
834 .RetiresOnSaturation(); 836 .RetiresOnSaturation();
835 framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER); 837 framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER);
836 838
837 // Check a second call for the same type does not call anything 839 // Check a second call for the same type does not call anything
838 if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
839 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
Ken Russell (switch to Gerrit) 2015/08/20 00:04:10 Why are these CheckFramebufferStatusEXT expectatio
no sievers 2015/08/20 00:11:29 Actually if you are setting the expectation than y
Tobias Sargeant 2015/08/20 11:05:13 Acknowledged.
Tobias Sargeant 2015/08/20 11:05:13 Acknowledged.
840 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
841 .RetiresOnSaturation();
842 }
843 framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER); 840 framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER);
844 841
845 // Check changing the attachments calls CheckFramebufferStatus. 842 // Check changing the attachments calls CheckFramebufferStatus.
846 framebuffer_->AttachTexture( 843 framebuffer_->AttachTexture(
847 GL_COLOR_ATTACHMENT0, texture2.get(), kTarget1, kLevel1, kSamples1); 844 GL_COLOR_ATTACHMENT0, texture2.get(), kTarget1, kLevel1, kSamples1);
848 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) 845 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
849 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)).RetiresOnSaturation(); 846 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)).RetiresOnSaturation();
850 framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER); 847 framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER);
851 848
852 // Check a second call for the same type does not call anything. 849 // Check a second call for the same type does not call anything.
853 if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
854 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
855 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
856 .RetiresOnSaturation();
857 }
858 framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER); 850 framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER);
859 851
860 // Check a second call with a different target calls CheckFramebufferStatus. 852 // Check a second call with a different target calls CheckFramebufferStatus.
861 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER)) 853 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
862 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) 854 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
863 .RetiresOnSaturation(); 855 .RetiresOnSaturation();
864 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); 856 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
865 857
866 // Check a second call for the same type does not call anything. 858 // Check a second call for the same type does not call anything.
867 if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
868 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
869 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
870 .RetiresOnSaturation();
871 }
872 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); 859 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
873 860
874 // Check adding another attachment calls CheckFramebufferStatus. 861 // Check adding another attachment calls CheckFramebufferStatus.
875 framebuffer_->AttachRenderbuffer(GL_DEPTH_ATTACHMENT, renderbuffer1); 862 framebuffer_->AttachRenderbuffer(GL_DEPTH_ATTACHMENT, renderbuffer1);
876 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER)) 863 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
877 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) 864 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
878 .RetiresOnSaturation(); 865 .RetiresOnSaturation();
879 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); 866 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
880 867
881 // Check a second call for the same type does not call anything. 868 // Check a second call for the same type does not call anything.
882 if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
883 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
884 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
885 .RetiresOnSaturation();
886 }
887 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); 869 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
888 870
889 // Check changing the format calls CheckFramebuffferStatus. 871 // Check changing the format calls CheckFramebuffferStatus.
890 TestHelper::SetTexParameteriWithExpectations(gl_.get(), 872 TestHelper::SetTexParameteriWithExpectations(gl_.get(),
891 error_state_.get(), 873 error_state_.get(),
892 texture_manager_.get(), 874 texture_manager_.get(),
893 texture2.get(), 875 texture2.get(),
894 GL_TEXTURE_WRAP_S, 876 GL_TEXTURE_WRAP_S,
895 GL_CLAMP_TO_EDGE, 877 GL_CLAMP_TO_EDGE,
896 GL_NO_ERROR); 878 GL_NO_ERROR);
897 879
898 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER)) 880 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
899 .WillOnce(Return(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)) 881 .WillOnce(Return(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT))
900 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) 882 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
901 .RetiresOnSaturation(); 883 .RetiresOnSaturation();
902 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); 884 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
903 885
904 // Check since it did not return FRAMEBUFFER_COMPLETE that it calls 886 // Check since it did not return FRAMEBUFFER_COMPLETE that it calls
905 // CheckFramebufferStatus 887 // CheckFramebufferStatus
906 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); 888 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
907 889
908 // Check putting it back does not call CheckFramebufferStatus. 890 // Check putting it back does not call CheckFramebufferStatus.
909 if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
910 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
911 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
912 .RetiresOnSaturation();
913 }
914 TestHelper::SetTexParameteriWithExpectations(gl_.get(), 891 TestHelper::SetTexParameteriWithExpectations(gl_.get(),
915 error_state_.get(), 892 error_state_.get(),
916 texture_manager_.get(), 893 texture_manager_.get(),
917 texture2.get(), 894 texture2.get(),
918 GL_TEXTURE_WRAP_S, 895 GL_TEXTURE_WRAP_S,
919 GL_REPEAT, 896 GL_REPEAT,
920 GL_NO_ERROR); 897 GL_NO_ERROR);
921 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); 898 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
922 899
923 // Check Unbinding does not call CheckFramebufferStatus 900 // Check Unbinding does not call CheckFramebufferStatus
924 framebuffer_->UnbindRenderbuffer(GL_RENDERBUFFER, renderbuffer1); 901 framebuffer_->UnbindRenderbuffer(GL_RENDERBUFFER, renderbuffer1);
925 if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
926 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
927 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
928 .RetiresOnSaturation();
929 }
930 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); 902 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
931 } 903 }
932 904
933 class FramebufferInfoES3Test : public FramebufferInfoTestBase { 905 class FramebufferInfoES3Test : public FramebufferInfoTestBase {
934 public: 906 public:
935 FramebufferInfoES3Test() 907 FramebufferInfoES3Test()
936 : FramebufferInfoTestBase(ContextGroup::CONTEXT_TYPE_WEBGL2) { 908 : FramebufferInfoTestBase(ContextGroup::CONTEXT_TYPE_WEBGL2) {
937 } 909 }
938 }; 910 };
939 911
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 renderbuffer_manager_->GetRenderbuffer(kRenderbufferClientId); 970 renderbuffer_manager_->GetRenderbuffer(kRenderbufferClientId);
999 ASSERT_TRUE(renderbuffer != NULL); 971 ASSERT_TRUE(renderbuffer != NULL);
1000 framebuffer_->AttachRenderbuffer(GL_COLOR_ATTACHMENT1, renderbuffer); 972 framebuffer_->AttachRenderbuffer(GL_COLOR_ATTACHMENT1, renderbuffer);
1001 EXPECT_TRUE(framebuffer_->GetReadBufferAttachment()); 973 EXPECT_TRUE(framebuffer_->GetReadBufferAttachment());
1002 } 974 }
1003 975
1004 } // namespace gles2 976 } // namespace gles2
1005 } // namespace gpu 977 } // namespace gpu
1006 978
1007 979
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698