| 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/resource_provider.h" | 5 #include "cc/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" |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 gl_pixel_buffer_id(0), | 67 gl_pixel_buffer_id(0), |
| 68 gl_upload_query_id(0), | 68 gl_upload_query_id(0), |
| 69 pixels(NULL), | 69 pixels(NULL), |
| 70 pixel_buffer(NULL), | 70 pixel_buffer(NULL), |
| 71 lock_for_read_count(0), | 71 lock_for_read_count(0), |
| 72 locked_for_write(false), | 72 locked_for_write(false), |
| 73 external(false), | 73 external(false), |
| 74 exported(false), | 74 exported(false), |
| 75 marked_for_deletion(false), | 75 marked_for_deletion(false), |
| 76 pending_set_pixels(false), | 76 pending_set_pixels(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)) {} |
| 84 | 85 |
| 85 ResourceProvider::Resource::~Resource() {} | 86 ResourceProvider::Resource::~Resource() {} |
| 86 | 87 |
| 87 ResourceProvider::Resource::Resource( | 88 ResourceProvider::Resource::Resource( |
| 88 unsigned texture_id, gfx::Size size, GLenum format, GLenum filter) | 89 unsigned texture_id, gfx::Size size, GLenum format, GLenum filter) |
| 89 : gl_id(texture_id), | 90 : gl_id(texture_id), |
| 90 gl_pixel_buffer_id(0), | 91 gl_pixel_buffer_id(0), |
| 91 gl_upload_query_id(0), | 92 gl_upload_query_id(0), |
| 92 pixels(NULL), | 93 pixels(NULL), |
| 93 pixel_buffer(NULL), | 94 pixel_buffer(NULL), |
| 94 lock_for_read_count(0), | 95 lock_for_read_count(0), |
| 95 locked_for_write(false), | 96 locked_for_write(false), |
| 96 external(false), | 97 external(false), |
| 97 exported(false), | 98 exported(false), |
| 98 marked_for_deletion(false), | 99 marked_for_deletion(false), |
| 99 pending_set_pixels(false), | 100 pending_set_pixels(false), |
| 101 set_pixels_completion_forced(false), |
| 100 allocated(false), | 102 allocated(false), |
| 101 enable_read_lock_fences(false), | 103 enable_read_lock_fences(false), |
| 102 read_lock_fence(NULL), | 104 read_lock_fence(NULL), |
| 103 size(size), | 105 size(size), |
| 104 format(format), | 106 format(format), |
| 105 filter(filter), | 107 filter(filter), |
| 106 type(GLTexture) {} | 108 type(GLTexture) {} |
| 107 | 109 |
| 108 ResourceProvider::Resource::Resource( | 110 ResourceProvider::Resource::Resource( |
| 109 uint8_t* pixels, gfx::Size size, GLenum format, GLenum filter) | 111 uint8_t* pixels, gfx::Size size, GLenum format, GLenum filter) |
| 110 : gl_id(0), | 112 : gl_id(0), |
| 111 gl_pixel_buffer_id(0), | 113 gl_pixel_buffer_id(0), |
| 112 gl_upload_query_id(0), | 114 gl_upload_query_id(0), |
| 113 pixels(pixels), | 115 pixels(pixels), |
| 114 pixel_buffer(NULL), | 116 pixel_buffer(NULL), |
| 115 lock_for_read_count(0), | 117 lock_for_read_count(0), |
| 116 locked_for_write(false), | 118 locked_for_write(false), |
| 117 external(false), | 119 external(false), |
| 118 exported(false), | 120 exported(false), |
| 119 marked_for_deletion(false), | 121 marked_for_deletion(false), |
| 120 pending_set_pixels(false), | 122 pending_set_pixels(false), |
| 123 set_pixels_completion_forced(false), |
| 121 allocated(false), | 124 allocated(false), |
| 122 enable_read_lock_fences(false), | 125 enable_read_lock_fences(false), |
| 123 read_lock_fence(NULL), | 126 read_lock_fence(NULL), |
| 124 size(size), | 127 size(size), |
| 125 format(format), | 128 format(format), |
| 126 filter(filter), | 129 filter(filter), |
| 127 type(Bitmap) {} | 130 type(Bitmap) {} |
| 128 | 131 |
| 129 ResourceProvider::Child::Child() {} | 132 ResourceProvider::Child::Child() {} |
| 130 | 133 |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 | 434 |
| 432 context3d->shallowFlushCHROMIUM(); | 435 context3d->shallowFlushCHROMIUM(); |
| 433 return true; | 436 return true; |
| 434 } | 437 } |
| 435 | 438 |
| 436 const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { | 439 const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) { |
| 437 DCHECK(thread_checker_.CalledOnValidThread()); | 440 DCHECK(thread_checker_.CalledOnValidThread()); |
| 438 ResourceMap::iterator it = resources_.find(id); | 441 ResourceMap::iterator it = resources_.find(id); |
| 439 CHECK(it != resources_.end()); | 442 CHECK(it != resources_.end()); |
| 440 Resource* resource = &it->second; | 443 Resource* resource = &it->second; |
| 441 DCHECK(!resource->locked_for_write); | 444 DCHECK(!resource->locked_for_write || resource->set_pixels_completion_forced); |
| 442 DCHECK(!resource->exported); | 445 DCHECK(!resource->exported); |
| 443 // Uninitialized! Call SetPixels or LockForWrite first. | 446 // Uninitialized! Call SetPixels or LockForWrite first. |
| 444 DCHECK(resource->allocated); | 447 DCHECK(resource->allocated); |
| 445 | 448 |
| 446 if (!resource->gl_id && resource->external && !resource->mailbox.IsEmpty()) { | 449 if (!resource->gl_id && resource->external && !resource->mailbox.IsEmpty()) { |
| 447 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 450 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| 448 DCHECK(context3d); | 451 DCHECK(context3d); |
| 449 if (resource->mailbox.sync_point()) { | 452 if (resource->mailbox.sync_point()) { |
| 450 GLC(context3d, context3d->waitSyncPoint(resource->mailbox.sync_point())); | 453 GLC(context3d, context3d->waitSyncPoint(resource->mailbox.sync_point())); |
| 451 resource->mailbox.ResetSyncPoint(); | 454 resource->mailbox.ResetSyncPoint(); |
| (...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1009 } | 1012 } |
| 1010 | 1013 |
| 1011 void ResourceProvider::BindForSampling(ResourceProvider::ResourceId resource_id, | 1014 void ResourceProvider::BindForSampling(ResourceProvider::ResourceId resource_id, |
| 1012 GLenum target, GLenum filter) { | 1015 GLenum target, GLenum filter) { |
| 1013 DCHECK(thread_checker_.CalledOnValidThread()); | 1016 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1014 WebGraphicsContext3D* context3d = output_surface_->context3d(); | 1017 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| 1015 ResourceMap::iterator it = resources_.find(resource_id); | 1018 ResourceMap::iterator it = resources_.find(resource_id); |
| 1016 DCHECK(it != resources_.end()); | 1019 DCHECK(it != resources_.end()); |
| 1017 Resource* resource = &it->second; | 1020 Resource* resource = &it->second; |
| 1018 DCHECK(resource->lock_for_read_count); | 1021 DCHECK(resource->lock_for_read_count); |
| 1019 DCHECK(!resource->locked_for_write); | 1022 DCHECK(!resource->locked_for_write || resource->set_pixels_completion_forced); |
| 1020 | 1023 |
| 1021 GLC(context3d, context3d->bindTexture(target, resource->gl_id)); | 1024 GLC(context3d, context3d->bindTexture(target, resource->gl_id)); |
| 1022 if (filter != resource->filter) { | 1025 if (filter != resource->filter) { |
| 1023 GLC(context3d, context3d->texParameteri(target, | 1026 GLC(context3d, context3d->texParameteri(target, |
| 1024 GL_TEXTURE_MIN_FILTER, | 1027 GL_TEXTURE_MIN_FILTER, |
| 1025 filter)); | 1028 filter)); |
| 1026 GLC(context3d, context3d->texParameteri(target, | 1029 GLC(context3d, context3d->texParameteri(target, |
| 1027 GL_TEXTURE_MAG_FILTER, | 1030 GL_TEXTURE_MAG_FILTER, |
| 1028 filter)); | 1031 filter)); |
| 1029 resource->filter = filter; | 1032 resource->filter = filter; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1078 NULL); | 1081 NULL); |
| 1079 } | 1082 } |
| 1080 context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM); | 1083 context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM); |
| 1081 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); | 1084 context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| 1082 } | 1085 } |
| 1083 | 1086 |
| 1084 if (resource->pixels) | 1087 if (resource->pixels) |
| 1085 SetPixelsFromBuffer(id); | 1088 SetPixelsFromBuffer(id); |
| 1086 | 1089 |
| 1087 resource->pending_set_pixels = true; | 1090 resource->pending_set_pixels = true; |
| 1091 resource->set_pixels_completion_forced = false; |
| 1092 } |
| 1093 |
| 1094 void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) { |
| 1095 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1096 ResourceMap::iterator it = resources_.find(id); |
| 1097 CHECK(it != resources_.end()); |
| 1098 Resource* resource = &it->second; |
| 1099 DCHECK(resource->locked_for_write); |
| 1100 DCHECK(resource->pending_set_pixels); |
| 1101 DCHECK(!resource->set_pixels_completion_forced); |
| 1102 |
| 1103 if (resource->gl_id) { |
| 1104 WebGraphicsContext3D* context3d = output_surface_->context3d(); |
| 1105 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, resource->gl_id)); |
| 1106 GLC(context3d, context3d->waitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D)); |
| 1107 GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, 0)); |
| 1108 } |
| 1109 |
| 1110 resource->set_pixels_completion_forced = true; |
| 1088 } | 1111 } |
| 1089 | 1112 |
| 1090 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { | 1113 bool ResourceProvider::DidSetPixelsComplete(ResourceId id) { |
| 1091 DCHECK(thread_checker_.CalledOnValidThread()); | 1114 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1092 ResourceMap::iterator it = resources_.find(id); | 1115 ResourceMap::iterator it = resources_.find(id); |
| 1093 CHECK(it != resources_.end()); | 1116 CHECK(it != resources_.end()); |
| 1094 Resource* resource = &it->second; | 1117 Resource* resource = &it->second; |
| 1095 DCHECK(resource->locked_for_write); | 1118 DCHECK(resource->locked_for_write); |
| 1096 DCHECK(resource->pending_set_pixels); | 1119 DCHECK(resource->pending_set_pixels); |
| 1097 | 1120 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1187 } | 1210 } |
| 1188 | 1211 |
| 1189 void ResourceProvider::SetOffscreenContextProvider( | 1212 void ResourceProvider::SetOffscreenContextProvider( |
| 1190 scoped_refptr<cc::ContextProvider> offscreen_context_provider) { | 1213 scoped_refptr<cc::ContextProvider> offscreen_context_provider) { |
| 1191 if (offscreen_context_provider) | 1214 if (offscreen_context_provider) |
| 1192 offscreen_context_provider->BindToCurrentThread(); | 1215 offscreen_context_provider->BindToCurrentThread(); |
| 1193 offscreen_context_provider_ = offscreen_context_provider; | 1216 offscreen_context_provider_ = offscreen_context_provider; |
| 1194 } | 1217 } |
| 1195 | 1218 |
| 1196 } // namespace cc | 1219 } // namespace cc |
| OLD | NEW |