Blender V4.3
draw_instance_data.cc File Reference
#include "draw_instance_data.hh"
#include "draw_manager_c.hh"
#include "DRW_engine.hh"
#include "DRW_render.hh"
#include "GPU_material.hh"
#include "DNA_particle_types.h"
#include "BKE_duplilist.hh"
#include "RNA_access.hh"
#include "RNA_path.hh"
#include "BLI_bitmap.h"
#include "BLI_memblock.h"
#include "BLI_mempool.h"
#include "BLI_utildefines.h"
#include "MEM_guardedalloc.h"

Go to the source code of this file.

Classes

struct  DRWInstanceData
 
struct  DRWInstanceDataList
 
struct  DRWTempBufferHandle
 
struct  DRWTempInstancingHandle
 
struct  DRWSparseUniformBuf
 
struct  DRWUniformAttrBuf
 

Functions

static void instancing_batch_references_add (blender::gpu::Batch *batch)
 
static void instancing_batch_references_remove (blender::gpu::Batch *batch)
 
Instance Buffer Management
blender::gpu::VertBufDRW_temp_buffer_request (DRWInstanceDataList *idatalist, GPUVertFormat *format, int *vert_len)
 
blender::gpu::Batch * DRW_temp_batch_instance_request (DRWInstanceDataList *idatalist, blender::gpu::VertBuf *buf, blender::gpu::Batch *instancer, blender::gpu::Batch *geom)
 
blender::gpu::Batch * DRW_temp_batch_request (DRWInstanceDataList *idatalist, blender::gpu::VertBuf *buf, GPUPrimType prim_type)
 
static void temp_buffer_handle_free (DRWTempBufferHandle *handle)
 
static void temp_instancing_handle_free (DRWTempInstancingHandle *handle)
 
static void temp_batch_free (blender::gpu::Batch **batch)
 
void DRW_instance_buffer_finish (DRWInstanceDataList *idatalist)
 
Instance Data (DRWInstanceData)
static DRWInstanceDatadrw_instance_data_create (DRWInstanceDataList *idatalist, uint attr_size)
 
static void DRW_instance_data_free (DRWInstanceData *idata)
 
void * DRW_instance_data_next (DRWInstanceData *idata)
 
DRWInstanceDataDRW_instance_data_request (DRWInstanceDataList *idatalist, uint attr_size)
 
Instance Data List (DRWInstanceDataList)
DRWInstanceDataListDRW_instance_data_list_create ()
 
void DRW_instance_data_list_free (DRWInstanceDataList *idatalist)
 
void DRW_instance_data_list_reset (DRWInstanceDataList *idatalist)
 
void DRW_instance_data_list_free_unused (DRWInstanceDataList *idatalist)
 
void DRW_instance_data_list_resize (DRWInstanceDataList *idatalist)
 
Uniform Attribute Buffers
static DRWUniformAttrBufdrw_uniform_attrs_pool_ensure (GHash *table, const GPUUniformAttrList *key)
 
static void drw_uniform_attribute_lookup (const GPUUniformAttr *attr, const Object *ob, const Object *dupli_parent, const DupliObject *dupli_source, float r_data[4])
 
void drw_uniform_attrs_pool_update (GHash *table, const GPUUniformAttrList *key, DRWResourceHandle *handle, const Object *ob, const Object *dupli_parent, const DupliObject *dupli_source)
 
GPUUniformBuf * drw_ensure_layer_attribute_buffer ()
 
DRWSparseUniformBufDRW_uniform_attrs_pool_find_ubo (GHash *table, const GPUUniformAttrList *key)
 
GHashDRW_uniform_attrs_pool_new ()
 
void DRW_uniform_attrs_pool_flush_all (GHash *table)
 
static void drw_uniform_attrs_pool_free_cb (void *ptr)
 
void DRW_uniform_attrs_pool_clear_all (GHash *table)
 
void DRW_uniform_attrs_pool_free (GHash *table)
 

Variables

static ListBase g_idatalists = {nullptr, nullptr}
 

Sparse Uniform Buffer

#define CHUNK_LIST_STEP   (1 << 4)
 
static void drw_sparse_uniform_buffer_init (DRWSparseUniformBuf *buffer, uint item_size, uint chunk_size)
 
DRWSparseUniformBufDRW_sparse_uniform_buffer_new (uint item_size, uint chunk_size)
 
void DRW_sparse_uniform_buffer_flush (DRWSparseUniformBuf *buffer)
 
void DRW_sparse_uniform_buffer_clear (DRWSparseUniformBuf *buffer, bool free_all)
 
void DRW_sparse_uniform_buffer_free (DRWSparseUniformBuf *buffer)
 
bool DRW_sparse_uniform_buffer_is_empty (DRWSparseUniformBuf *buffer)
 
