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