X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frender%2Fprogramdata.h;h=6f20d4d8317da1d393e5da555c0d4a3989498f67;hb=ba1427f10d574ff8c4dafc4b8673452b19308ca2;hp=97f293430c1c718e06f594d84ddf0d2de1a84263;hpb=3f5e469de3454aee1d1923045fc713329a32cc18;p=libs%2Fgl.git diff --git a/source/render/programdata.h b/source/render/programdata.h index 97f29343..6f20d4d8 100644 --- a/source/render/programdata.h +++ b/source/render/programdata.h @@ -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 blocks; - Mask used; - Mask dirty; + int block_index; + union + { + UniformBlock *block; + struct + { + Mask used; + Mask dirty; + } masks; + }; - ProgramUniforms(); + ProgramBlock(Program::LayoutHash); }; - typedef std::map BlockMap; - typedef std::map ProgramMap; - // XXX All these mutables are a bit silly, but I'm out of better ideas const Program *tied_program; std::vector uniforms; - mutable BlockMap blocks; - mutable ProgramMap programs; + mutable std::vector blocks; + mutable std::vector 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::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