GrGLCreateNullInterface.cpp revision ecd84842b3f65918eb040c53391172b6413fd7ad
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 9#include "gl/GrGLInterface.h" 10#include "GrGLDefines.h" 11#include "SkTDArray.h" 12#include "GrGLNoOpInterface.h" 13 14// Functions not declared in GrGLBogusInterface.h (not common with the Debug GL interface). 15 16namespace { // added to suppress 'no previous prototype' warning 17 18GrGLvoid GR_GL_FUNCTION_TYPE nullGLActiveTexture(GrGLenum texture) {} 19GrGLvoid GR_GL_FUNCTION_TYPE nullGLAttachShader(GrGLuint program, GrGLuint shader) {} 20GrGLvoid GR_GL_FUNCTION_TYPE nullGLBeginQuery(GrGLenum target, GrGLuint id) {} 21GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindAttribLocation(GrGLuint program, GrGLuint index, const char* name) {} 22GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindTexture(GrGLenum target, GrGLuint texture) {} 23GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindVertexArray(GrGLuint id) {} 24GrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferData(GrGLenum target, GrGLsizeiptr size, const GrGLvoid* data, GrGLenum usage) {} 25GrGLvoid GR_GL_FUNCTION_TYPE nullGLPixelStorei(GrGLenum pname, GrGLint param) {} 26GrGLvoid GR_GL_FUNCTION_TYPE nullGLReadPixels(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels) {} 27GrGLvoid GR_GL_FUNCTION_TYPE nullGLUseProgram(GrGLuint program) {} 28GrGLvoid GR_GL_FUNCTION_TYPE nullGLViewport(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height) {} 29GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFramebuffer(GrGLenum target, GrGLuint framebuffer) {} 30GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindRenderbuffer(GrGLenum target, GrGLuint renderbuffer) {} 31GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteFramebuffers(GrGLsizei n, const GrGLuint *framebuffers) {} 32GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteRenderbuffers(GrGLsizei n, const GrGLuint *renderbuffers) {} 33GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferRenderbuffer(GrGLenum target, GrGLenum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer) {} 34GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferTexture2D(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level) {} 35 36GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateProgram() { 37 static int gCurrID = 0; 38 return ++gCurrID; 39} 40 41GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateShader(GrGLenum type) { 42 static int gCurrID = 0; 43 return ++gCurrID; 44} 45 46// same delete used for shaders and programs 47GrGLvoid GR_GL_FUNCTION_TYPE nullGLDelete(GrGLuint program) { 48} 49 50// In debug builds we do asserts that ensure we agree with GL about when a buffer 51// is mapped. 52static SkTDArray<GrGLuint> gMappedBuffers; 53static GrGLuint gCurrArrayBuffer; 54static GrGLuint gCurrElementArrayBuffer; 55 56GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindBuffer(GrGLenum target, GrGLuint buffer) { 57 switch (target) { 58 case GR_GL_ARRAY_BUFFER: 59 gCurrArrayBuffer = buffer; 60 break; 61 case GR_GL_ELEMENT_ARRAY_BUFFER: 62 gCurrElementArrayBuffer = buffer; 63 break; 64 } 65} 66 67// deleting a bound buffer has the side effect of binding 0 68GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteBuffers(GrGLsizei n, const GrGLuint* ids) { 69 for (int i = 0; i < n; ++i) { 70 if (ids[i] == gCurrArrayBuffer) { 71 gCurrArrayBuffer = 0; 72 } 73 if (ids[i] == gCurrElementArrayBuffer) { 74 gCurrElementArrayBuffer = 0; 75 } 76 for (int j = 0; j < gMappedBuffers.count(); ++j) { 77 if (gMappedBuffers[j] == ids[i]) { 78 gMappedBuffers.remove(j); 79 // don't break b/c we didn't check for dupes on insert 80 --j; 81 } 82 } 83 } 84} 85 86GrGLvoid* GR_GL_FUNCTION_TYPE nullGLMapBuffer(GrGLenum target, GrGLenum access) { 87 // We just reserve 32MB of RAM for all locks and hope its big enough 88 static SkAutoMalloc gBufferData(32 * (1 << 20)); 89 GrGLuint buf = 0; 90 switch (target) { 91 case GR_GL_ARRAY_BUFFER: 92 buf = gCurrArrayBuffer; 93 break; 94 case GR_GL_ELEMENT_ARRAY_BUFFER: 95 buf = gCurrElementArrayBuffer; 96 break; 97 } 98 if (buf) { 99 *gMappedBuffers.append() = buf; 100 } 101 return gBufferData.get(); 102} 103 104GrGLboolean GR_GL_FUNCTION_TYPE nullGLUnmapBuffer(GrGLenum target) { 105 GrGLuint buf = 0; 106 switch (target) { 107 case GR_GL_ARRAY_BUFFER: 108 buf = gCurrArrayBuffer; 109 break; 110 case GR_GL_ELEMENT_ARRAY_BUFFER: 111 buf = gCurrElementArrayBuffer; 112 break; 113 } 114 if (buf) { 115 for (int i = 0; i < gMappedBuffers.count(); ++i) { 116 if (gMappedBuffers[i] == buf) { 117 gMappedBuffers.remove(i); 118 // don't break b/c we didn't check for dupes on insert 119 --i; 120 } 121 } 122 } 123 return GR_GL_TRUE; 124} 125 126GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) { 127 switch (pname) { 128 case GR_GL_BUFFER_MAPPED: { 129 *params = GR_GL_FALSE; 130 GrGLuint buf = 0; 131 switch (target) { 132 case GR_GL_ARRAY_BUFFER: 133 buf = gCurrArrayBuffer; 134 break; 135 case GR_GL_ELEMENT_ARRAY_BUFFER: 136 buf = gCurrElementArrayBuffer; 137 break; 138 } 139 if (buf) { 140 for (int i = 0; i < gMappedBuffers.count(); ++i) { 141 if (gMappedBuffers[i] == buf) { 142 *params = GR_GL_TRUE; 143 break; 144 } 145 } 146 } 147 break; } 148 default: 149 GrCrash("Unexpected pname to GetBufferParamateriv"); 150 break; 151 } 152}; 153 154} // end anonymous namespace 155 156const GrGLInterface* GrGLCreateNullInterface() { 157 // The gl functions are not context-specific so we create one global 158 // interface 159 static SkAutoTUnref<GrGLInterface> glInterface; 160 if (!glInterface.get()) { 161 GrGLInterface* interface = SkNEW(GrGLInterface); 162 glInterface.reset(interface); 163 interface->fBindingsExported = kDesktop_GrGLBinding; 164 interface->fActiveTexture = nullGLActiveTexture; 165 interface->fAttachShader = nullGLAttachShader; 166 interface->fBeginQuery = nullGLBeginQuery; 167 interface->fBindAttribLocation = nullGLBindAttribLocation; 168 interface->fBindBuffer = nullGLBindBuffer; 169 interface->fBindFragDataLocation = noOpGLBindFragDataLocation; 170 interface->fBindTexture = nullGLBindTexture; 171 interface->fBindVertexArray = nullGLBindVertexArray; 172 interface->fBlendColor = noOpGLBlendColor; 173 interface->fBlendFunc = noOpGLBlendFunc; 174 interface->fBufferData = nullGLBufferData; 175 interface->fBufferSubData = noOpGLBufferSubData; 176 interface->fClear = noOpGLClear; 177 interface->fClearColor = noOpGLClearColor; 178 interface->fClearStencil = noOpGLClearStencil; 179 interface->fColorMask = noOpGLColorMask; 180 interface->fCompileShader = noOpGLCompileShader; 181 interface->fCompressedTexImage2D = noOpGLCompressedTexImage2D; 182 interface->fCreateProgram = nullGLCreateProgram; 183 interface->fCreateShader = nullGLCreateShader; 184 interface->fCullFace = noOpGLCullFace; 185 interface->fDeleteBuffers = nullGLDeleteBuffers; 186 interface->fDeleteProgram = nullGLDelete; 187 interface->fDeleteQueries = noOpGLDeleteIds; 188 interface->fDeleteShader = nullGLDelete; 189 interface->fDeleteTextures = noOpGLDeleteIds; 190 interface->fDeleteVertexArrays = noOpGLDeleteIds; 191 interface->fDepthMask = noOpGLDepthMask; 192 interface->fDisable = noOpGLDisable; 193 interface->fDisableVertexAttribArray = noOpGLDisableVertexAttribArray; 194 interface->fDrawArrays = noOpGLDrawArrays; 195 interface->fDrawBuffer = noOpGLDrawBuffer; 196 interface->fDrawBuffers = noOpGLDrawBuffers; 197 interface->fDrawElements = noOpGLDrawElements; 198 interface->fEnable = noOpGLEnable; 199 interface->fEnableVertexAttribArray = noOpGLEnableVertexAttribArray; 200 interface->fEndQuery = noOpGLEndQuery; 201 interface->fFinish = noOpGLFinish; 202 interface->fFlush = noOpGLFlush; 203 interface->fFrontFace = noOpGLFrontFace; 204 interface->fGenBuffers = noOpGLGenIds; 205 interface->fGenQueries = noOpGLGenIds; 206 interface->fGenTextures = noOpGLGenIds; 207 interface->fGenVertexArrays = noOpGLGenIds; 208 interface->fGetBufferParameteriv = nullGLGetBufferParameteriv; 209 interface->fGetError = noOpGLGetError; 210 interface->fGetIntegerv = noOpGLGetIntegerv; 211 interface->fGetQueryObjecti64v = noOpGLGetQueryObjecti64v; 212 interface->fGetQueryObjectiv = noOpGLGetQueryObjectiv; 213 interface->fGetQueryObjectui64v = noOpGLGetQueryObjectui64v; 214 interface->fGetQueryObjectuiv = noOpGLGetQueryObjectuiv; 215 interface->fGetQueryiv = noOpGLGetQueryiv; 216 interface->fGetProgramInfoLog = noOpGLGetInfoLog; 217 interface->fGetProgramiv = noOpGLGetShaderOrProgramiv; 218 interface->fGetShaderInfoLog = noOpGLGetInfoLog; 219 interface->fGetShaderiv = noOpGLGetShaderOrProgramiv; 220 interface->fGetString = noOpGLGetString; 221 interface->fGetStringi = noOpGLGetStringi; 222 interface->fGetTexLevelParameteriv = noOpGLGetTexLevelParameteriv; 223 interface->fGetUniformLocation = noOpGLGetUniformLocation; 224 interface->fLineWidth = noOpGLLineWidth; 225 interface->fLinkProgram = noOpGLLinkProgram; 226 interface->fPixelStorei = nullGLPixelStorei; 227 interface->fQueryCounter = noOpGLQueryCounter; 228 interface->fReadBuffer = noOpGLReadBuffer; 229 interface->fReadPixels = nullGLReadPixels; 230 interface->fScissor = noOpGLScissor; 231 interface->fShaderSource = noOpGLShaderSource; 232 interface->fStencilFunc = noOpGLStencilFunc; 233 interface->fStencilFuncSeparate = noOpGLStencilFuncSeparate; 234 interface->fStencilMask = noOpGLStencilMask; 235 interface->fStencilMaskSeparate = noOpGLStencilMaskSeparate; 236 interface->fStencilOp = noOpGLStencilOp; 237 interface->fStencilOpSeparate = noOpGLStencilOpSeparate; 238 interface->fTexImage2D = noOpGLTexImage2D; 239 interface->fTexParameteri = noOpGLTexParameteri; 240 interface->fTexParameteriv = noOpGLTexParameteriv; 241 interface->fTexSubImage2D = noOpGLTexSubImage2D; 242 interface->fTexStorage2D = noOpGLTexStorage2D; 243 interface->fUniform1f = noOpGLUniform1f; 244 interface->fUniform1i = noOpGLUniform1i; 245 interface->fUniform1fv = noOpGLUniform1fv; 246 interface->fUniform1iv = noOpGLUniform1iv; 247 interface->fUniform2f = noOpGLUniform2f; 248 interface->fUniform2i = noOpGLUniform2i; 249 interface->fUniform2fv = noOpGLUniform2fv; 250 interface->fUniform2iv = noOpGLUniform2iv; 251 interface->fUniform3f = noOpGLUniform3f; 252 interface->fUniform3i = noOpGLUniform3i; 253 interface->fUniform3fv = noOpGLUniform3fv; 254 interface->fUniform3iv = noOpGLUniform3iv; 255 interface->fUniform4f = noOpGLUniform4f; 256 interface->fUniform4i = noOpGLUniform4i; 257 interface->fUniform4fv = noOpGLUniform4fv; 258 interface->fUniform4iv = noOpGLUniform4iv; 259 interface->fUniformMatrix2fv = noOpGLUniformMatrix2fv; 260 interface->fUniformMatrix3fv = noOpGLUniformMatrix3fv; 261 interface->fUniformMatrix4fv = noOpGLUniformMatrix4fv; 262 interface->fUseProgram = nullGLUseProgram; 263 interface->fVertexAttrib4fv = noOpGLVertexAttrib4fv; 264 interface->fVertexAttribPointer = noOpGLVertexAttribPointer; 265 interface->fViewport = nullGLViewport; 266 interface->fBindFramebuffer = nullGLBindFramebuffer; 267 interface->fBindRenderbuffer = nullGLBindRenderbuffer; 268 interface->fCheckFramebufferStatus = noOpGLCheckFramebufferStatus; 269 interface->fDeleteFramebuffers = nullGLDeleteFramebuffers; 270 interface->fDeleteRenderbuffers = nullGLDeleteRenderbuffers; 271 interface->fFramebufferRenderbuffer = nullGLFramebufferRenderbuffer; 272 interface->fFramebufferTexture2D = nullGLFramebufferTexture2D; 273 interface->fGenFramebuffers = noOpGLGenIds; 274 interface->fGenRenderbuffers = noOpGLGenIds; 275 interface->fGetFramebufferAttachmentParameteriv = noOpGLGetFramebufferAttachmentParameteriv; 276 interface->fGetRenderbufferParameteriv = noOpGLGetRenderbufferParameteriv; 277 interface->fRenderbufferStorage = noOpGLRenderbufferStorage; 278 interface->fRenderbufferStorageMultisample = noOpGLRenderbufferStorageMultisample; 279 interface->fBlitFramebuffer = noOpGLBlitFramebuffer; 280 interface->fResolveMultisampleFramebuffer = noOpGLResolveMultisampleFramebuffer; 281 interface->fMapBuffer = nullGLMapBuffer; 282 interface->fUnmapBuffer = nullGLUnmapBuffer; 283 interface->fBindFragDataLocationIndexed = noOpGLBindFragDataLocationIndexed; 284 } 285 glInterface.get()->ref(); 286 return glInterface.get(); 287} 288