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

Unified Diff: gpu/command_buffer/client/gles2_implementation.cc

Issue 1186393004: gpu: Remove async texture uploads. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years, 4 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
Index: gpu/command_buffer/client/gles2_implementation.cc
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index 31d94f18dfd8af2f4a494ed000d5b98b8192c4f9..5635f2678a20595343d402764cf997a6b3385f72 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -103,10 +103,6 @@ GLES2Implementation::GLES2Implementation(
bound_uniform_buffer_(0),
bound_pixel_pack_transfer_buffer_id_(0),
bound_pixel_unpack_transfer_buffer_id_(0),
- async_upload_token_(0),
- async_upload_sync_(NULL),
- async_upload_sync_shm_id_(0),
- async_upload_sync_shm_offset_(0),
error_bits_(0),
debug_(false),
lose_context_when_out_of_memory_(lose_context_when_out_of_memory),
@@ -158,15 +154,7 @@ bool GLES2Implementation::Initialize(
return false;
}
- mapped_memory_.reset(
- new MappedMemoryManager(
- helper_,
- base::Bind(&GLES2Implementation::PollAsyncUploads,
- // The mapped memory manager is owned by |this| here, and
- // since its destroyed before before we destroy ourselves
- // we don't need extra safety measures for this closure.
- base::Unretained(this)),
- mapped_memory_limit));
+ mapped_memory_.reset(new MappedMemoryManager(helper_, mapped_memory_limit));
unsigned chunk_size = 2 * 1024 * 1024;
if (mapped_memory_limit != kNoLimit) {
@@ -252,13 +240,6 @@ GLES2Implementation::~GLES2Implementation() {
buffer_tracker_.reset();
- FreeAllAsyncUploadBuffers();
-
- if (async_upload_sync_) {
- mapped_memory_->Free(async_upload_sync_);
- async_upload_sync_ = NULL;
- }
-
// Make sure the commands make it the service.
WaitForCmd();
}
@@ -300,7 +281,6 @@ void GLES2Implementation::FreeUnusedSharedMemory() {
}
void GLES2Implementation::FreeEverything() {
- FreeAllAsyncUploadBuffers();
WaitForCmd();
query_tracker_->Shrink();
FreeUnusedSharedMemory();
@@ -1965,17 +1945,8 @@ void GLES2Implementation::BufferSubData(
void GLES2Implementation::RemoveTransferBuffer(BufferTracker::Buffer* buffer) {
int32 token = buffer->last_usage_token();
- uint32 async_token = buffer->last_async_upload_token();
- if (async_token) {
- if (HasAsyncUploadTokenPassed(async_token)) {
- buffer_tracker_->Free(buffer);
- } else {
- detached_async_upload_memory_.push_back(
- std::make_pair(buffer->address(), async_token));
- buffer_tracker_->Unmanage(buffer);
- }
- } else if (token) {
+ if (token) {
if (helper_->HasTokenPassed(token))
buffer_tracker_->Free(buffer);
else
@@ -4912,7 +4883,6 @@ void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) {
switch (target) {
case GL_COMMANDS_ISSUED_CHROMIUM:
case GL_LATENCY_QUERY_CHROMIUM:
- case GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM:
case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM:
case GL_GET_ERROR_QUERY_CHROMIUM:
break;
@@ -5314,12 +5284,6 @@ void* GLES2Implementation::MapBufferCHROMIUM(GLuint target, GLenum access) {
return NULL;
}
break;
- case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM:
- if (access != GL_WRITE_ONLY) {
- SetGLError(GL_INVALID_ENUM, "glMapBufferCHROMIUM", "bad access mode");
- return NULL;
- }
- break;
default:
SetGLError(
GL_INVALID_ENUM, "glMapBufferCHROMIUM", "invalid target");
@@ -5340,10 +5304,6 @@ void* GLES2Implementation::MapBufferCHROMIUM(GLuint target, GLenum access) {
return NULL;
}
// Here we wait for previous transfer operations to be finished.
- // TODO(hubbe): AsyncTex(Sub)Image2dCHROMIUM does not currently work
- // with this method of synchronization. Until this is fixed,
- // MapBufferCHROMIUM will not block even if the transfer is not ready
- // for these calls.
if (buffer->last_usage_token()) {
helper_->WaitForToken(buffer->last_usage_token());
buffer->set_last_usage_token(0);
@@ -5380,207 +5340,6 @@ GLboolean GLES2Implementation::UnmapBufferCHROMIUM(GLuint target) {
return true;
}
-bool GLES2Implementation::EnsureAsyncUploadSync() {
- if (async_upload_sync_)
- return true;
-
- int32 shm_id;
- unsigned int shm_offset;
- void* mem = mapped_memory_->Alloc(sizeof(AsyncUploadSync),
- &shm_id,
- &shm_offset);
- if (!mem)
- return false;
-
- async_upload_sync_shm_id_ = shm_id;
- async_upload_sync_shm_offset_ = shm_offset;
- async_upload_sync_ = static_cast<AsyncUploadSync*>(mem);
- async_upload_sync_->Reset();
-
- return true;
-}
-
-uint32 GLES2Implementation::NextAsyncUploadToken() {
- async_upload_token_++;
- if (async_upload_token_ == 0)
- async_upload_token_++;
- return async_upload_token_;
-}
-
-void GLES2Implementation::PollAsyncUploads() {
- if (!async_upload_sync_)
- return;
-
- if (helper_->IsContextLost()) {
- DetachedAsyncUploadMemoryList::iterator it =
- detached_async_upload_memory_.begin();
- while (it != detached_async_upload_memory_.end()) {
- mapped_memory_->Free(it->first);
- it = detached_async_upload_memory_.erase(it);
- }
- return;
- }
-
- DetachedAsyncUploadMemoryList::iterator it =
- detached_async_upload_memory_.begin();
- while (it != detached_async_upload_memory_.end()) {
- if (HasAsyncUploadTokenPassed(it->second)) {
- mapped_memory_->Free(it->first);
- it = detached_async_upload_memory_.erase(it);
- } else {
- break;
- }
- }
-}
-
-void GLES2Implementation::FreeAllAsyncUploadBuffers() {
- // Free all completed unmanaged async uploads buffers.
- PollAsyncUploads();
-
- // Synchronously free rest of the unmanaged async upload buffers.
- if (!detached_async_upload_memory_.empty()) {
- WaitAllAsyncTexImage2DCHROMIUMHelper();
- WaitForCmd();
- PollAsyncUploads();
- }
-}
-
-void GLES2Implementation::AsyncTexImage2DCHROMIUM(
- GLenum target, GLint level, GLenum internalformat, GLsizei width,
- GLsizei height, GLint border, GLenum format, GLenum type,
- const void* pixels) {
- GPU_CLIENT_SINGLE_THREAD_CHECK();
- GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexImage2D("
- << GLES2Util::GetStringTextureTarget(target) << ", "
- << level << ", "
- << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", "
- << width << ", " << height << ", " << border << ", "
- << GLES2Util::GetStringTextureFormat(format) << ", "
- << GLES2Util::GetStringPixelType(type) << ", "
- << static_cast<const void*>(pixels) << ")");
- if (level < 0 || height < 0 || width < 0) {
- SetGLError(GL_INVALID_VALUE, "glTexImage2D", "dimension < 0");
- return;
- }
- if (border != 0) {
- SetGLError(GL_INVALID_VALUE, "glTexImage2D", "border != 0");
- return;
- }
- uint32 size;
- uint32 unpadded_row_size;
- uint32 padded_row_size;
- if (!GLES2Util::ComputeImageDataSizes(
- width, height, 1, format, type, unpack_alignment_, &size,
- &unpadded_row_size, &padded_row_size)) {
- SetGLError(GL_INVALID_VALUE, "glTexImage2D", "image size too large");
- return;
- }
-
- // If there's no data/buffer just issue the AsyncTexImage2D
- if (!pixels && !bound_pixel_unpack_transfer_buffer_id_) {
- helper_->AsyncTexImage2DCHROMIUM(
- target, level, internalformat, width, height, format, type,
- 0, 0, 0, 0, 0);
- return;
- }
-
- if (!EnsureAsyncUploadSync()) {
- SetGLError(GL_OUT_OF_MEMORY, "glTexImage2D", "out of memory");
- return;
- }
-
- // Otherwise, async uploads require a transfer buffer to be bound.
- // TODO(hubbe): Make MapBufferCHROMIUM block if someone tries to re-use
- // the buffer before the transfer is finished. (Currently such
- // synchronization has to be handled manually.)
- GLuint offset = ToGLuint(pixels);
- BufferTracker::Buffer* buffer = GetBoundPixelUnpackTransferBufferIfValid(
- bound_pixel_unpack_transfer_buffer_id_,
- "glAsyncTexImage2DCHROMIUM", offset, size);
- if (buffer && buffer->shm_id() != -1) {
- uint32 async_token = NextAsyncUploadToken();
- buffer->set_last_async_upload_token(async_token);
- helper_->AsyncTexImage2DCHROMIUM(
- target, level, internalformat, width, height, format, type,
- buffer->shm_id(), buffer->shm_offset() + offset,
- async_token,
- async_upload_sync_shm_id_, async_upload_sync_shm_offset_);
- }
-}
-
-void GLES2Implementation::AsyncTexSubImage2DCHROMIUM(
- GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
- GLsizei height, GLenum format, GLenum type, const void* pixels) {
- GPU_CLIENT_SINGLE_THREAD_CHECK();
- GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glAsyncTexSubImage2DCHROMIUM("
- << GLES2Util::GetStringTextureTarget(target) << ", "
- << level << ", "
- << xoffset << ", " << yoffset << ", "
- << width << ", " << height << ", "
- << GLES2Util::GetStringTextureFormat(format) << ", "
- << GLES2Util::GetStringPixelType(type) << ", "
- << static_cast<const void*>(pixels) << ")");
- if (level < 0 || height < 0 || width < 0) {
- SetGLError(
- GL_INVALID_VALUE, "glAsyncTexSubImage2DCHROMIUM", "dimension < 0");
- return;
- }
-
- uint32 size;
- uint32 unpadded_row_size;
- uint32 padded_row_size;
- if (!GLES2Util::ComputeImageDataSizes(
- width, height, 1, format, type, unpack_alignment_, &size,
- &unpadded_row_size, &padded_row_size)) {
- SetGLError(
- GL_INVALID_VALUE, "glAsyncTexSubImage2DCHROMIUM", "size to large");
- return;
- }
-
- if (!EnsureAsyncUploadSync()) {
- SetGLError(GL_OUT_OF_MEMORY, "glTexImage2D", "out of memory");
- return;
- }
-
- // Async uploads require a transfer buffer to be bound.
- // TODO(hubbe): Make MapBufferCHROMIUM block if someone tries to re-use
- // the buffer before the transfer is finished. (Currently such
- // synchronization has to be handled manually.)
- GLuint offset = ToGLuint(pixels);
- BufferTracker::Buffer* buffer = GetBoundPixelUnpackTransferBufferIfValid(
- bound_pixel_unpack_transfer_buffer_id_,
- "glAsyncTexSubImage2DCHROMIUM", offset, size);
- if (buffer && buffer->shm_id() != -1) {
- uint32 async_token = NextAsyncUploadToken();
- buffer->set_last_async_upload_token(async_token);
- helper_->AsyncTexSubImage2DCHROMIUM(
- target, level, xoffset, yoffset, width, height, format, type,
- buffer->shm_id(), buffer->shm_offset() + offset,
- async_token,
- async_upload_sync_shm_id_, async_upload_sync_shm_offset_);
- }
-}
-
-void GLES2Implementation::WaitAsyncTexImage2DCHROMIUM(GLenum target) {
- GPU_CLIENT_SINGLE_THREAD_CHECK();
- GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glWaitAsyncTexImage2DCHROMIUM("
- << GLES2Util::GetStringTextureTarget(target) << ")");
- helper_->WaitAsyncTexImage2DCHROMIUM(target);
- CheckGLError();
-}
-
-void GLES2Implementation::WaitAllAsyncTexImage2DCHROMIUMHelper() {
- helper_->WaitAllAsyncTexImage2DCHROMIUM();
-}
-
-void GLES2Implementation::WaitAllAsyncTexImage2DCHROMIUM() {
- GPU_CLIENT_SINGLE_THREAD_CHECK();
- GPU_CLIENT_LOG("[" << GetLogPrefix()
- << "] glWaitAllAsyncTexImage2DCHROMIUM()");
- WaitAllAsyncTexImage2DCHROMIUMHelper();
- CheckGLError();
-}
-
GLuint GLES2Implementation::InsertSyncPointCHROMIUM() {
GPU_CLIENT_SINGLE_THREAD_CHECK();
GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glInsertSyncPointCHROMIUM");
« no previous file with comments | « gpu/command_buffer/client/gles2_implementation.h ('k') | gpu/command_buffer/client/gles2_implementation_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698