Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 | 8 |
| 9 #include "gl/GrGLInterface.h" | 9 #include "gl/GrGLInterface.h" |
| 10 #include "GrGLDefines.h" | 10 #include "GrGLDefines.h" |
| 11 #include "SkTDArray.h" | 11 #include "SkTDArray.h" |
| 12 #include "GrGLNoOpInterface.h" | 12 #include "GrGLNoOpInterface.h" |
| 13 | 13 |
| 14 // Functions not declared in GrGLBogusInterface.h (not common with the Debug GL interface). | 14 // Functions not declared in GrGLBogusInterface.h (not common with the Debug GL interface). |
| 15 | 15 |
| 16 namespace { // added to suppress 'no previous prototype' warning | 16 namespace { // added to suppress 'no previous prototype' warning |
| 17 | 17 |
| 18 class GrBufferObj { | |
| 19 public: | |
| 20 GrBufferObj() : fDataPtr(NULL), fSize(0), fMapped(false) { | |
| 21 static GrGLuint gNextID = 0; // 0 is reserved | |
| 22 | |
| 23 fID = ++gNextID; | |
| 24 } | |
| 25 ~GrBufferObj() { SkDELETE_ARRAY(fDataPtr); } | |
| 26 | |
| 27 void allocate(GrGLint size, const GrGLchar *dataPtr) { | |
|
tfarina
2013/07/18 16:30:21
nit: GrGLChar*
robertphillips
2013/07/18 16:59:31
Done.
| |
| 28 if (NULL != fDataPtr) { | |
| 29 GrAssert(0 != fSize); | |
| 30 SkDELETE_ARRAY(fDataPtr); | |
| 31 } | |
| 32 | |
| 33 fSize = size; | |
| 34 fDataPtr = SkNEW_ARRAY(char, size); | |
| 35 } | |
| 36 | |
| 37 GrGLuint id() const { return fID; } | |
| 38 GrGLchar *dataPtr() { return fDataPtr; } | |
|
tfarina
2013/07/18 16:30:21
nit: GrGLChar*
robertphillips
2013/07/18 16:59:31
Done.
| |
| 39 GrGLint size() const { return fSize; } | |
| 40 | |
| 41 void setMapped(bool mapped) { fMapped = mapped; } | |
| 42 bool mapped() const { return fMapped; } | |
| 43 | |
| 44 private: | |
| 45 GrGLuint fID; | |
| 46 GrGLchar* fDataPtr; | |
| 47 GrGLint fSize; // size in bytes | |
| 48 bool fMapped; | |
| 49 }; | |
| 50 | |
| 51 // In debug builds we do asserts that ensure we agree with GL about when a buffe r | |
| 52 // is mapped. | |
| 53 static SkTDArray<GrBufferObj*> gBuffers; | |
| 54 static GrGLuint gCurrArrayBuffer; | |
| 55 static GrGLuint gCurrElementArrayBuffer; | |
| 56 | |
| 18 GrGLvoid GR_GL_FUNCTION_TYPE nullGLActiveTexture(GrGLenum texture) {} | 57 GrGLvoid GR_GL_FUNCTION_TYPE nullGLActiveTexture(GrGLenum texture) {} |
| 19 GrGLvoid GR_GL_FUNCTION_TYPE nullGLAttachShader(GrGLuint program, GrGLuint shade r) {} | 58 GrGLvoid GR_GL_FUNCTION_TYPE nullGLAttachShader(GrGLuint program, GrGLuint shade r) {} |
| 20 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBeginQuery(GrGLenum target, GrGLuint id) {} | 59 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBeginQuery(GrGLenum target, GrGLuint id) {} |
| 21 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindAttribLocation(GrGLuint program, GrGLuint index, const char* name) {} | 60 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindAttribLocation(GrGLuint program, GrGLuint index, const char* name) {} |
| 22 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindTexture(GrGLenum target, GrGLuint texture ) {} | 61 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindTexture(GrGLenum target, GrGLuint texture ) {} |
| 23 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindVertexArray(GrGLuint id) {} | 62 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindVertexArray(GrGLuint id) {} |
| 24 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferData(GrGLenum target, GrGLsizeiptr size , const GrGLvoid* data, GrGLenum usage) {} | 63 |
| 64 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGenBuffers(GrGLsizei n, GrGLuint* ids) { | |
| 65 | |
| 66 for (int i = 0; i < n; ++i) { | |
| 67 GrBufferObj* buffer = SkNEW(GrBufferObj); | |
| 68 // This code relies on the id of the buffer being 1 more then its | |
| 69 // position in 'gBuffers' | |
| 70 GrAssert(gBuffers.count() == (int)buffer->id() - 1); | |
| 71 *gBuffers.append() = buffer; | |
| 72 ids[i] = buffer->id(); | |
| 73 } | |
| 74 } | |
| 75 | |
| 76 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferData(GrGLenum target, | |
| 77 GrGLsizeiptr size, | |
| 78 const GrGLvoid* data, | |
| 79 GrGLenum usage) { | |
| 80 GrGLuint id = 0; | |
| 81 | |
| 82 switch (target) { | |
| 83 case GR_GL_ARRAY_BUFFER: | |
| 84 id = gCurrArrayBuffer; | |
| 85 break; | |
| 86 case GR_GL_ELEMENT_ARRAY_BUFFER: | |
| 87 id = gCurrElementArrayBuffer; | |
| 88 break; | |
| 89 default: | |
| 90 GrCrash("Unexpected target to nullGLBufferData"); | |
| 91 break; | |
| 92 } | |
| 93 | |
| 94 if (id > 0) { | |
| 95 GrBufferObj* buffer = gBuffers[id-1]; | |
| 96 GrAssert(NULL != buffer && buffer->id() == id); | |
| 97 | |
| 98 buffer->allocate(size, (const GrGLchar*) data); | |
| 99 } | |
| 100 } | |
| 101 | |
| 25 GrGLvoid GR_GL_FUNCTION_TYPE nullGLPixelStorei(GrGLenum pname, GrGLint param) {} | 102 GrGLvoid GR_GL_FUNCTION_TYPE nullGLPixelStorei(GrGLenum pname, GrGLint param) {} |
| 26 GrGLvoid GR_GL_FUNCTION_TYPE nullGLReadPixels(GrGLint x, GrGLint y, GrGLsizei wi dth, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels) {} | 103 GrGLvoid GR_GL_FUNCTION_TYPE nullGLReadPixels(GrGLint x, GrGLint y, GrGLsizei wi dth, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels) {} |
| 27 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUseProgram(GrGLuint program) {} | 104 GrGLvoid GR_GL_FUNCTION_TYPE nullGLUseProgram(GrGLuint program) {} |
| 28 GrGLvoid GR_GL_FUNCTION_TYPE nullGLViewport(GrGLint x, GrGLint y, GrGLsizei widt h, GrGLsizei height) {} | 105 GrGLvoid GR_GL_FUNCTION_TYPE nullGLViewport(GrGLint x, GrGLint y, GrGLsizei widt h, GrGLsizei height) {} |
| 29 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFramebuffer(GrGLenum target, GrGLuint fra mebuffer) {} | 106 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFramebuffer(GrGLenum target, GrGLuint fra mebuffer) {} |
| 30 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindRenderbuffer(GrGLenum target, GrGLuint re nderbuffer) {} | 107 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindRenderbuffer(GrGLenum target, GrGLuint re nderbuffer) {} |
| 31 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteFramebuffers(GrGLsizei n, const GrGLuin t *framebuffers) {} | 108 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteFramebuffers(GrGLsizei n, const GrGLuin t *framebuffers) {} |
| 32 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteRenderbuffers(GrGLsizei n, const GrGLui nt *renderbuffers) {} | 109 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteRenderbuffers(GrGLsizei n, const GrGLui nt *renderbuffers) {} |
| 33 GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferRenderbuffer(GrGLenum target, GrGL enum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer) {} | 110 GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferRenderbuffer(GrGLenum target, GrGL enum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer) {} |
| 34 GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferTexture2D(GrGLenum target, GrGLenu m attachment, GrGLenum textarget, GrGLuint texture, GrGLint level) {} | 111 GrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferTexture2D(GrGLenum target, GrGLenu m attachment, GrGLenum textarget, GrGLuint texture, GrGLint level) {} |
| 35 | 112 |
| 36 GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateProgram() { | 113 GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateProgram() { |
| 37 static int gCurrID = 0; | 114 static GrGLuint gCurrID = 0; |
| 38 return ++gCurrID; | 115 return ++gCurrID; |
| 39 } | 116 } |
| 40 | 117 |
| 41 GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateShader(GrGLenum type) { | 118 GrGLuint GR_GL_FUNCTION_TYPE nullGLCreateShader(GrGLenum type) { |
| 42 static int gCurrID = 0; | 119 static GrGLuint gCurrID = 0; |
| 43 return ++gCurrID; | 120 return ++gCurrID; |
| 44 } | 121 } |
| 45 | 122 |
| 46 // same delete used for shaders and programs | 123 // same delete used for shaders and programs |
| 47 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDelete(GrGLuint program) { | 124 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDelete(GrGLuint program) { |
| 48 } | 125 } |
| 49 | 126 |
| 50 // In debug builds we do asserts that ensure we agree with GL about when a buffe r | |
| 51 // is mapped. | |
| 52 static SkTDArray<GrGLuint> gMappedBuffers; | |
| 53 static GrGLuint gCurrArrayBuffer; | |
| 54 static GrGLuint gCurrElementArrayBuffer; | |
| 55 | |
| 56 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindBuffer(GrGLenum target, GrGLuint buffer) { | 127 GrGLvoid GR_GL_FUNCTION_TYPE nullGLBindBuffer(GrGLenum target, GrGLuint buffer) { |
| 57 switch (target) { | 128 switch (target) { |
| 58 case GR_GL_ARRAY_BUFFER: | 129 case GR_GL_ARRAY_BUFFER: |
| 59 gCurrArrayBuffer = buffer; | 130 gCurrArrayBuffer = buffer; |
| 60 break; | 131 break; |
| 61 case GR_GL_ELEMENT_ARRAY_BUFFER: | 132 case GR_GL_ELEMENT_ARRAY_BUFFER: |
| 62 gCurrElementArrayBuffer = buffer; | 133 gCurrElementArrayBuffer = buffer; |
| 63 break; | 134 break; |
| 64 } | 135 } |
| 65 } | 136 } |
| 66 | 137 |
| 67 // deleting a bound buffer has the side effect of binding 0 | 138 // deleting a bound buffer has the side effect of binding 0 |
| 68 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteBuffers(GrGLsizei n, const GrGLuint* id s) { | 139 GrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteBuffers(GrGLsizei n, const GrGLuint* id s) { |
| 69 for (int i = 0; i < n; ++i) { | 140 for (int i = 0; i < n; ++i) { |
| 70 if (ids[i] == gCurrArrayBuffer) { | 141 if (ids[i] == gCurrArrayBuffer) { |
| 71 gCurrArrayBuffer = 0; | 142 gCurrArrayBuffer = 0; |
| 72 } | 143 } |
| 73 if (ids[i] == gCurrElementArrayBuffer) { | 144 if (ids[i] == gCurrElementArrayBuffer) { |
| 74 gCurrElementArrayBuffer = 0; | 145 gCurrElementArrayBuffer = 0; |
| 75 } | 146 } |
| 76 for (int j = 0; j < gMappedBuffers.count(); ++j) { | 147 |
| 77 if (gMappedBuffers[j] == ids[i]) { | 148 GrBufferObj* buffer = gBuffers[ids[i]-1]; |
| 78 gMappedBuffers.remove(j); | 149 GrAssert(NULL != buffer && ids[i] == buffer->id()); |
| 79 // don't break b/c we didn't check for dupes on insert | 150 |
| 80 --j; | 151 SkDELETE(buffer); |
| 81 } | 152 gBuffers[ids[i]-1] = NULL; |
| 82 } | |
| 83 } | 153 } |
| 84 } | 154 } |
| 85 | 155 |
| 86 GrGLvoid* GR_GL_FUNCTION_TYPE nullGLMapBuffer(GrGLenum target, GrGLenum access) { | 156 GrGLvoid* GR_GL_FUNCTION_TYPE nullGLMapBuffer(GrGLenum target, GrGLenum access) { |
| 87 // We just reserve 32MB of RAM for all locks and hope its big enough | 157 |
| 88 static SkAutoMalloc gBufferData(32 * (1 << 20)); | 158 GrGLuint id = 0; |
| 89 GrGLuint buf = 0; | |
| 90 switch (target) { | 159 switch (target) { |
| 91 case GR_GL_ARRAY_BUFFER: | 160 case GR_GL_ARRAY_BUFFER: |
| 92 buf = gCurrArrayBuffer; | 161 id = gCurrArrayBuffer; |
| 93 break; | 162 break; |
| 94 case GR_GL_ELEMENT_ARRAY_BUFFER: | 163 case GR_GL_ELEMENT_ARRAY_BUFFER: |
| 95 buf = gCurrElementArrayBuffer; | 164 id = gCurrElementArrayBuffer; |
| 96 break; | 165 break; |
| 97 } | 166 } |
| 98 if (buf) { | 167 |
| 99 *gMappedBuffers.append() = buf; | 168 if (id > 0) { |
| 169 GrBufferObj* buffer = gBuffers[id-1]; | |
| 170 GrAssert(NULL != buffer && buffer->id() == id); | |
| 171 | |
| 172 GrAssert(!buffer->mapped()); | |
| 173 buffer->setMapped(true); | |
| 174 return buffer->dataPtr(); | |
| 100 } | 175 } |
| 101 return gBufferData.get(); | 176 |
| 177 GrAssert(false); | |
| 178 return NULL; // no buffer bound to target | |
| 102 } | 179 } |
| 103 | 180 |
| 104 GrGLboolean GR_GL_FUNCTION_TYPE nullGLUnmapBuffer(GrGLenum target) { | 181 GrGLboolean GR_GL_FUNCTION_TYPE nullGLUnmapBuffer(GrGLenum target) { |
| 105 GrGLuint buf = 0; | 182 GrGLuint id = 0; |
| 106 switch (target) { | 183 switch (target) { |
| 107 case GR_GL_ARRAY_BUFFER: | 184 case GR_GL_ARRAY_BUFFER: |
| 108 buf = gCurrArrayBuffer; | 185 id = gCurrArrayBuffer; |
| 109 break; | 186 break; |
| 110 case GR_GL_ELEMENT_ARRAY_BUFFER: | 187 case GR_GL_ELEMENT_ARRAY_BUFFER: |
| 111 buf = gCurrElementArrayBuffer; | 188 id = gCurrElementArrayBuffer; |
| 112 break; | 189 break; |
| 113 } | 190 } |
| 114 if (buf) { | 191 if (id > 0) { |
| 115 for (int i = 0; i < gMappedBuffers.count(); ++i) { | 192 GrBufferObj* buffer = gBuffers[id-1]; |
| 116 if (gMappedBuffers[i] == buf) { | 193 GrAssert(NULL != buffer && buffer->id() == id); |
| 117 gMappedBuffers.remove(i); | 194 GrAssert(buffer->mapped()); |
| 118 // don't break b/c we didn't check for dupes on insert | 195 |
| 119 --i; | 196 buffer->setMapped(false); |
| 120 } | 197 return GR_GL_TRUE; |
| 121 } | |
| 122 } | 198 } |
| 123 return GR_GL_TRUE; | 199 |
| 200 GrAlwaysAssert(false); | |
| 201 return GR_GL_FALSE; // GR_GL_INVALID_OPERATION; | |
| 124 } | 202 } |
| 125 | 203 |
| 126 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetBufferParameteriv(GrGLenum target, GrGLenu m pname, GrGLint* params) { | 204 GrGLvoid GR_GL_FUNCTION_TYPE nullGLGetBufferParameteriv(GrGLenum target, GrGLenu m pname, GrGLint* params) { |
| 127 switch (pname) { | 205 switch (pname) { |
| 128 case GR_GL_BUFFER_MAPPED: { | 206 case GR_GL_BUFFER_MAPPED: { |
| 129 *params = GR_GL_FALSE; | 207 *params = GR_GL_FALSE; |
| 130 GrGLuint buf = 0; | 208 GrGLuint id = 0; |
| 131 switch (target) { | 209 switch (target) { |
| 132 case GR_GL_ARRAY_BUFFER: | 210 case GR_GL_ARRAY_BUFFER: |
| 133 buf = gCurrArrayBuffer; | 211 id = gCurrArrayBuffer; |
| 134 break; | 212 break; |
| 135 case GR_GL_ELEMENT_ARRAY_BUFFER: | 213 case GR_GL_ELEMENT_ARRAY_BUFFER: |
| 136 buf = gCurrElementArrayBuffer; | 214 id = gCurrElementArrayBuffer; |
| 137 break; | 215 break; |
| 138 } | 216 } |
| 139 if (buf) { | 217 if (id > 0) { |
| 140 for (int i = 0; i < gMappedBuffers.count(); ++i) { | 218 GrBufferObj* buffer = gBuffers[id-1]; |
| 141 if (gMappedBuffers[i] == buf) { | 219 GrAssert(NULL != buffer && buffer->id() == id); |
| 142 *params = GR_GL_TRUE; | 220 |
| 143 break; | 221 if (buffer->mapped()) { |
| 144 } | 222 *params = GR_GL_TRUE; |
| 145 } | 223 } |
| 146 } | 224 } |
| 147 break; } | 225 break; } |
| 148 default: | 226 default: |
| 149 GrCrash("Unexpected pname to GetBufferParamateriv"); | 227 GrCrash("Unexpected pname to GetBufferParamateriv"); |
| 150 break; | 228 break; |
| 151 } | 229 } |
| 152 }; | 230 }; |
| 153 | 231 |
| 154 } // end anonymous namespace | 232 } // end anonymous namespace |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 195 interface->fDrawArrays = noOpGLDrawArrays; | 273 interface->fDrawArrays = noOpGLDrawArrays; |
| 196 interface->fDrawBuffer = noOpGLDrawBuffer; | 274 interface->fDrawBuffer = noOpGLDrawBuffer; |
| 197 interface->fDrawBuffers = noOpGLDrawBuffers; | 275 interface->fDrawBuffers = noOpGLDrawBuffers; |
| 198 interface->fDrawElements = noOpGLDrawElements; | 276 interface->fDrawElements = noOpGLDrawElements; |
| 199 interface->fEnable = noOpGLEnable; | 277 interface->fEnable = noOpGLEnable; |
| 200 interface->fEnableVertexAttribArray = noOpGLEnableVertexAttribArray; | 278 interface->fEnableVertexAttribArray = noOpGLEnableVertexAttribArray; |
| 201 interface->fEndQuery = noOpGLEndQuery; | 279 interface->fEndQuery = noOpGLEndQuery; |
| 202 interface->fFinish = noOpGLFinish; | 280 interface->fFinish = noOpGLFinish; |
| 203 interface->fFlush = noOpGLFlush; | 281 interface->fFlush = noOpGLFlush; |
| 204 interface->fFrontFace = noOpGLFrontFace; | 282 interface->fFrontFace = noOpGLFrontFace; |
| 205 interface->fGenBuffers = noOpGLGenIds; | 283 interface->fGenBuffers = nullGLGenBuffers; |
| 206 interface->fGenQueries = noOpGLGenIds; | 284 interface->fGenQueries = noOpGLGenIds; |
| 207 interface->fGenTextures = noOpGLGenIds; | 285 interface->fGenTextures = noOpGLGenIds; |
| 208 interface->fGenVertexArrays = noOpGLGenIds; | 286 interface->fGenVertexArrays = noOpGLGenIds; |
| 209 interface->fGetBufferParameteriv = nullGLGetBufferParameteriv; | 287 interface->fGetBufferParameteriv = nullGLGetBufferParameteriv; |
| 210 interface->fGetError = noOpGLGetError; | 288 interface->fGetError = noOpGLGetError; |
| 211 interface->fGetIntegerv = noOpGLGetIntegerv; | 289 interface->fGetIntegerv = noOpGLGetIntegerv; |
| 212 interface->fGetQueryObjecti64v = noOpGLGetQueryObjecti64v; | 290 interface->fGetQueryObjecti64v = noOpGLGetQueryObjecti64v; |
| 213 interface->fGetQueryObjectiv = noOpGLGetQueryObjectiv; | 291 interface->fGetQueryObjectiv = noOpGLGetQueryObjectiv; |
| 214 interface->fGetQueryObjectui64v = noOpGLGetQueryObjectui64v; | 292 interface->fGetQueryObjectui64v = noOpGLGetQueryObjectui64v; |
| 215 interface->fGetQueryObjectuiv = noOpGLGetQueryObjectuiv; | 293 interface->fGetQueryObjectuiv = noOpGLGetQueryObjectuiv; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 280 interface->fRenderbufferStorageMultisample = noOpGLRenderbufferStorageMu ltisample; | 358 interface->fRenderbufferStorageMultisample = noOpGLRenderbufferStorageMu ltisample; |
| 281 interface->fBlitFramebuffer = noOpGLBlitFramebuffer; | 359 interface->fBlitFramebuffer = noOpGLBlitFramebuffer; |
| 282 interface->fResolveMultisampleFramebuffer = noOpGLResolveMultisampleFram ebuffer; | 360 interface->fResolveMultisampleFramebuffer = noOpGLResolveMultisampleFram ebuffer; |
| 283 interface->fMapBuffer = nullGLMapBuffer; | 361 interface->fMapBuffer = nullGLMapBuffer; |
| 284 interface->fUnmapBuffer = nullGLUnmapBuffer; | 362 interface->fUnmapBuffer = nullGLUnmapBuffer; |
| 285 interface->fBindFragDataLocationIndexed = noOpGLBindFragDataLocationInde xed; | 363 interface->fBindFragDataLocationIndexed = noOpGLBindFragDataLocationInde xed; |
| 286 } | 364 } |
| 287 glInterface.get()->ref(); | 365 glInterface.get()->ref(); |
| 288 return glInterface.get(); | 366 return glInterface.get(); |
| 289 } | 367 } |
| OLD | NEW |