OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |