]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/programdata.cpp
Rename Pipeline to Sequence
[libs/gl.git] / source / render / programdata.cpp
index 7323df905db7093fcbb5db5572b9b7f7faedb5ca..0f641a4afbdf1f75dde9bb5803f5458f90abcc55 100644 (file)
@@ -20,7 +20,7 @@ namespace GL {
 
 ProgramData::ProgramData(const Program *p):
        tied_program(p),
-       last_block(0),
+       last_buffer_block(0),
        buffer(0),
        dirty(0)
 { }
@@ -29,7 +29,7 @@ ProgramData::ProgramData(const Program *p):
 ProgramData::ProgramData(const ProgramData &other):
        tied_program(other.tied_program),
        uniforms(other.uniforms),
-       last_block(0),
+       last_buffer_block(0),
        buffer(0),
        dirty(0)
 {
@@ -39,7 +39,7 @@ ProgramData::ProgramData(const ProgramData &other):
 
 ProgramData::ProgramData(const ProgramData &other, const Program *p):
        tied_program(p),
-       last_block(0),
+       last_buffer_block(0),
        buffer(0),
        dirty(0)
 {
@@ -66,7 +66,7 @@ ProgramData &ProgramData::operator=(const ProgramData &other)
                delete i->block;
        programs.clear();
 
-       last_block = 0;
+       last_buffer_block = 0;
        buffer = 0;
        dirty = 0;
 
@@ -154,7 +154,11 @@ bool ProgramData::validate_tag(Tag tag) const
 #endif
        {
                if(tied_program)
-                       tied_program->get_uniform_info(tag);
+               {
+                       const Program::UniformInfo &info = tied_program->get_uniform_info(tag);
+                       if(is_image(info.type))
+                               throw invalid_operation("ProgramData::uniform");
+               }
                return true;
        }
 #ifdef DEBUG
@@ -594,12 +598,13 @@ void ProgramData::update_block_uniform_indices(SharedBlock &block, const Program
                        if(!buffer)
                                buffer = new Buffer(UNIFORM_BUFFER);
 
-                       block.block = new UniformBlock(info.data_size);
-                       block.block->use_buffer(buffer, last_block);
-                       last_block = block.block;
+                       BufferBackedUniformBlock *bb_block = new BufferBackedUniformBlock(info.data_size);
+                       block.block = bb_block;
+                       bb_block->use_buffer(buffer, last_buffer_block);
+                       last_buffer_block = bb_block;
                }
                else
-                       block.block = new UniformBlock;
+                       block.block = new DefaultUniformBlock;
        }
 }
 
@@ -607,8 +612,12 @@ void ProgramData::update_block(SharedBlock &block, const Program::UniformBlockIn
 {
        const UInt8 *indices = block.get_uniform_indices();
        for(unsigned i=0; i<info.uniforms.size(); ++i)
-               if(indices[i]!=0xFF)
+       {
+               if(is_image(info.uniforms[i]->type))
+                       ;  // Temporarily ignore deprecated use of sampler uniforms in ProgramData
+               else if(indices[i]!=0xFF)
                        block.block->attach(*info.uniforms[i], *uniforms[indices[i]].value);
+       }
 }
 
 void ProgramData::apply() const
@@ -617,7 +626,7 @@ void ProgramData::apply() const
        if(!prog)
                throw invalid_operation("ProgramData::apply");
 
-       UniformBlock *old_last_block = last_block;
+       BufferBackedUniformBlock *old_last_block = last_buffer_block;
        vector<ProgramBlock>::iterator prog_begin = get_program(*prog);
        Program::LayoutHash prog_hash = prog->get_uniform_layout_hash();
 
@@ -677,16 +686,16 @@ void ProgramData::apply() const
                if(buffered_blocks_updated && !ARB_direct_state_access)
                        buffer->bind();
 
-               if(last_block!=old_last_block)
+               if(last_buffer_block!=old_last_block)
                {
-                       unsigned required_size = last_block->get_required_buffer_size();
-                       if(last_block->get_required_buffer_size()>buffer->get_size())
+                       unsigned required_size = last_buffer_block->get_required_buffer_size();
+                       if(last_buffer_block->get_required_buffer_size()>buffer->get_size())
                        {
                                if(buffer->get_size()>0)
                                {
                                        delete buffer;
                                        buffer = new Buffer(UNIFORM_BUFFER);
-                                       last_block->change_buffer(buffer);
+                                       last_buffer_block->change_buffer(buffer);
                                }
 
                                buffer->storage(required_size);