14f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// 2cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang// Copyright (c) 2002-2014 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// angleutils.h: Common ANGLE utilities. 84f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 9bbf56f755e0dd78c7650c52531ce412fcaaafa2bdaniel@transgaming.com#ifndef COMMON_ANGLEUTILS_H_ 10bbf56f755e0dd78c7650c52531ce412fcaaafa2bdaniel@transgaming.com#define COMMON_ANGLEUTILS_H_ 11bbf56f755e0dd78c7650c52531ce412fcaaafa2bdaniel@transgaming.com 1244fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang#include "common/platform.h" 1344fa7594bc518b1b004b1deb91d1c2f125df9f68Geoff Lang 14f386bf76d5751e0bfa2073ca57210c73d8b85809Jamie Madill#include <stddef.h> 1593455ebee5caa2f1648f6aa7f80fc230f7e14bfaJamie Madill#include <limits.h> 16cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang#include <string> 17cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang#include <set> 1853cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill#include <sstream> 19da5777cf9f131dbafcf91c88026624545db2cc87Geoff Lang#include <cstdarg> 20f386bf76d5751e0bfa2073ca57210c73d8b85809Jamie Madill 214f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// A macro to disallow the copy constructor and operator= functions 224f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com// This must be used in the private: declarations for a class 234f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ 244f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com TypeName(const TypeName&); \ 254f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com void operator=(const TypeName&) 264f39fd99568ce175f04b5ed72062bfed0fa41803daniel@transgaming.com 2733ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madilltemplate <typename T, size_t N> 2833ea2f977647e5e3a71cd0d6af6c9eef82afe9e3Jamie Madillinline size_t ArraySize(T(&)[N]) 296d79257d0a1dd174844fda8a7f5aee36d2d119f4shannon.woods@transgaming.com{ 306d79257d0a1dd174844fda8a7f5aee36d2d119f4shannon.woods@transgaming.com return N; 316d79257d0a1dd174844fda8a7f5aee36d2d119f4shannon.woods@transgaming.com} 326d79257d0a1dd174844fda8a7f5aee36d2d119f4shannon.woods@transgaming.com 33962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.comtemplate <typename T, unsigned int N> 34962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.comvoid SafeRelease(T (&resourceBlock)[N]) 35962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com{ 36962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com for (unsigned int i = 0; i < N; i++) 37962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com { 38962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com SafeRelease(resourceBlock[i]); 39962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com } 40962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com} 41962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com 42962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.comtemplate <typename T> 43962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.comvoid SafeRelease(T& resource) 44962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com{ 45962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com if (resource) 46962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com { 47962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com resource->Release(); 48962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com resource = NULL; 49962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com } 50962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com} 51962247710c891af9f847c3c26670c3ab8928219cshannon.woods%transgaming.com@gtempaccount.com 52ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Langtemplate <typename T> 53ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Langvoid SafeDelete(T*& resource) 54ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang{ 55ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang delete resource; 56ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang resource = NULL; 57ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang} 58ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang 59ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Langtemplate <typename T> 6004fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Langvoid SafeDeleteContainer(T& resource) 6104fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang{ 623dc8020ac2f878997d71558d87c1efa3278aaa13Shannon Woods for (typename T::iterator i = resource.begin(); i != resource.end(); i++) 6304fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang { 6404fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang SafeDelete(*i); 6504fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang } 6604fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang resource.clear(); 6704fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang} 6804fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Lang 6904fb89ad059cba1fbd14507fe58c9a700fe0de08Geoff Langtemplate <typename T> 70ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Langvoid SafeDeleteArray(T*& resource) 71ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang{ 72ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang delete[] resource; 73ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang resource = NULL; 74ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang} 75ea2286352f5eba47dfaa3e9ab418bbacfd1ba8a1Geoff Lang 76d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill// Provide a less-than function for comparing structs 77d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill// Note: struct memory must be initialized to zero, because of packing gaps 78d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madilltemplate <typename T> 79d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madillinline bool StructLessThan(const T &a, const T &b) 80d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill{ 81d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill return (memcmp(&a, &b, sizeof(T)) < 0); 82d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill} 83d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill 84d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill// Provide a less-than function for comparing structs 85d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill// Note: struct memory must be initialized to zero, because of packing gaps 86d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madilltemplate <typename T> 87d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madillinline bool StructEquals(const T &a, const T &b) 88d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill{ 89d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill return (memcmp(&a, &b, sizeof(T)) == 0); 90d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill} 91d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill 92d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madilltemplate <typename T> 93d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madillinline void StructZero(T *obj) 94d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill{ 95d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill memset(obj, 0, sizeof(T)); 96d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill} 97d3f0f1ec8179603757b96a851f3b7d9d9152dfd8Jamie Madill 98cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Langinline const char* MakeStaticString(const std::string &str) 99cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang{ 100cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang static std::set<std::string> strings; 101cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang std::set<std::string>::iterator it = strings.find(str); 102cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang if (it != strings.end()) 103cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang { 104cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang return it->c_str(); 105cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang } 106cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang 107cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang return strings.insert(str).first->c_str(); 108cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang} 109cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang 11053cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madillinline std::string ArrayString(unsigned int i) 11153cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill{ 11253cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill // We assume UINT_MAX and GL_INVALID_INDEX are equal 11353cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill // See DynamicHLSL.cpp 11453cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill if (i == UINT_MAX) 11553cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill { 11653cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill return ""; 11753cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill } 11853cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill 11953cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill std::stringstream strstr; 12053cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill 12153cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill strstr << "["; 12253cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill strstr << i; 12353cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill strstr << "]"; 12453cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill 12553cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill return strstr.str(); 12653cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill} 12753cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill 12853cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madillinline std::string Str(int i) 12953cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill{ 13053cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill std::stringstream strstr; 13153cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill strstr << i; 13253cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill return strstr.str(); 13353cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill} 13453cb14dce7b1f43e3f6afc852634bca1c52cb841Jamie Madill 1358e7d7a30b496a726c72329e74d054f5b859b0d9eShannon Woodsstd::string FormatString(const char *fmt, va_list vararg); 1368e7d7a30b496a726c72329e74d054f5b859b0d9eShannon Woodsstd::string FormatString(const char *fmt, ...); 137da5777cf9f131dbafcf91c88026624545db2cc87Geoff Lang 13879fb1019a16cc0b0af7f75a9b823b66e63fd99edalokp@chromium.org#if defined(_MSC_VER) 13979fb1019a16cc0b0af7f75a9b823b66e63fd99edalokp@chromium.org#define snprintf _snprintf 14079fb1019a16cc0b0af7f75a9b823b66e63fd99edalokp@chromium.org#endif 14179fb1019a16cc0b0af7f75a9b823b66e63fd99edalokp@chromium.org 14285e4419f971302c66bf57c074573fdf7cca209c5apatrick@chromium.org#define VENDOR_ID_AMD 0x1002 14385e4419f971302c66bf57c074573fdf7cca209c5apatrick@chromium.org#define VENDOR_ID_INTEL 0x8086 14485e4419f971302c66bf57c074573fdf7cca209c5apatrick@chromium.org#define VENDOR_ID_NVIDIA 0x10DE 14585e4419f971302c66bf57c074573fdf7cca209c5apatrick@chromium.org 146106e1f7b67f042d008dd6616f73ff03492bf1d5adaniel@transgaming.com#define GL_BGRA4_ANGLEX 0x6ABC 147106e1f7b67f042d008dd6616f73ff03492bf1d5adaniel@transgaming.com#define GL_BGR5_A1_ANGLEX 0x6ABD 1480fda98687c2103ada393a6c39640c8efddc7994aJamie Madill#define GL_INT_64_ANGLEX 0x6ABE 14928167c62a29c4514b52304ddc748eaa2616053c9Jamie Madill#define GL_STRUCT_ANGLEX 0x6ABF 150106e1f7b67f042d008dd6616f73ff03492bf1d5adaniel@transgaming.com 151bbf56f755e0dd78c7650c52531ce412fcaaafa2bdaniel@transgaming.com#endif // COMMON_ANGLEUTILS_H_ 152