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 <limits> | 8 #include <limits> |
9 | 9 |
10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
(...skipping 906 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
917 DeleteResourceInternal(it, Normal); | 917 DeleteResourceInternal(it, Normal); |
918 } else { | 918 } else { |
919 ChildMap::iterator child_it = children_.find(resource->child_id); | 919 ChildMap::iterator child_it = children_.find(resource->child_id); |
920 ResourceIdArray unused; | 920 ResourceIdArray unused; |
921 unused.push_back(id); | 921 unused.push_back(id); |
922 DeleteAndReturnUnusedResourcesToChild(child_it, Normal, unused); | 922 DeleteAndReturnUnusedResourcesToChild(child_it, Normal, unused); |
923 } | 923 } |
924 } | 924 } |
925 } | 925 } |
926 | 926 |
927 const ResourceProvider::Resource* ResourceProvider::LockForWrite( | 927 ResourceProvider::Resource* ResourceProvider::LockForWrite(ResourceId id) { |
928 ResourceId id) { | |
929 Resource* resource = GetResource(id); | 928 Resource* resource = GetResource(id); |
930 DCHECK(CanLockForWrite(id)); | 929 DCHECK(CanLockForWrite(id)); |
931 LazyAllocate(resource); | |
932 | 930 |
933 resource->locked_for_write = true; | 931 resource->locked_for_write = true; |
934 return resource; | 932 return resource; |
935 } | 933 } |
936 | 934 |
937 bool ResourceProvider::CanLockForWrite(ResourceId id) { | 935 bool ResourceProvider::CanLockForWrite(ResourceId id) { |
938 Resource* resource = GetResource(id); | 936 Resource* resource = GetResource(id); |
939 return !resource->locked_for_write && !resource->lock_for_read_count && | 937 return !resource->locked_for_write && !resource->lock_for_read_count && |
940 !resource->exported_count && resource->origin == Resource::Internal && | 938 !resource->exported_count && resource->origin == Resource::Internal && |
941 !resource->lost && ReadLockFenceHasPassed(resource); | 939 !resource->lost && ReadLockFenceHasPassed(resource); |
942 } | 940 } |
943 | 941 |
944 void ResourceProvider::UnlockForWrite(ResourceId id) { | 942 ResourceProvider::Resource* ResourceProvider::UnlockForWrite(ResourceId id) { |
piman
2014/10/10 21:52:08
nit: since you keep the resource_id in the locks,
reveman
2014/10/26 22:30:48
Done.
| |
945 Resource* resource = GetResource(id); | 943 Resource* resource = GetResource(id); |
946 DCHECK(resource->locked_for_write); | 944 DCHECK(resource->locked_for_write); |
947 DCHECK_EQ(resource->exported_count, 0); | 945 DCHECK_EQ(resource->exported_count, 0); |
948 DCHECK(resource->origin == Resource::Internal); | 946 DCHECK(resource->origin == Resource::Internal); |
949 resource->locked_for_write = false; | 947 resource->locked_for_write = false; |
950 } | |
951 | |
952 const ResourceProvider::Resource* | |
953 ResourceProvider::LockForWriteToGpuMemoryBuffer(ResourceId id) { | |
954 Resource* resource = GetResource(id); | |
955 DCHECK_EQ(GLTexture, resource->type); | |
956 DCHECK(CanLockForWrite(id)); | |
957 | |
958 if (!resource->gpu_memory_buffer) { | |
959 scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer = | |
960 gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( | |
961 resource->size, | |
962 ToGpuMemoryBufferFormat(resource->format), | |
963 gfx::GpuMemoryBuffer::MAP); | |
964 resource->gpu_memory_buffer = gpu_memory_buffer.release(); | |
965 resource->allocated = true; | |
966 } | |
967 | |
968 resource->locked_for_write = true; | |
969 return resource; | 948 return resource; |
970 } | 949 } |
971 | 950 |
972 void ResourceProvider::UnlockForWriteToGpuMemoryBuffer(ResourceId id) { | |
973 Resource* resource = GetResource(id); | |
974 DCHECK(resource->locked_for_write); | |
975 DCHECK_EQ(resource->exported_count, 0); | |
976 DCHECK(resource->origin == Resource::Internal); | |
977 DCHECK_EQ(GLTexture, resource->type); | |
978 | |
979 if (!resource->image_id) { | |
980 GLES2Interface* gl = ContextGL(); | |
981 DCHECK(gl); | |
982 resource->image_id = | |
983 gl->CreateImageCHROMIUM(resource->gpu_memory_buffer->AsClientBuffer(), | |
984 resource->size.width(), | |
985 resource->size.height(), | |
986 GL_RGBA); | |
987 } | |
988 | |
989 resource->locked_for_write = false; | |
990 resource->dirty_image = true; | |
991 | |
992 // GpuMemoryBuffer provides direct access to the memory used by the GPU. | |
993 // Read lock fences are required to ensure that we're not trying to map a | |
994 // buffer that is currently in-use by the GPU. | |
995 resource->read_lock_fences_enabled = true; | |
996 } | |
997 | |
998 const ResourceProvider::Resource* ResourceProvider::LockForWriteToSkSurface( | |
999 ResourceId id) { | |
1000 Resource* resource = GetResource(id); | |
1001 DCHECK_EQ(GLTexture, resource->type); | |
1002 DCHECK(CanLockForWrite(id)); | |
1003 | |
1004 resource->locked_for_write = true; | |
1005 if (!resource->sk_surface) { | |
1006 class GrContext* gr_context = GrContext(); | |
1007 // TODO(alokp): Implement TestContextProvider::GrContext(). | |
1008 if (!gr_context) | |
1009 return resource; | |
1010 | |
1011 LazyAllocate(resource); | |
1012 | |
1013 GrBackendTextureDesc desc; | |
1014 desc.fFlags = kRenderTarget_GrBackendTextureFlag; | |
1015 desc.fWidth = resource->size.width(); | |
1016 desc.fHeight = resource->size.height(); | |
1017 desc.fConfig = ToGrPixelConfig(resource->format); | |
1018 desc.fOrigin = kTopLeft_GrSurfaceOrigin; | |
1019 desc.fTextureHandle = resource->gl_id; | |
1020 skia::RefPtr<GrTexture> gr_texture = | |
1021 skia::AdoptRef(gr_context->wrapBackendTexture(desc)); | |
1022 SkSurface::TextRenderMode text_render_mode = | |
1023 use_distance_field_text_ ? SkSurface::kDistanceField_TextRenderMode | |
1024 : SkSurface::kStandard_TextRenderMode; | |
1025 resource->sk_surface = skia::AdoptRef(SkSurface::NewRenderTargetDirect( | |
1026 gr_texture->asRenderTarget(), text_render_mode)); | |
1027 } | |
1028 | |
1029 return resource; | |
1030 } | |
1031 | |
1032 void ResourceProvider::UnlockForWriteToSkSurface(ResourceId id) { | |
1033 Resource* resource = GetResource(id); | |
1034 DCHECK(resource->locked_for_write); | |
1035 DCHECK_EQ(resource->exported_count, 0); | |
1036 DCHECK(resource->origin == Resource::Internal); | |
1037 DCHECK_EQ(GLTexture, resource->type); | |
1038 resource->locked_for_write = false; | |
1039 } | |
1040 | |
1041 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( | 951 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( |
1042 ResourceProvider* resource_provider, | 952 ResourceProvider* resource_provider, |
1043 ResourceProvider::ResourceId resource_id) | 953 ResourceProvider::ResourceId resource_id) |
1044 : resource_provider_(resource_provider), | 954 : resource_provider_(resource_provider), |
1045 resource_id_(resource_id), | 955 resource_id_(resource_id), |
1046 texture_id_(resource_provider->LockForRead(resource_id)->gl_id) { | 956 texture_id_(resource_provider->LockForRead(resource_id)->gl_id) { |
1047 DCHECK(texture_id_); | 957 DCHECK(texture_id_); |
1048 } | 958 } |
1049 | 959 |
1050 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { | 960 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { |
(...skipping 18 matching lines...) Expand all Loading... | |
1069 unit_(unit), | 979 unit_(unit), |
1070 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) { | 980 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) { |
1071 } | 981 } |
1072 | 982 |
1073 ResourceProvider::ScopedSamplerGL::~ScopedSamplerGL() { | 983 ResourceProvider::ScopedSamplerGL::~ScopedSamplerGL() { |
1074 } | 984 } |
1075 | 985 |
1076 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL( | 986 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL( |
1077 ResourceProvider* resource_provider, | 987 ResourceProvider* resource_provider, |
1078 ResourceProvider::ResourceId resource_id) | 988 ResourceProvider::ResourceId resource_id) |
1079 : resource_provider_(resource_provider), | 989 : resource_provider_(resource_provider), resource_id_(resource_id) { |
1080 resource_id_(resource_id), | 990 Resource* resource = resource_provider->LockForWrite(resource_id); |
1081 texture_id_(resource_provider->LockForWrite(resource_id)->gl_id) { | 991 resource_provider_->LazyAllocate(resource); |
992 texture_id_ = resource->gl_id; | |
1082 DCHECK(texture_id_); | 993 DCHECK(texture_id_); |
1083 } | 994 } |
1084 | 995 |
1085 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { | 996 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { |
1086 resource_provider_->UnlockForWrite(resource_id_); | 997 resource_provider_->UnlockForWrite(resource_id_); |
1087 } | 998 } |
1088 | 999 |
1089 void ResourceProvider::PopulateSkBitmapWithResource( | 1000 void ResourceProvider::PopulateSkBitmapWithResource( |
1090 SkBitmap* sk_bitmap, const Resource* resource) { | 1001 SkBitmap* sk_bitmap, const Resource* resource) { |
1091 DCHECK_EQ(RGBA_8888, resource->format); | 1002 DCHECK_EQ(RGBA_8888, resource->format); |
(...skipping 29 matching lines...) Expand all Loading... | |
1121 | 1032 |
1122 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { | 1033 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { |
1123 resource_provider_->UnlockForWrite(resource_id_); | 1034 resource_provider_->UnlockForWrite(resource_id_); |
1124 } | 1035 } |
1125 | 1036 |
1126 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: | 1037 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: |
1127 ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider, | 1038 ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider, |
1128 ResourceProvider::ResourceId resource_id) | 1039 ResourceProvider::ResourceId resource_id) |
1129 : resource_provider_(resource_provider), | 1040 : resource_provider_(resource_provider), |
1130 resource_id_(resource_id), | 1041 resource_id_(resource_id), |
1131 gpu_memory_buffer_( | 1042 gpu_memory_buffer_(nullptr) { |
1132 resource_provider->LockForWriteToGpuMemoryBuffer(resource_id) | 1043 Resource* resource = resource_provider->LockForWrite(resource_id); |
1133 ->gpu_memory_buffer) { | 1044 DCHECK_EQ(GLTexture, resource->type); |
1045 format_ = resource->format; | |
1046 size_ = resource->size; | |
1047 std::swap(gpu_memory_buffer_, resource->gpu_memory_buffer); | |
1134 } | 1048 } |
1135 | 1049 |
1136 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: | 1050 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: |
1137 ~ScopedWriteLockGpuMemoryBuffer() { | 1051 ~ScopedWriteLockGpuMemoryBuffer() { |
1138 resource_provider_->UnlockForWriteToGpuMemoryBuffer(resource_id_); | 1052 Resource* resource = resource_provider_->UnlockForWrite(resource_id_); |
1053 if (!gpu_memory_buffer_) | |
1054 return; | |
1055 | |
1056 if (!resource->image_id) { | |
1057 GLES2Interface* gl = resource_provider_->ContextGL(); | |
1058 DCHECK(gl); | |
1059 | |
1060 resource->image_id = | |
1061 gl->CreateImageCHROMIUM(gpu_memory_buffer_->AsClientBuffer(), | |
1062 size_.width(), | |
1063 size_.height(), | |
1064 GL_RGBA); | |
1065 DCHECK(resource->image_id); | |
piman
2014/10/10 21:52:08
nit: remove DCHECK as with previous patch?
reveman
2014/10/26 22:30:48
Done.
| |
1066 } | |
1067 | |
1068 std::swap(resource->gpu_memory_buffer, gpu_memory_buffer_); | |
1069 resource->allocated = true; | |
1070 resource->dirty_image = true; | |
1071 | |
1072 // GpuMemoryBuffer provides direct access to the memory used by the GPU. | |
1073 // Read lock fences are required to ensure that we're not trying to map a | |
1074 // buffer that is currently in-use by the GPU. | |
1075 resource->read_lock_fences_enabled = true; | |
1076 } | |
1077 | |
1078 gfx::GpuMemoryBuffer* | |
1079 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() { | |
1080 if (!gpu_memory_buffer_) { | |
1081 scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer = | |
1082 resource_provider_->gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( | |
piman
2014/10/10 21:52:08
IIUC, this is called from the raster threads. Reso
reveman
2014/10/26 22:30:48
Done. Saving a GpuMemoryBufferManager pointer in t
| |
1083 size_, ToGpuMemoryBufferFormat(format_), gfx::GpuMemoryBuffer::MAP); | |
1084 gpu_memory_buffer_ = gpu_memory_buffer.release(); | |
1085 } | |
1086 | |
1087 return gpu_memory_buffer_; | |
1139 } | 1088 } |
1140 | 1089 |
1141 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( | 1090 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( |
1142 ResourceProvider* resource_provider, | 1091 ResourceProvider* resource_provider, |
1143 ResourceProvider::ResourceId resource_id) | 1092 ResourceProvider::ResourceId resource_id) |
1144 : resource_provider_(resource_provider), | 1093 : resource_provider_(resource_provider), resource_id_(resource_id) { |
1145 resource_id_(resource_id), | 1094 Resource* resource = resource_provider->LockForWrite(resource_id); |
1146 sk_surface_(resource_provider->LockForWriteToSkSurface(resource_id) | 1095 DCHECK_EQ(GLTexture, resource->type); |
1147 ->sk_surface.get()) { | 1096 |
1097 sk_surface_ = resource->sk_surface; | |
1098 if (!sk_surface_.get()) { | |
1099 class GrContext* gr_context = resource_provider->GrContext(); | |
1100 // TODO(alokp): Implement TestContextProvider::GrContext(). | |
1101 if (!gr_context) | |
1102 return; | |
1103 | |
1104 resource_provider->LazyAllocate(resource); | |
1105 | |
1106 GrBackendTextureDesc desc; | |
1107 desc.fFlags = kRenderTarget_GrBackendTextureFlag; | |
1108 desc.fWidth = resource->size.width(); | |
1109 desc.fHeight = resource->size.height(); | |
1110 desc.fConfig = ToGrPixelConfig(resource->format); | |
1111 desc.fOrigin = kTopLeft_GrSurfaceOrigin; | |
1112 desc.fTextureHandle = resource->gl_id; | |
1113 skia::RefPtr<GrTexture> gr_texture = | |
1114 skia::AdoptRef(gr_context->wrapBackendTexture(desc)); | |
1115 SkSurface::TextRenderMode text_render_mode = | |
1116 resource_provider_->use_distance_field_text_ | |
1117 ? SkSurface::kDistanceField_TextRenderMode | |
1118 : SkSurface::kStandard_TextRenderMode; | |
1119 sk_surface_ = skia::AdoptRef(SkSurface::NewRenderTargetDirect( | |
1120 gr_texture->asRenderTarget(), text_render_mode)); | |
1121 } | |
1148 } | 1122 } |
1149 | 1123 |
1150 ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() { | 1124 ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() { |
1151 resource_provider_->UnlockForWriteToSkSurface(resource_id_); | 1125 Resource* resource = resource_provider_->UnlockForWrite(resource_id_); |
1126 resource->sk_surface = sk_surface_; | |
1152 } | 1127 } |
1153 | 1128 |
1154 ResourceProvider::ResourceProvider( | 1129 ResourceProvider::ResourceProvider( |
1155 OutputSurface* output_surface, | 1130 OutputSurface* output_surface, |
1156 SharedBitmapManager* shared_bitmap_manager, | 1131 SharedBitmapManager* shared_bitmap_manager, |
1157 GpuMemoryBufferManager* gpu_memory_buffer_manager, | 1132 GpuMemoryBufferManager* gpu_memory_buffer_manager, |
1158 BlockingTaskRunner* blocking_main_thread_task_runner, | 1133 BlockingTaskRunner* blocking_main_thread_task_runner, |
1159 int highp_threshold_min, | 1134 int highp_threshold_min, |
1160 bool use_rgba_4444_texture_format, | 1135 bool use_rgba_4444_texture_format, |
1161 size_t id_allocation_chunk_size, | 1136 size_t id_allocation_chunk_size, |
(...skipping 929 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2091 ContextProvider* context_provider = output_surface_->context_provider(); | 2066 ContextProvider* context_provider = output_surface_->context_provider(); |
2092 return context_provider ? context_provider->ContextGL() : NULL; | 2067 return context_provider ? context_provider->ContextGL() : NULL; |
2093 } | 2068 } |
2094 | 2069 |
2095 class GrContext* ResourceProvider::GrContext() const { | 2070 class GrContext* ResourceProvider::GrContext() const { |
2096 ContextProvider* context_provider = output_surface_->context_provider(); | 2071 ContextProvider* context_provider = output_surface_->context_provider(); |
2097 return context_provider ? context_provider->GrContext() : NULL; | 2072 return context_provider ? context_provider->GrContext() : NULL; |
2098 } | 2073 } |
2099 | 2074 |
2100 } // namespace cc | 2075 } // namespace cc |
OLD | NEW |