Chromium Code Reviews| 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 <limits.h> | 7 #include <limits.h> |
| 8 | 8 |
| 9 #include "base/debug/alias.h" | 9 #include "base/debug/alias.h" |
| 10 #include "base/hash_tables.h" | 10 #include "base/hash_tables.h" |
| 11 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
| 12 #include "base/string_util.h" | 12 #include "base/string_util.h" |
| 13 #include "base/strings/string_split.h" | 13 #include "base/strings/string_split.h" |
| 14 #include "cc/output/gl_renderer.h" // For the GLC() macro. | 14 #include "cc/output/gl_renderer.h" // For the GLC() macro. |
| 15 #include "cc/resources/platform_color.h" | 15 #include "cc/resources/platform_color.h" |
| 16 #include "cc/resources/transferable_resource.h" | 16 #include "cc/resources/transferable_resource.h" |
| 17 #include "cc/scheduler/texture_uploader.h" | 17 #include "cc/scheduler/texture_uploader.h" |
| 18 #include "gpu/GLES2/gl2extchromium.h" | 18 #include "gpu/GLES2/gl2extchromium.h" |
| 19 #include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3 D.h" | 19 #include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3 D.h" |
| 20 #include "third_party/khronos/GLES2/gl2.h" | 20 #include "third_party/khronos/GLES2/gl2.h" |
| 21 #include "third_party/khronos/GLES2/gl2ext.h" | 21 #include "third_party/khronos/GLES2/gl2ext.h" |
| 22 #include "ui/gfx/rect.h" | 22 #include "ui/gfx/rect.h" |
| 23 #include "ui/gfx/vector2d.h" | 23 #include "ui/gfx/vector2d.h" |
| 24 #include "webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h" | |
| 24 | 25 |
| 25 using WebKit::WebGraphicsContext3D; | 26 using WebKit::WebGraphicsContext3D; |
| 26 | 27 |
| 27 namespace cc { | 28 namespace cc { |
| 28 | 29 |
| 29 static GLenum TextureToStorageFormat(GLenum texture_format) { | 30 static GLenum TextureToStorageFormat(GLenum texture_format) { |
| 30 GLenum storage_format = GL_RGBA8_OES; | 31 GLenum storage_format = GL_RGBA8_OES; |
| 31 switch (texture_format) { | 32 switch (texture_format) { |
| 32 case GL_RGBA: | 33 case GL_RGBA: |
| 33 break; | 34 break; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 73 exported(false), | 74 exported(false), |
| 74 marked_for_deletion(false), | 75 marked_for_deletion(false), |
| 75 pending_set_pixels(false), | 76 pending_set_pixels(false), |
| 76 set_pixels_completion_forced(false), | 77 set_pixels_completion_forced(false), |
| 77 allocated(false), | 78 allocated(false), |
| 78 enable_read_lock_fences(false), | 79 enable_read_lock_fences(false), |
| 79 read_lock_fence(NULL), | 80 read_lock_fence(NULL), |
| 80 size(), | 81 size(), |
| 81 format(0), | 82 format(0), |
| 82 filter(0), | 83 filter(0), |
| 83 type(static_cast<ResourceType>(0)) {} | 84 type(static_cast<ResourceType>(0)), |
| 85 use_gpu_memory_buffer(false) {} | |
| 84 | 86 |
| 85 ResourceProvider::Resource::~Resource() {} | 87 ResourceProvider::Resource::~Resource() {} |
| 86 | 88 |
| 87 ResourceProvider::Resource::Resource( | 89 ResourceProvider::Resource::Resource( |
| 88 unsigned texture_id, gfx::Size size, GLenum format, GLenum filter) | 90 unsigned texture_id, gfx::Size size, |
| 91 GLenum format, GLenum filter, bool gpu_memory_buffer) | |
| 89 : gl_id(texture_id), | 92 : gl_id(texture_id), |
| 90 gl_pixel_buffer_id(0), | 93 gl_pixel_buffer_id(0), |
| 91 gl_upload_query_id(0), | 94 gl_upload_query_id(0), |
| 92 pixels(NULL), | 95 pixels(NULL), |
| 93 pixel_buffer(NULL), | 96 pixel_buffer(NULL), |
| 94 lock_for_read_count(0), | 97 lock_for_read_count(0), |
| 95 locked_for_write(false), | 98 locked_for_write(false), |
| 96 external(false), | 99 external(false), |
| 97 exported(false), | 100 exported(false), |
| 98 marked_for_deletion(false), | 101 marked_for_deletion(false), |
| 99 pending_set_pixels(false), | 102 pending_set_pixels(false), |
| 100 set_pixels_completion_forced(false), | 103 set_pixels_completion_forced(false), |
| 101 allocated(false), | 104 allocated(false), |
| 102 enable_read_lock_fences(false), | 105 enable_read_lock_fences(false), |
| 103 read_lock_fence(NULL), | 106 read_lock_fence(NULL), |
| 104 size(size), | 107 size(size), |
| 105 format(format), | 108 format(format), |
| 106 filter(filter), | 109 filter(filter), |
| 107 type(GLTexture) {} | 110 type(GLTexture), |
| 111 use_gpu_memory_buffer(gpu_memory_buffer) {} | |
| 108 | 112 |
| 109 ResourceProvider::Resource::Resource( | 113 ResourceProvider::Resource::Resource( |
| 110 uint8_t* pixels, gfx::Size size, GLenum format, GLenum filter) | 114 uint8_t* pixels, gfx::Size size, GLenum format, GLenum filter) |
| 111 : gl_id(0), | 115 : gl_id(0), |
| 112 gl_pixel_buffer_id(0), | 116 gl_pixel_buffer_id(0), |
| 113 gl_upload_query_id(0), | 117 gl_upload_query_id(0), |
| 114 pixels(pixels), | 118 pixels(pixels), |
| 115 pixel_buffer(NULL), | 119 pixel_buffer(NULL), |
| 116 lock_for_read_count(0), | 120 lock_for_read_count(0), |
| 117 locked_for_write(false), | 121 locked_for_write(false), |
| 118 external(false), | 122 external(false), |
| 119 exported(false), | 123 exported(false), |
| 120 marked_for_deletion(false), | 124 marked_for_deletion(false), |
| 121 pending_set_pixels(false), | 125 pending_set_pixels(false), |
| 122 set_pixels_completion_forced(false), | 126 set_pixels_completion_forced(false), |
| 123 allocated(false), | 127 allocated(false), |
| 124 enable_read_lock_fences(false), | 128 enable_read_lock_fences(false), |
| 125 read_lock_fence(NULL), | 129 read_lock_fence(NULL), |
| 126 size(size), | 130 size(size), |
| 127 format(format), | 131 format(format), |
| 128 filter(filter), | 132 filter(filter), |
| 129 type(Bitmap) {} | 133 type(Bitmap), |
| 134 use_gpu_memory_buffer(false) {} | |
| 130 | 135 |
| 131 ResourceProvider::Child::Child() {} | 136 ResourceProvider::Child::Child() {} |
| 132 | 137 |
| 133 ResourceProvider::Child::~Child() {} | 138 ResourceProvider::Child::~Child() {} |
| 134 | 139 |
| 135 scoped_ptr<ResourceProvider> ResourceProvider::Create( | 140 scoped_ptr<ResourceProvider> ResourceProvider::Create( |
| 136 OutputSurface* output_surface, | 141 OutputSurface* output_surface, |
| 137 int highp_threshold_min) { | 142 int highp_threshold_min) { |
| 138 scoped_ptr<ResourceProvider> resource_provider( | 143 scoped_ptr<ResourceProvider> resource_provider( |
| 139 new ResourceProvider(output_surface)); | 144 new ResourceProvider(output_surface)); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 210 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, | 215 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, |
| 211 GL_TEXTURE_POOL_CHROMIUM, | 216 GL_TEXTURE_POOL_CHROMIUM, |
| 212 texture_pool)); | 217 texture_pool)); |
| 213 if (use_texture_usage_hint_ && hint == TextureUsageFramebuffer) { | 218 if (use_texture_usage_hint_ && hint == TextureUsageFramebuffer) { |
| 214 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, | 219 GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, |
| 215 GL_TEXTURE_USAGE_ANGLE, | 220 GL_TEXTURE_USAGE_ANGLE, |
| 216 GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); | 221 GL_FRAMEBUFFER_ATTACHMENT_ANGLE)); |
| 217 } | 222 } |
| 218 | 223 |
| 219 ResourceId id = next_id_++; | 224 ResourceId id = next_id_++; |
| 220 Resource resource(texture_id, size, format, GL_LINEAR); | 225 Resource resource(texture_id, size, format, GL_LINEAR, |
| 226 use_gpu_memory_buffers_); | |
| 221 resource.allocated = false; | 227 resource.allocated = false; |
| 222 resources_[id] = resource; | 228 resources_[id] = resource; |
| 223 return id; | 229 return id; |
| 224 } | 230 } |
| 225 | 231 |
| 226 ResourceProvider::ResourceId ResourceProvider::CreateBitmap(gfx::Size size) { | 232 ResourceProvider::ResourceId ResourceProvider::CreateBitmap(gfx::Size size) { |
| 227 DCHECK(thread_checker_.CalledOnValidThread()); | 233 DCHECK(thread_checker_.CalledOnValidThread()); |
| 228 | 234 |
| 229 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; | 235 uint8_t* pixels = new uint8_t[size.width() * size.height() * 4]; |
| 230 | 236 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 247 GLC(context3d, context3d->texParameteri( | 253 GLC(context3d, context3d->texParameteri( |
| 248 texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); | 254 texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); |
| 249 GLC(context3d, context3d->texParameteri( | 255 GLC(context3d, context3d->texParameteri( |
| 250 texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); | 256 texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); |
| 251 GLC(context3d, context3d->texParameteri( | 257 GLC(context3d, context3d->texParameteri( |
| 252 texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); | 258 texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); |
| 253 GLC(context3d, context3d->texParameteri( | 259 GLC(context3d, context3d->texParameteri( |
| 254 texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); | 260 texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); |
| 255 | 261 |
| 256 ResourceId id = next_id_++; | 262 ResourceId id = next_id_++; |
| 257 Resource resource(texture_id, gfx::Size(), 0, GL_LINEAR); | 263 Resource resource(texture_id, gfx::Size(), 0, GL_LINEAR, false); |
| 258 resource.external = true; | 264 resource.external = true; |
| 259 resource.allocated = true; | 265 resource.allocated = true; |
| 260 resources_[id] = resource; | 266 resources_[id] = resource; |
| 261 return id; | 267 return id; |
| 262 } | 268 } |
| 263 | 269 |
| 264 ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox( | 270 ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
| 265 const TextureMailbox& mailbox) { | 271 const TextureMailbox& mailbox) { |
| 266 DCHECK(thread_checker_.CalledOnValidThread()); | 272 DCHECK(thread_checker_.CalledOnValidThread()); |
| 267 // Just store the information. Mailbox will be consumed in LockForRead(). | 273 // Just store the information. Mailbox will be consumed in LockForRead(). |
| 268 ResourceId id = next_id_++; | 274 ResourceId id = next_id_++; |
| 269 unsigned texture_id = 0; | 275 unsigned texture_id = 0; |
| 270 Resource resource(texture_id, gfx::Size(), 0, GL_LINEAR); | 276 Resource resource(texture_id, gfx::Size(), 0, GL_LINEAR, false); |
| 271 resource.external = true; | 277 resource.external = true; |
| 272 resource.allocated = true; | 278 resource.allocated = true; |
| 273 resource.mailbox = mailbox; | 279 resource.mailbox = mailbox; |
| 274 resources_[id] = resource; | 280 resources_[id] = resource; |
| 275 return id; | 281 return id; |
| 276 } | 282 } |
| 277 | 283 |
| 278 void ResourceProvider::DeleteResource(ResourceId id) { | 284 void ResourceProvider::DeleteResource(ResourceId id) { |
| 279 DCHECK(thread_checker_.CalledOnValidThread()); | 285 DCHECK(thread_checker_.CalledOnValidThread()); |
| 280 ResourceMap::iterator it = resources_.find(id); | 286 ResourceMap::iterator it = resources_.find(id); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 354 gfx::Rect source_rect, | 360 gfx::Rect source_rect, |
| 355 gfx::Vector2d dest_offset) { | 361 gfx::Vector2d dest_offset) { |
| 356 DCHECK(thread_checker_.CalledOnValidThread()); | 362 DCHECK(thread_checker_.CalledOnValidThread()); |
| 357 ResourceMap::iterator it = resources_.find(id); | 363 ResourceMap::iterator it = resources_.find(id); |
| 358 CHECK(it != resources_.end()); | 364 CHECK(it != resources_.end()); |
| 359 Resource* resource = &it->second; | 365 Resource* resource = &it->second; |
| 360 DCHECK(!resource->locked_for_write); | 366 DCHECK(!resource->locked_for_write); |
| 361 DCHECK(!resource->lock_for_read_count); | 367 DCHECK(!resource->lock_for_read_count); |
| 362 DCHECK(!resource->external); | 368 DCHECK(!resource->external); |
| 363 DCHECK(!resource->exported); | 369 DCHECK(!resource->exported); |
| 370 DCHECK(!resource->use_gpu_memory_buffer); | |
| 364 DCHECK(ReadLockFenceHasPassed(resource)); | 371 DCHECK(ReadLockFenceHasPassed(resource)); |
| 365 LazyAllocate(resource); | 372 LazyAllocate(resource); |
| 366 | 373 |
| 367 if (resource->gl_id) { | 374 if (resource->gl_id) { |
| 368 DCHECK(!resource->pending_set_pixels); | 375 DCHECK(!resource->pending_set_pixels); |
| 369 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 376 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| 370 DCHECK(context3d); | 377 DCHECK(context3d); |
| 371 DCHECK(texture_uploader_.get()); | 378 DCHECK(texture_uploader_.get()); |
| 372 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); | 379 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); |
| 373 texture_uploader_->Upload(image, | 380 texture_uploader_->Upload(image, |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 607 ResourceProvider::ResourceProvider(OutputSurface* output_surface) | 614 ResourceProvider::ResourceProvider(OutputSurface* output_surface) |
| 608 : output_surface_(output_surface), | 615 : output_surface_(output_surface), |
| 609 lost_output_surface_(false), | 616 lost_output_surface_(false), |
| 610 next_id_(1), | 617 next_id_(1), |
| 611 next_child_(1), | 618 next_child_(1), |
| 612 default_resource_type_(GLTexture), | 619 default_resource_type_(GLTexture), |
| 613 use_texture_storage_ext_(false), | 620 use_texture_storage_ext_(false), |
| 614 use_texture_usage_hint_(false), | 621 use_texture_usage_hint_(false), |
| 615 use_shallow_flush_(false), | 622 use_shallow_flush_(false), |
| 616 max_texture_size_(0), | 623 max_texture_size_(0), |
| 617 best_texture_format_(0) {} | 624 best_texture_format_(0), |
| 625 use_gpu_memory_buffers_(false) {} | |
| 618 | 626 |
| 619 bool ResourceProvider::Initialize(int highp_threshold_min) { | 627 bool ResourceProvider::Initialize(int highp_threshold_min) { |
| 620 DCHECK(thread_checker_.CalledOnValidThread()); | 628 DCHECK(thread_checker_.CalledOnValidThread()); |
| 621 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 629 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| 622 if (!context3d) { | 630 if (!context3d) { |
| 623 max_texture_size_ = INT_MAX / 2; | 631 max_texture_size_ = INT_MAX / 2; |
| 624 best_texture_format_ = GL_RGBA; | 632 best_texture_format_ = GL_RGBA; |
| 625 return true; | 633 return true; |
| 626 } | 634 } |
| 627 if (!context3d->makeContextCurrent()) | 635 if (!context3d->makeContextCurrent()) |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 779 // waiting asynchronously, and resetting sync_point before calling this. | 787 // waiting asynchronously, and resetting sync_point before calling this. |
| 780 // However if the parent is a renderer (e.g. browser tag), it may be ok | 788 // However if the parent is a renderer (e.g. browser tag), it may be ok |
| 781 // (and is simpler) to wait. | 789 // (and is simpler) to wait. |
| 782 if (it->sync_point) | 790 if (it->sync_point) |
| 783 GLC(context3d, context3d->waitSyncPoint(it->sync_point)); | 791 GLC(context3d, context3d->waitSyncPoint(it->sync_point)); |
| 784 GLC(context3d, texture_id = context3d->createTexture()); | 792 GLC(context3d, texture_id = context3d->createTexture()); |
| 785 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, texture_id)); | 793 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, texture_id)); |
| 786 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, | 794 GLC(context3d, context3d->consumeTextureCHROMIUM(GL_TEXTURE_2D, |
| 787 it->mailbox.name)); | 795 it->mailbox.name)); |
| 788 ResourceId id = next_id_++; | 796 ResourceId id = next_id_++; |
| 789 Resource resource(texture_id, it->size, it->format, it->filter); | 797 Resource resource(texture_id, it->size, it->format, it->filter, false); |
| 790 resource.mailbox.SetName(it->mailbox); | 798 resource.mailbox.SetName(it->mailbox); |
| 791 // Don't allocate a texture for a child. | 799 // Don't allocate a texture for a child. |
| 792 resource.allocated = true; | 800 resource.allocated = true; |
| 793 resources_[id] = resource; | 801 resources_[id] = resource; |
| 794 child_info.parent_to_child_map[id] = it->id; | 802 child_info.parent_to_child_map[id] = it->id; |
| 795 child_info.child_to_parent_map[it->id] = id; | 803 child_info.child_to_parent_map[it->id] = id; |
| 796 } | 804 } |
| 797 } | 805 } |
| 798 | 806 |
| 799 void ResourceProvider::ReceiveFromParent( | 807 void ResourceProvider::ReceiveFromParent( |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 873 CHECK(it != resources_.end()); | 881 CHECK(it != resources_.end()); |
| 874 Resource* resource = &it->second; | 882 Resource* resource = &it->second; |
| 875 DCHECK(!resource->external); | 883 DCHECK(!resource->external); |
| 876 DCHECK(!resource->exported); | 884 DCHECK(!resource->exported); |
| 877 | 885 |
| 878 if (resource->gl_id) { | 886 if (resource->gl_id) { |
| 879 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 887 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| 880 DCHECK(context3d); | 888 DCHECK(context3d); |
| 881 if (!resource->gl_pixel_buffer_id) | 889 if (!resource->gl_pixel_buffer_id) |
| 882 resource->gl_pixel_buffer_id = context3d->createBuffer(); | 890 resource->gl_pixel_buffer_id = context3d->createBuffer(); |
| 883 context3d->bindBuffer( | 891 WGC3Denum target = GetTargetGivenResource(resource); |
| 884 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 892 context3d->bindBuffer(target, resource->gl_pixel_buffer_id); |
| 885 resource->gl_pixel_buffer_id); | 893 if (resource->use_gpu_memory_buffer) { |
| 886 context3d->bufferData( | 894 typedef webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl |
| 887 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 895 Context3DImpl; |
| 888 resource->size.width() * resource->size.height() * 4, | 896 Context3DImpl* in_process_context = |
| 889 NULL, | 897 static_cast<Context3DImpl*>(context3d); |
|
jamesr
2013/04/25 22:28:56
you shouldn't be downcasting like this. it means t
kaanb1
2013/04/25 22:43:29
This feature is currently only used for Android We
no sievers
2013/04/25 23:28:14
Keep in mind that ChromeOS might implement 0-copy
kaanb1
2013/04/25 23:55:05
Done.
| |
| 890 GL_DYNAMIC_DRAW); | 898 in_process_context->imageBufferDataCHROMIUM( |
| 891 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 899 target, |
| 900 resource->size.width(), | |
| 901 resource->size.height()); | |
| 902 } else { | |
| 903 context3d->bufferData( | |
| 904 target, | |
| 905 resource->size.width() * resource->size.height() * 4, | |
| 906 NULL, | |
| 907 GL_DYNAMIC_DRAW); | |
| 908 } | |
| 909 context3d->bindBuffer(target, 0); | |
| 892 } | 910 } |
| 893 | 911 |
| 894 if (resource->pixels) { | 912 if (resource->pixels) { |
| 895 if (resource->pixel_buffer) | 913 if (resource->pixel_buffer) |
| 896 return; | 914 return; |
| 897 | 915 |
| 898 resource->pixel_buffer = new uint8_t[ | 916 resource->pixel_buffer = new uint8_t[ |
| 899 resource->size.width() * resource->size.height() * 4]; | 917 resource->size.width() * resource->size.height() * 4]; |
| 900 } | 918 } |
| 901 } | 919 } |
| 902 | 920 |
| 903 void ResourceProvider::ReleasePixelBuffer(ResourceId id) { | 921 void ResourceProvider::ReleasePixelBuffer(ResourceId id) { |
| 904 DCHECK(thread_checker_.CalledOnValidThread()); | 922 DCHECK(thread_checker_.CalledOnValidThread()); |
| 905 ResourceMap::iterator it = resources_.find(id); | 923 ResourceMap::iterator it = resources_.find(id); |
| 906 CHECK(it != resources_.end()); | 924 CHECK(it != resources_.end()); |
| 907 Resource* resource = &it->second; | 925 Resource* resource = &it->second; |
| 908 DCHECK(!resource->external); | 926 DCHECK(!resource->external); |
| 909 DCHECK(!resource->exported); | 927 DCHECK(!resource->exported); |
| 910 | 928 |
| 911 if (resource->gl_id) { | 929 if (resource->gl_id) { |
| 912 DCHECK(resource->gl_pixel_buffer_id); | 930 DCHECK(resource->gl_pixel_buffer_id); |
| 913 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 931 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| 932 WGC3Denum target = GetTargetGivenResource(resource); | |
| 914 DCHECK(context3d); | 933 DCHECK(context3d); |
| 915 context3d->bindBuffer( | 934 context3d->bindBuffer(target, resource->gl_pixel_buffer_id); |
| 916 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 935 if (resource->use_gpu_memory_buffer) { |
| 917 resource->gl_pixel_buffer_id); | 936 typedef webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl |
| 918 context3d->bufferData( | 937 Context3DImpl; |
| 919 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 938 Context3DImpl* in_process_context = |
| 920 0, | 939 static_cast<Context3DImpl*>(context3d); |
| 921 NULL, | 940 in_process_context->imageBufferDataCHROMIUM(target, 0, 0); |
| 922 GL_DYNAMIC_DRAW); | 941 } else { |
| 923 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 942 context3d->bufferData(target, 0, NULL, GL_DYNAMIC_DRAW); |
| 943 } | |
| 944 context3d->bindBuffer(target, 0); | |
| 924 } | 945 } |
| 925 | 946 |
| 926 if (resource->pixels) { | 947 if (resource->pixels) { |
| 927 if (!resource->pixel_buffer) | 948 if (!resource->pixel_buffer) |
| 928 return; | 949 return; |
| 929 delete[] resource->pixel_buffer; | 950 delete[] resource->pixel_buffer; |
| 930 resource->pixel_buffer = NULL; | 951 resource->pixel_buffer = NULL; |
| 931 } | 952 } |
| 932 } | 953 } |
| 933 | 954 |
| 934 uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id) { | 955 uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id) { |
| 935 DCHECK(thread_checker_.CalledOnValidThread()); | 956 DCHECK(thread_checker_.CalledOnValidThread()); |
| 936 ResourceMap::iterator it = resources_.find(id); | 957 ResourceMap::iterator it = resources_.find(id); |
| 937 CHECK(it != resources_.end()); | 958 CHECK(it != resources_.end()); |
| 938 Resource* resource = &it->second; | 959 Resource* resource = &it->second; |
| 939 DCHECK(!resource->external); | 960 DCHECK(!resource->external); |
| 940 DCHECK(!resource->exported); | 961 DCHECK(!resource->exported); |
| 941 | 962 |
| 942 if (resource->gl_id) { | 963 if (resource->gl_id) { |
| 943 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 964 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| 944 DCHECK(context3d); | 965 DCHECK(context3d); |
| 945 DCHECK(resource->gl_pixel_buffer_id); | 966 DCHECK(resource->gl_pixel_buffer_id); |
| 946 context3d->bindBuffer( | 967 WGC3Denum target = GetTargetGivenResource(resource); |
| 947 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 968 context3d->bindBuffer(target, resource->gl_pixel_buffer_id); |
| 948 resource->gl_pixel_buffer_id); | |
| 949 uint8_t* image = static_cast<uint8_t*>( | 969 uint8_t* image = static_cast<uint8_t*>( |
| 950 context3d->mapBufferCHROMIUM( | 970 context3d->mapBufferCHROMIUM(target, GL_WRITE_ONLY)); |
| 951 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY)); | 971 context3d->bindBuffer(target, 0); |
| 952 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | |
| 953 DCHECK(image); | 972 DCHECK(image); |
| 954 return image; | 973 return image; |
| 955 } | 974 } |
| 956 | 975 |
| 957 if (resource->pixels) | 976 if (resource->pixels) |
| 958 return resource->pixel_buffer; | 977 return resource->pixel_buffer; |
| 959 | 978 |
| 960 return NULL; | 979 return NULL; |
| 961 } | 980 } |
| 962 | 981 |
| 963 void ResourceProvider::UnmapPixelBuffer(ResourceId id) { | 982 void ResourceProvider::UnmapPixelBuffer(ResourceId id) { |
| 964 DCHECK(thread_checker_.CalledOnValidThread()); | 983 DCHECK(thread_checker_.CalledOnValidThread()); |
| 965 ResourceMap::iterator it = resources_.find(id); | 984 ResourceMap::iterator it = resources_.find(id); |
| 966 CHECK(it != resources_.end()); | 985 CHECK(it != resources_.end()); |
| 967 Resource* resource = &it->second; | 986 Resource* resource = &it->second; |
| 968 DCHECK(!resource->external); | 987 DCHECK(!resource->external); |
| 969 DCHECK(!resource->exported); | 988 DCHECK(!resource->exported); |
| 970 | 989 |
| 971 if (resource->gl_id) { | 990 if (resource->gl_id) { |
| 972 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 991 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| 973 DCHECK(context3d); | 992 DCHECK(context3d); |
| 974 DCHECK(resource->gl_pixel_buffer_id); | 993 DCHECK(resource->gl_pixel_buffer_id); |
| 975 context3d->bindBuffer( | 994 WGC3Denum target = GetTargetGivenResource(resource); |
| 976 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 995 context3d->bindBuffer(target, resource->gl_pixel_buffer_id); |
| 977 resource->gl_pixel_buffer_id); | 996 context3d->unmapBufferCHROMIUM(target); |
| 978 context3d->unmapBufferCHROMIUM( | 997 context3d->bindBuffer(target, 0); |
| 979 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM); | |
| 980 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | |
| 981 } | 998 } |
| 982 } | 999 } |
| 983 | 1000 |
| 984 void ResourceProvider::SetPixelsFromBuffer(ResourceId id) { | 1001 void ResourceProvider::SetPixelsFromBuffer(ResourceId id) { |
| 985 DCHECK(thread_checker_.CalledOnValidThread()); | 1002 DCHECK(thread_checker_.CalledOnValidThread()); |
| 986 ResourceMap::iterator it = resources_.find(id); | 1003 ResourceMap::iterator it = resources_.find(id); |
| 987 CHECK(it != resources_.end()); | 1004 CHECK(it != resources_.end()); |
| 988 Resource* resource = &it->second; | 1005 Resource* resource = &it->second; |
| 989 DCHECK(!resource->locked_for_write); | 1006 DCHECK(!resource->locked_for_write); |
| 990 DCHECK(!resource->lock_for_read_count); | 1007 DCHECK(!resource->lock_for_read_count); |
| 991 DCHECK(!resource->external); | 1008 DCHECK(!resource->external); |
| 992 DCHECK(!resource->exported); | 1009 DCHECK(!resource->exported); |
| 993 DCHECK(ReadLockFenceHasPassed(resource)); | 1010 DCHECK(ReadLockFenceHasPassed(resource)); |
| 1011 DCHECK(!resource->use_gpu_memory_buffer); | |
| 994 LazyAllocate(resource); | 1012 LazyAllocate(resource); |
| 995 | 1013 |
| 996 if (resource->gl_id) { | 1014 if (resource->gl_id) { |
| 997 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1015 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| 998 DCHECK(context3d); | 1016 DCHECK(context3d); |
| 999 DCHECK(resource->gl_pixel_buffer_id); | 1017 DCHECK(resource->gl_pixel_buffer_id); |
| 1000 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); | 1018 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); |
| 1001 context3d->bindBuffer( | 1019 context3d->bindBuffer( |
| 1002 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1020 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1003 resource->gl_pixel_buffer_id); | 1021 resource->gl_pixel_buffer_id); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1061 | 1079 |
| 1062 bool allocate = !resource->allocated; | 1080 bool allocate = !resource->allocated; |
| 1063 resource->allocated = true; | 1081 resource->allocated = true; |
| 1064 LockForWrite(id); | 1082 LockForWrite(id); |
| 1065 | 1083 |
| 1066 if (resource->gl_id) { | 1084 if (resource->gl_id) { |
| 1067 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1085 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| 1068 DCHECK(context3d); | 1086 DCHECK(context3d); |
| 1069 DCHECK(resource->gl_pixel_buffer_id); | 1087 DCHECK(resource->gl_pixel_buffer_id); |
| 1070 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); | 1088 context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id); |
| 1071 context3d->bindBuffer( | 1089 if (resource->use_gpu_memory_buffer) { |
| 1072 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, | 1090 context3d->bindTexImage2DCHROMIUM( |
| 1073 resource->gl_pixel_buffer_id); | 1091 GL_TEXTURE_2D, resource->gl_pixel_buffer_id); |
| 1074 if (!resource->gl_upload_query_id) | |
| 1075 resource->gl_upload_query_id = context3d->createQueryEXT(); | |
| 1076 context3d->beginQueryEXT( | |
| 1077 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, | |
| 1078 resource->gl_upload_query_id); | |
| 1079 if (allocate) { | |
| 1080 context3d->asyncTexImage2DCHROMIUM(GL_TEXTURE_2D, | |
| 1081 0, /* level */ | |
| 1082 resource->format, | |
| 1083 resource->size.width(), | |
| 1084 resource->size.height(), | |
| 1085 0, /* border */ | |
| 1086 resource->format, | |
| 1087 GL_UNSIGNED_BYTE, | |
| 1088 NULL); | |
| 1089 } else { | 1092 } else { |
| 1090 context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D, | 1093 context3d->bindBuffer( |
| 1091 0, /* level */ | 1094 GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, |
| 1092 0, /* x */ | 1095 resource->gl_pixel_buffer_id); |
| 1093 0, /* y */ | 1096 if (!resource->gl_upload_query_id) |
| 1094 resource->size.width(), | 1097 resource->gl_upload_query_id = context3d->createQueryEXT(); |
| 1095 resource->size.height(), | 1098 context3d->beginQueryEXT( |
| 1096 resource->format, | 1099 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, |
| 1097 GL_UNSIGNED_BYTE, | 1100 resource->gl_upload_query_id); |
| 1098 NULL); | 1101 if (allocate) { |
| 1102 context3d->asyncTexImage2DCHROMIUM(GL_TEXTURE_2D, | |
| 1103 0, /* level */ | |
| 1104 resource->format, | |
| 1105 resource->size.width(), | |
| 1106 resource->size.height(), | |
| 1107 0, /* border */ | |
| 1108 resource->format, | |
| 1109 GL_UNSIGNED_BYTE, | |
| 1110 NULL); | |
| 1111 } else { | |
| 1112 context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D, | |
| 1113 0, /* level */ | |
| 1114 0, /* x */ | |
| 1115 0, /* y */ | |
| 1116 resource->size.width(), | |
| 1117 resource->size.height(), | |
| 1118 resource->format, | |
| 1119 GL_UNSIGNED_BYTE, | |
| 1120 NULL); | |
| 1121 } | |
| 1122 context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM); | |
| 1123 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | |
| 1099 } | 1124 } |
| 1100 context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM); | |
| 1101 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | |
| 1102 } | 1125 } |
| 1103 | 1126 |
| 1104 if (resource->pixels) | 1127 if (resource->pixels) |
| 1105 SetPixelsFromBuffer(id); | 1128 SetPixelsFromBuffer(id); |
| 1106 | 1129 |
| 1107 resource->pending_set_pixels = true; | 1130 resource->pending_set_pixels = true; |
| 1108 resource->set_pixels_completion_forced = false; | 1131 resource->set_pixels_completion_forced = false; |
| 1109 } | 1132 } |
| 1110 | 1133 |
| 1111 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { | 1134 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { |
| 1112 DCHECK(thread_checker_.CalledOnValidThread()); | 1135 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1113 ResourceMap::iterator it = resources_.find(id); | 1136 ResourceMap::iterator it = resources_.find(id); |
| 1114 CHECK(it != resources_.end()); | 1137 CHECK(it != resources_.end()); |
| 1115 Resource* resource = &it->second; | 1138 Resource* resource = &it->second; |
| 1116 DCHECK(resource->locked_for_write); | 1139 DCHECK(resource->locked_for_write); |
| 1117 DCHECK(resource->pending_set_pixels); | 1140 DCHECK(resource->pending_set_pixels); |
| 1118 DCHECK(!resource->set_pixels_completion_forced); | 1141 DCHECK(!resource->set_pixels_completion_forced); |
| 1142 DCHECK(!resource->use_gpu_memory_buffer); | |
| 1119 | 1143 |
| 1120 if (resource->gl_id) { | 1144 if (resource->gl_id) { |
| 1121 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1145 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| 1122 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id)); | 1146 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id)); |
| 1123 GLC(context3d, context3d->waitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); | 1147 GLC(context3d, context3d->waitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); |
| 1124 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, 0)); | 1148 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, 0)); |
| 1125 } | 1149 } |
| 1126 | 1150 |
| 1127 resource->set_pixels_completion_forced = true; | 1151 resource->set_pixels_completion_forced = true; |
| 1128 } | 1152 } |
| 1129 | 1153 |
| 1130 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { | 1154 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { |
| 1131 DCHECK(thread_checker_.CalledOnValidThread()); | 1155 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1132 ResourceMap::iterator it = resources_.find(id); | 1156 ResourceMap::iterator it = resources_.find(id); |
| 1133 CHECK(it != resources_.end()); | 1157 CHECK(it != resources_.end()); |
| 1134 Resource* resource = &it->second; | 1158 Resource* resource = &it->second; |
| 1135 DCHECK(resource->locked_for_write); | 1159 DCHECK(resource->locked_for_write); |
| 1136 DCHECK(resource->pending_set_pixels); | 1160 DCHECK(resource->pending_set_pixels); |
| 1161 DCHECK(!resource->use_gpu_memory_buffer); | |
| 1137 | 1162 |
| 1138 if (resource->gl_id) { | 1163 if (resource->gl_id) { |
| 1139 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1164 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| 1140 DCHECK(context3d); | 1165 DCHECK(context3d); |
| 1141 DCHECK(resource->gl_upload_query_id); | 1166 DCHECK(resource->gl_upload_query_id); |
| 1142 unsigned complete = 1; | 1167 unsigned complete = 1; |
| 1143 context3d->getQueryObjectuivEXT( | 1168 context3d->getQueryObjectuivEXT( |
| 1144 resource->gl_upload_query_id, | 1169 resource->gl_upload_query_id, |
| 1145 GL_QUERY_RESULT_AVAILABLE_EXT, | 1170 GL_QUERY_RESULT_AVAILABLE_EXT, |
| 1146 &complete); | 1171 &complete); |
| 1147 if (!complete) | 1172 if (!complete) |
| 1148 return false; | 1173 return false; |
| 1149 } | 1174 } |
| 1150 | 1175 |
| 1151 resource->pending_set_pixels = false; | 1176 resource->pending_set_pixels = false; |
| 1152 UnlockForWrite(id); | 1177 UnlockForWrite(id); |
| 1153 | 1178 |
| 1154 return true; | 1179 return true; |
| 1155 } | 1180 } |
| 1156 | 1181 |
| 1157 void ResourceProvider::AbortSetPixels(ResourceId id) { | 1182 void ResourceProvider::AbortSetPixels(ResourceId id) { |
| 1158 DCHECK(thread_checker_.CalledOnValidThread()); | 1183 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1159 ResourceMap::iterator it = resources_.find(id); | 1184 ResourceMap::iterator it = resources_.find(id); |
| 1160 CHECK(it != resources_.end()); | 1185 CHECK(it != resources_.end()); |
| 1161 Resource* resource = &it->second; | 1186 Resource* resource = &it->second; |
| 1162 DCHECK(resource->locked_for_write); | 1187 DCHECK(resource->locked_for_write); |
| 1163 DCHECK(resource->pending_set_pixels); | 1188 DCHECK(resource->pending_set_pixels); |
| 1189 DCHECK(!resource->use_gpu_memory_buffer); | |
| 1164 | 1190 |
| 1165 if (resource->gl_id) { | 1191 if (resource->gl_id) { |
| 1166 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1192 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| 1167 DCHECK(context3d); | 1193 DCHECK(context3d); |
| 1168 DCHECK(resource->gl_upload_query_id); | 1194 DCHECK(resource->gl_upload_query_id); |
| 1169 // CHROMIUM_async_pixel_transfers currently doesn't have a way to | 1195 // CHROMIUM_async_pixel_transfers currently doesn't have a way to |
| 1170 // abort an upload. The best we can do is delete the query and | 1196 // abort an upload. The best we can do is delete the query and |
| 1171 // the texture. | 1197 // the texture. |
| 1172 context3d->deleteQueryEXT(resource->gl_upload_query_id); | 1198 context3d->deleteQueryEXT(resource->gl_upload_query_id); |
| 1173 resource->gl_upload_query_id = 0; | 1199 resource->gl_upload_query_id = 0; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1220 | 1246 |
| 1221 void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, | 1247 void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id, |
| 1222 bool enable) { | 1248 bool enable) { |
| 1223 DCHECK(thread_checker_.CalledOnValidThread()); | 1249 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1224 ResourceMap::iterator it = resources_.find(id); | 1250 ResourceMap::iterator it = resources_.find(id); |
| 1225 CHECK(it != resources_.end()); | 1251 CHECK(it != resources_.end()); |
| 1226 Resource* resource = &it->second; | 1252 Resource* resource = &it->second; |
| 1227 resource->enable_read_lock_fences = enable; | 1253 resource->enable_read_lock_fences = enable; |
| 1228 } | 1254 } |
| 1229 | 1255 |
| 1256 void ResourceProvider::SetUseGpuMemoryBuffers(bool use_gpu_memory_buffers) { | |
| 1257 use_gpu_memory_buffers_ = use_gpu_memory_buffers; | |
| 1258 } | |
| 1259 | |
| 1260 GLenum ResourceProvider::GetTargetGivenResource(Resource* resource) { | |
| 1261 return resource->use_gpu_memory_buffer | |
| 1262 ? GL_IMAGE_BUFFER_CHROMIUM | |
| 1263 : GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM; | |
| 1264 } | |
| 1265 | |
| 1230 } // namespace cc | 1266 } // namespace cc |
| OLD | NEW |