| // Copyright 2013 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. |
| |
| #include "gpu/skia_bindings/gl_bindings_skia_cmd_buffer.h" |
| |
| #include "gpu/command_buffer/client/gles2_interface.h" |
| #include "third_party/skia/include/gpu/gl/GrGLInterface.h" |
| |
| using gpu::gles2::GLES2Interface; |
| |
| namespace { |
| template <typename R, typename... Args> |
| std::function<R(Args...)> gles_bind(R (GLES2Interface::*func)(Args...), |
| GLES2Interface* gles2Interface) { |
| return [func, gles2Interface](Args... args) { |
| return (gles2Interface->*func)(args...); |
| }; |
| } |
| } // namespace |
| |
| namespace skia_bindings { |
| |
| sk_sp<GrGLInterface> CreateGLES2InterfaceBindings(GLES2Interface* impl) { |
| // Until Chromium is passing the WebGL 2.0 conformance we're limiting Skia to |
| // a GLES 2.0 interface (plus extensions). |
| auto get_string_version_override = [impl](GLenum name) { |
| if (name == GL_VERSION) |
| return reinterpret_cast<const GLubyte*>("OpenGL ES 2.0 Chromium"); |
| return impl->GetString(name); |
| }; |
| |
| sk_sp<GrGLInterface> interface(new GrGLInterface); |
| interface->fStandard = kGLES_GrGLStandard; |
| interface->fExtensions.init(kGLES_GrGLStandard, get_string_version_override, |
| nullptr, |
| gles_bind(&GLES2Interface::GetIntegerv, impl)); |
| |
| GrGLInterface::Functions* functions = &interface->fFunctions; |
| functions->fActiveTexture = gles_bind(&GLES2Interface::ActiveTexture, impl); |
| functions->fAttachShader = gles_bind(&GLES2Interface::AttachShader, impl); |
| functions->fBindAttribLocation = |
| gles_bind(&GLES2Interface::BindAttribLocation, impl); |
| functions->fBindBuffer = gles_bind(&GLES2Interface::BindBuffer, impl); |
| functions->fBindTexture = gles_bind(&GLES2Interface::BindTexture, impl); |
| functions->fBindVertexArray = |
| gles_bind(&GLES2Interface::BindVertexArrayOES, impl); |
| functions->fBlendBarrier = gles_bind(&GLES2Interface::BlendBarrierKHR, impl); |
| functions->fBlendColor = gles_bind(&GLES2Interface::BlendColor, impl); |
| functions->fBlendEquation = gles_bind(&GLES2Interface::BlendEquation, impl); |
| functions->fBlendFunc = gles_bind(&GLES2Interface::BlendFunc, impl); |
| functions->fBufferData = gles_bind(&GLES2Interface::BufferData, impl); |
| functions->fBufferSubData = gles_bind(&GLES2Interface::BufferSubData, impl); |
| functions->fClear = gles_bind(&GLES2Interface::Clear, impl); |
| functions->fClearColor = gles_bind(&GLES2Interface::ClearColor, impl); |
| functions->fClearStencil = gles_bind(&GLES2Interface::ClearStencil, impl); |
| functions->fColorMask = gles_bind(&GLES2Interface::ColorMask, impl); |
| functions->fCompileShader = gles_bind(&GLES2Interface::CompileShader, impl); |
| functions->fCompressedTexImage2D = |
| gles_bind(&GLES2Interface::CompressedTexImage2D, impl); |
| functions->fCompressedTexSubImage2D = |
| gles_bind(&GLES2Interface::CompressedTexSubImage2D, impl); |
| functions->fCopyTexSubImage2D = |
| gles_bind(&GLES2Interface::CopyTexSubImage2D, impl); |
| functions->fCreateProgram = gles_bind(&GLES2Interface::CreateProgram, impl); |
| functions->fCreateShader = gles_bind(&GLES2Interface::CreateShader, impl); |
| functions->fCullFace = gles_bind(&GLES2Interface::CullFace, impl); |
| functions->fDeleteBuffers = gles_bind(&GLES2Interface::DeleteBuffers, impl); |
| functions->fDeleteProgram = gles_bind(&GLES2Interface::DeleteProgram, impl); |
| functions->fDeleteShader = gles_bind(&GLES2Interface::DeleteShader, impl); |
| functions->fDeleteTextures = gles_bind(&GLES2Interface::DeleteTextures, impl); |
| functions->fDeleteVertexArrays = |
| gles_bind(&GLES2Interface::DeleteVertexArraysOES, impl); |
| functions->fDepthMask = gles_bind(&GLES2Interface::DepthMask, impl); |
| functions->fDisable = gles_bind(&GLES2Interface::Disable, impl); |
| functions->fDisableVertexAttribArray = |
| gles_bind(&GLES2Interface::DisableVertexAttribArray, impl); |
| functions->fDiscardFramebuffer = |
| gles_bind(&GLES2Interface::DiscardFramebufferEXT, impl); |
| functions->fDrawArrays = gles_bind(&GLES2Interface::DrawArrays, impl); |
| functions->fDrawElements = gles_bind(&GLES2Interface::DrawElements, impl); |
| functions->fEnable = gles_bind(&GLES2Interface::Enable, impl); |
| functions->fEnableVertexAttribArray = |
| gles_bind(&GLES2Interface::EnableVertexAttribArray, impl); |
| functions->fFinish = gles_bind(&GLES2Interface::Finish, impl); |
| functions->fFlush = gles_bind(&GLES2Interface::Flush, impl); |
| functions->fFrontFace = gles_bind(&GLES2Interface::FrontFace, impl); |
| functions->fGenBuffers = gles_bind(&GLES2Interface::GenBuffers, impl); |
| functions->fGenTextures = gles_bind(&GLES2Interface::GenTextures, impl); |
| functions->fGenVertexArrays = |
| gles_bind(&GLES2Interface::GenVertexArraysOES, impl); |
| functions->fGetBufferParameteriv = |
| gles_bind(&GLES2Interface::GetBufferParameteriv, impl); |
| functions->fGetError = gles_bind(&GLES2Interface::GetError, impl); |
| functions->fGetIntegerv = gles_bind(&GLES2Interface::GetIntegerv, impl); |
| functions->fGetProgramInfoLog = |
| gles_bind(&GLES2Interface::GetProgramInfoLog, impl); |
| functions->fGetProgramiv = gles_bind(&GLES2Interface::GetProgramiv, impl); |
| functions->fGetShaderInfoLog = |
| gles_bind(&GLES2Interface::GetShaderInfoLog, impl); |
| functions->fGetShaderiv = gles_bind(&GLES2Interface::GetShaderiv, impl); |
| functions->fGetShaderPrecisionFormat = |
| gles_bind(&GLES2Interface::GetShaderPrecisionFormat, impl); |
| functions->fGetString = get_string_version_override; |
| functions->fGetUniformLocation = |
| gles_bind(&GLES2Interface::GetUniformLocation, impl); |
| functions->fInsertEventMarker = |
| gles_bind(&GLES2Interface::InsertEventMarkerEXT, impl); |
| functions->fIsTexture = gles_bind(&GLES2Interface::IsTexture, impl); |
| functions->fLineWidth = gles_bind(&GLES2Interface::LineWidth, impl); |
| functions->fLinkProgram = gles_bind(&GLES2Interface::LinkProgram, impl); |
| functions->fMapBufferSubData = |
| gles_bind(&GLES2Interface::MapBufferSubDataCHROMIUM, impl); |
| functions->fMapTexSubImage2D = |
| gles_bind(&GLES2Interface::MapTexSubImage2DCHROMIUM, impl); |
| functions->fPixelStorei = gles_bind(&GLES2Interface::PixelStorei, impl); |
| functions->fPopGroupMarker = |
| gles_bind(&GLES2Interface::PopGroupMarkerEXT, impl); |
| functions->fPushGroupMarker = |
| gles_bind(&GLES2Interface::PushGroupMarkerEXT, impl); |
| functions->fReadPixels = gles_bind(&GLES2Interface::ReadPixels, impl); |
| functions->fScissor = gles_bind(&GLES2Interface::Scissor, impl); |
| functions->fShaderSource = gles_bind(&GLES2Interface::ShaderSource, impl); |
| functions->fStencilFunc = gles_bind(&GLES2Interface::StencilFunc, impl); |
| functions->fStencilFuncSeparate = |
| gles_bind(&GLES2Interface::StencilFuncSeparate, impl); |
| functions->fStencilMask = gles_bind(&GLES2Interface::StencilMask, impl); |
| functions->fStencilMaskSeparate = |
| gles_bind(&GLES2Interface::StencilMaskSeparate, impl); |
| functions->fStencilOp = gles_bind(&GLES2Interface::StencilOp, impl); |
| functions->fStencilOpSeparate = |
| gles_bind(&GLES2Interface::StencilOpSeparate, impl); |
| functions->fTexImage2D = gles_bind(&GLES2Interface::TexImage2D, impl); |
| functions->fTexParameteri = gles_bind(&GLES2Interface::TexParameteri, impl); |
| functions->fTexParameteriv = gles_bind(&GLES2Interface::TexParameteriv, impl); |
| functions->fTexStorage2D = gles_bind(&GLES2Interface::TexStorage2DEXT, impl); |
| functions->fTexSubImage2D = gles_bind(&GLES2Interface::TexSubImage2D, impl); |
| functions->fUniform1f = gles_bind(&GLES2Interface::Uniform1f, impl); |
| functions->fUniform1i = gles_bind(&GLES2Interface::Uniform1i, impl); |
| functions->fUniform1fv = gles_bind(&GLES2Interface::Uniform1fv, impl); |
| functions->fUniform1iv = gles_bind(&GLES2Interface::Uniform1iv, impl); |
| functions->fUniform2f = gles_bind(&GLES2Interface::Uniform2f, impl); |
| functions->fUniform2i = gles_bind(&GLES2Interface::Uniform2i, impl); |
| functions->fUniform2fv = gles_bind(&GLES2Interface::Uniform2fv, impl); |
| functions->fUniform2iv = gles_bind(&GLES2Interface::Uniform2iv, impl); |
| functions->fUniform3f = gles_bind(&GLES2Interface::Uniform3f, impl); |
| functions->fUniform3i = gles_bind(&GLES2Interface::Uniform3i, impl); |
| functions->fUniform3fv = gles_bind(&GLES2Interface::Uniform3fv, impl); |
| functions->fUniform3iv = gles_bind(&GLES2Interface::Uniform3iv, impl); |
| functions->fUniform4f = gles_bind(&GLES2Interface::Uniform4f, impl); |
| functions->fUniform4i = gles_bind(&GLES2Interface::Uniform4i, impl); |
| functions->fUniform4fv = gles_bind(&GLES2Interface::Uniform4fv, impl); |
| functions->fUniform4iv = gles_bind(&GLES2Interface::Uniform4iv, impl); |
| functions->fUniformMatrix2fv = |
| gles_bind(&GLES2Interface::UniformMatrix2fv, impl); |
| functions->fUniformMatrix3fv = |
| gles_bind(&GLES2Interface::UniformMatrix3fv, impl); |
| functions->fUniformMatrix4fv = |
| gles_bind(&GLES2Interface::UniformMatrix4fv, impl); |
| functions->fUnmapBufferSubData = |
| gles_bind(&GLES2Interface::UnmapBufferSubDataCHROMIUM, impl); |
| functions->fUnmapTexSubImage2D = |
| gles_bind(&GLES2Interface::UnmapTexSubImage2DCHROMIUM, impl); |
| functions->fUseProgram = gles_bind(&GLES2Interface::UseProgram, impl); |
| functions->fVertexAttrib1f = gles_bind(&GLES2Interface::VertexAttrib1f, impl); |
| functions->fVertexAttrib2fv = |
| gles_bind(&GLES2Interface::VertexAttrib2fv, impl); |
| functions->fVertexAttrib3fv = |
| gles_bind(&GLES2Interface::VertexAttrib3fv, impl); |
| functions->fVertexAttrib4fv = |
| gles_bind(&GLES2Interface::VertexAttrib4fv, impl); |
| functions->fVertexAttribPointer = |
| gles_bind(&GLES2Interface::VertexAttribPointer, impl); |
| functions->fViewport = gles_bind(&GLES2Interface::Viewport, impl); |
| functions->fBindFramebuffer = |
| gles_bind(&GLES2Interface::BindFramebuffer, impl); |
| functions->fBindRenderbuffer = |
| gles_bind(&GLES2Interface::BindRenderbuffer, impl); |
| functions->fCheckFramebufferStatus = |
| gles_bind(&GLES2Interface::CheckFramebufferStatus, impl); |
| functions->fDeleteFramebuffers = |
| gles_bind(&GLES2Interface::DeleteFramebuffers, impl); |
| functions->fDeleteRenderbuffers = |
| gles_bind(&GLES2Interface::DeleteRenderbuffers, impl); |
| functions->fFramebufferRenderbuffer = |
| gles_bind(&GLES2Interface::FramebufferRenderbuffer, impl); |
| functions->fFramebufferTexture2D = |
| gles_bind(&GLES2Interface::FramebufferTexture2D, impl); |
| functions->fFramebufferTexture2DMultisample = |
| gles_bind(&GLES2Interface::FramebufferTexture2DMultisampleEXT, impl); |
| functions->fGenFramebuffers = |
| gles_bind(&GLES2Interface::GenFramebuffers, impl); |
| functions->fGenRenderbuffers = |
| gles_bind(&GLES2Interface::GenRenderbuffers, impl); |
| functions->fGetFramebufferAttachmentParameteriv = |
| gles_bind(&GLES2Interface::GetFramebufferAttachmentParameteriv, impl); |
| functions->fGetRenderbufferParameteriv = |
| gles_bind(&GLES2Interface::GetRenderbufferParameteriv, impl); |
| functions->fRenderbufferStorage = |
| gles_bind(&GLES2Interface::RenderbufferStorage, impl); |
| functions->fRenderbufferStorageMultisample = |
| gles_bind(&GLES2Interface::RenderbufferStorageMultisampleCHROMIUM, impl); |
| functions->fRenderbufferStorageMultisampleES2EXT = |
| gles_bind(&GLES2Interface::RenderbufferStorageMultisampleEXT, impl); |
| functions->fBindFragDataLocation = |
| gles_bind(&GLES2Interface::BindFragDataLocationEXT, impl); |
| functions->fBindFragDataLocationIndexed = |
| gles_bind(&GLES2Interface::BindFragDataLocationIndexedEXT, impl); |
| functions->fBindUniformLocation = |
| gles_bind(&GLES2Interface::BindUniformLocationCHROMIUM, impl); |
| functions->fBlitFramebuffer = |
| gles_bind(&GLES2Interface::BlitFramebufferCHROMIUM, impl); |
| functions->fGenerateMipmap = gles_bind(&GLES2Interface::GenerateMipmap, impl); |
| functions->fMatrixLoadf = |
| gles_bind(&GLES2Interface::MatrixLoadfCHROMIUM, impl); |
| functions->fMatrixLoadIdentity = |
| gles_bind(&GLES2Interface::MatrixLoadIdentityCHROMIUM, impl); |
| functions->fPathCommands = |
| gles_bind(&GLES2Interface::PathCommandsCHROMIUM, impl); |
| functions->fPathParameteri = |
| gles_bind(&GLES2Interface::PathParameteriCHROMIUM, impl); |
| functions->fPathParameterf = |
| gles_bind(&GLES2Interface::PathParameterfCHROMIUM, impl); |
| functions->fGenPaths = gles_bind(&GLES2Interface::GenPathsCHROMIUM, impl); |
| functions->fIsPath = gles_bind(&GLES2Interface::IsPathCHROMIUM, impl); |
| functions->fDeletePaths = |
| gles_bind(&GLES2Interface::DeletePathsCHROMIUM, impl); |
| functions->fPathStencilFunc = |
| gles_bind(&GLES2Interface::PathStencilFuncCHROMIUM, impl); |
| functions->fStencilFillPath = |
| gles_bind(&GLES2Interface::StencilFillPathCHROMIUM, impl); |
| functions->fStencilStrokePath = |
| gles_bind(&GLES2Interface::StencilStrokePathCHROMIUM, impl); |
| functions->fCoverFillPath = |
| gles_bind(&GLES2Interface::CoverFillPathCHROMIUM, impl); |
| functions->fCoverStrokePath = |
| gles_bind(&GLES2Interface::CoverStrokePathCHROMIUM, impl); |
| functions->fStencilThenCoverFillPath = |
| gles_bind(&GLES2Interface::StencilThenCoverFillPathCHROMIUM, impl); |
| functions->fStencilThenCoverStrokePath = |
| gles_bind(&GLES2Interface::StencilThenCoverStrokePathCHROMIUM, impl); |
| functions->fStencilFillPathInstanced = |
| gles_bind(&GLES2Interface::StencilFillPathInstancedCHROMIUM, impl); |
| functions->fStencilStrokePathInstanced = |
| gles_bind(&GLES2Interface::StencilStrokePathInstancedCHROMIUM, impl); |
| functions->fCoverFillPathInstanced = |
| gles_bind(&GLES2Interface::CoverFillPathInstancedCHROMIUM, impl); |
| functions->fCoverStrokePathInstanced = |
| gles_bind(&GLES2Interface::CoverStrokePathInstancedCHROMIUM, impl); |
| functions->fStencilThenCoverFillPathInstanced = gles_bind( |
| &GLES2Interface::StencilThenCoverFillPathInstancedCHROMIUM, impl); |
| functions->fStencilThenCoverStrokePathInstanced = gles_bind( |
| &GLES2Interface::StencilThenCoverStrokePathInstancedCHROMIUM, impl); |
| functions->fProgramPathFragmentInputGen = |
| gles_bind(&GLES2Interface::ProgramPathFragmentInputGenCHROMIUM, impl); |
| functions->fBindFragmentInputLocation = |
| gles_bind(&GLES2Interface::BindFragmentInputLocationCHROMIUM, impl); |
| functions->fCoverageModulation = |
| gles_bind(&GLES2Interface::CoverageModulationCHROMIUM, impl); |
| return interface; |
| } |
| |
| } // namespace skia_bindings |