| Index: cc/resources/resource_provider.cc
|
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
|
| index 874fe3f641907df4c4e2b198316ce662d639b2a2..36c6f9e62727549997d32875d1fd6e7182a754e9 100644
|
| --- a/cc/resources/resource_provider.cc
|
| +++ b/cc/resources/resource_provider.cc
|
| @@ -216,12 +216,14 @@ scoped_ptr<ResourceProvider> ResourceProvider::Create(
|
| OutputSurface* output_surface,
|
| SharedBitmapManager* shared_bitmap_manager,
|
| int highp_threshold_min,
|
| - bool use_rgba_4444_texture_format) {
|
| + bool use_rgba_4444_texture_format,
|
| + size_t texture_id_allocation_chunk_size) {
|
| scoped_ptr<ResourceProvider> resource_provider(
|
| new ResourceProvider(output_surface,
|
| shared_bitmap_manager,
|
| highp_threshold_min,
|
| - use_rgba_4444_texture_format));
|
| + use_rgba_4444_texture_format,
|
| + texture_id_allocation_chunk_size));
|
|
|
| bool success = false;
|
| if (resource_provider->Context3d()) {
|
| @@ -647,7 +649,7 @@ const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) {
|
| context3d->waitSyncPoint(resource->mailbox.sync_point()));
|
| resource->mailbox.ResetSyncPoint();
|
| }
|
| - resource->gl_id = context3d->createTexture();
|
| + resource->gl_id = NextTextureId();
|
| GLC(context3d, context3d->bindTexture(resource->target, resource->gl_id));
|
| GLC(context3d,
|
| context3d->consumeTextureCHROMIUM(resource->target,
|
| @@ -791,7 +793,8 @@ ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() {
|
| ResourceProvider::ResourceProvider(OutputSurface* output_surface,
|
| SharedBitmapManager* shared_bitmap_manager,
|
| int highp_threshold_min,
|
| - bool use_rgba_4444_texture_format)
|
| + bool use_rgba_4444_texture_format,
|
| + size_t texture_id_allocation_chunk_size)
|
| : output_surface_(output_surface),
|
| shared_bitmap_manager_(shared_bitmap_manager),
|
| lost_output_surface_(false),
|
| @@ -804,8 +807,10 @@ ResourceProvider::ResourceProvider(OutputSurface* output_surface,
|
| use_shallow_flush_(false),
|
| max_texture_size_(0),
|
| best_texture_format_(RGBA_8888),
|
| - use_rgba_4444_texture_format_(use_rgba_4444_texture_format) {
|
| + use_rgba_4444_texture_format_(use_rgba_4444_texture_format),
|
| + texture_id_allocation_chunk_size_(texture_id_allocation_chunk_size) {
|
| DCHECK(output_surface_->HasClient());
|
| + DCHECK(texture_id_allocation_chunk_size_);
|
| }
|
|
|
| void ResourceProvider::InitializeSoftware() {
|
| @@ -863,6 +868,14 @@ void ResourceProvider::CleanUpGLIfNeeded() {
|
| DCHECK(context3d);
|
| context3d->makeContextCurrent();
|
| texture_uploader_.reset();
|
| + if (!unused_texture_ids_.empty()) {
|
| + size_t size = unused_texture_ids_.size();
|
| + scoped_ptr<WebKit::WebGLId[]> ids(new WebKit::WebGLId[size]);
|
| + for (size_t i = 0; i < size; ++i)
|
| + ids[i] = unused_texture_ids_[i];
|
| + GLC(context3d, context3d->deleteTextures(size, ids.get()));
|
| + unused_texture_ids_.clear();
|
| + }
|
| Finish();
|
| }
|
|
|
| @@ -988,7 +1001,7 @@ void ResourceProvider::ReceiveFromChild(
|
| // (and is simpler) to wait.
|
| if (it->sync_point)
|
| GLC(context3d, context3d->waitSyncPoint(it->sync_point));
|
| - GLC(context3d, texture_id = context3d->createTexture());
|
| + texture_id = NextTextureId();
|
| GLC(context3d, context3d->bindTexture(it->target, texture_id));
|
| GLC(context3d,
|
| context3d->consumeTextureCHROMIUM(it->target, it->mailbox.name));
|
| @@ -1546,11 +1559,12 @@ void ResourceProvider::LazyCreate(Resource* resource) {
|
| if (resource->texture_pool == 0)
|
| return;
|
|
|
| + resource->gl_id = NextTextureId();
|
| +
|
| WebGraphicsContext3D* context3d = Context3d();
|
| DCHECK(context3d);
|
|
|
| // Create and set texture properties. Allocation is delayed until needed.
|
| - GLC(context3d, resource->gl_id = context3d->createTexture());
|
| GLC(context3d, context3d->bindTexture(resource->target, resource->gl_id));
|
| GLC(context3d,
|
| context3d->texParameteri(
|
| @@ -1729,4 +1743,20 @@ WebKit::WebGraphicsContext3D* ResourceProvider::Context3d() const {
|
| return context_provider ? context_provider->Context3d() : NULL;
|
| }
|
|
|
| +unsigned ResourceProvider::NextTextureId() {
|
| + if (unused_texture_ids_.empty()) {
|
| + size_t size = texture_id_allocation_chunk_size_;
|
| + scoped_ptr<WebKit::WebGLId[]> ids(new WebKit::WebGLId[size]);
|
| + WebGraphicsContext3D* context3d = Context3d();
|
| + DCHECK(context3d);
|
| + GLC(context3d, context3d->genTextures(size, ids.get()));
|
| + unused_texture_ids_.assign(ids.get(), ids.get() + size);
|
| + }
|
| +
|
| + unsigned gl_id = unused_texture_ids_.front();
|
| + unused_texture_ids_.pop_front();
|
| +
|
| + return gl_id;
|
| +}
|
| +
|
| } // namespace cc
|
|
|