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; |