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:
@@ -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. */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user