X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Frender%2Fprogramdata.h;h=e5c3e4f5259be76a3965f052e077a67bcaba1d34;hp=a05674dd21927304d3755aa5f0118870ef81729e;hb=f19366d32cc29287a2730cfba90893e407754081;hpb=fcde8390ad577fe434dcd4b29e0f410d29f867c9 diff --git a/source/render/programdata.h b/source/render/programdata.h index a05674dd..e5c3e4f5 100644 --- a/source/render/programdata.h +++ b/source/render/programdata.h @@ -1,14 +1,12 @@ #ifndef MSP_GL_PROGRAMDATA_H_ #define MSP_GL_PROGRAMDATA_H_ -#include #include #include #include "datatype.h" #include "matrix.h" -#include "program.h" +#include "reflectdata.h" #include "tag.h" -#include "uniform.h" #include "vector.h" namespace Msp { @@ -22,7 +20,8 @@ public: }; class Buffer; -class BufferBackedUniformBlock; +class PipelineState; +class Program; class UniformBlock; struct Color; @@ -102,38 +101,39 @@ private: struct TaggedUniform { Tag tag; - Uniform *value; + DataType type; + unsigned array_size; + unsigned data_offset; + unsigned data_size; TaggedUniform(); - - void replace_value(Uniform *); }; struct SharedBlock { - Program::LayoutHash block_hash; + ReflectData::LayoutHash block_hash; Mask used; Mask dirty; 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); + SharedBlock(ReflectData::LayoutHash); - const UInt8 *get_uniform_indices() const; + const std::uint8_t *get_uniform_indices() const; }; struct ProgramBlock { - Program::LayoutHash prog_hash; + ReflectData::LayoutHash prog_hash; int bind_point; int block_index; union @@ -146,16 +146,17 @@ private: } masks; }; - ProgramBlock(Program::LayoutHash); + ProgramBlock(ReflectData::LayoutHash); }; // XXX All these mutables are a bit silly, but I'm out of better ideas const Program *tied_program; std::vector uniforms; + std::vector uniform_data; unsigned generation; mutable std::vector blocks; mutable std::vector programs; - mutable BufferBackedUniformBlock *last_buffer_block; + mutable UniformBlock *last_buffer_block; mutable Buffer *buffer; mutable Mask dirty; std::string debug_name; @@ -168,16 +169,10 @@ public: ~ProgramData(); private: - void uniform(Tag, Uniform *); - template - void uniform(Tag, V); - template - void uniform_array(Tag, unsigned, V); + void uniform(Tag, DataType, unsigned, const void *); bool validate_tag(Tag) const; - void add_uniform(Tag, Uniform *); void mark_dirty(Mask); public: - void uniform(Tag, const Uniform &); void uniform(Tag, int); void uniform(Tag, float); void uniform(Tag, int, int); @@ -240,38 +235,36 @@ public: unsigned get_generation() const { return generation; } std::vector get_uniform_tags() const; - const Uniform &get_uniform(Tag) const; - const Uniform *find_uniform(Tag) const; + void copy_uniform(const ProgramData &, Tag); 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; + void update_block_uniform_indices(SharedBlock &, const ReflectData::UniformBlockInfo &) const; + void update_block(SharedBlock &, const ReflectData::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 void ProgramData::uniform(Tag tag, const LinAl::Vector &v) -{ uniform >(tag, &v.x); } +{ uniform(tag, TypeTraits>::type, 1, &v.x); } template void ProgramData::uniform(Tag tag, const LinAl::Matrix &v) -{ uniform >(tag, &v(0, 0)); } +{ uniform(tag, TypeTraits>::type, 1, &v(0, 0)); } template void ProgramData::uniform_array(Tag tag, unsigned n, const LinAl::Vector *v) -{ uniform_array >(tag, n, &v[0].x); } +{ uniform(tag, TypeTraits>::type, n, &v[0].x); } template void ProgramData::uniform_array(Tag tag, unsigned n, const LinAl::Matrix *v) -{ uniform_array >(tag, n, &v[0](0, 0)); } +{ uniform(tag, TypeTraits>::type, n, &v[0](0, 0)); } } // namespace GL } // namespace Msp