static GPUUniformBuf * drw_sparse_uniform_buffer_get_ubo (DRWSparseUniformBuf *buffer, int chunk)
 
void DRW_sparse_uniform_buffer_bind (DRWSparseUniformBuf *buffer, int chunk, int location)
 
void DRW_sparse_uniform_buffer_unbind (DRWSparseUniformBuf *buffer, int chunk)
 
void * DRW_sparse_uniform_buffer_ensure_item (DRWSparseUniformBuf *buffer, int chunk, int item)
 

Macro Definition Documentation

◆ CHUNK_LIST_STEP

#define CHUNK_LIST_STEP   (1 << 4)

Function Documentation

◆ drw_ensure_layer_attribute_buffer()

◆ DRW_instance_buffer_finish()

◆ drw_instance_data_create()

◆ DRW_instance_data_free()

static void DRW_instance_data_free ( DRWInstanceData * idata)
static

◆ DRW_instance_data_list_create()

◆ DRW_instance_data_list_free()

◆ DRW_instance_data_list_free_unused()

◆ DRW_instance_data_list_reset()

void DRW_instance_data_list_reset ( DRWInstanceDataList * idatalist)

◆ DRW_instance_data_list_resize()

◆ DRW_instance_data_next()

void * DRW_instance_data_next ( DRWInstanceData * idata)

Return a pointer to the next instance data space.

Definition at line 287 of file draw_instance_data.cc.

References BLI_mempool_alloc(), and DRWInstanceData::mempool.

Referenced by DRW_drawdata_ensure().

◆ DRW_instance_data_request()

◆ DRW_sparse_uniform_buffer_bind()

void DRW_sparse_uniform_buffer_bind ( DRWSparseUniformBuf * buffer,
int chunk,
int location )

Bind the UBO for the given chunk, if present. A nullptr buffer pointer is handled as empty.

Definition at line 520 of file draw_instance_data.cc.

References drw_sparse_uniform_buffer_get_ubo(), and GPU_uniformbuf_bind().

Referenced by draw_call_resource_bind(), and draw_update_uniforms().

◆ DRW_sparse_uniform_buffer_clear()

◆ DRW_sparse_uniform_buffer_ensure_item()

void * DRW_sparse_uniform_buffer_ensure_item ( DRWSparseUniformBuf * buffer,
int chunk,
int item )

◆ DRW_sparse_uniform_buffer_flush()

◆ DRW_sparse_uniform_buffer_free()

void DRW_sparse_uniform_buffer_free ( DRWSparseUniformBuf * buffer)

Frees the buffer.

Definition at line 501 of file draw_instance_data.cc.

References DRW_sparse_uniform_buffer_clear(), and MEM_freeN().

◆ drw_sparse_uniform_buffer_get_ubo()

static GPUUniformBuf * drw_sparse_uniform_buffer_get_ubo ( DRWSparseUniformBuf * buffer,
int chunk )
static

◆ drw_sparse_uniform_buffer_init()

◆ DRW_sparse_uniform_buffer_is_empty()

bool DRW_sparse_uniform_buffer_is_empty ( DRWSparseUniformBuf * buffer)

Checks if the buffer contains any allocated chunks.

Definition at line 507 of file draw_instance_data.cc.

References DRWSparseUniformBuf::num_chunks.

Referenced by DRW_uniform_attrs_pool_clear_all().

◆ DRW_sparse_uniform_buffer_new()

DRWSparseUniformBuf * DRW_sparse_uniform_buffer_new ( unsigned int item_size,
unsigned int chunk_size )

Allocate a chunked UBO with the specified item and chunk size.

Definition at line 438 of file draw_instance_data.cc.

References drw_sparse_uniform_buffer_init(), and MEM_mallocN.

◆ DRW_sparse_uniform_buffer_unbind()

void DRW_sparse_uniform_buffer_unbind ( DRWSparseUniformBuf * buffer,
int chunk )

Unbind the UBO for the given chunk, if present. A nullptr buffer pointer is handled as empty.

Definition at line 528 of file draw_instance_data.cc.

References drw_sparse_uniform_buffer_get_ubo(), and GPU_uniformbuf_unbind().

Referenced by draw_call_batching_finish(), and draw_call_resource_bind().

◆ DRW_temp_batch_instance_request()

blender::gpu::Batch * DRW_temp_batch_instance_request ( DRWInstanceDataList * idatalist,
blender::gpu::VertBuf * buf,
blender::gpu::Batch * instancer,
blender::gpu::Batch * geom )
Note
Does not return a valid drawable batch until DRW_instance_buffer_finish has run. Initialization is delayed because instancer or geom could still not be initialized.

Definition at line 126 of file draw_instance_data.cc.

