Index: gpu/command_buffer/service/async_pixel_transfer_manager_share_group.cc |
diff --git a/gpu/command_buffer/service/async_pixel_transfer_manager_share_group.cc b/gpu/command_buffer/service/async_pixel_transfer_manager_share_group.cc |
index b6506bfb584677296d77f3d71cfc7caf3d18e62b..b5545812cd7ed54695674778d6e5271cfb57bc0a 100644 |
--- a/gpu/command_buffer/service/async_pixel_transfer_manager_share_group.cc |
+++ b/gpu/command_buffer/service/async_pixel_transfer_manager_share_group.cc |
@@ -202,6 +202,9 @@ class TransferStateInternal |
TransferStateInternal(GLuint texture_id, |
const AsyncTexImage2DParams& define_params) |
: texture_id_(texture_id), define_params_(define_params) {} |
+ TransferStateInternal(GLuint texture_id, |
+ const AsyncCompressedTexImage2DParams& define_params) |
+ : texture_id_(texture_id), compressed_define_params_(define_params) {} |
bool TransferIsInProgress() { |
return pending_upload_task_.get() && |
@@ -273,6 +276,37 @@ class TransferStateInternal |
&PendingTask::BindAndRun, pending_upload_task_, texture_id_)); |
} |
+ void ScheduleAsyncCompressedTexImage2D( |
+ const AsyncCompressedTexImage2DParams tex_params, |
+ const AsyncMemoryParams mem_params, |
+ scoped_refptr<AsyncPixelTransferUploadStats> texture_upload_stats, |
+ const base::Closure& bind_callback) { |
+ TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); |
+ pending_upload_task_ = new PendingTask( |
+ base::Bind(&TransferStateInternal::PerformAsyncCompressedTexImage2D, |
+ this, tex_params, mem_params, texture_upload_stats)); |
+ transfer_message_loop_proxy()->PostTask( |
+ FROM_HERE, base::Bind(&PendingTask::BindAndRun, pending_upload_task_, |
+ texture_id_)); |
+ |
+ // Save the late bind callback, so we can notify the client when it is |
+ // bound. |
+ bind_callback_ = bind_callback; |
+ } |
+ |
+ void ScheduleAsyncCompressedTexSubImage2D( |
+ AsyncCompressedTexSubImage2DParams tex_params, |
+ AsyncMemoryParams mem_params, |
+ scoped_refptr<AsyncPixelTransferUploadStats> texture_upload_stats) { |
+ TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); |
+ pending_upload_task_ = new PendingTask( |
+ base::Bind(&TransferStateInternal::PerformAsyncCompressedTexSubImage2D, |
+ this, tex_params, mem_params, texture_upload_stats)); |
+ transfer_message_loop_proxy()->PostTask( |
+ FROM_HERE, base::Bind(&PendingTask::BindAndRun, pending_upload_task_, |
+ texture_id_)); |
+ } |
+ |
private: |
friend class base::RefCountedThreadSafe<TransferStateInternal>; |
@@ -354,12 +388,73 @@ class TransferStateInternal |
} |
} |
+ void PerformAsyncCompressedTexImage2D( |
+ AsyncCompressedTexImage2DParams tex_params, |
+ AsyncMemoryParams mem_params, |
+ scoped_refptr<AsyncPixelTransferUploadStats> texture_upload_stats) { |
+ TRACE_EVENT2("gpu", "PerformAsyncCompressedTexImage", "width", |
+ tex_params.width, "height", tex_params.height); |
+ DCHECK_EQ(0, tex_params.level); |
+ |
+ base::TimeTicks begin_time; |
+ if (texture_upload_stats.get()) |
+ begin_time = base::TimeTicks::HighResNow(); |
+ |
+ void* data = mem_params.GetDataAddress(); |
+ |
+ { |
+ TRACE_EVENT0("gpu", "glCompressedTexImage2D"); |
+ glCompressedTexImage2D(GL_TEXTURE_2D, tex_params.level, |
+ tex_params.internal_format, tex_params.width, |
+ tex_params.height, tex_params.border, |
+ tex_params.image_size, data); |
+ TRACE_EVENT_SYNTHETIC_DELAY_END("gpu.AsyncTexImage"); |
+ } |
+ |
+ if (texture_upload_stats.get()) { |
+ texture_upload_stats->AddUpload(base::TimeTicks::HighResNow() - |
+ begin_time); |
+ } |
+ } |
+ |
+ void PerformAsyncCompressedTexSubImage2D( |
+ AsyncCompressedTexSubImage2DParams tex_params, |
+ AsyncMemoryParams mem_params, |
+ scoped_refptr<AsyncPixelTransferUploadStats> texture_upload_stats) { |
+ TRACE_EVENT2("gpu", "PerformAsyncCompressedTexSubImage2D", "width", |
+ tex_params.width, "height", tex_params.height); |
+ DCHECK_EQ(0, tex_params.level); |
+ |
+ base::TimeTicks begin_time; |
+ if (texture_upload_stats.get()) |
+ begin_time = base::TimeTicks::HighResNow(); |
+ |
+ void* data = mem_params.GetDataAddress(); |
+ |
+ { |
+ TRACE_EVENT0("gpu", "glCompressedTexSubImage2D"); |
+ glCompressedTexSubImage2D(GL_TEXTURE_2D, tex_params.level, |
+ tex_params.xoffset, tex_params.yoffset, |
+ tex_params.width, tex_params.height, |
+ tex_params.format, tex_params.image_size, data); |
+ TRACE_EVENT_SYNTHETIC_DELAY_END("gpu.AsyncTexImage"); |
+ } |
+ |
+ if (texture_upload_stats.get()) { |
+ texture_upload_stats->AddUpload(base::TimeTicks::HighResNow() - |
+ begin_time); |
+ } |
+ } |
+ |
scoped_refptr<PendingTask> pending_upload_task_; |
GLuint texture_id_; |
// Definition params for texture that needs binding. |
- AsyncTexImage2DParams define_params_; |
+ union { |
+ AsyncTexImage2DParams define_params_; |
+ AsyncCompressedTexImage2DParams compressed_define_params_; |
+ }; |
// Callback to invoke when AsyncTexImage2D is complete |
// and the client can safely use the texture. This occurs |
@@ -377,6 +472,10 @@ class AsyncPixelTransferDelegateShareGroup |
AsyncPixelTransferManagerShareGroup::SharedState* shared_state, |
GLuint texture_id, |
const AsyncTexImage2DParams& define_params); |
+ AsyncPixelTransferDelegateShareGroup( |
+ AsyncPixelTransferManagerShareGroup::SharedState* shared_state, |
+ GLuint texture_id, |
+ const AsyncCompressedTexImage2DParams& define_params); |
~AsyncPixelTransferDelegateShareGroup() override; |
void BindTransfer() { state_->BindTransfer(); } |
@@ -387,6 +486,13 @@ class AsyncPixelTransferDelegateShareGroup |
const base::Closure& bind_callback) override; |
void AsyncTexSubImage2D(const AsyncTexSubImage2DParams& tex_params, |
const AsyncMemoryParams& mem_params) override; |
+ void AsyncCompressedTexImage2D( |
+ const AsyncCompressedTexImage2DParams& tex_params, |
+ const AsyncMemoryParams& mem_params, |
+ const base::Closure& bind_callback) override; |
+ void AsyncCompressedTexSubImage2D( |
+ const AsyncCompressedTexSubImage2DParams& tex_params, |
+ const AsyncMemoryParams& mem_params) override; |
bool TransferIsInProgress() override; |
void WaitForTransferCompletion() override; |
@@ -406,6 +512,14 @@ AsyncPixelTransferDelegateShareGroup::AsyncPixelTransferDelegateShareGroup( |
: shared_state_(shared_state), |
state_(new TransferStateInternal(texture_id, define_params)) {} |
+AsyncPixelTransferDelegateShareGroup::AsyncPixelTransferDelegateShareGroup( |
+ AsyncPixelTransferManagerShareGroup::SharedState* shared_state, |
+ GLuint texture_id, |
+ const AsyncCompressedTexImage2DParams& define_params) |
+ : shared_state_(shared_state), |
+ state_(new TransferStateInternal(texture_id, define_params)) { |
+} |
+ |
AsyncPixelTransferDelegateShareGroup::~AsyncPixelTransferDelegateShareGroup() { |
TRACE_EVENT0("gpu", " ~AsyncPixelTransferDelegateShareGroup"); |
state_->CancelUpload(); |
@@ -464,6 +578,33 @@ void AsyncPixelTransferDelegateShareGroup::AsyncTexSubImage2D( |
tex_params, mem_params, shared_state_->texture_upload_stats); |
} |
+void AsyncPixelTransferDelegateShareGroup::AsyncCompressedTexImage2D( |
+ const AsyncCompressedTexImage2DParams& tex_params, |
+ const AsyncMemoryParams& mem_params, |
+ const base::Closure& bind_callback) { |
+ DCHECK(!state_->TransferIsInProgress()); |
+ DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); |
+ DCHECK_EQ(tex_params.level, 0); |
+ |
+ shared_state_->pending_allocations.push_back(AsWeakPtr()); |
+ state_->ScheduleAsyncCompressedTexImage2D(tex_params, mem_params, |
+ shared_state_->texture_upload_stats, |
+ bind_callback); |
+} |
+ |
+void AsyncPixelTransferDelegateShareGroup::AsyncCompressedTexSubImage2D( |
+ const AsyncCompressedTexSubImage2DParams& tex_params, |
+ const AsyncMemoryParams& mem_params) { |
+ TRACE_EVENT2("gpu", "AsyncCompressedTexSubImage2D", "width", tex_params.width, |
+ "height", tex_params.height); |
+ DCHECK(!state_->TransferIsInProgress()); |
+ DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); |
+ DCHECK_EQ(tex_params.level, 0); |
+ |
+ state_->ScheduleAsyncCompressedTexSubImage2D( |
+ tex_params, mem_params, shared_state_->texture_upload_stats); |
+} |
+ |
AsyncPixelTransferManagerShareGroup::SharedState::SharedState() |
// TODO(reveman): Skip this if --enable-gpu-benchmarking is not present. |
: texture_upload_stats(new AsyncPixelTransferUploadStats) {} |
@@ -550,4 +691,12 @@ AsyncPixelTransferManagerShareGroup::CreatePixelTransferDelegateImpl( |
&shared_state_, ref->service_id(), define_params); |
} |
+AsyncPixelTransferDelegate* |
+AsyncPixelTransferManagerShareGroup::CreatePixelTransferDelegateImpl( |
+ gles2::TextureRef* ref, |
+ const AsyncCompressedTexImage2DParams& define_params) { |
+ return new AsyncPixelTransferDelegateShareGroup( |
+ &shared_state_, ref->service_id(), define_params); |
+} |
+ |
} // namespace gpu |