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

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: address review feedback Created 6 years, 1 month 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 904 matching lines...) Expand 10 before | Expand all | Expand 10 after
915 DeleteResourceInternal(it, Normal); 915 DeleteResourceInternal(it, Normal);
916 } else { 916 } else {
917 ChildMap::iterator child_it = children_.find(resource->child_id); 917 ChildMap::iterator child_it = children_.find(resource->child_id);
918 ResourceIdArray unused; 918 ResourceIdArray unused;
919 unused.push_back(id); 919 unused.push_back(id);
920 DeleteAndReturnUnusedResourcesToChild(child_it, Normal, unused); 920 DeleteAndReturnUnusedResourcesToChild(child_it, Normal, unused);
921 } 921 }
922 } 922 }
923 } 923 }
924 924
925 const ResourceProvider::Resource* ResourceProvider::LockForWrite( 925 ResourceProvider::Resource* ResourceProvider::LockForWrite(ResourceId id) {
926 ResourceId id) {
927 Resource* resource = GetResource(id); 926 Resource* resource = GetResource(id);
928 DCHECK(CanLockForWrite(id)); 927 DCHECK(CanLockForWrite(id));
929 LazyAllocate(resource);
930 928
931 resource->locked_for_write = true; 929 resource->locked_for_write = true;
932 return resource; 930 return resource;
933 } 931 }
934 932
935 bool ResourceProvider::CanLockForWrite(ResourceId id) { 933 bool ResourceProvider::CanLockForWrite(ResourceId id) {
936 Resource* resource = GetResource(id); 934 Resource* resource = GetResource(id);
937 return !resource->locked_for_write && !resource->lock_for_read_count && 935 return !resource->locked_for_write && !resource->lock_for_read_count &&
938 !resource->exported_count && resource->origin == Resource::Internal && 936 !resource->exported_count && resource->origin == Resource::Internal &&
939 !resource->lost && ReadLockFenceHasPassed(resource); 937 !resource->lost && ReadLockFenceHasPassed(resource);
940 } 938 }
941 939
942 void ResourceProvider::UnlockForWrite(ResourceId id) { 940 void ResourceProvider::UnlockForWrite(ResourceProvider::Resource* resource) {
943 Resource* resource = GetResource(id);
944 DCHECK(resource->locked_for_write); 941 DCHECK(resource->locked_for_write);
945 DCHECK_EQ(resource->exported_count, 0); 942 DCHECK_EQ(resource->exported_count, 0);
946 DCHECK(resource->origin == Resource::Internal); 943 DCHECK(resource->origin == Resource::Internal);
947 resource->locked_for_write = false; 944 resource->locked_for_write = false;
948 } 945 }
949 946
950 const ResourceProvider::Resource*
951 ResourceProvider::LockForWriteToGpuMemoryBuffer(ResourceId id) {
952 Resource* resource = GetResource(id);
953 DCHECK_EQ(GLTexture, resource->type);
954 DCHECK(CanLockForWrite(id));
955
956 if (!resource->gpu_memory_buffer) {
957 scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer =
958 gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer(
959 resource->size,
960 ToGpuMemoryBufferFormat(resource->format),
961 gfx::GpuMemoryBuffer::MAP);
962 resource->gpu_memory_buffer = gpu_memory_buffer.release();
963 resource->allocated = true;
964 }
965
966 resource->locked_for_write = true;
967 return resource;
968 }
969
970 void ResourceProvider::UnlockForWriteToGpuMemoryBuffer(ResourceId id) {
971 Resource* resource = GetResource(id);
972 DCHECK(resource->locked_for_write);
973 DCHECK_EQ(resource->exported_count, 0);
974 DCHECK(resource->origin == Resource::Internal);
975 DCHECK_EQ(GLTexture, resource->type);
976
977 if (!resource->image_id) {
978 GLES2Interface* gl = ContextGL();
979 DCHECK(gl);
980 resource->image_id =
981 gl->CreateImageCHROMIUM(resource->gpu_memory_buffer->AsClientBuffer(),
982 resource->size.width(),
983 resource->size.height(),
984 GL_RGBA);
985 }
986
987 resource->locked_for_write = false;
988 resource->dirty_image = true;
989
990 // GpuMemoryBuffer provides direct access to the memory used by the GPU.
991 // Read lock fences are required to ensure that we're not trying to map a
992 // buffer that is currently in-use by the GPU.
993 resource->read_lock_fences_enabled = true;
994 }
995
996 void ResourceProvider::LockForWriteToSkSurface(ResourceId id) {
997 Resource* resource = GetResource(id);
998 DCHECK_EQ(GLTexture, resource->type);
999 DCHECK(CanLockForWrite(id));
1000
1001 resource->locked_for_write = true;
1002 }
1003
1004 void ResourceProvider::UnlockForWriteToSkSurface(ResourceId id) {
1005 Resource* resource = GetResource(id);
1006 DCHECK(resource->locked_for_write);
1007 DCHECK_EQ(resource->exported_count, 0);
1008 DCHECK(resource->origin == Resource::Internal);
1009 DCHECK_EQ(GLTexture, resource->type);
1010 resource->locked_for_write = false;
1011 }
1012
1013 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL( 947 ResourceProvider::ScopedReadLockGL::ScopedReadLockGL(
1014 ResourceProvider* resource_provider, 948 ResourceProvider* resource_provider,
1015 ResourceProvider::ResourceId resource_id) 949 ResourceProvider::ResourceId resource_id)
1016 : resource_provider_(resource_provider), 950 : resource_provider_(resource_provider),
1017 resource_id_(resource_id), 951 resource_id_(resource_id),
1018 texture_id_(resource_provider->LockForRead(resource_id)->gl_id) { 952 texture_id_(resource_provider->LockForRead(resource_id)->gl_id) {
1019 DCHECK(texture_id_); 953 DCHECK(texture_id_);
1020 } 954 }
1021 955
1022 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() { 956 ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() {
(...skipping 19 matching lines...) Expand all
1042 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) { 976 target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {
1043 } 977 }
1044 978
1045 ResourceProvider::ScopedSamplerGL::~ScopedSamplerGL() { 979 ResourceProvider::ScopedSamplerGL::~ScopedSamplerGL() {
1046 } 980 }
1047 981
1048 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL( 982 ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL(
1049 ResourceProvider* resource_provider, 983 ResourceProvider* resource_provider,
1050 ResourceProvider::ResourceId resource_id) 984 ResourceProvider::ResourceId resource_id)
1051 : resource_provider_(resource_provider), 985 : resource_provider_(resource_provider),
1052 resource_id_(resource_id), 986 resource_(resource_provider->LockForWrite(resource_id)) {
1053 texture_id_(resource_provider->LockForWrite(resource_id)->gl_id) { 987 resource_provider_->LazyAllocate(resource_);
988 texture_id_ = resource_->gl_id;
1054 DCHECK(texture_id_); 989 DCHECK(texture_id_);
1055 } 990 }
1056 991
1057 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { 992 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() {
1058 resource_provider_->UnlockForWrite(resource_id_); 993 resource_provider_->UnlockForWrite(resource_);
1059 } 994 }
1060 995
1061 void ResourceProvider::PopulateSkBitmapWithResource( 996 void ResourceProvider::PopulateSkBitmapWithResource(
1062 SkBitmap* sk_bitmap, const Resource* resource) { 997 SkBitmap* sk_bitmap, const Resource* resource) {
1063 DCHECK_EQ(RGBA_8888, resource->format); 998 DCHECK_EQ(RGBA_8888, resource->format);
1064 SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(), 999 SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(),
1065 resource->size.height()); 1000 resource->size.height());
1066 sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes()); 1001 sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes());
1067 } 1002 }
1068 1003
1069 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( 1004 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware(
1070 ResourceProvider* resource_provider, 1005 ResourceProvider* resource_provider,
1071 ResourceProvider::ResourceId resource_id) 1006 ResourceProvider::ResourceId resource_id)
1072 : resource_provider_(resource_provider), 1007 : resource_provider_(resource_provider),
1073 resource_id_(resource_id) { 1008 resource_id_(resource_id) {
1074 const Resource* resource = resource_provider->LockForRead(resource_id); 1009 const Resource* resource = resource_provider->LockForRead(resource_id);
1075 wrap_mode_ = resource->wrap_mode; 1010 wrap_mode_ = resource->wrap_mode;
1076 ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource); 1011 ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource);
1077 } 1012 }
1078 1013
1079 ResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() { 1014 ResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() {
1080 resource_provider_->UnlockForRead(resource_id_); 1015 resource_provider_->UnlockForRead(resource_id_);
1081 } 1016 }
1082 1017
1083 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( 1018 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware(
1084 ResourceProvider* resource_provider, 1019 ResourceProvider* resource_provider,
1085 ResourceProvider::ResourceId resource_id) 1020 ResourceProvider::ResourceId resource_id)
1086 : resource_provider_(resource_provider), 1021 : resource_provider_(resource_provider),
1087 resource_id_(resource_id) { 1022 resource_(resource_provider->LockForWrite(resource_id)) {
1088 ResourceProvider::PopulateSkBitmapWithResource( 1023 ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource_);
1089 &sk_bitmap_, resource_provider->LockForWrite(resource_id));
1090 DCHECK(valid()); 1024 DCHECK(valid());
1091 sk_canvas_.reset(new SkCanvas(sk_bitmap_)); 1025 sk_canvas_.reset(new SkCanvas(sk_bitmap_));
1092 } 1026 }
1093 1027
1094 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { 1028 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() {
1095 resource_provider_->UnlockForWrite(resource_id_); 1029 resource_provider_->UnlockForWrite(resource_);
1096 } 1030 }
1097 1031
1098 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: 1032 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
1099 ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider, 1033 ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider,
1100 ResourceProvider::ResourceId resource_id) 1034 ResourceProvider::ResourceId resource_id)
1101 : resource_provider_(resource_provider), 1035 : resource_provider_(resource_provider),
1102 resource_id_(resource_id), 1036 resource_(resource_provider->LockForWrite(resource_id)),
1103 gpu_memory_buffer_( 1037 gpu_memory_buffer_manager_(resource_provider->gpu_memory_buffer_manager_),
1104 resource_provider->LockForWriteToGpuMemoryBuffer(resource_id) 1038 gpu_memory_buffer_(nullptr),
1105 ->gpu_memory_buffer) { 1039 size_(resource_->size),
1040 format_(resource_->format) {
1041 DCHECK_EQ(GLTexture, resource_->type);
1042 std::swap(gpu_memory_buffer_, resource_->gpu_memory_buffer);
1106 } 1043 }
1107 1044
1108 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: 1045 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
1109 ~ScopedWriteLockGpuMemoryBuffer() { 1046 ~ScopedWriteLockGpuMemoryBuffer() {
1110 resource_provider_->UnlockForWriteToGpuMemoryBuffer(resource_id_); 1047 resource_provider_->UnlockForWrite(resource_);
1048 if (!gpu_memory_buffer_)
1049 return;
1050
1051 if (!resource_->image_id) {
1052 GLES2Interface* gl = resource_provider_->ContextGL();
1053 DCHECK(gl);
1054
1055 resource_->image_id =
1056 gl->CreateImageCHROMIUM(gpu_memory_buffer_->AsClientBuffer(),
1057 size_.width(),
1058 size_.height(),
1059 GL_RGBA);
1060 }
1061
1062 std::swap(resource_->gpu_memory_buffer, gpu_memory_buffer_);
1063 resource_->allocated = true;
1064 resource_->dirty_image = true;
1065
1066 // GpuMemoryBuffer provides direct access to the memory used by the GPU.
1067 // Read lock fences are required to ensure that we're not trying to map a
1068 // buffer that is currently in-use by the GPU.
1069 resource_->read_lock_fences_enabled = true;
1070 }
1071
1072 gfx::GpuMemoryBuffer*
1073 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::GetGpuMemoryBuffer() {
1074 if (!gpu_memory_buffer_) {
1075 scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer =
1076 gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer(
1077 size_, ToGpuMemoryBufferFormat(format_), gfx::GpuMemoryBuffer::MAP);
1078 gpu_memory_buffer_ = gpu_memory_buffer.release();
1079 }
1080
1081 return gpu_memory_buffer_;
1111 } 1082 }
1112 1083
1113 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr( 1084 ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr(
1114 ResourceProvider* resource_provider, 1085 ResourceProvider* resource_provider,
1115 ResourceProvider::ResourceId resource_id) 1086 ResourceProvider::ResourceId resource_id)
1116 : resource_provider_(resource_provider), resource_id_(resource_id) { 1087 : resource_provider_(resource_provider),
1117 resource_provider->LockForWriteToSkSurface(resource_id); 1088 resource_(resource_provider->LockForWrite(resource_id)) {
1118 } 1089 }
1119 1090
1120 ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() { 1091 ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() {
1121 resource_provider_->UnlockForWriteToSkSurface(resource_id_); 1092 resource_provider_->UnlockForWrite(resource_);
1122 } 1093 }
1123 1094
1124 SkSurface* ResourceProvider::ScopedWriteLockGr::GetSkSurface( 1095 SkSurface* ResourceProvider::ScopedWriteLockGr::GetSkSurface(
1125 bool use_distance_field_text) { 1096 bool use_distance_field_text) {
1126 Resource* resource = resource_provider_->GetResource(resource_id_); 1097 DCHECK(resource_->locked_for_write);
1127 DCHECK(resource->locked_for_write);
1128 1098
1129 // If the surface doesn't exist, or doesn't have the correct dff setting, 1099 // If the surface doesn't exist, or doesn't have the correct dff setting,
1130 // recreate the surface within the resource. 1100 // recreate the surface within the resource.
1131 if (!resource->sk_surface || 1101 if (!resource_->sk_surface ||
1132 use_distance_field_text != 1102 use_distance_field_text !=
1133 resource->sk_surface->props().isUseDistanceFieldFonts()) { 1103 resource_->sk_surface->props().isUseDistanceFieldFonts()) {
1134 class GrContext* gr_context = resource_provider_->GrContext(); 1104 class GrContext* gr_context = resource_provider_->GrContext();
1135 // TODO(alokp): Implement TestContextProvider::GrContext(). 1105 // TODO(alokp): Implement TestContextProvider::GrContext().
1136 if (!gr_context) 1106 if (!gr_context)
1137 return nullptr; 1107 return nullptr;
1138 1108
1139 resource_provider_->LazyAllocate(resource); 1109 resource_provider_->LazyAllocate(resource_);
1140 1110
1141 GrBackendTextureDesc desc; 1111 GrBackendTextureDesc desc;
1142 desc.fFlags = kRenderTarget_GrBackendTextureFlag; 1112 desc.fFlags = kRenderTarget_GrBackendTextureFlag;
1143 desc.fWidth = resource->size.width(); 1113 desc.fWidth = resource_->size.width();
1144 desc.fHeight = resource->size.height(); 1114 desc.fHeight = resource_->size.height();
1145 desc.fConfig = ToGrPixelConfig(resource->format); 1115 desc.fConfig = ToGrPixelConfig(resource_->format);
1146 desc.fOrigin = kTopLeft_GrSurfaceOrigin; 1116 desc.fOrigin = kTopLeft_GrSurfaceOrigin;
1147 desc.fTextureHandle = resource->gl_id; 1117 desc.fTextureHandle = resource_->gl_id;
1148 skia::RefPtr<GrTexture> gr_texture = 1118 skia::RefPtr<GrTexture> gr_texture =
1149 skia::AdoptRef(gr_context->wrapBackendTexture(desc)); 1119 skia::AdoptRef(gr_context->wrapBackendTexture(desc));
1150 SkSurface::TextRenderMode text_render_mode = 1120 SkSurface::TextRenderMode text_render_mode =
1151 use_distance_field_text ? SkSurface::kDistanceField_TextRenderMode 1121 use_distance_field_text ? SkSurface::kDistanceField_TextRenderMode
1152 : SkSurface::kStandard_TextRenderMode; 1122 : SkSurface::kStandard_TextRenderMode;
1153 resource->sk_surface = skia::AdoptRef(SkSurface::NewRenderTargetDirect( 1123 resource_->sk_surface = skia::AdoptRef(SkSurface::NewRenderTargetDirect(
1154 gr_texture->asRenderTarget(), text_render_mode)); 1124 gr_texture->asRenderTarget(), text_render_mode));
1155 } 1125 }
1156 return resource->sk_surface.get(); 1126 return resource_->sk_surface.get();
1157 } 1127 }
1158 1128
1159 ResourceProvider::ResourceProvider( 1129 ResourceProvider::ResourceProvider(
1160 OutputSurface* output_surface, 1130 OutputSurface* output_surface,
1161 SharedBitmapManager* shared_bitmap_manager, 1131 SharedBitmapManager* shared_bitmap_manager,
1162 GpuMemoryBufferManager* gpu_memory_buffer_manager, 1132 GpuMemoryBufferManager* gpu_memory_buffer_manager,
1163 BlockingTaskRunner* blocking_main_thread_task_runner, 1133 BlockingTaskRunner* blocking_main_thread_task_runner,
1164 int highp_threshold_min, 1134 int highp_threshold_min,
1165 bool use_rgba_4444_texture_format, 1135 bool use_rgba_4444_texture_format,
1166 size_t id_allocation_chunk_size) 1136 size_t id_allocation_chunk_size)
(...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after
1900 DCHECK(gl); 1870 DCHECK(gl);
1901 DCHECK(resource->gl_upload_query_id); 1871 DCHECK(resource->gl_upload_query_id);
1902 GLuint complete = 1; 1872 GLuint complete = 1;
1903 gl->GetQueryObjectuivEXT( 1873 gl->GetQueryObjectuivEXT(
1904 resource->gl_upload_query_id, GL_QUERY_RESULT_AVAILABLE_EXT, &complete); 1874 resource->gl_upload_query_id, GL_QUERY_RESULT_AVAILABLE_EXT, &complete);
1905 if (!complete) 1875 if (!complete)
1906 return false; 1876 return false;
1907 } 1877 }
1908 1878
1909 resource->pending_set_pixels = false; 1879 resource->pending_set_pixels = false;
1910 UnlockForWrite(id); 1880 UnlockForWrite(resource);
1911 1881
1912 // Async set pixels commands are not necessarily processed in-sequence with 1882 // Async set pixels commands are not necessarily processed in-sequence with
1913 // drawing commands. Read lock fences are required to ensure that async 1883 // drawing commands. Read lock fences are required to ensure that async
1914 // commands don't access the resource while used for drawing. 1884 // commands don't access the resource while used for drawing.
1915 resource->read_lock_fences_enabled = true; 1885 resource->read_lock_fences_enabled = true;
1916 1886
1917 return true; 1887 return true;
1918 } 1888 }
1919 1889
1920 void ResourceProvider::CreateForTesting(ResourceId id) { 1890 void ResourceProvider::CreateForTesting(ResourceId id) {
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
2094 ContextProvider* context_provider = output_surface_->context_provider(); 2064 ContextProvider* context_provider = output_surface_->context_provider();
2095 return context_provider ? context_provider->ContextGL() : NULL; 2065 return context_provider ? context_provider->ContextGL() : NULL;
2096 } 2066 }
2097 2067
2098 class GrContext* ResourceProvider::GrContext() const { 2068 class GrContext* ResourceProvider::GrContext() const {
2099 ContextProvider* context_provider = output_surface_->context_provider(); 2069 ContextProvider* context_provider = output_surface_->context_provider();
2100 return context_provider ? context_provider->GrContext() : NULL; 2070 return context_provider ? context_provider->GrContext() : NULL;
2101 } 2071 }
2102 2072
2103 } // namespace cc 2073 } // 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