/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <debug/NullGlesDriver.h> namespace android { namespace uirenderer { namespace debug { sk_sp<const GrGLInterface> NullGlesDriver::getSkiaInterface() { sk_sp<const GrGLInterface> skiaInterface(GrGLCreateNullInterface()); return skiaInterface; } struct { GLboolean scissorEnabled; } gState; static void nullglGenCommon(GLsizei n, GLuint* buffers) { static GLuint nextId = 0; int i; for (i = 0; i < n; i++) { buffers[i] = ++nextId; } } void NullGlesDriver::glGenBuffers_(GLsizei n, GLuint* buffers) { nullglGenCommon(n, buffers); } void NullGlesDriver::glGenFramebuffers_(GLsizei n, GLuint* framebuffers) { nullglGenCommon(n, framebuffers); } void NullGlesDriver::glGenRenderbuffers_(GLsizei n, GLuint* renderbuffers) { nullglGenCommon(n, renderbuffers); } void NullGlesDriver::glGenTextures_(GLsizei n, GLuint* textures) { nullglGenCommon(n, textures); } GLuint NullGlesDriver::glCreateProgram_(void) { static GLuint nextProgram = 0; return ++nextProgram; } GLuint NullGlesDriver::glCreateShader_(GLenum type) { static GLuint nextShader = 0; return ++nextShader; } void NullGlesDriver::glGetProgramiv_(GLuint program, GLenum pname, GLint* params) { switch (pname) { case GL_DELETE_STATUS: case GL_LINK_STATUS: case GL_VALIDATE_STATUS: *params = GL_TRUE; break; case GL_INFO_LOG_LENGTH: *params = 16; break; } } void NullGlesDriver::glGetProgramInfoLog_(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { *length = snprintf(infoLog, bufSize, "success"); if (*length >= bufSize) { *length = bufSize - 1; } } void NullGlesDriver::glGetShaderiv_(GLuint shader, GLenum pname, GLint* params) { switch (pname) { case GL_COMPILE_STATUS: case GL_DELETE_STATUS: *params = GL_TRUE; } } void NullGlesDriver::glGetShaderInfoLog_(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { *length = snprintf(infoLog, bufSize, "success"); if (*length >= bufSize) { *length = bufSize - 1; } } void setBooleanState(GLenum cap, GLboolean value) { switch (cap) { case GL_SCISSOR_TEST: gState.scissorEnabled = value; break; } } void NullGlesDriver::glEnable_(GLenum cap) { setBooleanState(cap, GL_TRUE); } void NullGlesDriver::glDisable_(GLenum cap) { setBooleanState(cap, GL_FALSE); } GLboolean NullGlesDriver::glIsEnabled_(GLenum cap) { switch (cap) { case GL_SCISSOR_TEST: return gState.scissorEnabled; default: return GL_FALSE; } } void NullGlesDriver::glGetIntegerv_(GLenum pname, GLint* data) { switch (pname) { case GL_MAX_TEXTURE_SIZE: *data = 2048; break; case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *data = 4; break; default: *data = 0; } } GLenum NullGlesDriver::glCheckFramebufferStatus_(GLenum target) { switch (target) { case GL_FRAMEBUFFER: return GL_FRAMEBUFFER_COMPLETE; default: return 0; // error case } } static const char* getString(GLenum name) { switch (name) { case GL_VENDOR: return "android"; case GL_RENDERER: return "null"; case GL_VERSION: return "OpenGL ES 2.0 rev1"; case GL_SHADING_LANGUAGE_VERSION: return "OpenGL ES GLSL ES 2.0 rev1"; case GL_EXTENSIONS: default: return ""; } } const GLubyte* NullGlesDriver::glGetString_(GLenum name) { return (GLubyte*)getString(name); } } // namespace debug } // namespace uirenderer } // namespace android