X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Frender%2Fprogramdata.h;h=2eef750cf78f7d4ff821ee9c1354cb395d6b6933;hp=e96a73acc651ba8ec9a1ab2b3af1cf77f337c4bc;hb=38712d8ecc57d043a2419ffbaeeb57f7a6586f14;hpb=7aaec9a70b8d7733429bec043f8e33e02956f266 diff --git a/source/render/programdata.h b/source/render/programdata.h index e96a73ac..2eef750c 100644 --- a/source/render/programdata.h +++ b/source/render/programdata.h @@ -1,12 +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 "vector.h" namespace Msp { @@ -20,7 +20,8 @@ public: }; class Buffer; -class Uniform; +class PipelineState; +class Program; class UniformBlock; struct Color; @@ -97,68 +98,66 @@ private: ALL_ONES = static_cast(-1) }; - struct NamedUniform + struct TaggedUniform { - std::string name; - Uniform *value; - - NamedUniform(); - - bool compare_name(const std::string &, unsigned) const; - void replace_value(Uniform *); + Tag tag; + DataType type = VOID; + unsigned array_size = 0; + unsigned data_offset = 0; + unsigned data_size = 0; }; struct SharedBlock { + 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(UniformBlock *); + SharedBlock(ReflectData::LayoutHash); - const UInt8 *get_uniform_indices() const; + const std::uint8_t *get_uniform_indices() const; }; struct ProgramBlock { + ReflectData::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(ReflectData::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 UniformBlock *last_block; + std::vector uniforms; + std::vector uniform_data; + unsigned generation; + mutable std::vector blocks; + mutable std::vector programs; + mutable UniformBlock *last_buffer_block; mutable Buffer *buffer; - mutable unsigned dirty; + mutable Mask dirty; + std::string debug_name; public: ProgramData(const Program * = 0); @@ -168,86 +167,103 @@ public: ~ProgramData(); private: - void uniform(const std::string &, Uniform *); - template - void uniform(const std::string &, V); - template - void uniform_array(const std::string &, unsigned, V); - bool validate_name(const std::string &) const; - void add_uniform(const std::string &, Uniform *); + void uniform(Tag, DataType, unsigned, const void *); + bool validate_tag(Tag) const; + void mark_dirty(Mask); public: - void uniform(const std::string &, const Uniform &); - void uniform(const std::string &, int); - void uniform(const std::string &, float); - void uniform(const std::string &, int, int); - void uniform(const std::string &, float, float); - void uniform2(const std::string &, const int *); - void uniform2(const std::string &, const float *); - void uniform(const std::string &, int, int, int); - void uniform(const std::string &, float, float, float); - void uniform(const std::string &, const Vector3 &); - void uniform3(const std::string &, const int *); - void uniform3(const std::string &, const float *); - void uniform(const std::string &, int, int, int, int); - void uniform(const std::string &, float, float, float, float); - void uniform(const std::string &, const Vector4 &); - void uniform(const std::string &, const Color &); - void uniform4(const std::string &, const int *); - void uniform4(const std::string &, const float *); - void uniform(const std::string &, const LinAl::Matrix &); - void uniform_matrix2(const std::string &, const float *); - void uniform(const std::string &, const LinAl::Matrix &); - void uniform_matrix3x2(const std::string &, const float *); - void uniform(const std::string &, const LinAl::Matrix &); - void uniform_matrix4x2(const std::string &, const float *); - void uniform(const std::string &, const LinAl::Matrix &); - void uniform_matrix2x3(const std::string &, const float *); - void uniform(const std::string &, const LinAl::Matrix &); - void uniform_matrix3(const std::string &, const float *); - void uniform(const std::string &, const LinAl::Matrix &); - void uniform_matrix4x3(const std::string &, const float *); - void uniform(const std::string &, const LinAl::Matrix &); - void uniform_matrix2x4(const std::string &, const float *); - void uniform(const std::string &, const LinAl::Matrix &); - void uniform_matrix3x4(const std::string &, const float *); - void uniform(const std::string &, const Matrix &); - void uniform_matrix4(const std::string &, const float *); - void uniform1_array(const std::string &, unsigned, const int *); - void uniform1_array(const std::string &, unsigned, const float *); - void uniform2_array(const std::string &, unsigned, const int *); - void uniform2_array(const std::string &, unsigned, const float *); - void uniform3_array(const std::string &, unsigned, const int *); - void uniform3_array(const std::string &, unsigned, const float *); - void uniform4_array(const std::string &, unsigned, const int *); - void uniform4_array(const std::string &, unsigned, const float *); - void uniform_matrix2_array(const std::string &, unsigned, const float *); - void uniform_matrix3x2_array(const std::string &, unsigned, const float *); - void uniform_matrix4x2_array(const std::string &, unsigned, const float *); - void uniform_matrix2x3_array(const std::string &, unsigned, const float *); - void uniform_matrix3_array(const std::string &, unsigned, const float *); - void uniform_matrix4x3_array(const std::string &, unsigned, const float *); - void uniform_matrix2x4_array(const std::string &, unsigned, const float *); - void uniform_matrix3x4_array(const std::string &, unsigned, const float *); - void uniform_matrix4_array(const std::string &, unsigned, const float *); - void remove_uniform(const std::string &); - - std::vector get_uniform_names() const; - const Uniform &get_uniform(const std::string &) const; - const Uniform *find_uniform(const std::string &) const; + void uniform(Tag, int); + void uniform(Tag, float); + void uniform(Tag, int, int); + void uniform(Tag, float, float); + void uniform2(Tag, const int *); + void uniform2(Tag, const float *); + void uniform(Tag, int, int, int); + void uniform(Tag, float, float, float); + void uniform3(Tag, const int *); + void uniform3(Tag, const float *); + void uniform(Tag, int, int, int, int); + void uniform(Tag, float, float, float, float); + void uniform(Tag, const Color &); + void uniform4(Tag, const int *); + void uniform4(Tag, const float *); + void uniform_matrix2(Tag, const float *); + void uniform_matrix3x2(Tag, const float *); + void uniform_matrix4x2(Tag, const float *); + void uniform_matrix2x3(Tag, const float *); + void uniform_matrix3(Tag, const float *); + void uniform_matrix4x3(Tag, const float *); + void uniform_matrix2x4(Tag, const float *); + void uniform_matrix3x4(Tag, const float *); + void uniform(Tag, const Matrix &); + void uniform_matrix4(Tag, const float *); + void uniform_array(Tag, unsigned, const int *); + void uniform_array(Tag, unsigned, const float *); + void uniform1_array(Tag, unsigned, const int *); + void uniform1_array(Tag, unsigned, const float *); + void uniform2_array(Tag, unsigned, const int *); + void uniform2_array(Tag, unsigned, const float *); + void uniform3_array(Tag, unsigned, const int *); + void uniform3_array(Tag, unsigned, const float *); + void uniform4_array(Tag, unsigned, const int *); + void uniform4_array(Tag, unsigned, const float *); + void uniform_matrix2_array(Tag, unsigned, const float *); + void uniform_matrix3x2_array(Tag, unsigned, const float *); + void uniform_matrix4x2_array(Tag, unsigned, const float *); + void uniform_matrix2x3_array(Tag, unsigned, const float *); + void uniform_matrix3_array(Tag, unsigned, const float *); + void uniform_matrix4x3_array(Tag, unsigned, const float *); + void uniform_matrix2x4_array(Tag, unsigned, const float *); + void uniform_matrix3x4_array(Tag, unsigned, const float *); + void uniform_matrix4_array(Tag, unsigned, const float *); + + template + void uniform(Tag, const LinAl::Vector &); + + template + void uniform(Tag, const LinAl::Matrix &); + + template + void uniform_array(Tag, unsigned, const LinAl::Vector *); + + template + void uniform_array(Tag, unsigned, const LinAl::Matrix *); + + void remove_uniform(Tag); + + unsigned get_generation() const { return generation; } + + std::vector get_uniform_tags() const; + void copy_uniform(const ProgramData &, Tag); private: - static bool uniform_name_compare(const NamedUniform &, const std::string &); - int find_uniform_index(const std::string &) 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; + int find_uniform_index(Tag) const; + std::vector::iterator get_program(const Program &) 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, TypeTraits>::type, 1, &v.x); } + +template +void ProgramData::uniform(Tag tag, const LinAl::Matrix &v) +{ uniform(tag, TypeTraits>::type, 1, &v(0, 0)); } + +template +void ProgramData::uniform_array(Tag tag, unsigned n, const LinAl::Vector *v) +{ uniform(tag, TypeTraits>::type, n, &v[0].x); } + +template +void ProgramData::uniform_array(Tag tag, unsigned n, const LinAl::Matrix *v) +{ uniform(tag, TypeTraits>::type, n, &v[0](0, 0)); } + } // namespace GL } // namespace Msp