Blender  V3.3
Classes | Typedefs | Functions | Variables
draw_instance_data.c File Reference
#include "draw_instance_data.h"
#include "draw_manager.h"
#include "DRW_engine.h"
#include "DRW_render.h"
#include "GPU_material.h"
#include "DNA_particle_types.h"
#include "BKE_duplilist.h"
#include "RNA_access.h"
#include "RNA_path.h"
#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
 

Typedefs

typedef struct DRWTempBufferHandle DRWTempBufferHandle
 
typedef struct DRWTempInstancingHandle DRWTempInstancingHandle
 

Functions

static void instancing_batch_references_add (GPUBatch *batch)
 
static void instancing_batch_references_remove (GPUBatch *batch)
 
Instance Buffer Management
GPUVertBufDRW_temp_buffer_request (DRWInstanceDataList *idatalist, GPUVertFormat *format, int *vert_len)
 
GPUBatchDRW_temp_batch_instance_request (DRWInstanceDataList *idatalist, GPUVertBuf *buf, GPUBatch *instancer, GPUBatch *geom)
 
GPUBatchDRW_temp_batch_request (DRWInstanceDataList *idatalist, GPUVertBuf *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 (GPUBatch **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)
 
voidDRW_instance_data_next (DRWInstanceData *idata)
 
DRWInstanceDataDRW_instance_data_request (DRWInstanceDataList *idatalist, uint attr_size)
 
Instance Data List (DRWInstanceDataList)
DRWInstanceDataListDRW_instance_data_list_create (void)
 
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)
 

Variables

static ListBase g_idatalists = {NULL, NULL}
 

Sparse Uniform Buffer

#define CHUNK_LIST_STEP   (1 << 4)
 
typedef struct DRWSparseUniformBuf DRWSparseUniformBuf
 
static void drw_sparse_uniform_buffer_init (DRWSparseUniformBuf *buffer, unsigned int item_size, unsigned int chunk_size)
 
DRWSparseUniformBufDRW_sparse_uniform_buffer_new (unsigned int item_size, unsigned int 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 GPUUniformBufdrw_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)
 
voidDRW_sparse_uniform_buffer_ensure_item (DRWSparseUniformBuf *buffer, int chunk, int item)
 

Uniform Attribute Buffers

typedef struct DRWUniformAttrBuf DRWUniformAttrBuf
 
static DRWUniformAttrBufdrw_uniform_attrs_pool_ensure (GHash *table, GPUUniformAttrList *key)
 
static bool drw_uniform_property_lookup (ID *id, const char *name, float r_data[4])
 
static void drw_uniform_attribute_lookup (GPUUniformAttr *attr, Object *ob, Object *dupli_parent, DupliObject *dupli_source, float r_data[4])
 
void drw_uniform_attrs_pool_update (GHash *table, GPUUniformAttrList *key, DRWResourceHandle *handle, Object *ob, Object *dupli_parent, DupliObject *dupli_source)
 
DRWSparseUniformBufDRW_uniform_attrs_pool_find_ubo (GHash *table, struct 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)
 

Macro Definition Documentation

◆ CHUNK_LIST_STEP

#define CHUNK_LIST_STEP   (1 << 4)

Definition at line 401 of file draw_instance_data.c.

Typedef Documentation

◆ DRWSparseUniformBuf

A chunked UBO manager that doesn't actually allocate unneeded chunks.

◆ DRWTempBufferHandle

◆ DRWTempInstancingHandle

◆ DRWUniformAttrBuf

Sparse UBO buffer for a specific uniform attribute list.

Function Documentation

◆ DRW_instance_buffer_finish()

void DRW_instance_buffer_finish ( DRWInstanceDataList idatalist)

◆ drw_instance_data_create()

static DRWInstanceData* drw_instance_data_create ( DRWInstanceDataList idatalist,
uint  attr_size 
)
static

◆ DRW_instance_data_free()

static void DRW_instance_data_free ( DRWInstanceData idata)
static

◆ DRW_instance_data_list_create()

DRWInstanceDataList* DRW_instance_data_list_create ( void  )

◆ DRW_instance_data_list_free()

void DRW_instance_data_list_free ( DRWInstanceDataList idatalist)

◆ DRW_instance_data_list_free_unused()

void DRW_instance_data_list_free_unused ( DRWInstanceDataList idatalist)

◆ DRW_instance_data_list_reset()

void DRW_instance_data_list_reset ( DRWInstanceDataList idatalist)

◆ DRW_instance_data_list_resize()

void DRW_instance_data_list_resize ( DRWInstanceDataList idatalist)

◆ DRW_instance_data_next()

void* DRW_instance_data_next ( DRWInstanceData idata)

Return a pointer to the next instance data space.

Definition at line 279 of file draw_instance_data.c.

