DRW: GPU Wrapper: add possibility to swap Texture and TextureFromPool

Ownership is transfered from the pool to the `Texture` and vice versa.
This allows to have history buffers with only 1 persistent texture.
This commit is contained in:
Clément Foucault
2022-08-04 12:36:10 +02:00
parent 1ae767be9f
commit c5526dc6f4
3 changed files with 42 additions and 3 deletions

View File

@@ -807,12 +807,22 @@ class TextureFromPool : public Texture, NonMovable {
}
/**
* Swap the GPUTexture pointers of the two texture.
* Swap the content of the two textures.
* Also change ownership accordingly if needed.
*/
static void swap(TextureFromPool &a, Texture &b)
{
Texture::swap(a, b);
DRW_texture_pool_give_texture_ownership(DST.vmempool->texture_pool, a);
DRW_texture_pool_take_texture_ownership(DST.vmempool->texture_pool, b);
}
static void swap(Texture &a, TextureFromPool &b)
{
swap(b, a);
}
static void swap(TextureFromPool &a, TextureFromPool &b)
{
SWAP(GPUTexture *, a.tx_, b.tx_);
SWAP(const char *, a.name_, b.name_);
Texture::swap(a, b);
}
/** Remove methods that are forbidden with this type of textures. */

View File

@@ -160,6 +160,19 @@ void DRW_texture_pool_texture_release(DRWTexturePool *pool, GPUTexture *tmp_tex)
pool->tmp_tex_released.append(tmp_tex);
}
void DRW_texture_pool_take_texture_ownership(DRWTexturePool *pool, GPUTexture *tex)
{
pool->tmp_tex_acquired.remove_first_occurrence_and_reorder(tex);
}
void DRW_texture_pool_give_texture_ownership(DRWTexturePool *pool, GPUTexture *tex)
{
BLI_assert(pool->tmp_tex_acquired.first_index_of_try(tex) == -1 &&
pool->tmp_tex_released.first_index_of_try(tex) == -1 &&
pool->tmp_tex_pruned.first_index_of_try(tex) == -1);
pool->tmp_tex_acquired.append(tex);
}
void DRW_texture_pool_reset(DRWTexturePool *pool)
{
pool->last_user_id = -1;

View File

@@ -41,6 +41,22 @@ GPUTexture *DRW_texture_pool_texture_acquire(DRWTexturePool *pool,
* Releases a previously acquired texture.
*/
void DRW_texture_pool_texture_release(DRWTexturePool *pool, GPUTexture *tmp_tex);
/**
* This effectively remove a texture from the texture pool, giving full ownership to the caller.
* The given texture needs to be been acquired through DRW_texture_pool_texture_acquire().
* IMPORTANT: This removes the need for a DRW_texture_pool_texture_release() call on this texture.
*/
void DRW_texture_pool_take_texture_ownership(DRWTexturePool *pool, GPUTexture *tex);
/**
* This Inserts a texture into the texture pool, giving full ownership to the texture pool.
* The texture needs not to be in the pool already.
* The texture may be reused in a latter call to DRW_texture_pool_texture_acquire();
* IMPORTANT: DRW_texture_pool_texture_release() still needs to be called on this texture
* after usage.
*/
void DRW_texture_pool_give_texture_ownership(DRWTexturePool *pool, GPUTexture *tex);
/**
* Resets the user bits for each texture in the pool and delete unused ones.
*/