for(const PipelineState::BoundUniformBlock &u: self.uniform_blocks)
if(u.changed || changed_sets==~0U)
{
- u.used = self.shprog->uses_binding(u.binding);
+ u.used = self.shprog->uses_uniform_block_binding(u.binding);
if(u.binding>=0)
changed_sets |= 1<<(u.binding>>20);
u.changed = false;
for(const PipelineState::BoundTexture &t: self.textures)
if(t.changed || changed_sets==~0U)
{
- t.used = self.shprog->uses_binding(t.binding);
+ t.used = self.shprog->uses_texture_binding(t.binding);
changed_sets |= 1<<(t.binding>>20);
+ if(t.texture && t.level>=0)
+ t.texture->refresh_mip_views();
if(t.sampler)
t.sampler->refresh();
t.changed = false;
result = hash_update<64>(result, t.binding);
result = hash_update<64>(result, reinterpret_cast<uintptr_t>(t.texture));
result = hash_update<64>(result, reinterpret_cast<uintptr_t>(t.sampler));
+ result = hash_update<64>(result, t.level);
}
return result;
if(t.used && (t.binding>>20)==index)
{
image_ptr->sampler = handle_cast<::VkSampler>(t.sampler->handle);
- image_ptr->imageView = handle_cast<::VkImageView>(t.texture->view_handle);
+ if(t.level<0)
+ image_ptr->imageView = handle_cast<::VkImageView>(t.texture->view_handle);
+ else
+ image_ptr->imageView = handle_cast<::VkImageView>(t.texture->mip_view_handles[t.level]);
image_ptr->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
write_ptr->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;