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