42 #define MDI_ENABLED (buffer_size_ != 0)
43 #define MDI_DISABLED (buffer_size_ == 0)
44 #define MDI_INDEXED (base_index_ != UINT_MAX)
66 data_offset_ = buffer_size_;
74 void GLDrawList::init()
82 if (buffer_id_ == 0) {
84 glGenBuffers(1, &buffer_id_);
88 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, buffer_id_);
91 if (data_offset_ + command_size > buffer_size_) {
92 glBufferData(GL_DRAW_INDIRECT_BUFFER, buffer_size_,
nullptr, GL_DYNAMIC_DRAW);
96 GLbitfield flag = GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_FLUSH_EXPLICIT_BIT;
97 data_size_ = buffer_size_ - data_offset_;
98 data_ = (GLbyte *)glMapBufferRange(GL_DRAW_INDIRECT_BUFFER, data_offset_, data_size_, flag);
110 if (data_ ==
nullptr) {
115 if (
batch != batch_) {
149 command_offset_ += command_size;
153 if (command_offset_ + command_size > data_size_) {
160 if (command_len_ == 0) {
173 const bool is_finishing_a_buffer = (command_offset_ + command_size > data_size_);
174 if (command_len_ > 2 || is_finishing_a_buffer) {
175 GLenum prim =
to_gl(batch_->prim_type);
176 void *
offset = (
void *)data_offset_;
178 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, buffer_id_);
179 glFlushMappedBufferRange(GL_DRAW_INDIRECT_BUFFER, 0, command_offset_);
180 glUnmapBuffer(GL_DRAW_INDIRECT_BUFFER);
182 data_offset_ += command_offset_;
188 glMultiDrawElementsIndirect(prim, gl_type,
offset, command_len_, 0);
191 glMultiDrawArraysIndirect(prim,
offset, command_len_, 0);
198 for (
int i = 0; i < command_len_; i++, cmd++) {
208 for (
int i = 0; i < command_len_; i++, cmd++) {
void GPU_batch_draw_advanced(GPUBatch *, int v_first, int v_count, int i_first, int i_count)
GLIndexBuf * elem_() const
void draw(int v_first, int v_count, int i_first, int i_count) override
static void buf_free(GLuint buf_id)
static bool multi_draw_indirect_support
void append(GPUBatch *batch, int i_first, int i_count) override
GPUIndexBufType index_type_
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
static GLenum to_gl(const GPUAttachmentType type)
T length(const vec_base< T, Size > &a)