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

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

Issue 645943002: cc: Move GpuMemoryBuffer allocation to worker threads. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@chromium-image-refactor
Patch Set: Created 6 years, 2 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
« no previous file with comments | « cc/resources/resource_provider.h ('k') | cc/resources/resource_provider_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/resources/resource_provider.h ('k') | cc/resources/resource_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698