X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fpipelinestate.cpp;h=4dc54e2403ffea9288375df8dbfa09eb01f50283;hb=fcc065736e303088ef121c554318e0cc028a0666;hp=8d59a31624eddc823e23cd7260ed444c4efc9129;hpb=016f0f0dd51511f98d0bf398d99199d7dec1543c;p=libs%2Fgl.git diff --git a/source/core/pipelinestate.cpp b/source/core/pipelinestate.cpp index 8d59a316..4dc54e24 100644 --- a/source/core/pipelinestate.cpp +++ b/source/core/pipelinestate.cpp @@ -41,17 +41,20 @@ void PipelineState::set_shader_program(const Program *p) void PipelineState::set_uniform_block(int binding, const UniformBlock *block) { - auto i = lower_bound_member(uniform_blocks, binding, &BoundUniformBlock::binding); - if(i==uniform_blocks.end() || i->binding!=binding) - i = uniform_blocks.insert(i, BoundUniformBlock(binding)); + auto i = lower_bound_member(resources, binding, &BoundResource::binding); + if(i==resources.end() || i->binding!=binding) + i = resources.insert(i, BoundResource(binding)); + + ResourceType type = (block ? UNIFORM_BLOCK : NO_RESOURCE); const Buffer *buffer = (block ? block->get_buffer() : 0); - if(block!=i->block || buffer!=i->buffer || binding<0) + if(i->type!=type || block!=i->block || buffer!=i->buffer || binding<0) { + i->type = type; i->block = block; i->buffer = buffer; i->changed = true; i->used = block; - changes |= UNIFORMS; + changes |= RESOURCES; } } @@ -67,17 +70,30 @@ void PipelineState::set_texture(unsigned binding, const Texture *tex, int level, if(level>=0 && !can_bind_tex_level(level)) throw invalid_operation("PipelineState::set_texture"); - auto i = lower_bound_member(textures, binding, &BoundTexture::binding); - if(i==textures.end() || i->binding!=binding) - i = textures.insert(i, BoundTexture(binding)); - if(tex!=i->texture || level!=i->level || samp!=i->sampler) + set_texture_resource(binding, tex, level, samp); +} + +void PipelineState::set_storage_texture(unsigned binding, const Texture *tex) +{ + set_texture_resource(binding, tex, 0, 0); +} + +void PipelineState::set_texture_resource(unsigned binding, const Texture *tex, int level, const Sampler *samp) +{ + auto i = lower_bound_member(resources, static_cast(binding), &BoundResource::binding); + if(i==resources.end() || i->binding!=static_cast(binding)) + i = resources.insert(i, BoundResource(binding)); + + ResourceType type = (tex ? samp ? SAMPLED_TEXTURE : STORAGE_TEXTURE : NO_RESOURCE); + if(i->type!=type || tex!=i->texture || level!=i->mip_level || samp!=i->sampler) { + i->type = type; i->texture = tex; i->sampler = samp; - i->level = level; + i->mip_level = level; i->changed = true; - i->used = (tex && samp); - changes |= TEXTURES; + i->used = tex; + changes |= RESOURCES; } }