1//
2// Copyright (c) 2010-2013 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#ifndef LIBGLESV2_UNIFORM_H_
8#define LIBGLESV2_UNIFORM_H_
9
10#include "common/debug.h"
11#include "common/blocklayout.h"
12
13#include "libGLESv2/angletypes.h"
14
15#include "angle_gl.h"
16
17#include <string>
18#include <vector>
19
20namespace gl
21{
22
23// Helper struct representing a single shader uniform
24struct LinkedUniform
25{
26    LinkedUniform(GLenum type, GLenum precision, const std::string &name, unsigned int arraySize, const int blockIndex, const sh::BlockMemberInfo &blockInfo);
27
28    ~LinkedUniform();
29
30    bool isArray() const;
31    unsigned int elementCount() const;
32    bool isReferencedByVertexShader() const;
33    bool isReferencedByFragmentShader() const;
34    bool isInDefaultBlock() const;
35    size_t dataSize() const;
36    bool isSampler() const;
37
38    const GLenum type;
39    const GLenum precision;
40    const std::string name;
41    const unsigned int arraySize;
42    const int blockIndex;
43    const sh::BlockMemberInfo blockInfo;
44
45    unsigned char *data;
46    bool dirty;
47
48    unsigned int psRegisterIndex;
49    unsigned int vsRegisterIndex;
50    unsigned int registerCount;
51
52    // Register "elements" are used for uniform structs in ES3, to appropriately identify single uniforms
53    // inside aggregate types, which are packed according C-like structure rules.
54    unsigned int registerElement;
55};
56
57// Helper struct representing a single shader uniform block
58struct UniformBlock
59{
60    // use GL_INVALID_INDEX for non-array elements
61    UniformBlock(const std::string &name, unsigned int elementIndex, unsigned int dataSize);
62
63    bool isArrayElement() const;
64    bool isReferencedByVertexShader() const;
65    bool isReferencedByFragmentShader() const;
66
67    const std::string name;
68    const unsigned int elementIndex;
69    const unsigned int dataSize;
70
71    std::vector<unsigned int> memberUniformIndexes;
72
73    unsigned int psRegisterIndex;
74    unsigned int vsRegisterIndex;
75};
76
77}
78
79#endif   // LIBGLESV2_UNIFORM_H_
80