| Index: gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
|
| diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
|
| index 3a275abd56cbbc4158e6d55f50945ee564423316..7d30822d5744ad0a6b71b503eccdc4d2a8c192a8 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
|
| @@ -9,13 +9,210 @@
|
| namespace gpu {
|
| namespace gles2 {
|
|
|
| +namespace {
|
| +
|
| +template <typename ClientType, typename ServiceType, typename GenFunction>
|
| +error::Error GenHelper(GLsizei n,
|
| + const volatile ClientType* client_ids,
|
| + ClientServiceMap<ClientType, ServiceType>* id_map,
|
| + GenFunction gen_function) {
|
| + std::vector<ClientType> client_ids_copy(client_ids, client_ids + n);
|
| + for (GLsizei ii = 0; ii < n; ++ii) {
|
| + if (id_map->GetServiceID(client_ids_copy[ii], nullptr)) {
|
| + return error::kInvalidArguments;
|
| + }
|
| + }
|
| + if (!CheckUniqueAndNonNullIds(n, client_ids_copy.data())) {
|
| + return error::kInvalidArguments;
|
| + }
|
| +
|
| + std::vector<ServiceType> service_ids(n, 0);
|
| + gen_function(n, service_ids.data());
|
| + for (GLsizei ii = 0; ii < n; ++ii) {
|
| + id_map->SetIDMapping(client_ids_copy[ii], service_ids[ii]);
|
| + }
|
| +
|
| + return error::kNoError;
|
| +}
|
| +
|
| +template <typename ClientType, typename ServiceType, typename GenFunction>
|
| +error::Error CreateHelper(ClientType client_id,
|
| + ClientServiceMap<ClientType, ServiceType>* id_map,
|
| + GenFunction create_function) {
|
| + if (id_map->GetServiceID(client_id, nullptr)) {
|
| + return error::kInvalidArguments;
|
| + }
|
| + ServiceType service_id = create_function();
|
| + id_map->SetIDMapping(client_id, service_id);
|
| + return error::kNoError;
|
| +}
|
| +
|
| +template <typename ClientType, typename ServiceType, typename DeleteFunction>
|
| +error::Error DeleteHelper(GLsizei n,
|
| + const volatile ClientType* client_ids,
|
| + ClientServiceMap<ClientType, ServiceType>* id_map,
|
| + DeleteFunction delete_function) {
|
| + std::vector<ServiceType> service_ids(n, 0);
|
| + for (GLsizei ii = 0; ii < n; ++ii) {
|
| + ClientType client_id = client_ids[ii];
|
| + service_ids[ii] = id_map->GetServiceIDOrInvalid(client_id);
|
| + id_map->RemoveClientID(client_id);
|
| + }
|
| +
|
| + delete_function(n, service_ids.data());
|
| +
|
| + return error::kNoError;
|
| +}
|
| +
|
| +template <typename ClientType, typename ServiceType, typename DeleteFunction>
|
| +error::Error DeleteHelper(ClientType client_id,
|
| + ClientServiceMap<ClientType, ServiceType>* id_map,
|
| + DeleteFunction delete_function) {
|
| + delete_function(id_map->GetServiceIDOrInvalid(client_id));
|
| + id_map->RemoveClientID(client_id);
|
| + return error::kNoError;
|
| +}
|
| +
|
| +template <typename ClientType, typename ServiceType, typename GenFunction>
|
| +ServiceType GetServiceID(ClientType client_id,
|
| + ClientServiceMap<ClientType, ServiceType>* id_map,
|
| + bool create_if_missing,
|
| + GenFunction gen_function) {
|
| + ServiceType service_id = id_map->invalid_service_id();
|
| + if (id_map->GetServiceID(client_id, &service_id)) {
|
| + return service_id;
|
| + }
|
| +
|
| + if (create_if_missing) {
|
| + service_id = gen_function();
|
| + id_map->SetIDMapping(client_id, service_id);
|
| + return service_id;
|
| + }
|
| +
|
| + return id_map->invalid_service_id();
|
| +}
|
| +
|
| +GLuint GetTextureServiceID(GLuint client_id,
|
| + PassthroughResources* resources,
|
| + bool create_if_missing) {
|
| + return GetServiceID(client_id, &resources->texture_id_map, create_if_missing,
|
| + []() {
|
| + GLuint service_id = 0;
|
| + glGenTextures(1, &service_id);
|
| + return service_id;
|
| + });
|
| +}
|
| +
|
| +GLuint GetBufferServiceID(GLuint client_id,
|
| + PassthroughResources* resources,
|
| + bool create_if_missing) {
|
| + return GetServiceID(client_id, &resources->buffer_id_map, create_if_missing,
|
| + []() {
|
| + GLuint service_id = 0;
|
| + glGenBuffersARB(1, &service_id);
|
| + return service_id;
|
| + });
|
| +}
|
| +
|
| +GLuint GetRenderbufferServiceID(GLuint client_id,
|
| + PassthroughResources* resources,
|
| + bool create_if_missing) {
|
| + return GetServiceID(client_id, &resources->renderbuffer_id_map,
|
| + create_if_missing, []() {
|
| + GLuint service_id = 0;
|
| + glGenRenderbuffersEXT(1, &service_id);
|
| + return service_id;
|
| + });
|
| +}
|
| +
|
| +GLuint GetFramebufferServiceID(GLuint client_id,
|
| + ClientServiceMap<GLuint, GLuint>* id_map,
|
| + bool create_if_missing) {
|
| + return GetServiceID(client_id, id_map, create_if_missing, []() {
|
| + GLuint service_id = 0;
|
| + glGenFramebuffersEXT(1, &service_id);
|
| + return service_id;
|
| + });
|
| +}
|
| +
|
| +GLuint GetTransformFeedbackServiceID(GLuint client_id,
|
| + ClientServiceMap<GLuint, GLuint>* id_map,
|
| + bool create_if_missing) {
|
| + return GetServiceID(client_id, id_map, create_if_missing, []() {
|
| + GLuint service_id = 0;
|
| + glGenTransformFeedbacks(1, &service_id);
|
| + return service_id;
|
| + });
|
| +}
|
| +
|
| +GLuint GetVertexArrayServiceID(GLuint client_id,
|
| + ClientServiceMap<GLuint, GLuint>* id_map,
|
| + bool create_if_missing) {
|
| + return GetServiceID(client_id, id_map, create_if_missing, []() {
|
| + GLuint service_id = 0;
|
| + glGenVertexArraysOES(1, &service_id);
|
| + return service_id;
|
| + });
|
| +}
|
| +
|
| +GLuint GetProgramServiceID(GLuint client_id, PassthroughResources* resources) {
|
| + return resources->program_id_map.GetServiceIDOrInvalid(client_id);
|
| +}
|
| +
|
| +GLuint GetShaderServiceID(GLuint client_id, PassthroughResources* resources) {
|
| + return resources->shader_id_map.GetServiceIDOrInvalid(client_id);
|
| +}
|
| +
|
| +GLuint GetQueryServiceID(GLuint client_id,
|
| + ClientServiceMap<GLuint, GLuint>* id_map) {
|
| + return id_map->GetServiceIDOrInvalid(client_id);
|
| +}
|
| +
|
| +GLuint GetSamplerServiceID(GLuint client_id, PassthroughResources* resources) {
|
| + return resources->sampler_id_map.GetServiceIDOrInvalid(client_id);
|
| +}
|
| +
|
| +GLsync GetSyncServiceID(GLuint client_id, PassthroughResources* resources) {
|
| + return reinterpret_cast<GLsync>(
|
| + resources->sync_id_map.GetServiceIDOrInvalid(client_id));
|
| +}
|
| +
|
| +template <typename T>
|
| +void InsertValueIntoBuffer(std::vector<uint8_t>* data,
|
| + const T& value,
|
| + size_t offset) {
|
| + DCHECK_LE(offset + sizeof(T), data->size());
|
| + memcpy(data->data() + offset, &value, sizeof(T));
|
| +}
|
| +
|
| +template <typename T>
|
| +void AppendValueToBuffer(std::vector<uint8_t>* data, const T& value) {
|
| + size_t old_size = data->size();
|
| + data->resize(old_size + sizeof(T));
|
| + memcpy(data->data() + old_size, &value, sizeof(T));
|
| +}
|
| +
|
| +void AppendStringToBuffer(std::vector<uint8_t>* data,
|
| + const char* str,
|
| + size_t len) {
|
| + size_t old_size = data->size();
|
| + data->resize(old_size + len);
|
| + memcpy(data->data() + old_size, str, len);
|
| +}
|
| +
|
| +} // anonymous namespace
|
| +
|
| // Implementations of commands
|
| error::Error GLES2DecoderPassthroughImpl::DoActiveTexture(GLenum texture) {
|
| + glActiveTexture(texture);
|
| + active_texture_unit_ = static_cast<size_t>(texture) - GL_TEXTURE0;
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoAttachShader(GLuint program,
|
| GLuint shader) {
|
| + glAttachShader(GetProgramServiceID(program, resources_),
|
| + GetShaderServiceID(shader, resources_));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -23,17 +220,22 @@ error::Error GLES2DecoderPassthroughImpl::DoBindAttribLocation(
|
| GLuint program,
|
| GLuint index,
|
| const char* name) {
|
| + glBindAttribLocation(GetProgramServiceID(program, resources_), index, name);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBindBuffer(GLenum target,
|
| GLuint buffer) {
|
| + glBindBuffer(
|
| + target, GetBufferServiceID(buffer, resources_, bind_generates_resource_));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBindBufferBase(GLenum target,
|
| GLuint index,
|
| GLuint buffer) {
|
| + glBindBufferBase(target, index, GetBufferServiceID(buffer, resources_,
|
| + bind_generates_resource_));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -42,34 +244,54 @@ error::Error GLES2DecoderPassthroughImpl::DoBindBufferRange(GLenum target,
|
| GLuint buffer,
|
| GLintptr offset,
|
| GLsizeiptr size) {
|
| + glBindBufferRange(target, index, GetBufferServiceID(buffer, resources_,
|
| + bind_generates_resource_),
|
| + offset, size);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBindFramebuffer(
|
| GLenum target,
|
| GLuint framebuffer) {
|
| + glBindFramebufferEXT(
|
| + target, GetFramebufferServiceID(framebuffer, &framebuffer_id_map_,
|
| + bind_generates_resource_));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBindRenderbuffer(
|
| GLenum target,
|
| GLuint renderbuffer) {
|
| + glBindRenderbufferEXT(target,
|
| + GetRenderbufferServiceID(renderbuffer, resources_,
|
| + bind_generates_resource_));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBindSampler(GLuint unit,
|
| GLuint sampler) {
|
| + glBindSampler(unit, GetSamplerServiceID(sampler, resources_));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBindTexture(GLenum target,
|
| GLuint texture) {
|
| + glBindTexture(target, GetTextureServiceID(texture, resources_,
|
| + bind_generates_resource_));
|
| + if (target == GL_TEXTURE_2D &&
|
| + active_texture_unit_ < bound_textures_.size()) {
|
| + bound_textures_[active_texture_unit_] = texture;
|
| + }
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBindTransformFeedback(
|
| GLenum target,
|
| GLuint transformfeedback) {
|
| + glBindTransformFeedback(
|
| + target, GetTransformFeedbackServiceID(transformfeedback,
|
| + &transform_feedback_id_map_,
|
| + bind_generates_resource_));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -77,21 +299,25 @@ error::Error GLES2DecoderPassthroughImpl::DoBlendColor(GLclampf red,
|
| GLclampf green,
|
| GLclampf blue,
|
| GLclampf alpha) {
|
| + glBlendColor(red, green, blue, alpha);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBlendEquation(GLenum mode) {
|
| + glBlendEquation(mode);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBlendEquationSeparate(
|
| GLenum modeRGB,
|
| GLenum modeAlpha) {
|
| + glBlendEquationSeparate(modeRGB, modeAlpha);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBlendFunc(GLenum sfactor,
|
| GLenum dfactor) {
|
| + glBlendFunc(sfactor, dfactor);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -99,6 +325,7 @@ error::Error GLES2DecoderPassthroughImpl::DoBlendFuncSeparate(GLenum srcRGB,
|
| GLenum dstRGB,
|
| GLenum srcAlpha,
|
| GLenum dstAlpha) {
|
| + glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -106,6 +333,7 @@ error::Error GLES2DecoderPassthroughImpl::DoBufferData(GLenum target,
|
| GLsizeiptr size,
|
| const void* data,
|
| GLenum usage) {
|
| + glBufferData(target, size, data, usage);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -113,16 +341,19 @@ error::Error GLES2DecoderPassthroughImpl::DoBufferSubData(GLenum target,
|
| GLintptr offset,
|
| GLsizeiptr size,
|
| const void* data) {
|
| + glBufferSubData(target, offset, size, data);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoCheckFramebufferStatus(
|
| GLenum target,
|
| uint32_t* result) {
|
| + *result = glCheckFramebufferStatusEXT(target);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoClear(GLbitfield mask) {
|
| + glClear(mask);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -130,6 +361,7 @@ error::Error GLES2DecoderPassthroughImpl::DoClearBufferfi(GLenum buffer,
|
| GLint drawbuffers,
|
| GLfloat depth,
|
| GLint stencil) {
|
| + glClearBufferfi(buffer, drawbuffers, depth, stencil);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -137,6 +369,7 @@ error::Error GLES2DecoderPassthroughImpl::DoClearBufferfv(
|
| GLenum buffer,
|
| GLint drawbuffers,
|
| const volatile GLfloat* value) {
|
| + glClearBufferfv(buffer, drawbuffers, const_cast<const GLfloat*>(value));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -144,6 +377,7 @@ error::Error GLES2DecoderPassthroughImpl::DoClearBufferiv(
|
| GLenum buffer,
|
| GLint drawbuffers,
|
| const volatile GLint* value) {
|
| + glClearBufferiv(buffer, drawbuffers, const_cast<const GLint*>(value));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -151,6 +385,7 @@ error::Error GLES2DecoderPassthroughImpl::DoClearBufferuiv(
|
| GLenum buffer,
|
| GLint drawbuffers,
|
| const volatile GLuint* value) {
|
| + glClearBufferuiv(buffer, drawbuffers, const_cast<const GLuint*>(value));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -158,14 +393,17 @@ error::Error GLES2DecoderPassthroughImpl::DoClearColor(GLclampf red,
|
| GLclampf green,
|
| GLclampf blue,
|
| GLclampf alpha) {
|
| + glClearColor(red, green, blue, alpha);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoClearDepthf(GLclampf depth) {
|
| + glClearDepthf(depth);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoClearStencil(GLint s) {
|
| + glClearStencil(s);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -173,6 +411,7 @@ error::Error GLES2DecoderPassthroughImpl::DoClientWaitSync(GLuint sync,
|
| GLbitfield flags,
|
| GLuint64 timeout,
|
| GLenum* result) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -180,10 +419,12 @@ error::Error GLES2DecoderPassthroughImpl::DoColorMask(GLboolean red,
|
| GLboolean green,
|
| GLboolean blue,
|
| GLboolean alpha) {
|
| + glColorMask(red, green, blue, alpha);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoCompileShader(GLuint shader) {
|
| + glCompileShader(GetShaderServiceID(shader, resources_));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -196,6 +437,7 @@ error::Error GLES2DecoderPassthroughImpl::DoCompressedTexImage2D(
|
| GLint border,
|
| GLsizei imageSize,
|
| const void* data) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -209,6 +451,7 @@ error::Error GLES2DecoderPassthroughImpl::DoCompressedTexSubImage2D(
|
| GLenum format,
|
| GLsizei imageSize,
|
| const void* data) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -222,6 +465,7 @@ error::Error GLES2DecoderPassthroughImpl::DoCompressedTexImage3D(
|
| GLint border,
|
| GLsizei imageSize,
|
| const void* data) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -237,6 +481,7 @@ error::Error GLES2DecoderPassthroughImpl::DoCompressedTexSubImage3D(
|
| GLenum format,
|
| GLsizei imageSize,
|
| const void* data) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -246,6 +491,7 @@ error::Error GLES2DecoderPassthroughImpl::DoCopyBufferSubData(
|
| GLintptr readoffset,
|
| GLintptr writeoffset,
|
| GLsizeiptr size) {
|
| + glCopyBufferSubData(readtarget, writetarget, readoffset, writeoffset, size);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -258,6 +504,7 @@ error::Error GLES2DecoderPassthroughImpl::DoCopyTexImage2D(
|
| GLsizei width,
|
| GLsizei height,
|
| GLint border) {
|
| + glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -269,6 +516,7 @@ error::Error GLES2DecoderPassthroughImpl::DoCopyTexSubImage2D(GLenum target,
|
| GLint y,
|
| GLsizei width,
|
| GLsizei height) {
|
| + glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -281,100 +529,149 @@ error::Error GLES2DecoderPassthroughImpl::DoCopyTexSubImage3D(GLenum target,
|
| GLint y,
|
| GLsizei width,
|
| GLsizei height) {
|
| + glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width,
|
| + height);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoCreateProgram(GLuint client_id) {
|
| - return error::kNoError;
|
| + return CreateHelper(client_id, &resources_->program_id_map,
|
| + []() { return glCreateProgram(); });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoCreateShader(GLenum type,
|
| GLuint client_id) {
|
| - return error::kNoError;
|
| + return CreateHelper(client_id, &resources_->shader_id_map,
|
| + [type]() { return glCreateShader(type); });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoCullFace(GLenum mode) {
|
| + glCullFace(mode);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDeleteBuffers(
|
| GLsizei n,
|
| const volatile GLuint* buffers) {
|
| - return error::kNoError;
|
| + return DeleteHelper(
|
| + n, buffers, &resources_->buffer_id_map,
|
| + [](GLsizei n, GLuint* buffers) { glDeleteBuffersARB(n, buffers); });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDeleteFramebuffers(
|
| GLsizei n,
|
| const volatile GLuint* framebuffers) {
|
| - return error::kNoError;
|
| + return DeleteHelper(n, framebuffers, &framebuffer_id_map_,
|
| + [](GLsizei n, GLuint* framebuffers) {
|
| + glDeleteFramebuffersEXT(n, framebuffers);
|
| + });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDeleteProgram(GLuint program) {
|
| - return error::kNoError;
|
| + return DeleteHelper(program, &resources_->program_id_map,
|
| + [](GLuint program) { glDeleteProgram(program); });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDeleteRenderbuffers(
|
| GLsizei n,
|
| const volatile GLuint* renderbuffers) {
|
| - return error::kNoError;
|
| + return DeleteHelper(n, renderbuffers, &resources_->renderbuffer_id_map,
|
| + [](GLsizei n, GLuint* renderbuffers) {
|
| + glDeleteRenderbuffersEXT(n, renderbuffers);
|
| + });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDeleteSamplers(
|
| GLsizei n,
|
| const volatile GLuint* samplers) {
|
| - return error::kNoError;
|
| + return DeleteHelper(
|
| + n, samplers, &resources_->sampler_id_map,
|
| + [](GLsizei n, GLuint* samplers) { glDeleteSamplers(n, samplers); });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDeleteSync(GLuint sync) {
|
| - return error::kNoError;
|
| + return DeleteHelper(sync, &resources_->sync_id_map, [](uintptr_t sync) {
|
| + glDeleteSync(reinterpret_cast<GLsync>(sync));
|
| + });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDeleteShader(GLuint shader) {
|
| - return error::kNoError;
|
| + return DeleteHelper(shader, &resources_->shader_id_map,
|
| + [](GLuint shader) { glDeleteShader(shader); });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDeleteTextures(
|
| GLsizei n,
|
| const volatile GLuint* textures) {
|
| - return error::kNoError;
|
| + // Textures that are currently associated with a mailbox are stored in the
|
| + // texture_object_map_ and are deleted automatically when they are
|
| + // unreferenced. Only delete textures that are not in this map.
|
| + std::vector<GLuint> non_mailbox_client_ids;
|
| + for (GLsizei ii = 0; ii < n; ++ii) {
|
| + GLuint client_id = textures[ii];
|
| + auto texture_object_iter = resources_->texture_object_map.find(client_id);
|
| + if (texture_object_iter == resources_->texture_object_map.end()) {
|
| + // Delete with DeleteHelper
|
| + non_mailbox_client_ids.push_back(client_id);
|
| + } else {
|
| + // Deleted when unreferenced
|
| + resources_->texture_id_map.RemoveClientID(client_id);
|
| + resources_->texture_object_map.erase(client_id);
|
| + }
|
| + }
|
| + return DeleteHelper(
|
| + non_mailbox_client_ids.size(), non_mailbox_client_ids.data(),
|
| + &resources_->texture_id_map,
|
| + [](GLsizei n, GLuint* textures) { glDeleteTextures(n, textures); });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDeleteTransformFeedbacks(
|
| GLsizei n,
|
| const volatile GLuint* ids) {
|
| - return error::kNoError;
|
| + return DeleteHelper(n, ids, &transform_feedback_id_map_,
|
| + [](GLsizei n, GLuint* transform_feedbacks) {
|
| + glDeleteTransformFeedbacks(n, transform_feedbacks);
|
| + });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDepthFunc(GLenum func) {
|
| + glDepthFunc(func);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDepthMask(GLboolean flag) {
|
| + glDepthMask(flag);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDepthRangef(GLclampf zNear,
|
| GLclampf zFar) {
|
| + glDepthRangef(zNear, zFar);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDetachShader(GLuint program,
|
| GLuint shader) {
|
| + glDetachShader(GetProgramServiceID(program, resources_),
|
| + GetShaderServiceID(shader, resources_));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDisable(GLenum cap) {
|
| + glDisable(cap);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDisableVertexAttribArray(
|
| GLuint index) {
|
| + glDisableVertexAttribArray(index);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDrawArrays(GLenum mode,
|
| GLint first,
|
| GLsizei count) {
|
| + glDrawArrays(mode, first, count);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -382,29 +679,35 @@ error::Error GLES2DecoderPassthroughImpl::DoDrawElements(GLenum mode,
|
| GLsizei count,
|
| GLenum type,
|
| const void* indices) {
|
| + glDrawElements(mode, count, type, indices);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoEnable(GLenum cap) {
|
| + glEnable(cap);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoEnableVertexAttribArray(
|
| GLuint index) {
|
| + glEnableVertexAttribArray(index);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoFenceSync(GLenum condition,
|
| GLbitfield flags,
|
| GLuint client_id) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoFinish() {
|
| + glFinish();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoFlush() {
|
| + glFlush();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -413,6 +716,20 @@ error::Error GLES2DecoderPassthroughImpl::DoFramebufferRenderbuffer(
|
| GLenum attachment,
|
| GLenum renderbuffertarget,
|
| GLuint renderbuffer) {
|
| + // TODO(geofflang): Handle this case in ANGLE by adding a WebGL validation
|
| + // mode.
|
| + if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
|
| + glFramebufferRenderbufferEXT(
|
| + target, GL_DEPTH_ATTACHMENT, renderbuffertarget,
|
| + GetRenderbufferServiceID(renderbuffer, resources_, false));
|
| + glFramebufferRenderbufferEXT(
|
| + target, GL_STENCIL_ATTACHMENT, renderbuffertarget,
|
| + GetRenderbufferServiceID(renderbuffer, resources_, false));
|
| + } else {
|
| + glFramebufferRenderbufferEXT(
|
| + target, attachment, renderbuffertarget,
|
| + GetRenderbufferServiceID(renderbuffer, resources_, false));
|
| + }
|
| return error::kNoError;
|
| }
|
|
|
| @@ -422,6 +739,9 @@ error::Error GLES2DecoderPassthroughImpl::DoFramebufferTexture2D(
|
| GLenum textarget,
|
| GLuint texture,
|
| GLint level) {
|
| + glFramebufferTexture2DEXT(target, attachment, textarget,
|
| + GetTextureServiceID(texture, resources_, false),
|
| + level);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -431,51 +751,71 @@ error::Error GLES2DecoderPassthroughImpl::DoFramebufferTextureLayer(
|
| GLuint texture,
|
| GLint level,
|
| GLint layer) {
|
| + glFramebufferTextureLayer(target, attachment,
|
| + GetTextureServiceID(texture, resources_, false),
|
| + level, layer);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoFrontFace(GLenum mode) {
|
| + glFrontFace(mode);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGenBuffers(
|
| GLsizei n,
|
| volatile GLuint* buffers) {
|
| - return error::kNoError;
|
| + return GenHelper(
|
| + n, buffers, &resources_->buffer_id_map,
|
| + [](GLsizei n, GLuint* buffers) { glGenBuffersARB(n, buffers); });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGenerateMipmap(GLenum target) {
|
| + glGenerateMipmapEXT(target);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGenFramebuffers(
|
| GLsizei n,
|
| volatile GLuint* framebuffers) {
|
| - return error::kNoError;
|
| + return GenHelper(n, framebuffers, &framebuffer_id_map_,
|
| + [](GLsizei n, GLuint* framebuffers) {
|
| + glGenFramebuffersEXT(n, framebuffers);
|
| + });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGenRenderbuffers(
|
| GLsizei n,
|
| volatile GLuint* renderbuffers) {
|
| - return error::kNoError;
|
| + return GenHelper(n, renderbuffers, &resources_->renderbuffer_id_map,
|
| + [](GLsizei n, GLuint* renderbuffers) {
|
| + glGenRenderbuffersEXT(n, renderbuffers);
|
| + });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGenSamplers(
|
| GLsizei n,
|
| volatile GLuint* samplers) {
|
| - return error::kNoError;
|
| + return GenHelper(
|
| + n, samplers, &resources_->sampler_id_map,
|
| + [](GLsizei n, GLuint* samplers) { glGenSamplers(n, samplers); });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGenTextures(
|
| GLsizei n,
|
| volatile GLuint* textures) {
|
| - return error::kNoError;
|
| + return GenHelper(
|
| + n, textures, &resources_->texture_id_map,
|
| + [](GLsizei n, GLuint* textures) { glGenTextures(n, textures); });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGenTransformFeedbacks(
|
| GLsizei n,
|
| volatile GLuint* ids) {
|
| - return error::kNoError;
|
| + return GenHelper(n, ids, &transform_feedback_id_map_,
|
| + [](GLsizei n, GLuint* transform_feedbacks) {
|
| + glGenTransformFeedbacks(n, transform_feedbacks);
|
| + });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGetActiveAttrib(GLuint program,
|
| @@ -483,6 +823,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetActiveAttrib(GLuint program,
|
| GLint* size,
|
| GLenum* type,
|
| std::string* name) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -492,6 +833,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetActiveUniform(
|
| GLint* size,
|
| GLenum* type,
|
| std::string* name) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -502,6 +844,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetActiveUniformBlockiv(
|
| GLsizei bufSize,
|
| GLsizei* length,
|
| GLint* params) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -509,6 +852,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetActiveUniformBlockName(
|
| GLuint program,
|
| GLuint index,
|
| std::string* name) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -520,6 +864,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetActiveUniformsiv(
|
| GLsizei bufSize,
|
| GLsizei* length,
|
| GLint* params) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -528,12 +873,14 @@ error::Error GLES2DecoderPassthroughImpl::DoGetAttachedShaders(
|
| GLsizei maxcount,
|
| GLsizei* count,
|
| GLuint* shaders) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGetAttribLocation(GLuint program,
|
| const char* name,
|
| GLint* result) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -541,6 +888,9 @@ error::Error GLES2DecoderPassthroughImpl::DoGetBooleanv(GLenum pname,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLboolean* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetBooleanv(pname, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -550,6 +900,11 @@ error::Error GLES2DecoderPassthroughImpl::DoGetBufferParameteri64v(
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint64* params) {
|
| + NOTIMPLEMENTED();
|
| + // TODO(geofflang): new-style getter
|
| + // TODO(geofflang): missing glGetBufferParameteri64v?
|
| + // glGetBufferParameteri64v(target, pname, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -559,10 +914,14 @@ error::Error GLES2DecoderPassthroughImpl::DoGetBufferParameteriv(
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetBufferParameteriv(target, pname, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGetError(uint32_t* result) {
|
| + *result = glGetError();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -570,6 +929,9 @@ error::Error GLES2DecoderPassthroughImpl::DoGetFloatv(GLenum pname,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLfloat* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetFloatv(pname, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -577,6 +939,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetFragDataLocation(
|
| GLuint program,
|
| const char* name,
|
| GLint* result) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -587,6 +950,9 @@ error::Error GLES2DecoderPassthroughImpl::DoGetFramebufferAttachmentParameteriv(
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -594,6 +960,9 @@ error::Error GLES2DecoderPassthroughImpl::DoGetInteger64v(GLenum pname,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint64* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetInteger64v(pname, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -602,6 +971,9 @@ error::Error GLES2DecoderPassthroughImpl::DoGetIntegeri_v(GLenum pname,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint* data) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetIntegeri_v(pname, index, data);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -610,6 +982,9 @@ error::Error GLES2DecoderPassthroughImpl::DoGetInteger64i_v(GLenum pname,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint64* data) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetInteger64i_v(pname, index, data);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -617,6 +992,13 @@ error::Error GLES2DecoderPassthroughImpl::DoGetIntegerv(GLenum pname,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetIntegerv(pname, params);
|
| + *length = 1;
|
| + // HACK: WebGL initialization requires this query
|
| + if (pname == GL_MAX_VIEWPORT_DIMS) {
|
| + *length = 2;
|
| + }
|
| return error::kNoError;
|
| }
|
|
|
| @@ -626,6 +1008,9 @@ error::Error GLES2DecoderPassthroughImpl::DoGetInternalformativ(GLenum target,
|
| GLsizei bufSize,
|
| GLsizei* length,
|
| GLint* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetInternalformativ(target, format, pname, bufSize, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -634,12 +1019,23 @@ error::Error GLES2DecoderPassthroughImpl::DoGetProgramiv(GLuint program,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetProgramiv(GetProgramServiceID(program, resources_), pname, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGetProgramInfoLog(
|
| GLuint program,
|
| std::string* infolog) {
|
| + GLint info_log_len = 0;
|
| + glGetProgramiv(GetProgramServiceID(program, resources_), GL_INFO_LOG_LENGTH,
|
| + &info_log_len);
|
| +
|
| + std::vector<char> buffer(info_log_len, 0);
|
| + glGetProgramInfoLog(GetProgramServiceID(program, resources_), info_log_len,
|
| + nullptr, buffer.data());
|
| + *infolog = std::string(buffer.data());
|
| return error::kNoError;
|
| }
|
|
|
| @@ -649,6 +1045,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetRenderbufferParameteriv(
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint* params) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -658,6 +1055,10 @@ error::Error GLES2DecoderPassthroughImpl::DoGetSamplerParameterfv(
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLfloat* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetSamplerParameterfv(GetSamplerServiceID(sampler, resources_), pname,
|
| + params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -667,6 +1068,10 @@ error::Error GLES2DecoderPassthroughImpl::DoGetSamplerParameteriv(
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint* params) {
|
| + NOTIMPLEMENTED();
|
| + // TODO(geofflang): new-style getter
|
| + // glGetRenderbufferParameterivEXT(target, pname, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -675,12 +1080,21 @@ error::Error GLES2DecoderPassthroughImpl::DoGetShaderiv(GLuint shader,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetShaderiv(GetShaderServiceID(shader, resources_), pname, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGetShaderInfoLog(
|
| GLuint shader,
|
| std::string* infolog) {
|
| + GLuint service_id = GetShaderServiceID(shader, resources_);
|
| + GLint info_log_len = 0;
|
| + glGetShaderiv(service_id, GL_INFO_LOG_LENGTH, &info_log_len);
|
| + std::vector<char> buffer(info_log_len, 0);
|
| + glGetShaderInfoLog(service_id, info_log_len, nullptr, buffer.data());
|
| + *infolog = std::string(buffer.data());
|
| return error::kNoError;
|
| }
|
|
|
| @@ -689,17 +1103,21 @@ error::Error GLES2DecoderPassthroughImpl::DoGetShaderPrecisionFormat(
|
| GLenum precisiontype,
|
| GLint* range,
|
| GLint* precision) {
|
| + glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGetShaderSource(
|
| GLuint shader,
|
| std::string* source) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGetString(GLenum name,
|
| const char** result) {
|
| + // TODO(geofflang): Append additional CHROMIUM extension strings?
|
| + *result = reinterpret_cast<const char*>(glGetString(name));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -708,6 +1126,8 @@ error::Error GLES2DecoderPassthroughImpl::DoGetSynciv(GLuint sync,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint* values) {
|
| + glGetSynciv(GetSyncServiceID(sync, resources_), pname, bufsize, length,
|
| + values);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -716,6 +1136,9 @@ error::Error GLES2DecoderPassthroughImpl::DoGetTexParameterfv(GLenum target,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLfloat* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetTexParameterfv(target, pname, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -724,6 +1147,9 @@ error::Error GLES2DecoderPassthroughImpl::DoGetTexParameteriv(GLenum target,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetTexParameteriv(target, pname, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -733,6 +1159,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetTransformFeedbackVarying(
|
| GLsizei* size,
|
| GLenum* type,
|
| std::string* name) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -740,6 +1167,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetUniformBlockIndex(
|
| GLuint program,
|
| const char* name,
|
| GLint* index) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -748,6 +1176,9 @@ error::Error GLES2DecoderPassthroughImpl::DoGetUniformfv(GLuint program,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLfloat* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetUniformfv(GetProgramServiceID(program, resources_), location, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -756,6 +1187,9 @@ error::Error GLES2DecoderPassthroughImpl::DoGetUniformiv(GLuint program,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetUniformiv(GetProgramServiceID(program, resources_), location, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -764,6 +1198,9 @@ error::Error GLES2DecoderPassthroughImpl::DoGetUniformuiv(GLuint program,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLuint* params) {
|
| + // TODO(geofflang): new-style getter
|
| + glGetUniformuiv(GetProgramServiceID(program, resources_), location, params);
|
| + *length = 1;
|
| return error::kNoError;
|
| }
|
|
|
| @@ -774,6 +1211,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetUniformIndices(
|
| GLsizei bufSize,
|
| GLsizei* length,
|
| GLuint* indices) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -781,6 +1219,8 @@ error::Error GLES2DecoderPassthroughImpl::DoGetUniformLocation(
|
| GLuint program,
|
| const char* name,
|
| GLint* location) {
|
| + *location =
|
| + glGetUniformLocation(GetProgramServiceID(program, resources_), name);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -789,6 +1229,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribfv(GLuint index,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLfloat* params) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -797,6 +1238,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribiv(GLuint index,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint* params) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -805,6 +1247,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribIiv(GLuint index,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLint* params) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -814,6 +1257,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribIuiv(
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLuint* params) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -823,10 +1267,12 @@ error::Error GLES2DecoderPassthroughImpl::DoGetVertexAttribPointerv(
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| GLuint* pointer) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoHint(GLenum target, GLenum mode) {
|
| + glHint(target, mode);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -834,6 +1280,8 @@ error::Error GLES2DecoderPassthroughImpl::DoInvalidateFramebuffer(
|
| GLenum target,
|
| GLsizei count,
|
| const volatile GLenum* attachments) {
|
| + std::vector<GLenum> attachments_copy(attachments, attachments + count);
|
| + glInvalidateFramebuffer(target, count, attachments_copy.data());
|
| return error::kNoError;
|
| }
|
|
|
| @@ -845,83 +1293,107 @@ error::Error GLES2DecoderPassthroughImpl::DoInvalidateSubFramebuffer(
|
| GLint y,
|
| GLsizei width,
|
| GLsizei height) {
|
| + std::vector<GLenum> attachments_copy(attachments, attachments + count);
|
| + glInvalidateSubFramebuffer(target, count, attachments_copy.data(), x, y,
|
| + width, height);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoIsBuffer(GLuint buffer,
|
| uint32_t* result) {
|
| + NOTIMPLEMENTED();
|
| + *result = glIsBuffer(GetBufferServiceID(buffer, resources_, false));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoIsEnabled(GLenum cap,
|
| uint32_t* result) {
|
| + *result = glIsEnabled(cap);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoIsFramebuffer(GLuint framebuffer,
|
| uint32_t* result) {
|
| + *result = glIsFramebufferEXT(
|
| + GetFramebufferServiceID(framebuffer, &framebuffer_id_map_, false));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoIsProgram(GLuint program,
|
| uint32_t* result) {
|
| + *result = glIsProgram(GetProgramServiceID(program, resources_));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoIsRenderbuffer(GLuint renderbuffer,
|
| uint32_t* result) {
|
| + NOTIMPLEMENTED();
|
| + *result = glIsRenderbufferEXT(
|
| + GetRenderbufferServiceID(renderbuffer, resources_, false));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoIsSampler(GLuint sampler,
|
| uint32_t* result) {
|
| + *result = glIsSampler(GetSamplerServiceID(sampler, resources_));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoIsShader(GLuint shader,
|
| uint32_t* result) {
|
| + *result = glIsShader(GetShaderServiceID(shader, resources_));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoIsSync(GLuint sync,
|
| uint32_t* result) {
|
| + *result = glIsSync(GetSyncServiceID(sync, resources_));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoIsTexture(GLuint texture,
|
| uint32_t* result) {
|
| + *result = glIsTexture(GetTextureServiceID(texture, resources_, false));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoIsTransformFeedback(
|
| GLuint transformfeedback,
|
| uint32_t* result) {
|
| + *result = glIsTransformFeedback(GetTransformFeedbackServiceID(
|
| + transformfeedback, &transform_feedback_id_map_, false));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoLineWidth(GLfloat width) {
|
| + glLineWidth(width);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoLinkProgram(GLuint program) {
|
| + glLinkProgram(GetProgramServiceID(program, resources_));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoPauseTransformFeedback() {
|
| + glPauseTransformFeedback();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoPixelStorei(GLenum pname,
|
| GLint param) {
|
| + glPixelStorei(pname, param);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoPolygonOffset(GLfloat factor,
|
| GLfloat units) {
|
| + glPolygonOffset(factor, units);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoReadBuffer(GLenum src) {
|
| + glReadBuffer(src);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -934,10 +1406,33 @@ error::Error GLES2DecoderPassthroughImpl::DoReadPixels(GLint x,
|
| GLsizei bufsize,
|
| GLsizei* length,
|
| void* pixels) {
|
| + glReadPixels(x, y, width, height, format, type, pixels);
|
| +
|
| + // HACK: Calculate the length here without taking into account the unpack
|
| + // parameters.
|
| + // Move into an ANGLE extension.
|
| + size_t componentCount = 4;
|
| + switch (format) {
|
| + case GL_RGBA:
|
| + componentCount = 4;
|
| + break;
|
| + case GL_RGB:
|
| + componentCount = 3;
|
| + break;
|
| + case GL_RG:
|
| + componentCount = 2;
|
| + break;
|
| + case GL_RED:
|
| + componentCount = 1;
|
| + break;
|
| + }
|
| + *length = width * height * componentCount * 4;
|
| +
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoReleaseShaderCompiler() {
|
| + glReleaseShaderCompiler();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -946,21 +1441,25 @@ error::Error GLES2DecoderPassthroughImpl::DoRenderbufferStorage(
|
| GLenum internalformat,
|
| GLsizei width,
|
| GLsizei height) {
|
| + glRenderbufferStorageEXT(target, internalformat, width, height);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoResumeTransformFeedback() {
|
| + glResumeTransformFeedback();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoSampleCoverage(GLclampf value,
|
| GLboolean invert) {
|
| + glSampleCoverage(value, invert);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoSamplerParameterf(GLuint sampler,
|
| GLenum pname,
|
| GLfloat param) {
|
| + glSamplerParameterf(GetSamplerServiceID(sampler, resources_), pname, param);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -968,12 +1467,16 @@ error::Error GLES2DecoderPassthroughImpl::DoSamplerParameterfv(
|
| GLuint sampler,
|
| GLenum pname,
|
| const volatile GLfloat* params) {
|
| + // TODO(geofflang): new-style setter, needs to make only one copy
|
| + glSamplerParameterfv(GetSamplerServiceID(sampler, resources_), pname,
|
| + const_cast<const GLfloat*>(params));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoSamplerParameteri(GLuint sampler,
|
| GLenum pname,
|
| GLint param) {
|
| + glSamplerParameteri(GetSamplerServiceID(sampler, resources_), pname, param);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -981,6 +1484,9 @@ error::Error GLES2DecoderPassthroughImpl::DoSamplerParameteriv(
|
| GLuint sampler,
|
| GLenum pname,
|
| const volatile GLint* params) {
|
| + // TODO(geofflang): new-style setter, needs to make only one copy
|
| + glSamplerParameteriv(GetSamplerServiceID(sampler, resources_), pname,
|
| + const_cast<const GLint*>(params));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -997,6 +1503,7 @@ error::Error GLES2DecoderPassthroughImpl::DoShaderBinary(GLsizei n,
|
| GLenum binaryformat,
|
| const void* binary,
|
| GLsizei length) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1004,12 +1511,14 @@ error::Error GLES2DecoderPassthroughImpl::DoShaderSource(GLuint shader,
|
| GLsizei count,
|
| const char** string,
|
| const GLint* length) {
|
| + glShaderSource(GetShaderServiceID(shader, resources_), count, string, length);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoStencilFunc(GLenum func,
|
| GLint ref,
|
| GLuint mask) {
|
| + glStencilFunc(func, ref, mask);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1017,21 +1526,25 @@ error::Error GLES2DecoderPassthroughImpl::DoStencilFuncSeparate(GLenum face,
|
| GLenum func,
|
| GLint ref,
|
| GLuint mask) {
|
| + glStencilFuncSeparate(face, func, ref, mask);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoStencilMask(GLuint mask) {
|
| + glStencilMask(mask);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoStencilMaskSeparate(GLenum face,
|
| GLuint mask) {
|
| + glStencilMaskSeparate(face, mask);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoStencilOp(GLenum fail,
|
| GLenum zfail,
|
| GLenum zpass) {
|
| + glStencilOp(fail, zfail, zpass);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1039,6 +1552,7 @@ error::Error GLES2DecoderPassthroughImpl::DoStencilOpSeparate(GLenum face,
|
| GLenum fail,
|
| GLenum zfail,
|
| GLenum zpass) {
|
| + glStencilOpSeparate(face, fail, zfail, zpass);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1052,6 +1566,9 @@ error::Error GLES2DecoderPassthroughImpl::DoTexImage2D(GLenum target,
|
| GLenum type,
|
| GLsizei imagesize,
|
| const void* pixels) {
|
| + // TODO(geofflang): validate using imagesize
|
| + glTexImage2D(target, level, internalformat, width, height, border, format,
|
| + type, pixels);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1066,12 +1583,16 @@ error::Error GLES2DecoderPassthroughImpl::DoTexImage3D(GLenum target,
|
| GLenum type,
|
| GLsizei imagesize,
|
| const void* pixels) {
|
| + // TODO(geofflang): validate using imagesize
|
| + glTexImage3D(target, level, internalformat, width, height, depth, border,
|
| + format, type, pixels);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoTexParameterf(GLenum target,
|
| GLenum pname,
|
| GLfloat param) {
|
| + glTexParameterf(target, pname, param);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1079,6 +1600,8 @@ error::Error GLES2DecoderPassthroughImpl::DoTexParameterfv(
|
| GLenum target,
|
| GLenum pname,
|
| const volatile GLfloat* params) {
|
| + // TODO(geofflang): new-style setter, needs to make only one copy
|
| + glTexParameterfv(target, pname, const_cast<const GLfloat*>(params));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1093,6 +1616,8 @@ error::Error GLES2DecoderPassthroughImpl::DoTexParameteriv(
|
| GLenum target,
|
| GLenum pname,
|
| const volatile GLint* params) {
|
| + // TODO(geofflang): new-style setter, needs to make only one copy
|
| + glTexParameteriv(target, pname, const_cast<const GLint*>(params));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1102,6 +1627,7 @@ error::Error GLES2DecoderPassthroughImpl::DoTexStorage3D(GLenum target,
|
| GLsizei width,
|
| GLsizei height,
|
| GLsizei depth) {
|
| + glTexStorage3D(target, levels, internalFormat, width, height, depth);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1115,6 +1641,9 @@ error::Error GLES2DecoderPassthroughImpl::DoTexSubImage2D(GLenum target,
|
| GLenum type,
|
| GLsizei imagesize,
|
| const void* pixels) {
|
| + // TODO(geofflang): validate using imagesize
|
| + glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type,
|
| + pixels);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1130,6 +1659,9 @@ error::Error GLES2DecoderPassthroughImpl::DoTexSubImage3D(GLenum target,
|
| GLenum type,
|
| GLsizei imagesize,
|
| const void* pixels) {
|
| + // TODO(geofflang): validate using imagesize
|
| + glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height,
|
| + depth, format, type, pixels);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1138,11 +1670,14 @@ error::Error GLES2DecoderPassthroughImpl::DoTransformFeedbackVaryings(
|
| GLsizei count,
|
| const char** varyings,
|
| GLenum buffermode) {
|
| + glTransformFeedbackVaryings(GetProgramServiceID(program, resources_), count,
|
| + varyings, buffermode);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoUniform1f(GLint location,
|
| GLfloat x) {
|
| + glUniform1f(location, x);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1150,10 +1685,12 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform1fv(
|
| GLint location,
|
| GLsizei count,
|
| const volatile GLfloat* v) {
|
| + glUniform1fv(location, count, const_cast<const GLfloat*>(v));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoUniform1i(GLint location, GLint x) {
|
| + glUniform1i(location, x);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1161,11 +1698,13 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform1iv(
|
| GLint location,
|
| GLsizei count,
|
| const volatile GLint* v) {
|
| + glUniform1iv(location, count, const_cast<const GLint*>(v));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoUniform1ui(GLint location,
|
| GLuint x) {
|
| + glUniform1ui(location, x);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1173,12 +1712,14 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform1uiv(
|
| GLint location,
|
| GLsizei count,
|
| const volatile GLuint* v) {
|
| + glUniform1uiv(location, count, const_cast<const GLuint*>(v));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoUniform2f(GLint location,
|
| GLfloat x,
|
| GLfloat y) {
|
| + glUniform2f(location, x, y);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1186,12 +1727,14 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform2fv(
|
| GLint location,
|
| GLsizei count,
|
| const volatile GLfloat* v) {
|
| + glUniform2fv(location, count, const_cast<const GLfloat*>(v));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoUniform2i(GLint location,
|
| GLint x,
|
| GLint y) {
|
| + glUniform2i(location, x, y);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1199,12 +1742,14 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform2iv(
|
| GLint location,
|
| GLsizei count,
|
| const volatile GLint* v) {
|
| + glUniform2iv(location, count, const_cast<const GLint*>(v));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoUniform2ui(GLint location,
|
| GLuint x,
|
| GLuint y) {
|
| + glUniform2ui(location, x, y);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1212,6 +1757,7 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform2uiv(
|
| GLint location,
|
| GLsizei count,
|
| const volatile GLuint* v) {
|
| + glUniform2uiv(location, count, const_cast<const GLuint*>(v));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1219,6 +1765,7 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform3f(GLint location,
|
| GLfloat x,
|
| GLfloat y,
|
| GLfloat z) {
|
| + glUniform3f(location, x, y, z);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1226,6 +1773,7 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform3fv(
|
| GLint location,
|
| GLsizei count,
|
| const volatile GLfloat* v) {
|
| + glUniform3fv(location, count, const_cast<const GLfloat*>(v));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1233,6 +1781,7 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform3i(GLint location,
|
| GLint x,
|
| GLint y,
|
| GLint z) {
|
| + glUniform3i(location, x, y, z);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1240,6 +1789,7 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform3iv(
|
| GLint location,
|
| GLsizei count,
|
| const volatile GLint* v) {
|
| + glUniform3iv(location, count, const_cast<const GLint*>(v));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1247,6 +1797,7 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform3ui(GLint location,
|
| GLuint x,
|
| GLuint y,
|
| GLuint z) {
|
| + glUniform3ui(location, x, y, z);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1254,6 +1805,7 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform3uiv(
|
| GLint location,
|
| GLsizei count,
|
| const volatile GLuint* v) {
|
| + glUniform3uiv(location, count, const_cast<const GLuint*>(v));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1262,6 +1814,7 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform4f(GLint location,
|
| GLfloat y,
|
| GLfloat z,
|
| GLfloat w) {
|
| + glUniform4f(location, x, y, z, w);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1269,6 +1822,7 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform4fv(
|
| GLint location,
|
| GLsizei count,
|
| const volatile GLfloat* v) {
|
| + glUniform4fv(location, count, const_cast<const GLfloat*>(v));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1277,6 +1831,7 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform4i(GLint location,
|
| GLint y,
|
| GLint z,
|
| GLint w) {
|
| + glUniform4i(location, x, y, z, w);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1284,6 +1839,7 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform4iv(
|
| GLint location,
|
| GLsizei count,
|
| const volatile GLint* v) {
|
| + glUniform4iv(location, count, const_cast<const GLint*>(v));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1292,6 +1848,7 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform4ui(GLint location,
|
| GLuint y,
|
| GLuint z,
|
| GLuint w) {
|
| + glUniform4ui(location, x, y, z, w);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1299,6 +1856,7 @@ error::Error GLES2DecoderPassthroughImpl::DoUniform4uiv(
|
| GLint location,
|
| GLsizei count,
|
| const volatile GLuint* v) {
|
| + glUniform4uiv(location, count, const_cast<const GLuint*>(v));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1306,6 +1864,8 @@ error::Error GLES2DecoderPassthroughImpl::DoUniformBlockBinding(
|
| GLuint program,
|
| GLuint index,
|
| GLuint binding) {
|
| + glUniformBlockBinding(GetProgramServiceID(program, resources_), index,
|
| + binding);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1314,6 +1874,8 @@ error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix2fv(
|
| GLsizei count,
|
| GLboolean transpose,
|
| const volatile GLfloat* value) {
|
| + glUniformMatrix2fv(location, count, transpose,
|
| + const_cast<const GLfloat*>(value));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1322,6 +1884,8 @@ error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix2x3fv(
|
| GLsizei count,
|
| GLboolean transpose,
|
| const volatile GLfloat* value) {
|
| + glUniformMatrix2x3fv(location, count, transpose,
|
| + const_cast<const GLfloat*>(value));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1330,6 +1894,8 @@ error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix2x4fv(
|
| GLsizei count,
|
| GLboolean transpose,
|
| const volatile GLfloat* value) {
|
| + glUniformMatrix2x4fv(location, count, transpose,
|
| + const_cast<const GLfloat*>(value));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1338,6 +1904,8 @@ error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix3fv(
|
| GLsizei count,
|
| GLboolean transpose,
|
| const volatile GLfloat* value) {
|
| + glUniformMatrix3fv(location, count, transpose,
|
| + const_cast<const GLfloat*>(value));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1346,6 +1914,8 @@ error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix3x2fv(
|
| GLsizei count,
|
| GLboolean transpose,
|
| const volatile GLfloat* value) {
|
| + glUniformMatrix3x2fv(location, count, transpose,
|
| + const_cast<const GLfloat*>(value));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1354,6 +1924,8 @@ error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix3x4fv(
|
| GLsizei count,
|
| GLboolean transpose,
|
| const volatile GLfloat* value) {
|
| + glUniformMatrix3x4fv(location, count, transpose,
|
| + const_cast<const GLfloat*>(value));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1362,6 +1934,8 @@ error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix4fv(
|
| GLsizei count,
|
| GLboolean transpose,
|
| const volatile GLfloat* value) {
|
| + glUniformMatrix4fv(location, count, transpose,
|
| + const_cast<const GLfloat*>(value));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1370,6 +1944,8 @@ error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix4x2fv(
|
| GLsizei count,
|
| GLboolean transpose,
|
| const volatile GLfloat* value) {
|
| + glUniformMatrix4x2fv(location, count, transpose,
|
| + const_cast<const GLfloat*>(value));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1378,37 +1954,45 @@ error::Error GLES2DecoderPassthroughImpl::DoUniformMatrix4x3fv(
|
| GLsizei count,
|
| GLboolean transpose,
|
| const volatile GLfloat* value) {
|
| + glUniformMatrix4x3fv(location, count, transpose,
|
| + const_cast<const GLfloat*>(value));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoUseProgram(GLuint program) {
|
| + glUseProgram(GetProgramServiceID(program, resources_));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoValidateProgram(GLuint program) {
|
| + glValidateProgram(GetProgramServiceID(program, resources_));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib1f(GLuint indx,
|
| GLfloat x) {
|
| + glVertexAttrib1f(indx, x);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib1fv(
|
| GLuint indx,
|
| const volatile GLfloat* values) {
|
| + glVertexAttrib1fv(indx, const_cast<const GLfloat*>(values));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib2f(GLuint indx,
|
| GLfloat x,
|
| GLfloat y) {
|
| + glVertexAttrib2f(indx, x, y);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib2fv(
|
| GLuint indx,
|
| const volatile GLfloat* values) {
|
| + glVertexAttrib2fv(indx, const_cast<const GLfloat*>(values));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1416,12 +2000,14 @@ error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib3f(GLuint indx,
|
| GLfloat x,
|
| GLfloat y,
|
| GLfloat z) {
|
| + glVertexAttrib3f(indx, x, y, z);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib3fv(
|
| GLuint indx,
|
| const volatile GLfloat* values) {
|
| + glVertexAttrib3fv(indx, const_cast<const GLfloat*>(values));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1430,12 +2016,14 @@ error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib4f(GLuint indx,
|
| GLfloat y,
|
| GLfloat z,
|
| GLfloat w) {
|
| + glVertexAttrib4f(indx, x, y, z, w);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoVertexAttrib4fv(
|
| GLuint indx,
|
| const volatile GLfloat* values) {
|
| + glVertexAttrib4fv(indx, const_cast<const GLfloat*>(values));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1444,12 +2032,14 @@ error::Error GLES2DecoderPassthroughImpl::DoVertexAttribI4i(GLuint indx,
|
| GLint y,
|
| GLint z,
|
| GLint w) {
|
| + glVertexAttribI4i(indx, x, y, z, w);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoVertexAttribI4iv(
|
| GLuint indx,
|
| const volatile GLint* values) {
|
| + glVertexAttribI4iv(indx, const_cast<const GLint*>(values));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1458,12 +2048,14 @@ error::Error GLES2DecoderPassthroughImpl::DoVertexAttribI4ui(GLuint indx,
|
| GLuint y,
|
| GLuint z,
|
| GLuint w) {
|
| + glVertexAttribI4ui(indx, x, y, z, w);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoVertexAttribI4uiv(
|
| GLuint indx,
|
| const volatile GLuint* values) {
|
| + glVertexAttribI4uiv(indx, const_cast<const GLuint*>(values));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1473,6 +2065,7 @@ error::Error GLES2DecoderPassthroughImpl::DoVertexAttribIPointer(
|
| GLenum type,
|
| GLsizei stride,
|
| const void* ptr) {
|
| + glVertexAttribIPointer(indx, size, type, stride, ptr);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1483,6 +2076,7 @@ error::Error GLES2DecoderPassthroughImpl::DoVertexAttribPointer(
|
| GLboolean normalized,
|
| GLsizei stride,
|
| const void* ptr) {
|
| + glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1490,12 +2084,14 @@ error::Error GLES2DecoderPassthroughImpl::DoViewport(GLint x,
|
| GLint y,
|
| GLsizei width,
|
| GLsizei height) {
|
| + glViewport(x, y, width, height);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoWaitSync(GLuint sync,
|
| GLbitfield flags,
|
| GLuint64 timeout) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1510,6 +2106,8 @@ error::Error GLES2DecoderPassthroughImpl::DoBlitFramebufferCHROMIUM(
|
| GLint dstY1,
|
| GLbitfield mask,
|
| GLenum filter) {
|
| + glBlitFramebufferANGLE(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
|
| + mask, filter);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1520,6 +2118,8 @@ GLES2DecoderPassthroughImpl::DoRenderbufferStorageMultisampleCHROMIUM(
|
| GLenum internalformat,
|
| GLsizei width,
|
| GLsizei height) {
|
| + glRenderbufferStorageMultisampleANGLE(target, samples, internalformat, width,
|
| + height);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1529,6 +2129,8 @@ error::Error GLES2DecoderPassthroughImpl::DoRenderbufferStorageMultisampleEXT(
|
| GLenum internalformat,
|
| GLsizei width,
|
| GLsizei height) {
|
| + glRenderbufferStorageMultisampleANGLE(target, samples, internalformat, width,
|
| + height);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1539,6 +2141,7 @@ error::Error GLES2DecoderPassthroughImpl::DoFramebufferTexture2DMultisampleEXT(
|
| GLuint texture,
|
| GLint level,
|
| GLsizei samples) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1555,81 +2158,109 @@ error::Error GLES2DecoderPassthroughImpl::DoTexStorage2DEXT(
|
| error::Error GLES2DecoderPassthroughImpl::DoGenQueriesEXT(
|
| GLsizei n,
|
| volatile GLuint* queries) {
|
| - return error::kNoError;
|
| + return GenHelper(n, queries, &query_id_map_, [](GLsizei n, GLuint* queries) {
|
| + glGenQueries(n, queries);
|
| + });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDeleteQueriesEXT(
|
| GLsizei n,
|
| const volatile GLuint* queries) {
|
| - return error::kNoError;
|
| + return DeleteHelper(
|
| + n, queries, &query_id_map_,
|
| + [](GLsizei n, GLuint* queries) { glDeleteQueries(n, queries); });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoQueryCounterEXT(GLuint id,
|
| GLenum target) {
|
| + glQueryCounter(GetQueryServiceID(id, &query_id_map_), target);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBeginQueryEXT(GLenum target,
|
| GLuint id) {
|
| + // TODO(geofflang): Track active queries
|
| + glBeginQuery(target, GetQueryServiceID(id, &query_id_map_));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBeginTransformFeedback(
|
| GLenum primitivemode) {
|
| + glBeginTransformFeedback(primitivemode);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoEndQueryEXT(GLenum target) {
|
| + // TODO(geofflang): Track active queries
|
| + glEndQuery(target);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoEndTransformFeedback() {
|
| + glEndTransformFeedback();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoSetDisjointValueSyncCHROMIUM(
|
| DisjointValueSync* sync) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoInsertEventMarkerEXT(
|
| GLsizei length,
|
| const char* marker) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoPushGroupMarkerEXT(
|
| GLsizei length,
|
| const char* marker) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoPopGroupMarkerEXT() {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGenVertexArraysOES(
|
| GLsizei n,
|
| volatile GLuint* arrays) {
|
| - return error::kNoError;
|
| + return GenHelper(
|
| + n, arrays, &vertex_array_id_map_,
|
| + [](GLsizei n, GLuint* arrays) { glGenVertexArraysOES(n, arrays); });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDeleteVertexArraysOES(
|
| GLsizei n,
|
| const volatile GLuint* arrays) {
|
| - return error::kNoError;
|
| + return DeleteHelper(
|
| + n, arrays, &vertex_array_id_map_,
|
| + [](GLsizei n, GLuint* arrays) { glDeleteVertexArraysOES(n, arrays); });
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoIsVertexArrayOES(GLuint array,
|
| uint32_t* result) {
|
| + *result = glIsVertexArrayOES(
|
| + GetVertexArrayServiceID(array, &vertex_array_id_map_, false));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBindVertexArrayOES(GLuint array) {
|
| + glBindVertexArrayOES(GetVertexArrayServiceID(array, &vertex_array_id_map_,
|
| + bind_generates_resource_));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoSwapBuffers() {
|
| + gfx::SwapResult result = surface_->SwapBuffers();
|
| + if (result == gfx::SwapResult::SWAP_FAILED) {
|
| + LOG(ERROR) << "Context lost because SwapBuffers failed.";
|
| + }
|
| + // TODO(geofflang): force the context loss?
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1639,11 +2270,13 @@ error::Error GLES2DecoderPassthroughImpl::DoGetMaxValueInBufferCHROMIUM(
|
| GLenum type,
|
| GLuint offset,
|
| uint32_t* result) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoEnableFeatureCHROMIUM(
|
| const char* feature) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1652,10 +2285,12 @@ error::Error GLES2DecoderPassthroughImpl::DoMapBufferRange(GLenum target,
|
| GLsizeiptr size,
|
| GLbitfield access,
|
| void** ptr) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoUnmapBuffer(GLenum target) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1663,28 +2298,129 @@ error::Error GLES2DecoderPassthroughImpl::DoResizeCHROMIUM(GLuint width,
|
| GLuint height,
|
| GLfloat scale_factor,
|
| GLboolean alpha) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGetRequestableExtensionsCHROMIUM(
|
| const char** extensions) {
|
| + *extensions = "";
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoRequestExtensionCHROMIUM(
|
| const char* extension) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGetProgramInfoCHROMIUM(
|
| GLuint program,
|
| std::vector<uint8_t>* data) {
|
| + GLuint service_program = 0;
|
| + if (!resources_->program_id_map.GetServiceID(program, &service_program)) {
|
| + return error::kNoError;
|
| + }
|
| +
|
| + GLint num_attributes = 0;
|
| + glGetProgramiv(service_program, GL_ACTIVE_ATTRIBUTES, &num_attributes);
|
| +
|
| + GLint num_uniforms = 0;
|
| + glGetProgramiv(service_program, GL_ACTIVE_UNIFORMS, &num_uniforms);
|
| +
|
| + data->resize(sizeof(ProgramInfoHeader) +
|
| + ((num_attributes + num_uniforms) * sizeof(ProgramInput)),
|
| + 0);
|
| +
|
| + GLint link_status = 0;
|
| + glGetProgramiv(service_program, GL_LINK_STATUS, &link_status);
|
| +
|
| + ProgramInfoHeader header;
|
| + header.link_status = link_status;
|
| + header.num_attribs = num_attributes;
|
| + header.num_uniforms = num_uniforms;
|
| + InsertValueIntoBuffer(data, header, 0);
|
| +
|
| + GLint active_attribute_max_length = 0;
|
| + glGetProgramiv(service_program, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH,
|
| + &active_attribute_max_length);
|
| +
|
| + std::vector<char> attrib_name_buf(active_attribute_max_length, 0);
|
| + for (GLint attrib_index = 0; attrib_index < num_attributes; attrib_index++) {
|
| + GLsizei length = 0;
|
| + GLint size = 0;
|
| + GLenum type = GL_NONE;
|
| + glGetActiveAttrib(service_program, attrib_index, attrib_name_buf.size(),
|
| + &length, &size, &type, attrib_name_buf.data());
|
| +
|
| + ProgramInput input;
|
| + input.size = size;
|
| + input.type = type;
|
| +
|
| + int32_t location =
|
| + glGetAttribLocation(service_program, attrib_name_buf.data());
|
| + input.location_offset = data->size();
|
| + AppendValueToBuffer(data, location);
|
| +
|
| + input.name_offset = data->size();
|
| + input.name_length = length;
|
| + AppendStringToBuffer(data, attrib_name_buf.data(), length);
|
| +
|
| + InsertValueIntoBuffer(
|
| + data, input,
|
| + sizeof(ProgramInfoHeader) + (attrib_index * sizeof(ProgramInput)));
|
| + }
|
| +
|
| + GLint active_uniform_max_length = 0;
|
| + glGetProgramiv(service_program, GL_ACTIVE_UNIFORM_MAX_LENGTH,
|
| + &active_uniform_max_length);
|
| +
|
| + std::vector<char> uniform_name_buf(active_uniform_max_length, 0);
|
| + for (GLint uniform_index = 0; uniform_index < num_uniforms; uniform_index++) {
|
| + GLsizei length = 0;
|
| + GLint size = 0;
|
| + GLenum type = GL_NONE;
|
| + glGetActiveUniform(service_program, uniform_index, uniform_name_buf.size(),
|
| + &length, &size, &type, uniform_name_buf.data());
|
| +
|
| + ProgramInput input;
|
| + input.size = size;
|
| + input.type = type;
|
| +
|
| + input.location_offset = data->size();
|
| + int32_t base_location =
|
| + glGetUniformLocation(service_program, uniform_name_buf.data());
|
| + AppendValueToBuffer(data, base_location);
|
| +
|
| + GLSLArrayName parsed_service_name(uniform_name_buf.data());
|
| + if (size > 1 || parsed_service_name.IsArrayName()) {
|
| + for (GLint location_index = 1; location_index < size; location_index++) {
|
| + std::string array_element_name = parsed_service_name.base_name() + "[" +
|
| + base::IntToString(location_index) +
|
| + "]";
|
| + int32_t element_location =
|
| + glGetUniformLocation(service_program, array_element_name.c_str());
|
| + AppendValueToBuffer(data, element_location);
|
| + }
|
| + }
|
| +
|
| + input.name_offset = data->size();
|
| + input.name_length = length;
|
| + AppendStringToBuffer(data, uniform_name_buf.data(), length);
|
| +
|
| + InsertValueIntoBuffer(data, input, sizeof(ProgramInfoHeader) +
|
| + ((num_attributes + uniform_index) *
|
| + sizeof(ProgramInput)));
|
| + }
|
| +
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGetUniformBlocksCHROMIUM(
|
| GLuint program,
|
| std::vector<uint8_t>* data) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1692,18 +2428,21 @@ error::Error
|
| GLES2DecoderPassthroughImpl::DoGetTransformFeedbackVaryingsCHROMIUM(
|
| GLuint program,
|
| std::vector<uint8_t>* data) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGetUniformsES3CHROMIUM(
|
| GLuint program,
|
| std::vector<uint8_t>* data) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGetTranslatedShaderSourceANGLE(
|
| GLuint shader,
|
| std::string* source) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1712,6 +2451,11 @@ error::Error GLES2DecoderPassthroughImpl::DoSwapBuffersWithDamageCHROMIUM(
|
| GLint y,
|
| GLint width,
|
| GLint height) {
|
| + gfx::SwapResult result = surface_->PostSubBuffer(x, y, width, height);
|
| + if (result == gfx::SwapResult::SWAP_FAILED) {
|
| + LOG(ERROR) << "Context lost because PostSubBuffer failed.";
|
| + }
|
| + // TODO(geofflang): force the context loss?
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1731,6 +2475,10 @@ error::Error GLES2DecoderPassthroughImpl::DoCopyTextureCHROMIUM(
|
| GLboolean unpack_flip_y,
|
| GLboolean unpack_premultiply_alpha,
|
| GLboolean unpack_unmultiply_alpha) {
|
| + glCopyTextureCHROMIUM(GetTextureServiceID(source_id, resources_, false),
|
| + GetTextureServiceID(dest_id, resources_, false),
|
| + internalformat, dest_type, unpack_flip_y,
|
| + unpack_premultiply_alpha, unpack_unmultiply_alpha);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1746,12 +2494,19 @@ error::Error GLES2DecoderPassthroughImpl::DoCopySubTextureCHROMIUM(
|
| GLboolean unpack_flip_y,
|
| GLboolean unpack_premultiply_alpha,
|
| GLboolean unpack_unmultiply_alpha) {
|
| + glCopySubTextureCHROMIUM(GetTextureServiceID(source_id, resources_, false),
|
| + GetTextureServiceID(dest_id, resources_, false),
|
| + xoffset, yoffset, x, y, width, height, unpack_flip_y,
|
| + unpack_premultiply_alpha, unpack_unmultiply_alpha);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoCompressedCopyTextureCHROMIUM(
|
| GLenum source_id,
|
| GLenum dest_id) {
|
| + glCompressedCopyTextureCHROMIUM(
|
| + GetTextureServiceID(source_id, resources_, false),
|
| + GetTextureServiceID(dest_id, resources_, false));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1760,6 +2515,7 @@ error::Error GLES2DecoderPassthroughImpl::DoDrawArraysInstancedANGLE(
|
| GLint first,
|
| GLsizei count,
|
| GLsizei primcount) {
|
| + glDrawArraysInstancedANGLE(mode, first, count, primcount);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1769,38 +2525,112 @@ error::Error GLES2DecoderPassthroughImpl::DoDrawElementsInstancedANGLE(
|
| GLenum type,
|
| const void* indices,
|
| GLsizei primcount) {
|
| + glDrawElementsInstancedANGLE(mode, count, type, indices, primcount);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoVertexAttribDivisorANGLE(
|
| GLuint index,
|
| GLuint divisor) {
|
| + glVertexAttribDivisorANGLE(index, divisor);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoProduceTextureCHROMIUM(
|
| GLenum target,
|
| const volatile GLbyte* mailbox) {
|
| + // TODO(geofflang): validation
|
| +
|
| + GLuint texture_client_id = bound_textures_[active_texture_unit_];
|
| + scoped_refptr<TexturePassthrough> texture;
|
| +
|
| + auto texture_object_iter =
|
| + resources_->texture_object_map.find(texture_client_id);
|
| + if (texture_object_iter != resources_->texture_object_map.end()) {
|
| + texture = texture_object_iter->second.get();
|
| + } else {
|
| + GLuint service_id =
|
| + GetTextureServiceID(texture_client_id, resources_, false);
|
| + texture = new TexturePassthrough(service_id);
|
| + resources_->texture_object_map.insert(
|
| + std::make_pair(texture_client_id, texture));
|
| + }
|
| +
|
| + const Mailbox& mb = Mailbox::FromVolatile(
|
| + *reinterpret_cast<const volatile Mailbox*>(mailbox));
|
| + mailbox_manager_->ProduceTexture(mb, texture.get());
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoProduceTextureDirectCHROMIUM(
|
| - GLuint texture,
|
| + GLuint texture_client_id,
|
| GLenum target,
|
| const volatile GLbyte* mailbox) {
|
| + // TODO(geofflang): validation
|
| +
|
| + scoped_refptr<TexturePassthrough> texture;
|
| + auto texture_object_iter =
|
| + resources_->texture_object_map.find(texture_client_id);
|
| + if (texture_object_iter != resources_->texture_object_map.end()) {
|
| + texture = texture_object_iter->second.get();
|
| + } else {
|
| + GLuint service_id =
|
| + GetTextureServiceID(texture_client_id, resources_, false);
|
| + texture = new TexturePassthrough(service_id);
|
| + resources_->texture_object_map.insert(
|
| + std::make_pair(texture_client_id, texture));
|
| + }
|
| +
|
| + const Mailbox& mb = Mailbox::FromVolatile(
|
| + *reinterpret_cast<const volatile Mailbox*>(mailbox));
|
| + mailbox_manager_->ProduceTexture(mb, texture.get());
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoConsumeTextureCHROMIUM(
|
| GLenum target,
|
| const volatile GLbyte* mailbox) {
|
| + // TODO(geofflang): validation
|
| +
|
| + const Mailbox& mb = Mailbox::FromVolatile(
|
| + *reinterpret_cast<const volatile Mailbox*>(mailbox));
|
| + scoped_refptr<TexturePassthrough> texture = static_cast<TexturePassthrough*>(
|
| + group_->mailbox_manager()->ConsumeTexture(mb));
|
| + if (texture == nullptr) {
|
| + // TODO(geofflang): error, missing mailbox
|
| + return error::kNoError;
|
| + }
|
| +
|
| + GLuint client_id = bound_textures_[active_texture_unit_];
|
| + resources_->texture_id_map.SetIDMapping(client_id, texture->service_id());
|
| + resources_->texture_object_map.erase(client_id);
|
| + resources_->texture_object_map.insert(std::make_pair(client_id, texture));
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoCreateAndConsumeTextureINTERNAL(
|
| GLenum target,
|
| - GLuint texture,
|
| + GLuint texture_client_id,
|
| const volatile GLbyte* mailbox) {
|
| + // TODO(geofflang): validation
|
| +
|
| + if (resources_->texture_id_map.GetServiceID(texture_client_id, nullptr)) {
|
| + return error::kInvalidArguments;
|
| + }
|
| + const Mailbox& mb = Mailbox::FromVolatile(
|
| + *reinterpret_cast<const volatile Mailbox*>(mailbox));
|
| + scoped_refptr<TexturePassthrough> texture = static_cast<TexturePassthrough*>(
|
| + group_->mailbox_manager()->ConsumeTexture(mb));
|
| + if (texture == nullptr) {
|
| + // TODO(geofflang): error, missing mailbox
|
| + return error::kNoError;
|
| + }
|
| +
|
| + resources_->texture_id_map.SetIDMapping(texture_client_id,
|
| + texture->service_id());
|
| + resources_->texture_object_map.erase(texture_client_id);
|
| + resources_->texture_object_map.insert(
|
| + std::make_pair(texture_client_id, texture));
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1808,28 +2638,40 @@ error::Error GLES2DecoderPassthroughImpl::DoBindUniformLocationCHROMIUM(
|
| GLuint program,
|
| GLint location,
|
| const char* name) {
|
| + glBindUniformLocationCHROMIUM(GetProgramServiceID(program, resources_),
|
| + location, name);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBindTexImage2DCHROMIUM(
|
| GLenum target,
|
| GLint imageId) {
|
| + // TODO(geofflang): error handling
|
| + gl::GLImage* image = image_manager_->LookupImage(imageId);
|
| + if (!image->BindTexImage(target)) {
|
| + image->CopyTexImage(target);
|
| + }
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoReleaseTexImage2DCHROMIUM(
|
| GLenum target,
|
| GLint imageId) {
|
| + // TODO(geofflang): error handling
|
| + gl::GLImage* image = image_manager_->LookupImage(imageId);
|
| + image->ReleaseTexImage(target);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoTraceBeginCHROMIUM(
|
| const char* category_name,
|
| const char* trace_name) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoTraceEndCHROMIUM() {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1837,20 +2679,26 @@ error::Error GLES2DecoderPassthroughImpl::DoDiscardFramebufferEXT(
|
| GLenum target,
|
| GLsizei count,
|
| const volatile GLenum* attachments) {
|
| + std::vector<GLenum> attachments_copy(attachments, attachments + count);
|
| + glDiscardFramebufferEXT(target, count, attachments_copy.data());
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoLoseContextCHROMIUM(GLenum current,
|
| GLenum other) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDescheduleUntilFinishedCHROMIUM() {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoInsertFenceSyncCHROMIUM(
|
| GLuint64 release_count) {
|
| + if (!fence_sync_release_callback_.is_null())
|
| + fence_sync_release_callback_.Run(release_count);
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1858,16 +2706,25 @@ error::Error GLES2DecoderPassthroughImpl::DoWaitSyncTokenCHROMIUM(
|
| CommandBufferNamespace namespace_id,
|
| CommandBufferId command_buffer_id,
|
| GLuint64 release_count) {
|
| - return error::kNoError;
|
| + if (wait_fence_sync_callback_.is_null()) {
|
| + return error::kNoError;
|
| + }
|
| + return wait_fence_sync_callback_.Run(namespace_id, command_buffer_id,
|
| + release_count)
|
| + ? error::kNoError
|
| + : error::kDeferCommandUntilLater;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDrawBuffersEXT(
|
| GLsizei count,
|
| const volatile GLenum* bufs) {
|
| + std::vector<GLenum> bufs_copy(bufs, bufs + count);
|
| + glDrawBuffersARB(count, bufs_copy.data());
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDiscardBackbufferCHROMIUM() {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1883,6 +2740,7 @@ error::Error GLES2DecoderPassthroughImpl::DoScheduleOverlayPlaneCHROMIUM(
|
| GLfloat uv_y,
|
| GLfloat uv_width,
|
| GLfloat uv_height) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1892,6 +2750,7 @@ error::Error GLES2DecoderPassthroughImpl::DoScheduleCALayerSharedStateCHROMIUM(
|
| const GLfloat* clip_rect,
|
| GLint sorting_context_id,
|
| const GLfloat* transform) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1901,50 +2760,60 @@ error::Error GLES2DecoderPassthroughImpl::DoScheduleCALayerCHROMIUM(
|
| GLuint background_color,
|
| GLuint edge_aa_mask,
|
| const GLfloat* bounds_rect) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoScheduleCALayerInUseQueryCHROMIUM(
|
| GLuint n,
|
| const volatile GLuint* textures) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoCommitOverlayPlanesCHROMIUM() {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoSwapInterval(GLint interval) {
|
| + context_->SetSwapInterval(interval);
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoFlushDriverCachesCHROMIUM() {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoMatrixLoadfCHROMIUM(
|
| GLenum matrixMode,
|
| const volatile GLfloat* m) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoMatrixLoadIdentityCHROMIUM(
|
| GLenum matrixMode) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoGenPathsCHROMIUM(GLuint path,
|
| GLsizei range) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoDeletePathsCHROMIUM(GLuint path,
|
| GLsizei range) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoIsPathCHROMIUM(GLuint path,
|
| uint32_t* result) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1956,6 +2825,7 @@ error::Error GLES2DecoderPassthroughImpl::DoPathCommandsCHROMIUM(
|
| GLenum coordType,
|
| const GLvoid* coords,
|
| GLsizei coords_bufsize) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1963,6 +2833,7 @@ error::Error GLES2DecoderPassthroughImpl::DoPathParameterfCHROMIUM(
|
| GLuint path,
|
| GLenum pname,
|
| GLfloat value) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1970,6 +2841,7 @@ error::Error GLES2DecoderPassthroughImpl::DoPathParameteriCHROMIUM(
|
| GLuint path,
|
| GLenum pname,
|
| GLint value) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1977,6 +2849,7 @@ error::Error GLES2DecoderPassthroughImpl::DoPathStencilFuncCHROMIUM(
|
| GLenum func,
|
| GLint ref,
|
| GLuint mask) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1984,6 +2857,7 @@ error::Error GLES2DecoderPassthroughImpl::DoStencilFillPathCHROMIUM(
|
| GLuint path,
|
| GLenum fillMode,
|
| GLuint mask) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -1991,18 +2865,21 @@ error::Error GLES2DecoderPassthroughImpl::DoStencilStrokePathCHROMIUM(
|
| GLuint path,
|
| GLint reference,
|
| GLuint mask) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoCoverFillPathCHROMIUM(
|
| GLuint path,
|
| GLenum coverMode) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoCoverStrokePathCHROMIUM(
|
| GLuint path,
|
| GLenum coverMode) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -2011,6 +2888,7 @@ error::Error GLES2DecoderPassthroughImpl::DoStencilThenCoverFillPathCHROMIUM(
|
| GLenum fillMode,
|
| GLuint mask,
|
| GLenum coverMode) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -2019,6 +2897,7 @@ error::Error GLES2DecoderPassthroughImpl::DoStencilThenCoverStrokePathCHROMIUM(
|
| GLint reference,
|
| GLuint mask,
|
| GLenum coverMode) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -2033,6 +2912,7 @@ error::Error GLES2DecoderPassthroughImpl::DoStencilFillPathInstancedCHROMIUM(
|
| GLenum transformType,
|
| const GLfloat* transformValues,
|
| GLsizei transformValuesBufsize) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -2047,6 +2927,7 @@ error::Error GLES2DecoderPassthroughImpl::DoStencilStrokePathInstancedCHROMIUM(
|
| GLenum transformType,
|
| const GLfloat* transformValues,
|
| GLsizei transformValuesBufsize) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -2060,6 +2941,7 @@ error::Error GLES2DecoderPassthroughImpl::DoCoverFillPathInstancedCHROMIUM(
|
| GLenum transformType,
|
| const GLfloat* transformValues,
|
| GLsizei transformValuesBufsize) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -2073,6 +2955,7 @@ error::Error GLES2DecoderPassthroughImpl::DoCoverStrokePathInstancedCHROMIUM(
|
| GLenum transformType,
|
| const GLfloat* transformValues,
|
| GLsizei transformValuesBufsize) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -2089,6 +2972,7 @@ GLES2DecoderPassthroughImpl::DoStencilThenCoverFillPathInstancedCHROMIUM(
|
| GLenum transformType,
|
| const GLfloat* transformValues,
|
| GLsizei transformValuesBufsize) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -2105,6 +2989,7 @@ GLES2DecoderPassthroughImpl::DoStencilThenCoverStrokePathInstancedCHROMIUM(
|
| GLenum transformType,
|
| const GLfloat* transformValues,
|
| GLsizei transformValuesBufsize) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -2112,6 +2997,7 @@ error::Error GLES2DecoderPassthroughImpl::DoBindFragmentInputLocationCHROMIUM(
|
| GLuint program,
|
| GLint location,
|
| const char* name) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -2122,20 +3008,24 @@ error::Error GLES2DecoderPassthroughImpl::DoProgramPathFragmentInputGenCHROMIUM(
|
| GLint components,
|
| const GLfloat* coeffs,
|
| GLsizei coeffsBufsize) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoCoverageModulationCHROMIUM(
|
| GLenum components) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error GLES2DecoderPassthroughImpl::DoBlendBarrierKHR() {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| error::Error
|
| GLES2DecoderPassthroughImpl::DoApplyScreenSpaceAntialiasingCHROMIUM() {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -2144,6 +3034,7 @@ error::Error GLES2DecoderPassthroughImpl::DoBindFragDataLocationIndexedEXT(
|
| GLuint colorNumber,
|
| GLuint index,
|
| const char* name) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -2151,6 +3042,7 @@ error::Error GLES2DecoderPassthroughImpl::DoBindFragDataLocationEXT(
|
| GLuint program,
|
| GLuint colorNumber,
|
| const char* name) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -2158,6 +3050,7 @@ error::Error GLES2DecoderPassthroughImpl::DoGetFragDataIndexEXT(
|
| GLuint program,
|
| const char* name,
|
| GLint* index) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
| @@ -2166,6 +3059,7 @@ GLES2DecoderPassthroughImpl::DoUniformMatrix4fvStreamTextureMatrixCHROMIUM(
|
| GLint location,
|
| GLboolean transpose,
|
| const volatile GLfloat* defaultValue) {
|
| + NOTIMPLEMENTED();
|
| return error::kNoError;
|
| }
|
|
|
|
|