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

Unified Diff: cc/raster/one_copy_tile_task_worker_pool.cc

Issue 1317743002: cc: Implement shared worker contexts. (v1) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix tear down Created 5 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/raster/gpu_tile_task_worker_pool.cc ('k') | cc/raster/tile_task_worker_pool_perftest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/raster/one_copy_tile_task_worker_pool.cc
diff --git a/cc/raster/one_copy_tile_task_worker_pool.cc b/cc/raster/one_copy_tile_task_worker_pool.cc
index c5518e3cd88d5a1e348f22dbce8d6c5cfb70d304..6166059d396659b20b72dfa0e66f6f6117929e96 100644
--- a/cc/raster/one_copy_tile_task_worker_pool.cc
+++ b/cc/raster/one_copy_tile_task_worker_pool.cc
@@ -112,15 +112,18 @@ OneCopyTileTaskWorkerPool::StagingBuffer::~StagingBuffer() {
void OneCopyTileTaskWorkerPool::StagingBuffer::DestroyGLResources(
gpu::gles2::GLES2Interface* gl) {
if (query_id) {
- gl->DeleteQueriesEXT(1, &query_id);
+ if (gl)
+ gl->DeleteQueriesEXT(1, &query_id);
query_id = 0;
}
if (image_id) {
- gl->DestroyImageCHROMIUM(image_id);
+ if (gl)
+ gl->DestroyImageCHROMIUM(image_id);
image_id = 0;
}
if (texture_id) {
- gl->DeleteTextures(1, &texture_id);
+ if (gl)
+ gl->DeleteTextures(1, &texture_id);
texture_id = 0;
}
}
@@ -424,97 +427,99 @@ void OneCopyTileTaskWorkerPool::PlaybackAndCopyOnWorkerThread(
ContextProvider::ScopedContextLock scoped_context(context_provider);
gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL();
- DCHECK(gl);
-
- unsigned image_target = resource_provider_->GetImageTextureTarget(
- resource_provider_->memory_efficient_texture_format());
-
- // Create and bind staging texture.
- if (!staging_buffer->texture_id) {
- gl->GenTextures(1, &staging_buffer->texture_id);
- gl->BindTexture(image_target, staging_buffer->texture_id);
- gl->TexParameteri(image_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- gl->TexParameteri(image_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- gl->TexParameteri(image_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri(image_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- } else {
- gl->BindTexture(image_target, staging_buffer->texture_id);
- }
+ if (gl) {
+ unsigned image_target = resource_provider_->GetImageTextureTarget(
+ resource_provider_->memory_efficient_texture_format());
+
+ // Create and bind staging texture.
+ if (!staging_buffer->texture_id) {
+ gl->GenTextures(1, &staging_buffer->texture_id);
+ gl->BindTexture(image_target, staging_buffer->texture_id);
+ gl->TexParameteri(image_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ gl->TexParameteri(image_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl->TexParameteri(image_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ gl->TexParameteri(image_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ } else {
+ gl->BindTexture(image_target, staging_buffer->texture_id);
+ }
- // Create and bind image.
- if (!staging_buffer->image_id) {
- if (staging_buffer->gpu_memory_buffer) {
- staging_buffer->image_id = gl->CreateImageCHROMIUM(
- staging_buffer->gpu_memory_buffer->AsClientBuffer(),
- staging_buffer->size.width(), staging_buffer->size.height(),
- GLInternalFormat(
- resource_provider_->memory_efficient_texture_format()));
+ // Create and bind image.
+ if (!staging_buffer->image_id) {
+ if (staging_buffer->gpu_memory_buffer) {
+ staging_buffer->image_id = gl->CreateImageCHROMIUM(
+ staging_buffer->gpu_memory_buffer->AsClientBuffer(),
+ staging_buffer->size.width(), staging_buffer->size.height(),
+ GLInternalFormat(
+ resource_provider_->memory_efficient_texture_format()));
+ gl->BindTexImage2DCHROMIUM(image_target, staging_buffer->image_id);
+ }
+ } else {
+ gl->ReleaseTexImage2DCHROMIUM(image_target, staging_buffer->image_id);
gl->BindTexImage2DCHROMIUM(image_target, staging_buffer->image_id);
}
- } else {
- gl->ReleaseTexImage2DCHROMIUM(image_target, staging_buffer->image_id);
- gl->BindTexImage2DCHROMIUM(image_target, staging_buffer->image_id);
- }
- // Unbind staging texture.
- gl->BindTexture(image_target, 0);
+ // Unbind staging texture.
+ gl->BindTexture(image_target, 0);
- if (resource_provider_->use_sync_query()) {
- if (!staging_buffer->query_id)
- gl->GenQueriesEXT(1, &staging_buffer->query_id);
+ if (resource_provider_->use_sync_query()) {
+ if (!staging_buffer->query_id)
+ gl->GenQueriesEXT(1, &staging_buffer->query_id);
#if defined(OS_CHROMEOS)
- // TODO(reveman): This avoids a performance problem on some ChromeOS
- // devices. This needs to be removed to support native GpuMemoryBuffer
- // implementations. crbug.com/436314
- gl->BeginQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM, staging_buffer->query_id);
+ // TODO(reveman): This avoids a performance problem on some ChromeOS
+ // devices. This needs to be removed to support native GpuMemoryBuffer
+ // implementations. crbug.com/436314
+ gl->BeginQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM,
+ staging_buffer->query_id);
#else
- gl->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM,
- staging_buffer->query_id);
+ gl->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM,
+ staging_buffer->query_id);
#endif
- }
+ }
- int bytes_per_row =
- (BitsPerPixel(resource_provider_->memory_efficient_texture_format()) *
- resource->size().width()) /
- 8;
- int chunk_size_in_rows =
- std::max(1, max_bytes_per_copy_operation_ / bytes_per_row);
- // Align chunk size to 4. Required to support compressed texture formats.
- chunk_size_in_rows = MathUtil::UncheckedRoundUp(chunk_size_in_rows, 4);
- int y = 0;
- int height = resource->size().height();
- while (y < height) {
- // Copy at most |chunk_size_in_rows|.
- int rows_to_copy = std::min(chunk_size_in_rows, height - y);
- DCHECK_GT(rows_to_copy, 0);
-
- gl->CopySubTextureCHROMIUM(GL_TEXTURE_2D, staging_buffer->texture_id,
- resource_lock->texture_id(), 0, y, 0, y,
- resource->size().width(), rows_to_copy, false,
- false, false);
- y += rows_to_copy;
-
- // Increment |bytes_scheduled_since_last_flush_| by the amount of memory
- // used for this copy operation.
- bytes_scheduled_since_last_flush_ += rows_to_copy * bytes_per_row;
-
- if (bytes_scheduled_since_last_flush_ >= max_bytes_per_copy_operation_) {
- gl->ShallowFlushCHROMIUM();
- bytes_scheduled_since_last_flush_ = 0;
+ int bytes_per_row =
+ (BitsPerPixel(resource_provider_->memory_efficient_texture_format()) *
+ resource->size().width()) /
+ 8;
+ int chunk_size_in_rows =
+ std::max(1, max_bytes_per_copy_operation_ / bytes_per_row);
+ // Align chunk size to 4. Required to support compressed texture formats.
+ chunk_size_in_rows = MathUtil::UncheckedRoundUp(chunk_size_in_rows, 4);
+ int y = 0;
+ int height = resource->size().height();
+ while (y < height) {
+ // Copy at most |chunk_size_in_rows|.
+ int rows_to_copy = std::min(chunk_size_in_rows, height - y);
+ DCHECK_GT(rows_to_copy, 0);
+
+ gl->CopySubTextureCHROMIUM(GL_TEXTURE_2D, staging_buffer->texture_id,
+ resource_lock->texture_id(), 0, y, 0, y,
+ resource->size().width(), rows_to_copy,
+ false, false, false);
+ y += rows_to_copy;
+
+ // Increment |bytes_scheduled_since_last_flush_| by the amount of memory
+ // used for this copy operation.
+ bytes_scheduled_since_last_flush_ += rows_to_copy * bytes_per_row;
+
+ if (bytes_scheduled_since_last_flush_ >=
+ max_bytes_per_copy_operation_) {
+ gl->ShallowFlushCHROMIUM();
+ bytes_scheduled_since_last_flush_ = 0;
+ }
}
- }
- if (resource_provider_->use_sync_query()) {
+ if (resource_provider_->use_sync_query()) {
#if defined(OS_CHROMEOS)
- gl->EndQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM);
+ gl->EndQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM);
#else
- gl->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM);
+ gl->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM);
#endif
- }
+ }
- // Barrier to sync worker context output to cc context.
- gl->OrderingBarrierCHROMIUM();
+ // Barrier to sync worker context output to cc context.
+ gl->OrderingBarrierCHROMIUM();
+ }
}
staging_buffer->last_usage = base::TimeTicks::Now();
@@ -598,37 +603,37 @@ OneCopyTileTaskWorkerPool::AcquireStagingBuffer(const Resource* resource,
ContextProvider::ScopedContextLock scoped_context(context_provider);
gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL();
- DCHECK(gl);
-
- // Check if any busy buffers have become available.
- if (resource_provider_->use_sync_query()) {
- while (!busy_buffers_.empty()) {
- if (!CheckForQueryResult(gl, busy_buffers_.front()->query_id))
- break;
+ if (gl) {
+ // Check if any busy buffers have become available.
+ if (resource_provider_->use_sync_query()) {
+ while (!busy_buffers_.empty()) {
+ if (!CheckForQueryResult(gl, busy_buffers_.front()->query_id))
+ break;
- MarkStagingBufferAsFree(busy_buffers_.front());
- free_buffers_.push_back(busy_buffers_.take_front());
+ MarkStagingBufferAsFree(busy_buffers_.front());
+ free_buffers_.push_back(busy_buffers_.take_front());
+ }
}
- }
- // Wait for memory usage of non-free buffers to become less than the limit.
- while (
- (staging_buffer_usage_in_bytes_ - free_staging_buffer_usage_in_bytes_) >=
- max_staging_buffer_usage_in_bytes_) {
- // Stop when there are no more busy buffers to wait for.
- if (busy_buffers_.empty())
- break;
+ // Wait for memory usage of non-free buffers to become less than the limit.
+ while ((staging_buffer_usage_in_bytes_ -
+ free_staging_buffer_usage_in_bytes_) >=
+ max_staging_buffer_usage_in_bytes_) {
+ // Stop when there are no more busy buffers to wait for.
+ if (busy_buffers_.empty())
+ break;
- if (resource_provider_->use_sync_query()) {
- WaitForQueryResult(gl, busy_buffers_.front()->query_id);
- MarkStagingBufferAsFree(busy_buffers_.front());
- free_buffers_.push_back(busy_buffers_.take_front());
- } else {
- // Fall-back to glFinish if CHROMIUM_sync_query is not available.
- gl->Finish();
- while (!busy_buffers_.empty()) {
+ if (resource_provider_->use_sync_query()) {
+ WaitForQueryResult(gl, busy_buffers_.front()->query_id);
MarkStagingBufferAsFree(busy_buffers_.front());
free_buffers_.push_back(busy_buffers_.take_front());
+ } else {
+ // Fall-back to glFinish if CHROMIUM_sync_query is not available.
+ gl->Finish();
+ while (!busy_buffers_.empty()) {
+ MarkStagingBufferAsFree(busy_buffers_.front());
+ free_buffers_.push_back(busy_buffers_.take_front());
+ }
}
}
}
@@ -745,7 +750,6 @@ void OneCopyTileTaskWorkerPool::ReleaseBuffersNotUsedSince(
ContextProvider::ScopedContextLock scoped_context(context_provider);
gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL();
- DCHECK(gl);
// Note: Front buffer is guaranteed to be LRU so we can stop releasing
// buffers as soon as we find a buffer that has been used since |time|.
« no previous file with comments | « cc/raster/gpu_tile_task_worker_pool.cc ('k') | cc/raster/tile_task_worker_pool_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698