]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/programdata.cpp
Split reflection data from Program to a separate struct
[libs/gl.git] / source / render / programdata.cpp
index e8e30e6344c8d4ca6c982027bab6f73195376bfd..65934d382ae29fad792c0b67031a406658b7b3fb 100644 (file)
@@ -67,6 +67,7 @@ ProgramData &ProgramData::operator=(const ProgramData &other)
 
        for(SharedBlock &b: blocks)
                delete b.block;
+       blocks.clear();
        programs.clear();
 
        last_buffer_block = 0;
@@ -158,7 +159,7 @@ bool ProgramData::validate_tag(Tag tag) const
        {
                if(tied_program)
                {
-                       const Program::UniformInfo &info = tied_program->get_uniform_info(tag);
+                       const ReflectData::UniformInfo &info = tied_program->get_uniform_info(tag);
                        if(is_image(info.type))
                                throw invalid_operation("ProgramData::uniform");
                }
@@ -472,25 +473,25 @@ int ProgramData::find_uniform_index(Tag tag) const
 
 vector<ProgramData::ProgramBlock>::iterator ProgramData::get_program(const Program &prog) const
 {
-       Program::LayoutHash prog_hash = prog.get_uniform_layout_hash();
+       ReflectData::LayoutHash prog_hash = prog.get_uniform_layout_hash();
        auto i = lower_bound_member(programs, prog_hash, &ProgramBlock::prog_hash);
        if(i!=programs.end() && i->prog_hash==prog_hash)
                return i;
 
-       const vector<Program::UniformBlockInfo> &block_infos = prog.get_uniform_blocks();
+       const vector<ReflectData::UniformBlockInfo> &block_infos = prog.get_uniform_blocks();
        unsigned index = i-programs.begin();
        programs.insert(i, 1+block_infos.size(), ProgramBlock(prog_hash));
 
        /* Block indices may change if new shared blocks need to be inserted.  Store
        the hashes so they can be matched up later. */
-       vector<Program::LayoutHash> block_hashes;
+       vector<ReflectData::LayoutHash> block_hashes;
        block_hashes.reserve(programs.size());
        for(const ProgramBlock &b: programs)
                block_hashes.push_back(b.block_index>=0 ? blocks[b.block_index].block_hash : 0);
 
        for(unsigned j=0; j<block_infos.size(); ++j)
        {
-               const Program::UniformBlockInfo &info = block_infos[j];
+               const ReflectData::UniformBlockInfo &info = block_infos[j];
                block_hashes[index+1+j] = info.layout_hash;
                programs[index+1+j].bind_point = info.bind_point;
 
@@ -518,14 +519,14 @@ vector<ProgramData::ProgramBlock>::iterator ProgramData::get_program(const Progr
        return programs.begin()+index;
 }
 
-void ProgramData::update_block_uniform_indices(SharedBlock &block, const Program::UniformBlockInfo &info) const
+void ProgramData::update_block_uniform_indices(SharedBlock &block, const ReflectData::UniformBlockInfo &info) const
 {
-       UInt8 *indices = block.indices.values;
+       uint8_t *indices = block.indices.values;
        if(info.uniforms.size()>16)
        {
                if(block.indices.type_flag==0xFD)
                {
-                       block.indices.dynamic.values = new UInt8[info.uniforms.size()];
+                       block.indices.dynamic.values = new uint8_t[info.uniforms.size()];
                        block.indices.type_flag = 0xFE;
                }
                indices = block.indices.dynamic.values;
@@ -585,9 +586,9 @@ void ProgramData::update_block_uniform_indices(SharedBlock &block, const Program
        }
 }
 
-void ProgramData::update_block(SharedBlock &block, const Program::UniformBlockInfo &info) const
+void ProgramData::update_block(SharedBlock &block, const ReflectData::UniformBlockInfo &info) const
 {
-       const UInt8 *indices = block.get_uniform_indices();
+       const uint8_t *indices = block.get_uniform_indices();
        for(unsigned i=0; i<info.uniforms.size(); ++i)
        {
                if(is_image(info.uniforms[i]->type))
@@ -619,7 +620,7 @@ vector<ProgramData::ProgramBlock>::const_iterator ProgramData::prepare_program(c
                        dirty = 0;
                }
 
-               const vector<Program::UniformBlockInfo> &block_infos = prog.get_uniform_blocks();
+               const vector<ReflectData::UniformBlockInfo> &block_infos = prog.get_uniform_blocks();
 
                if(prog_begin->masks.dirty==ALL_ONES)
                {
@@ -627,7 +628,7 @@ vector<ProgramData::ProgramBlock>::const_iterator ProgramData::prepare_program(c
                        Refresh uniform indices within the program's blocks. */
                        prog_begin->masks.used = 0;
                        auto j = prog_begin+1;
-                       for(const Program::UniformBlockInfo &b: block_infos)
+                       for(const ReflectData::UniformBlockInfo &b: block_infos)
                        {
                                SharedBlock &shared = blocks[j->block_index];
                                if(shared.dirty==ALL_ONES)
@@ -641,7 +642,7 @@ vector<ProgramData::ProgramBlock>::const_iterator ProgramData::prepare_program(c
                // Update the contents of all dirty blocks.
                bool buffered_blocks_updated = false;
                auto j = prog_begin+1;
-               for(const Program::UniformBlockInfo &b: block_infos)
+               for(const ReflectData::UniformBlockInfo &b: block_infos)
                {
                        SharedBlock &shared = blocks[j->block_index];
                        if(shared.dirty)
@@ -683,7 +684,7 @@ vector<ProgramData::ProgramBlock>::const_iterator ProgramData::prepare_program(c
 void ProgramData::apply(const Program &prog, PipelineState &state) const
 {
        auto prog_begin = prepare_program(prog);
-       Program::LayoutHash prog_hash = prog_begin->prog_hash;
+       ReflectData::LayoutHash prog_hash = prog_begin->prog_hash;
        for(auto i=prog_begin+1; (i!=programs.end() && i->prog_hash==prog_hash); ++i)
                if(i->block)
                {
@@ -724,7 +725,7 @@ void ProgramData::TaggedUniform::replace_value(Uniform *v)
 }
 
 
-ProgramData::SharedBlock::SharedBlock(Program::LayoutHash h):
+ProgramData::SharedBlock::SharedBlock(ReflectData::LayoutHash h):
        block_hash(h),
        used(0),
        dirty(0),
@@ -733,13 +734,13 @@ ProgramData::SharedBlock::SharedBlock(Program::LayoutHash h):
        indices.type_flag = 0xFD;
 }
 
-const UInt8 *ProgramData::SharedBlock::get_uniform_indices() const
+const uint8_t *ProgramData::SharedBlock::get_uniform_indices() const
 {
        return (indices.type_flag==0xFE ? indices.dynamic.values : indices.values);
 }
 
 
-ProgramData::ProgramBlock::ProgramBlock(Program::LayoutHash h):
+ProgramData::ProgramBlock::ProgramBlock(ReflectData::LayoutHash h):
        prog_hash(h),
        bind_point(-1),
        block_index(-1)