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

Side by Side Diff: cc/resources/resource_provider_unittest.cc

Issue 1185443005: cc: Propagate read lock fences constraints to parent compositors. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Avoid ReadLockFenceHasPassed when not necessary. Created 5 years, 6 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 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 "cc/resources/resource_provider.h" 5 #include "cc/resources/resource_provider.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 10
(...skipping 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 id1); 1038 id1);
1039 child_resource_provider_->DeleteResource(id1); 1039 child_resource_provider_->DeleteResource(id1);
1040 EXPECT_EQ(1u, child_resource_provider_->num_resources()); 1040 EXPECT_EQ(1u, child_resource_provider_->num_resources());
1041 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1)); 1041 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1));
1042 } 1042 }
1043 1043
1044 EXPECT_EQ(0u, child_resource_provider_->num_resources()); 1044 EXPECT_EQ(0u, child_resource_provider_->num_resources());
1045 resource_provider_->DestroyChild(child_id); 1045 resource_provider_->DestroyChild(child_id);
1046 } 1046 }
1047 1047
1048 class TestFence : public ResourceProvider::Fence {
1049 public:
1050 TestFence() {}
1051
1052 void Set() override {}
1053 bool HasPassed() override { return passed; }
1054 void Wait() override {}
1055
1056 bool passed = false;
1057
1058 private:
1059 ~TestFence() override {}
1060 };
1061
1062 TEST_P(ResourceProviderTest, ReadLockFenceStopsReturnToChildOrDelete) {
1063 if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE)
1064 return;
1065 gfx::Size size(1, 1);
1066 ResourceFormat format = RGBA_8888;
1067
1068 ResourceId id1 = child_resource_provider_->CreateResource(
1069 size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format);
1070 uint8_t data1[4] = {1, 2, 3, 4};
1071 child_resource_provider_->CopyToResource(id1, data1, size);
1072 child_resource_provider_->EnableReadLockFencesForTesting(id1);
1073 ReturnedResourceArray returned_to_child;
1074 int child_id =
1075 resource_provider_->CreateChild(GetReturnCallback(&returned_to_child));
1076
1077 // Transfer some resources to the parent.
1078 ResourceProvider::ResourceIdArray resource_ids_to_transfer;
1079 resource_ids_to_transfer.push_back(id1);
1080 TransferableResourceArray list;
1081 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer,
1082 &list);
1083 ASSERT_EQ(1u, list.size());
1084 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1));
1085 EXPECT_TRUE(list[0].read_lock_fences_enabled);
1086
1087 resource_provider_->ReceiveFromChild(child_id, list);
1088
1089 scoped_refptr<TestFence> fence(new TestFence);
1090 resource_provider_->SetReadLockFence(fence.get());
1091 {
1092 unsigned parent_id = list.front().id;
1093 resource_provider_->WaitSyncPointIfNeeded(parent_id);
1094 ResourceProvider::ScopedReadLockGL lock(resource_provider_.get(),
1095 parent_id);
1096 }
1097 resource_provider_->DeclareUsedResourcesFromChild(
1098 child_id, ResourceProvider::ResourceIdSet());
1099 EXPECT_EQ(0u, returned_to_child.size());
1100
1101 resource_provider_->DeclareUsedResourcesFromChild(
1102 child_id, ResourceProvider::ResourceIdSet());
1103 EXPECT_EQ(0u, returned_to_child.size());
1104 fence->passed = true;
1105
1106 resource_provider_->DeclareUsedResourcesFromChild(
1107 child_id, ResourceProvider::ResourceIdSet());
1108 EXPECT_EQ(1u, returned_to_child.size());
1109
1110 child_resource_provider_->ReceiveReturnsFromParent(returned_to_child);
1111 child_resource_provider_->DeleteResource(id1);
1112 EXPECT_EQ(0u, child_resource_provider_->num_resources());
1113 }
1114
1115 TEST_P(ResourceProviderTest, ReadLockFenceDestroyChild) {
1116 if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE)
1117 return;
1118 gfx::Size size(1, 1);
1119 ResourceFormat format = RGBA_8888;
1120
1121 ResourceId id1 = child_resource_provider_->CreateResource(
1122 size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format);
1123 uint8_t data[4] = {1, 2, 3, 4};
1124 child_resource_provider_->CopyToResource(id1, data, size);
1125 child_resource_provider_->EnableReadLockFencesForTesting(id1);
1126
1127 ResourceId id2 = child_resource_provider_->CreateResource(
1128 size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format);
1129 child_resource_provider_->CopyToResource(id2, data, size);
1130
1131 ReturnedResourceArray returned_to_child;
1132 int child_id =
1133 resource_provider_->CreateChild(GetReturnCallback(&returned_to_child));
1134
1135 // Transfer resources to the parent.
1136 ResourceProvider::ResourceIdArray resource_ids_to_transfer;
1137 resource_ids_to_transfer.push_back(id1);
1138 resource_ids_to_transfer.push_back(id2);
1139 TransferableResourceArray list;
1140 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer,
1141 &list);
1142 ASSERT_EQ(2u, list.size());
1143 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1));
1144 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2));
1145
1146 resource_provider_->ReceiveFromChild(child_id, list);
1147
1148 scoped_refptr<TestFence> fence(new TestFence);
1149 resource_provider_->SetReadLockFence(fence.get());
1150 {
1151 for (size_t i = 0; i < list.size(); i++) {
1152 unsigned parent_id = list[i].id;
1153 resource_provider_->WaitSyncPointIfNeeded(parent_id);
1154 ResourceProvider::ScopedReadLockGL lock(resource_provider_.get(),
1155 parent_id);
1156 }
1157 }
1158 EXPECT_EQ(0u, returned_to_child.size());
1159
1160 EXPECT_EQ(2u, resource_provider_->num_resources());
1161
1162 resource_provider_->DestroyChild(child_id);
1163
1164 EXPECT_EQ(0u, resource_provider_->num_resources());
1165 EXPECT_EQ(2u, returned_to_child.size());
1166
1167 // id1 should be lost and id2 should not.
1168 EXPECT_EQ(returned_to_child[0].lost, returned_to_child[0].id == id1);
1169 EXPECT_EQ(returned_to_child[1].lost, returned_to_child[1].id == id1);
1170
1171 child_resource_provider_->ReceiveReturnsFromParent(returned_to_child);
1172 child_resource_provider_->DeleteResource(id1);
1173 child_resource_provider_->DeleteResource(id2);
1174 EXPECT_EQ(0u, child_resource_provider_->num_resources());
1175 }
1176
1177 TEST_P(ResourceProviderTest, ReadLockFenceContextLost) {
1178 if (GetParam() != ResourceProvider::RESOURCE_TYPE_GL_TEXTURE)
1179 return;
1180 gfx::Size size(1, 1);
1181 ResourceFormat format = RGBA_8888;
1182
1183 ResourceId id1 = child_resource_provider_->CreateResource(
1184 size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format);
1185 uint8_t data[4] = {1, 2, 3, 4};
1186 child_resource_provider_->CopyToResource(id1, data, size);
1187 child_resource_provider_->EnableReadLockFencesForTesting(id1);
1188
1189 ResourceId id2 = child_resource_provider_->CreateResource(
1190 size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format);
1191 child_resource_provider_->CopyToResource(id2, data, size);
1192
1193 ReturnedResourceArray returned_to_child;
1194 int child_id =
1195 resource_provider_->CreateChild(GetReturnCallback(&returned_to_child));
1196
1197 // Transfer resources to the parent.
1198 ResourceProvider::ResourceIdArray resource_ids_to_transfer;
1199 resource_ids_to_transfer.push_back(id1);
1200 resource_ids_to_transfer.push_back(id2);
1201 TransferableResourceArray list;
1202 child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer,
1203 &list);
1204 ASSERT_EQ(2u, list.size());
1205 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1));
1206 EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2));
1207
1208 resource_provider_->ReceiveFromChild(child_id, list);
1209
1210 scoped_refptr<TestFence> fence(new TestFence);
1211 resource_provider_->SetReadLockFence(fence.get());
1212 {
1213 for (size_t i = 0; i < list.size(); i++) {
1214 unsigned parent_id = list[i].id;
1215 resource_provider_->WaitSyncPointIfNeeded(parent_id);
1216 ResourceProvider::ScopedReadLockGL lock(resource_provider_.get(),
1217 parent_id);
1218 }
1219 }
1220 EXPECT_EQ(0u, returned_to_child.size());
1221
1222 EXPECT_EQ(2u, resource_provider_->num_resources());
1223 resource_provider_->DidLoseOutputSurface();
1224 resource_provider_ = nullptr;
1225
1226 EXPECT_EQ(2u, returned_to_child.size());
1227
1228 EXPECT_TRUE(returned_to_child[0].lost);
1229 EXPECT_TRUE(returned_to_child[1].lost);
1230 }
1231
1048 TEST_P(ResourceProviderTest, TransferSoftwareResources) { 1232 TEST_P(ResourceProviderTest, TransferSoftwareResources) {
1049 if (GetParam() != ResourceProvider::RESOURCE_TYPE_BITMAP) 1233 if (GetParam() != ResourceProvider::RESOURCE_TYPE_BITMAP)
1050 return; 1234 return;
1051 1235
1052 gfx::Size size(1, 1); 1236 gfx::Size size(1, 1);
1053 ResourceFormat format = RGBA_8888; 1237 ResourceFormat format = RGBA_8888;
1054 size_t pixel_size = TextureSizeBytes(size, format); 1238 size_t pixel_size = TextureSizeBytes(size, format);
1055 ASSERT_EQ(4U, pixel_size); 1239 ASSERT_EQ(4U, pixel_size);
1056 1240
1057 ResourceId id1 = child_resource_provider_->CreateResource( 1241 ResourceId id1 = child_resource_provider_->CreateResource(
(...skipping 2570 matching lines...) Expand 10 before | Expand all | Expand 10 after
3628 resource_provider->AllocateForTesting(id); 3812 resource_provider->AllocateForTesting(id);
3629 Mock::VerifyAndClearExpectations(context); 3813 Mock::VerifyAndClearExpectations(context);
3630 3814
3631 DCHECK_EQ(10u, context->PeekTextureId()); 3815 DCHECK_EQ(10u, context->PeekTextureId());
3632 resource_provider->DeleteResource(id); 3816 resource_provider->DeleteResource(id);
3633 } 3817 }
3634 } 3818 }
3635 3819
3636 } // namespace 3820 } // namespace
3637 } // namespace cc 3821 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698