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

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

Issue 8536045: Make command buffer free transfer buffer when switching tabs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 9 years, 1 month 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 84fc9a7db83110c646f4d567e5a83df2a8bbc2ae..0b834b8e7aaa542909e77579925e827a0571f4b5 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -519,6 +519,83 @@ class ClientSideBufferHelper {
DISALLOW_COPY_AND_ASSIGN(ClientSideBufferHelper);
};
+AlignedRingBuffer::~AlignedRingBuffer() {
+}
+
+TransferBuffer::TransferBuffer(
+ CommandBufferHelper* helper,
+ int32 buffer_id,
+ void* buffer,
+ size_t buffer_size,
+ size_t result_size,
+ unsigned int alignment)
+ : helper_(helper),
+ buffer_size_(buffer_size),
+ result_size_(result_size),
+ alignment_(alignment) {
+ Setup(buffer_id, buffer);
+}
+
+TransferBuffer::~TransferBuffer() {
+}
+
+void TransferBuffer::Setup(int32 buffer_id, void* buffer) {
+ GPU_CHECK(!ring_buffer_.get());
+ ring_buffer_.reset(new AlignedRingBuffer(
+ alignment_,
+ buffer_id,
+ result_size_,
+ buffer_size_ - result_size_,
+ helper_,
+ static_cast<char*>(buffer) + result_size_));
+ buffer_id_ = buffer_id;
+ result_buffer_ = buffer;
+ result_shm_offset_ = 0;
+}
+
+void TransferBuffer::Free() {
+ if (buffer_id_) {
+ // TODO(gman): should we check the memory is unused?
+ helper_->command_buffer()->DestroyTransferBuffer(buffer_id_);
+ buffer_id_ = 0;
+ result_buffer_ = NULL;
+ result_shm_offset_ = 0;
+ ring_buffer_.reset();
+ }
+}
+
+void TransferBuffer::AllocateRingBuffer() {
+ if (!buffer_id_) {
+ int32 id = helper_->command_buffer()->CreateTransferBuffer(
+ buffer_size_, -1);
+ GPU_CHECK_NE(-1, id); // if it fails we're done.
+ gpu::Buffer shm = helper_->command_buffer()->GetTransferBuffer(id);
+ Setup(id, shm.ptr);
+ }
+}
+
+AlignedRingBuffer* TransferBuffer::GetBuffer() {
+ AllocateRingBuffer();
+ return ring_buffer_.get();
+}
+
+void* TransferBuffer::GetResultBuffer() {
+ AllocateRingBuffer();
+ GPU_CHECK(result_buffer_);
+ return result_buffer_;
+}
+
+int TransferBuffer::GetResultOffset() {
+ AllocateRingBuffer();
+ return result_shm_offset_;
+}
+
+int TransferBuffer::GetShmId() {
+ AllocateRingBuffer();
+ GPU_CHECK(buffer_id_);
+ return buffer_id_;
+}
+
#if !defined(_MSC_VER)
const size_t GLES2Implementation::kMaxSizeOfSimpleResult;
#endif
@@ -535,11 +612,12 @@ GLES2Implementation::GLES2Implementation(
bool bind_generates_resource)
: helper_(helper),
transfer_buffer_(
- kStartingOffset,
- transfer_buffer_size - kStartingOffset,
helper,
- static_cast<char*>(transfer_buffer) + kStartingOffset),
- transfer_buffer_id_(transfer_buffer_id),
+ transfer_buffer_id,
+ transfer_buffer,
+ transfer_buffer_size,
+ GLES2Implementation::kStartingOffset,
+ GLES2Implementation::kAlignment),
angle_pack_reverse_row_order_status(kUnknownExtensionStatus),
pack_alignment_(4),
unpack_alignment_(4),
@@ -561,9 +639,6 @@ GLES2Implementation::GLES2Implementation(
switches::kEnableGPUClientLogging);
});
- // Allocate space for simple GL results.
- result_buffer_ = transfer_buffer;
- result_shm_offset_ = 0;
memset(&reserved_ids_, 0, sizeof(reserved_ids_));
mapped_memory_.reset(new MappedMemoryManager(helper_));
@@ -645,6 +720,12 @@ void GLES2Implementation::FreeUnusedSharedMemory() {
mapped_memory_->FreeUnused();
}
+void GLES2Implementation::FreeEverything() {
+ Finish();
+ FreeUnusedSharedMemory();
+ transfer_buffer_.Free();
+}
+
void GLES2Implementation::WaitForCmd() {
TRACE_EVENT0("gpu", "GLES2::WaitForCmd");
helper_->CommandBufferHelper::Finish();
@@ -698,7 +779,7 @@ GLenum GLES2Implementation::GetGLError() {
typedef gles2::GetError::Result Result;
Result* result = GetResultAs<Result*>();
*result = GL_NO_ERROR;
- helper_->GetError(result_shm_id(), result_shm_offset());
+ helper_->GetError(GetResultShmId(), GetResultShmOffset());
WaitForCmd();
GLenum error = *result;
if (error == GL_NO_ERROR && error_bits_ != 0) {
@@ -733,22 +814,24 @@ void GLES2Implementation::GetBucketContents(uint32 bucket_id,
typedef cmd::GetBucketSize::Result Result;
Result* result = GetResultAs<Result*>();
*result = 0;
- helper_->GetBucketSize(bucket_id, result_shm_id(), result_shm_offset());
+ helper_->GetBucketSize(bucket_id, GetResultShmId(), GetResultShmOffset());
WaitForCmd();
uint32 size = *result;
data->resize(size);
if (size > 0u) {
- uint32 max_size = transfer_buffer_.GetLargestFreeOrPendingSize();
+ AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
+ uint32 max_size = transfer_buffer->GetLargestFreeOrPendingSize();
uint32 offset = 0;
while (size) {
uint32 part_size = std::min(max_size, size);
- void* buffer = transfer_buffer_.Alloc(part_size);
+ void* buffer = transfer_buffer->Alloc(part_size);
helper_->GetBucketData(
bucket_id, offset, part_size,
- transfer_buffer_id_, transfer_buffer_.GetOffset(buffer));
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(buffer));
WaitForCmd();
memcpy(&(*data)[offset], buffer, part_size);
- transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
+ transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
offset += part_size;
size -= part_size;
}
@@ -764,16 +847,18 @@ void GLES2Implementation::SetBucketContents(
GPU_DCHECK(data);
helper_->SetBucketSize(bucket_id, size);
if (size > 0u) {
- uint32 max_size = transfer_buffer_.GetLargestFreeOrPendingSize();
+ AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
+ uint32 max_size = transfer_buffer->GetLargestFreeOrPendingSize();
uint32 offset = 0;
while (size) {
uint32 part_size = std::min(static_cast<size_t>(max_size), size);
- void* buffer = transfer_buffer_.Alloc(part_size);
+ void* buffer = transfer_buffer->Alloc(part_size);
memcpy(buffer, static_cast<const int8*>(data) + offset, part_size);
helper_->SetBucketData(
bucket_id, offset, part_size,
- transfer_buffer_id_, transfer_buffer_.GetOffset(buffer));
- transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(buffer));
+ transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
offset += part_size;
size -= part_size;
}
@@ -1022,18 +1107,19 @@ void GLES2Implementation::GenSharedIdsCHROMIUM(
}
});
TRACE_EVENT0("gpu", "GLES2::GenSharedIdsCHROMIUM");
- GLsizei max_size = transfer_buffer_.GetLargestFreeOrPendingSize();
+ AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
+ GLsizei max_size = transfer_buffer->GetLargestFreeOrPendingSize();
GLsizei max_num_per = max_size / sizeof(ids[0]);
while (n) {
GLsizei num = std::min(n, max_num_per);
- GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(num);
+ GLint* id_buffer = transfer_buffer->AllocTyped<GLint>(num);
helper_->GenSharedIdsCHROMIUM(
namespace_id, id_offset, num,
- transfer_buffer_id_,
- transfer_buffer_.GetOffset(id_buffer));
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(id_buffer));
WaitForCmd();
memcpy(ids, id_buffer, sizeof(*ids) * num);
- transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken());
+ transfer_buffer->FreePendingToken(id_buffer, helper_->InsertToken());
n -= num;
ids += num;
}
@@ -1050,18 +1136,19 @@ void GLES2Implementation::DeleteSharedIdsCHROMIUM(
}
});
TRACE_EVENT0("gpu", "GLES2::DeleteSharedIdsCHROMIUM");
- GLsizei max_size = transfer_buffer_.GetLargestFreeOrPendingSize();
+ AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
+ GLsizei max_size = transfer_buffer->GetLargestFreeOrPendingSize();
GLsizei max_num_per = max_size / sizeof(ids[0]);
while (n) {
GLsizei num = std::min(n, max_num_per);
- GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(num);
+ GLint* id_buffer = transfer_buffer->AllocTyped<GLint>(num);
memcpy(id_buffer, ids, sizeof(*ids) * num);
helper_->DeleteSharedIdsCHROMIUM(
namespace_id, num,
- transfer_buffer_id_,
- transfer_buffer_.GetOffset(id_buffer));
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(id_buffer));
WaitForCmd();
- transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken());
+ transfer_buffer->FreePendingToken(id_buffer, helper_->InsertToken());
n -= num;
ids += num;
}
@@ -1078,18 +1165,19 @@ void GLES2Implementation::RegisterSharedIdsCHROMIUM(
}
});
TRACE_EVENT0("gpu", "GLES2::RegisterSharedIdsCHROMIUM");
- GLsizei max_size = transfer_buffer_.GetLargestFreeOrPendingSize();
+ AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
+ GLsizei max_size = transfer_buffer->GetLargestFreeOrPendingSize();
GLsizei max_num_per = max_size / sizeof(ids[0]);
while (n) {
GLsizei num = std::min(n, max_num_per);
- GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(n);
+ GLint* id_buffer = transfer_buffer->AllocTyped<GLint>(n);
memcpy(id_buffer, ids, sizeof(*ids) * n);
helper_->RegisterSharedIdsCHROMIUM(
namespace_id, n,
- transfer_buffer_id_,
- transfer_buffer_.GetOffset(id_buffer));
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(id_buffer));
WaitForCmd();
- transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken());
+ transfer_buffer->FreePendingToken(id_buffer, helper_->InsertToken());
n -= num;
ids += num;
}
@@ -1122,7 +1210,7 @@ void GLES2Implementation::GetVertexAttribPointerv(
Result* result = GetResultAs<Result*>();
result->SetNumResults(0);
helper_->GetVertexAttribPointerv(
- index, pname, result_shm_id(), result_shm_offset());
+ index, pname, GetResultShmId(), GetResultShmOffset());
WaitForCmd();
result->CopyResult(ptr);
GPU_CLIENT_LOG_CODE_BLOCK({
@@ -1163,7 +1251,7 @@ GLint GLES2Implementation::GetAttribLocationHelper(
*result = -1;
SetBucketAsCString(kResultBucketId, name);
helper_->GetAttribLocationBucket(
- program, kResultBucketId, result_shm_id(), result_shm_offset());
+ program, kResultBucketId, GetResultShmId(), GetResultShmOffset());
WaitForCmd();
helper_->SetBucketSize(kResultBucketId, 0);
return *result;
@@ -1186,7 +1274,7 @@ GLint GLES2Implementation::GetUniformLocationHelper(
*result = -1;
SetBucketAsCString(kResultBucketId, name);
helper_->GetUniformLocationBucket(program, kResultBucketId,
- result_shm_id(), result_shm_offset());
+ GetResultShmId(), GetResultShmOffset());
WaitForCmd();
helper_->SetBucketSize(kResultBucketId, 0);
return *result;
@@ -1230,18 +1318,21 @@ void GLES2Implementation::ShaderBinary(
return;
}
GLsizei shader_id_size = n * sizeof(*shaders);
- int8* buffer = transfer_buffer_.AllocTyped<int8>(shader_id_size + length);
+ AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
+ int8* buffer = transfer_buffer->AllocTyped<int8>(shader_id_size + length);
void* shader_ids = buffer;
void* shader_data = buffer + shader_id_size;
memcpy(shader_ids, shaders, shader_id_size);
memcpy(shader_data, binary, length);
helper_->ShaderBinary(
n,
- transfer_buffer_id_, transfer_buffer_.GetOffset(shader_ids),
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(shader_ids),
binaryformat,
- transfer_buffer_id_, transfer_buffer_.GetOffset(shader_data),
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(shader_data),
length);
- transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
+ transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
}
void GLES2Implementation::PixelStorei(GLenum pname, GLint param) {
@@ -1334,7 +1425,8 @@ void GLES2Implementation::ShaderSource(
// Concatenate all the strings in to a bucket on the service.
helper_->SetBucketSize(kResultBucketId, total_size);
- uint32 max_size = transfer_buffer_.GetLargestFreeOrPendingSize();
+ AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
+ uint32 max_size = transfer_buffer->GetLargestFreeOrPendingSize();
uint32 offset = 0;
for (GLsizei ii = 0; ii <= count; ++ii) {
const char* src = ii < count ? source[ii] : "";
@@ -1343,12 +1435,12 @@ void GLES2Implementation::ShaderSource(
(length ? static_cast<size_t>(length[ii]) : strlen(src)) : 1;
while (size) {
uint32 part_size = std::min(size, max_size);
- void* buffer = transfer_buffer_.Alloc(part_size);
+ void* buffer = transfer_buffer->Alloc(part_size);
memcpy(buffer, src, part_size);
helper_->SetBucketData(kResultBucketId, offset, part_size,
- transfer_buffer_id_,
- transfer_buffer_.GetOffset(buffer));
- transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(buffer));
+ transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
offset += part_size;
src += part_size;
size -= part_size;
@@ -1369,7 +1461,8 @@ void GLES2Implementation::BufferData(
<< size << ", "
<< static_cast<const void*>(data) << ", "
<< GLES2Util::GetStringBufferUsage(usage) << ")");
- GLsizeiptr max_size = transfer_buffer_.GetLargestFreeOrPendingSize();
+ AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
+ GLsizeiptr max_size = transfer_buffer->GetLargestFreeOrPendingSize();
if (size > max_size || !data) {
helper_->BufferData(target, size, 0, 0, usage);
if (data != NULL) {
@@ -1378,15 +1471,15 @@ void GLES2Implementation::BufferData(
return;
}
- void* buffer = transfer_buffer_.Alloc(size);
+ void* buffer = transfer_buffer->Alloc(size);
memcpy(buffer, data, size);
helper_->BufferData(
target,
size,
- transfer_buffer_id_,
- transfer_buffer_.GetOffset(buffer),
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(buffer),
usage);
- transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
+ transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
}
void GLES2Implementation::BufferSubData(
@@ -1405,15 +1498,16 @@ void GLES2Implementation::BufferSubData(
}
const int8* source = static_cast<const int8*>(data);
- GLsizeiptr max_size = transfer_buffer_.GetLargestFreeOrPendingSize();
+ AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
+ GLsizeiptr max_size = transfer_buffer->GetLargestFreeOrPendingSize();
while (size) {
GLsizeiptr part_size = std::min(size, max_size);
- void* buffer = transfer_buffer_.Alloc(part_size);
+ void* buffer = transfer_buffer->Alloc(part_size);
memcpy(buffer, source, part_size);
helper_->BufferSubData(target, offset, part_size,
- transfer_buffer_id_,
- transfer_buffer_.GetOffset(buffer));
- transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(buffer));
+ transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
offset += part_size;
source += part_size;
size -= part_size;
@@ -1533,7 +1627,8 @@ void GLES2Implementation::TexImage2D(
}
// Check if we can send it all at once.
- unsigned int max_size = transfer_buffer_.GetLargestFreeOrPendingSize();
+ AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
+ unsigned int max_size = transfer_buffer->GetLargestFreeOrPendingSize();
if (size > max_size || !pixels) {
// No, so send it using TexSubImage2D.
helper_->TexImage2D(
@@ -1546,7 +1641,7 @@ void GLES2Implementation::TexImage2D(
return;
}
- void* buffer = transfer_buffer_.Alloc(size);
+ void* buffer = transfer_buffer->Alloc(size);
bool copy_success = true;
if (unpack_flip_y_) {
copy_success = CopyRectToBufferFlipped(
@@ -1558,9 +1653,9 @@ void GLES2Implementation::TexImage2D(
if (copy_success) {
helper_->TexImage2D(
target, level, internalformat, width, height, border, format, type,
- transfer_buffer_id_, transfer_buffer_.GetOffset(buffer));
+ transfer_buffer->GetShmId(), transfer_buffer->GetOffset(buffer));
}
- transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
+ transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
}
void GLES2Implementation::TexSubImage2D(
@@ -1591,7 +1686,8 @@ void GLES2Implementation::TexSubImage2DImpl(
return;
}
const int8* source = static_cast<const int8*>(pixels);
- GLsizeiptr max_size = transfer_buffer_.GetLargestFreeOrPendingSize();
+ AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
+ GLsizeiptr max_size = transfer_buffer->GetLargestFreeOrPendingSize();
uint32 temp_size;
if (!GLES2Util::ComputeImageDataSize(
width, 1, format, type, unpack_alignment_, &temp_size)) {
@@ -1619,7 +1715,7 @@ void GLES2Implementation::TexSubImage2DImpl(
GLint num_rows = std::min(height, max_rows);
GLsizeiptr part_size =
(num_rows - 1) * padded_row_size + unpadded_row_size;
- void* buffer = transfer_buffer_.Alloc(part_size);
+ void* buffer = transfer_buffer->Alloc(part_size);
GLint y;
if (unpack_flip_y_) {
CopyRectToBufferFlipped(
@@ -1632,8 +1728,9 @@ void GLES2Implementation::TexSubImage2DImpl(
}
helper_->TexSubImage2D(
target, level, xoffset, y, width, num_rows, format, type,
- transfer_buffer_id_, transfer_buffer_.GetOffset(buffer), internal);
- transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(buffer), internal);
+ transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
yoffset += num_rows;
source += num_rows * padded_row_size;
height -= num_rows;
@@ -1653,13 +1750,14 @@ void GLES2Implementation::TexSubImage2DImpl(
while (temp_width) {
GLint num_pixels = std::min(width, max_sub_row_pixels);
GLsizeiptr part_size = num_pixels * element_size;
- void* buffer = transfer_buffer_.Alloc(part_size);
+ void* buffer = transfer_buffer->Alloc(part_size);
memcpy(buffer, row_source, part_size);
GLint y = unpack_flip_y_ ? (original_yoffset + height - 1) : yoffset;
helper_->TexSubImage2D(
target, level, temp_xoffset, y, num_pixels, 1, format, type,
- transfer_buffer_id_, transfer_buffer_.GetOffset(buffer), internal);
- transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(buffer), internal);
+ transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
row_source += part_size;
temp_xoffset += num_pixels;
temp_width -= num_pixels;
@@ -1676,11 +1774,11 @@ bool GLES2Implementation::GetActiveAttribHelper(
// Clear the bucket so if the command fails nothing will be in it.
helper_->SetBucketSize(kResultBucketId, 0);
typedef gles2::GetActiveAttrib::Result Result;
- Result* result = static_cast<Result*>(result_buffer_);
+ Result* result = GetResultAs<Result*>();
// Set as failed so if the command fails we'll recover.
result->success = false;
helper_->GetActiveAttrib(program, index, kResultBucketId,
- result_shm_id(), result_shm_offset());
+ GetResultShmId(), GetResultShmOffset());
WaitForCmd();
if (result->success) {
if (size) {
@@ -1742,11 +1840,11 @@ bool GLES2Implementation::GetActiveUniformHelper(
// Clear the bucket so if the command fails nothing will be in it.
helper_->SetBucketSize(kResultBucketId, 0);
typedef gles2::GetActiveUniform::Result Result;
- Result* result = static_cast<Result*>(result_buffer_);
+ Result* result = GetResultAs<Result*>();
// Set as failed so if the command fails we'll recover.
result->success = false;
helper_->GetActiveUniform(program, index, kResultBucketId,
- result_shm_id(), result_shm_offset());
+ GetResultShmId(), GetResultShmOffset());
WaitForCmd();
if (result->success) {
if (size) {
@@ -1815,12 +1913,13 @@ void GLES2Implementation::GetAttachedShaders(
TRACE_EVENT0("gpu", "GLES2::GetAttachedShaders");
typedef gles2::GetAttachedShaders::Result Result;
uint32 size = Result::ComputeSize(maxcount);
- Result* result = transfer_buffer_.AllocTyped<Result>(size);
+ AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
+ Result* result = transfer_buffer->AllocTyped<Result>(size);
result->SetNumResults(0);
helper_->GetAttachedShaders(
program,
- transfer_buffer_id_,
- transfer_buffer_.GetOffset(result),
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(result),
size);
int32 token = helper_->InsertToken();
WaitForCmd();
@@ -1833,7 +1932,7 @@ void GLES2Implementation::GetAttachedShaders(
GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
}
});
- transfer_buffer_.FreePendingToken(result, token);
+ transfer_buffer->FreePendingToken(result, token);
}
void GLES2Implementation::GetShaderPrecisionFormat(
@@ -1845,10 +1944,10 @@ void GLES2Implementation::GetShaderPrecisionFormat(
<< static_cast<const void*>(precision) << ", ");
TRACE_EVENT0("gpu", "GLES2::GetShaderPrecisionFormat");
typedef gles2::GetShaderPrecisionFormat::Result Result;
- Result* result = static_cast<Result*>(result_buffer_);
+ Result* result = GetResultAs<Result*>();
result->success = false;
helper_->GetShaderPrecisionFormat(
- shadertype, precisiontype, result_shm_id(), result_shm_offset());
+ shadertype, precisiontype, GetResultShmId(), GetResultShmOffset());
WaitForCmd();
if (result->success) {
if (range) {
@@ -1917,10 +2016,10 @@ void GLES2Implementation::GetUniformfv(
<< static_cast<const void*>(params) << ")");
TRACE_EVENT0("gpu", "GLES2::GetUniformfv");
typedef gles2::GetUniformfv::Result Result;
- Result* result = static_cast<Result*>(result_buffer_);
+ Result* result = GetResultAs<Result*>();
result->SetNumResults(0);
helper_->GetUniformfv(
- program, location, result_shm_id(), result_shm_offset());
+ program, location, GetResultShmId(), GetResultShmOffset());
WaitForCmd();
result->CopyResult(params);
GPU_CLIENT_LOG_CODE_BLOCK({
@@ -1937,12 +2036,12 @@ void GLES2Implementation::GetUniformiv(
<< static_cast<const void*>(params) << ")");
TRACE_EVENT0("gpu", "GLES2::GetUniformiv");
typedef gles2::GetUniformiv::Result Result;
- Result* result = static_cast<Result*>(result_buffer_);
+ Result* result = GetResultAs<Result*>();
result->SetNumResults(0);
helper_->GetUniformiv(
- program, location, result_shm_id(), result_shm_offset());
+ program, location, GetResultShmId(), GetResultShmOffset());
WaitForCmd();
- static_cast<gles2::GetUniformfv::Result*>(result_buffer_)->CopyResult(params);
+ GetResultAs<gles2::GetUniformfv::Result*>()->CopyResult(params);
GPU_CLIENT_LOG_CODE_BLOCK({
for (int32 i = 0; i < result->GetNumResults(); ++i) {
GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
@@ -1975,9 +2074,10 @@ void GLES2Implementation::ReadPixels(
TRACE_EVENT0("gpu", "GLES2::ReadPixels");
typedef gles2::ReadPixels::Result Result;
- Result* result = static_cast<Result*>(result_buffer_);
+ Result* result = GetResultAs<Result*>();
int8* dest = reinterpret_cast<int8*>(pixels);
- GLsizeiptr max_size = transfer_buffer_.GetLargestFreeOrPendingSize();
+ AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
+ GLsizeiptr max_size = transfer_buffer->GetLargestFreeOrPendingSize();
uint32 temp_size;
if (!GLES2Util::ComputeImageDataSize(
width, 1, format, type, pack_alignment_, &temp_size)) {
@@ -2008,12 +2108,12 @@ void GLES2Implementation::ReadPixels(
// include padding.
GLsizeiptr part_size =
unpadded_row_size + padded_row_size * (num_rows - 1);
- void* buffer = transfer_buffer_.Alloc(part_size);
+ void* buffer = transfer_buffer->Alloc(part_size);
*result = 0; // mark as failed.
helper_->ReadPixels(
xoffset, yoffset, width, num_rows, format, type,
- transfer_buffer_id_, transfer_buffer_.GetOffset(buffer),
- result_shm_id(), result_shm_offset());
+ transfer_buffer->GetShmId(), transfer_buffer->GetOffset(buffer),
+ GetResultShmId(), GetResultShmOffset());
WaitForCmd();
if (*result != 0) {
// when doing a y-flip we have to iterate through top-to-bottom chunks
@@ -2036,7 +2136,7 @@ void GLES2Implementation::ReadPixels(
dest = rows_dst;
}
}
- transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
+ transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
// If it was not marked as successful exit.
if (*result == 0) {
return;
@@ -2062,17 +2162,18 @@ void GLES2Implementation::ReadPixels(
while (temp_width) {
GLint num_pixels = std::min(width, max_sub_row_pixels);
GLsizeiptr part_size = num_pixels * element_size;
- void* buffer = transfer_buffer_.Alloc(part_size);
+ void* buffer = transfer_buffer->Alloc(part_size);
*result = 0; // mark as failed.
helper_->ReadPixels(
temp_xoffset, yoffset, temp_width, 1, format, type,
- transfer_buffer_id_, transfer_buffer_.GetOffset(buffer),
- result_shm_id(), result_shm_offset());
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(buffer),
+ GetResultShmId(), GetResultShmOffset());
WaitForCmd();
if (*result != 0) {
memcpy(row_dest, buffer, part_size);
}
- transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
+ transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
// If it was not marked as successful exit.
if (*result == 0) {
return;
@@ -2360,7 +2461,7 @@ void GLES2Implementation::GetVertexAttribfv(
Result* result = GetResultAs<Result*>();
result->SetNumResults(0);
helper_->GetVertexAttribfv(
- index, pname, result_shm_id(), result_shm_offset());
+ index, pname, GetResultShmId(), GetResultShmOffset());
WaitForCmd();
result->CopyResult(params);
GPU_CLIENT_LOG_CODE_BLOCK({
@@ -2388,7 +2489,7 @@ void GLES2Implementation::GetVertexAttribiv(
Result* result = GetResultAs<Result*>();
result->SetNumResults(0);
helper_->GetVertexAttribiv(
- index, pname, result_shm_id(), result_shm_offset());
+ index, pname, GetResultShmId(), GetResultShmOffset());
WaitForCmd();
result->CopyResult(params);
GPU_CLIENT_LOG_CODE_BLOCK({
@@ -2408,7 +2509,7 @@ GLboolean GLES2Implementation::EnableFeatureCHROMIUM(
*result = 0;
SetBucketAsCString(kResultBucketId, feature);
helper_->EnableFeatureCHROMIUM(
- kResultBucketId, result_shm_id(), result_shm_offset());
+ kResultBucketId, GetResultShmId(), GetResultShmOffset());
WaitForCmd();
helper_->SetBucketSize(kResultBucketId, 0);
GPU_CLIENT_LOG(" returned " << GLES2Util::GetStringBool(*result));
@@ -2626,20 +2727,23 @@ void GLES2Implementation::GetMultipleIntegervCHROMIUM(
}
uint32 size_needed =
count * sizeof(pnames[0]) + num_results * sizeof(results[0]);
- void* buffer = transfer_buffer_.Alloc(size_needed);
+ AlignedRingBuffer* transfer_buffer = transfer_buffer_.GetBuffer();
+ void* buffer = transfer_buffer->Alloc(size_needed);
GLenum* pnames_buffer = static_cast<GLenum*>(buffer);
void* results_buffer = pnames_buffer + count;
memcpy(pnames_buffer, pnames, count * sizeof(GLenum));
memset(results_buffer, 0, num_results * sizeof(GLint));
helper_->GetMultipleIntegervCHROMIUM(
- transfer_buffer_id_, transfer_buffer_.GetOffset(pnames_buffer),
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(pnames_buffer),
count,
- transfer_buffer_id_, transfer_buffer_.GetOffset(results_buffer),
+ transfer_buffer->GetShmId(),
+ transfer_buffer->GetOffset(results_buffer),
size);
WaitForCmd();
memcpy(results, results_buffer, size);
// TODO(gman): We should be able to free without a token.
- transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
+ transfer_buffer->FreePendingToken(buffer, helper_->InsertToken());
GPU_CLIENT_LOG(" returned");
GPU_CLIENT_LOG_CODE_BLOCK({
for (int i = 0; i < num_results; ++i) {
@@ -2696,8 +2800,8 @@ GLuint GLES2Implementation::CreateStreamTextureCHROMIUM(GLuint texture) {
*result = GL_ZERO;
helper_->CreateStreamTextureCHROMIUM(texture,
- result_shm_id(),
- result_shm_offset());
+ GetResultShmId(),
+ GetResultShmOffset());
WaitForCmd();
return *result;
« 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