OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/raster/one_copy_raster_buffer_provider.h" | 5 #include "cc/raster/one_copy_raster_buffer_provider.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <limits> | 10 #include <limits> |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 | 233 |
234 std::unique_ptr<StagingBuffer> staging_buffer = | 234 std::unique_ptr<StagingBuffer> staging_buffer = |
235 staging_pool_.AcquireStagingBuffer(resource, previous_content_id); | 235 staging_pool_.AcquireStagingBuffer(resource, previous_content_id); |
236 | 236 |
237 PlaybackToStagingBuffer( | 237 PlaybackToStagingBuffer( |
238 staging_buffer.get(), resource, raster_source, raster_full_rect, | 238 staging_buffer.get(), resource, raster_source, raster_full_rect, |
239 raster_dirty_rect, transform, resource_lock->color_space_for_raster(), | 239 raster_dirty_rect, transform, resource_lock->color_space_for_raster(), |
240 playback_settings, previous_content_id, new_content_id); | 240 playback_settings, previous_content_id, new_content_id); |
241 | 241 |
242 CopyOnWorkerThread(staging_buffer.get(), resource_lock, sync_token, | 242 CopyOnWorkerThread(staging_buffer.get(), resource_lock, sync_token, |
243 raster_source, previous_content_id, new_content_id); | 243 raster_source, raster_full_rect); |
244 | 244 |
245 staging_pool_.ReleaseStagingBuffer(std::move(staging_buffer)); | 245 staging_pool_.ReleaseStagingBuffer(std::move(staging_buffer)); |
246 } | 246 } |
247 | 247 |
248 void OneCopyRasterBufferProvider::PlaybackToStagingBuffer( | 248 void OneCopyRasterBufferProvider::PlaybackToStagingBuffer( |
249 StagingBuffer* staging_buffer, | 249 StagingBuffer* staging_buffer, |
250 const Resource* resource, | 250 const Resource* resource, |
251 const RasterSource* raster_source, | 251 const RasterSource* raster_source, |
252 const gfx::Rect& raster_full_rect, | 252 const gfx::Rect& raster_full_rect, |
253 const gfx::Rect& raster_dirty_rect, | 253 const gfx::Rect& raster_dirty_rect, |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 buffer->Unmap(); | 305 buffer->Unmap(); |
306 staging_buffer->content_id = new_content_id; | 306 staging_buffer->content_id = new_content_id; |
307 } | 307 } |
308 } | 308 } |
309 | 309 |
310 void OneCopyRasterBufferProvider::CopyOnWorkerThread( | 310 void OneCopyRasterBufferProvider::CopyOnWorkerThread( |
311 StagingBuffer* staging_buffer, | 311 StagingBuffer* staging_buffer, |
312 ResourceProvider::ScopedWriteLockGL* resource_lock, | 312 ResourceProvider::ScopedWriteLockGL* resource_lock, |
313 const gpu::SyncToken& sync_token, | 313 const gpu::SyncToken& sync_token, |
314 const RasterSource* raster_source, | 314 const RasterSource* raster_source, |
315 uint64_t previous_content_id, | 315 const gfx::Rect& rect_to_copy) { |
316 uint64_t new_content_id) { | |
317 ContextProvider::ScopedContextLock scoped_context(worker_context_provider_); | 316 ContextProvider::ScopedContextLock scoped_context(worker_context_provider_); |
318 gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL(); | 317 gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL(); |
319 DCHECK(gl); | 318 DCHECK(gl); |
320 | 319 |
321 // Create texture after synchronizing with compositor. | 320 // Create texture after synchronizing with compositor. |
322 ResourceProvider::ScopedTextureProvider scoped_texture( | 321 ResourceProvider::ScopedTextureProvider scoped_texture( |
323 gl, resource_lock, async_worker_context_enabled_); | 322 gl, resource_lock, async_worker_context_enabled_); |
324 | 323 |
325 unsigned resource_texture_id = scoped_texture.texture_id(); | 324 unsigned resource_texture_id = scoped_texture.texture_id(); |
326 unsigned image_target = resource_provider_->GetImageTextureTarget( | 325 unsigned image_target = resource_provider_->GetImageTextureTarget( |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 #endif | 367 #endif |
369 } | 368 } |
370 | 369 |
371 // Since compressed texture's cannot be pre-allocated we might have an | 370 // Since compressed texture's cannot be pre-allocated we might have an |
372 // unallocated resource in which case we need to perform a full size copy. | 371 // unallocated resource in which case we need to perform a full size copy. |
373 if (IsResourceFormatCompressed(resource_lock->format())) { | 372 if (IsResourceFormatCompressed(resource_lock->format())) { |
374 gl->CompressedCopyTextureCHROMIUM(staging_buffer->texture_id, | 373 gl->CompressedCopyTextureCHROMIUM(staging_buffer->texture_id, |
375 resource_texture_id); | 374 resource_texture_id); |
376 } else { | 375 } else { |
377 int bytes_per_row = ResourceUtil::UncheckedWidthInBytes<int>( | 376 int bytes_per_row = ResourceUtil::UncheckedWidthInBytes<int>( |
378 resource_lock->size().width(), resource_lock->format()); | 377 rect_to_copy.width(), resource_lock->format()); |
379 int chunk_size_in_rows = | 378 int chunk_size_in_rows = |
380 std::max(1, max_bytes_per_copy_operation_ / bytes_per_row); | 379 std::max(1, max_bytes_per_copy_operation_ / bytes_per_row); |
381 // Align chunk size to 4. Required to support compressed texture formats. | 380 // Align chunk size to 4. Required to support compressed texture formats. |
382 chunk_size_in_rows = MathUtil::UncheckedRoundUp(chunk_size_in_rows, 4); | 381 chunk_size_in_rows = MathUtil::UncheckedRoundUp(chunk_size_in_rows, 4); |
383 int y = 0; | 382 int y = 0; |
384 int height = resource_lock->size().height(); | 383 int height = rect_to_copy.height(); |
385 while (y < height) { | 384 while (y < height) { |
386 // Copy at most |chunk_size_in_rows|. | 385 // Copy at most |chunk_size_in_rows|. |
387 int rows_to_copy = std::min(chunk_size_in_rows, height - y); | 386 int rows_to_copy = std::min(chunk_size_in_rows, height - y); |
388 DCHECK_GT(rows_to_copy, 0); | 387 DCHECK_GT(rows_to_copy, 0); |
389 | 388 |
390 gl->CopySubTextureCHROMIUM(staging_buffer->texture_id, 0, GL_TEXTURE_2D, | 389 gl->CopySubTextureCHROMIUM( |
391 resource_texture_id, 0, 0, y, 0, y, | 390 staging_buffer->texture_id, 0, GL_TEXTURE_2D, resource_texture_id, 0, |
392 resource_lock->size().width(), rows_to_copy, | 391 0, y, 0, y, rect_to_copy.width(), rows_to_copy, false, false, false); |
393 false, false, false); | |
394 y += rows_to_copy; | 392 y += rows_to_copy; |
395 | 393 |
396 // Increment |bytes_scheduled_since_last_flush_| by the amount of memory | 394 // Increment |bytes_scheduled_since_last_flush_| by the amount of memory |
397 // used for this copy operation. | 395 // used for this copy operation. |
398 bytes_scheduled_since_last_flush_ += rows_to_copy * bytes_per_row; | 396 bytes_scheduled_since_last_flush_ += rows_to_copy * bytes_per_row; |
399 | 397 |
400 if (bytes_scheduled_since_last_flush_ >= max_bytes_per_copy_operation_) { | 398 if (bytes_scheduled_since_last_flush_ >= max_bytes_per_copy_operation_) { |
401 gl->ShallowFlushCHROMIUM(); | 399 gl->ShallowFlushCHROMIUM(); |
402 bytes_scheduled_since_last_flush_ = 0; | 400 bytes_scheduled_since_last_flush_ = 0; |
403 } | 401 } |
(...skipping 20 matching lines...) Expand all Loading... |
424 resource_lock->set_synchronized(!async_worker_context_enabled_); | 422 resource_lock->set_synchronized(!async_worker_context_enabled_); |
425 } | 423 } |
426 | 424 |
427 gfx::BufferUsage OneCopyRasterBufferProvider::StagingBufferUsage() const { | 425 gfx::BufferUsage OneCopyRasterBufferProvider::StagingBufferUsage() const { |
428 return use_partial_raster_ | 426 return use_partial_raster_ |
429 ? gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT | 427 ? gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT |
430 : gfx::BufferUsage::GPU_READ_CPU_READ_WRITE; | 428 : gfx::BufferUsage::GPU_READ_CPU_READ_WRITE; |
431 } | 429 } |
432 | 430 |
433 } // namespace cc | 431 } // namespace cc |
OLD | NEW |