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

Unified Diff: gpu/command_buffer/service/async_pixel_transfer_manager_share_group.cc

Issue 793693003: Tile Compression (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years 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
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

Powered by Google App Engine
This is Rietveld 408576698