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

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

Issue 14409006: cc: Changes to use GL API for GpuMemoryBuffers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@glapi
Patch Set: s/GL_WRITE_ONLY/GL_READ_WRITE/ for map mode Created 7 years, 7 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 <limits> 8 #include <limits>
9 9
10 #include "base/debug/alias.h" 10 #include "base/debug/alias.h"
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 exported(false), 78 exported(false),
79 marked_for_deletion(false), 79 marked_for_deletion(false),
80 pending_set_pixels(false), 80 pending_set_pixels(false),
81 set_pixels_completion_forced(false), 81 set_pixels_completion_forced(false),
82 allocated(false), 82 allocated(false),
83 enable_read_lock_fences(false), 83 enable_read_lock_fences(false),
84 read_lock_fence(NULL), 84 read_lock_fence(NULL),
85 size(), 85 size(),
86 format(0), 86 format(0),
87 filter(0), 87 filter(0),
88 image_id(0),
88 type(static_cast<ResourceType>(0)) {} 89 type(static_cast<ResourceType>(0)) {}
89 90
90 ResourceProvider::Resource::~Resource() {} 91 ResourceProvider::Resource::~Resource() {}
91 92
92 ResourceProvider::Resource::Resource( 93 ResourceProvider::Resource::Resource(
93 unsigned texture_id, gfx::Size size, GLenum format, GLenum filter) 94 unsigned texture_id, gfx::Size size, GLenum format, GLenum filter)
94 : gl_id(texture_id), 95 : gl_id(texture_id),
95 gl_pixel_buffer_id(0), 96 gl_pixel_buffer_id(0),
96 gl_upload_query_id(0), 97 gl_upload_query_id(0),
97 pixels(NULL), 98 pixels(NULL),
98 pixel_buffer(NULL), 99 pixel_buffer(NULL),
99 lock_for_read_count(0), 100 lock_for_read_count(0),
100 locked_for_write(false), 101 locked_for_write(false),
101 external(false), 102 external(false),
102 exported(false), 103 exported(false),
103 marked_for_deletion(false), 104 marked_for_deletion(false),
104 pending_set_pixels(false), 105 pending_set_pixels(false),
105 set_pixels_completion_forced(false), 106 set_pixels_completion_forced(false),
106 allocated(false), 107 allocated(false),
107 enable_read_lock_fences(false), 108 enable_read_lock_fences(false),
108 read_lock_fence(NULL), 109 read_lock_fence(NULL),
109 size(size), 110 size(size),
110 format(format), 111 format(format),
111 filter(filter), 112 filter(filter),
113 image_id(0),
112 type(GLTexture) {} 114 type(GLTexture) {}
113 115
114 ResourceProvider::Resource::Resource( 116 ResourceProvider::Resource::Resource(
115 uint8_t* pixels, gfx::Size size, GLenum format, GLenum filter) 117 uint8_t* pixels, gfx::Size size, GLenum format, GLenum filter)
116 : gl_id(0), 118 : gl_id(0),
117 gl_pixel_buffer_id(0), 119 gl_pixel_buffer_id(0),
118 gl_upload_query_id(0), 120 gl_upload_query_id(0),
119 pixels(pixels), 121 pixels(pixels),
120 pixel_buffer(NULL), 122 pixel_buffer(NULL),
121 lock_for_read_count(0), 123 lock_for_read_count(0),
122 locked_for_write(false), 124 locked_for_write(false),
123 external(false), 125 external(false),
124 exported(false), 126 exported(false),
125 marked_for_deletion(false), 127 marked_for_deletion(false),
126 pending_set_pixels(false), 128 pending_set_pixels(false),
127 set_pixels_completion_forced(false), 129 set_pixels_completion_forced(false),
128 allocated(false), 130 allocated(false),
129 enable_read_lock_fences(false), 131 enable_read_lock_fences(false),
130 read_lock_fence(NULL), 132 read_lock_fence(NULL),
131 size(size), 133 size(size),
132 format(format), 134 format(format),
133 filter(filter), 135 filter(filter),
136 image_id(0),
134 type(Bitmap) {} 137 type(Bitmap) {}
135 138
136 ResourceProvider::Child::Child() {} 139 ResourceProvider::Child::Child() {}
137 140
138 ResourceProvider::Child::~Child() {} 141 ResourceProvider::Child::~Child() {}
139 142
140 scoped_ptr<ResourceProvider> ResourceProvider::Create( 143 scoped_ptr<ResourceProvider> ResourceProvider::Create(
141 OutputSurface* output_surface, 144 OutputSurface* output_surface,
142 int highp_threshold_min) { 145 int highp_threshold_min) {
143 scoped_ptr<ResourceProvider> resource_provider( 146 scoped_ptr<ResourceProvider> resource_provider(
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 304
302 void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, 305 void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it,
303 DeleteStyle style) { 306 DeleteStyle style) {
304 Resource* resource = &it->second; 307 Resource* resource = &it->second;
305 bool lost_resource = lost_output_surface_; 308 bool lost_resource = lost_output_surface_;
306 309
307 DCHECK(!resource->exported || style != Normal); 310 DCHECK(!resource->exported || style != Normal);
308 if (style == ForShutdown && resource->exported) 311 if (style == ForShutdown && resource->exported)
309 lost_resource = true; 312 lost_resource = true;
310 313
314 if (resource->image_id) {
315 WebGraphicsContext3D* context3d = output_surface_->context3d();
316 DCHECK(context3d);
317 GLC(context3d, context3d->destroyImageCHROMIUM(resource->image_id));
318 }
319
311 if (resource->gl_id && !resource->external) { 320 if (resource->gl_id && !resource->external) {
312 WebGraphicsContext3D* context3d = output_surface_->context3d(); 321 WebGraphicsContext3D* context3d = output_surface_->context3d();
313 DCHECK(context3d); 322 DCHECK(context3d);
314 GLC(context3d, context3d->deleteTexture(resource->gl_id)); 323 GLC(context3d, context3d->deleteTexture(resource->gl_id));
315 } 324 }
316 if (resource->gl_upload_query_id) { 325 if (resource->gl_upload_query_id) {
317 WebGraphicsContext3D* context3d = output_surface_->context3d(); 326 WebGraphicsContext3D* context3d = output_surface_->context3d();
318 DCHECK(context3d); 327 DCHECK(context3d);
319 GLC(context3d, context3d->deleteQueryEXT(resource->gl_upload_query_id)); 328 GLC(context3d, context3d->deleteQueryEXT(resource->gl_upload_query_id));
320 } 329 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 gfx::Vector2d dest_offset) { 371 gfx::Vector2d dest_offset) {
363 DCHECK(thread_checker_.CalledOnValidThread()); 372 DCHECK(thread_checker_.CalledOnValidThread());
364 ResourceMap::iterator it = resources_.find(id); 373 ResourceMap::iterator it = resources_.find(id);
365 CHECK(it != resources_.end()); 374 CHECK(it != resources_.end());
366 Resource* resource = &it->second; 375 Resource* resource = &it->second;
367 DCHECK(!resource->locked_for_write); 376 DCHECK(!resource->locked_for_write);
368 DCHECK(!resource->lock_for_read_count); 377 DCHECK(!resource->lock_for_read_count);
369 DCHECK(!resource->external); 378 DCHECK(!resource->external);
370 DCHECK(!resource->exported); 379 DCHECK(!resource->exported);
371 DCHECK(ReadLockFenceHasPassed(resource)); 380 DCHECK(ReadLockFenceHasPassed(resource));
381 DCHECK(!resource->image_id);
372 LazyAllocate(resource); 382 LazyAllocate(resource);
373 383
374 if (resource->gl_id) { 384 if (resource->gl_id) {
375 DCHECK(!resource->pending_set_pixels); 385 DCHECK(!resource->pending_set_pixels);
376 WebGraphicsContext3D* context3d = output_surface_->context3d(); 386 WebGraphicsContext3D* context3d = output_surface_->context3d();
377 DCHECK(context3d); 387 DCHECK(context3d);
378 DCHECK(texture_uploader_.get()); 388 DCHECK(texture_uploader_.get());
379 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); 389 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id);
380 texture_uploader_->Upload(image, 390 texture_uploader_->Upload(image,
381 image_rect, 391 image_rect,
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 ResourceProvider::ResourceProvider(OutputSurface* output_surface) 634 ResourceProvider::ResourceProvider(OutputSurface* output_surface)
625 : output_surface_(output_surface), 635 : output_surface_(output_surface),
626 lost_output_surface_(false), 636 lost_output_surface_(false),
627 next_id_(1), 637 next_id_(1),
628 next_child_(1), 638 next_child_(1),
629 default_resource_type_(output_surface->context3d() ? GLTexture : Bitmap), 639 default_resource_type_(output_surface->context3d() ? GLTexture : Bitmap),
630 use_texture_storage_ext_(false), 640 use_texture_storage_ext_(false),
631 use_texture_usage_hint_(false), 641 use_texture_usage_hint_(false),
632 use_shallow_flush_(false), 642 use_shallow_flush_(false),
633 max_texture_size_(0), 643 max_texture_size_(0),
634 best_texture_format_(0) {} 644 best_texture_format_(0),
645 use_gpu_memory_buffers_(false) {
646 }
635 647
636 bool ResourceProvider::Initialize(int highp_threshold_min) { 648 bool ResourceProvider::Initialize(int highp_threshold_min) {
637 DCHECK(thread_checker_.CalledOnValidThread()); 649 DCHECK(thread_checker_.CalledOnValidThread());
638 WebGraphicsContext3D* context3d = output_surface_->context3d(); 650 WebGraphicsContext3D* context3d = output_surface_->context3d();
639 if (!context3d) { 651 if (!context3d) {
640 max_texture_size_ = INT_MAX / 2; 652 max_texture_size_ = INT_MAX / 2;
641 best_texture_format_ = GL_RGBA; 653 best_texture_format_ = GL_RGBA;
642 return true; 654 return true;
643 } 655 }
644 if (!context3d->makeContextCurrent()) 656 if (!context3d->makeContextCurrent())
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 TransferableResource* resource) { 864 TransferableResource* resource) {
853 DCHECK(thread_checker_.CalledOnValidThread()); 865 DCHECK(thread_checker_.CalledOnValidThread());
854 WebGraphicsContext3D* context3d = output_surface_->context3d(); 866 WebGraphicsContext3D* context3d = output_surface_->context3d();
855 ResourceMap::iterator it = resources_.find(id); 867 ResourceMap::iterator it = resources_.find(id);
856 CHECK(it != resources_.end()); 868 CHECK(it != resources_.end());
857 Resource* source = &it->second; 869 Resource* source = &it->second;
858 DCHECK(!source->locked_for_write); 870 DCHECK(!source->locked_for_write);
859 DCHECK(!source->lock_for_read_count); 871 DCHECK(!source->lock_for_read_count);
860 DCHECK(!source->external || (source->external && !source->mailbox.IsEmpty())); 872 DCHECK(!source->external || (source->external && !source->mailbox.IsEmpty()));
861 DCHECK(source->allocated); 873 DCHECK(source->allocated);
874 DCHECK(!source->image_id);
862 if (source->exported) 875 if (source->exported)
863 return false; 876 return false;
864 resource->id = id; 877 resource->id = id;
865 resource->format = source->format; 878 resource->format = source->format;
866 resource->filter = source->filter; 879 resource->filter = source->filter;
867 resource->size = source->size; 880 resource->size = source->size;
868 881
869 if (source->mailbox.IsEmpty()) { 882 if (source->mailbox.IsEmpty()) {
870 GLC(context3d, context3d->genMailboxCHROMIUM(resource->mailbox.name)); 883 GLC(context3d, context3d->genMailboxCHROMIUM(resource->mailbox.name));
871 source->mailbox.SetName(resource->mailbox); 884 source->mailbox.SetName(resource->mailbox);
(...skipping 16 matching lines...) Expand all
888 DCHECK(thread_checker_.CalledOnValidThread()); 901 DCHECK(thread_checker_.CalledOnValidThread());
889 ResourceMap::iterator it = resources_.find(id); 902 ResourceMap::iterator it = resources_.find(id);
890 CHECK(it != resources_.end()); 903 CHECK(it != resources_.end());
891 Resource* resource = &it->second; 904 Resource* resource = &it->second;
892 DCHECK(!resource->external); 905 DCHECK(!resource->external);
893 DCHECK(!resource->exported); 906 DCHECK(!resource->exported);
894 907
895 if (resource->gl_id) { 908 if (resource->gl_id) {
896 WebGraphicsContext3D* context3d = output_surface_->context3d(); 909 WebGraphicsContext3D* context3d = output_surface_->context3d();
897 DCHECK(context3d); 910 DCHECK(context3d);
898 if (!resource->gl_pixel_buffer_id) 911 if (!use_gpu_memory_buffers_) {
899 resource->gl_pixel_buffer_id = context3d->createBuffer(); 912 if (!resource->gl_pixel_buffer_id)
900 context3d->bindBuffer( 913 resource->gl_pixel_buffer_id = context3d->createBuffer();
901 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 914 context3d->bindBuffer(
902 resource->gl_pixel_buffer_id); 915 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
903 context3d->bufferData( 916 resource->gl_pixel_buffer_id);
904 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 917 context3d->bufferData(
905 resource->size.width() * resource->size.height() * 4, 918 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
906 NULL, 919 resource->size.width() * resource->size.height() * 4,
907 GL_DYNAMIC_DRAW); 920 NULL,
908 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); 921 GL_DYNAMIC_DRAW);
922 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
923 } else {
924 DCHECK_EQ(0u, resource->image_id);
925 resource->image_id = context3d->createImageCHROMIUM(
926 resource->size.width(), resource->size.height(), GL_RGBA8_OES);
reveman 2013/05/17 01:48:08 please put this in a new AcquireImage() function i
kaanb 2013/05/17 21:27:36 Done.
927 }
909 } 928 }
910 929
911 if (resource->pixels) { 930 if (resource->pixels) {
912 if (resource->pixel_buffer) 931 if (resource->pixel_buffer)
913 return; 932 return;
914 933
915 resource->pixel_buffer = new uint8_t[ 934 resource->pixel_buffer = new uint8_t[
916 resource->size.width() * resource->size.height() * 4]; 935 resource->size.width() * resource->size.height() * 4];
917 } 936 }
918 } 937 }
919 938
920 void ResourceProvider::ReleasePixelBuffer(ResourceId id) { 939 void ResourceProvider::ReleasePixelBuffer(ResourceId id) {
921 DCHECK(thread_checker_.CalledOnValidThread()); 940 DCHECK(thread_checker_.CalledOnValidThread());
922 ResourceMap::iterator it = resources_.find(id); 941 ResourceMap::iterator it = resources_.find(id);
923 CHECK(it != resources_.end()); 942 CHECK(it != resources_.end());
924 Resource* resource = &it->second; 943 Resource* resource = &it->second;
925 DCHECK(!resource->external); 944 DCHECK(!resource->external);
926 DCHECK(!resource->exported); 945 DCHECK(!resource->exported);
927 946
928 if (resource->gl_id) { 947 if (resource->gl_id) {
929 if (!resource->gl_pixel_buffer_id) 948 if (!resource->gl_pixel_buffer_id && resource->image_id == 0)
930 return; 949 return;
931 WebGraphicsContext3D* context3d = output_surface_->context3d(); 950 WebGraphicsContext3D* context3d = output_surface_->context3d();
932 DCHECK(context3d); 951 DCHECK(context3d);
933 context3d->bindBuffer( 952 if (resource->image_id == 0) {
934 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 953 DCHECK(resource->gl_pixel_buffer_id);
935 resource->gl_pixel_buffer_id); 954 context3d->bindBuffer(
936 context3d->bufferData( 955 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
937 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 956 resource->gl_pixel_buffer_id);
938 0, 957 context3d->bufferData(
939 NULL, 958 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
940 GL_DYNAMIC_DRAW); 959 0,
941 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); 960 NULL,
961 GL_DYNAMIC_DRAW);
962 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
963 } else {
964 context3d->destroyImageCHROMIUM(resource->image_id);
965 resource->image_id = 0;
reveman 2013/05/17 01:48:08 and this in ReleaseImage()
kaanb 2013/05/17 21:27:36 Done.
966 }
942 } 967 }
943 968
944 if (resource->pixels) { 969 if (resource->pixels) {
945 if (!resource->pixel_buffer) 970 if (!resource->pixel_buffer)
946 return; 971 return;
947 delete[] resource->pixel_buffer; 972 delete[] resource->pixel_buffer;
948 resource->pixel_buffer = NULL; 973 resource->pixel_buffer = NULL;
949 } 974 }
950 } 975 }
951 976
952 uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id) { 977 uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id) {
953 DCHECK(thread_checker_.CalledOnValidThread()); 978 DCHECK(thread_checker_.CalledOnValidThread());
954 ResourceMap::iterator it = resources_.find(id); 979 ResourceMap::iterator it = resources_.find(id);
955 CHECK(it != resources_.end()); 980 CHECK(it != resources_.end());
956 Resource* resource = &it->second; 981 Resource* resource = &it->second;
957 DCHECK(!resource->external); 982 DCHECK(!resource->external);
958 DCHECK(!resource->exported); 983 DCHECK(!resource->exported);
959 984
960 if (resource->gl_id) { 985 if (resource->gl_id) {
961 WebGraphicsContext3D* context3d = output_surface_->context3d(); 986 WebGraphicsContext3D* context3d = output_surface_->context3d();
962 DCHECK(context3d); 987 DCHECK(context3d);
963 DCHECK(resource->gl_pixel_buffer_id); 988 if (resource->image_id == 0) {
964 context3d->bindBuffer( 989 DCHECK(resource->gl_pixel_buffer_id);
965 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 990 context3d->bindBuffer(
966 resource->gl_pixel_buffer_id); 991 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
967 uint8_t* image = static_cast<uint8_t*>( 992 resource->gl_pixel_buffer_id);
968 context3d->mapBufferCHROMIUM( 993 uint8_t* image = static_cast<uint8_t*>(
969 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); 994 context3d->mapBufferCHROMIUM(
970 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); 995 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY));
971 return image; 996 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
997 return image;
998 } else {
999 return static_cast<uint8_t*>(
1000 context3d->mapImageCHROMIUM(resource->image_id, GL_READ_WRITE));
reveman 2013/05/17 01:48:08 and I prefer this in a MapImage() function. We mig
kaanb 2013/05/17 21:27:36 Done.
1001 }
972 } 1002 }
973 1003
974 if (resource->pixels) 1004 if (resource->pixels)
975 return resource->pixel_buffer; 1005 return resource->pixel_buffer;
976 1006
977 return NULL; 1007 return NULL;
978 } 1008 }
979 1009
980 void ResourceProvider::UnmapPixelBuffer(ResourceId id) { 1010 void ResourceProvider::UnmapPixelBuffer(ResourceId id) {
981 DCHECK(thread_checker_.CalledOnValidThread()); 1011 DCHECK(thread_checker_.CalledOnValidThread());
982 ResourceMap::iterator it = resources_.find(id); 1012 ResourceMap::iterator it = resources_.find(id);
983 CHECK(it != resources_.end()); 1013 CHECK(it != resources_.end());
984 Resource* resource = &it->second; 1014 Resource* resource = &it->second;
985 DCHECK(!resource->external); 1015 DCHECK(!resource->external);
986 DCHECK(!resource->exported); 1016 DCHECK(!resource->exported);
987 1017
988 if (resource->gl_id) { 1018 if (resource->gl_id) {
989 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1019 WebGraphicsContext3D* context3d = output_surface_->context3d();
990 DCHECK(context3d); 1020 DCHECK(context3d);
991 DCHECK(resource->gl_pixel_buffer_id); 1021 if (resource->image_id == 0) {
992 context3d->bindBuffer( 1022 DCHECK(resource->gl_pixel_buffer_id);
993 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 1023 context3d->bindBuffer(
994 resource->gl_pixel_buffer_id); 1024 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
995 context3d->unmapBufferCHROMIUM( 1025 resource->gl_pixel_buffer_id);
996 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); 1026 context3d->unmapBufferCHROMIUM(
997 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); 1027 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM);
1028 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
1029 } else {
1030 context3d->unmapImageCHROMIUM(resource->image_id);
reveman 2013/05/17 01:48:08 UnmapImage.
kaanb 2013/05/17 21:27:36 Done.
1031 }
998 } 1032 }
999 } 1033 }
1000 1034
1001 void ResourceProvider::SetPixelsFromBuffer(ResourceId id) { 1035 void ResourceProvider::SetPixelsFromBuffer(ResourceId id) {
1002 DCHECK(thread_checker_.CalledOnValidThread()); 1036 DCHECK(thread_checker_.CalledOnValidThread());
1003 ResourceMap::iterator it = resources_.find(id); 1037 ResourceMap::iterator it = resources_.find(id);
1004 CHECK(it != resources_.end()); 1038 CHECK(it != resources_.end());
1005 Resource* resource = &it->second; 1039 Resource* resource = &it->second;
1006 DCHECK(!resource->locked_for_write); 1040 DCHECK(!resource->locked_for_write);
1007 DCHECK(!resource->lock_for_read_count); 1041 DCHECK(!resource->lock_for_read_count);
1008 DCHECK(!resource->external); 1042 DCHECK(!resource->external);
1009 DCHECK(!resource->exported); 1043 DCHECK(!resource->exported);
1010 DCHECK(ReadLockFenceHasPassed(resource)); 1044 DCHECK(ReadLockFenceHasPassed(resource));
1045 DCHECK(!resource->image_id);
reveman 2013/05/17 01:48:08 I don't think this DCHECK should be here.
kaanb 2013/05/17 21:27:36 Done.
1011 LazyAllocate(resource); 1046 LazyAllocate(resource);
1012 1047
1013 if (resource->gl_id) { 1048 if (resource->gl_id) {
1014 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1049 WebGraphicsContext3D* context3d = output_surface_->context3d();
1015 DCHECK(context3d); 1050 DCHECK(context3d);
1016 DCHECK(resource->gl_pixel_buffer_id); 1051 DCHECK(resource->gl_pixel_buffer_id);
1017 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); 1052 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id);
1018 context3d->bindBuffer( 1053 context3d->bindBuffer(
1019 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 1054 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
1020 resource->gl_pixel_buffer_id); 1055 resource->gl_pixel_buffer_id);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1074 DCHECK(resource->gl_id || resource->allocated); 1109 DCHECK(resource->gl_id || resource->allocated);
1075 DCHECK(ReadLockFenceHasPassed(resource)); 1110 DCHECK(ReadLockFenceHasPassed(resource));
1076 1111
1077 bool allocate = !resource->allocated; 1112 bool allocate = !resource->allocated;
1078 resource->allocated = true; 1113 resource->allocated = true;
1079 LockForWrite(id); 1114 LockForWrite(id);
1080 1115
1081 if (resource->gl_id) { 1116 if (resource->gl_id) {
1082 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1117 WebGraphicsContext3D* context3d = output_surface_->context3d();
1083 DCHECK(context3d); 1118 DCHECK(context3d);
1084 DCHECK(resource->gl_pixel_buffer_id); 1119 if (resource->image_id == 0) {
1085 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); 1120 DCHECK(resource->gl_pixel_buffer_id);
1086 context3d->bindBuffer( 1121 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id);
1087 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 1122 context3d->bindBuffer(
1088 resource->gl_pixel_buffer_id); 1123 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
1089 if (!resource->gl_upload_query_id) 1124 resource->gl_pixel_buffer_id);
1090 resource->gl_upload_query_id = context3d->createQueryEXT(); 1125 if (!resource->gl_upload_query_id)
1091 context3d->beginQueryEXT( 1126 resource->gl_upload_query_id = context3d->createQueryEXT();
1092 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, 1127 context3d->beginQueryEXT(
1093 resource->gl_upload_query_id); 1128 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM,
1094 if (allocate) { 1129 resource->gl_upload_query_id);
1095 context3d->asyncTexImage2DCHROMIUM(GL_TEXTURE_2D, 1130 if (allocate) {
1096 0, /* level */ 1131 context3d->asyncTexImage2DCHROMIUM(GL_TEXTURE_2D,
1097 resource->format, 1132 0, /* level */
1098 resource->size.width(), 1133 resource->format,
1099 resource->size.height(), 1134 resource->size.width(),
1100 0, /* border */ 1135 resource->size.height(),
1101 resource->format, 1136 0, /* border */
1102 GL_UNSIGNED_BYTE, 1137 resource->format,
1103 NULL); 1138 GL_UNSIGNED_BYTE,
1139 NULL);
1140 } else {
1141 context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D,
1142 0, /* level */
1143 0, /* x */
1144 0, /* y */
1145 resource->size.width(),
1146 resource->size.height(),
1147 resource->format,
1148 GL_UNSIGNED_BYTE,
1149 NULL);
1150 }
1151 context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM);
1152 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
1104 } else { 1153 } else {
1105 context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D, 1154 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id);
1106 0, /* level */ 1155 context3d->bindTexImage2DCHROMIUM(GL_TEXTURE_2D, resource->image_id);
reveman 2013/05/17 01:48:08 please add a BindImage() function for this instead
kaanb 2013/05/17 21:27:36 Done.
1107 0, /* x */
1108 0, /* y */
1109 resource->size.width(),
1110 resource->size.height(),
1111 resource->format,
1112 GL_UNSIGNED_BYTE,
1113 NULL);
1114 } 1156 }
1115 context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM);
1116 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
1117 } 1157 }
1118 1158
1119 if (resource->pixels) 1159 if (resource->pixels)
1120 SetPixelsFromBuffer(id); 1160 SetPixelsFromBuffer(id);
1121 1161
1122 resource->pending_set_pixels = true; 1162 resource->pending_set_pixels = true;
1123 resource->set_pixels_completion_forced = false; 1163 resource->set_pixels_completion_forced = false;
1124 } 1164 }
1125 1165
1126 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { 1166 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) {
1127 DCHECK(thread_checker_.CalledOnValidThread()); 1167 DCHECK(thread_checker_.CalledOnValidThread());
1128 ResourceMap::iterator it = resources_.find(id); 1168 ResourceMap::iterator it = resources_.find(id);
1129 CHECK(it != resources_.end()); 1169 CHECK(it != resources_.end());
1130 Resource* resource = &it->second; 1170 Resource* resource = &it->second;
1131 DCHECK(resource->locked_for_write); 1171 DCHECK(resource->locked_for_write);
1132 DCHECK(resource->pending_set_pixels); 1172 DCHECK(resource->pending_set_pixels);
1133 DCHECK(!resource->set_pixels_completion_forced); 1173 DCHECK(!resource->set_pixels_completion_forced);
1134 1174
1135 if (resource->gl_id) { 1175 if (resource->gl_id && resource->image_id == 0) {
1136 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1176 WebGraphicsContext3D* context3d = output_surface_->context3d();
1137 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id)); 1177 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id));
1138 GLC(context3d, context3d->waitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); 1178 GLC(context3d, context3d->waitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D));
1139 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, 0)); 1179 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, 0));
1140 } 1180 }
1141 1181
1142 resource->set_pixels_completion_forced = true; 1182 resource->set_pixels_completion_forced = true;
1143 } 1183 }
1144 1184
1145 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { 1185 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) {
1146 DCHECK(thread_checker_.CalledOnValidThread()); 1186 DCHECK(thread_checker_.CalledOnValidThread());
1147 ResourceMap::iterator it = resources_.find(id); 1187 ResourceMap::iterator it = resources_.find(id);
1148 CHECK(it != resources_.end()); 1188 CHECK(it != resources_.end());
1149 Resource* resource = &it->second; 1189 Resource* resource = &it->second;
1150 DCHECK(resource->locked_for_write); 1190 DCHECK(resource->locked_for_write);
1151 DCHECK(resource->pending_set_pixels); 1191 DCHECK(resource->pending_set_pixels);
1152 1192
1153 if (resource->gl_id) { 1193 if (resource->gl_id && resource->image_id == 0) {
1154 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1194 WebGraphicsContext3D* context3d = output_surface_->context3d();
1155 DCHECK(context3d); 1195 DCHECK(context3d);
1156 DCHECK(resource->gl_upload_query_id); 1196 DCHECK(resource->gl_upload_query_id);
1157 unsigned complete = 1; 1197 unsigned complete = 1;
1158 context3d->getQueryObjectuivEXT( 1198 context3d->getQueryObjectuivEXT(
1159 resource->gl_upload_query_id, 1199 resource->gl_upload_query_id,
1160 GL_QUERY_RESULT_AVAILABLE_EXT, 1200 GL_QUERY_RESULT_AVAILABLE_EXT,
1161 &complete); 1201 &complete);
1162 if (!complete) 1202 if (!complete)
1163 return false; 1203 return false;
1164 } 1204 }
1165 1205
1166 resource->pending_set_pixels = false; 1206 resource->pending_set_pixels = false;
1167 UnlockForWrite(id); 1207 UnlockForWrite(id);
1168 1208
1169 return true; 1209 return true;
1170 } 1210 }
1171 1211
1172 void ResourceProvider::AbortSetPixels(ResourceId id) { 1212 void ResourceProvider::AbortSetPixels(ResourceId id) {
1173 DCHECK(thread_checker_.CalledOnValidThread()); 1213 DCHECK(thread_checker_.CalledOnValidThread());
1174 ResourceMap::iterator it = resources_.find(id); 1214 ResourceMap::iterator it = resources_.find(id);
1175 CHECK(it != resources_.end()); 1215 CHECK(it != resources_.end());
1176 Resource* resource = &it->second; 1216 Resource* resource = &it->second;
1177 DCHECK(resource->locked_for_write); 1217 DCHECK(resource->locked_for_write);
1178 DCHECK(resource->pending_set_pixels); 1218 DCHECK(resource->pending_set_pixels);
1179 1219
1180 if (resource->gl_id) { 1220 if (resource->gl_id) {
1181 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1221 WebGraphicsContext3D* context3d = output_surface_->context3d();
1182 DCHECK(context3d); 1222 DCHECK(context3d);
1183 DCHECK(resource->gl_upload_query_id); 1223 if (resource->image_id == 0) {
1184 // CHROMIUM_async_pixel_transfers currently doesn't have a way to 1224 DCHECK(resource->gl_upload_query_id);
1185 // abort an upload. The best we can do is delete the query and 1225 // CHROMIUM_async_pixel_transfers currently doesn't have a way to
1186 // the texture. 1226 // abort an upload. The best we can do is delete the query and
1187 context3d->deleteQueryEXT(resource->gl_upload_query_id); 1227 // the texture.
1188 resource->gl_upload_query_id = 0; 1228 context3d->deleteQueryEXT(resource->gl_upload_query_id);
1229 resource->gl_upload_query_id = 0;
1230 } else {
1231 // CHROMIUM_map_image doesn't have a way to abort an upload either.
1232 // So we just destroy the image.
1233 DCHECK(resource->image_id);
1234 context3d->destroyImageCHROMIUM(resource->image_id);
1235 resource->image_id = 0;
reveman 2013/05/17 01:48:08 no need for any of these changes.
kaanb 2013/05/17 21:27:36 Done.
1236 }
1189 context3d->deleteTexture(resource->gl_id); 1237 context3d->deleteTexture(resource->gl_id);
1190 resource->gl_id = CreateTextureId(context3d); 1238 resource->gl_id = CreateTextureId(context3d);
1191 resource->allocated = false; 1239 resource->allocated = false;
1192 } 1240 }
1193 1241
1194 resource->pending_set_pixels = false; 1242 resource->pending_set_pixels = false;
1195 UnlockForWrite(id); 1243 UnlockForWrite(id);
1196 } 1244 }
1197 1245
1198 void ResourceProvider::AllocateForTesting(ResourceId id) { 1246 void ResourceProvider::AllocateForTesting(ResourceId id) {
1199 ResourceMap::iterator it = resources_.find(id); 1247 ResourceMap::iterator it = resources_.find(id);
1200 CHECK(it != resources_.end()); 1248 CHECK(it != resources_.end());
1201 Resource* resource = &it->second; 1249 Resource* resource = &it->second;
1202 LazyAllocate(resource); 1250 LazyAllocate(resource);
1203 } 1251 }
1204 1252
1205 void ResourceProvider::LazyAllocate(Resource* resource) { 1253 void ResourceProvider::LazyAllocate(Resource* resource) {
1206 DCHECK(resource); 1254 DCHECK(resource);
1207 DCHECK(resource->gl_id || resource->allocated); 1255 DCHECK(resource->gl_id || resource->allocated);
1208 1256
1209 if (resource->allocated || !resource->gl_id) 1257 if (resource->allocated || !resource->gl_id)
1210 return; 1258 return;
1211 resource->allocated = true; 1259 resource->allocated = true;
1212 WebGraphicsContext3D* context3d = output_surface_->context3d(); 1260 WebGraphicsContext3D* context3d = output_surface_->context3d();
1213 gfx::Size& size = resource->size; 1261 gfx::Size& size = resource->size;
1214 GLenum format = resource->format; 1262 GLenum format = resource->format;
1263
1215 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id)); 1264 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id));
1216 if (use_texture_storage_ext_ && IsTextureFormatSupportedForStorage(format)) { 1265 if (use_texture_storage_ext_ && IsTextureFormatSupportedForStorage(format)) {
1217 GLenum storage_format = TextureToStorageFormat(format); 1266 GLenum storage_format = TextureToStorageFormat(format);
1218 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1267 GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D,
1219 1, 1268 1,
1220 storage_format, 1269 storage_format,
1221 size.width(), 1270 size.width(),
1222 size.height())); 1271 size.height()));
1223 } else { 1272 } else {
1273 // TODO(kaanb): Check with reviewers if we want this call
1274 // for GpuMemoryBuffers?
reveman 2013/05/17 01:48:08 I don't think this affects zero-copy. just like it
kaanb 2013/05/17 21:27:36 Acknowledged.
1224 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 1275 GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D,
1225 0, 1276 0,
1226 format, 1277 format,
1227 size.width(), 1278 size.width(),
1228 size.height(), 1279 size.height(),
1229 0, 1280 0,
1230 format, 1281 format,
1231 GL_UNSIGNED_BYTE, 1282 GL_UNSIGNED_BYTE,
1232 NULL)); 1283 NULL));
1233 } 1284 }
1234 } 1285 }
1235 1286
1236 void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, 1287 void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id,
1237 bool enable) { 1288 bool enable) {
1238 DCHECK(thread_checker_.CalledOnValidThread()); 1289 DCHECK(thread_checker_.CalledOnValidThread());
1239 ResourceMap::iterator it = resources_.find(id); 1290 ResourceMap::iterator it = resources_.find(id);
1240 CHECK(it != resources_.end()); 1291 CHECK(it != resources_.end());
1241 Resource* resource = &it->second; 1292 Resource* resource = &it->second;
1242 resource->enable_read_lock_fences = enable; 1293 resource->enable_read_lock_fences = enable;
1243 } 1294 }
1244 1295
1296 void ResourceProvider::SetUseGpuMemoryBuffers(bool use_gpu_memory_buffers) {
1297 use_gpu_memory_buffers_ = use_gpu_memory_buffers;
1298 }
1299
1245 } // namespace cc 1300 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698