1 #include "precompiled.h"
2 //
3 // Copyright (c) 2010-2013 The ANGLE Project Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file.
6 //
7
8 #include "libGLESv2/Uniform.h"
9
10 #include "common/utilities.h"
11
12 namespace gl
13 {
14
LinkedUniform(GLenum type,GLenum precision,const std::string & name,unsigned int arraySize,const int blockIndex,const BlockMemberInfo & blockInfo)15 LinkedUniform::LinkedUniform(GLenum type, GLenum precision, const std::string &name, unsigned int arraySize,
16 const int blockIndex, const BlockMemberInfo &blockInfo)
17 : type(type),
18 precision(precision),
19 name(name),
20 arraySize(arraySize),
21 blockIndex(blockIndex),
22 blockInfo(blockInfo),
23 data(NULL),
24 dirty(true),
25 psRegisterIndex(GL_INVALID_INDEX),
26 vsRegisterIndex(GL_INVALID_INDEX),
27 registerCount(0),
28 registerElement(0)
29 {
30 // We use data storage for default block uniforms to cache values that are sent to D3D during rendering
31 // Uniform blocks/buffers are treated separately by the Renderer (ES3 path only)
32 if (isInDefaultBlock())
33 {
34 size_t bytes = dataSize();
35 data = new unsigned char[bytes];
36 memset(data, 0, bytes);
37 registerCount = VariableRowCount(type) * elementCount();
38 }
39 }
40
~LinkedUniform()41 LinkedUniform::~LinkedUniform()
42 {
43 delete[] data;
44 }
45
isArray() const46 bool LinkedUniform::isArray() const
47 {
48 return arraySize > 0;
49 }
50
elementCount() const51 unsigned int LinkedUniform::elementCount() const
52 {
53 return arraySize > 0 ? arraySize : 1;
54 }
55
isReferencedByVertexShader() const56 bool LinkedUniform::isReferencedByVertexShader() const
57 {
58 return vsRegisterIndex != GL_INVALID_INDEX;
59 }
60
isReferencedByFragmentShader() const61 bool LinkedUniform::isReferencedByFragmentShader() const
62 {
63 return psRegisterIndex != GL_INVALID_INDEX;
64 }
65
isInDefaultBlock() const66 bool LinkedUniform::isInDefaultBlock() const
67 {
68 return blockIndex == -1;
69 }
70
dataSize() const71 size_t LinkedUniform::dataSize() const
72 {
73 ASSERT(type != GL_STRUCT_ANGLEX);
74 return UniformInternalSize(type) * elementCount();
75 }
76
isSampler() const77 bool LinkedUniform::isSampler() const
78 {
79 return IsSampler(type);
80 }
81
UniformBlock(const std::string & name,unsigned int elementIndex,unsigned int dataSize)82 UniformBlock::UniformBlock(const std::string &name, unsigned int elementIndex, unsigned int dataSize)
83 : name(name),
84 elementIndex(elementIndex),
85 dataSize(dataSize),
86 psRegisterIndex(GL_INVALID_INDEX),
87 vsRegisterIndex(GL_INVALID_INDEX)
88 {
89 }
90
isArrayElement() const91 bool UniformBlock::isArrayElement() const
92 {
93 return elementIndex != GL_INVALID_INDEX;
94 }
95
isReferencedByVertexShader() const96 bool UniformBlock::isReferencedByVertexShader() const
97 {
98 return vsRegisterIndex != GL_INVALID_INDEX;
99 }
100
isReferencedByFragmentShader() const101 bool UniformBlock::isReferencedByFragmentShader() const
102 {
103 return psRegisterIndex != GL_INVALID_INDEX;
104 }
105
106 }
107