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));
43 if (NULL != location) {
44 GrPrintf(" at\n\t%s", location);
47 GrPrintf("\n\t\t%s", call);
54 // Mesa uses a non-standard version string of format: 1.4 Mesa <mesa_major>.<mesa_minor>.
55 // The mapping of from mesa version to GL version came from here: http://www.mesa3d.org/intro.html
56 bool get_gl_version_for_mesa(int mesaMajorVersion, int* major, int* minor) {
57 switch (mesaMajorVersion) {
64 *minor = mesaMajorVersion - 1;
88 ///////////////////////////////////////////////////////////////////////////////
91 bool gLogCallsGL = !!(GR_GL_LOG_CALLS_START);
95 bool gCheckErrorGL = !!(GR_GL_CHECK_ERROR_START);
98 ///////////////////////////////////////////////////////////////////////////////
100 GrGLStandard GrGLGetStandardInUseFromString(const char* versionString) {
101 if (NULL == versionString) {
102 SkDebugf("NULL GL version string.");
103 return kNone_GrGLStandard;
109 int n = sscanf(versionString, "%d.%d", &major, &minor);
111 return kGL_GrGLStandard;
116 n = sscanf(versionString, "OpenGL ES-%c%c %d.%d", profile, profile+1, &major, &minor);
118 // we no longer support ES1.
119 return kNone_GrGLStandard;
123 n = sscanf(versionString, "OpenGL ES %d.%d", &major, &minor);
125 return kGLES_GrGLStandard;
127 return kNone_GrGLStandard;
130 bool GrGLIsMesaFromVersionString(const char* versionString) {
131 int major, minor, mesaMajor, mesaMinor;
132 int n = sscanf(versionString, "%d.%d Mesa %d.%d", &major, &minor, &mesaMajor, &mesaMinor);
136 bool GrGLIsChromiumFromRendererString(const char* rendererString) {
137 return 0 == strcmp(rendererString, "Chromium");
140 GrGLVersion GrGLGetVersionFromString(const char* versionString) {
141 if (NULL == versionString) {
142 SkDebugf("NULL GL version string.");
143 return GR_GL_INVALID_VER;
149 int mesaMajor, mesaMinor;
150 int n = sscanf(versionString, "%d.%d Mesa %d.%d", &major, &minor, &mesaMajor, &mesaMinor);
152 if (get_gl_version_for_mesa(mesaMajor, &major, &minor)) {
153 return GR_GL_VER(major, minor);
155 return GR_GL_INVALID_VER;
159 n = sscanf(versionString, "%d.%d", &major, &minor);
161 return GR_GL_VER(major, minor);
165 n = sscanf(versionString, "OpenGL ES-%c%c %d.%d", profile, profile+1,
168 return GR_GL_VER(major, minor);
171 n = sscanf(versionString, "OpenGL ES %d.%d", &major, &minor);
173 return GR_GL_VER(major, minor);
176 return GR_GL_INVALID_VER;
179 GrGLSLVersion GrGLGetGLSLVersionFromString(const char* versionString) {
180 if (NULL == versionString) {
181 SkDebugf("NULL GLSL version string.");
182 return GR_GLSL_INVALID_VER;
187 int n = sscanf(versionString, "%d.%d", &major, &minor);
189 return GR_GLSL_VER(major, minor);
192 n = sscanf(versionString, "OpenGL ES GLSL ES %d.%d", &major, &minor);
194 return GR_GLSL_VER(major, minor);
197 #ifdef SK_BUILD_FOR_ANDROID
198 // android hack until the gpu vender updates their drivers
199 n = sscanf(versionString, "OpenGL ES GLSL %d.%d", &major, &minor);
201 return GR_GLSL_VER(major, minor);
205 return GR_GLSL_INVALID_VER;
208 GrGLVendor GrGLGetVendorFromString(const char* vendorString) {
209 if (NULL != vendorString) {
210 if (0 == strcmp(vendorString, "ARM")) {
211 return kARM_GrGLVendor;
213 if (0 == strcmp(vendorString, "Imagination Technologies")) {
214 return kImagination_GrGLVendor;
216 if (0 == strncmp(vendorString, "Intel ", 6) || 0 == strcmp(vendorString, "Intel")) {
217 return kIntel_GrGLVendor;
219 if (0 == strcmp(vendorString, "Qualcomm")) {
220 return kQualcomm_GrGLVendor;
223 return kOther_GrGLVendor;
226 GrGLRenderer GrGLGetRendererFromString(const char* rendererString) {
227 if (NULL != rendererString) {
228 if (0 == strcmp(rendererString, "NVIDIA Tegra 3")) {
229 return kTegra3_GrGLRenderer;
230 } else if (0 == strcmp(rendererString, "NVIDIA Tegra")) {
231 return kTegra2_GrGLRenderer;
234 return kOther_GrGLRenderer;
237 GrGLVersion GrGLGetVersion(const GrGLInterface* gl) {
239 GR_GL_CALL_RET(gl, v, GetString(GR_GL_VERSION));
240 return GrGLGetVersionFromString((const char*) v);
243 GrGLSLVersion GrGLGetGLSLVersion(const GrGLInterface* gl) {
245 GR_GL_CALL_RET(gl, v, GetString(GR_GL_SHADING_LANGUAGE_VERSION));
246 return GrGLGetGLSLVersionFromString((const char*) v);
249 GrGLVendor GrGLGetVendor(const GrGLInterface* gl) {
251 GR_GL_CALL_RET(gl, v, GetString(GR_GL_VENDOR));
252 return GrGLGetVendorFromString((const char*) v);
255 GrGLRenderer GrGLGetRenderer(const GrGLInterface* gl) {
257 GR_GL_CALL_RET(gl, v, GetString(GR_GL_RENDERER));
258 return GrGLGetRendererFromString((const char*) v);
261 template<> void GrGLGetMatrix<3>(GrGLfloat* dest, const SkMatrix& src) {
263 dest[0] = SkScalarToFloat(src[SkMatrix::kMScaleX]);
264 dest[1] = SkScalarToFloat(src[SkMatrix::kMSkewY]);
265 dest[2] = SkScalarToFloat(src[SkMatrix::kMPersp0]);
268 dest[3] = SkScalarToFloat(src[SkMatrix::kMSkewX]);
269 dest[4] = SkScalarToFloat(src[SkMatrix::kMScaleY]);
270 dest[5] = SkScalarToFloat(src[SkMatrix::kMPersp1]);
273 dest[6] = SkScalarToFloat(src[SkMatrix::kMTransX]);
274 dest[7] = SkScalarToFloat(src[SkMatrix::kMTransY]);
275 dest[8] = SkScalarToFloat(src[SkMatrix::kMPersp2]);
278 template<> void GrGLGetMatrix<4>(GrGLfloat* dest, const SkMatrix& src) {
280 dest[0] = SkScalarToFloat(src[SkMatrix::kMScaleX]);
281 dest[1] = SkScalarToFloat(src[SkMatrix::kMSkewY]);
283 dest[3] = SkScalarToFloat(src[SkMatrix::kMPersp0]);
286 dest[4] = SkScalarToFloat(src[SkMatrix::kMSkewX]);
287 dest[5] = SkScalarToFloat(src[SkMatrix::kMScaleY]);
289 dest[7] = SkScalarToFloat(src[SkMatrix::kMPersp1]);
298 dest[12] = SkScalarToFloat(src[SkMatrix::kMTransX]);
299 dest[13] = SkScalarToFloat(src[SkMatrix::kMTransY]);
301 dest[15] = SkScalarToFloat(src[SkMatrix::kMPersp2]);