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