1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 659a190bcab5d4b2bf03f8f10cb6a581d19fed403twiz@google.com */ 759a190bcab5d4b2bf03f8f10cb6a581d19fed403twiz@google.com 859a190bcab5d4b2bf03f8f10cb6a581d19fed403twiz@google.com 96bf38b59c9de1cd35cd091cf8766117f4e1f66a0tomhudson@google.com#include "gl/GrGLInterface.h" 101744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com#include "gl/GrGLExtensions.h" 111744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com#include "gl/GrGLUtil.h" 1259a190bcab5d4b2bf03f8f10cb6a581d19fed403twiz@google.com 1359a190bcab5d4b2bf03f8f10cb6a581d19fed403twiz@google.com#include <stdio.h> 1459a190bcab5d4b2bf03f8f10cb6a581d19fed403twiz@google.com 1556bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com#if GR_GL_PER_GL_FUNC_CALLBACK 1656bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.comnamespace { 1756bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.comvoid GrGLDefaultInterfaceCallback(const GrGLInterface*) {} 1856bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com} 1956bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com#endif 2056bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com 21a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.orgconst GrGLInterface* GrGLInterfaceAddTestDebugMarker(const GrGLInterface* interface, 22a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org GrGLInsertEventMarkerProc insertEventMarkerFn, 23a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org GrGLPushGroupMarkerProc pushGroupMarkerFn, 24a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org GrGLPopGroupMarkerProc popGroupMarkerFn) { 25a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org GrGLInterface* newInterface = GrGLInterface::NewClone(interface); 26a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org 27a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org if (!newInterface->fExtensions.has("GL_EXT_debug_marker")) { 28a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org newInterface->fExtensions.add("GL_EXT_debug_marker"); 29a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org } 30a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org 31f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org newInterface->fFunctions.fInsertEventMarker = insertEventMarkerFn; 32f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org newInterface->fFunctions.fPushGroupMarker = pushGroupMarkerFn; 33f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.org newInterface->fFunctions.fPopGroupMarker = popGroupMarkerFn; 34a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org 35a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org return newInterface; 36a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org} 37a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org 38d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.orgconst GrGLInterface* GrGLInterfaceRemoveNVPR(const GrGLInterface* interface) { 39d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org GrGLInterface* newInterface = GrGLInterface::NewClone(interface); 40d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org 41d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org newInterface->fExtensions.remove("GL_NV_path_rendering"); 422ca29c0b919765f01ee07625250c0b58f30b05b5kkinnunen newInterface->fExtensions.remove("GL_CHROMIUM_path_rendering"); 432ca29c0b919765f01ee07625250c0b58f30b05b5kkinnunen newInterface->fFunctions.fMatrixLoadf = nullptr; 442ca29c0b919765f01ee07625250c0b58f30b05b5kkinnunen newInterface->fFunctions.fMatrixLoadIdentity = nullptr; 4596fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fPathCommands = nullptr; 4696fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fPathParameteri = nullptr; 4796fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fPathParameterf = nullptr; 4896fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fGenPaths = nullptr; 4996fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fDeletePaths = nullptr; 5096fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fIsPath = nullptr; 5196fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fPathStencilFunc = nullptr; 5296fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fStencilFillPath = nullptr; 5396fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fStencilStrokePath = nullptr; 5496fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fStencilFillPathInstanced = nullptr; 5596fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fStencilStrokePathInstanced = nullptr; 5696fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fCoverFillPath = nullptr; 5796fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fCoverStrokePath = nullptr; 5896fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fCoverFillPathInstanced = nullptr; 5996fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fCoverStrokePathInstanced = nullptr; 6096fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fStencilThenCoverFillPath = nullptr; 6196fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fStencilThenCoverStrokePath = nullptr; 6296fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fStencilThenCoverFillPathInstanced = nullptr; 6396fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fStencilThenCoverStrokePathInstanced = nullptr; 6496fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fProgramPathFragmentInputGen = nullptr; 6596fcdcc219d2a0d3579719b84b28bede76efba64halcanary newInterface->fFunctions.fBindFragmentInputLocation = nullptr; 66d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org return newInterface; 67d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org} 68d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org 69f535561b3baeb5f19c5b81fb439818bdde00d882commit-bot@chromium.orgGrGLInterface::GrGLInterface() { 709e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org fStandard = kNone_GrGLStandard; 710b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com 7256bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com#if GR_GL_PER_GL_FUNC_CALLBACK 7356bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com fCallback = GrGLDefaultInterfaceCallback; 7456bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com fCallbackData = 0; 7556bfc5acc210987838744eece7383bc2f6b34915bsalomon@google.com#endif 760b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com} 770b77d6892b067ad402c9678b0226bff70599fbe2bsalomon@google.com 78d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.orgGrGLInterface* GrGLInterface::NewClone(const GrGLInterface* interface) { 7949f085dddff10473b6ebf832a974288300224e60bsalomon SkASSERT(interface); 80d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org 81385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary GrGLInterface* clone = new GrGLInterface; 82d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org clone->fStandard = interface->fStandard; 83d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org clone->fExtensions = interface->fExtensions; 84d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org clone->fFunctions = interface->fFunctions; 85d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org#if GR_GL_PER_GL_FUNC_CALLBACK 86d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org clone->fCallback = interface->fCallback; 87d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org clone->fCallbackData = interface->fCallbackData; 88d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org#endif 89d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org return clone; 90d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org} 91d8ed85101ee77ad2cb0c186a79d197698a75d246commit-bot@chromium.org 92e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org#ifdef SK_DEBUG 93e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org static int kIsDebug = 1; 94e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org#else 95e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org static int kIsDebug = 0; 96e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org#endif 97e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org 98e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org#define RETURN_FALSE_INTERFACE \ 99e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org if (kIsDebug) { SkDebugf("%s:%d GrGLInterface::validate() failed.\n", __FILE__, __LINE__); } \ 100e83b9b7c20c0b5cf6b15129d60576100199fd051commit-bot@chromium.org return false; 101adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org 1029e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.orgbool GrGLInterface::validate() const { 103bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com 1049e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org if (kNone_GrGLStandard == fStandard) { 105adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 106bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 10712eea2b10d6caaafe0a207d10b1e9322510983a2skia.committer@gmail.com 10890313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org if (!fExtensions.isInitialized()) { 109adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 1101744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com } 111bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com 112bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com // functions that are always required 11396fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fActiveTexture || 11496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fAttachShader || 11596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBindAttribLocation || 11696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBindBuffer || 11796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBindTexture || 11896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBlendColor || // -> GL >= 1.4 or extension, ES >= 2.0 11996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBlendEquation || // -> GL >= 1.4 or extension, ES >= 2.0 12096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBlendFunc || 12196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBufferData || 12296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBufferSubData || 12396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fClear || 12496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fClearColor || 12596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fClearStencil || 12696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fColorMask || 12796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCompileShader || 12896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCopyTexSubImage2D || 12996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCreateProgram || 13096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCreateShader || 13196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCullFace || 13296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDeleteBuffers || 13396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDeleteProgram || 13496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDeleteShader || 13596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDeleteTextures || 13696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDepthMask || 13796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDisable || 13896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDisableVertexAttribArray || 13996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDrawArrays || 14096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDrawElements || 14196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fEnable || 14296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fEnableVertexAttribArray || 14396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fFrontFace || 14496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGenBuffers || 14596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGenTextures || 14696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetBufferParameteriv || 14796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGenerateMipmap || 14896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetError || 14996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetIntegerv || 15096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetProgramInfoLog || 15196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetProgramiv || 15296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetShaderInfoLog || 15396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetShaderiv || 15496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetString || 15596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetUniformLocation || 1566dc6f5f4a153d33ed91565cb3cd397a310a937d0bsalomon#if 0 // Not included in Chrome yet 15796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fIsTexture || 1586dc6f5f4a153d33ed91565cb3cd397a310a937d0bsalomon#endif 15996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fLinkProgram || 16096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fLineWidth || 16196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fPixelStorei || 16296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fReadPixels || 16396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fScissor || 16496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fShaderSource || 16596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fStencilFunc || 16696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fStencilMask || 16796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fStencilOp || 16896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fTexImage2D || 16996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fTexParameteri || 17096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fTexParameteriv || 17196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fTexSubImage2D || 17296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform1f || 17396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform1i || 17496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform1fv || 17596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform1iv || 17696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform2f || 17796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform2i || 17896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform2fv || 17996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform2iv || 18096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform3f || 18196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform3i || 18296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform3fv || 18396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform3iv || 18496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform4f || 18596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform4i || 18696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform4fv || 18796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniform4iv || 18896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniformMatrix2fv || 18996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniformMatrix3fv || 19096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniformMatrix4fv || 19196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUseProgram || 19296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexAttrib1f || 19396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexAttrib2fv || 19496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexAttrib3fv || 19596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexAttrib4fv || 19696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexAttribPointer || 19796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fViewport || 19896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBindFramebuffer || 19996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBindRenderbuffer || 20096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCheckFramebufferStatus || 20196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDeleteFramebuffers || 20296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDeleteRenderbuffers || 20396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fFinish || 20496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fFlush || 20596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fFramebufferRenderbuffer || 20696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fFramebufferTexture2D || 20796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetFramebufferAttachmentParameteriv || 20896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetRenderbufferParameteriv || 20996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGenFramebuffers || 21096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGenRenderbuffers || 21196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fRenderbufferStorage) { 212adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 213bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 214bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com 215c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com GrGLVersion glVer = GrGLGetVersion(this); 216f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org if (GR_GL_INVALID_VER == glVer) { 217f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org RETURN_FALSE_INTERFACE 218f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org } 21945c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen // TODO: Remove this once command buffer implements full ES3. 22045c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen bool ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3 = false; 22145c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen if (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,0)) { 22245c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen const GrGLubyte* rendererUByte; 22345c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen GR_GL_CALL_RET(this, rendererUByte, GetString(GR_GL_RENDERER)); 22445c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen const char* renderer = reinterpret_cast<const char*>(rendererUByte); 22545c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3 = 22645c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen 0 == strcmp(renderer, "Chromium"); 22745c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen } 228bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com 229bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com // Now check that baseline ES/Desktop fns not covered above are present 23090313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org // and that we have fn pointers for any advertised fExtensions that we will 231bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com // try to use. 232bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com 233bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com // these functions are part of ES2, we assume they are available 234bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com // On the desktop we assume they are available if the extension 235bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com // is present or GL version is high enough. 2369e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org if (kGLES_GrGLStandard == fStandard) { 23796fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fStencilFuncSeparate || 23896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fStencilMaskSeparate || 23996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fStencilOpSeparate) { 240adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 241bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 2429e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org } else if (kGL_GrGLStandard == fStandard) { 243e788430144d1474329878abd1ddb39cc0ca52a0arobertphillips@google.com 244c82b8899d97c2a26f5991bc771ad3beb8257edaebsalomon@google.com if (glVer >= GR_GL_VER(2,0)) { 24596fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fStencilFuncSeparate || 24696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fStencilMaskSeparate || 24796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fStencilOpSeparate) { 248adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 249bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 250bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 25196fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (glVer >= GR_GL_VER(3,0) && nullptr == fFunctions.fBindFragDataLocation) { 252adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 253bc5cf51627505f763586100675aa60b66d743c7ebsalomon@google.com } 25490313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org if (glVer >= GR_GL_VER(2,0) || fExtensions.has("GL_ARB_draw_buffers")) { 25596fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fDrawBuffers) { 256adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 257d32c5f564e4aa9ada2650e07d3856d5b21cd2138bsalomon@google.com } 258d32c5f564e4aa9ada2650e07d3856d5b21cd2138bsalomon@google.com } 259e788430144d1474329878abd1ddb39cc0ca52a0arobertphillips@google.com 26090313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org if (glVer >= GR_GL_VER(1,5) || fExtensions.has("GL_ARB_occlusion_query")) { 26196fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fGenQueries || 26296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDeleteQueries || 26396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBeginQuery || 26496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fEndQuery || 26596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetQueryiv || 26696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetQueryObjectiv || 26796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetQueryObjectuiv) { 268adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 269373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com } 270373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com } 271373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com if (glVer >= GR_GL_VER(3,3) || 27290313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org fExtensions.has("GL_ARB_timer_query") || 27390313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org fExtensions.has("GL_EXT_timer_query")) { 27496fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fGetQueryObjecti64v || 27596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetQueryObjectui64v) { 276adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 277373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com } 278373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com } 27990313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org if (glVer >= GR_GL_VER(3,3) || fExtensions.has("GL_ARB_timer_query")) { 28096fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fQueryCounter) { 281adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 282373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com } 283373a6635b7190b4af4d265fdd4b70f102ec3a6fdbsalomon@google.com } 284bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 285bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com 286bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com // optional function on desktop before 1.3 2879e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org if (kGL_GrGLStandard != fStandard || 2881744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com (glVer >= GR_GL_VER(1,3)) || 28990313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org fExtensions.has("GL_ARB_texture_compression")) { 29096fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fCompressedTexImage2D 291c9aec1ee9bd6c78af1460d61a76be421a92efacfbsalomon#if 0 29296fcdcc219d2a0d3579719b84b28bede76efba64halcanary || nullptr == fFunctions.fCompressedTexSubImage2D 293c9aec1ee9bd6c78af1460d61a76be421a92efacfbsalomon#endif 294e1f5a23812cab849174a47fae02397e7291f850ekrajcevski ) { 295adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 296bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 297bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 298bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com 299d32c5f564e4aa9ada2650e07d3856d5b21cd2138bsalomon@google.com // part of desktop GL, but not ES 3009e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org if (kGL_GrGLStandard == fStandard && 30196fcdcc219d2a0d3579719b84b28bede76efba64halcanary (nullptr == fFunctions.fGetTexLevelParameteriv || 30296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDrawBuffer || 30396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fReadBuffer)) { 304adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 305bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 306cee661af926cc977addc6e039b7022975a448acebsalomon@google.com 307280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com // GL_EXT_texture_storage is part of desktop 4.2 308280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com // There is a desktop ARB extension and an ES+desktop EXT extension 3099e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org if (kGL_GrGLStandard == fStandard) { 310baa9ea10f9b704f42efc804e7401e0aa519b3e29bsalomon@google.com if (glVer >= GR_GL_VER(4,2) || 31190313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org fExtensions.has("GL_ARB_texture_storage") || 31290313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org fExtensions.has("GL_EXT_texture_storage")) { 31396fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fTexStorage2D) { 314adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 315baa9ea10f9b704f42efc804e7401e0aa519b3e29bsalomon@google.com } 316baa9ea10f9b704f42efc804e7401e0aa519b3e29bsalomon@google.com } 31790313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org } else if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_texture_storage")) { 31845c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen if (!ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3) { 31945c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen if (nullptr == fFunctions.fTexStorage2D) { 32045c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen RETURN_FALSE_INTERFACE 32145c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen } 322baa9ea10f9b704f42efc804e7401e0aa519b3e29bsalomon@google.com } 323280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com } 324280e99f1a61f2cf66a8ee9b9e6c517f3d2290de7bsalomon@google.com 325fd4167ddf12ea723b828462ec1507acebdef5776cdalton // glTextureBarrier is part of desktop 4.5. There are also ARB and NV extensions. 326fd4167ddf12ea723b828462ec1507acebdef5776cdalton if (kGL_GrGLStandard == fStandard) { 327fd4167ddf12ea723b828462ec1507acebdef5776cdalton if (glVer >= GR_GL_VER(4,5) || 328fd4167ddf12ea723b828462ec1507acebdef5776cdalton fExtensions.has("GL_ARB_texture_barrier") || 329fd4167ddf12ea723b828462ec1507acebdef5776cdalton fExtensions.has("GL_NV_texture_barrier")) { 33096fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fTextureBarrier) { 331fd4167ddf12ea723b828462ec1507acebdef5776cdalton RETURN_FALSE_INTERFACE 332fd4167ddf12ea723b828462ec1507acebdef5776cdalton } 333fd4167ddf12ea723b828462ec1507acebdef5776cdalton } 334fd4167ddf12ea723b828462ec1507acebdef5776cdalton } else if (fExtensions.has("GL_NV_texture_barrier")) { 33596fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fTextureBarrier) { 336fd4167ddf12ea723b828462ec1507acebdef5776cdalton RETURN_FALSE_INTERFACE 337fd4167ddf12ea723b828462ec1507acebdef5776cdalton } 338fd4167ddf12ea723b828462ec1507acebdef5776cdalton } 339fd4167ddf12ea723b828462ec1507acebdef5776cdalton 340bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton if (fExtensions.has("GL_KHR_blend_equation_advanced") || 341bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton fExtensions.has("GL_NV_blend_equation_advanced")) { 34296fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fBlendBarrier) { 343bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton RETURN_FALSE_INTERFACE 344bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton } 345bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton } 346bae6f6c3ec927bc1f87cd4c13fec0b52e5677c23cdalton 34790313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org if (fExtensions.has("GL_EXT_discard_framebuffer")) { 348c9aec1ee9bd6c78af1460d61a76be421a92efacfbsalomon// FIXME: Remove this once Chromium is updated to provide this function 349c9aec1ee9bd6c78af1460d61a76be421a92efacfbsalomon#if 0 35096fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fDiscardFramebuffer) { 351adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 352a6ffb58b109f71512bde4e14d06a655914578c8drobertphillips@google.com } 353c9aec1ee9bd6c78af1460d61a76be421a92efacfbsalomon#endif 354a6ffb58b109f71512bde4e14d06a655914578c8drobertphillips@google.com } 355a6ffb58b109f71512bde4e14d06a655914578c8drobertphillips@google.com 356bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com // FBO MSAA 3579e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org if (kGL_GrGLStandard == fStandard) { 358bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com // GL 3.0 and the ARB extension have multisample + blit 35990313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_ARB_framebuffer_object")) { 36096fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fRenderbufferStorageMultisample || 36196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBlitFramebuffer) { 362adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 363bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 364bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } else { 36590313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org if (fExtensions.has("GL_EXT_framebuffer_blit") && 36696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBlitFramebuffer) { 367adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 368bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 36990313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org if (fExtensions.has("GL_EXT_framebuffer_multisample") && 37096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fRenderbufferStorageMultisample) { 371adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 372bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 373bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 374bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } else { 37590313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_CHROMIUM_framebuffer_multisample")) { 37696fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fRenderbufferStorageMultisample || 37796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBlitFramebuffer) { 378adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 379a8e5a06f69b7e0cb17a4b3203f0a7a1d52aa73eccommit-bot@chromium.org } 380a8e5a06f69b7e0cb17a4b3203f0a7a1d52aa73eccommit-bot@chromium.org } 38190313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org if (fExtensions.has("GL_APPLE_framebuffer_multisample")) { 38296fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fRenderbufferStorageMultisampleES2APPLE || 38396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fResolveMultisampleFramebuffer) { 384adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 385bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 386bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 38790313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org if (fExtensions.has("GL_IMG_multisampled_render_to_texture") || 38890313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org fExtensions.has("GL_EXT_multisampled_render_to_texture")) { 38996fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fRenderbufferStorageMultisampleES2EXT || 39096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fFramebufferTexture2DMultisample) { 391adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 392f3a60c09b975f50bbd14215df10effffd2fd46e8bsalomon@google.com } 393f3a60c09b975f50bbd14215df10effffd2fd46e8bsalomon@google.com } 394bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 395bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com 396bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com // On ES buffer mapping is an extension. On Desktop 397bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com // buffer mapping was part of original VBO extension 398bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com // which we require. 39990313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org if (kGL_GrGLStandard == fStandard || fExtensions.has("GL_OES_mapbuffer")) { 40096fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fMapBuffer || 40196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUnmapBuffer) { 402adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 403bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 404bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com } 405bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com 406271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com // Dual source blending 407d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen if (kGL_GrGLStandard == fStandard) { 408d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen if (glVer >= GR_GL_VER(3,3) || fExtensions.has("GL_ARB_blend_func_extended")) { 40996fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fBindFragDataLocationIndexed) { 410d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen RETURN_FALSE_INTERFACE 411d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen } 412d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen } 413d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen } else { 414d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen if (glVer >= GR_GL_VER(3,0) && fExtensions.has("GL_EXT_blend_func_extended")) { 41596fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fBindFragDataLocation || 41696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fBindFragDataLocationIndexed) { 417d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen RETURN_FALSE_INTERFACE 418d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen } 419271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com } 420271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com } 42112eea2b10d6caaafe0a207d10b1e9322510983a2skia.committer@gmail.com 422d94708e71e8611015cdeb4f5874a11816e40ecdckkinnunen 423726e621000582e4de7c9ce0f7e9950c3af4e5d9bcommit-bot@chromium.org // glGetStringi was added in version 3.0 of both desktop and ES. 424726e621000582e4de7c9ce0f7e9950c3af4e5d9bcommit-bot@chromium.org if (glVer >= GR_GL_VER(3, 0)) { 42596fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fGetStringi) { 426adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 4271744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com } 4281744f97ea73384b9f75b0ccee0a36a213c681d3absalomon@google.com } 429271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com 430793dc26ca6ba2543bf50e5215b858d1c265af50ccdalton // glVertexAttribIPointer was added in version 3.0 of both desktop and ES. 431793dc26ca6ba2543bf50e5215b858d1c265af50ccdalton if (glVer >= GR_GL_VER(3, 0)) { 432793dc26ca6ba2543bf50e5215b858d1c265af50ccdalton if (NULL == fFunctions.fVertexAttribIPointer) { 433793dc26ca6ba2543bf50e5215b858d1c265af50ccdalton RETURN_FALSE_INTERFACE 434793dc26ca6ba2543bf50e5215b858d1c265af50ccdalton } 435793dc26ca6ba2543bf50e5215b858d1c265af50ccdalton } 436793dc26ca6ba2543bf50e5215b858d1c265af50ccdalton 4379e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.org if (kGL_GrGLStandard == fStandard) { 43890313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org if (glVer >= GR_GL_VER(3, 0) || fExtensions.has("GL_ARB_vertex_array_object")) { 43996fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fBindVertexArray || 44096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDeleteVertexArrays || 44196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGenVertexArrays) { 442adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 443ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com } 444ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com } 445ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com } else { 44690313cc36a6f43a3e9d3818aca536cd6631c222bcommit-bot@chromium.org if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_OES_vertex_array_object")) { 44796fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fBindVertexArray || 44896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDeleteVertexArrays || 44996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGenVertexArrays) { 450adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 451ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com } 452ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com } 453ecd84842b3f65918eb040c53391172b6413fd7adbsalomon@google.com } 454a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org 455a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org if (fExtensions.has("GL_EXT_debug_marker")) { 45696fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fInsertEventMarker || 45796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fPushGroupMarker || 45896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fPopGroupMarker) { 459adadf7c31f964fb98a64d1f59c18fa099888cae5commit-bot@chromium.org RETURN_FALSE_INTERFACE 460a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org } 461a3baf3be0e2a3128fb73bd41d40d130f75a4dc86commit-bot@chromium.org } 462a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com 463160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) || 464160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org fExtensions.has("GL_ARB_invalidate_subdata")) { 46596fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fInvalidateBufferData || 46696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fInvalidateBufferSubData || 46796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fInvalidateFramebuffer || 46896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fInvalidateSubFramebuffer || 46996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fInvalidateTexImage || 47096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fInvalidateTexSubImage) { 471a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com RETURN_FALSE_INTERFACE; 472a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com } 473160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org } else if (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,0)) { 474a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com // ES 3.0 adds the framebuffer functions but not the others. 47596fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fInvalidateFramebuffer || 47696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fInvalidateSubFramebuffer) { 477a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com RETURN_FALSE_INTERFACE; 478a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com } 479a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com } 480beb8b3a4da83ce30e313e72ae0e444870acecb7ecommit-bot@chromium.org 481beb8b3a4da83ce30e313e72ae0e444870acecb7ecommit-bot@chromium.org if (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_CHROMIUM_map_sub")) { 48296fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fMapBufferSubData || 48396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fMapTexSubImage2D || 48496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUnmapBufferSubData || 48596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUnmapTexSubImage2D) { 486beb8b3a4da83ce30e313e72ae0e444870acecb7ecommit-bot@chromium.org RETURN_FALSE_INTERFACE; 487beb8b3a4da83ce30e313e72ae0e444870acecb7ecommit-bot@chromium.org } 488beb8b3a4da83ce30e313e72ae0e444870acecb7ecommit-bot@chromium.org } 489a34bb60c4e319f2289106d519544fe09d43eabd5bsalomon@google.com 490160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org // These functions are added to the 3.0 version of both GLES and GL. 491160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org if (glVer >= GR_GL_VER(3,0) || 492160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_EXT_map_buffer_range")) || 493160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org (kGL_GrGLStandard == fStandard && fExtensions.has("GL_ARB_map_buffer_range"))) { 49445c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen if (!ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3) { 49545c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen if (nullptr == fFunctions.fMapBufferRange || 49645c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen nullptr == fFunctions.fFlushMappedBufferRange) { 49745c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen RETURN_FALSE_INTERFACE; 49845c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen } 499160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org } 500160b478eed1dd4924a86a87fd60c91139e08ff71commit-bot@chromium.org } 50132b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen 50232b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen if ((kGL_GrGLStandard == fStandard && 50332b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen (glVer >= GR_GL_VER(4,3) || fExtensions.has("GL_ARB_program_interface_query"))) || 50432b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,1))) { 50596fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fGetProgramResourceLocation) { 50632b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen RETURN_FALSE_INTERFACE 50732b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen } 50832b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen } 50932b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen 510ee64d6ef49fbb63e0fc7934334c5ae5e900f5336bsalomon if (kGLES_GrGLStandard == fStandard || glVer >= GR_GL_VER(4,1) || 511ee64d6ef49fbb63e0fc7934334c5ae5e900f5336bsalomon fExtensions.has("GL_ARB_ES2_compatibility")) { 512c9aec1ee9bd6c78af1460d61a76be421a92efacfbsalomon#if 0 // Enable this once Chrome gives us the function ptr 51396fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fGetShaderPrecisionFormat) { 514ee64d6ef49fbb63e0fc7934334c5ae5e900f5336bsalomon RETURN_FALSE_INTERFACE 515ee64d6ef49fbb63e0fc7934334c5ae5e900f5336bsalomon } 516c9aec1ee9bd6c78af1460d61a76be421a92efacfbsalomon#endif 517ee64d6ef49fbb63e0fc7934334c5ae5e900f5336bsalomon } 518ee64d6ef49fbb63e0fc7934334c5ae5e900f5336bsalomon 5196bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen if (fExtensions.has("GL_NV_path_rendering") || fExtensions.has("GL_CHROMIUM_path_rendering")) { 52096fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fMatrixLoadf || 52196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fMatrixLoadIdentity || 52296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fPathCommands || 52396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fPathParameteri || 52496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fPathParameterf || 52596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGenPaths || 52696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDeletePaths || 52796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fIsPath || 52896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fPathStencilFunc || 52996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fStencilFillPath || 53096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fStencilStrokePath || 53196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fStencilFillPathInstanced || 53296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fStencilStrokePathInstanced || 53396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCoverFillPath || 53496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCoverStrokePath || 53596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCoverFillPathInstanced || 53696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCoverStrokePathInstanced 537cfe62e30848eadead4358b0385e57723779b762bkkinnunen#if 0 538cfe62e30848eadead4358b0385e57723779b762bkkinnunen // List of functions that Skia uses, but which have been added since the initial release 539cfe62e30848eadead4358b0385e57723779b762bkkinnunen // of NV_path_rendering driver. We do not want to fail interface validation due to 540cfe62e30848eadead4358b0385e57723779b762bkkinnunen // missing features, we will just not use the extension. 541cfe62e30848eadead4358b0385e57723779b762bkkinnunen // Update this list -> update GrGLCaps::hasPathRenderingSupport too. 54296fcdcc219d2a0d3579719b84b28bede76efba64halcanary || nullptr == fFunctions.fStencilThenCoverFillPath || 54396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fStencilThenCoverStrokePath || 54496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fStencilThenCoverFillPathInstanced || 54596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fStencilThenCoverStrokePathInstanced || 54696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramPathFragmentInputGen 547cfe62e30848eadead4358b0385e57723779b762bkkinnunen#endif 548cfe62e30848eadead4358b0385e57723779b762bkkinnunen ) { 54932b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen RETURN_FALSE_INTERFACE 55032b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen } 5516bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen if (fExtensions.has("GL_CHROMIUM_path_rendering")) { 55296fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fBindFragmentInputLocation) { 5536bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen RETURN_FALSE_INTERFACE 5546bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen } 5556bb6d4075b198c5935ab6f2d71364ca7ff0153d1kkinnunen } 55632b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen } 55732b9a3b02ed6b8bab4a25b6cb8853f5bea4b87bakkinnunen 5580edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton if (fExtensions.has("GL_EXT_raster_multisample")) { 55996fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fRasterSamples) { 5600edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton RETURN_FALSE_INTERFACE 5610edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton } 5620edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton } 5630edea2c8e76a9f5340a7a4960193757c4a5fb227cdalton 564ea40943f8e71dd515d5d64471a6d0f67abc6dc12kkinnunen if (fExtensions.has("GL_NV_framebuffer_mixed_samples") || 565ea40943f8e71dd515d5d64471a6d0f67abc6dc12kkinnunen fExtensions.has("GL_CHROMIUM_framebuffer_mixed_samples")) { 56696fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fCoverageModulation) { 56708b4d29a0a29badc15129c9bc7ee8352bc75278dvbuzinov RETURN_FALSE_INTERFACE 56808b4d29a0a29badc15129c9bc7ee8352bc75278dvbuzinov } 56908b4d29a0a29badc15129c9bc7ee8352bc75278dvbuzinov } 57008b4d29a0a29badc15129c9bc7ee8352bc75278dvbuzinov 571b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw if (kGL_GrGLStandard == fStandard) { 572b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw if (glVer >= GR_GL_VER(3,1) || 573b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw fExtensions.has("GL_EXT_draw_instanced") || fExtensions.has("GL_ARB_draw_instanced")) { 574b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw if (nullptr == fFunctions.fDrawArraysInstanced || 575b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw nullptr == fFunctions.fDrawElementsInstanced) { 576b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw RETURN_FALSE_INTERFACE 577b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw } 57845c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen } 579b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw } else if (kGLES_GrGLStandard == fStandard) { 58045c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen if (!ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3) { 58145c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_draw_instanced")) { 58245c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen if (nullptr == fFunctions.fDrawArraysInstanced || 58345c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen nullptr == fFunctions.fDrawElementsInstanced) { 58445c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen RETURN_FALSE_INTERFACE 58545c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen } 586b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw } 58745c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen } 588626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 589626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton 590b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw if (kGL_GrGLStandard == fStandard) { 591b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw if (glVer >= GR_GL_VER(3,2) || fExtensions.has("GL_ARB_instanced_arrays")) { 592b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw if (nullptr == fFunctions.fVertexAttribDivisor) { 593b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw RETURN_FALSE_INTERFACE 594b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw } 59545c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen } 596b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw } else if (kGLES_GrGLStandard == fStandard) { 59745c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen if (!ALLOW_MISSING_FUNCTIONS_FOR_INCOMPLETE_COMMAND_BUFFER_ES3) { 59845c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen if (glVer >= GR_GL_VER(3,0) || fExtensions.has("GL_EXT_instanced_arrays")) { 59945c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen if (nullptr == fFunctions.fVertexAttribDivisor) { 60045c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen RETURN_FALSE_INTERFACE 60145c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen } 602b3f1636ec80e66188ddc01306672a9a79a954dfehendrikw } 60345c2c8166bbd84a87e29fdd344b39e36e8a28a3fkkinnunen } 604626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 605626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton 60606604b95622359640a1c2028b885646deda28d52cdalton if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) || 60706604b95622359640a1c2028b885646deda28d52cdalton (kGLES_GrGLStandard == fStandard && glVer >= GR_GL_VER(3,1))) { 60806604b95622359640a1c2028b885646deda28d52cdalton if (NULL == fFunctions.fDrawArraysIndirect || 60906604b95622359640a1c2028b885646deda28d52cdalton NULL == fFunctions.fDrawElementsIndirect) { 61006604b95622359640a1c2028b885646deda28d52cdalton RETURN_FALSE_INTERFACE 61106604b95622359640a1c2028b885646deda28d52cdalton } 61206604b95622359640a1c2028b885646deda28d52cdalton } 61306604b95622359640a1c2028b885646deda28d52cdalton 61406604b95622359640a1c2028b885646deda28d52cdalton if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) || 61506604b95622359640a1c2028b885646deda28d52cdalton (kGLES_GrGLStandard == fStandard && fExtensions.has("GL_EXT_multi_draw_indirect"))) { 61606604b95622359640a1c2028b885646deda28d52cdalton if (NULL == fFunctions.fMultiDrawArraysIndirect || 61706604b95622359640a1c2028b885646deda28d52cdalton NULL == fFunctions.fMultiDrawElementsIndirect) { 61806604b95622359640a1c2028b885646deda28d52cdalton RETURN_FALSE_INTERFACE 61906604b95622359640a1c2028b885646deda28d52cdalton } 62006604b95622359640a1c2028b885646deda28d52cdalton } 62106604b95622359640a1c2028b885646deda28d52cdalton 622626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton if (fExtensions.has("GL_NV_bindless_texture")) { 62396fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fGetTextureHandle || 62496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetTextureSamplerHandle || 62596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fMakeTextureHandleResident || 62696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fMakeTextureHandleNonResident || 62796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetImageHandle || 62896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fMakeImageHandleResident || 62996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fMakeImageHandleNonResident || 63096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fIsTextureHandleResident || 63196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fIsImageHandleResident || 63296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniformHandleui64 || 63396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUniformHandleui64v || 63496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniformHandleui64 || 63596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniformHandleui64v) { 636626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton RETURN_FALSE_INTERFACE 637626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 638626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 639626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton 640626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton if (kGL_GrGLStandard == fStandard && fExtensions.has("GL_EXT_direct_state_access")) { 64196fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fTextureParameteri || 64296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fTextureParameteriv || 64396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fTextureParameterf || 64496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fTextureParameterfv || 64596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fTextureImage1D || 64696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fTextureImage2D || 64796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fTextureSubImage1D || 64896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fTextureSubImage2D || 64996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCopyTextureImage1D || 65096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCopyTextureImage2D || 65196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCopyTextureSubImage1D || 65296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCopyTextureSubImage2D || 65396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetTextureImage || 65496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetTextureParameterfv || 65596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetTextureParameteriv || 65696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetTextureLevelParameterfv || 65796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetTextureLevelParameteriv) { 658626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton RETURN_FALSE_INTERFACE 659626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 660626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton if (glVer >= GR_GL_VER(1,2)) { 66196fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fTextureImage3D || 66296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fTextureSubImage3D || 66396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCopyTextureSubImage3D || 66496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCompressedTextureImage3D || 66596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCompressedTextureImage2D || 66696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCompressedTextureImage1D || 66796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCompressedTextureSubImage3D || 66896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCompressedTextureSubImage2D || 66996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCompressedTextureSubImage1D || 67096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetCompressedTextureImage) { 671626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton RETURN_FALSE_INTERFACE 672626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 673626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 674626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton if (glVer >= GR_GL_VER(1,5)) { 67596fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fNamedBufferData || 67696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fNamedBufferSubData || 67796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fMapNamedBuffer || 67896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fUnmapNamedBuffer || 67996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetNamedBufferParameteriv || 68096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetNamedBufferPointerv || 68196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetNamedBufferSubData) { 682626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton RETURN_FALSE_INTERFACE 683626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 684626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 685626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton if (glVer >= GR_GL_VER(2,0)) { 68696fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fProgramUniform1f || 68796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform2f || 68896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform3f || 68996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform4f || 69096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform1i || 69196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform2i || 69296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform3i || 69396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform4i || 69496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform1fv || 69596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform2fv || 69696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform3fv || 69796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform4fv || 69896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform1iv || 69996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform2iv || 70096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform3iv || 70196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniform4iv || 70296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniformMatrix2fv || 70396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniformMatrix3fv || 70496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniformMatrix4fv) { 705626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton RETURN_FALSE_INTERFACE 706626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 707626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 708626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton if (glVer >= GR_GL_VER(2,1)) { 70996fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fProgramUniformMatrix2x3fv || 71096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniformMatrix3x2fv || 71196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniformMatrix2x4fv || 71296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniformMatrix4x2fv || 71396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniformMatrix3x4fv || 71496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fProgramUniformMatrix4x3fv) { 715626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton RETURN_FALSE_INTERFACE 716626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 717626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 718626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton if (glVer >= GR_GL_VER(3,0)) { 71996fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fNamedRenderbufferStorage || 72096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetNamedRenderbufferParameteriv || 72196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fNamedRenderbufferStorageMultisample || 72296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fCheckNamedFramebufferStatus || 72396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fNamedFramebufferTexture1D || 72496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fNamedFramebufferTexture2D || 72596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fNamedFramebufferTexture3D || 72696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fNamedFramebufferRenderbuffer || 72796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetNamedFramebufferAttachmentParameteriv || 72896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGenerateTextureMipmap || 72996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fFramebufferDrawBuffer || 73096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fFramebufferDrawBuffers || 73196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fFramebufferReadBuffer || 73296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetFramebufferParameteriv || 73396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fNamedCopyBufferSubData || 73496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexArrayVertexOffset || 73596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexArrayColorOffset || 73696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexArrayEdgeFlagOffset || 73796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexArrayIndexOffset || 73896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexArrayNormalOffset || 73996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexArrayTexCoordOffset || 74096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexArrayMultiTexCoordOffset || 74196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexArrayFogCoordOffset || 74296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexArraySecondaryColorOffset || 74396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexArrayVertexAttribOffset || 74496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fVertexArrayVertexAttribIOffset || 74596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fEnableVertexArray || 74696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDisableVertexArray || 74796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fEnableVertexArrayAttrib || 74896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDisableVertexArrayAttrib || 74996fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetVertexArrayIntegerv || 75096fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetVertexArrayPointerv || 75196fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetVertexArrayIntegeri_v || 75296fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetVertexArrayPointeri_v || 75396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fMapNamedBufferRange || 75496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fFlushMappedNamedBufferRange) { 755626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton RETURN_FALSE_INTERFACE 756626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 757626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 758626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 759626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton 760626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton if ((kGL_GrGLStandard == fStandard && glVer >= GR_GL_VER(4,3)) || 761626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton fExtensions.has("GL_KHR_debug")) { 76296fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == fFunctions.fDebugMessageControl || 76396fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDebugMessageInsert || 76496fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fDebugMessageCallback || 76596fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fGetDebugMessageLog || 76696fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fPushDebugGroup || 76796fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fPopDebugGroup || 76896fcdcc219d2a0d3579719b84b28bede76efba64halcanary nullptr == fFunctions.fObjectLabel) { 769626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton RETURN_FALSE_INTERFACE 770626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 771626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton } 772626e1ffe84c24a969dc56ca70ab2e950bf5034c4cdalton 773b1a32ad51767d7639abc6ba16aae656145d7fc77bsalomon if (fExtensions.has("EGL_KHR_image") || fExtensions.has("EGL_KHR_image_base")) { 7747ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon if (nullptr == fFunctions.fEGLCreateImage || 7757ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon nullptr == fFunctions.fEGLDestroyImage) { 776b1a32ad51767d7639abc6ba16aae656145d7fc77bsalomon RETURN_FALSE_INTERFACE 777b1a32ad51767d7639abc6ba16aae656145d7fc77bsalomon } 778b1a32ad51767d7639abc6ba16aae656145d7fc77bsalomon } 779b1a32ad51767d7639abc6ba16aae656145d7fc77bsalomon 780bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com return true; 781bf2a46941e8fdebfcd24ea8f7184779021898225bsalomon@google.com} 782