Implemented support for DX11 uniform arrays.
TRAC #22239
Signed-off-by: Daniel Koch
Signed-off-by: Shannon Woods
Author: Nicolas Capens
git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1629 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Uniform.cpp b/src/libGLESv2/Uniform.cpp
index b7f2e62..0412ce9 100644
--- a/src/libGLESv2/Uniform.cpp
+++ b/src/libGLESv2/Uniform.cpp
@@ -14,7 +14,7 @@
Uniform::Uniform(GLenum type, const std::string &_name, unsigned int arraySize)
: type(type), _name(_name), name(undecorate(_name)), arraySize(arraySize)
{
- int bytes = gl::UniformInternalSize(type) * arraySize;
+ int bytes = gl::UniformInternalSize(type) * elementCount();
data = new unsigned char[bytes];
memset(data, 0, bytes);
dirty = true;
@@ -25,12 +25,29 @@
delete[] data;
}
-bool Uniform::isArray()
+bool Uniform::isArray() const
{
- size_t dot = _name.find_last_of('.');
- if (dot == std::string::npos) dot = -1;
+ if (name != _name) // D3D9_REPLACE
+ {
+ size_t dot = _name.find_last_of('.');
+ if (dot == std::string::npos) dot = -1;
- return _name.compare(dot + 1, dot + 4, "ar_") == 0;
+ return _name.compare(dot + 1, dot + 4, "ar_") == 0;
+ }
+ else
+ {
+ return arraySize > 0;
+ }
+}
+
+unsigned int Uniform::elementCount() const
+{
+ return arraySize > 0 ? arraySize : 1;
+}
+
+unsigned int Uniform::registerCount() const
+{
+ return VariableRowCount(type) * elementCount();
}
std::string Uniform::undecorate(const std::string &_name)