blob: 175aa0833b7e135a778da271a93428f780cb1b66 [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
shannonwoods@chromium.org7e0904d2013-05-30 00:06:45 +00002//
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
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000010#include "common/utilities.h"
shannonwoods@chromium.org7e0904d2013-05-30 00:06:45 +000011
12namespace gl
13{
14
shannonwoods@chromium.orgd7784172013-05-30 00:07:03 +000015Uniform::Uniform(GLenum type, GLenum precision, const std::string &name, unsigned int arraySize, const int blockIndex, const sh::BlockMemberInfo &blockInfo)
16 : type(type),
17 precision(precision),
18 name(name),
19 arraySize(arraySize),
20 blockIndex(blockIndex),
21 blockInfo(blockInfo),
22 data(NULL),
23 dirty(true),
24 psRegisterIndex(GL_INVALID_INDEX),
25 vsRegisterIndex(GL_INVALID_INDEX),
Jamie Madill5b085dc2013-08-30 13:21:11 -040026 registerCount(0),
27 registerElement(0)
shannonwoods@chromium.org7e0904d2013-05-30 00:06:45 +000028{
shannonwoods@chromium.orgd7784172013-05-30 00:07:03 +000029 // We use data storage for default block uniforms to cache values that are sent to D3D during rendering
30 // Uniform blocks/buffers are treated separately by the Renderer (ES3 path only)
31 if (isInDefaultBlock())
32 {
Jamie Madill5b085dc2013-08-30 13:21:11 -040033 size_t bytes = dataSize();
shannonwoods@chromium.orgd7784172013-05-30 00:07:03 +000034 data = new unsigned char[bytes];
35 memset(data, 0, bytes);
36 registerCount = VariableRowCount(type) * elementCount();
37 }
shannonwoods@chromium.org7e0904d2013-05-30 00:06:45 +000038}
39
40Uniform::~Uniform()
41{
42 delete[] data;
43}
44
45bool Uniform::isArray() const
46{
47 return arraySize > 0;
48}
49
50unsigned int Uniform::elementCount() const
51{
52 return arraySize > 0 ? arraySize : 1;
53}
54
shannonwoods@chromium.org38676dc2013-05-30 00:06:52 +000055bool Uniform::isReferencedByVertexShader() const
56{
57 return vsRegisterIndex != GL_INVALID_INDEX;
58}
59
60bool Uniform::isReferencedByFragmentShader() const
61{
62 return psRegisterIndex != GL_INVALID_INDEX;
63}
64
shannonwoods@chromium.orgd7784172013-05-30 00:07:03 +000065bool Uniform::isInDefaultBlock() const
66{
67 return blockIndex == -1;
68}
69
Jamie Madill5b085dc2013-08-30 13:21:11 -040070size_t Uniform::dataSize() const
71{
Jamie Madillfcef3362013-11-13 19:37:19 -050072 ASSERT(type != GL_STRUCT_ANGLEX);
Jamie Madill5b085dc2013-08-30 13:21:11 -040073 return UniformInternalSize(type) * elementCount();
74}
75
Jamie Madill8ff21ae2014-02-04 16:04:05 -050076bool Uniform::isSampler() const
77{
78 return gl::IsSampler(type);
79}
80
shannonwoods@chromium.orgd7784172013-05-30 00:07:03 +000081UniformBlock::UniformBlock(const std::string &name, unsigned int elementIndex, unsigned int dataSize)
82 : name(name),
83 elementIndex(elementIndex),
84 dataSize(dataSize),
85 psRegisterIndex(GL_INVALID_INDEX),
86 vsRegisterIndex(GL_INVALID_INDEX)
87{
88}
89
90bool UniformBlock::isArrayElement() const
91{
92 return elementIndex != GL_INVALID_INDEX;
93}
94
95bool UniformBlock::isReferencedByVertexShader() const
96{
97 return vsRegisterIndex != GL_INVALID_INDEX;
98}
99
100bool UniformBlock::isReferencedByFragmentShader() const
101{
102 return psRegisterIndex != GL_INVALID_INDEX;
103}
104
shannonwoods@chromium.org7e0904d2013-05-30 00:06:45 +0000105}