| Index: gpu/command_buffer/client/gles2_implementation_impl_autogen.h
|
| diff --git a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
|
| index 71ad0db6352a3122402b6ed3e4415ce340edbbd1..65e38b1c8e6e73c67ca0c5f2052668731f39eee8 100644
|
| --- a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
|
| +++ b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
|
| @@ -546,6 +546,14 @@ void GLES2Implementation::DeleteSamplers(GLsizei n, const GLuint* samplers) {
|
| CheckGLError();
|
| }
|
|
|
| +void GLES2Implementation::DeleteSync(GLsync sync) {
|
| + GPU_CLIENT_SINGLE_THREAD_CHECK();
|
| + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteSync(" << sync << ")");
|
| + GPU_CLIENT_DCHECK(sync != 0);
|
| + DeleteSyncHelper(sync);
|
| + CheckGLError();
|
| +}
|
| +
|
| void GLES2Implementation::DeleteShader(GLuint shader) {
|
| GPU_CLIENT_SINGLE_THREAD_CHECK();
|
| GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteShader(" << shader << ")");
|
| @@ -631,6 +639,27 @@ void GLES2Implementation::DetachShader(GLuint program, GLuint shader) {
|
| CheckGLError();
|
| }
|
|
|
| +GLsync GLES2Implementation::FenceSync(GLenum condition, GLbitfield flags) {
|
| + GPU_CLIENT_SINGLE_THREAD_CHECK();
|
| + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFenceSync("
|
| + << GLES2Util::GetStringSyncCondition(condition) << ", "
|
| + << flags << ")");
|
| + if (condition != 0x9117) {
|
| + SetGLError(GL_INVALID_ENUM, "glFenceSync", "condition GL_INVALID_ENUM");
|
| + return 0;
|
| + }
|
| + if (flags != 0) {
|
| + SetGLError(GL_INVALID_VALUE, "glFenceSync", "flags GL_INVALID_VALUE");
|
| + return 0;
|
| + }
|
| + GLuint client_id;
|
| + GetIdHandler(id_namespaces::kSyncs)->MakeIds(this, 0, 1, &client_id);
|
| + helper_->FenceSync(client_id);
|
| + GPU_CLIENT_LOG("returned " << client_id);
|
| + CheckGLError();
|
| + return reinterpret_cast<GLsync>(client_id);
|
| +}
|
| +
|
| void GLES2Implementation::FramebufferRenderbuffer(GLenum target,
|
| GLenum attachment,
|
| GLenum renderbuffertarget,
|
| @@ -1463,6 +1492,24 @@ GLboolean GLES2Implementation::IsShader(GLuint shader) {
|
| return result_value;
|
| }
|
|
|
| +GLboolean GLES2Implementation::IsSync(GLsync sync) {
|
| + GPU_CLIENT_SINGLE_THREAD_CHECK();
|
| + TRACE_EVENT0("gpu", "GLES2Implementation::IsSync");
|
| + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsSync(" << sync << ")");
|
| + typedef cmds::IsSync::Result Result;
|
| + Result* result = GetResultAs<Result*>();
|
| + if (!result) {
|
| + return GL_FALSE;
|
| + }
|
| + *result = 0;
|
| + helper_->IsSync(ToGLuint(sync), GetResultShmId(), GetResultShmOffset());
|
| + WaitForCmd();
|
| + GLboolean result_value = *result != 0;
|
| + GPU_CLIENT_LOG("returned " << result_value);
|
| + CheckGLError();
|
| + return result_value;
|
| +}
|
| +
|
| GLboolean GLES2Implementation::IsTexture(GLuint texture) {
|
| GPU_CLIENT_SINGLE_THREAD_CHECK();
|
| TRACE_EVENT0("gpu", "GLES2Implementation::IsTexture");
|
| @@ -1646,6 +1693,104 @@ void GLES2Implementation::Scissor(GLint x,
|
| CheckGLError();
|
| }
|
|
|
| +void GLES2Implementation::ShaderSource(GLuint shader,
|
| + GLsizei count,
|
| + const GLchar* const* str,
|
| + const GLint* length) {
|
| + GPU_CLIENT_SINGLE_THREAD_CHECK();
|
| + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glShaderSource(" << shader << ", "
|
| + << count << ", " << static_cast<const void*>(str) << ", "
|
| + << static_cast<const void*>(length) << ")");
|
| + GPU_CLIENT_LOG_CODE_BLOCK({
|
| + for (GLsizei ii = 0; ii < count; ++ii) {
|
| + if (str[ii]) {
|
| + if (length && length[ii] >= 0) {
|
| + const std::string my_str(str[ii], length[ii]);
|
| + GPU_CLIENT_LOG(" " << ii << ": ---\n" << my_str << "\n---");
|
| + } else {
|
| + GPU_CLIENT_LOG(" " << ii << ": ---\n" << str[ii] << "\n---");
|
| + }
|
| + } else {
|
| + GPU_CLIENT_LOG(" " << ii << ": NULL");
|
| + }
|
| + }
|
| + });
|
| + if (count < 0) {
|
| + SetGLError(GL_INVALID_VALUE, "glShaderSource", "count < 0");
|
| + return;
|
| + }
|
| + // Compute the total size.
|
| + base::CheckedNumeric<size_t> total_size = count;
|
| + total_size += 1;
|
| + total_size *= sizeof(GLint);
|
| + if (!total_size.IsValid()) {
|
| + SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow");
|
| + return;
|
| + }
|
| + size_t header_size = total_size.ValueOrDefault(0);
|
| + std::vector<GLint> header(count + 1);
|
| + header[0] = static_cast<GLint>(count);
|
| + for (GLsizei ii = 0; ii < count; ++ii) {
|
| + GLint len = 0;
|
| + if (str[ii]) {
|
| + len = (length && length[ii] >= 0)
|
| + ? length[ii]
|
| + : base::checked_cast<GLint>(strlen(str[ii]));
|
| + }
|
| + total_size += len;
|
| + total_size += 1; // NULL at the end of each char array.
|
| + if (!total_size.IsValid()) {
|
| + SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow");
|
| + return;
|
| + }
|
| + header[ii + 1] = len;
|
| + }
|
| + // Pack data into a bucket on the service.
|
| + helper_->SetBucketSize(kResultBucketId, total_size.ValueOrDefault(0));
|
| + size_t offset = 0;
|
| + for (GLsizei ii = 0; ii <= count; ++ii) {
|
| + const char* src =
|
| + (ii == 0) ? reinterpret_cast<const char*>(&header[0]) : str[ii - 1];
|
| + base::CheckedNumeric<size_t> checked_size =
|
| + (ii == 0) ? header_size : static_cast<size_t>(header[ii]);
|
| + if (ii > 0) {
|
| + checked_size += 1; // NULL in the end.
|
| + }
|
| + if (!checked_size.IsValid()) {
|
| + SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow");
|
| + return;
|
| + }
|
| + size_t size = checked_size.ValueOrDefault(0);
|
| + while (size) {
|
| + ScopedTransferBufferPtr buffer(size, helper_, transfer_buffer_);
|
| + if (!buffer.valid() || buffer.size() == 0) {
|
| + SetGLError(GL_OUT_OF_MEMORY, "glShaderSource", "too large");
|
| + return;
|
| + }
|
| + size_t copy_size = buffer.size();
|
| + if (ii > 0 && buffer.size() == size)
|
| + --copy_size;
|
| + if (copy_size)
|
| + memcpy(buffer.address(), src, copy_size);
|
| + if (copy_size < buffer.size()) {
|
| + // Append NULL in the end.
|
| + DCHECK(copy_size + 1 == buffer.size());
|
| + char* str = reinterpret_cast<char*>(buffer.address());
|
| + str[copy_size] = 0;
|
| + }
|
| + helper_->SetBucketData(kResultBucketId, offset, buffer.size(),
|
| + buffer.shm_id(), buffer.offset());
|
| + offset += buffer.size();
|
| + src += buffer.size();
|
| + size -= buffer.size();
|
| + }
|
| + }
|
| + DCHECK_EQ(total_size.ValueOrDefault(0), offset);
|
| + helper_->ShaderSourceBucket(shader, kResultBucketId);
|
| + helper_->SetBucketSize(kResultBucketId, 0);
|
| + CheckGLError();
|
| +}
|
| +
|
| void GLES2Implementation::StencilFunc(GLenum func, GLint ref, GLuint mask) {
|
| GPU_CLIENT_SINGLE_THREAD_CHECK();
|
| GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilFunc("
|
|
|