180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "gl/GrGLInterface.h" 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrGLDefines.h" 11d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#include "SkTDArray.h" 12096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "GrGLNoOpInterface.h" 13096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 14096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// Functions not declared in GrGLBogusInterface.h (not common with the Debug GL interface). 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querunamespace { // added to suppress 'no previous prototype' warning 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerclass GrBufferObj { 1958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerpublic: 2058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrBufferObj(GrGLuint id) : fID(id), fDataPtr(NULL), fSize(0), fMapped(false) { 2158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 2258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger ~GrBufferObj() { SkDELETE_ARRAY(fDataPtr); } 2358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 2458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger void allocate(GrGLsizeiptr size, const GrGLchar* dataPtr) { 2558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (NULL != fDataPtr) { 260a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(0 != fSize); 2758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkDELETE_ARRAY(fDataPtr); 2858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 2958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 3058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fSize = size; 3158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger fDataPtr = SkNEW_ARRAY(char, size); 3258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 3358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 3458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrGLuint id() const { return fID; } 3558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrGLchar* dataPtr() { return fDataPtr; } 3658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrGLsizeiptr size() const { return fSize; } 3758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 3858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger void setMapped(bool mapped) { fMapped = mapped; } 3958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger bool mapped() const { return fMapped; } 4058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 4158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerprivate: 4258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrGLuint fID; 4358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrGLchar* fDataPtr; 4458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrGLsizeiptr fSize; // size in bytes 4558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger bool fMapped; 4658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}; 4758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 4858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger// In debug builds we do asserts that ensure we agree with GL about when a buffer 4958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger// is mapped. 5058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic SkTDArray<GrBufferObj*> gBuffers; // slot 0 is reserved for head of free list 5158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic GrGLuint gCurrArrayBuffer; 5258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic GrGLuint gCurrElementArrayBuffer; 5358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 5458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic GrBufferObj* look_up(GrGLuint id) { 5558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrBufferObj* buffer = gBuffers[id]; 560a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(NULL != buffer && buffer->id() == id); 5758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return buffer; 5858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger} 5958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 6058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic GrBufferObj* create_buffer() { 6158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (0 == gBuffers.count()) { 6258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger // slot zero is reserved for the head of the free list 6358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger *gBuffers.append() = NULL; 6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 6558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 6658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrGLuint id; 6758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrBufferObj* buffer; 6858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 6958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (NULL == gBuffers[0]) { 7058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger // no free slots - create a new one 7158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger id = gBuffers.count(); 7258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger buffer = SkNEW_ARGS(GrBufferObj, (id)); 7358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger gBuffers.append(1, &buffer); 7458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } else { 7558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger // recycle a slot from the free list 7658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger id = SkTCast<GrGLuint>(gBuffers[0]); 7758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger gBuffers[0] = gBuffers[id]; 7858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 7958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger buffer = SkNEW_ARGS(GrBufferObj, (id)); 8058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger gBuffers[id] = buffer; 8158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 8258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 8358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return buffer; 8458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger} 8558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 8658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic void delete_buffer(GrBufferObj* buffer) { 870a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(gBuffers.count() > 0); 8858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 8958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrGLuint id = buffer->id(); 9058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger SkDELETE(buffer); 9158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 9258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger // Add this slot to the free list 9358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger gBuffers[id] = gBuffers[0]; 9458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger gBuffers[0] = SkTCast<GrBufferObj*>((const void*)(intptr_t)id); 9558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger} 9658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLActiveTexture(GrGLenum texture) {} 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLAttachShader(GrGLuint program, GrGLuint shader) {} 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLBeginQuery(GrGLenum target, GrGLuint id) {} 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindAttribLocation(GrGLuint program, GrGLuint index, const char* name) {} 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindTexture(GrGLenum target, GrGLuint texture) {} 102096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindVertexArray(GrGLuint id) {} 1030a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLClientActiveTexture(GrGLenum) {} 10458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 10558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGenBuffers(GrGLsizei n, GrGLuint* ids) { 10658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 10758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger for (int i = 0; i < n; ++i) { 10858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrBufferObj* buffer = create_buffer(); 10958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger ids[i] = buffer->id(); 11058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 11158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger} 11258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 113e27eefc4844477cee5d32f51ab45ff62020cdb36Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLGenerateMipmap(GrGLenum target) {} 114e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger 11558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerGrGLvoid GR_GL_FUNCTION_TYPE nullGLBufferData(GrGLenum target, 11658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrGLsizeiptr size, 11758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger const GrGLvoid* data, 11858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrGLenum usage) { 11958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrGLuint id = 0; 12058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 12158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger switch (target) { 12258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger case GR_GL_ARRAY_BUFFER: 12358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger id = gCurrArrayBuffer; 12458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger break; 12558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger case GR_GL_ELEMENT_ARRAY_BUFFER: 12658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger id = gCurrElementArrayBuffer; 12758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger break; 12858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger default: 12958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrCrash("Unexpected target to nullGLBufferData"); 13058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger break; 13158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 13258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 13358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (id > 0) { 13458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrBufferObj* buffer = look_up(id); 13558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger buffer->allocate(size, (const GrGLchar*) data); 13658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger } 13758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger} 13858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLPixelStorei(GrGLenum pname, GrGLint param) {} 14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLReadPixels(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height, GrGLenum format, GrGLenum type, GrGLvoid* pixels) {} 14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLUseProgram(GrGLuint program) {} 14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLViewport(GrGLint x, GrGLint y, GrGLsizei width, GrGLsizei height) {} 14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindFramebuffer(GrGLenum target, GrGLuint framebuffer) {} 14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindRenderbuffer(GrGLenum target, GrGLuint renderbuffer) {} 14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteFramebuffers(GrGLsizei n, const GrGLuint *framebuffers) {} 14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteRenderbuffers(GrGLsizei n, const GrGLuint *renderbuffers) {} 14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferRenderbuffer(GrGLenum target, GrGLenum attachment, GrGLenum renderbuffertarget, GrGLuint renderbuffer) {} 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLFramebufferTexture2D(GrGLenum target, GrGLenum attachment, GrGLenum textarget, GrGLuint texture, GrGLint level) {} 14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLuint GR_GL_FUNCTION_TYPE nullGLCreateProgram() { 15158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger static GrGLuint gCurrID = 0; 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return ++gCurrID; 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLuint GR_GL_FUNCTION_TYPE nullGLCreateShader(GrGLenum type) { 15658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger static GrGLuint gCurrID = 0; 15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return ++gCurrID; 15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// same delete used for shaders and programs 16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLDelete(GrGLuint program) { 16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLBindBuffer(GrGLenum target, GrGLuint buffer) { 16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru switch (target) { 16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case GR_GL_ARRAY_BUFFER: 16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru gCurrArrayBuffer = buffer; 16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case GR_GL_ELEMENT_ARRAY_BUFFER: 17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru gCurrElementArrayBuffer = buffer; 17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// deleting a bound buffer has the side effect of binding 0 17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLDeleteBuffers(GrGLsizei n, const GrGLuint* ids) { 17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < n; ++i) { 17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (ids[i] == gCurrArrayBuffer) { 17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru gCurrArrayBuffer = 0; 18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (ids[i] == gCurrElementArrayBuffer) { 18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru gCurrElementArrayBuffer = 0; 18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 18458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 18558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrBufferObj* buffer = look_up(ids[i]); 18658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger delete_buffer(buffer); 18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid* GR_GL_FUNCTION_TYPE nullGLMapBuffer(GrGLenum target, GrGLenum access) { 19158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 19258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrGLuint id = 0; 19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru switch (target) { 19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case GR_GL_ARRAY_BUFFER: 19558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger id = gCurrArrayBuffer; 19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case GR_GL_ELEMENT_ARRAY_BUFFER: 19858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger id = gCurrElementArrayBuffer; 19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 20158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 20258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (id > 0) { 20358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrBufferObj* buffer = look_up(id); 2040a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(!buffer->mapped()); 20558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger buffer->setMapped(true); 20658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return buffer->dataPtr(); 20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 20858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 2090a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(false); 21058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return NULL; // no buffer bound to target 21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLboolean GR_GL_FUNCTION_TYPE nullGLUnmapBuffer(GrGLenum target) { 21458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrGLuint id = 0; 21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru switch (target) { 21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case GR_GL_ARRAY_BUFFER: 21758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger id = gCurrArrayBuffer; 21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case GR_GL_ELEMENT_ARRAY_BUFFER: 22058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger id = gCurrElementArrayBuffer; 22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 22358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (id > 0) { 22458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrBufferObj* buffer = look_up(id); 2250a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(buffer->mapped()); 22658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger buffer->setMapped(false); 22758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return GR_GL_TRUE; 22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 22958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 23058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrAlwaysAssert(false); 23158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger return GR_GL_FALSE; // GR_GL_INVALID_OPERATION; 23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruGrGLvoid GR_GL_FUNCTION_TYPE nullGLGetBufferParameteriv(GrGLenum target, GrGLenum pname, GrGLint* params) { 23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru switch (pname) { 23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case GR_GL_BUFFER_MAPPED: { 23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *params = GR_GL_FALSE; 23858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrGLuint id = 0; 23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru switch (target) { 24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case GR_GL_ARRAY_BUFFER: 24158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger id = gCurrArrayBuffer; 24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru case GR_GL_ELEMENT_ARRAY_BUFFER: 24458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger id = gCurrElementArrayBuffer; 24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 24758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (id > 0) { 24858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger GrBufferObj* buffer = look_up(id); 24958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger if (buffer->mapped()) { 25058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger *params = GR_GL_TRUE; 25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; } 25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru default: 25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrCrash("Unexpected pname to GetBufferParamateriv"); 25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru break; 25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} // end anonymous namespace 26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst GrGLInterface* GrGLCreateNullInterface() { 26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // The gl functions are not context-specific so we create one global 26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // interface 26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static SkAutoTUnref<GrGLInterface> glInterface; 26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!glInterface.get()) { 26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru GrGLInterface* interface = SkNEW(GrGLInterface); 26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru glInterface.reset(interface); 26980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fBindingsExported = kDesktop_GrGLBinding; 27080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fActiveTexture = nullGLActiveTexture; 27180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fAttachShader = nullGLAttachShader; 27280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fBeginQuery = nullGLBeginQuery; 27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fBindAttribLocation = nullGLBindAttribLocation; 27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fBindBuffer = nullGLBindBuffer; 275096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fBindFragDataLocation = noOpGLBindFragDataLocation; 27680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fBindTexture = nullGLBindTexture; 277096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fBindVertexArray = nullGLBindVertexArray; 278096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fBlendColor = noOpGLBlendColor; 279096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fBlendFunc = noOpGLBlendFunc; 28080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fBufferData = nullGLBufferData; 281096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fBufferSubData = noOpGLBufferSubData; 282096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fClear = noOpGLClear; 283096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fClearColor = noOpGLClearColor; 284096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fClearStencil = noOpGLClearStencil; 2850a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger interface->fClientActiveTexture = nullGLClientActiveTexture; 286096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fColorMask = noOpGLColorMask; 287096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fCompileShader = noOpGLCompileShader; 288096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fCompressedTexImage2D = noOpGLCompressedTexImage2D; 2897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger interface->fCopyTexSubImage2D = noOpGLCopyTexSubImage2D; 29080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fCreateProgram = nullGLCreateProgram; 29180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fCreateShader = nullGLCreateShader; 292096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fCullFace = noOpGLCullFace; 29380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fDeleteBuffers = nullGLDeleteBuffers; 29480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fDeleteProgram = nullGLDelete; 295096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fDeleteQueries = noOpGLDeleteIds; 29680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fDeleteShader = nullGLDelete; 297096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fDeleteTextures = noOpGLDeleteIds; 298096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fDeleteVertexArrays = noOpGLDeleteIds; 299096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fDepthMask = noOpGLDepthMask; 300096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fDisable = noOpGLDisable; 3010a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger interface->fDisableClientState = noOpGLDisableClientState; 302096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fDisableVertexAttribArray = noOpGLDisableVertexAttribArray; 303096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fDrawArrays = noOpGLDrawArrays; 304096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fDrawBuffer = noOpGLDrawBuffer; 305096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fDrawBuffers = noOpGLDrawBuffers; 306096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fDrawElements = noOpGLDrawElements; 307096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fEnable = noOpGLEnable; 3080a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger interface->fEnableClientState = noOpGLEnableClientState; 309096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fEnableVertexAttribArray = noOpGLEnableVertexAttribArray; 310096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fEndQuery = noOpGLEndQuery; 311096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fFinish = noOpGLFinish; 312096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fFlush = noOpGLFlush; 313096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fFrontFace = noOpGLFrontFace; 31458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger interface->fGenBuffers = nullGLGenBuffers; 315e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger interface->fGenerateMipmap = nullGLGenerateMipmap; 316096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGenQueries = noOpGLGenIds; 317096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGenTextures = noOpGLGenIds; 318096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGenVertexArrays = noOpGLGenIds; 31980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fGetBufferParameteriv = nullGLGetBufferParameteriv; 320096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetError = noOpGLGetError; 321096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetIntegerv = noOpGLGetIntegerv; 322096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetQueryObjecti64v = noOpGLGetQueryObjecti64v; 323096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetQueryObjectiv = noOpGLGetQueryObjectiv; 324096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetQueryObjectui64v = noOpGLGetQueryObjectui64v; 325096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetQueryObjectuiv = noOpGLGetQueryObjectuiv; 326096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetQueryiv = noOpGLGetQueryiv; 327096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetProgramInfoLog = noOpGLGetInfoLog; 328096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetProgramiv = noOpGLGetShaderOrProgramiv; 329096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetShaderInfoLog = noOpGLGetInfoLog; 330096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetShaderiv = noOpGLGetShaderOrProgramiv; 331096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetString = noOpGLGetString; 332096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetStringi = noOpGLGetStringi; 333096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetTexLevelParameteriv = noOpGLGetTexLevelParameteriv; 334096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetUniformLocation = noOpGLGetUniformLocation; 3350a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger interface->fLoadIdentity = noOpGLLoadIdentity; 3360a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger interface->fLoadMatrixf = noOpGLLoadMatrixf; 337096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fLineWidth = noOpGLLineWidth; 338096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fLinkProgram = noOpGLLinkProgram; 3390a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger interface->fMatrixMode = noOpGLMatrixMode; 34080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fPixelStorei = nullGLPixelStorei; 341096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fQueryCounter = noOpGLQueryCounter; 342096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fReadBuffer = noOpGLReadBuffer; 34380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fReadPixels = nullGLReadPixels; 344096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fScissor = noOpGLScissor; 345096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fShaderSource = noOpGLShaderSource; 346096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fStencilFunc = noOpGLStencilFunc; 347096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fStencilFuncSeparate = noOpGLStencilFuncSeparate; 348096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fStencilMask = noOpGLStencilMask; 349096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fStencilMaskSeparate = noOpGLStencilMaskSeparate; 350096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fStencilOp = noOpGLStencilOp; 351096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fStencilOpSeparate = noOpGLStencilOpSeparate; 3520a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger interface->fTexGenf = noOpGLTexGenf; 3530a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger interface->fTexGenfv = noOpGLTexGenfv; 3540a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger interface->fTexGeni = noOpGLTexGeni; 355096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fTexImage2D = noOpGLTexImage2D; 356096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fTexParameteri = noOpGLTexParameteri; 357096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fTexParameteriv = noOpGLTexParameteriv; 358096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fTexSubImage2D = noOpGLTexSubImage2D; 359096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fTexStorage2D = noOpGLTexStorage2D; 3607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger interface->fDiscardFramebuffer = noOpGLDiscardFramebuffer; 361096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform1f = noOpGLUniform1f; 362096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform1i = noOpGLUniform1i; 363096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform1fv = noOpGLUniform1fv; 364096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform1iv = noOpGLUniform1iv; 365096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform2f = noOpGLUniform2f; 366096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform2i = noOpGLUniform2i; 367096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform2fv = noOpGLUniform2fv; 368096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform2iv = noOpGLUniform2iv; 369096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform3f = noOpGLUniform3f; 370096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform3i = noOpGLUniform3i; 371096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform3fv = noOpGLUniform3fv; 372096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform3iv = noOpGLUniform3iv; 373096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform4f = noOpGLUniform4f; 374096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform4i = noOpGLUniform4i; 375096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform4fv = noOpGLUniform4fv; 376096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniform4iv = noOpGLUniform4iv; 377096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniformMatrix2fv = noOpGLUniformMatrix2fv; 378096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniformMatrix3fv = noOpGLUniformMatrix3fv; 379096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fUniformMatrix4fv = noOpGLUniformMatrix4fv; 38080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fUseProgram = nullGLUseProgram; 381096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fVertexAttrib4fv = noOpGLVertexAttrib4fv; 382096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fVertexAttribPointer = noOpGLVertexAttribPointer; 3830a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger interface->fVertexPointer = noOpGLVertexPointer; 38480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fViewport = nullGLViewport; 38580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fBindFramebuffer = nullGLBindFramebuffer; 38680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fBindRenderbuffer = nullGLBindRenderbuffer; 387096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fCheckFramebufferStatus = noOpGLCheckFramebufferStatus; 38880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fDeleteFramebuffers = nullGLDeleteFramebuffers; 38980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fDeleteRenderbuffers = nullGLDeleteRenderbuffers; 39080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fFramebufferRenderbuffer = nullGLFramebufferRenderbuffer; 39180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fFramebufferTexture2D = nullGLFramebufferTexture2D; 392096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGenFramebuffers = noOpGLGenIds; 393096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGenRenderbuffers = noOpGLGenIds; 394096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetFramebufferAttachmentParameteriv = noOpGLGetFramebufferAttachmentParameteriv; 395096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fGetRenderbufferParameteriv = noOpGLGetRenderbufferParameteriv; 396096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fRenderbufferStorage = noOpGLRenderbufferStorage; 397096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fRenderbufferStorageMultisample = noOpGLRenderbufferStorageMultisample; 398096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fBlitFramebuffer = noOpGLBlitFramebuffer; 399096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fResolveMultisampleFramebuffer = noOpGLResolveMultisampleFramebuffer; 40080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fMapBuffer = nullGLMapBuffer; 40180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru interface->fUnmapBuffer = nullGLUnmapBuffer; 402096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger interface->fBindFragDataLocationIndexed = noOpGLBindFragDataLocationIndexed; 40380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 40480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru glInterface.get()->ref(); 40580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return glInterface.get(); 40680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 407