112 if (handle->format !=
format) {
122 handle->vert_len = vert_len;
128 blender::gpu::Batch *instancer,
129 blender::gpu::Batch *geom)
134 BLI_assert((instancer !=
nullptr) != (buf !=
nullptr));
138 if (handle->batch ==
nullptr) {
142 blender::gpu::Batch *
batch = handle->batch;
143 bool instancer_compat = buf ? ((
batch->inst[0] == buf) &&
145 ((
batch->inst[0] == instancer->verts[0]) &&
146 (
batch->inst[1] == instancer->verts[1]));
147 bool is_compatible = (
batch->prim_type == geom->prim_type) && instancer_compat &&
150 if (
batch->verts[i] != geom->verts[i]) {
151 is_compatible =
false;
155 if (!is_compatible) {
161 handle->instancer = instancer;
171 blender::gpu::Batch **batch_ptr =
static_cast<blender::gpu::Batch **
>(
173 if (*batch_ptr ==
nullptr) {
177 blender::gpu::Batch *
batch = *batch_ptr;
178 bool is_compatible = (
batch->verts[0] == buf) && (
batch->prim_type == prim_type) &&
180 if (!is_compatible) {
189 handle->format =
nullptr;
211 if (handle->vert_len !=
nullptr) {
212 uint vert_len = *(handle->vert_len);
227 blender::gpu::Batch *
batch = handle_inst->
batch;
230 blender::gpu::Batch *inst_batch = handle_inst->
instancer;
231 blender::gpu::Batch *geom = handle_inst->
geom;
233 if (inst_batch !=
nullptr) {
263 idata->
next =
nullptr;
299 for (; idata; idata = idata->
next) {
300 if (idata->
used ==
false) {
334 for (idata = idatalist->
idata_head[i]; idata; idata = next_idata) {
335 next_idata = idata->
next;
357 for (idata = idatalist->
idata_head[i]; idata; idata = idata->
next) {
370 for (idata = idatalist->
idata_head[i]; idata; idata = next_idata) {
371 next_idata = idata->
next;
372 if (idata->
used ==
false) {
398 for (idata = idatalist->
idata_head[i]; idata; idata = idata->
next) {
410#define CHUNK_LIST_STEP (1 << 4)
448 for (
int i = 0; i < buffer->
num_chunks; i++) {
460 int max_used_chunk = 0;
462 for (
int i = 0; i < buffer->
num_chunks; i++) {
473 max_used_chunk = i + 1;
478 const int old_num_chunks = buffer->
num_chunks;
493 buffer->
chunk_ubos =
static_cast<GPUUniformBuf **
>(
542 buffer->
chunk_ubos =
static_cast<GPUUniformBuf **
>(
549 if (chunk_buffer ==
nullptr) {
550 buffer->
chunk_buffers[chunk] = chunk_buffer =
static_cast<char *
>(
559 return chunk_buffer + buffer->
item_size * item;
589 *pkey = &buffer->
key;
604 const Object *dupli_parent,
621 const Object *dupli_parent,
631 float(*values)[4] =
static_cast<float(*)[4]
>(
644 if (data->vlattrs_ubo_ready && data->vlattrs_ubo !=
nullptr) {
651 if (data->vlattrs_buf ==
nullptr) {
671 memcpy(item->
data, value,
sizeof(item->
data));
675 if (
count >= buf_size) {
684 if (data->vlattrs_ubo !=
nullptr) {
689 sizeof(*buffer) * buf_size, buffer,
"View Layer Attributes");
692 data->vlattrs_ubo_ready =
true;
694 return data->vlattrs_ubo;
700 return buffer ? &buffer->
ubos :
nullptr;
734 buffer->next_empty = remove_list;
735 remove_list = buffer;
740 while (remove_list) {
bool BKE_object_dupli_find_rgba_attribute(const Object *ob, const DupliObject *dupli, const Object *dupli_parent, const char *name, float r_value[4])
bool BKE_view_layer_find_rgba_attribute(const Scene *scene, const ViewLayer *layer, const char *name, float r_value[4])
#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()
#define GHASH_FOREACH_BEGIN(type, var, what)
bool BLI_ghash_remove(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
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)
void(* MemblockValFreeFP)(void *val)
void BLI_memblock_destroy(BLI_memblock *mblk, MemblockValFreeFP free_callback) ATTR_NONNULL(1)
void * BLI_memblock_alloc(BLI_memblock *mblk) ATTR_WARN_UNUSED_RESULT 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_clear(BLI_memblock *mblk, MemblockValFreeFP free_callback) ATTR_NONNULL(1)
void * BLI_memblock_iterstep(BLI_memblock_iter *iter) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void * BLI_mempool_alloc(BLI_mempool *pool) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(1)
void void BLI_mempool_clear_ex(BLI_mempool *pool, int elem_num_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
int BLI_mempool_len(const BLI_mempool *pool) ATTR_NONNULL(1)
void BLI_mempool_destroy(BLI_mempool *pool) ATTR_NONNULL(1)
#define GPU_BATCH_INST_VBO_MAX_LEN
int GPU_batch_instbuf_add(blender::gpu::Batch *batch, blender::gpu::VertBuf *vertex_buf, bool own_vbo)
void GPU_batch_clear(blender::gpu::Batch *batch)
#define GPU_BATCH_VBO_MAX_LEN
#define GPU_batch_init(batch, primitive_type, vertex_buf, index_buf)
#define GPU_BATCH_DISCARD_SAFE(batch)
void GPU_batch_copy(blender::gpu::Batch *batch_dst, blender::gpu::Batch *batch_src)
void GPU_uniform_attr_list_copy(GPUUniformAttrList *dest, const GPUUniformAttrList *src)
GHash * GPU_uniform_attr_list_hash_new(const char *info)
void GPU_uniform_attr_list_free(GPUUniformAttrList *set)
void GPU_vertbuf_handle_ref_remove(blender::gpu::VertBuf *verts)
void GPU_vertbuf_use(blender::gpu::VertBuf *)
void GPU_vertbuf_data_resize(blender::gpu::VertBuf &verts, uint v_len)
void GPU_vertbuf_handle_ref_add(blender::gpu::VertBuf *verts)
void GPU_vertbuf_data_len_set(blender::gpu::VertBuf &verts, uint v_len)
@ GPU_VERTBUF_DATA_UPLOADED
GPUVertBufStatus GPU_vertbuf_get_status(const blender::gpu::VertBuf *verts)
#define GPU_VERTBUF_DISCARD_SAFE(verts)
blender::gpu::VertBuf * GPU_vertbuf_calloc()
void GPU_vertbuf_data_alloc(blender::gpu::VertBuf &verts, uint v_len)
void GPU_vertbuf_init_with_format_ex(blender::gpu::VertBuf &verts, const GPUVertFormat &format, GPUUsageType)
uint GPU_vertbuf_get_vertex_alloc(const blender::gpu::VertBuf *verts)
Read Guarded memory(de)allocation.
#define MEM_recallocN(vmemh, len)
static ListBase g_idatalists
void DRW_instance_data_list_free(DRWInstanceDataList *idatalist)
DRWSparseUniformBuf * DRW_sparse_uniform_buffer_new(uint item_size, uint chunk_size)
static void temp_buffer_handle_free(DRWTempBufferHandle *handle)
blender::gpu::Batch * DRW_temp_batch_request(DRWInstanceDataList *idatalist, blender::gpu::VertBuf *buf, GPUPrimType prim_type)
static void temp_instancing_handle_free(DRWTempInstancingHandle *handle)
void DRW_instance_data_list_free_unused(DRWInstanceDataList *idatalist)
DRWInstanceDataList * DRW_instance_data_list_create()
bool DRW_sparse_uniform_buffer_is_empty(DRWSparseUniformBuf *buffer)
static void instancing_batch_references_remove(blender::gpu::Batch *batch)
static DRWUniformAttrBuf * drw_uniform_attrs_pool_ensure(GHash *table, const GPUUniformAttrList *key)
static GPUUniformBuf * drw_sparse_uniform_buffer_get_ubo(DRWSparseUniformBuf *buffer, int chunk)
static void instancing_batch_references_add(blender::gpu::Batch *batch)
static DRWInstanceData * drw_instance_data_create(DRWInstanceDataList *idatalist, uint attr_size)
GPUUniformBuf * drw_ensure_layer_attribute_buffer()
void DRW_uniform_attrs_pool_flush_all(GHash *table)
static void DRW_instance_data_free(DRWInstanceData *idata)
void DRW_instance_buffer_finish(DRWInstanceDataList *idatalist)
void DRW_sparse_uniform_buffer_free(DRWSparseUniformBuf *buffer)
static void drw_sparse_uniform_buffer_init(DRWSparseUniformBuf *buffer, uint item_size, uint chunk_size)
void DRW_uniform_attrs_pool_clear_all(GHash *table)
static void temp_batch_free(blender::gpu::Batch **batch)
blender::gpu::VertBuf * DRW_temp_buffer_request(DRWInstanceDataList *idatalist, GPUVertFormat *format, int *vert_len)
DRWSparseUniformBuf * DRW_uniform_attrs_pool_find_ubo(GHash *table, const GPUUniformAttrList *key)
blender::gpu::Batch * DRW_temp_batch_instance_request(DRWInstanceDataList *idatalist, blender::gpu::VertBuf *buf, blender::gpu::Batch *instancer, blender::gpu::Batch *geom)
static void drw_uniform_attrs_pool_free_cb(void *ptr)
void * DRW_instance_data_next(DRWInstanceData *idata)
void DRW_sparse_uniform_buffer_unbind(DRWSparseUniformBuf *buffer, int chunk)
void DRW_sparse_uniform_buffer_bind(DRWSparseUniformBuf *buffer, int chunk, int location)
GHash * DRW_uniform_attrs_pool_new()
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)
DRWInstanceData * DRW_instance_data_request(DRWInstanceDataList *idatalist, uint attr_size)
void * DRW_sparse_uniform_buffer_ensure_item(DRWSparseUniformBuf *buffer, int chunk, int item)
void drw_uniform_attrs_pool_update(GHash *table, const GPUUniformAttrList *key, DRWResourceHandle *handle, const Object *ob, const Object *dupli_parent, const DupliObject *dupli_source)
void DRW_instance_data_list_resize(DRWInstanceDataList *idatalist)
void DRW_uniform_attrs_pool_free(GHash *table)
static void drw_uniform_attribute_lookup(const GPUUniformAttr *attr, const Object *ob, const Object *dupli_parent, const DupliObject *dupli_source, float r_data[4])
#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
draw_view in_light_buf[] float
Batch * GPU_batch_calloc()
void *(* MEM_mallocN)(size_t len, const char *str)
void *(* MEM_calloc_arrayN)(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
GPUUniformBuf * vlattrs_ubo
BLI_memblock * pool_batching
DRWInstanceData * idata_tail[MAX_INSTANCE_DATA_SIZE]
DRWInstanceData * idata_head[MAX_INSTANCE_DATA_SIZE]
DRWInstanceDataList * next
BLI_memblock * pool_buffers
DRWInstanceDataList * prev
BLI_memblock * pool_instancing
blender::gpu::VertBuf * buf
blender::gpu::Batch * instancer
blender::gpu::VertBuf * buf
blender::gpu::Batch * batch
blender::gpu::Batch * geom