References BLI_mempool_alloc(), and DRWInstanceData::mempool.

Referenced by DRW_drawdata_ensure().

◆ DRW_instance_data_request()

DRWInstanceData* DRW_instance_data_request ( DRWInstanceDataList idatalist,
uint  attr_size 
)

◆ 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 NULL buffer pointer is handled as empty.

Definition at line 509 of file draw_instance_data.c.

References buffer, 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()

void DRW_sparse_uniform_buffer_clear ( DRWSparseUniformBuf buffer,
bool  free_all 
)

◆ DRW_sparse_uniform_buffer_ensure_item()

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

Returns a pointer to the given item of the given chunk, allocating memory if necessary.

Definition at line 525 of file draw_instance_data.c.

References BLI_BITMAP_ENABLE, BLI_BITMAP_RESIZE, BLI_BITMAP_TEST, buffer, CHUNK_LIST_STEP, MEM_callocN, MEM_recallocN, and NULL.

Referenced by drw_uniform_attrs_pool_update().

◆ DRW_sparse_uniform_buffer_flush()

void DRW_sparse_uniform_buffer_flush ( DRWSparseUniformBuf buffer)

Flush data from ordinary memory to UBOs.

Definition at line 436 of file draw_instance_data.c.

References BLI_BITMAP_TEST, buffer, GPU_uniformbuf_create, GPU_uniformbuf_update(), and NULL.

Referenced by DRW_uniform_attrs_pool_flush_all().

◆ DRW_sparse_uniform_buffer_free()

void DRW_sparse_uniform_buffer_free ( DRWSparseUniformBuf buffer)

Frees the buffer.

Definition at line 490 of file draw_instance_data.c.

References buffer, 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()

static void drw_sparse_uniform_buffer_init ( DRWSparseUniformBuf buffer,
unsigned int  item_size,
unsigned int  chunk_size 
)
static

◆ 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 496 of file draw_instance_data.c.

References buffer.

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 429 of file draw_instance_data.c.

References blender::io::obj::chunk_size, 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 NULL buffer pointer is handled as empty.

Definition at line 517 of file draw_instance_data.c.

References buffer, 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()

GPUBatch* DRW_temp_batch_instance_request ( DRWInstanceDataList idatalist,
GPUVertBuf buf,
GPUBatch instancer,
GPUBatch geom 
)

◆ DRW_temp_batch_request()

GPUBatch* DRW_temp_batch_request ( DRWInstanceDataList idatalist,
GPUVertBuf buf,
GPUPrimType  type 
)

◆ DRW_temp_buffer_request()

GPUVertBuf* 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 101 of file draw_instance_data.c.

References BLI_assert, BLI_memblock_alloc(), DRWTempBufferHandle::buf, 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(), NULL, DRWInstanceDataList::pool_buffers, and DRWTempBufferHandle::vert_len.

Referenced by DRW_shgroup_call_buffer(), and DRW_shgroup_call_buffer_instance().

◆ drw_uniform_attribute_lookup()

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

◆ DRW_uniform_attrs_pool_clear_all()

void DRW_uniform_attrs_pool_clear_all ( GHash table)

◆ drw_uniform_attrs_pool_ensure()

static DRWUniformAttrBuf* drw_uniform_attrs_pool_ensure ( GHash table,
GPUUniformAttrList key 
)
static

◆ DRW_uniform_attrs_pool_find_ubo()

DRWSparseUniformBuf* DRW_uniform_attrs_pool_find_ubo ( GHash table,
struct GPUUniformAttrList key 
)

Definition at line 700 of file draw_instance_data.c.

References BLI_ghash_lookup(), buffer, DRWUniformAttrBuf::key, and NULL.

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 750 of file draw_instance_data.c.

References BLI_ghash_free(), drw_uniform_attrs_pool_free_cb(), and NULL.

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 ( void  )

Definition at line 706 of file draw_instance_data.c.

References GPU_uniform_attr_list_hash_new().

Referenced by DRW_viewport_data_create().

◆ drw_uniform_attrs_pool_update()

void drw_uniform_attrs_pool_update ( GHash table,
GPUUniformAttrList key,
DRWResourceHandle handle,
Object ob,
Object dupli_parent,
DupliObject dupli_source 
)

◆ drw_uniform_property_lookup()

static bool drw_uniform_property_lookup ( ID id,
const char *  name,
float  r_data[4] 
)
static

◆ instancing_batch_references_add()

static void instancing_batch_references_add ( GPUBatch batch)
static

◆ instancing_batch_references_remove()

static void instancing_batch_references_remove ( GPUBatch batch)
static

◆ temp_batch_free()

static void temp_batch_free ( GPUBatch **  batch)
static

Definition at line 195 of file draw_instance_data.c.

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 = {NULL, NULL}
static