// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py // It's formatted by clang-format using chromium coding style: // clang-format -i -style=chromium filename // DO NOT EDIT! // This file is included by gles2_implementation.cc to define the // GL api functions. #ifndef GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_IMPL_AUTOGEN_H_ #define GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_IMPL_AUTOGEN_H_ void GLES2Implementation::AttachShader(GLuint program, GLuint shader) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glAttachShader(" << program << ", " << shader << ")"); helper_->AttachShader(program, shader); CheckGLError(); } void GLES2Implementation::BindBuffer(GLenum target, GLuint buffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindBuffer(" << GLES2Util::GetStringBufferTarget(target) << ", " << buffer << ")"); if (IsBufferReservedId(buffer)) { SetGLError(GL_INVALID_OPERATION, "BindBuffer", "buffer reserved id"); return; } BindBufferHelper(target, buffer); CheckGLError(); } void GLES2Implementation::BindBufferBase(GLenum target, GLuint index, GLuint buffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindBufferBase(" << GLES2Util::GetStringIndexedBufferTarget(target) << ", " << index << ", " << buffer << ")"); if (IsBufferReservedId(buffer)) { SetGLError(GL_INVALID_OPERATION, "BindBufferBase", "buffer reserved id"); return; } BindBufferBaseHelper(target, index, buffer); CheckGLError(); } void GLES2Implementation::BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindBufferRange(" << GLES2Util::GetStringIndexedBufferTarget(target) << ", " << index << ", " << buffer << ", " << offset << ", " << size << ")"); if (offset < 0) { SetGLError(GL_INVALID_VALUE, "glBindBufferRange", "offset < 0"); return; } if (size < 0) { SetGLError(GL_INVALID_VALUE, "glBindBufferRange", "size < 0"); return; } if (IsBufferReservedId(buffer)) { SetGLError(GL_INVALID_OPERATION, "BindBufferRange", "buffer reserved id"); return; } BindBufferRangeHelper(target, index, buffer, offset, size); CheckGLError(); } void GLES2Implementation::BindFramebuffer(GLenum target, GLuint framebuffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindFramebuffer(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << framebuffer << ")"); if (IsFramebufferReservedId(framebuffer)) { SetGLError(GL_INVALID_OPERATION, "BindFramebuffer", "framebuffer reserved id"); return; } BindFramebufferHelper(target, framebuffer); CheckGLError(); } void GLES2Implementation::BindRenderbuffer(GLenum target, GLuint renderbuffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindRenderbuffer(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << renderbuffer << ")"); if (IsRenderbufferReservedId(renderbuffer)) { SetGLError(GL_INVALID_OPERATION, "BindRenderbuffer", "renderbuffer reserved id"); return; } BindRenderbufferHelper(target, renderbuffer); CheckGLError(); } void GLES2Implementation::BindSampler(GLuint unit, GLuint sampler) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindSampler(" << unit << ", " << sampler << ")"); if (IsSamplerReservedId(sampler)) { SetGLError(GL_INVALID_OPERATION, "BindSampler", "sampler reserved id"); return; } BindSamplerHelper(unit, sampler); CheckGLError(); } void GLES2Implementation::BindTexture(GLenum target, GLuint texture) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindTexture(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << texture << ")"); if (IsTextureReservedId(texture)) { SetGLError(GL_INVALID_OPERATION, "BindTexture", "texture reserved id"); return; } BindTextureHelper(target, texture); CheckGLError(); } void GLES2Implementation::BindTransformFeedback(GLenum target, GLuint transformfeedback) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindTransformFeedback(" << GLES2Util::GetStringTransformFeedbackBindTarget(target) << ", " << transformfeedback << ")"); if (IsTransformFeedbackReservedId(transformfeedback)) { SetGLError(GL_INVALID_OPERATION, "BindTransformFeedback", "transformfeedback reserved id"); return; } BindTransformFeedbackHelper(target, transformfeedback); CheckGLError(); } void GLES2Implementation::BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendColor(" << red << ", " << green << ", " << blue << ", " << alpha << ")"); helper_->BlendColor(red, green, blue, alpha); CheckGLError(); } void GLES2Implementation::BlendEquation(GLenum mode) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendEquation(" << GLES2Util::GetStringEquation(mode) << ")"); helper_->BlendEquation(mode); CheckGLError(); } void GLES2Implementation::BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendEquationSeparate(" << GLES2Util::GetStringEquation(modeRGB) << ", " << GLES2Util::GetStringEquation(modeAlpha) << ")"); helper_->BlendEquationSeparate(modeRGB, modeAlpha); CheckGLError(); } void GLES2Implementation::BlendFunc(GLenum sfactor, GLenum dfactor) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendFunc(" << GLES2Util::GetStringSrcBlendFactor(sfactor) << ", " << GLES2Util::GetStringDstBlendFactor(dfactor) << ")"); helper_->BlendFunc(sfactor, dfactor); CheckGLError(); } void GLES2Implementation::BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendFuncSeparate(" << GLES2Util::GetStringSrcBlendFactor(srcRGB) << ", " << GLES2Util::GetStringDstBlendFactor(dstRGB) << ", " << GLES2Util::GetStringSrcBlendFactor(srcAlpha) << ", " << GLES2Util::GetStringDstBlendFactor(dstAlpha) << ")"); helper_->BlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); CheckGLError(); } GLenum GLES2Implementation::CheckFramebufferStatus(GLenum target) { GPU_CLIENT_SINGLE_THREAD_CHECK(); TRACE_EVENT0("gpu", "GLES2Implementation::CheckFramebufferStatus"); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCheckFramebufferStatus(" << GLES2Util::GetStringFrameBufferTarget(target) << ")"); typedef cmds::CheckFramebufferStatus::Result Result; Result* result = GetResultAs(); if (!result) { return GL_FRAMEBUFFER_UNSUPPORTED; } *result = 0; helper_->CheckFramebufferStatus(target, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); GLenum result_value = *result; GPU_CLIENT_LOG("returned " << result_value); CheckGLError(); return result_value; } void GLES2Implementation::Clear(GLbitfield mask) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClear(" << mask << ")"); helper_->Clear(mask); CheckGLError(); } void GLES2Implementation::ClearBufferfi(GLenum buffer, GLint drawbuffers, GLfloat depth, GLint stencil) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearBufferfi(" << GLES2Util::GetStringBufferfv(buffer) << ", " << drawbuffers << ", " << depth << ", " << stencil << ")"); helper_->ClearBufferfi(buffer, drawbuffers, depth, stencil); CheckGLError(); } void GLES2Implementation::ClearBufferfv(GLenum buffer, GLint drawbuffers, const GLfloat* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearBufferfv(" << GLES2Util::GetStringBufferfv(buffer) << ", " << drawbuffers << ", " << static_cast(value) << ")"); size_t count = GLES2Util::CalcClearBufferfvDataCount(buffer); DCHECK_LE(count, 4u); for (size_t ii = 0; ii < count; ++ii) GPU_CLIENT_LOG("value[" << ii << "]: " << value[ii]); helper_->ClearBufferfvImmediate(buffer, drawbuffers, value); CheckGLError(); } void GLES2Implementation::ClearBufferiv(GLenum buffer, GLint drawbuffers, const GLint* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearBufferiv(" << GLES2Util::GetStringBufferiv(buffer) << ", " << drawbuffers << ", " << static_cast(value) << ")"); size_t count = GLES2Util::CalcClearBufferivDataCount(buffer); DCHECK_LE(count, 4u); for (size_t ii = 0; ii < count; ++ii) GPU_CLIENT_LOG("value[" << ii << "]: " << value[ii]); helper_->ClearBufferivImmediate(buffer, drawbuffers, value); CheckGLError(); } void GLES2Implementation::ClearBufferuiv(GLenum buffer, GLint drawbuffers, const GLuint* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearBufferuiv(" << GLES2Util::GetStringBufferuiv(buffer) << ", " << drawbuffers << ", " << static_cast(value) << ")"); size_t count = 4; for (size_t ii = 0; ii < count; ++ii) GPU_CLIENT_LOG("value[" << ii << "]: " << value[ii]); helper_->ClearBufferuivImmediate(buffer, drawbuffers, value); CheckGLError(); } void GLES2Implementation::ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearColor(" << red << ", " << green << ", " << blue << ", " << alpha << ")"); helper_->ClearColor(red, green, blue, alpha); CheckGLError(); } void GLES2Implementation::ClearDepthf(GLclampf depth) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearDepthf(" << depth << ")"); helper_->ClearDepthf(depth); CheckGLError(); } void GLES2Implementation::ClearStencil(GLint s) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearStencil(" << s << ")"); helper_->ClearStencil(s); CheckGLError(); } void GLES2Implementation::ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glColorMask(" << GLES2Util::GetStringBool(red) << ", " << GLES2Util::GetStringBool(green) << ", " << GLES2Util::GetStringBool(blue) << ", " << GLES2Util::GetStringBool(alpha) << ")"); helper_->ColorMask(red, green, blue, alpha); CheckGLError(); } void GLES2Implementation::CompileShader(GLuint shader) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCompileShader(" << shader << ")"); helper_->CompileShader(shader); CheckGLError(); } void GLES2Implementation::CopyBufferSubData(GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyBufferSubData(" << GLES2Util::GetStringBufferTarget(readtarget) << ", " << GLES2Util::GetStringBufferTarget(writetarget) << ", " << readoffset << ", " << writeoffset << ", " << size << ")"); if (readoffset < 0) { SetGLError(GL_INVALID_VALUE, "glCopyBufferSubData", "readoffset < 0"); return; } if (writeoffset < 0) { SetGLError(GL_INVALID_VALUE, "glCopyBufferSubData", "writeoffset < 0"); return; } if (size < 0) { SetGLError(GL_INVALID_VALUE, "glCopyBufferSubData", "size < 0"); return; } helper_->CopyBufferSubData(readtarget, writetarget, readoffset, writeoffset, size); CheckGLError(); } void GLES2Implementation::CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG( "[" << GetLogPrefix() << "] glCopyTexImage2D(" << GLES2Util::GetStringTextureTarget(target) << ", " << level << ", " << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", " << x << ", " << y << ", " << width << ", " << height << ", " << border << ")"); if (width < 0) { SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D", "width < 0"); return; } if (height < 0) { SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D", "height < 0"); return; } if (border != 0) { SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D", "border GL_INVALID_VALUE"); return; } helper_->CopyTexImage2D(target, level, internalformat, x, y, width, height); CheckGLError(); } void GLES2Implementation::CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTexSubImage2D(" << GLES2Util::GetStringTextureTarget(target) << ", " << level << ", " << xoffset << ", " << yoffset << ", " << x << ", " << y << ", " << width << ", " << height << ")"); if (width < 0) { SetGLError(GL_INVALID_VALUE, "glCopyTexSubImage2D", "width < 0"); return; } if (height < 0) { SetGLError(GL_INVALID_VALUE, "glCopyTexSubImage2D", "height < 0"); return; } helper_->CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); CheckGLError(); } void GLES2Implementation::CopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTexSubImage3D(" << GLES2Util::GetStringTexture3DTarget(target) << ", " << level << ", " << xoffset << ", " << yoffset << ", " << zoffset << ", " << x << ", " << y << ", " << width << ", " << height << ")"); if (width < 0) { SetGLError(GL_INVALID_VALUE, "glCopyTexSubImage3D", "width < 0"); return; } if (height < 0) { SetGLError(GL_INVALID_VALUE, "glCopyTexSubImage3D", "height < 0"); return; } helper_->CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); CheckGLError(); } GLuint GLES2Implementation::CreateProgram() { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateProgram(" << ")"); GLuint client_id; GetIdHandler(id_namespaces::kProgramsAndShaders) ->MakeIds(this, 0, 1, &client_id); helper_->CreateProgram(client_id); GPU_CLIENT_LOG("returned " << client_id); CheckGLError(); return client_id; } GLuint GLES2Implementation::CreateShader(GLenum type) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateShader(" << GLES2Util::GetStringShaderType(type) << ")"); GLuint client_id; GetIdHandler(id_namespaces::kProgramsAndShaders) ->MakeIds(this, 0, 1, &client_id); helper_->CreateShader(type, client_id); GPU_CLIENT_LOG("returned " << client_id); CheckGLError(); return client_id; } void GLES2Implementation::CullFace(GLenum mode) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCullFace(" << GLES2Util::GetStringFaceType(mode) << ")"); helper_->CullFace(mode); CheckGLError(); } void GLES2Implementation::DeleteBuffers(GLsizei n, const GLuint* buffers) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteBuffers(" << n << ", " << static_cast(buffers) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << buffers[i]); } }); GPU_CLIENT_DCHECK_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { DCHECK(buffers[i] != 0); } }); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glDeleteBuffers", "n < 0"); return; } DeleteBuffersHelper(n, buffers); CheckGLError(); } void GLES2Implementation::DeleteFramebuffers(GLsizei n, const GLuint* framebuffers) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteFramebuffers(" << n << ", " << static_cast(framebuffers) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << framebuffers[i]); } }); GPU_CLIENT_DCHECK_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { DCHECK(framebuffers[i] != 0); } }); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glDeleteFramebuffers", "n < 0"); return; } DeleteFramebuffersHelper(n, framebuffers); CheckGLError(); } void GLES2Implementation::DeleteProgram(GLuint program) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteProgram(" << program << ")"); GPU_CLIENT_DCHECK(program != 0); DeleteProgramHelper(program); CheckGLError(); } void GLES2Implementation::DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteRenderbuffers(" << n << ", " << static_cast(renderbuffers) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << renderbuffers[i]); } }); GPU_CLIENT_DCHECK_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { DCHECK(renderbuffers[i] != 0); } }); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glDeleteRenderbuffers", "n < 0"); return; } DeleteRenderbuffersHelper(n, renderbuffers); CheckGLError(); } void GLES2Implementation::DeleteSamplers(GLsizei n, const GLuint* samplers) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteSamplers(" << n << ", " << static_cast(samplers) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << samplers[i]); } }); GPU_CLIENT_DCHECK_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { DCHECK(samplers[i] != 0); } }); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glDeleteSamplers", "n < 0"); return; } DeleteSamplersHelper(n, 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 << ")"); GPU_CLIENT_DCHECK(shader != 0); DeleteShaderHelper(shader); CheckGLError(); } void GLES2Implementation::DeleteTextures(GLsizei n, const GLuint* textures) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteTextures(" << n << ", " << static_cast(textures) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << textures[i]); } }); GPU_CLIENT_DCHECK_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { DCHECK(textures[i] != 0); } }); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glDeleteTextures", "n < 0"); return; } DeleteTexturesHelper(n, textures); CheckGLError(); } void GLES2Implementation::DeleteTransformFeedbacks(GLsizei n, const GLuint* ids) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteTransformFeedbacks(" << n << ", " << static_cast(ids) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << ids[i]); } }); GPU_CLIENT_DCHECK_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { DCHECK(ids[i] != 0); } }); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glDeleteTransformFeedbacks", "n < 0"); return; } DeleteTransformFeedbacksHelper(n, ids); CheckGLError(); } void GLES2Implementation::DepthFunc(GLenum func) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthFunc(" << GLES2Util::GetStringCmpFunction(func) << ")"); helper_->DepthFunc(func); CheckGLError(); } void GLES2Implementation::DepthMask(GLboolean flag) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthMask(" << GLES2Util::GetStringBool(flag) << ")"); helper_->DepthMask(flag); CheckGLError(); } void GLES2Implementation::DepthRangef(GLclampf zNear, GLclampf zFar) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthRangef(" << zNear << ", " << zFar << ")"); helper_->DepthRangef(zNear, zFar); CheckGLError(); } void GLES2Implementation::DetachShader(GLuint program, GLuint shader) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDetachShader(" << program << ", " << shader << ")"); helper_->DetachShader(program, 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 != GL_SYNC_GPU_COMMANDS_COMPLETE) { 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(client_id); } void GLES2Implementation::FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferRenderbuffer(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringRenderBufferTarget( renderbuffertarget) << ", " << renderbuffer << ")"); helper_->FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); CheckGLError(); } void GLES2Implementation::FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferTexture2D(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringTextureTarget(textarget) << ", " << texture << ", " << level << ")"); if (level != 0) { SetGLError(GL_INVALID_VALUE, "glFramebufferTexture2D", "level GL_INVALID_VALUE"); return; } helper_->FramebufferTexture2D(target, attachment, textarget, texture); CheckGLError(); } void GLES2Implementation::FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferTextureLayer(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << texture << ", " << level << ", " << layer << ")"); helper_->FramebufferTextureLayer(target, attachment, texture, level, layer); CheckGLError(); } void GLES2Implementation::FrontFace(GLenum mode) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFrontFace(" << GLES2Util::GetStringFaceMode(mode) << ")"); helper_->FrontFace(mode); CheckGLError(); } void GLES2Implementation::GenBuffers(GLsizei n, GLuint* buffers) { GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenBuffers(" << n << ", " << static_cast(buffers) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenBuffers", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); GetIdHandler(id_namespaces::kBuffers)->MakeIds(this, 0, n, buffers); GenBuffersHelper(n, buffers); helper_->GenBuffersImmediate(n, buffers); if (share_group_->bind_generates_resource()) helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << buffers[i]); } }); CheckGLError(); } void GLES2Implementation::GenerateMipmap(GLenum target) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenerateMipmap(" << GLES2Util::GetStringTextureBindTarget(target) << ")"); helper_->GenerateMipmap(target); CheckGLError(); } void GLES2Implementation::GenFramebuffers(GLsizei n, GLuint* framebuffers) { GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenFramebuffers(" << n << ", " << static_cast(framebuffers) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenFramebuffers", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); GetIdHandler(id_namespaces::kFramebuffers)->MakeIds(this, 0, n, framebuffers); GenFramebuffersHelper(n, framebuffers); helper_->GenFramebuffersImmediate(n, framebuffers); if (share_group_->bind_generates_resource()) helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << framebuffers[i]); } }); CheckGLError(); } void GLES2Implementation::GenRenderbuffers(GLsizei n, GLuint* renderbuffers) { GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenRenderbuffers(" << n << ", " << static_cast(renderbuffers) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenRenderbuffers", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); GetIdHandler(id_namespaces::kRenderbuffers) ->MakeIds(this, 0, n, renderbuffers); GenRenderbuffersHelper(n, renderbuffers); helper_->GenRenderbuffersImmediate(n, renderbuffers); if (share_group_->bind_generates_resource()) helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << renderbuffers[i]); } }); CheckGLError(); } void GLES2Implementation::GenSamplers(GLsizei n, GLuint* samplers) { GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenSamplers(" << n << ", " << static_cast(samplers) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenSamplers", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); GetIdHandler(id_namespaces::kSamplers)->MakeIds(this, 0, n, samplers); GenSamplersHelper(n, samplers); helper_->GenSamplersImmediate(n, samplers); if (share_group_->bind_generates_resource()) helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << samplers[i]); } }); CheckGLError(); } void GLES2Implementation::GenTextures(GLsizei n, GLuint* textures) { GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenTextures(" << n << ", " << static_cast(textures) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenTextures", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); GetIdHandler(id_namespaces::kTextures)->MakeIds(this, 0, n, textures); GenTexturesHelper(n, textures); helper_->GenTexturesImmediate(n, textures); if (share_group_->bind_generates_resource()) helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << textures[i]); } }); CheckGLError(); } void GLES2Implementation::GenTransformFeedbacks(GLsizei n, GLuint* ids) { GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenTransformFeedbacks(" << n << ", " << static_cast(ids) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenTransformFeedbacks", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); GetIdHandler(id_namespaces::kTransformFeedbacks)->MakeIds(this, 0, n, ids); GenTransformFeedbacksHelper(n, ids); helper_->GenTransformFeedbacksImmediate(n, ids); if (share_group_->bind_generates_resource()) helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << ids[i]); } }); CheckGLError(); } void GLES2Implementation::GetBooleanv(GLenum pname, GLboolean* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLboolean, params); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetBooleanv(" << GLES2Util::GetStringGLState(pname) << ", " << static_cast(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetBooleanv"); if (GetBooleanvHelper(pname, params)) { return; } typedef cmds::GetBooleanv::Result Result; Result* result = GetResultAs(); if (!result) { return; } result->SetNumResults(0); helper_->GetBooleanv(pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } void GLES2Implementation::GetBufferParameteriv(GLenum target, GLenum pname, GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetBufferParameteriv(" << GLES2Util::GetStringBufferTarget(target) << ", " << GLES2Util::GetStringBufferParameter(pname) << ", " << static_cast(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetBufferParameteriv"); if (GetBufferParameterivHelper(target, pname, params)) { return; } typedef cmds::GetBufferParameteriv::Result Result; Result* result = GetResultAs(); if (!result) { return; } result->SetNumResults(0); helper_->GetBufferParameteriv(target, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } void GLES2Implementation::GetFloatv(GLenum pname, GLfloat* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetFloatv(" << GLES2Util::GetStringGLState(pname) << ", " << static_cast(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetFloatv"); if (GetFloatvHelper(pname, params)) { return; } typedef cmds::GetFloatv::Result Result; Result* result = GetResultAs(); if (!result) { return; } result->SetNumResults(0); helper_->GetFloatv(pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } void GLES2Implementation::GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetFramebufferAttachmentParameteriv(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringFrameBufferParameter(pname) << ", " << static_cast(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetFramebufferAttachmentParameteriv"); if (GetFramebufferAttachmentParameterivHelper(target, attachment, pname, params)) { return; } typedef cmds::GetFramebufferAttachmentParameteriv::Result Result; Result* result = GetResultAs(); if (!result) { return; } result->SetNumResults(0); helper_->GetFramebufferAttachmentParameteriv( target, attachment, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } void GLES2Implementation::GetIntegerv(GLenum pname, GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetIntegerv(" << GLES2Util::GetStringGLState(pname) << ", " << static_cast(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetIntegerv"); if (GetIntegervHelper(pname, params)) { return; } typedef cmds::GetIntegerv::Result Result; Result* result = GetResultAs(); if (!result) { return; } result->SetNumResults(0); helper_->GetIntegerv(pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } void GLES2Implementation::GetInternalformativ(GLenum target, GLenum format, GLenum pname, GLsizei bufSize, GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetInternalformativ(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << GLES2Util::GetStringRenderBufferFormat(format) << ", " << GLES2Util::GetStringRenderBufferParameter(pname) << ", " << bufSize << ", " << static_cast(params) << ")"); if (bufSize < 0) { SetGLError(GL_INVALID_VALUE, "glGetInternalformativ", "bufSize < 0"); return; } TRACE_EVENT0("gpu", "GLES2Implementation::GetInternalformativ"); if (GetInternalformativHelper(target, format, pname, bufSize, params)) { return; } typedef cmds::GetInternalformativ::Result Result; Result* result = GetResultAs(); if (!result) { return; } result->SetNumResults(0); helper_->GetInternalformativ(target, format, pname, bufSize, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } void GLES2Implementation::GetProgramiv(GLuint program, GLenum pname, GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetProgramiv(" << program << ", " << GLES2Util::GetStringProgramParameter(pname) << ", " << static_cast(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetProgramiv"); if (GetProgramivHelper(program, pname, params)) { return; } typedef cmds::GetProgramiv::Result Result; Result* result = GetResultAs(); if (!result) { return; } result->SetNumResults(0); helper_->GetProgramiv(program, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } void GLES2Implementation::GetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetProgramInfoLog" << "(" << program << ", " << bufsize << ", " << static_cast(length) << ", " << static_cast(infolog) << ")"); helper_->SetBucketSize(kResultBucketId, 0); helper_->GetProgramInfoLog(program, kResultBucketId); std::string str; GLsizei max_size = 0; if (GetBucketAsString(kResultBucketId, &str)) { if (bufsize > 0) { max_size = std::min(static_cast(bufsize) - 1, str.size()); memcpy(infolog, str.c_str(), max_size); infolog[max_size] = '\0'; GPU_CLIENT_LOG("------\n" << infolog << "\n------"); } } if (length != NULL) { *length = max_size; } CheckGLError(); } void GLES2Implementation::GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetRenderbufferParameteriv(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << GLES2Util::GetStringRenderBufferParameter(pname) << ", " << static_cast(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetRenderbufferParameteriv"); if (GetRenderbufferParameterivHelper(target, pname, params)) { return; } typedef cmds::GetRenderbufferParameteriv::Result Result; Result* result = GetResultAs(); if (!result) { return; } result->SetNumResults(0); helper_->GetRenderbufferParameteriv(target, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } void GLES2Implementation::GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetSamplerParameterfv(" << sampler << ", " << GLES2Util::GetStringSamplerParameter(pname) << ", " << static_cast(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetSamplerParameterfv"); if (GetSamplerParameterfvHelper(sampler, pname, params)) { return; } typedef cmds::GetSamplerParameterfv::Result Result; Result* result = GetResultAs(); if (!result) { return; } result->SetNumResults(0); helper_->GetSamplerParameterfv(sampler, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } void GLES2Implementation::GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetSamplerParameteriv(" << sampler << ", " << GLES2Util::GetStringSamplerParameter(pname) << ", " << static_cast(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetSamplerParameteriv"); if (GetSamplerParameterivHelper(sampler, pname, params)) { return; } typedef cmds::GetSamplerParameteriv::Result Result; Result* result = GetResultAs(); if (!result) { return; } result->SetNumResults(0); helper_->GetSamplerParameteriv(sampler, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } void GLES2Implementation::GetShaderiv(GLuint shader, GLenum pname, GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetShaderiv(" << shader << ", " << GLES2Util::GetStringShaderParameter(pname) << ", " << static_cast(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetShaderiv"); if (GetShaderivHelper(shader, pname, params)) { return; } typedef cmds::GetShaderiv::Result Result; Result* result = GetResultAs(); if (!result) { return; } result->SetNumResults(0); helper_->GetShaderiv(shader, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } void GLES2Implementation::GetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetShaderInfoLog" << "(" << shader << ", " << bufsize << ", " << static_cast(length) << ", " << static_cast(infolog) << ")"); helper_->SetBucketSize(kResultBucketId, 0); helper_->GetShaderInfoLog(shader, kResultBucketId); std::string str; GLsizei max_size = 0; if (GetBucketAsString(kResultBucketId, &str)) { if (bufsize > 0) { max_size = std::min(static_cast(bufsize) - 1, str.size()); memcpy(infolog, str.c_str(), max_size); infolog[max_size] = '\0'; GPU_CLIENT_LOG("------\n" << infolog << "\n------"); } } if (length != NULL) { *length = max_size; } CheckGLError(); } void GLES2Implementation::GetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetShaderSource" << "(" << shader << ", " << bufsize << ", " << static_cast(length) << ", " << static_cast(source) << ")"); helper_->SetBucketSize(kResultBucketId, 0); helper_->GetShaderSource(shader, kResultBucketId); std::string str; GLsizei max_size = 0; if (GetBucketAsString(kResultBucketId, &str)) { if (bufsize > 0) { max_size = std::min(static_cast(bufsize) - 1, str.size()); memcpy(source, str.c_str(), max_size); source[max_size] = '\0'; GPU_CLIENT_LOG("------\n" << source << "\n------"); } } if (length != NULL) { *length = max_size; } CheckGLError(); } void GLES2Implementation::GetSynciv(GLsync sync, GLenum pname, GLsizei bufsize, GLsizei* length, GLint* values) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, values); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetSynciv(" << sync << ", " << GLES2Util::GetStringSyncParameter(pname) << ", " << bufsize << ", " << static_cast(length) << ", " << static_cast(values) << ")"); if (bufsize < 0) { SetGLError(GL_INVALID_VALUE, "glGetSynciv", "bufsize < 0"); return; } TRACE_EVENT0("gpu", "GLES2Implementation::GetSynciv"); if (GetSyncivHelper(sync, pname, bufsize, length, values)) { return; } typedef cmds::GetSynciv::Result Result; Result* result = GetResultAs(); if (!result) { return; } result->SetNumResults(0); helper_->GetSynciv(ToGLuint(sync), pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(values); GPU_CLIENT_LOG_CODE_BLOCK({ for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); if (length) { *length = result->GetNumResults(); } CheckGLError(); } void GLES2Implementation::GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetTexParameterfv(" << GLES2Util::GetStringGetTexParamTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetTexParameterfv"); if (GetTexParameterfvHelper(target, pname, params)) { return; } typedef cmds::GetTexParameterfv::Result Result; Result* result = GetResultAs(); if (!result) { return; } result->SetNumResults(0); helper_->GetTexParameterfv(target, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } void GLES2Implementation::GetTexParameteriv(GLenum target, GLenum pname, GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetTexParameteriv(" << GLES2Util::GetStringGetTexParamTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetTexParameteriv"); if (GetTexParameterivHelper(target, pname, params)) { return; } typedef cmds::GetTexParameteriv::Result Result; Result* result = GetResultAs(); if (!result) { return; } result->SetNumResults(0); helper_->GetTexParameteriv(target, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } void GLES2Implementation::Hint(GLenum target, GLenum mode) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glHint(" << GLES2Util::GetStringHintTarget(target) << ", " << GLES2Util::GetStringHintMode(mode) << ")"); helper_->Hint(target, mode); CheckGLError(); } void GLES2Implementation::InvalidateFramebuffer(GLenum target, GLsizei count, const GLenum* attachments) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glInvalidateFramebuffer(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << count << ", " << static_cast(attachments) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << attachments[0 + i * 1]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glInvalidateFramebuffer", "count < 0"); return; } helper_->InvalidateFramebufferImmediate(target, count, attachments); CheckGLError(); } void GLES2Implementation::InvalidateSubFramebuffer(GLenum target, GLsizei count, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glInvalidateSubFramebuffer(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << count << ", " << static_cast(attachments) << ", " << x << ", " << y << ", " << width << ", " << height << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << attachments[0 + i * 1]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glInvalidateSubFramebuffer", "count < 0"); return; } if (width < 0) { SetGLError(GL_INVALID_VALUE, "glInvalidateSubFramebuffer", "width < 0"); return; } if (height < 0) { SetGLError(GL_INVALID_VALUE, "glInvalidateSubFramebuffer", "height < 0"); return; } helper_->InvalidateSubFramebufferImmediate(target, count, attachments, x, y, width, height); CheckGLError(); } GLboolean GLES2Implementation::IsBuffer(GLuint buffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); TRACE_EVENT0("gpu", "GLES2Implementation::IsBuffer"); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsBuffer(" << buffer << ")"); typedef cmds::IsBuffer::Result Result; Result* result = GetResultAs(); if (!result) { return GL_FALSE; } *result = 0; helper_->IsBuffer(buffer, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); GLboolean result_value = *result != 0; GPU_CLIENT_LOG("returned " << result_value); CheckGLError(); return result_value; } GLboolean GLES2Implementation::IsFramebuffer(GLuint framebuffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); TRACE_EVENT0("gpu", "GLES2Implementation::IsFramebuffer"); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsFramebuffer(" << framebuffer << ")"); typedef cmds::IsFramebuffer::Result Result; Result* result = GetResultAs(); if (!result) { return GL_FALSE; } *result = 0; helper_->IsFramebuffer(framebuffer, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); GLboolean result_value = *result != 0; GPU_CLIENT_LOG("returned " << result_value); CheckGLError(); return result_value; } GLboolean GLES2Implementation::IsProgram(GLuint program) { GPU_CLIENT_SINGLE_THREAD_CHECK(); TRACE_EVENT0("gpu", "GLES2Implementation::IsProgram"); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsProgram(" << program << ")"); typedef cmds::IsProgram::Result Result; Result* result = GetResultAs(); if (!result) { return GL_FALSE; } *result = 0; helper_->IsProgram(program, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); GLboolean result_value = *result != 0; GPU_CLIENT_LOG("returned " << result_value); CheckGLError(); return result_value; } GLboolean GLES2Implementation::IsRenderbuffer(GLuint renderbuffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); TRACE_EVENT0("gpu", "GLES2Implementation::IsRenderbuffer"); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsRenderbuffer(" << renderbuffer << ")"); typedef cmds::IsRenderbuffer::Result Result; Result* result = GetResultAs(); if (!result) { return GL_FALSE; } *result = 0; helper_->IsRenderbuffer(renderbuffer, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); GLboolean result_value = *result != 0; GPU_CLIENT_LOG("returned " << result_value); CheckGLError(); return result_value; } GLboolean GLES2Implementation::IsSampler(GLuint sampler) { GPU_CLIENT_SINGLE_THREAD_CHECK(); TRACE_EVENT0("gpu", "GLES2Implementation::IsSampler"); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsSampler(" << sampler << ")"); typedef cmds::IsSampler::Result Result; Result* result = GetResultAs(); if (!result) { return GL_FALSE; } *result = 0; helper_->IsSampler(sampler, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); GLboolean result_value = *result != 0; GPU_CLIENT_LOG("returned " << result_value); CheckGLError(); return result_value; } GLboolean GLES2Implementation::IsShader(GLuint shader) { GPU_CLIENT_SINGLE_THREAD_CHECK(); TRACE_EVENT0("gpu", "GLES2Implementation::IsShader"); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsShader(" << shader << ")"); typedef cmds::IsShader::Result Result; Result* result = GetResultAs(); if (!result) { return GL_FALSE; } *result = 0; helper_->IsShader(shader, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); GLboolean result_value = *result != 0; GPU_CLIENT_LOG("returned " << result_value); CheckGLError(); 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(); 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"); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsTexture(" << texture << ")"); typedef cmds::IsTexture::Result Result; Result* result = GetResultAs(); if (!result) { return GL_FALSE; } *result = 0; helper_->IsTexture(texture, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); GLboolean result_value = *result != 0; GPU_CLIENT_LOG("returned " << result_value); CheckGLError(); return result_value; } GLboolean GLES2Implementation::IsTransformFeedback(GLuint transformfeedback) { GPU_CLIENT_SINGLE_THREAD_CHECK(); TRACE_EVENT0("gpu", "GLES2Implementation::IsTransformFeedback"); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsTransformFeedback(" << transformfeedback << ")"); typedef cmds::IsTransformFeedback::Result Result; Result* result = GetResultAs(); if (!result) { return GL_FALSE; } *result = 0; helper_->IsTransformFeedback(transformfeedback, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); GLboolean result_value = *result != 0; GPU_CLIENT_LOG("returned " << result_value); CheckGLError(); return result_value; } void GLES2Implementation::LineWidth(GLfloat width) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glLineWidth(" << width << ")"); helper_->LineWidth(width); CheckGLError(); } void GLES2Implementation::PauseTransformFeedback() { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPauseTransformFeedback(" << ")"); helper_->PauseTransformFeedback(); CheckGLError(); } void GLES2Implementation::PolygonOffset(GLfloat factor, GLfloat units) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPolygonOffset(" << factor << ", " << units << ")"); helper_->PolygonOffset(factor, units); CheckGLError(); } void GLES2Implementation::ReadBuffer(GLenum src) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glReadBuffer(" << GLES2Util::GetStringEnum(src) << ")"); helper_->ReadBuffer(src); CheckGLError(); } void GLES2Implementation::ReleaseShaderCompiler() { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glReleaseShaderCompiler(" << ")"); helper_->ReleaseShaderCompiler(); CheckGLError(); } void GLES2Implementation::RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glRenderbufferStorage(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << GLES2Util::GetStringRenderBufferFormat(internalformat) << ", " << width << ", " << height << ")"); if (width < 0) { SetGLError(GL_INVALID_VALUE, "glRenderbufferStorage", "width < 0"); return; } if (height < 0) { SetGLError(GL_INVALID_VALUE, "glRenderbufferStorage", "height < 0"); return; } helper_->RenderbufferStorage(target, internalformat, width, height); CheckGLError(); } void GLES2Implementation::ResumeTransformFeedback() { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glResumeTransformFeedback(" << ")"); helper_->ResumeTransformFeedback(); CheckGLError(); } void GLES2Implementation::SampleCoverage(GLclampf value, GLboolean invert) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glSampleCoverage(" << value << ", " << GLES2Util::GetStringBool(invert) << ")"); helper_->SampleCoverage(value, invert); CheckGLError(); } void GLES2Implementation::SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glSamplerParameterf(" << sampler << ", " << GLES2Util::GetStringSamplerParameter(pname) << ", " << param << ")"); helper_->SamplerParameterf(sampler, pname, param); CheckGLError(); } void GLES2Implementation::SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glSamplerParameterfv(" << sampler << ", " << GLES2Util::GetStringSamplerParameter(pname) << ", " << static_cast(params) << ")"); size_t count = 1; for (size_t ii = 0; ii < count; ++ii) GPU_CLIENT_LOG("value[" << ii << "]: " << params[ii]); helper_->SamplerParameterfvImmediate(sampler, pname, params); CheckGLError(); } void GLES2Implementation::SamplerParameteri(GLuint sampler, GLenum pname, GLint param) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glSamplerParameteri(" << sampler << ", " << GLES2Util::GetStringSamplerParameter(pname) << ", " << param << ")"); helper_->SamplerParameteri(sampler, pname, param); CheckGLError(); } void GLES2Implementation::SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glSamplerParameteriv(" << sampler << ", " << GLES2Util::GetStringSamplerParameter(pname) << ", " << static_cast(params) << ")"); size_t count = 1; for (size_t ii = 0; ii < count; ++ii) GPU_CLIENT_LOG("value[" << ii << "]: " << params[ii]); helper_->SamplerParameterivImmediate(sampler, pname, params); CheckGLError(); } void GLES2Implementation::Scissor(GLint x, GLint y, GLsizei width, GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glScissor(" << x << ", " << y << ", " << width << ", " << height << ")"); if (width < 0) { SetGLError(GL_INVALID_VALUE, "glScissor", "width < 0"); return; } if (height < 0) { SetGLError(GL_INVALID_VALUE, "glScissor", "height < 0"); return; } helper_->Scissor(x, y, width, height); 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(str) << ", " << static_cast(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; } if (!PackStringsToBucket(count, str, length, "glShaderSource")) { return; } 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(" << GLES2Util::GetStringCmpFunction(func) << ", " << ref << ", " << mask << ")"); helper_->StencilFunc(func, ref, mask); CheckGLError(); } void GLES2Implementation::StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilFuncSeparate(" << GLES2Util::GetStringFaceType(face) << ", " << GLES2Util::GetStringCmpFunction(func) << ", " << ref << ", " << mask << ")"); helper_->StencilFuncSeparate(face, func, ref, mask); CheckGLError(); } void GLES2Implementation::StencilMask(GLuint mask) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilMask(" << mask << ")"); helper_->StencilMask(mask); CheckGLError(); } void GLES2Implementation::StencilMaskSeparate(GLenum face, GLuint mask) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilMaskSeparate(" << GLES2Util::GetStringFaceType(face) << ", " << mask << ")"); helper_->StencilMaskSeparate(face, mask); CheckGLError(); } void GLES2Implementation::StencilOp(GLenum fail, GLenum zfail, GLenum zpass) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilOp(" << GLES2Util::GetStringStencilOp(fail) << ", " << GLES2Util::GetStringStencilOp(zfail) << ", " << GLES2Util::GetStringStencilOp(zpass) << ")"); helper_->StencilOp(fail, zfail, zpass); CheckGLError(); } void GLES2Implementation::StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilOpSeparate(" << GLES2Util::GetStringFaceType(face) << ", " << GLES2Util::GetStringStencilOp(fail) << ", " << GLES2Util::GetStringStencilOp(zfail) << ", " << GLES2Util::GetStringStencilOp(zpass) << ")"); helper_->StencilOpSeparate(face, fail, zfail, zpass); CheckGLError(); } void GLES2Implementation::TexParameterf(GLenum target, GLenum pname, GLfloat param) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameterf(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << param << ")"); helper_->TexParameterf(target, pname, param); CheckGLError(); } void GLES2Implementation::TexParameterfv(GLenum target, GLenum pname, const GLfloat* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameterfv(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast(params) << ")"); size_t count = 1; for (size_t ii = 0; ii < count; ++ii) GPU_CLIENT_LOG("value[" << ii << "]: " << params[ii]); helper_->TexParameterfvImmediate(target, pname, params); CheckGLError(); } void GLES2Implementation::TexParameteri(GLenum target, GLenum pname, GLint param) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameteri(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << param << ")"); helper_->TexParameteri(target, pname, param); CheckGLError(); } void GLES2Implementation::TexParameteriv(GLenum target, GLenum pname, const GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameteriv(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast(params) << ")"); size_t count = 1; for (size_t ii = 0; ii < count; ++ii) GPU_CLIENT_LOG("value[" << ii << "]: " << params[ii]); helper_->TexParameterivImmediate(target, pname, params); CheckGLError(); } void GLES2Implementation::TexStorage3D(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG( "[" << GetLogPrefix() << "] glTexStorage3D(" << GLES2Util::GetStringTexture3DTarget(target) << ", " << levels << ", " << GLES2Util::GetStringTextureInternalFormatStorage(internalFormat) << ", " << width << ", " << height << ", " << depth << ")"); if (levels < 0) { SetGLError(GL_INVALID_VALUE, "glTexStorage3D", "levels < 0"); return; } if (width < 0) { SetGLError(GL_INVALID_VALUE, "glTexStorage3D", "width < 0"); return; } if (height < 0) { SetGLError(GL_INVALID_VALUE, "glTexStorage3D", "height < 0"); return; } if (depth < 0) { SetGLError(GL_INVALID_VALUE, "glTexStorage3D", "depth < 0"); return; } helper_->TexStorage3D(target, levels, internalFormat, width, height, depth); CheckGLError(); } void GLES2Implementation::TransformFeedbackVaryings(GLuint program, GLsizei count, const char* const* varyings, GLenum buffermode) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTransformFeedbackVaryings(" << program << ", " << count << ", " << static_cast(varyings) << ", " << GLES2Util::GetStringBufferMode(buffermode) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei ii = 0; ii < count; ++ii) { if (varyings[ii]) { GPU_CLIENT_LOG(" " << ii << ": ---\n" << varyings[ii] << "\n---"); } else { GPU_CLIENT_LOG(" " << ii << ": NULL"); } } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glTransformFeedbackVaryings", "count < 0"); return; } if (!PackStringsToBucket(count, varyings, NULL, "glTransformFeedbackVaryings")) { return; } helper_->TransformFeedbackVaryingsBucket(program, kResultBucketId, buffermode); helper_->SetBucketSize(kResultBucketId, 0); CheckGLError(); } void GLES2Implementation::Uniform1f(GLint location, GLfloat x) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1f(" << location << ", " << x << ")"); helper_->Uniform1f(location, x); CheckGLError(); } void GLES2Implementation::Uniform1fv(GLint location, GLsizei count, const GLfloat* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1fv(" << location << ", " << count << ", " << static_cast(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 1]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniform1fv", "count < 0"); return; } helper_->Uniform1fvImmediate(location, count, v); CheckGLError(); } void GLES2Implementation::Uniform1i(GLint location, GLint x) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1i(" << location << ", " << x << ")"); helper_->Uniform1i(location, x); CheckGLError(); } void GLES2Implementation::Uniform1iv(GLint location, GLsizei count, const GLint* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1iv(" << location << ", " << count << ", " << static_cast(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 1]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniform1iv", "count < 0"); return; } helper_->Uniform1ivImmediate(location, count, v); CheckGLError(); } void GLES2Implementation::Uniform1ui(GLint location, GLuint x) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1ui(" << location << ", " << x << ")"); helper_->Uniform1ui(location, x); CheckGLError(); } void GLES2Implementation::Uniform1uiv(GLint location, GLsizei count, const GLuint* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1uiv(" << location << ", " << count << ", " << static_cast(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 1]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniform1uiv", "count < 0"); return; } helper_->Uniform1uivImmediate(location, count, v); CheckGLError(); } void GLES2Implementation::Uniform2f(GLint location, GLfloat x, GLfloat y) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2f(" << location << ", " << x << ", " << y << ")"); helper_->Uniform2f(location, x, y); CheckGLError(); } void GLES2Implementation::Uniform2fv(GLint location, GLsizei count, const GLfloat* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2fv(" << location << ", " << count << ", " << static_cast(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 2] << ", " << v[1 + i * 2]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniform2fv", "count < 0"); return; } helper_->Uniform2fvImmediate(location, count, v); CheckGLError(); } void GLES2Implementation::Uniform2i(GLint location, GLint x, GLint y) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2i(" << location << ", " << x << ", " << y << ")"); helper_->Uniform2i(location, x, y); CheckGLError(); } void GLES2Implementation::Uniform2iv(GLint location, GLsizei count, const GLint* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2iv(" << location << ", " << count << ", " << static_cast(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 2] << ", " << v[1 + i * 2]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniform2iv", "count < 0"); return; } helper_->Uniform2ivImmediate(location, count, v); CheckGLError(); } void GLES2Implementation::Uniform2ui(GLint location, GLuint x, GLuint y) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2ui(" << location << ", " << x << ", " << y << ")"); helper_->Uniform2ui(location, x, y); CheckGLError(); } void GLES2Implementation::Uniform2uiv(GLint location, GLsizei count, const GLuint* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2uiv(" << location << ", " << count << ", " << static_cast(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 2] << ", " << v[1 + i * 2]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniform2uiv", "count < 0"); return; } helper_->Uniform2uivImmediate(location, count, v); CheckGLError(); } void GLES2Implementation::Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3f(" << location << ", " << x << ", " << y << ", " << z << ")"); helper_->Uniform3f(location, x, y, z); CheckGLError(); } void GLES2Implementation::Uniform3fv(GLint location, GLsizei count, const GLfloat* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3fv(" << location << ", " << count << ", " << static_cast(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 3] << ", " << v[1 + i * 3] << ", " << v[2 + i * 3]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniform3fv", "count < 0"); return; } helper_->Uniform3fvImmediate(location, count, v); CheckGLError(); } void GLES2Implementation::Uniform3i(GLint location, GLint x, GLint y, GLint z) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3i(" << location << ", " << x << ", " << y << ", " << z << ")"); helper_->Uniform3i(location, x, y, z); CheckGLError(); } void GLES2Implementation::Uniform3iv(GLint location, GLsizei count, const GLint* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3iv(" << location << ", " << count << ", " << static_cast(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 3] << ", " << v[1 + i * 3] << ", " << v[2 + i * 3]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniform3iv", "count < 0"); return; } helper_->Uniform3ivImmediate(location, count, v); CheckGLError(); } void GLES2Implementation::Uniform3ui(GLint location, GLuint x, GLuint y, GLuint z) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3ui(" << location << ", " << x << ", " << y << ", " << z << ")"); helper_->Uniform3ui(location, x, y, z); CheckGLError(); } void GLES2Implementation::Uniform3uiv(GLint location, GLsizei count, const GLuint* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3uiv(" << location << ", " << count << ", " << static_cast(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 3] << ", " << v[1 + i * 3] << ", " << v[2 + i * 3]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniform3uiv", "count < 0"); return; } helper_->Uniform3uivImmediate(location, count, v); CheckGLError(); } void GLES2Implementation::Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4f(" << location << ", " << x << ", " << y << ", " << z << ", " << w << ")"); helper_->Uniform4f(location, x, y, z, w); CheckGLError(); } void GLES2Implementation::Uniform4fv(GLint location, GLsizei count, const GLfloat* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4fv(" << location << ", " << count << ", " << static_cast(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 4] << ", " << v[1 + i * 4] << ", " << v[2 + i * 4] << ", " << v[3 + i * 4]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniform4fv", "count < 0"); return; } helper_->Uniform4fvImmediate(location, count, v); CheckGLError(); } void GLES2Implementation::Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4i(" << location << ", " << x << ", " << y << ", " << z << ", " << w << ")"); helper_->Uniform4i(location, x, y, z, w); CheckGLError(); } void GLES2Implementation::Uniform4iv(GLint location, GLsizei count, const GLint* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4iv(" << location << ", " << count << ", " << static_cast(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 4] << ", " << v[1 + i * 4] << ", " << v[2 + i * 4] << ", " << v[3 + i * 4]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniform4iv", "count < 0"); return; } helper_->Uniform4ivImmediate(location, count, v); CheckGLError(); } void GLES2Implementation::Uniform4ui(GLint location, GLuint x, GLuint y, GLuint z, GLuint w) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4ui(" << location << ", " << x << ", " << y << ", " << z << ", " << w << ")"); helper_->Uniform4ui(location, x, y, z, w); CheckGLError(); } void GLES2Implementation::Uniform4uiv(GLint location, GLsizei count, const GLuint* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4uiv(" << location << ", " << count << ", " << static_cast(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 4] << ", " << v[1 + i * 4] << ", " << v[2 + i * 4] << ", " << v[3 + i * 4]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniform4uiv", "count < 0"); return; } helper_->Uniform4uivImmediate(location, count, v); CheckGLError(); } void GLES2Implementation::UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix2fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast(value) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << value[0 + i * 4] << ", " << value[1 + i * 4] << ", " << value[2 + i * 4] << ", " << value[3 + i * 4]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix2fv", "count < 0"); return; } if (transpose != false) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix2fv", "transpose GL_INVALID_VALUE"); return; } helper_->UniformMatrix2fvImmediate(location, count, value); CheckGLError(); } void GLES2Implementation::UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix2x3fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast(value) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << value[0 + i * 6] << ", " << value[1 + i * 6] << ", " << value[2 + i * 6] << ", " << value[3 + i * 6] << ", " << value[4 + i * 6] << ", " << value[5 + i * 6]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix2x3fv", "count < 0"); return; } if (transpose != false) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix2x3fv", "transpose GL_INVALID_VALUE"); return; } helper_->UniformMatrix2x3fvImmediate(location, count, value); CheckGLError(); } void GLES2Implementation::UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix2x4fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast(value) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG( " " << i << ": " << value[0 + i * 8] << ", " << value[1 + i * 8] << ", " << value[2 + i * 8] << ", " << value[3 + i * 8] << ", " << value[4 + i * 8] << ", " << value[5 + i * 8] << ", " << value[6 + i * 8] << ", " << value[7 + i * 8]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix2x4fv", "count < 0"); return; } if (transpose != false) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix2x4fv", "transpose GL_INVALID_VALUE"); return; } helper_->UniformMatrix2x4fvImmediate(location, count, value); CheckGLError(); } void GLES2Implementation::UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix3fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast(value) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << value[0 + i * 9] << ", " << value[1 + i * 9] << ", " << value[2 + i * 9] << ", " << value[3 + i * 9] << ", " << value[4 + i * 9] << ", " << value[5 + i * 9] << ", " << value[6 + i * 9] << ", " << value[7 + i * 9] << ", " << value[8 + i * 9]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix3fv", "count < 0"); return; } if (transpose != false) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix3fv", "transpose GL_INVALID_VALUE"); return; } helper_->UniformMatrix3fvImmediate(location, count, value); CheckGLError(); } void GLES2Implementation::UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix3x2fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast(value) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << value[0 + i * 6] << ", " << value[1 + i * 6] << ", " << value[2 + i * 6] << ", " << value[3 + i * 6] << ", " << value[4 + i * 6] << ", " << value[5 + i * 6]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix3x2fv", "count < 0"); return; } if (transpose != false) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix3x2fv", "transpose GL_INVALID_VALUE"); return; } helper_->UniformMatrix3x2fvImmediate(location, count, value); CheckGLError(); } void GLES2Implementation::UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix3x4fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast(value) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG( " " << i << ": " << value[0 + i * 12] << ", " << value[1 + i * 12] << ", " << value[2 + i * 12] << ", " << value[3 + i * 12] << ", " << value[4 + i * 12] << ", " << value[5 + i * 12] << ", " << value[6 + i * 12] << ", " << value[7 + i * 12] << ", " << value[8 + i * 12] << ", " << value[9 + i * 12] << ", " << value[10 + i * 12] << ", " << value[11 + i * 12]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix3x4fv", "count < 0"); return; } if (transpose != false) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix3x4fv", "transpose GL_INVALID_VALUE"); return; } helper_->UniformMatrix3x4fvImmediate(location, count, value); CheckGLError(); } void GLES2Implementation::UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix4fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast(value) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG( " " << i << ": " << value[0 + i * 16] << ", " << value[1 + i * 16] << ", " << value[2 + i * 16] << ", " << value[3 + i * 16] << ", " << value[4 + i * 16] << ", " << value[5 + i * 16] << ", " << value[6 + i * 16] << ", " << value[7 + i * 16] << ", " << value[8 + i * 16] << ", " << value[9 + i * 16] << ", " << value[10 + i * 16] << ", " << value[11 + i * 16] << ", " << value[12 + i * 16] << ", " << value[13 + i * 16] << ", " << value[14 + i * 16] << ", " << value[15 + i * 16]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix4fv", "count < 0"); return; } if (transpose != false) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix4fv", "transpose GL_INVALID_VALUE"); return; } helper_->UniformMatrix4fvImmediate(location, count, value); CheckGLError(); } void GLES2Implementation::UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix4x2fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast(value) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG( " " << i << ": " << value[0 + i * 8] << ", " << value[1 + i * 8] << ", " << value[2 + i * 8] << ", " << value[3 + i * 8] << ", " << value[4 + i * 8] << ", " << value[5 + i * 8] << ", " << value[6 + i * 8] << ", " << value[7 + i * 8]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix4x2fv", "count < 0"); return; } if (transpose != false) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix4x2fv", "transpose GL_INVALID_VALUE"); return; } helper_->UniformMatrix4x2fvImmediate(location, count, value); CheckGLError(); } void GLES2Implementation::UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix4x3fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast(value) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG( " " << i << ": " << value[0 + i * 12] << ", " << value[1 + i * 12] << ", " << value[2 + i * 12] << ", " << value[3 + i * 12] << ", " << value[4 + i * 12] << ", " << value[5 + i * 12] << ", " << value[6 + i * 12] << ", " << value[7 + i * 12] << ", " << value[8 + i * 12] << ", " << value[9 + i * 12] << ", " << value[10 + i * 12] << ", " << value[11 + i * 12]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix4x3fv", "count < 0"); return; } if (transpose != false) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix4x3fv", "transpose GL_INVALID_VALUE"); return; } helper_->UniformMatrix4x3fvImmediate(location, count, value); CheckGLError(); } void GLES2Implementation::UseProgram(GLuint program) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUseProgram(" << program << ")"); if (IsProgramReservedId(program)) { SetGLError(GL_INVALID_OPERATION, "UseProgram", "program reserved id"); return; } UseProgramHelper(program); CheckGLError(); } void GLES2Implementation::ValidateProgram(GLuint program) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glValidateProgram(" << program << ")"); helper_->ValidateProgram(program); CheckGLError(); } void GLES2Implementation::VertexAttrib1f(GLuint indx, GLfloat x) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib1f(" << indx << ", " << x << ")"); helper_->VertexAttrib1f(indx, x); CheckGLError(); } void GLES2Implementation::VertexAttrib1fv(GLuint indx, const GLfloat* values) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib1fv(" << indx << ", " << static_cast(values) << ")"); size_t count = 1; for (size_t ii = 0; ii < count; ++ii) GPU_CLIENT_LOG("value[" << ii << "]: " << values[ii]); helper_->VertexAttrib1fvImmediate(indx, values); CheckGLError(); } void GLES2Implementation::VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib2f(" << indx << ", " << x << ", " << y << ")"); helper_->VertexAttrib2f(indx, x, y); CheckGLError(); } void GLES2Implementation::VertexAttrib2fv(GLuint indx, const GLfloat* values) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib2fv(" << indx << ", " << static_cast(values) << ")"); size_t count = 2; for (size_t ii = 0; ii < count; ++ii) GPU_CLIENT_LOG("value[" << ii << "]: " << values[ii]); helper_->VertexAttrib2fvImmediate(indx, values); CheckGLError(); } void GLES2Implementation::VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib3f(" << indx << ", " << x << ", " << y << ", " << z << ")"); helper_->VertexAttrib3f(indx, x, y, z); CheckGLError(); } void GLES2Implementation::VertexAttrib3fv(GLuint indx, const GLfloat* values) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib3fv(" << indx << ", " << static_cast(values) << ")"); size_t count = 3; for (size_t ii = 0; ii < count; ++ii) GPU_CLIENT_LOG("value[" << ii << "]: " << values[ii]); helper_->VertexAttrib3fvImmediate(indx, values); CheckGLError(); } void GLES2Implementation::VertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib4f(" << indx << ", " << x << ", " << y << ", " << z << ", " << w << ")"); helper_->VertexAttrib4f(indx, x, y, z, w); CheckGLError(); } void GLES2Implementation::VertexAttrib4fv(GLuint indx, const GLfloat* values) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib4fv(" << indx << ", " << static_cast(values) << ")"); size_t count = 4; for (size_t ii = 0; ii < count; ++ii) GPU_CLIENT_LOG("value[" << ii << "]: " << values[ii]); helper_->VertexAttrib4fvImmediate(indx, values); CheckGLError(); } void GLES2Implementation::VertexAttribI4i(GLuint indx, GLint x, GLint y, GLint z, GLint w) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttribI4i(" << indx << ", " << x << ", " << y << ", " << z << ", " << w << ")"); helper_->VertexAttribI4i(indx, x, y, z, w); CheckGLError(); } void GLES2Implementation::VertexAttribI4iv(GLuint indx, const GLint* values) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttribI4iv(" << indx << ", " << static_cast(values) << ")"); size_t count = 4; for (size_t ii = 0; ii < count; ++ii) GPU_CLIENT_LOG("value[" << ii << "]: " << values[ii]); helper_->VertexAttribI4ivImmediate(indx, values); CheckGLError(); } void GLES2Implementation::VertexAttribI4ui(GLuint indx, GLuint x, GLuint y, GLuint z, GLuint w) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttribI4ui(" << indx << ", " << x << ", " << y << ", " << z << ", " << w << ")"); helper_->VertexAttribI4ui(indx, x, y, z, w); CheckGLError(); } void GLES2Implementation::VertexAttribI4uiv(GLuint indx, const GLuint* values) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttribI4uiv(" << indx << ", " << static_cast(values) << ")"); size_t count = 4; for (size_t ii = 0; ii < count; ++ii) GPU_CLIENT_LOG("value[" << ii << "]: " << values[ii]); helper_->VertexAttribI4uivImmediate(indx, values); CheckGLError(); } void GLES2Implementation::Viewport(GLint x, GLint y, GLsizei width, GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glViewport(" << x << ", " << y << ", " << width << ", " << height << ")"); if (width < 0) { SetGLError(GL_INVALID_VALUE, "glViewport", "width < 0"); return; } if (height < 0) { SetGLError(GL_INVALID_VALUE, "glViewport", "height < 0"); return; } helper_->Viewport(x, y, width, height); CheckGLError(); } void GLES2Implementation::BlitFramebufferCHROMIUM(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlitFramebufferCHROMIUM(" << srcX0 << ", " << srcY0 << ", " << srcX1 << ", " << srcY1 << ", " << dstX0 << ", " << dstY0 << ", " << dstX1 << ", " << dstY1 << ", " << mask << ", " << GLES2Util::GetStringBlitFilter(filter) << ")"); helper_->BlitFramebufferCHROMIUM(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); CheckGLError(); } void GLES2Implementation::RenderbufferStorageMultisampleCHROMIUM( GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG( "[" << GetLogPrefix() << "] glRenderbufferStorageMultisampleCHROMIUM(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << samples << ", " << GLES2Util::GetStringRenderBufferFormat(internalformat) << ", " << width << ", " << height << ")"); if (samples < 0) { SetGLError(GL_INVALID_VALUE, "glRenderbufferStorageMultisampleCHROMIUM", "samples < 0"); return; } if (width < 0) { SetGLError(GL_INVALID_VALUE, "glRenderbufferStorageMultisampleCHROMIUM", "width < 0"); return; } if (height < 0) { SetGLError(GL_INVALID_VALUE, "glRenderbufferStorageMultisampleCHROMIUM", "height < 0"); return; } helper_->RenderbufferStorageMultisampleCHROMIUM( target, samples, internalformat, width, height); CheckGLError(); } void GLES2Implementation::RenderbufferStorageMultisampleEXT( GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG( "[" << GetLogPrefix() << "] glRenderbufferStorageMultisampleEXT(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << samples << ", " << GLES2Util::GetStringRenderBufferFormat(internalformat) << ", " << width << ", " << height << ")"); if (samples < 0) { SetGLError(GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "samples < 0"); return; } if (width < 0) { SetGLError(GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "width < 0"); return; } if (height < 0) { SetGLError(GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "height < 0"); return; } helper_->RenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height); CheckGLError(); } void GLES2Implementation::FramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferTexture2DMultisampleEXT(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringTextureTarget(textarget) << ", " << texture << ", " << level << ", " << samples << ")"); if (level != 0) { SetGLError(GL_INVALID_VALUE, "glFramebufferTexture2DMultisampleEXT", "level GL_INVALID_VALUE"); return; } if (samples < 0) { SetGLError(GL_INVALID_VALUE, "glFramebufferTexture2DMultisampleEXT", "samples < 0"); return; } helper_->FramebufferTexture2DMultisampleEXT(target, attachment, textarget, texture, samples); CheckGLError(); } void GLES2Implementation::TexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG( "[" << GetLogPrefix() << "] glTexStorage2DEXT(" << GLES2Util::GetStringTextureTarget(target) << ", " << levels << ", " << GLES2Util::GetStringTextureInternalFormatStorage(internalFormat) << ", " << width << ", " << height << ")"); if (levels < 0) { SetGLError(GL_INVALID_VALUE, "glTexStorage2DEXT", "levels < 0"); return; } if (width < 0) { SetGLError(GL_INVALID_VALUE, "glTexStorage2DEXT", "width < 0"); return; } if (height < 0) { SetGLError(GL_INVALID_VALUE, "glTexStorage2DEXT", "height < 0"); return; } helper_->TexStorage2DEXT(target, levels, internalFormat, width, height); CheckGLError(); } void GLES2Implementation::GenQueriesEXT(GLsizei n, GLuint* queries) { GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenQueriesEXT(" << n << ", " << static_cast(queries) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenQueriesEXT", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); IdAllocator* id_allocator = GetIdAllocator(id_namespaces::kQueries); for (GLsizei ii = 0; ii < n; ++ii) queries[ii] = id_allocator->AllocateID(); GenQueriesEXTHelper(n, queries); helper_->GenQueriesEXTImmediate(n, queries); if (share_group_->bind_generates_resource()) helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << queries[i]); } }); CheckGLError(); } void GLES2Implementation::DeleteQueriesEXT(GLsizei n, const GLuint* queries) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteQueriesEXT(" << n << ", " << static_cast(queries) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << queries[i]); } }); GPU_CLIENT_DCHECK_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { DCHECK(queries[i] != 0); } }); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glDeleteQueriesEXT", "n < 0"); return; } DeleteQueriesEXTHelper(n, queries); CheckGLError(); } void GLES2Implementation::BeginTransformFeedback(GLenum primitivemode) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBeginTransformFeedback(" << GLES2Util::GetStringTransformFeedbackPrimitiveMode( primitivemode) << ")"); helper_->BeginTransformFeedback(primitivemode); CheckGLError(); } void GLES2Implementation::EndTransformFeedback() { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glEndTransformFeedback(" << ")"); helper_->EndTransformFeedback(); CheckGLError(); } void GLES2Implementation::GenVertexArraysOES(GLsizei n, GLuint* arrays) { GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenVertexArraysOES(" << n << ", " << static_cast(arrays) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenVertexArraysOES", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); GetIdHandler(id_namespaces::kVertexArrays)->MakeIds(this, 0, n, arrays); GenVertexArraysOESHelper(n, arrays); helper_->GenVertexArraysOESImmediate(n, arrays); if (share_group_->bind_generates_resource()) helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << arrays[i]); } }); CheckGLError(); } void GLES2Implementation::DeleteVertexArraysOES(GLsizei n, const GLuint* arrays) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteVertexArraysOES(" << n << ", " << static_cast(arrays) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << arrays[i]); } }); GPU_CLIENT_DCHECK_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { DCHECK(arrays[i] != 0); } }); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glDeleteVertexArraysOES", "n < 0"); return; } DeleteVertexArraysOESHelper(n, arrays); CheckGLError(); } GLboolean GLES2Implementation::IsVertexArrayOES(GLuint array) { GPU_CLIENT_SINGLE_THREAD_CHECK(); TRACE_EVENT0("gpu", "GLES2Implementation::IsVertexArrayOES"); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsVertexArrayOES(" << array << ")"); typedef cmds::IsVertexArrayOES::Result Result; Result* result = GetResultAs(); if (!result) { return GL_FALSE; } *result = 0; helper_->IsVertexArrayOES(array, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); GLboolean result_value = *result != 0; GPU_CLIENT_LOG("returned " << result_value); CheckGLError(); return result_value; } void GLES2Implementation::BindVertexArrayOES(GLuint array) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindVertexArrayOES(" << array << ")"); if (IsVertexArrayReservedId(array)) { SetGLError(GL_INVALID_OPERATION, "BindVertexArrayOES", "array reserved id"); return; } BindVertexArrayOESHelper(array); CheckGLError(); } void GLES2Implementation::GetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, char* source) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetTranslatedShaderSourceANGLE" << "(" << shader << ", " << bufsize << ", " << static_cast(length) << ", " << static_cast(source) << ")"); helper_->SetBucketSize(kResultBucketId, 0); helper_->GetTranslatedShaderSourceANGLE(shader, kResultBucketId); std::string str; GLsizei max_size = 0; if (GetBucketAsString(kResultBucketId, &str)) { if (bufsize > 0) { max_size = std::min(static_cast(bufsize) - 1, str.size()); memcpy(source, str.c_str(), max_size); source[max_size] = '\0'; GPU_CLIENT_LOG("------\n" << source << "\n------"); } } if (length != NULL) { *length = max_size; } CheckGLError(); } void GLES2Implementation::TexImageIOSurface2DCHROMIUM(GLenum target, GLsizei width, GLsizei height, GLuint ioSurfaceId, GLuint plane) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexImageIOSurface2DCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << width << ", " << height << ", " << ioSurfaceId << ", " << plane << ")"); if (width < 0) { SetGLError(GL_INVALID_VALUE, "glTexImageIOSurface2DCHROMIUM", "width < 0"); return; } if (height < 0) { SetGLError(GL_INVALID_VALUE, "glTexImageIOSurface2DCHROMIUM", "height < 0"); return; } helper_->TexImageIOSurface2DCHROMIUM(target, width, height, ioSurfaceId, plane); CheckGLError(); } void GLES2Implementation::CopyTextureCHROMIUM(GLenum target, GLenum source_id, GLenum dest_id, GLint internalformat, GLenum dest_type) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTextureCHROMIUM(" << GLES2Util::GetStringEnum(target) << ", " << GLES2Util::GetStringEnum(source_id) << ", " << GLES2Util::GetStringEnum(dest_id) << ", " << internalformat << ", " << GLES2Util::GetStringPixelType(dest_type) << ")"); helper_->CopyTextureCHROMIUM(target, source_id, dest_id, internalformat, dest_type); CheckGLError(); } void GLES2Implementation::CopySubTextureCHROMIUM(GLenum target, GLenum source_id, GLenum dest_id, GLint xoffset, GLint yoffset) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopySubTextureCHROMIUM(" << GLES2Util::GetStringEnum(target) << ", " << GLES2Util::GetStringEnum(source_id) << ", " << GLES2Util::GetStringEnum(dest_id) << ", " << xoffset << ", " << yoffset << ")"); helper_->CopySubTextureCHROMIUM(target, source_id, dest_id, xoffset, yoffset); CheckGLError(); } void GLES2Implementation::GenValuebuffersCHROMIUM(GLsizei n, GLuint* buffers) { GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenValuebuffersCHROMIUM(" << n << ", " << static_cast(buffers) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenValuebuffersCHROMIUM", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); GetIdHandler(id_namespaces::kValuebuffers)->MakeIds(this, 0, n, buffers); GenValuebuffersCHROMIUMHelper(n, buffers); helper_->GenValuebuffersCHROMIUMImmediate(n, buffers); if (share_group_->bind_generates_resource()) helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << buffers[i]); } }); CheckGLError(); } void GLES2Implementation::DeleteValuebuffersCHROMIUM( GLsizei n, const GLuint* valuebuffers) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteValuebuffersCHROMIUM(" << n << ", " << static_cast(valuebuffers) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << valuebuffers[i]); } }); GPU_CLIENT_DCHECK_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { DCHECK(valuebuffers[i] != 0); } }); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glDeleteValuebuffersCHROMIUM", "n < 0"); return; } DeleteValuebuffersCHROMIUMHelper(n, valuebuffers); CheckGLError(); } GLboolean GLES2Implementation::IsValuebufferCHROMIUM(GLuint valuebuffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); TRACE_EVENT0("gpu", "GLES2Implementation::IsValuebufferCHROMIUM"); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsValuebufferCHROMIUM(" << valuebuffer << ")"); typedef cmds::IsValuebufferCHROMIUM::Result Result; Result* result = GetResultAs(); if (!result) { return GL_FALSE; } *result = 0; helper_->IsValuebufferCHROMIUM(valuebuffer, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); GLboolean result_value = *result != 0; GPU_CLIENT_LOG("returned " << result_value); CheckGLError(); return result_value; } void GLES2Implementation::BindValuebufferCHROMIUM(GLenum target, GLuint valuebuffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindValuebufferCHROMIUM(" << GLES2Util::GetStringValueBufferTarget(target) << ", " << valuebuffer << ")"); if (IsValuebufferReservedId(valuebuffer)) { SetGLError(GL_INVALID_OPERATION, "BindValuebufferCHROMIUM", "valuebuffer reserved id"); return; } BindValuebufferCHROMIUMHelper(target, valuebuffer); CheckGLError(); } void GLES2Implementation::SubscribeValueCHROMIUM(GLenum target, GLenum subscription) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glSubscribeValueCHROMIUM(" << GLES2Util::GetStringValueBufferTarget(target) << ", " << GLES2Util::GetStringSubscriptionTarget(subscription) << ")"); helper_->SubscribeValueCHROMIUM(target, subscription); CheckGLError(); } void GLES2Implementation::PopulateSubscribedValuesCHROMIUM(GLenum target) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPopulateSubscribedValuesCHROMIUM(" << GLES2Util::GetStringValueBufferTarget(target) << ")"); helper_->PopulateSubscribedValuesCHROMIUM(target); CheckGLError(); } void GLES2Implementation::UniformValuebufferCHROMIUM(GLint location, GLenum target, GLenum subscription) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG( "[" << GetLogPrefix() << "] glUniformValuebufferCHROMIUM(" << location << ", " << GLES2Util::GetStringValueBufferTarget(target) << ", " << GLES2Util::GetStringSubscriptionTarget(subscription) << ")"); helper_->UniformValuebufferCHROMIUM(location, target, subscription); CheckGLError(); } void GLES2Implementation::BindTexImage2DCHROMIUM(GLenum target, GLint imageId) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindTexImage2DCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << imageId << ")"); helper_->BindTexImage2DCHROMIUM(target, imageId); CheckGLError(); } void GLES2Implementation::ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glReleaseTexImage2DCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << imageId << ")"); helper_->ReleaseTexImage2DCHROMIUM(target, imageId); CheckGLError(); } void GLES2Implementation::DiscardFramebufferEXT(GLenum target, GLsizei count, const GLenum* attachments) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDiscardFramebufferEXT(" << GLES2Util::GetStringEnum(target) << ", " << count << ", " << static_cast(attachments) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << attachments[0 + i * 1]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glDiscardFramebufferEXT", "count < 0"); return; } helper_->DiscardFramebufferEXTImmediate(target, count, attachments); CheckGLError(); } void GLES2Implementation::LoseContextCHROMIUM(GLenum current, GLenum other) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glLoseContextCHROMIUM(" << GLES2Util::GetStringResetStatus(current) << ", " << GLES2Util::GetStringResetStatus(other) << ")"); helper_->LoseContextCHROMIUM(current, other); CheckGLError(); } void GLES2Implementation::WaitSyncPointCHROMIUM(GLuint sync_point) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glWaitSyncPointCHROMIUM(" << sync_point << ")"); helper_->WaitSyncPointCHROMIUM(sync_point); CheckGLError(); } void GLES2Implementation::DrawBuffersEXT(GLsizei count, const GLenum* bufs) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawBuffersEXT(" << count << ", " << static_cast(bufs) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { GPU_CLIENT_LOG(" " << i << ": " << bufs[0 + i * 1]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glDrawBuffersEXT", "count < 0"); return; } helper_->DrawBuffersEXTImmediate(count, bufs); CheckGLError(); } void GLES2Implementation::DiscardBackbufferCHROMIUM() { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDiscardBackbufferCHROMIUM(" << ")"); helper_->DiscardBackbufferCHROMIUM(); CheckGLError(); } void GLES2Implementation::ScheduleOverlayPlaneCHROMIUM( GLint plane_z_order, GLenum plane_transform, GLuint overlay_texture_id, GLint bounds_x, GLint bounds_y, GLint bounds_width, GLint bounds_height, GLfloat uv_x, GLfloat uv_y, GLfloat uv_width, GLfloat uv_height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG( "[" << GetLogPrefix() << "] glScheduleOverlayPlaneCHROMIUM(" << plane_z_order << ", " << GLES2Util::GetStringEnum(plane_transform) << ", " << overlay_texture_id << ", " << bounds_x << ", " << bounds_y << ", " << bounds_width << ", " << bounds_height << ", " << uv_x << ", " << uv_y << ", " << uv_width << ", " << uv_height << ")"); helper_->ScheduleOverlayPlaneCHROMIUM( plane_z_order, plane_transform, overlay_texture_id, bounds_x, bounds_y, bounds_width, bounds_height, uv_x, uv_y, uv_width, uv_height); CheckGLError(); } void GLES2Implementation::MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat* m) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glMatrixLoadfCHROMIUM(" << GLES2Util::GetStringMatrixMode(matrixMode) << ", " << static_cast(m) << ")"); size_t count = 16; for (size_t ii = 0; ii < count; ++ii) GPU_CLIENT_LOG("value[" << ii << "]: " << m[ii]); helper_->MatrixLoadfCHROMIUMImmediate(matrixMode, m); CheckGLError(); } void GLES2Implementation::MatrixLoadIdentityCHROMIUM(GLenum matrixMode) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glMatrixLoadIdentityCHROMIUM(" << GLES2Util::GetStringMatrixMode(matrixMode) << ")"); helper_->MatrixLoadIdentityCHROMIUM(matrixMode); CheckGLError(); } void GLES2Implementation::BlendBarrierKHR() { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendBarrierKHR(" << ")"); helper_->BlendBarrierKHR(); CheckGLError(); } #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_IMPL_AUTOGEN_H_