2 * Copyright 2011 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
13 void GrGLClearErr(const GrGLInterface* gl) {
14 while (GR_GL_NO_ERROR != gl->fFunctions.fGetError()) {}
18 const char *get_error_string(uint32_t err) {
22 case GR_GL_INVALID_ENUM:
23 return "Invalid Enum";
24 case GR_GL_INVALID_VALUE:
25 return "Invalid Value";
26 case GR_GL_INVALID_OPERATION:
27 return "Invalid Operation";
28 case GR_GL_OUT_OF_MEMORY:
29 return "Out of Memory";
30 case GR_GL_CONTEXT_LOST:
31 return "Context Lost";
37 void GrGLCheckErr(const GrGLInterface* gl,
40 uint32_t err = GR_GL_GET_ERROR(gl);
41 if (GR_GL_NO_ERROR != err) {
42 GrPrintf("---- glGetError 0x%x(%s)", err, get_error_string(err));
44 GrPrintf(" at\n\t%s", location);
47 GrPrintf("\n\t\t%s", call);
53 ///////////////////////////////////////////////////////////////////////////////
56 bool gLogCallsGL = !!(GR_GL_LOG_CALLS_START);
60 bool gCheckErrorGL = !!(GR_GL_CHECK_ERROR_START);
63 ///////////////////////////////////////////////////////////////////////////////
65 GrGLStandard GrGLGetStandardInUseFromString(const char* versionString) {
66 if (NULL == versionString) {
67 SkDebugf("NULL GL version string.");
68 return kNone_GrGLStandard;
74 int n = sscanf(versionString, "%d.%d", &major, &minor);
76 return kGL_GrGLStandard;
81 n = sscanf(versionString, "OpenGL ES-%c%c %d.%d", profile, profile+1, &major, &minor);
83 // we no longer support ES1.
84 return kNone_GrGLStandard;
88 n = sscanf(versionString, "OpenGL ES %d.%d", &major, &minor);
90 return kGLES_GrGLStandard;
92 return kNone_GrGLStandard;
95 bool GrGLIsMesaFromVersionString(const char* versionString) {
96 int major, minor, mesaMajor, mesaMinor;
97 int n = sscanf(versionString, "%d.%d Mesa %d.%d", &major, &minor, &mesaMajor, &mesaMinor);
101 bool GrGLIsChromiumFromRendererString(const char* rendererString) {
102 return 0 == strcmp(rendererString, "Chromium");
105 GrGLVersion GrGLGetVersionFromString(const char* versionString) {
106 if (NULL == versionString) {
107 SkDebugf("NULL GL version string.");
108 return GR_GL_INVALID_VER;
114 int mesaMajor, mesaMinor;
115 int n = sscanf(versionString, "%d.%d Mesa %d.%d", &major, &minor, &mesaMajor, &mesaMinor);
117 return GR_GL_VER(major, minor);
120 n = sscanf(versionString, "%d.%d", &major, &minor);
122 return GR_GL_VER(major, minor);
126 n = sscanf(versionString, "OpenGL ES-%c%c %d.%d", profile, profile+1,
129 return GR_GL_VER(major, minor);
132 n = sscanf(versionString, "OpenGL ES %d.%d", &major, &minor);
134 return GR_GL_VER(major, minor);
137 return GR_GL_INVALID_VER;
140 GrGLSLVersion GrGLGetGLSLVersionFromString(const char* versionString) {
141 if (NULL == versionString) {
142 SkDebugf("NULL GLSL version string.");
143 return GR_GLSL_INVALID_VER;
148 int n = sscanf(versionString, "%d.%d", &major, &minor);
150 return GR_GLSL_VER(major, minor);
153 n = sscanf(versionString, "OpenGL ES GLSL ES %d.%d", &major, &minor);
155 return GR_GLSL_VER(major, minor);
158 #ifdef SK_BUILD_FOR_ANDROID
159 // android hack until the gpu vender updates their drivers
160 n = sscanf(versionString, "OpenGL ES GLSL %d.%d", &major, &minor);
162 return GR_GLSL_VER(major, minor);
166 return GR_GLSL_INVALID_VER;
169 GrGLVendor GrGLGetVendorFromString(const char* vendorString) {
171 if (0 == strcmp(vendorString, "ARM")) {
172 return kARM_GrGLVendor;
174 if (0 == strcmp(vendorString, "Imagination Technologies")) {
175 return kImagination_GrGLVendor;
177 if (0 == strncmp(vendorString, "Intel ", 6) || 0 == strcmp(vendorString, "Intel")) {
178 return kIntel_GrGLVendor;
180 if (0 == strcmp(vendorString, "Qualcomm")) {
181 return kQualcomm_GrGLVendor;
183 if (0 == strcmp(vendorString, "NVIDIA Corporation")) {
184 return kNVIDIA_GrGLVendor;
187 return kOther_GrGLVendor;
190 GrGLRenderer GrGLGetRendererFromString(const char* rendererString) {
191 if (rendererString) {
192 if (0 == strcmp(rendererString, "NVIDIA Tegra 3")) {
193 return kTegra3_GrGLRenderer;
194 } else if (0 == strcmp(rendererString, "NVIDIA Tegra")) {
195 return kTegra2_GrGLRenderer;
198 return kOther_GrGLRenderer;
201 GrGLVersion GrGLGetVersion(const GrGLInterface* gl) {
203 GR_GL_CALL_RET(gl, v, GetString(GR_GL_VERSION));
204 return GrGLGetVersionFromString((const char*) v);
207 GrGLSLVersion GrGLGetGLSLVersion(const GrGLInterface* gl) {
209 GR_GL_CALL_RET(gl, v, GetString(GR_GL_SHADING_LANGUAGE_VERSION));
210 return GrGLGetGLSLVersionFromString((const char*) v);
213 GrGLVendor GrGLGetVendor(const GrGLInterface* gl) {
215 GR_GL_CALL_RET(gl, v, GetString(GR_GL_VENDOR));
216 return GrGLGetVendorFromString((const char*) v);
219 GrGLRenderer GrGLGetRenderer(const GrGLInterface* gl) {
221 GR_GL_CALL_RET(gl, v, GetString(GR_GL_RENDERER));
222 return GrGLGetRendererFromString((const char*) v);
225 template<> void GrGLGetMatrix<3>(GrGLfloat* dest, const SkMatrix& src) {
227 dest[0] = SkScalarToFloat(src[SkMatrix::kMScaleX]);
228 dest[1] = SkScalarToFloat(src[SkMatrix::kMSkewY]);
229 dest[2] = SkScalarToFloat(src[SkMatrix::kMPersp0]);
232 dest[3] = SkScalarToFloat(src[SkMatrix::kMSkewX]);
233 dest[4] = SkScalarToFloat(src[SkMatrix::kMScaleY]);
234 dest[5] = SkScalarToFloat(src[SkMatrix::kMPersp1]);
237 dest[6] = SkScalarToFloat(src[SkMatrix::kMTransX]);
238 dest[7] = SkScalarToFloat(src[SkMatrix::kMTransY]);
239 dest[8] = SkScalarToFloat(src[SkMatrix::kMPersp2]);
242 template<> void GrGLGetMatrix<4>(GrGLfloat* dest, const SkMatrix& src) {
244 dest[0] = SkScalarToFloat(src[SkMatrix::kMScaleX]);
245 dest[1] = SkScalarToFloat(src[SkMatrix::kMSkewY]);
247 dest[3] = SkScalarToFloat(src[SkMatrix::kMPersp0]);
250 dest[4] = SkScalarToFloat(src[SkMatrix::kMSkewX]);
251 dest[5] = SkScalarToFloat(src[SkMatrix::kMScaleY]);
253 dest[7] = SkScalarToFloat(src[SkMatrix::kMPersp1]);
262 dest[12] = SkScalarToFloat(src[SkMatrix::kMTransX]);
263 dest[13] = SkScalarToFloat(src[SkMatrix::kMTransY]);
265 dest[15] = SkScalarToFloat(src[SkMatrix::kMPersp2]);
268 GrGLenum GrToGLStencilFunc(GrStencilFunc basicFunc) {
269 static const GrGLenum gTable[] = {
270 GR_GL_ALWAYS, // kAlways_StencilFunc
271 GR_GL_NEVER, // kNever_StencilFunc
272 GR_GL_GREATER, // kGreater_StencilFunc
273 GR_GL_GEQUAL, // kGEqual_StencilFunc
274 GR_GL_LESS, // kLess_StencilFunc
275 GR_GL_LEQUAL, // kLEqual_StencilFunc,
276 GR_GL_EQUAL, // kEqual_StencilFunc,
277 GR_GL_NOTEQUAL, // kNotEqual_StencilFunc,
279 GR_STATIC_ASSERT(SK_ARRAY_COUNT(gTable) == kBasicStencilFuncCount);
280 GR_STATIC_ASSERT(0 == kAlways_StencilFunc);
281 GR_STATIC_ASSERT(1 == kNever_StencilFunc);
282 GR_STATIC_ASSERT(2 == kGreater_StencilFunc);
283 GR_STATIC_ASSERT(3 == kGEqual_StencilFunc);
284 GR_STATIC_ASSERT(4 == kLess_StencilFunc);
285 GR_STATIC_ASSERT(5 == kLEqual_StencilFunc);
286 GR_STATIC_ASSERT(6 == kEqual_StencilFunc);
287 GR_STATIC_ASSERT(7 == kNotEqual_StencilFunc);
288 SkASSERT((unsigned) basicFunc < kBasicStencilFuncCount);
290 return gTable[basicFunc];