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

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: fixes 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,
38 1,
39 ContextGroup::CONTEXT_TYPE_UNDEFINED,
40 new FramebufferCompletenessCache),
38 feature_info_(new FeatureInfo()) { 41 feature_info_(new FeatureInfo()) {
39 texture_manager_.reset(new TextureManager(NULL, 42 texture_manager_.reset(new TextureManager(NULL,
40 feature_info_.get(), 43 feature_info_.get(),
41 kMaxTextureSize, 44 kMaxTextureSize,
42 kMaxCubemapSize, 45 kMaxCubemapSize,
43 kMaxRectangleTextureSize, 46 kMaxRectangleTextureSize,
44 kMax3DTextureSize, 47 kMax3DTextureSize,
45 kUseDefaultTextures)); 48 kUseDefaultTextures));
46 renderbuffer_manager_.reset(new RenderbufferManager(NULL, 49 renderbuffer_manager_.reset(new RenderbufferManager(NULL,
47 kMaxRenderbufferSize, 50 kMaxRenderbufferSize,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 framebuffer1 = manager_.GetFramebuffer(kClient1Id); 107 framebuffer1 = manager_.GetFramebuffer(kClient1Id);
105 ASSERT_TRUE(framebuffer1 == NULL); 108 ASSERT_TRUE(framebuffer1 == NULL);
106 } 109 }
107 110
108 class FramebufferInfoTestBase : public GpuServiceTest { 111 class FramebufferInfoTestBase : public GpuServiceTest {
109 public: 112 public:
110 static const GLuint kClient1Id = 1; 113 static const GLuint kClient1Id = 1;
111 static const GLuint kService1Id = 11; 114 static const GLuint kService1Id = 11;
112 115
113 explicit FramebufferInfoTestBase(ContextGroup::ContextType context_type) 116 explicit FramebufferInfoTestBase(ContextGroup::ContextType context_type)
114 : manager_(kMaxDrawBuffers, kMaxColorAttachments, context_type), 117 : manager_(kMaxDrawBuffers,
118 kMaxColorAttachments,
119 context_type,
120 new FramebufferCompletenessCache),
115 feature_info_(new FeatureInfo()) { 121 feature_info_(new FeatureInfo()) {
116 texture_manager_.reset(new TextureManager(NULL, 122 texture_manager_.reset(new TextureManager(NULL,
117 feature_info_.get(), 123 feature_info_.get(),
118 kMaxTextureSize, 124 kMaxTextureSize,
119 kMaxCubemapSize, 125 kMaxCubemapSize,
120 kMaxRectangleTextureSize, 126 kMaxRectangleTextureSize,
121 kMax3DTextureSize, 127 kMax3DTextureSize,
122 kUseDefaultTextures)); 128 kUseDefaultTextures));
123 renderbuffer_manager_.reset(new RenderbufferManager(NULL, 129 renderbuffer_manager_.reset(new RenderbufferManager(NULL,
124 kMaxRenderbufferSize, 130 kMaxRenderbufferSize,
(...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 ASSERT_TRUE(renderbuffer1 != NULL); 831 ASSERT_TRUE(renderbuffer1 != NULL);
826 texture_manager_->CreateTexture(kTextureClient2Id, kTextureService2Id); 832 texture_manager_->CreateTexture(kTextureClient2Id, kTextureService2Id);
827 scoped_refptr<TextureRef> texture2( 833 scoped_refptr<TextureRef> texture2(
828 texture_manager_->GetTexture(kTextureClient2Id)); 834 texture_manager_->GetTexture(kTextureClient2Id));
829 ASSERT_TRUE(texture2.get() != NULL); 835 ASSERT_TRUE(texture2.get() != NULL);
830 texture_manager_->SetTarget(texture2.get(), GL_TEXTURE_2D); 836 texture_manager_->SetTarget(texture2.get(), GL_TEXTURE_2D);
831 837
832 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) 838 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
833 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) 839 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
834 .RetiresOnSaturation(); 840 .RetiresOnSaturation();
835 framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER); 841 ASSERT_EQ((GLenum)GL_FRAMEBUFFER_COMPLETE,
836 842 framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER));
837 // Check a second call for the same type does not call anything
838 if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
839 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
840 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
841 .RetiresOnSaturation();
842 }
843 framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER);
no sievers 2015/08/19 00:43:13 I think all of these GetStatus() calls are importa
Tobias Sargeant 2015/08/19 11:33:13 Done, and tested that it fails if the cache is uns
844 843
845 // Check changing the attachments calls CheckFramebufferStatus. 844 // Check changing the attachments calls CheckFramebufferStatus.
846 framebuffer_->AttachTexture( 845 framebuffer_->AttachTexture(
847 GL_COLOR_ATTACHMENT0, texture2.get(), kTarget1, kLevel1, kSamples1); 846 GL_COLOR_ATTACHMENT0, texture2.get(), kTarget1, kLevel1, kSamples1);
848 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) 847 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
849 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)).RetiresOnSaturation(); 848 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)).RetiresOnSaturation();
850 framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER); 849 ASSERT_EQ((GLenum)GL_FRAMEBUFFER_COMPLETE,
851 850 framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER));
852 // 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);
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 ASSERT_EQ(
865 857 (GLenum)GL_FRAMEBUFFER_COMPLETE,
866 // Check a second call for the same type does not call anything. 858 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER));
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);
873 859
874 // Check adding another attachment calls CheckFramebufferStatus. 860 // Check adding another attachment calls CheckFramebufferStatus.
875 framebuffer_->AttachRenderbuffer(GL_DEPTH_ATTACHMENT, renderbuffer1); 861 framebuffer_->AttachRenderbuffer(GL_DEPTH_ATTACHMENT, renderbuffer1);
876 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER)) 862 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
877 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) 863 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
878 .RetiresOnSaturation(); 864 .RetiresOnSaturation();
879 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); 865 ASSERT_EQ(
880 866 (GLenum)GL_FRAMEBUFFER_COMPLETE,
881 // Check a second call for the same type does not call anything. 867 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER));
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);
888 868
889 // Check changing the format calls CheckFramebuffferStatus. 869 // Check changing the format calls CheckFramebuffferStatus.
890 TestHelper::SetTexParameteriWithExpectations(gl_.get(), 870 TestHelper::SetTexParameteriWithExpectations(gl_.get(),
891 error_state_.get(), 871 error_state_.get(),
892 texture_manager_.get(), 872 texture_manager_.get(),
893 texture2.get(), 873 texture2.get(),
894 GL_TEXTURE_WRAP_S, 874 GL_TEXTURE_WRAP_S,
895 GL_CLAMP_TO_EDGE, 875 GL_CLAMP_TO_EDGE,
896 GL_NO_ERROR); 876 GL_NO_ERROR);
897 877
898 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER)) 878 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
899 .WillOnce(Return(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)) 879 .WillOnce(Return(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT))
900 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) 880 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
901 .RetiresOnSaturation(); 881 .RetiresOnSaturation();
902 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); 882 ASSERT_EQ(
883 (GLenum)GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,
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 that incomplete framebuffer statuses are not cached.
905 // CheckFramebufferStatus 887 ASSERT_EQ(
906 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); 888 (GLenum)GL_FRAMEBUFFER_COMPLETE,
907 889 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER));
908 // 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(),
915 error_state_.get(),
916 texture_manager_.get(),
917 texture2.get(),
918 GL_TEXTURE_WRAP_S,
919 GL_REPEAT,
920 GL_NO_ERROR);
921 framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
922
923 // Check Unbinding does not call CheckFramebufferStatus
924 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);
931 } 890 }
932 891
933 class FramebufferInfoES3Test : public FramebufferInfoTestBase { 892 class FramebufferInfoES3Test : public FramebufferInfoTestBase {
934 public: 893 public:
935 FramebufferInfoES3Test() 894 FramebufferInfoES3Test()
936 : FramebufferInfoTestBase(ContextGroup::CONTEXT_TYPE_WEBGL2) { 895 : FramebufferInfoTestBase(ContextGroup::CONTEXT_TYPE_WEBGL2) {
937 } 896 }
938 }; 897 };
939 898
940 TEST_F(FramebufferInfoES3Test, DifferentDimensions) { 899 TEST_F(FramebufferInfoES3Test, DifferentDimensions) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 renderbuffer_manager_->GetRenderbuffer(kRenderbufferClientId); 957 renderbuffer_manager_->GetRenderbuffer(kRenderbufferClientId);
999 ASSERT_TRUE(renderbuffer != NULL); 958 ASSERT_TRUE(renderbuffer != NULL);
1000 framebuffer_->AttachRenderbuffer(GL_COLOR_ATTACHMENT1, renderbuffer); 959 framebuffer_->AttachRenderbuffer(GL_COLOR_ATTACHMENT1, renderbuffer);
1001 EXPECT_TRUE(framebuffer_->GetReadBufferAttachment()); 960 EXPECT_TRUE(framebuffer_->GetReadBufferAttachment());
1002 } 961 }
1003 962
1004 } // namespace gles2 963 } // namespace gles2
1005 } // namespace gpu 964 } // namespace gpu
1006 965
1007 966
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698