19c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com/* 29c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com * Copyright 2012 Google Inc. 39c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com * 49c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 59c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com * found in the LICENSE file. 69c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com */ 79c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 89c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#ifndef GrGLUtil_DEFINED 99c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#define GrGLUtil_DEFINED 109c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 119c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#include "gl/GrGLInterface.h" 1291bcc94e8710c1ec5126a31cd805a6c64bb3c39dbsalomon@google.com#include "GrGLDefines.h" 139c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 14215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.orgclass SkMatrix; 15215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org 169c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com//////////////////////////////////////////////////////////////////////////////// 179c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 189c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.comtypedef uint32_t GrGLVersion; 199c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.comtypedef uint32_t GrGLSLVersion; 209c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 21f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org#define GR_GL_VER(major, minor) ((static_cast<int>(major) << 16) | \ 22f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org static_cast<int>(minor)) 23f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org#define GR_GLSL_VER(major, minor) ((static_cast<int>(major) << 16) | \ 24f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org static_cast<int>(minor)) 25f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org 26f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org#define GR_GL_INVALID_VER GR_GL_VER(0, 0) 27f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org#define GR_GLSL_INVALID_VER GR_GL_VER(0, 0) 28f4e67e3e5e5017284300a61e7bb046723a44b0cfcommit-bot@chromium.org 290b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.com/** 300694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org * The Vendor and Renderer enum values are lazily updated as required. 310b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.com */ 320b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.comenum GrGLVendor { 3396966a5a1ffc2f03eef1b5523308299aa4195f50bsalomon@google.com kARM_GrGLVendor, 343012ded0ffd152c41ef5c85d13e49116fee856ebbsalomon@google.com kImagination_GrGLVendor, 353012ded0ffd152c41ef5c85d13e49116fee856ebbsalomon@google.com kIntel_GrGLVendor, 367a434a28685fd045cf848b99b563dfcf978363bccommit-bot@chromium.org kQualcomm_GrGLVendor, 373012ded0ffd152c41ef5c85d13e49116fee856ebbsalomon@google.com 383012ded0ffd152c41ef5c85d13e49116fee856ebbsalomon@google.com kOther_GrGLVendor 390b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.com}; 400b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.com 410694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.orgenum GrGLRenderer { 426dee8759ab8c90dcffd76f114eec333405fd176ecommit-bot@chromium.org kTegra2_GrGLRenderer, 430694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org kTegra3_GrGLRenderer, 440694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org 450694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org kOther_GrGLRenderer 460694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org}; 470694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.org 489c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com//////////////////////////////////////////////////////////////////////////////// 499c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 509c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com/** 519c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com * Some drivers want the var-int arg to be zero-initialized on input. 529c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com */ 539c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#define GR_GL_INIT_ZERO 0 549c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#define GR_GL_GetIntegerv(gl, e, p) \ 559c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com do { \ 569c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com *(p) = GR_GL_INIT_ZERO; \ 579c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com GR_GL_CALL(gl, GetIntegerv(e, p)); \ 589c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com } while (0) 599c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 609c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#define GR_GL_GetFramebufferAttachmentParameteriv(gl, t, a, pname, p) \ 619c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com do { \ 629c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com *(p) = GR_GL_INIT_ZERO; \ 639c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com GR_GL_CALL(gl, GetFramebufferAttachmentParameteriv(t, a, pname, p)); \ 649c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com } while (0) 659c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 669c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#define GR_GL_GetRenderbufferParameteriv(gl, t, pname, p) \ 679c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com do { \ 689c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com *(p) = GR_GL_INIT_ZERO; \ 699c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com GR_GL_CALL(gl, GetRenderbufferParameteriv(t, pname, p)); \ 709c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com } while (0) 719c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#define GR_GL_GetTexLevelParameteriv(gl, t, l, pname, p) \ 729c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com do { \ 739c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com *(p) = GR_GL_INIT_ZERO; \ 749c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com GR_GL_CALL(gl, GetTexLevelParameteriv(t, l, pname, p)); \ 759c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com } while (0) 769c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 779c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com//////////////////////////////////////////////////////////////////////////////// 789c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 799c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com/** 809c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com * Helpers for glGetString() 819c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com */ 829c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 839c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com// these variants assume caller already has a string from glGetString() 849c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.comGrGLVersion GrGLGetVersionFromString(const char* versionString); 859e90aed5de82732cc9921f01388d3063a41a053bcommit-bot@chromium.orgGrGLStandard GrGLGetStandardInUseFromString(const char* versionString); 869c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.comGrGLSLVersion GrGLGetGLSLVersionFromString(const char* versionString); 87459104ceea00a08855099238563a06099340c2facommit-bot@chromium.orgbool GrGLIsMesaFromVersionString(const char* versionString); 880b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.comGrGLVendor GrGLGetVendorFromString(const char* vendorString); 890694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.orgGrGLRenderer GrGLGetRendererFromString(const char* rendererString); 90c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.orgbool GrGLIsChromiumFromRendererString(const char* rendererString); 919c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 929c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com// these variants call glGetString() 939c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.comGrGLVersion GrGLGetVersion(const GrGLInterface*); 949c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.comGrGLSLVersion GrGLGetGLSLVersion(const GrGLInterface*); 950b1e481709ef9b86261f46e9fd44d8cdec7c2d8ebsalomon@google.comGrGLVendor GrGLGetVendor(const GrGLInterface*); 960694ea7f6a16e946972b9c625f434e80eb42bb5fcommit-bot@chromium.orgGrGLRenderer GrGLGetRenderer(const GrGLInterface*); 979c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 98c9424b8e6dc204fc304c021480a04a468899aa34commit-bot@chromium.org 999c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com/** 1009c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com * Helpers for glGetError() 1019c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com */ 1029c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 1032717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.comvoid GrGLCheckErr(const GrGLInterface* gl, 1042717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com const char* location, 1052717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com const char* call); 1069c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 1072717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.comvoid GrGLClearErr(const GrGLInterface* gl); 1082717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com 109215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org/** 110215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org * Helper for converting SkMatrix to a column-major GL float array 111215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org */ 112215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.orgtemplate<int MatrixSize> void GrGLGetMatrix(GrGLfloat* dest, const SkMatrix& src); 113215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org 1142717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com//////////////////////////////////////////////////////////////////////////////// 1152717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com 1162717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com/** 1172717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com * Macros for using GrGLInterface to make GL calls 1182717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com */ 1192717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com 1202717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com// internal macro to conditionally call glGetError based on compile-time and 1212717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com// run-time flags. 1222717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com#if GR_GL_CHECK_ERROR 1232717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com extern bool gCheckErrorGL; 1242717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com #define GR_GL_CHECK_ERROR_IMPL(IFACE, X) \ 1252717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com if (gCheckErrorGL) \ 1262717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com GrGLCheckErr(IFACE, GR_FILE_AND_LINE_STR, #X) 1272717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com#else 1282717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com #define GR_GL_CHECK_ERROR_IMPL(IFACE, X) 1292717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com#endif 1302717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com 1312717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com// internal macro to conditionally log the gl call using GrPrintf based on 1322717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com// compile-time and run-time flags. 1332717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com#if GR_GL_LOG_CALLS 1342717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com extern bool gLogCallsGL; 1352717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com #define GR_GL_LOG_CALLS_IMPL(X) \ 1362717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com if (gLogCallsGL) \ 1372717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com GrPrintf(GR_FILE_AND_LINE_STR "GL: " #X "\n") 1382717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com#else 1392717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com #define GR_GL_LOG_CALLS_IMPL(X) 1402717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com#endif 1412717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com 1422717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com// internal macro that does the per-GL-call callback (if necessary) 1432717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com#if GR_GL_PER_GL_FUNC_CALLBACK 1442717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com #define GR_GL_CALLBACK_IMPL(IFACE) (IFACE)->fCallback(IFACE) 1452717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com#else 1462717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com #define GR_GL_CALLBACK_IMPL(IFACE) 1472717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com#endif 1482717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com 1492717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com// makes a GL call on the interface and does any error checking and logging 1502717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com#define GR_GL_CALL(IFACE, X) \ 1512717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com do { \ 1522717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com GR_GL_CALL_NOERRCHECK(IFACE, X); \ 1532717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com GR_GL_CHECK_ERROR_IMPL(IFACE, X); \ 1542717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com } while (false) 1552717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com 1562717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com// Variant of above that always skips the error check. This is useful when 1572717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com// the caller wants to do its own glGetError() call and examine the error value. 1582717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com#define GR_GL_CALL_NOERRCHECK(IFACE, X) \ 1592717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com do { \ 1602717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com GR_GL_CALLBACK_IMPL(IFACE); \ 161c72425ae368bfcb47de7d2532eb90d305ec0d1cfcommit-bot@chromium.org (IFACE)->fFunctions.f##X; \ 1622717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com GR_GL_LOG_CALLS_IMPL(X); \ 1632717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com } while (false) 1642717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com 1652717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com// same as GR_GL_CALL but stores the return value of the gl call in RET 1662717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com#define GR_GL_CALL_RET(IFACE, RET, X) \ 1672717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com do { \ 1682717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com GR_GL_CALL_RET_NOERRCHECK(IFACE, RET, X); \ 1692717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com GR_GL_CHECK_ERROR_IMPL(IFACE, X); \ 1702717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com } while (false) 1712717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com 1722717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com// same as GR_GL_CALL_RET but always skips the error check. 1732717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com#define GR_GL_CALL_RET_NOERRCHECK(IFACE, RET, X) \ 1742717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com do { \ 1752717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com GR_GL_CALLBACK_IMPL(IFACE); \ 176c72425ae368bfcb47de7d2532eb90d305ec0d1cfcommit-bot@chromium.org (RET) = (IFACE)->fFunctions.f##X; \ 1772717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com GR_GL_LOG_CALLS_IMPL(X); \ 1782717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com } while (false) 1792717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com 1802717d56b22f14ce0de206cd695ca2855bc568fbcbsalomon@google.com// call glGetError without doing a redundant error check or logging. 181c72425ae368bfcb47de7d2532eb90d305ec0d1cfcommit-bot@chromium.org#define GR_GL_GET_ERROR(IFACE) (IFACE)->fFunctions.fGetError() 1829c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com 1839c1f1ac5d399c73f5f331bdf7b392ea7f0c44dafbsalomon@google.com#endif 184