X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Frender%2Fprogramdata.cpp;h=65934d382ae29fad792c0b67031a406658b7b3fb;hb=1b23728908f5ec9beb08b2b70737c3903745fddc;hp=e8e30e6344c8d4ca6c982027bab6f73195376bfd;hpb=e9a898f315b5d1396f196d785913a283c30940f2;p=libs%2Fgl.git diff --git a/source/render/programdata.cpp b/source/render/programdata.cpp index e8e30e63..65934d38 100644 --- a/source/render/programdata.cpp +++ b/source/render/programdata.cpp @@ -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::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 &block_infos = prog.get_uniform_blocks(); + const vector &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 block_hashes; + vector 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::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; itype)) @@ -619,7 +620,7 @@ vector::const_iterator ProgramData::prepare_program(c dirty = 0; } - const vector &block_infos = prog.get_uniform_blocks(); + const vector &block_infos = prog.get_uniform_blocks(); if(prog_begin->masks.dirty==ALL_ONES) { @@ -627,7 +628,7 @@ vector::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::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::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)