blob: ddbc9809295f6baaa3bc5b4d6c454d55643dffb3 [file] [log] [blame]
/*
* Copyright 2014 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
const GrGLInterface* GrGLAssembleGLESInterface(void* ctx, GrGLGetProc get) {
GET_PROC_LOCAL(GetString);
const char* verStr = reinterpret_cast<const char*>(GetString(GR_GL_VERSION));
GrGLVersion version = GrGLGetVersionFromString(verStr);
if (version < GR_GL_VER(2,0)) {
return NULL;
}
GET_PROC_LOCAL(GetIntegerv);
GET_PROC_LOCAL(GetStringi);
GrGLExtensions extensions;
if (!extensions.init(kGLES_GrGLStandard, GetString, GetStringi, GetIntegerv)) {
return NULL;
}
GrGLInterface* interface = SkNEW(GrGLInterface);
GrGLInterface::Functions* functions = &interface->fFunctions;
GET_LINKED(ActiveTexture);
GET_LINKED(AttachShader);
GET_LINKED(BindAttribLocation);
GET_LINKED(BindBuffer);
GET_LINKED(BindTexture);
GET_LINKED_SUFFIX(BindVertexArray, OES);
GET_LINKED(BlendColor);
GET_LINKED(BlendFunc);
GET_LINKED(BufferData);
GET_LINKED(BufferSubData);
GET_LINKED(Clear);
GET_LINKED(ClearColor);
GET_LINKED(ClearStencil);
GET_LINKED(ColorMask);
GET_LINKED(CompileShader);
GET_LINKED(CompressedTexImage2D);
GET_LINKED(CompressedTexSubImage2D);
GET_LINKED(CopyTexSubImage2D);
GET_LINKED(CreateProgram);
GET_LINKED(CreateShader);
GET_LINKED(CullFace);
GET_LINKED(DeleteBuffers);
GET_LINKED(DeleteProgram);
GET_LINKED(DeleteShader);
GET_LINKED(DeleteTextures);
GET_LINKED_SUFFIX(DeleteVertexArrays, OES);
GET_LINKED(DepthMask);
GET_LINKED(Disable);
GET_LINKED(DisableVertexAttribArray);
GET_LINKED(DrawArrays);
GET_LINKED(DrawElements);
GET_LINKED(Enable);
GET_LINKED(EnableVertexAttribArray);
GET_LINKED(Finish);
GET_LINKED(Flush);
GET_LINKED(FrontFace);
GET_LINKED(GenBuffers);
GET_LINKED(GenerateMipmap);
GET_LINKED(GenTextures);
GET_LINKED_SUFFIX(GenVertexArrays, OES);
GET_LINKED(GetBufferParameteriv);
GET_LINKED(GetError);
GET_LINKED(GetIntegerv);
GET_LINKED(GetProgramInfoLog);
GET_LINKED(GetProgramiv);
GET_LINKED(GetShaderInfoLog);
GET_LINKED(GetShaderiv);
GET_LINKED(GetString);
#if USE_LINKED && GL_ES_VERSION_3_0
GET_LINKED(GetStringi);
#else
GET_PROC(GetStringi);
#endif
GET_LINKED(GetUniformLocation);
GET_LINKED(LineWidth);
GET_LINKED(LinkProgram);
GET_LINKED(PixelStorei);
GET_LINKED(ReadPixels);
GET_LINKED(Scissor);
#if GR_GL_USE_NEW_SHADER_SOURCE_SIGNATURE
functions->fShaderSource = (GrGLShaderSourceProc) glShaderSource;
#else
GET_LINKED(ShaderSource);
#endif
GET_LINKED(StencilFunc);
GET_LINKED(StencilFuncSeparate);
GET_LINKED(StencilMask);
GET_LINKED(StencilMaskSeparate);
GET_LINKED(StencilOp);
GET_LINKED(StencilOpSeparate);
GET_LINKED(TexImage2D);
GET_LINKED(TexParameteri);
GET_LINKED(TexParameteriv);
GET_LINKED(TexSubImage2D);
if (version >= GR_GL_VER(3,0)) {
#if USE_LINKED && GL_ES_VERSION_3_0
GET_LINKED(TexStorage2D);
#else
GET_PROC(TexStorage2D);
#endif
} else {
#if USE_LINKED && GL_EXT_texture_storage
GET_LINKED_SUFFIX(TexStorage2D, EXT);
#else
GET_PROC_SUFFIX(TexStorage2D, EXT);
#endif
}
#if USE_LINKED && GL_EXT_discard_framebuffer
GET_LINKED_SUFFIX(DiscardFramebuffer, EXT);
#endif
GET_LINKED(Uniform1f);
GET_LINKED(Uniform1i);
GET_LINKED(Uniform1fv);
GET_LINKED(Uniform1iv);
GET_LINKED(Uniform2f);
GET_LINKED(Uniform2i);
GET_LINKED(Uniform2fv);
GET_LINKED(Uniform2iv);
GET_LINKED(Uniform3f);
GET_LINKED(Uniform3i);
GET_LINKED(Uniform3fv);
GET_LINKED(Uniform3iv);
GET_LINKED(Uniform4f);
GET_LINKED(Uniform4i);
GET_LINKED(Uniform4fv);
GET_LINKED(Uniform4iv);
GET_LINKED(UniformMatrix2fv);
GET_LINKED(UniformMatrix3fv);
GET_LINKED(UniformMatrix4fv);
GET_LINKED(UseProgram);
GET_LINKED(VertexAttrib4fv);
GET_LINKED(VertexAttribPointer);
GET_LINKED(Viewport);
GET_LINKED(BindFramebuffer);
GET_LINKED(BindRenderbuffer);
GET_LINKED(CheckFramebufferStatus);
GET_LINKED(DeleteFramebuffers);
GET_LINKED(DeleteRenderbuffers);
GET_LINKED(FramebufferRenderbuffer);
GET_LINKED(FramebufferTexture2D);
if (version >= GR_GL_VER(3,0)) {
#if USE_LINKED && GL_ES_VERSION_3_0
GET_LINKED(RenderbufferStorageMultisample);
GET_LINKED(BlitFramebuffer);
#else
GET_PROC(RenderbufferStorageMultisample);
GET_PROC(BlitFramebuffer);
#endif
}
if (extensions.has("GL_EXT_multisampled_render_to_texture")) {
#if USE_LINKED && GL_EXT_multisampled_render_to_texture
GET_LINKED_SUFFIX(FramebufferTexture2DMultisample, EXT);
functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleEXT;
#else
GET_PROC_SUFFIX(FramebufferTexture2DMultisample, EXT);
functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) get(ctx, "glRenderbufferStorageMultisampleEXT");
#endif
} else if (extensions.has("GL_IMG_multisampled_render_to_texture")) {
#if USE_LINKED && GL_IMG_multisampled_render_to_texture
GET_LINKED_SUFFIX(FramebufferTexture2DMultisample, IMG);
functions->fRenderbufferStorageMultisampleES2EXT = glRenderbufferStorageMultisampleIMG;
#else
GET_PROC_SUFFIX(FramebufferTexture2DMultisample, IMG);
functions->fRenderbufferStorageMultisampleES2EXT = (GrGLRenderbufferStorageMultisampleProc) get(ctx, "glRenderbufferStorageMultisampleIMG");
#endif
}
GET_LINKED(GenFramebuffers);
GET_LINKED(GenRenderbuffers);
GET_LINKED(GetFramebufferAttachmentParameteriv);
GET_LINKED(GetRenderbufferParameteriv);
GET_LINKED(RenderbufferStorage);
#if USE_LINKED && GL_OES_mapbuffer
GET_LINKED_SUFFIX(MapBuffer, OES);
GET_LINKED_SUFFIX(UnmapBuffer, OES);
#else
GET_PROC_SUFFIX(MapBuffer, OES);
GET_PROC_SUFFIX(UnmapBuffer, OES);
#endif
if (version >= GR_GL_VER(3,0)) {
#if USE_LINKED && GL_ES_VERSION_3_0
GET_LINKED(MapBufferRange);
GET_LINKED(FlushMappedBufferRange);
#else
GET_PROC(MapBufferRange);
GET_PROC(FlushMappedBufferRange);
#endif
} else if (extensions.has("GL_EXT_map_buffer_range")) {
#if USE_LINKED && GL_EXT_map_buffer_range
GET_LINKED_SUFFIX(MapBufferRange, EXT);
GET_LINKED_SUFFIX(FlushMappedBufferRange, EXT);
#else
GET_PROC_SUFFIX(MapBufferRange, EXT);
GET_PROC_SUFFIX(FlushMappedBufferRange, EXT);
#endif
}
if (extensions.has("GL_EXT_debug_marker")) {
GET_PROC(InsertEventMarker);
GET_PROC(PushGroupMarker);
GET_PROC(PopGroupMarker);
// The below check is here because a device has been found that has the extension string but
// returns NULL from the eglGetProcAddress for the functions
if (NULL == functions->fInsertEventMarker ||
NULL == functions->fPushGroupMarker ||
NULL == functions->fPopGroupMarker) {
extensions.remove("GL_EXT_debug_marker");
}
}
#if USE_LINKED && GL_ES_VERSION_3_0
GET_LINKED(InvalidateFramebuffer);
GET_LINKED(InvalidateSubFramebuffer);
#else
GET_PROC(InvalidateFramebuffer);
GET_PROC(InvalidateSubFramebuffer);
#endif
GET_PROC(InvalidateBufferData);
GET_PROC(InvalidateBufferSubData);
GET_PROC(InvalidateTexImage);
GET_PROC(InvalidateTexSubImage);
interface->fStandard = kGLES_GrGLStandard;
interface->fExtensions.swap(&extensions);
return interface;
}