140 bool instancer_compat = buf ? ((
batch->inst[0] == buf) &&
142 ((
batch->inst[0] == instancer->verts[0]) &&
143 (
batch->inst[1] == instancer->verts[1]));
144 bool is_compatible = (
batch->prim_type == geom->prim_type) && instancer_compat &&
147 if (
batch->verts[i] != geom->verts[i]) {
148 is_compatible =
false;
152 if (!is_compatible) {
169 if (*batch_ptr ==
NULL) {
174 bool is_compatible = (
batch->verts[0] == buf) && (
batch->prim_type == prim_type) &&
176 if (!is_compatible) {
227 if (inst_batch !=
NULL) {
291 for (; idata; idata = idata->
next) {
292 if (idata->
used ==
false) {
325 for (idata = idatalist->
idata_head[i]; idata; idata = next_idata) {
326 next_idata = idata->
next;
348 for (idata = idatalist->
idata_head[i]; idata; idata = idata->
next) {
361 for (idata = idatalist->
idata_head[i]; idata; idata = next_idata) {
362 next_idata = idata->
next;
363 if (idata->
used ==
false) {
389 for (idata = idatalist->
idata_head[i]; idata; idata = idata->
next) {
401 #define CHUNK_LIST_STEP (1 << 4)
417 unsigned int item_size,
424 buffer->item_size = item_size;
438 for (
int i = 0; i <
buffer->num_chunks; i++) {
450 int max_used_chunk = 0;
452 for (
int i = 0; i <
buffer->num_chunks; i++) {
457 if (
buffer->chunk_ubos[i]) {
463 max_used_chunk = i + 1;
468 const int old_num_chunks =
buffer->num_chunks;
472 if (
buffer->num_chunks == 0) {
480 if (
buffer->num_chunks != old_num_chunks) {
482 buffer->num_chunks *
sizeof(
void *));
498 return buffer->num_chunks == 0;
504 return buffer->chunk_ubos[chunk];
527 if (chunk >=
buffer->num_chunks) {
530 buffer->num_chunks *
sizeof(
void *));
535 char *chunk_buffer =
buffer->chunk_buffers[chunk];
537 if (chunk_buffer ==
NULL) {
541 memset(chunk_buffer, 0,
buffer->chunk_bytes);
546 return chunk_buffer +
buffer->item_size * item;
645 char idprop_name[(
sizeof(attr->
name) * 2) + 4];
647 char attr_name_esc[
sizeof(attr->
name) * 2];
649 SNPRINTF(idprop_name,
"[\"%s\"]", attr_name_esc);
687 if (
buffer->last_handle != *handle) {
688 buffer->last_handle = *handle;
737 buffer->next_empty = remove_list;
743 while (remove_list) {
745 remove_list =
buffer->next_empty;
typedef float(TangentPoint)[2]
#define BLI_BITMAP_TEST(_bitmap, _index)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
#define BLI_BITMAP_RESIZE(_bitmap, _num)
void BLI_bitmap_set_all(BLI_bitmap *bitmap, bool set, size_t bits)
#define GHASH_FOREACH_END()
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
#define GHASH_FOREACH_BEGIN(type, var, what)
bool BLI_ghash_remove(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
bool BLI_ghash_ensure_p_ex(GHash *gh, const void *key, void ***r_key, void ***r_val) ATTR_WARN_UNUSED_RESULT
#define LISTBASE_FOREACH(type, var, list)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE void copy_v4_fl4(float v[4], float x, float y, float z, float w)
MINLINE void copy_v4_fl(float r[4], float f)
void(* MemblockValFreeFP)(void *val)
void BLI_memblock_destroy(BLI_memblock *mblk, MemblockValFreeFP free_callback) ATTR_NONNULL(1)
#define BLI_memblock_create(elem_size)
void BLI_memblock_iternew(BLI_memblock *mblk, BLI_memblock_iter *iter) ATTR_NONNULL()
void * BLI_memblock_iterstep(BLI_memblock_iter *iter) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void * BLI_memblock_alloc(BLI_memblock *mblk) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_memblock_clear(BLI_memblock *mblk, MemblockValFreeFP free_callback) ATTR_NONNULL(1)
int BLI_mempool_len(const BLI_mempool *pool) ATTR_NONNULL(1)
void void BLI_mempool_clear_ex(BLI_mempool *pool, int totelem_reserve) ATTR_NONNULL(1)
BLI_mempool * BLI_mempool_create(unsigned int esize, unsigned int elem_num, unsigned int pchunk, unsigned int flag) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
void * BLI_mempool_alloc(BLI_mempool *pool) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(1)
void BLI_mempool_destroy(BLI_mempool *pool) ATTR_NONNULL(1)
#define SNPRINTF(dst, format,...)
size_t size_t char size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL()
GPUBatch * GPU_batch_calloc(void)
void GPU_batch_copy(GPUBatch *batch_dst, GPUBatch *batch_src)
#define GPU_BATCH_INST_VBO_MAX_LEN
#define GPU_BATCH_VBO_MAX_LEN
void GPU_batch_clear(GPUBatch *)
#define GPU_BATCH_DISCARD_SAFE(batch)
int GPU_batch_instbuf_add_ex(GPUBatch *, GPUVertBuf *, bool own_vbo)
#define GPU_batch_init(batch, prim, verts, elem)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
void GPU_uniform_attr_list_copy(GPUUniformAttrList *dest, GPUUniformAttrList *src)
struct GHash * GPU_uniform_attr_list_hash_new(const char *info)
void GPU_uniform_attr_list_free(GPUUniformAttrList *set)
uint GPU_vertbuf_get_vertex_alloc(const GPUVertBuf *verts)
struct GPUVertBuf GPUVertBuf
GPUVertBuf * GPU_vertbuf_calloc(void)
void GPU_vertbuf_handle_ref_remove(GPUVertBuf *verts)
void GPU_vertbuf_data_alloc(GPUVertBuf *, uint v_len)
void GPU_vertbuf_init_with_format_ex(GPUVertBuf *, const GPUVertFormat *, GPUUsageType)
@ GPU_VERTBUF_DATA_UPLOADED
GPUVertBufStatus GPU_vertbuf_get_status(const GPUVertBuf *verts)
#define GPU_VERTBUF_DISCARD_SAFE(verts)
void GPU_vertbuf_use(GPUVertBuf *)
void GPU_vertbuf_data_len_set(GPUVertBuf *, uint v_len)
void GPU_vertbuf_handle_ref_add(GPUVertBuf *verts)
void GPU_vertbuf_data_resize(GPUVertBuf *, uint v_len)
Read Guarded memory(de)allocation.
#define MEM_recallocN(vmemh, len)
static ListBase g_idatalists
static void drw_uniform_attribute_lookup(GPUUniformAttr *attr, Object *ob, Object *dupli_parent, DupliObject *dupli_source, float r_data[4])
void DRW_instance_data_list_free(DRWInstanceDataList *idatalist)
void * DRW_instance_data_next(DRWInstanceData *idata)
static bool drw_uniform_property_lookup(ID *id, const char *name, float r_data[4])
void * DRW_sparse_uniform_buffer_ensure_item(DRWSparseUniformBuf *buffer, int chunk, int item)
static DRWInstanceData * drw_instance_data_create(DRWInstanceDataList *idatalist, uint attr_size)
static void temp_buffer_handle_free(DRWTempBufferHandle *handle)
static void temp_instancing_handle_free(DRWTempInstancingHandle *handle)
void DRW_instance_data_list_free_unused(DRWInstanceDataList *idatalist)
DRWInstanceDataList * DRW_instance_data_list_create(void)
bool DRW_sparse_uniform_buffer_is_empty(DRWSparseUniformBuf *buffer)
static void temp_batch_free(GPUBatch **batch)
DRWInstanceData * DRW_instance_data_request(DRWInstanceDataList *idatalist, uint attr_size)
DRWSparseUniformBuf * DRW_sparse_uniform_buffer_new(unsigned int item_size, unsigned int chunk_size)
static GPUUniformBuf * drw_sparse_uniform_buffer_get_ubo(DRWSparseUniformBuf *buffer, int chunk)
struct DRWTempBufferHandle DRWTempBufferHandle
void DRW_uniform_attrs_pool_flush_all(GHash *table)
struct DRWSparseUniformBuf DRWSparseUniformBuf
struct DRWUniformAttrBuf DRWUniformAttrBuf
static void DRW_instance_data_free(DRWInstanceData *idata)
GHash * DRW_uniform_attrs_pool_new()
void DRW_instance_buffer_finish(DRWInstanceDataList *idatalist)
void DRW_sparse_uniform_buffer_free(DRWSparseUniformBuf *buffer)
GPUVertBuf * DRW_temp_buffer_request(DRWInstanceDataList *idatalist, GPUVertFormat *format, int *vert_len)
static DRWUniformAttrBuf * drw_uniform_attrs_pool_ensure(GHash *table, GPUUniformAttrList *key)
void DRW_uniform_attrs_pool_clear_all(GHash *table)
static void drw_uniform_attrs_pool_free_cb(void *ptr)
static void instancing_batch_references_add(GPUBatch *batch)
static void drw_sparse_uniform_buffer_init(DRWSparseUniformBuf *buffer, unsigned int item_size, unsigned int chunk_size)
DRWSparseUniformBuf * DRW_uniform_attrs_pool_find_ubo(GHash *table, struct GPUUniformAttrList *key)
void DRW_sparse_uniform_buffer_unbind(DRWSparseUniformBuf *buffer, int chunk)
GPUBatch * DRW_temp_batch_instance_request(DRWInstanceDataList *idatalist, GPUVertBuf *buf, GPUBatch *instancer, GPUBatch *geom)
void drw_uniform_attrs_pool_update(GHash *table, GPUUniformAttrList *key, DRWResourceHandle *handle, Object *ob, Object *dupli_parent, DupliObject *dupli_source)
GPUBatch * DRW_temp_batch_request(DRWInstanceDataList *idatalist, GPUVertBuf *buf, GPUPrimType prim_type)
void DRW_sparse_uniform_buffer_bind(DRWSparseUniformBuf *buffer, int chunk, int location)
struct DRWTempInstancingHandle DRWTempInstancingHandle
void DRW_instance_data_list_reset(DRWInstanceDataList *idatalist)
void DRW_sparse_uniform_buffer_clear(DRWSparseUniformBuf *buffer, bool free_all)
void DRW_sparse_uniform_buffer_flush(DRWSparseUniformBuf *buffer)
static void instancing_batch_references_remove(GPUBatch *batch)
void DRW_instance_data_list_resize(DRWInstanceDataList *idatalist)
void DRW_uniform_attrs_pool_free(GHash *table)
#define DRW_BUFFER_VERTS_CHUNK
#define MAX_INSTANCE_DATA_SIZE
BLI_INLINE uint32_t DRW_handle_chunk_get(const DRWResourceHandle *handle)
#define DRW_RESOURCE_CHUNK_LEN
BLI_INLINE uint32_t DRW_handle_id_get(const DRWResourceHandle *handle)
uint32_t DRWResourceHandle
ccl_global float * buffer
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
static const int chunk_size
float RNA_property_float_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
PropertyType RNA_property_type(PropertyRNA *prop)
int RNA_property_int_get(PointerRNA *ptr, PropertyRNA *prop)
int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_path_resolve(const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
struct DRWInstanceDataList * next
BLI_memblock * pool_batching
DRWInstanceData * idata_tail[MAX_INSTANCE_DATA_SIZE]
DRWInstanceData * idata_head[MAX_INSTANCE_DATA_SIZE]
struct DRWInstanceDataList * prev
BLI_memblock * pool_buffers
BLI_memblock * pool_instancing
struct DRWInstanceData * next
struct ParticleSystem * particle_system