]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/programdata.h
Refactor ProgramData to store blocks in vectors
[libs/gl.git] / source / render / programdata.h
index 97f293430c1c718e06f594d84ddf0d2de1a84263..6f20d4d8317da1d393e5da555c0d4a3989498f67 100644 (file)
@@ -110,6 +110,7 @@ private:
 
        struct SharedBlock
        {
+               Program::LayoutHash block_hash;
                Mask used;
                Mask dirty;
                UniformBlock *block;
@@ -124,38 +125,34 @@ private:
                        } dynamic;
                } indices;
 
-               SharedBlock(UniformBlock *);
+               SharedBlock(Program::LayoutHash);
 
                const UInt8 *get_uniform_indices() const;
        };
 
        struct ProgramBlock
        {
+               Program::LayoutHash prog_hash;
                int bind_point;
-               UniformBlock *block;
-               SharedBlock *shared;
-
-               ProgramBlock();
-               ProgramBlock(int, SharedBlock *);
-       };
-
-       struct ProgramUniforms
-       {
-               std::vector<ProgramBlock> blocks;
-               Mask used;
-               Mask dirty;
+               int block_index;
+               union
+               {
+                       UniformBlock *block;
+                       struct
+                       {
+                               Mask used;
+                               Mask dirty;
+                       } masks;
+               };
 
-               ProgramUniforms();
+               ProgramBlock(Program::LayoutHash);
        };
 
-       typedef std::map<Program::LayoutHash, SharedBlock> BlockMap;
-       typedef std::map<Program::LayoutHash, ProgramUniforms> ProgramMap;
-
        // XXX All these mutables are a bit silly, but I'm out of better ideas
        const Program *tied_program;
        std::vector<TaggedUniform> uniforms;
-       mutable BlockMap blocks;
-       mutable ProgramMap programs;
+       mutable std::vector<SharedBlock> blocks;
+       mutable std::vector<ProgramBlock> programs;
        mutable UniformBlock *last_block;
        mutable Buffer *buffer;
        mutable Mask dirty;
@@ -237,9 +234,9 @@ public:
 
 private:
        int find_uniform_index(Tag) const;
+       std::vector<ProgramBlock>::iterator get_program(const Program &) const;
        void update_block_uniform_indices(SharedBlock &, const Program::UniformBlockInfo &) const;
        void update_block(SharedBlock &, const Program::UniformBlockInfo &) const;
-       SharedBlock *get_shared_block(const Program::UniformBlockInfo &) const;
 
 public:
        /** Applies uniform blocks for the currently bound program, creating them