blob: 0412ce91b2a30b2bcbc40b1acc08f3bd1b1a766a [file] [log] [blame]
daniel@transgaming.com15186aa2012-12-20 21:08:23 +00001//
2// Copyright (c) 2010-2012 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7#include "libGLESv2/Uniform.h"
8
9#include "libGLESv2/utilities.h"
10
11namespace gl
12{
13
14Uniform::Uniform(GLenum type, const std::string &_name, unsigned int arraySize)
15 : type(type), _name(_name), name(undecorate(_name)), arraySize(arraySize)
16{
daniel@transgaming.come6d12e92012-12-20 21:12:47 +000017 int bytes = gl::UniformInternalSize(type) * elementCount();
daniel@transgaming.com15186aa2012-12-20 21:08:23 +000018 data = new unsigned char[bytes];
19 memset(data, 0, bytes);
20 dirty = true;
21}
22
23Uniform::~Uniform()
24{
25 delete[] data;
26}
27
daniel@transgaming.come6d12e92012-12-20 21:12:47 +000028bool Uniform::isArray() const
daniel@transgaming.com15186aa2012-12-20 21:08:23 +000029{
daniel@transgaming.come6d12e92012-12-20 21:12:47 +000030 if (name != _name) // D3D9_REPLACE
31 {
32 size_t dot = _name.find_last_of('.');
33 if (dot == std::string::npos) dot = -1;
daniel@transgaming.com15186aa2012-12-20 21:08:23 +000034
daniel@transgaming.come6d12e92012-12-20 21:12:47 +000035 return _name.compare(dot + 1, dot + 4, "ar_") == 0;
36 }
37 else
38 {
39 return arraySize > 0;
40 }
41}
42
43unsigned int Uniform::elementCount() const
44{
45 return arraySize > 0 ? arraySize : 1;
46}
47
48unsigned int Uniform::registerCount() const
49{
50 return VariableRowCount(type) * elementCount();
daniel@transgaming.com15186aa2012-12-20 21:08:23 +000051}
52
53std::string Uniform::undecorate(const std::string &_name)
54{
55 std::string name = _name;
56
57 // Remove any structure field decoration
58 size_t pos = 0;
59 while ((pos = name.find("._", pos)) != std::string::npos)
60 {
61 name.replace(pos, 2, ".");
62 }
63
64 // Remove the leading decoration
65 if (name[0] == '_')
66 {
67 return name.substr(1);
68 }
69 else if (name.compare(0, 3, "ar_") == 0)
70 {
71 return name.substr(3);
72 }
73
74 return name;
75}
76
77}