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
GPUVertBuf * DRW_temp_buffer_request (DRWInstanceDataList *idatalist, GPUVertFormat *format, int *vert_len)
 
GPUBatch * DRW_temp_batch_instance_request (DRWInstanceDataList *idatalist, GPUVertBuf *buf, GPUBatch *instancer, GPUBatch *geom)
 
GPUBatch * DRW_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 DRWInstanceData * drw_instance_data_create (DRWInstanceDataList *idatalist, uint attr_size)
 
static void DRW_instance_data_free (DRWInstanceData *idata)
 
void * DRW_instance_data_next (DRWInstanceData *idata)
 
DRWInstanceData * DRW_instance_data_request (DRWInstanceDataList *idatalist, uint attr_size)
 
Instance Data List (DRWInstanceDataList)
DRWInstanceDataList * DRW_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)
 
DRWSparseUniformBuf * DRW_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 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)
 

Uniform Attribute Buffers

typedef struct DRWUniformAttrBuf DRWUniformAttrBuf
 
static DRWUniformAttrBuf * drw_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)
 
DRWSparseUniformBuf * DRW_uniform_attrs_pool_find_ubo (GHash *table, struct GPUUniformAttrList *key)
 
GHash * DRW_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