bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 1 | |
| 2 | /* |
| 3 | * Copyright 2011 Google Inc. |
| 4 | * |
| 5 | * Use of this source code is governed by a BSD-style license that can be |
| 6 | * found in the LICENSE file. |
| 7 | */ |
| 8 | |
| 9 | |
| 10 | #include "GrGLInterface.h" |
tomhudson@google.com | dd182cb | 2012-02-10 21:01:00 +0000 | [diff] [blame^] | 11 | #include "../GrTDArray.h" |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 12 | |
| 13 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLActiveTexture(GrGLenum texture) {} |
| 14 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLAttachShader(GrGLuint program, GrGLuint shader) {} |
| 15 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLBeginQuery(GrGLenum target, GrGLuint id) {} |
| 16 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindAttribLocation(GrGLuint program, GrGLuint index, const char* name) {} |
| 17 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindTexture(GrGLenum target, GrGLuint texture) {} |
| 18 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLBlendColor(GrGLclampf red, GrGLclampf green, GrGLclampf blue, GrGLclampf alpha) {} |
| 19 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFragDataLocation(GrGLuint program, GrGLuint colorNumber, const GrGLchar* name) {} |
| 20 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLBlendFunc(GrGLenum sfactor, GrGLenum dfactor) {} |
| 21 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferData(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data, GrGLenum usage) {} |
| 22 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferSubData(GrGLenum target, GrGLintptr offset, GrGLsizeiptr size, const GrGLvoid* data) {} |
| 23 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLClear(GrGLbitfield mask) {} |
| 24 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLClearColor(GrGLclampf red, GrGLclampf green, GrGLclampf blue, GrGLclampf alpha) {} |
| 25 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLClearStencil(GrGLint s) {} |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 26 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLColorMask(GrGLboolean red, GrGLboolean green, GrGLboolean blue, GrGLboolean alpha) {} |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 27 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLCompileShader(GrGLuint shader) {} |
| 28 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLCompressedTexImage2D(GrGLenum target, GrGLint level, GrGLenum internalformat, GrGLsizei width, GrGLsizei height, GrGLint border, GrGLsizei imageSize, const GrGLvoid* data) {} |
| 29 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLCullFace(GrGLenum mode) {} |
| 30 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLDepthMask(GrGLboolean flag) {} |
| 31 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLDisable(GrGLenum cap) {} |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 32 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLDisableVertexAttribArray(GrGLuint index) {} |
| 33 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawArrays(GrGLenum mode, GrGLint first, GrGLsizei count) {} |
| 34 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawBuffer(GrGLenum mode) {} |
| 35 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawBuffers(GrGLsizei n, const GrGLenum* bufs) {} |
| 36 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLDrawElements(GrGLenum mode, GrGLsizei count, GrGLenum type, const GrGLvoid* indices) {} |
| 37 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLEnable(GrGLenum cap) {} |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 38 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLEnableVertexAttribArray(GrGLuint index) {} |
| 39 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLEndQuery(GrGLenum target) {} |
| 40 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLFinish() {} |
| 41 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLFlush() {} |
| 42 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLFrontFace(GrGLenum mode) {} |
| 43 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLLineWidth(GrGLfloat width) {} |
| 44 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLLinkProgram(GrGLuint program) {} |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 45 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLPixelStorei(GrGLenum pname, GrGLint param) {} |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 46 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLQueryCounter(GrGLuint id, GrGLenum target) {} |
| 47 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLReadBuffer(GrGLenum src) {} |
| 48 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLReadPixels(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels) {} |
| 49 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLScissor(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height) {} |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 50 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLShaderSource(GrGLuint shader, GrGLsizei count, const char** str, const GrGLint* length) {} |
| 51 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilFunc(GrGLenum func, GrGLint ref, GrGLuint mask) {} |
| 52 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilFuncSeparate(GrGLenum face, GrGLenum func, GrGLint ref, GrGLuint mask) {} |
| 53 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilMask(GrGLuint mask) {} |
| 54 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilMaskSeparate(GrGLenum face, GrGLuint mask) {} |
| 55 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilOp(GrGLenum fail, GrGLenum zfail, GrGLenum zpass) {} |
| 56 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLStencilOpSeparate(GrGLenum face, GrGLenum fail, GrGLenum zfail, GrGLenum zpass) {} |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 57 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLTexImage2D(GrGLenum target, GrGLint level, GrGLint internalformat, GrGLsizei width, GrGLsizei height, GrGLint border, GrGLenum format, GrGLenum type, const GrGLvoid* pixels) {} |
| 58 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLTexParameteri(GrGLenum target, GrGLenum pname, GrGLint param) {} |
bsalomon@google.com | 280e99f | 2012-01-05 16:17:38 +0000 | [diff] [blame] | 59 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLTexStorage2D(GrGLenum target, GrGLsizei levels, GrGLenum internalformat, GrGLsizei width, GrGLsizei height) {} |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 60 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLTexSubImage2D(GrGLenum target, GrGLint level, GrGLint xoffset, GrGLint yoffset, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, const GrGLvoid* pixels) {} |
| 61 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1f(GrGLint location, GrGLfloat v0) {} |
| 62 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1i(GrGLint location, GrGLint v0) {} |
| 63 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {} |
| 64 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform1iv(GrGLint location, GrGLsizei count, const GrGLint* v) {} |
| 65 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2f(GrGLint location, GrGLfloat v0, GrGLfloat v1) {} |
| 66 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2i(GrGLint location, GrGLint v0, GrGLint v1) {} |
| 67 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {} |
| 68 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform2iv(GrGLint location, GrGLsizei count, const GrGLint* v) {} |
| 69 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3f(GrGLint location, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2) {} |
| 70 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3i(GrGLint location, GrGLint v0, GrGLint v1, GrGLint v2) {} |
| 71 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {} |
| 72 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform3iv(GrGLint location, GrGLsizei count, const GrGLint* v) {} |
| 73 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4f(GrGLint location, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2, GrGLfloat v3) {} |
| 74 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4i(GrGLint location, GrGLint v0, GrGLint v1, GrGLint v2, GrGLint v3) {} |
| 75 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4fv(GrGLint location, GrGLsizei count, const GrGLfloat* v) {} |
| 76 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniform4iv(GrGLint location, GrGLsizei count, const GrGLint* v) {} |
| 77 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniformMatrix2fv(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value) {} |
| 78 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniformMatrix3fv(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value) {} |
| 79 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUniformMatrix4fv(GrGLint location, GrGLsizei count, GrGLboolean transpose, const GrGLfloat* value) {} |
| 80 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLUseProgram(GrGLuint program) {} |
| 81 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLVertexAttrib4fv(GrGLuint indx, const GrGLfloat* values) {} |
| 82 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLVertexAttribPointer(GrGLuint indx, GrGLint size, GrGLenum type, GrGLboolean normalized, GrGLsizei stride, const GrGLvoid* ptr) {} |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 83 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLViewport(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height) {} |
| 84 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFramebuffer(GrGLenum target, GrGLuint framebuffer) {} |
| 85 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindRenderbuffer(GrGLenum target, GrGLuint renderbuffer) {} |
| 86 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteFramebuffers(GrGLsizei n, const GrGLuint *framebuffers) {} |
| 87 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteRenderbuffers(GrGLsizei n, const GrGLuint *renderbuffers) {} |
| 88 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferRenderbuffer(GrGLenum target, GrGLenum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer) {} |
| 89 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferTexture2D(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level) {} |
| 90 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetFramebufferAttachmentParameteriv(GrGLenum target, GrGLenum attachment, GrGLenum pname, GrGLint* params) {} |
| 91 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetRenderbufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) {} |
| 92 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLRenderbufferStorage(GrGLenum target, GrGLenum internalformat, GrGLsizei width, GrGLsizei height) {} |
| 93 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLRenderbufferStorageMultisample(GrGLenum target, GrGLsizei samples, GrGLenum internalformat, GrGLsizei width, GrGLsizei height) {} |
| 94 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLBlitFramebuffer(GrGLint srcX0, GrGLint srcY0, GrGLint srcX1, GrGLint srcY1, GrGLint dstX0, GrGLint dstY0, GrGLint dstX1, GrGLint dstY1, GrGLbitfield mask, GrGLenum filter) {} |
| 95 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLResolveMultisampleFramebuffer() {} |
| 96 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFragDataLocationIndexed(GrGLuint program, GrGLuint colorNumber, GrGLuint index, const GrGLchar * name) {} |
| 97 | |
| 98 | GrGLenum GR_GL_FUNCTION_TYPE nullGLCheckFramebufferStatus(GrGLenum target) { |
| 99 | return GR_GL_FRAMEBUFFER_COMPLETE; |
| 100 | } |
| 101 | |
| 102 | GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateProgram() { |
| 103 | static int gCurrID = 0; |
| 104 | return ++gCurrID; |
| 105 | } |
| 106 | |
| 107 | GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateShader(GrGLenum type) { |
| 108 | static int gCurrID = 0; |
| 109 | return ++gCurrID; |
| 110 | } |
| 111 | |
| 112 | // same delete used for shaders and programs |
| 113 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLDelete(GrGLuint program) { |
| 114 | } |
| 115 | |
| 116 | // same function used for all glGen*(GLsize i, GLuint*) functions |
| 117 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLGenIds(GrGLsizei n, GrGLuint* ids) { |
| 118 | static int gCurrID = 0; |
| 119 | for (int i = 0; i < n; ++i) { |
| 120 | ids[i] = ++gCurrID; |
| 121 | } |
| 122 | } |
| 123 | // same delete function for all glDelete*(GLsize i, const GLuint*) except buffers |
| 124 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteIds(GrGLsizei n, const GrGLuint* ids) {} |
| 125 | |
| 126 | // In debug builds we do asserts that ensure we agree with GL about when a buffer |
| 127 | // is mapped. |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 128 | static GrTDArray<GrGLuint> gMappedBuffers; |
| 129 | static GrGLuint gCurrArrayBuffer; |
| 130 | static GrGLuint gCurrElementArrayBuffer; |
| 131 | |
| 132 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindBuffer(GrGLenum target, GrGLuint buffer) { |
| 133 | switch (target) { |
| 134 | case GR_GL_ARRAY_BUFFER: |
| 135 | gCurrArrayBuffer = buffer; |
| 136 | break; |
| 137 | case GR_GL_ELEMENT_ARRAY_BUFFER: |
| 138 | gCurrElementArrayBuffer = buffer; |
| 139 | break; |
| 140 | } |
| 141 | } |
| 142 | |
| 143 | // deleting a bound buffer has the side effect of binding 0 |
| 144 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteBuffers(GrGLsizei n, const GrGLuint* ids) { |
| 145 | for (int i = 0; i < n; ++i) { |
| 146 | if (ids[i] == gCurrArrayBuffer) { |
| 147 | gCurrArrayBuffer = 0; |
| 148 | } |
| 149 | if (ids[i] == gCurrElementArrayBuffer) { |
| 150 | gCurrElementArrayBuffer = 0; |
| 151 | } |
| 152 | for (int j = 0; j < gMappedBuffers.count(); ++j) { |
| 153 | if (gMappedBuffers[j] == ids[i]) { |
| 154 | gMappedBuffers.remove(j); |
| 155 | // don't break b/c we didn't check for dupes on insert |
| 156 | --j; |
| 157 | } |
| 158 | } |
| 159 | } |
| 160 | } |
| 161 | |
| 162 | GrGLvoid* GR_GL_FUNCTION_TYPE nullGLMapBuffer(GrGLenum target, GrGLenum access) { |
| 163 | // We just reserve 32MB of RAM for all locks and hope its big enough |
| 164 | static SkAutoMalloc gBufferData(32 * (1 << 20)); |
| 165 | GrGLuint buf = 0; |
| 166 | switch (target) { |
| 167 | case GR_GL_ARRAY_BUFFER: |
| 168 | buf = gCurrArrayBuffer; |
| 169 | break; |
| 170 | case GR_GL_ELEMENT_ARRAY_BUFFER: |
| 171 | buf = gCurrElementArrayBuffer; |
| 172 | break; |
| 173 | } |
| 174 | if (buf) { |
| 175 | *gMappedBuffers.append() = buf; |
| 176 | } |
| 177 | return gBufferData.get(); |
| 178 | } |
| 179 | |
| 180 | GrGLboolean GR_GL_FUNCTION_TYPE nullGLUnmapBuffer(GrGLenum target) { |
| 181 | GrGLuint buf = 0; |
| 182 | switch (target) { |
| 183 | case GR_GL_ARRAY_BUFFER: |
| 184 | buf = gCurrArrayBuffer; |
| 185 | break; |
| 186 | case GR_GL_ELEMENT_ARRAY_BUFFER: |
| 187 | buf = gCurrElementArrayBuffer; |
| 188 | break; |
| 189 | } |
| 190 | if (buf) { |
| 191 | for (int i = 0; i < gMappedBuffers.count(); ++i) { |
| 192 | if (gMappedBuffers[i] == buf) { |
| 193 | gMappedBuffers.remove(i); |
| 194 | // don't break b/c we didn't check for dupes on insert |
| 195 | --i; |
| 196 | } |
| 197 | } |
| 198 | } |
| 199 | return GR_GL_TRUE; |
| 200 | } |
| 201 | |
| 202 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) { |
| 203 | switch (pname) { |
| 204 | case GR_GL_BUFFER_MAPPED: { |
| 205 | *params = GR_GL_FALSE; |
| 206 | GrGLuint buf = 0; |
| 207 | switch (target) { |
| 208 | case GR_GL_ARRAY_BUFFER: |
| 209 | buf = gCurrArrayBuffer; |
| 210 | break; |
| 211 | case GR_GL_ELEMENT_ARRAY_BUFFER: |
| 212 | buf = gCurrElementArrayBuffer; |
| 213 | break; |
| 214 | } |
| 215 | if (buf) { |
| 216 | for (int i = 0; i < gMappedBuffers.count(); ++i) { |
| 217 | if (gMappedBuffers[i] == buf) { |
| 218 | *params = GR_GL_TRUE; |
| 219 | break; |
| 220 | } |
| 221 | } |
| 222 | } |
| 223 | break; } |
| 224 | default: |
| 225 | GrCrash("Unexpected pname to GetBufferParamateriv"); |
| 226 | break; |
| 227 | } |
| 228 | }; |
| 229 | |
| 230 | GrGLenum GR_GL_FUNCTION_TYPE nullGLGetError() { |
| 231 | return GR_GL_NO_ERROR; |
| 232 | } |
| 233 | |
| 234 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetIntegerv(GrGLenum pname, GrGLint* params) { |
| 235 | switch (pname) { |
| 236 | case GR_GL_STENCIL_BITS: |
| 237 | *params = 8; |
| 238 | break; |
| 239 | case GR_GL_SAMPLES: |
| 240 | *params = 1; |
| 241 | break; |
| 242 | case GR_GL_FRAMEBUFFER_BINDING: |
| 243 | *params = 0; |
| 244 | break; |
| 245 | case GR_GL_VIEWPORT: |
| 246 | params[0] = 0; |
| 247 | params[1] = 0; |
| 248 | params[2] = 800; |
| 249 | params[3] = 600; |
| 250 | break; |
| 251 | case GR_GL_MAX_TEXTURE_IMAGE_UNITS: |
| 252 | *params = 8; |
| 253 | break; |
| 254 | case GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS: |
| 255 | *params = 16; |
| 256 | break; |
| 257 | case GR_GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: |
| 258 | *params = 16 * 4; |
| 259 | break; |
| 260 | case GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS: |
| 261 | *params = 0; |
| 262 | break; |
| 263 | case GR_GL_COMPRESSED_TEXTURE_FORMATS: |
| 264 | break; |
| 265 | case GR_GL_MAX_TEXTURE_SIZE: |
| 266 | *params = 8192; |
| 267 | break; |
| 268 | case GR_GL_MAX_RENDERBUFFER_SIZE: |
| 269 | *params = 8192; |
| 270 | break; |
| 271 | case GR_GL_MAX_SAMPLES: |
| 272 | *params = 32; |
| 273 | break; |
| 274 | case GR_GL_MAX_VERTEX_ATTRIBS: |
| 275 | *params = 16; |
| 276 | break; |
| 277 | case GR_GL_MAX_TEXTURE_UNITS: |
| 278 | *params = 8; |
| 279 | break; |
| 280 | default: |
| 281 | GrCrash("Unexpected pname to GetIntegerv"); |
| 282 | } |
| 283 | } |
| 284 | // used for both the program and shader info logs |
| 285 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetInfoLog(GrGLuint program, GrGLsizei bufsize, GrGLsizei* length, char* infolog) { |
| 286 | if (length) { |
| 287 | *length = 0; |
| 288 | } |
| 289 | if (bufsize > 0) { |
| 290 | *infolog = 0; |
| 291 | } |
| 292 | } |
| 293 | |
| 294 | // used for both the program and shader params |
| 295 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetShaderOrProgramiv(GrGLuint program, GrGLenum pname, GrGLint* params) { |
| 296 | switch (pname) { |
| 297 | case GR_GL_LINK_STATUS: // fallthru |
| 298 | case GR_GL_COMPILE_STATUS: |
| 299 | *params = GR_GL_TRUE; |
| 300 | break; |
| 301 | case GR_GL_INFO_LOG_LENGTH: |
| 302 | *params = 0; |
| 303 | break; |
| 304 | // we don't expect any other pnames |
| 305 | default: |
| 306 | GrCrash("Unexpected pname to GetProgramiv"); |
| 307 | break; |
| 308 | } |
| 309 | } |
| 310 | |
| 311 | namespace { |
| 312 | template <typename T> |
| 313 | void query_result(GrGLenum GLtarget, GrGLenum pname, T *params) { |
| 314 | switch (pname) { |
| 315 | case GR_GL_QUERY_RESULT_AVAILABLE: |
| 316 | *params = GR_GL_TRUE; |
| 317 | break; |
| 318 | case GR_GL_QUERY_RESULT: |
| 319 | *params = 0; |
| 320 | break; |
| 321 | default: |
| 322 | GrCrash("Unexpected pname passed to GetQueryObject."); |
| 323 | break; |
| 324 | } |
| 325 | } |
| 326 | } |
| 327 | |
| 328 | // Queries on the null GL just don't do anything at all. We could potentially make |
| 329 | // the timers work. |
| 330 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryiv(GrGLenum GLtarget, GrGLenum pname, GrGLint *params) { |
| 331 | switch (pname) { |
| 332 | case GR_GL_CURRENT_QUERY: |
| 333 | *params = 0; |
| 334 | break; |
| 335 | case GR_GL_QUERY_COUNTER_BITS: |
| 336 | *params = 32; |
| 337 | break; |
| 338 | default: |
| 339 | GrCrash("Unexpected pname passed GetQueryiv."); |
| 340 | } |
| 341 | } |
| 342 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryObjecti64v(GrGLuint id, GrGLenum pname, GrGLint64 *params) { |
| 343 | query_result(id, pname, params); |
| 344 | } |
| 345 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryObjectiv(GrGLuint id, GrGLenum pname, GrGLint *params) { |
| 346 | query_result(id, pname, params); |
| 347 | } |
| 348 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryObjectui64v(GrGLuint id, GrGLenum pname, GrGLuint64 *params) { |
| 349 | query_result(id, pname, params); |
| 350 | } |
| 351 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetQueryObjectuiv(GrGLuint id, GrGLenum pname, GrGLuint *params) { |
| 352 | query_result(id, pname, params); |
| 353 | } |
| 354 | |
| 355 | const GrGLubyte* GR_GL_FUNCTION_TYPE nullGLGetString(GrGLenum name) { |
| 356 | switch (name) { |
| 357 | case GR_GL_EXTENSIONS: |
| 358 | return (const GrGLubyte*)"GL_ARB_framebuffer_object GL_ARB_blend_func_extended GL_ARB_timer_query GL_ARB_draw_buffers GL_ARB_occlusion_query GL_EXT_blend_color GL_EXT_stencil_wrap"; |
| 359 | case GR_GL_VERSION: |
| 360 | return (const GrGLubyte*)"4.0 Null GL"; |
| 361 | case GR_GL_SHADING_LANGUAGE_VERSION: |
| 362 | return (const GrGLubyte*)"4.20.8 Null GLSL"; |
| 363 | default: |
| 364 | GrCrash("Unexpected name to GetString"); |
| 365 | return NULL; |
| 366 | } |
| 367 | } |
| 368 | |
| 369 | // we used to use this to query stuff about externally created textures, now we just |
| 370 | // require clients to tell us everything about the texture. |
| 371 | GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetTexLevelParameteriv(GrGLenum target, GrGLint level, GrGLenum pname, GrGLint* params) { |
| 372 | GrCrash("Should never query texture parameters."); |
| 373 | } |
| 374 | |
| 375 | GrGLint GR_GL_FUNCTION_TYPE nullGLGetUniformLocation(GrGLuint program, const char* name) { |
| 376 | static int gUniLocation = 0; |
| 377 | return ++gUniLocation; |
| 378 | } |
| 379 | |
| 380 | const GrGLInterface* GrGLCreateNullInterface() { |
| 381 | // The gl functions are not context-specific so we create one global |
| 382 | // interface |
| 383 | static SkAutoTUnref<GrGLInterface> glInterface; |
| 384 | if (!glInterface.get()) { |
| 385 | GrGLInterface* interface = new GrGLInterface; |
| 386 | glInterface.reset(interface); |
| 387 | interface->fBindingsExported = kDesktop_GrGLBinding; |
| 388 | interface->fActiveTexture = nullGLActiveTexture; |
| 389 | interface->fAttachShader = nullGLAttachShader; |
| 390 | interface->fBeginQuery = nullGLBeginQuery; |
| 391 | interface->fBindAttribLocation = nullGLBindAttribLocation; |
| 392 | interface->fBindBuffer = nullGLBindBuffer; |
| 393 | interface->fBindFragDataLocation = nullGLBindFragDataLocation; |
| 394 | interface->fBindTexture = nullGLBindTexture; |
| 395 | interface->fBlendColor = nullGLBlendColor; |
| 396 | interface->fBlendFunc = nullGLBlendFunc; |
| 397 | interface->fBufferData = nullGLBufferData; |
| 398 | interface->fBufferSubData = nullGLBufferSubData; |
| 399 | interface->fClear = nullGLClear; |
| 400 | interface->fClearColor = nullGLClearColor; |
| 401 | interface->fClearStencil = nullGLClearStencil; |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 402 | interface->fColorMask = nullGLColorMask; |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 403 | interface->fCompileShader = nullGLCompileShader; |
| 404 | interface->fCompressedTexImage2D = nullGLCompressedTexImage2D; |
| 405 | interface->fCreateProgram = nullGLCreateProgram; |
| 406 | interface->fCreateShader = nullGLCreateShader; |
| 407 | interface->fCullFace = nullGLCullFace; |
| 408 | interface->fDeleteBuffers = nullGLDeleteBuffers; |
| 409 | interface->fDeleteProgram = nullGLDelete; |
| 410 | interface->fDeleteQueries = nullGLDeleteIds; |
| 411 | interface->fDeleteShader = nullGLDelete; |
| 412 | interface->fDeleteTextures = nullGLDeleteIds; |
| 413 | interface->fDepthMask = nullGLDepthMask; |
| 414 | interface->fDisable = nullGLDisable; |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 415 | interface->fDisableVertexAttribArray = nullGLDisableVertexAttribArray; |
| 416 | interface->fDrawArrays = nullGLDrawArrays; |
| 417 | interface->fDrawBuffer = nullGLDrawBuffer; |
| 418 | interface->fDrawBuffers = nullGLDrawBuffers; |
| 419 | interface->fDrawElements = nullGLDrawElements; |
| 420 | interface->fEnable = nullGLEnable; |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 421 | interface->fEnableVertexAttribArray = nullGLEnableVertexAttribArray; |
| 422 | interface->fEndQuery = nullGLEndQuery; |
| 423 | interface->fFinish = nullGLFinish; |
| 424 | interface->fFlush = nullGLFlush; |
| 425 | interface->fFrontFace = nullGLFrontFace; |
| 426 | interface->fGenBuffers = nullGLGenIds; |
| 427 | interface->fGenQueries = nullGLGenIds; |
| 428 | interface->fGenTextures = nullGLGenIds; |
| 429 | interface->fGetBufferParameteriv = nullGLGetBufferParameteriv; |
| 430 | interface->fGetError = nullGLGetError; |
| 431 | interface->fGetIntegerv = nullGLGetIntegerv; |
| 432 | interface->fGetQueryObjecti64v = nullGLGetQueryObjecti64v; |
| 433 | interface->fGetQueryObjectiv = nullGLGetQueryObjectiv; |
| 434 | interface->fGetQueryObjectui64v = nullGLGetQueryObjectui64v; |
| 435 | interface->fGetQueryObjectuiv = nullGLGetQueryObjectuiv; |
| 436 | interface->fGetQueryiv = nullGLGetQueryiv; |
| 437 | interface->fGetProgramInfoLog = nullGLGetInfoLog; |
| 438 | interface->fGetProgramiv = nullGLGetShaderOrProgramiv; |
| 439 | interface->fGetShaderInfoLog = nullGLGetInfoLog; |
| 440 | interface->fGetShaderiv = nullGLGetShaderOrProgramiv; |
| 441 | interface->fGetString = nullGLGetString; |
| 442 | interface->fGetTexLevelParameteriv = nullGLGetTexLevelParameteriv; |
| 443 | interface->fGetUniformLocation = nullGLGetUniformLocation; |
| 444 | interface->fLineWidth = nullGLLineWidth; |
| 445 | interface->fLinkProgram = nullGLLinkProgram; |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 446 | interface->fPixelStorei = nullGLPixelStorei; |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 447 | interface->fQueryCounter = nullGLQueryCounter; |
| 448 | interface->fReadBuffer = nullGLReadBuffer; |
| 449 | interface->fReadPixels = nullGLReadPixels; |
| 450 | interface->fScissor = nullGLScissor; |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 451 | interface->fShaderSource = nullGLShaderSource; |
| 452 | interface->fStencilFunc = nullGLStencilFunc; |
| 453 | interface->fStencilFuncSeparate = nullGLStencilFuncSeparate; |
| 454 | interface->fStencilMask = nullGLStencilMask; |
| 455 | interface->fStencilMaskSeparate = nullGLStencilMaskSeparate; |
| 456 | interface->fStencilOp = nullGLStencilOp; |
| 457 | interface->fStencilOpSeparate = nullGLStencilOpSeparate; |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 458 | interface->fTexImage2D = nullGLTexImage2D; |
| 459 | interface->fTexParameteri = nullGLTexParameteri; |
| 460 | interface->fTexSubImage2D = nullGLTexSubImage2D; |
bsalomon@google.com | 280e99f | 2012-01-05 16:17:38 +0000 | [diff] [blame] | 461 | interface->fTexStorage2D = nullGLTexStorage2D; |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 462 | interface->fUniform1f = nullGLUniform1f; |
| 463 | interface->fUniform1i = nullGLUniform1i; |
| 464 | interface->fUniform1fv = nullGLUniform1fv; |
| 465 | interface->fUniform1iv = nullGLUniform1iv; |
| 466 | interface->fUniform2f = nullGLUniform2f; |
| 467 | interface->fUniform2i = nullGLUniform2i; |
| 468 | interface->fUniform2fv = nullGLUniform2fv; |
| 469 | interface->fUniform2iv = nullGLUniform2iv; |
| 470 | interface->fUniform3f = nullGLUniform3f; |
| 471 | interface->fUniform3i = nullGLUniform3i; |
| 472 | interface->fUniform3fv = nullGLUniform3fv; |
| 473 | interface->fUniform3iv = nullGLUniform3iv; |
| 474 | interface->fUniform4f = nullGLUniform4f; |
| 475 | interface->fUniform4i = nullGLUniform4i; |
| 476 | interface->fUniform4fv = nullGLUniform4fv; |
| 477 | interface->fUniform4iv = nullGLUniform4iv; |
| 478 | interface->fUniformMatrix2fv = nullGLUniformMatrix2fv; |
| 479 | interface->fUniformMatrix3fv = nullGLUniformMatrix3fv; |
| 480 | interface->fUniformMatrix4fv = nullGLUniformMatrix4fv; |
| 481 | interface->fUseProgram = nullGLUseProgram; |
| 482 | interface->fVertexAttrib4fv = nullGLVertexAttrib4fv; |
| 483 | interface->fVertexAttribPointer = nullGLVertexAttribPointer; |
bsalomon@google.com | 7491372 | 2011-10-27 20:44:19 +0000 | [diff] [blame] | 484 | interface->fViewport = nullGLViewport; |
| 485 | interface->fBindFramebuffer = nullGLBindFramebuffer; |
| 486 | interface->fBindRenderbuffer = nullGLBindRenderbuffer; |
| 487 | interface->fCheckFramebufferStatus = nullGLCheckFramebufferStatus; |
| 488 | interface->fDeleteFramebuffers = nullGLDeleteFramebuffers; |
| 489 | interface->fDeleteRenderbuffers = nullGLDeleteRenderbuffers; |
| 490 | interface->fFramebufferRenderbuffer = nullGLFramebufferRenderbuffer; |
| 491 | interface->fFramebufferTexture2D = nullGLFramebufferTexture2D; |
| 492 | interface->fGenFramebuffers = nullGLGenIds; |
| 493 | interface->fGenRenderbuffers = nullGLGenIds; |
| 494 | interface->fGetFramebufferAttachmentParameteriv = nullGLGetFramebufferAttachmentParameteriv; |
| 495 | interface->fGetRenderbufferParameteriv = nullGLGetRenderbufferParameteriv; |
| 496 | interface->fRenderbufferStorage = nullGLRenderbufferStorage; |
| 497 | interface->fRenderbufferStorageMultisample = nullGLRenderbufferStorageMultisample; |
| 498 | interface->fBlitFramebuffer = nullGLBlitFramebuffer; |
| 499 | interface->fResolveMultisampleFramebuffer = nullGLResolveMultisampleFramebuffer; |
| 500 | interface->fMapBuffer = nullGLMapBuffer; |
| 501 | interface->fUnmapBuffer = nullGLUnmapBuffer; |
| 502 | interface->fBindFragDataLocationIndexed = nullGLBindFragDataLocationIndexed; |
| 503 | } |
| 504 | glInterface.get()->ref(); |
| 505 | return glInterface.get(); |
| 506 | } |