References batch, DRWTempInstancingHandle::batch, BLI_assert, BLI_memblock_alloc(), GPU_BATCH_BUILDING, GPU_batch_calloc(), GPU_batch_clear(), GPU_BATCH_VBO_MAX_LEN, GPU_VERTBUF_DATA_UPLOADED, GPU_vertbuf_get_status(), instancing_batch_references_remove(), and DRWInstanceDataList::pool_instancing.

Referenced by DRW_shgroup_call_buffer_instance(), and DRW_shgroup_call_instances_with_attrs().

◆ DRW_temp_batch_request()

blender::gpu::Batch * DRW_temp_batch_request ( DRWInstanceDataList * idatalist,
blender::gpu::VertBuf * buf,
GPUPrimType type )
Note
Use only with buf allocated via DRW_temp_buffer_request.

Definition at line 167 of file draw_instance_data.cc.

References batch, BLI_memblock_alloc(), GPU_batch_calloc(), GPU_batch_clear(), GPU_batch_init, GPU_VERTBUF_DATA_UPLOADED, GPU_vertbuf_get_status(), and DRWInstanceDataList::pool_batching.

Referenced by DRW_shgroup_call_buffer().

◆ DRW_temp_buffer_request()

blender::gpu::VertBuf * DRW_temp_buffer_request ( DRWInstanceDataList * idatalist,
GPUVertFormat * format,
int * vert_len )

This manager allows to distribute existing batches for instancing attributes. This reduce the number of batches creation. Querying a batch is done with a vertex format. This format should be static so that its pointer never changes (because we are using this pointer as identifier [we don't want to check the full format that would be too slow]).

Definition at line 102 of file draw_instance_data.cc.

References BLI_assert, BLI_memblock_alloc(), DRW_BUFFER_VERTS_CHUNK, DRWTempBufferHandle::format, GPU_USAGE_DYNAMIC, GPU_vertbuf_calloc(), GPU_vertbuf_data_alloc(), GPU_VERTBUF_DISCARD_SAFE, GPU_vertbuf_init_with_format_ex(), and DRWInstanceDataList::pool_buffers.

Referenced by DRW_shgroup_call_buffer(), and DRW_shgroup_call_buffer_instance().

◆ drw_uniform_attribute_lookup()

static void drw_uniform_attribute_lookup ( const GPUUniformAttr * attr,
const Object * ob,
const Object * dupli_parent,
const DupliObject * dupli_source,
float r_data[4] )
static

◆ DRW_uniform_attrs_pool_clear_all()

◆ drw_uniform_attrs_pool_ensure()

◆ DRW_uniform_attrs_pool_find_ubo()

DRWSparseUniformBuf * DRW_uniform_attrs_pool_find_ubo ( GHash * table,
const GPUUniformAttrList * key )

Definition at line 697 of file draw_instance_data.cc.

References BLI_ghash_lookup(), and DRWUniformAttrBuf::ubos.

Referenced by draw_update_uniforms().

◆ DRW_uniform_attrs_pool_flush_all()

void DRW_uniform_attrs_pool_flush_all ( GHash * table)

◆ DRW_uniform_attrs_pool_free()

void DRW_uniform_attrs_pool_free ( GHash * table)

Definition at line 747 of file draw_instance_data.cc.

References BLI_ghash_free(), and drw_uniform_attrs_pool_free_cb().

Referenced by DRW_viewport_data_free().

◆ drw_uniform_attrs_pool_free_cb()

static void drw_uniform_attrs_pool_free_cb ( void * ptr)
static

◆ DRW_uniform_attrs_pool_new()

GHash * DRW_uniform_attrs_pool_new ( )

Definition at line 703 of file draw_instance_data.cc.

References GPU_uniform_attr_list_hash_new().

Referenced by DRW_viewport_data_create().

◆ drw_uniform_attrs_pool_update()

◆ instancing_batch_references_add()

static void instancing_batch_references_add ( blender::gpu::Batch * batch)
static

◆ instancing_batch_references_remove()

static void instancing_batch_references_remove ( blender::gpu::Batch * batch)
static

◆ temp_batch_free()

static void temp_batch_free ( blender::gpu::Batch ** batch)
static

Definition at line 199 of file draw_instance_data.cc.

References batch, and GPU_BATCH_DISCARD_SAFE.

Referenced by DRW_instance_buffer_finish(), and DRW_instance_data_list_free().

◆ temp_buffer_handle_free()

static void temp_buffer_handle_free ( DRWTempBufferHandle * handle)
static

◆ temp_instancing_handle_free()

static void temp_instancing_handle_free ( DRWTempInstancingHandle * handle)
static

Variable Documentation

◆ g_idatalists

ListBase g_idatalists = {nullptr, nullptr}
static