X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Frender%2Fprogramdata.h;h=1bcd3aab42c6ea2158f5beb0fbdcaab8f200720e;hp=f600f02585c3d13fcd5cdd57ba0004da30c2e04b;hb=3a1b9cbe2441ae670a97541dc8ccb0a2860c8302;hpb=4124807fcacedc8317bd109f056d48e077d0c12f diff --git a/source/render/programdata.h b/source/render/programdata.h index f600f025..1bcd3aab 100644 --- a/source/render/programdata.h +++ b/source/render/programdata.h @@ -23,6 +23,7 @@ public: class Buffer; class BufferBackedUniformBlock; +class PipelineState; class UniformBlock; struct Color; @@ -117,18 +118,18 @@ private: UniformBlock *block; union { - UInt8 type_flag; - UInt8 values[16]; + std::uint8_t type_flag; + std::uint8_t values[16]; struct { - UInt8 type_flag; - UInt8 *values; + std::uint8_t type_flag; + std::uint8_t *values; } dynamic; } indices; SharedBlock(Program::LayoutHash); - const UInt8 *get_uniform_indices() const; + const std::uint8_t *get_uniform_indices() const; }; struct ProgramBlock @@ -152,11 +153,13 @@ private: // XXX All these mutables are a bit silly, but I'm out of better ideas const Program *tied_program; std::vector uniforms; + unsigned generation; mutable std::vector blocks; mutable std::vector programs; mutable BufferBackedUniformBlock *last_buffer_block; mutable Buffer *buffer; mutable Mask dirty; + std::string debug_name; public: ProgramData(const Program * = 0); @@ -173,6 +176,7 @@ private: void uniform_array(Tag, unsigned, V); bool validate_tag(Tag) const; void add_uniform(Tag, Uniform *); + void mark_dirty(Mask); public: void uniform(Tag, const Uniform &); void uniform(Tag, int); @@ -234,6 +238,8 @@ public: void remove_uniform(Tag); + unsigned get_generation() const { return generation; } + std::vector get_uniform_tags() const; const Uniform &get_uniform(Tag) const; const Uniform *find_uniform(Tag) const; @@ -244,10 +250,11 @@ private: void update_block_uniform_indices(SharedBlock &, const Program::UniformBlockInfo &) const; void update_block(SharedBlock &, const Program::UniformBlockInfo &) const; + std::vector::const_iterator prepare_program(const Program &) const; public: - /** Applies uniform blocks for the currently bound program, creating them - if needed. */ - void apply() const; + void apply(const Program &, PipelineState &) const; + + void set_debug_name(const std::string &); }; template