14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
22494c97a0e266f7c7795bd71e1686904a75087e3shannon.woods@transgaming.com// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
34f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be
44f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// found in the LICENSE file.
54f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com//
64f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
74f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// utilities.cpp: Conversion functions and other utility routines.
84f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
9a2ecfcccf1d1a85e6054a7314ce1f9de0648ac7fshannonwoods@chromium.org#include "common/utilities.h"
10a2ecfcccf1d1a85e6054a7314ce1f9de0648ac7fshannonwoods@chromium.org#include "common/mathutil.h"
11a2ecfcccf1d1a85e6054a7314ce1f9de0648ac7fshannonwoods@chromium.org
1283217796ed57efe8954fc3b53d743aae1a6cfe6bGeoff Lang#if defined(_WIN32)
1383217796ed57efe8954fc3b53d743aae1a6cfe6bGeoff Lang#include <windows.h>
1483217796ed57efe8954fc3b53d743aae1a6cfe6bGeoff Lang#endif
1583217796ed57efe8954fc3b53d743aae1a6cfe6bGeoff Lang
16a2ecfcccf1d1a85e6054a7314ce1f9de0648ac7fshannonwoods@chromium.org#include <set>
174f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com
181b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.comnamespace gl
191b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com{
201b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com
212494c97a0e266f7c7795bd71e1686904a75087e3shannon.woods@transgaming.comint UniformComponentCount(GLenum type)
221b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com{
231b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com    switch (type)
241b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com    {
251b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_BOOL:
261b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_FLOAT:
271b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_INT:
28a9cd70acc3ed442d45ee0ac37b04db8f44ee625cdaniel@transgaming.com      case GL_SAMPLER_2D:
29e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_SAMPLER_3D:
30a9cd70acc3ed442d45ee0ac37b04db8f44ee625cdaniel@transgaming.com      case GL_SAMPLER_CUBE:
31e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_SAMPLER_2D_ARRAY:
32e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_2D:
33e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_3D:
34e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_CUBE:
35e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_2D_ARRAY:
36e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_2D:
37e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_3D:
38e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_CUBE:
39e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
40cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_2D_SHADOW:
41cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_CUBE_SHADOW:
42cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_2D_ARRAY_SHADOW:
4344ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_UNSIGNED_INT:
44e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        return 1;
451b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_BOOL_VEC2:
461b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_FLOAT_VEC2:
471b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_INT_VEC2:
4844ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_UNSIGNED_INT_VEC2:
49e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        return 2;
501b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_INT_VEC3:
511b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_FLOAT_VEC3:
521b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_BOOL_VEC3:
5344ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_UNSIGNED_INT_VEC3:
54e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        return 3;
551b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_BOOL_VEC4:
561b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_FLOAT_VEC4:
571b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_INT_VEC4:
5844ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_UNSIGNED_INT_VEC4:
591b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_FLOAT_MAT2:
60e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        return 4;
61e6ca670973fdf798173ef5f875e8544e7351f1b4shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT2x3:
62e6ca670973fdf798173ef5f875e8544e7351f1b4shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT3x2:
63e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        return 6;
64e6ca670973fdf798173ef5f875e8544e7351f1b4shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT2x4:
65e6ca670973fdf798173ef5f875e8544e7351f1b4shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT4x2:
66e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        return 8;
671b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_FLOAT_MAT3:
68e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        return 9;
69e6ca670973fdf798173ef5f875e8544e7351f1b4shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT3x4:
70e6ca670973fdf798173ef5f875e8544e7351f1b4shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT4x3:
71e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        return 12;
721b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_FLOAT_MAT4:
73e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        return 16;
741b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      default:
75e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        UNREACHABLE();
761b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com    }
771b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com
781b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com    return 0;
791b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com}
801b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com
811b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.comGLenum UniformComponentType(GLenum type)
821b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com{
831b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com    switch(type)
841b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com    {
851b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_BOOL:
861b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_BOOL_VEC2:
871b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_BOOL_VEC3:
881b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_BOOL_VEC4:
89e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        return GL_BOOL;
901b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_FLOAT:
911b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_FLOAT_VEC2:
921b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_FLOAT_VEC3:
931b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_FLOAT_VEC4:
941b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_FLOAT_MAT2:
951b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_FLOAT_MAT3:
961b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_FLOAT_MAT4:
97e6ca670973fdf798173ef5f875e8544e7351f1b4shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT2x3:
98e6ca670973fdf798173ef5f875e8544e7351f1b4shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT3x2:
99e6ca670973fdf798173ef5f875e8544e7351f1b4shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT2x4:
100e6ca670973fdf798173ef5f875e8544e7351f1b4shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT4x2:
101e6ca670973fdf798173ef5f875e8544e7351f1b4shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT3x4:
102e6ca670973fdf798173ef5f875e8544e7351f1b4shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT4x3:
103e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        return GL_FLOAT;
1041b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_INT:
105a9cd70acc3ed442d45ee0ac37b04db8f44ee625cdaniel@transgaming.com      case GL_SAMPLER_2D:
106e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_SAMPLER_3D:
107a9cd70acc3ed442d45ee0ac37b04db8f44ee625cdaniel@transgaming.com      case GL_SAMPLER_CUBE:
108e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_SAMPLER_2D_ARRAY:
109e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_2D:
110e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_3D:
111e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_CUBE:
112e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_2D_ARRAY:
113e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_2D:
114e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_3D:
115e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_CUBE:
116e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
117cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_2D_SHADOW:
118cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_CUBE_SHADOW:
119cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_2D_ARRAY_SHADOW:
1201b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_INT_VEC2:
1211b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_INT_VEC3:
1221b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      case GL_INT_VEC4:
123e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        return GL_INT;
12444ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_UNSIGNED_INT:
12544ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_UNSIGNED_INT_VEC2:
12644ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_UNSIGNED_INT_VEC3:
12744ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_UNSIGNED_INT_VEC4:
128e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        return GL_UNSIGNED_INT;
1291b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com      default:
130e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        UNREACHABLE();
1311b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com    }
1321b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com
1331b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com    return GL_NONE;
1341b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com}
1351b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com
13672e8f447228e682f07cbf31e9a54f85d9843c6e5jbauman@chromium.orgsize_t UniformComponentSize(GLenum type)
1371b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com{
1381b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com    switch(type)
1391b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com    {
14044ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_BOOL:         return sizeof(GLint);
14144ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT:        return sizeof(GLfloat);
14244ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_INT:          return sizeof(GLint);
14344ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_UNSIGNED_INT: return sizeof(GLuint);
14472e8f447228e682f07cbf31e9a54f85d9843c6e5jbauman@chromium.org      default:       UNREACHABLE();
1451b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com    }
1461b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com
14772e8f447228e682f07cbf31e9a54f85d9843c6e5jbauman@chromium.org    return 0;
14872e8f447228e682f07cbf31e9a54f85d9843c6e5jbauman@chromium.org}
14972e8f447228e682f07cbf31e9a54f85d9843c6e5jbauman@chromium.org
150e918ea2df83a3acaa2bd4f515f085471a1212321daniel@transgaming.comsize_t UniformInternalSize(GLenum type)
15172e8f447228e682f07cbf31e9a54f85d9843c6e5jbauman@chromium.org{
1522494c97a0e266f7c7795bd71e1686904a75087e3shannon.woods@transgaming.com    // Expanded to 4-element vectors
1532494c97a0e266f7c7795bd71e1686904a75087e3shannon.woods@transgaming.com    return UniformComponentSize(UniformComponentType(type)) * VariableRowCount(type) * 4;
1541b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com}
1551b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com
15647c600530e42280955cc0db7801e137c239b596ddaniel@transgaming.comsize_t UniformExternalSize(GLenum type)
15747c600530e42280955cc0db7801e137c239b596ddaniel@transgaming.com{
1582494c97a0e266f7c7795bd71e1686904a75087e3shannon.woods@transgaming.com    return UniformComponentSize(UniformComponentType(type)) * UniformComponentCount(type);
15947c600530e42280955cc0db7801e137c239b596ddaniel@transgaming.com}
16047c600530e42280955cc0db7801e137c239b596ddaniel@transgaming.com
1618a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.comGLenum UniformBoolVectorType(GLenum type)
1628a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com{
1638a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com    switch (type)
1648a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com    {
1658a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT:
1668a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com      case GL_INT:
16744ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_UNSIGNED_INT:
1688a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com        return GL_BOOL;
1698a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_VEC2:
1708a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com      case GL_INT_VEC2:
17144ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_UNSIGNED_INT_VEC2:
1728a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com        return GL_BOOL_VEC2;
1738a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_VEC3:
1748a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com      case GL_INT_VEC3:
17544ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_UNSIGNED_INT_VEC3:
1768a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com        return GL_BOOL_VEC3;
1778a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_VEC4:
1788a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com      case GL_INT_VEC4:
17944ce5b11b8cf4ee5f03c2ead116a27369fe99e0eshannon.woods%transgaming.com@gtempaccount.com      case GL_UNSIGNED_INT_VEC4:
1808a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com        return GL_BOOL_VEC4;
1818a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com
1828a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com      default:
1838a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com        UNREACHABLE();
1848a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com        return GL_NONE;
1858a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com    }
1868a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com}
1878a19eed917b5f0354937567ca15fa755e0116ffashannon.woods%transgaming.com@gtempaccount.com
1884af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.comint VariableRowCount(GLenum type)
1890b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com{
1900b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com    switch (type)
1910b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com    {
1924af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_NONE:
19366192b3e00d6b239b744f0ccb86d3bc98c6454eeJamie Madill      case GL_STRUCT_ANGLEX:
1944af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com        return 0;
1950b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com      case GL_BOOL:
1960b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com      case GL_FLOAT:
1970b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com      case GL_INT:
1986b7099111f6f00493b24dd05680f60c30b60cb7cshannonwoods@chromium.org      case GL_UNSIGNED_INT:
1990b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com      case GL_BOOL_VEC2:
2000b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com      case GL_FLOAT_VEC2:
2010b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com      case GL_INT_VEC2:
2028c788e8d35ba20ca19afacbcfe4a6f326b8ecb60shannonwoods@chromium.org      case GL_UNSIGNED_INT_VEC2:
2030b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com      case GL_BOOL_VEC3:
2048c788e8d35ba20ca19afacbcfe4a6f326b8ecb60shannonwoods@chromium.org      case GL_FLOAT_VEC3:
2058c788e8d35ba20ca19afacbcfe4a6f326b8ecb60shannonwoods@chromium.org      case GL_INT_VEC3:
2068c788e8d35ba20ca19afacbcfe4a6f326b8ecb60shannonwoods@chromium.org      case GL_UNSIGNED_INT_VEC3:
2070b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com      case GL_BOOL_VEC4:
2080b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com      case GL_FLOAT_VEC4:
2090b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com      case GL_INT_VEC4:
2108c788e8d35ba20ca19afacbcfe4a6f326b8ecb60shannonwoods@chromium.org      case GL_UNSIGNED_INT_VEC4:
211da8d38015a6b80501f6f4b8912105e626e88086fdaniel@transgaming.com      case GL_SAMPLER_2D:
212e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_SAMPLER_3D:
213da8d38015a6b80501f6f4b8912105e626e88086fdaniel@transgaming.com      case GL_SAMPLER_CUBE:
214e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_SAMPLER_2D_ARRAY:
215e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_2D:
216e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_3D:
217e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_CUBE:
218e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_2D_ARRAY:
219e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_2D:
220e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_3D:
221e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_CUBE:
222e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
223cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_2D_SHADOW:
224cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_CUBE_SHADOW:
225cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_2D_ARRAY_SHADOW:
2260b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com        return 1;
2270b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com      case GL_FLOAT_MAT2:
22802e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT3x2:
22902e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT4x2:
2300b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com        return 2;
2310b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com      case GL_FLOAT_MAT3:
23202e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT2x3:
23302e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT4x3:
2340b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com        return 3;
2350b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com      case GL_FLOAT_MAT4:
23602e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT2x4:
23702e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT3x4:
2380b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com        return 4;
2390b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com      default:
2400b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com        UNREACHABLE();
2414af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com    }
2424af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com
2434af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com    return 0;
2444af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com}
2454af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com
2464af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.comint VariableColumnCount(GLenum type)
2474af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com{
2484af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com    switch (type)
2494af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com    {
2504af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_NONE:
25166192b3e00d6b239b744f0ccb86d3bc98c6454eeJamie Madill      case GL_STRUCT_ANGLEX:
2520b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com        return 0;
2534af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_BOOL:
2544af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_FLOAT:
2554af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_INT:
2566b7099111f6f00493b24dd05680f60c30b60cb7cshannonwoods@chromium.org      case GL_UNSIGNED_INT:
2572494c97a0e266f7c7795bd71e1686904a75087e3shannon.woods@transgaming.com      case GL_SAMPLER_2D:
258e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_SAMPLER_3D:
2592494c97a0e266f7c7795bd71e1686904a75087e3shannon.woods@transgaming.com      case GL_SAMPLER_CUBE:
260e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_SAMPLER_2D_ARRAY:
261e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_2D:
262e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_3D:
263e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_CUBE:
264e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_2D_ARRAY:
265e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_2D:
266e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_3D:
267e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_CUBE:
268e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
269cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_2D_SHADOW:
270cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_CUBE_SHADOW:
271cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_2D_ARRAY_SHADOW:
2724af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com        return 1;
2734af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_BOOL_VEC2:
2744af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_FLOAT_VEC2:
2754af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_INT_VEC2:
2768c788e8d35ba20ca19afacbcfe4a6f326b8ecb60shannonwoods@chromium.org      case GL_UNSIGNED_INT_VEC2:
2774af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_FLOAT_MAT2:
27802e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT2x3:
27902e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT2x4:
2804af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com        return 2;
2814af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_BOOL_VEC3:
2828c788e8d35ba20ca19afacbcfe4a6f326b8ecb60shannonwoods@chromium.org      case GL_FLOAT_VEC3:
2838c788e8d35ba20ca19afacbcfe4a6f326b8ecb60shannonwoods@chromium.org      case GL_INT_VEC3:
2848c788e8d35ba20ca19afacbcfe4a6f326b8ecb60shannonwoods@chromium.org      case GL_UNSIGNED_INT_VEC3:
2854af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_FLOAT_MAT3:
28602e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT3x2:
28702e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT3x4:
2884af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com        return 3;
2894af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_BOOL_VEC4:
2904af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_FLOAT_VEC4:
2914af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_INT_VEC4:
2928c788e8d35ba20ca19afacbcfe4a6f326b8ecb60shannonwoods@chromium.org      case GL_UNSIGNED_INT_VEC4:
2934af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      case GL_FLOAT_MAT4:
29402e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT4x2:
29502e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com      case GL_FLOAT_MAT4x3:
2964af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com        return 4;
2974af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com      default:
2984af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com        UNREACHABLE();
2990b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com    }
3004af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com
3014af7acca9d3952b7e6ae3d4d788325bffbd710c0daniel@transgaming.com    return 0;
3020b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com}
3030b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com
304e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capensbool IsSampler(GLenum type)
305e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens{
306e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens    switch (type)
307e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens    {
308e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_SAMPLER_2D:
309e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_SAMPLER_3D:
310e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_SAMPLER_CUBE:
311e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_SAMPLER_2D_ARRAY:
312e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_2D:
313e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_3D:
314e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_CUBE:
315e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_INT_SAMPLER_2D_ARRAY:
316e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_2D:
317e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_3D:
318e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_CUBE:
319e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens      case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
320cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_2D_SHADOW:
321cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_CUBE_SHADOW:
322cb127d3d185a5073962cc58bb13e1ee8b5458be7Nicolas Capens      case GL_SAMPLER_2D_ARRAY_SHADOW:
323e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens        return true;
324e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens    }
325e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens
326e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens    return false;
327e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens}
328e60508840c2cf59c0fd6f8986d8c80c9f7425615Nicolas Capens
32902e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.combool IsMatrixType(GLenum type)
33002e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com{
33102e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com    return VariableRowCount(type) > 1;
33202e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com}
33302e11f3a8a3afae0f96752762800d430b0a2a3d7shannon.woods%transgaming.com@gtempaccount.com
3349bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.orgGLenum TransposeMatrixType(GLenum type)
3359bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org{
3369bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org    if (!IsMatrixType(type))
3379bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org    {
3389bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org        return type;
3399bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org    }
3409bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org
3419bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org    switch (type)
3429bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org    {
3439bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org      case GL_FLOAT_MAT2:   return GL_FLOAT_MAT2;
3449bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org      case GL_FLOAT_MAT3:   return GL_FLOAT_MAT3;
3459bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org      case GL_FLOAT_MAT4:   return GL_FLOAT_MAT4;
3469bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org      case GL_FLOAT_MAT2x3: return GL_FLOAT_MAT3x2;
3479bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org      case GL_FLOAT_MAT3x2: return GL_FLOAT_MAT2x3;
3489bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org      case GL_FLOAT_MAT2x4: return GL_FLOAT_MAT4x2;
3499bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org      case GL_FLOAT_MAT4x2: return GL_FLOAT_MAT2x4;
3509bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org      case GL_FLOAT_MAT3x4: return GL_FLOAT_MAT4x3;
3519bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org      case GL_FLOAT_MAT4x3: return GL_FLOAT_MAT3x4;
3529bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org      default: UNREACHABLE(); return GL_NONE;
3539bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org    }
3549bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org}
3559bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org
3568c6befc2f976d095d39d3033379838bf79e5637dJamie Madillint MatrixRegisterCount(GLenum type, bool isRowMajorMatrix)
3578c6befc2f976d095d39d3033379838bf79e5637dJamie Madill{
3588c6befc2f976d095d39d3033379838bf79e5637dJamie Madill    ASSERT(IsMatrixType(type));
3598c6befc2f976d095d39d3033379838bf79e5637dJamie Madill    return isRowMajorMatrix ? VariableRowCount(type) : VariableColumnCount(type);
3608c6befc2f976d095d39d3033379838bf79e5637dJamie Madill}
3618c6befc2f976d095d39d3033379838bf79e5637dJamie Madill
3628c6befc2f976d095d39d3033379838bf79e5637dJamie Madillint MatrixComponentCount(GLenum type, bool isRowMajorMatrix)
3638c6befc2f976d095d39d3033379838bf79e5637dJamie Madill{
3648c6befc2f976d095d39d3033379838bf79e5637dJamie Madill    ASSERT(IsMatrixType(type));
3658c6befc2f976d095d39d3033379838bf79e5637dJamie Madill    return isRowMajorMatrix ? VariableColumnCount(type) : VariableRowCount(type);
3668c6befc2f976d095d39d3033379838bf79e5637dJamie Madill}
3678c6befc2f976d095d39d3033379838bf79e5637dJamie Madill
3689bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.orgint AttributeRegisterCount(GLenum type)
3699bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org{
3709bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org    return IsMatrixType(type) ? VariableColumnCount(type) : 1;
3719bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org}
3729bd22fa90f6a16ae279330c802ebdb5e608d9348shannonwoods@chromium.org
3730b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.comint AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize)
3740b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com{
3750b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com    ASSERT(allocationSize <= bitsSize);
3760b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com
3770b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com    unsigned int mask = std::numeric_limits<unsigned int>::max() >> (std::numeric_limits<unsigned int>::digits - allocationSize);
3780b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com
3790b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com    for (unsigned int i = 0; i < bitsSize - allocationSize + 1; i++)
3800b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com    {
3810b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com        if ((*bits & mask) == 0)
3820b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com        {
3830b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com            *bits |= mask;
3840b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com            return i;
3850b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com        }
3860b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com
3870b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com        mask <<= 1;
3880b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com    }
3890b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com
3900b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com    return -1;
3910b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com}
3920b6b834a6d018e581737619da65cf0cfe26a699ddaniel@transgaming.com
39319ffc24b0e886710aa6052c01ea93fc923f059c4daniel@transgaming.combool IsCubemapTextureTarget(GLenum target)
39419ffc24b0e886710aa6052c01ea93fc923f059c4daniel@transgaming.com{
39519ffc24b0e886710aa6052c01ea93fc923f059c4daniel@transgaming.com    return (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
39619ffc24b0e886710aa6052c01ea93fc923f059c4daniel@transgaming.com}
39719ffc24b0e886710aa6052c01ea93fc923f059c4daniel@transgaming.com
3980fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Langbool IsInternalTextureTarget(GLenum target, GLuint clientVersion)
39919ffc24b0e886710aa6052c01ea93fc923f059c4daniel@transgaming.com{
4000fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Lang    if (clientVersion == 2)
4010fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Lang    {
4020fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Lang        return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target);
4030fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Lang    }
4040fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Lang    else if (clientVersion == 3)
4050fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Lang    {
4060fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Lang        return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target) ||
4070fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Lang               target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY;
4080fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Lang    }
4090fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Lang    else
4100fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Lang    {
4110fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Lang        UNREACHABLE();
4120fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Lang        return false;
4130fe1949dc05aba67e0815a3532e5993d7ea25ef8Geoff Lang    }
41419ffc24b0e886710aa6052c01ea93fc923f059c4daniel@transgaming.com}
41519ffc24b0e886710aa6052c01ea93fc923f059c4daniel@transgaming.com
41697c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.combool IsTriangleMode(GLenum drawMode)
41797c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com{
41897c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com    switch (drawMode)
41997c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com    {
42097c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com      case GL_TRIANGLES:
42197c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com      case GL_TRIANGLE_FAN:
42297c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com      case GL_TRIANGLE_STRIP:
42397c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com        return true;
42497c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com      case GL_POINTS:
42597c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com      case GL_LINES:
42697c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com      case GL_LINE_LOOP:
42797c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com      case GL_LINE_STRIP:
42897c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com        return false;
42997c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com      default: UNREACHABLE();
43097c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com    }
43197c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com
43297c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com    return false;
43397c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com}
43497c852b2e2fc61b2712be3c00cd4ba4b14dadeb6daniel@transgaming.com
4351b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com}
4361b3a8155c2181971bbd6671331826d420a707220daniel@transgaming.com
4370f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.orgstd::string getTempPath()
4380f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org{
43983217796ed57efe8954fc3b53d743aae1a6cfe6bGeoff Lang#if defined (_WIN32)
440d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    char path[MAX_PATH];
441d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    DWORD pathLen = GetTempPathA(sizeof(path) / sizeof(path[0]), path);
442d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    if (pathLen == 0)
443d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    {
444d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com        UNREACHABLE();
445d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com        return std::string();
446d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    }
447d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com
448d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    UINT unique = GetTempFileNameA(path, "sh", 0, path);
449d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    if (unique == 0)
450d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    {
451d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com        UNREACHABLE();
452d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com        return std::string();
453d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    }
454a2ecfcccf1d1a85e6054a7314ce1f9de0648ac7fshannonwoods@chromium.org
455d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    return path;
45683217796ed57efe8954fc3b53d743aae1a6cfe6bGeoff Lang#else
45783217796ed57efe8954fc3b53d743aae1a6cfe6bGeoff Lang    UNIMPLEMENTED();
45883217796ed57efe8954fc3b53d743aae1a6cfe6bGeoff Lang    return "";
45983217796ed57efe8954fc3b53d743aae1a6cfe6bGeoff Lang#endif
4600f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org}
4610f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org
4620f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.orgvoid writeFile(const char* path, const void* content, size_t size)
463d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com{
464d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    FILE* file = fopen(path, "w");
465d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    if (!file)
466d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    {
467d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com        UNREACHABLE();
468d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com        return;
469d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    }
470d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com
471d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    fwrite(content, sizeof(char), size, file);
472d2fd4f2afe46822fed817c1ac850afe9daadf21cdaniel@transgaming.com    fclose(file);
4730f4cefe9462e53627f02f10b34d76f8665c72521apatrick@chromium.org}
474