43#define MDI_ENABLED (buffer_size_ != 0)
44#define MDI_DISABLED (buffer_size_ == 0)
45#define MDI_INDEXED (base_index_ != UINT_MAX)
67 data_offset_ = buffer_size_;
75void GLDrawList::init()
83 if (buffer_id_ == 0) {
85 glGenBuffers(1, &buffer_id_);
89 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, buffer_id_);
92 if (data_offset_ + command_size > buffer_size_) {
93 glBufferData(GL_DRAW_INDIRECT_BUFFER, buffer_size_,
nullptr, GL_DYNAMIC_DRAW);
97 GLbitfield
flag = GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_FLUSH_EXPLICIT_BIT;
98 data_size_ = buffer_size_ - data_offset_;
99 data_ = (GLbyte *)glMapBufferRange(GL_DRAW_INDIRECT_BUFFER, data_offset_, data_size_,
flag);
111 if (data_ ==
nullptr) {
116 if (
batch != batch_) {
150 command_offset_ += command_size;
154 if (command_offset_ + command_size > data_size_) {
161 if (command_len_ == 0) {
174 const bool is_finishing_a_buffer = (command_offset_ + command_size > data_size_);
175 if (command_len_ > 2 || is_finishing_a_buffer) {
176 GLenum prim =
to_gl(batch_->prim_type);
177 void *offset = (
void *)data_offset_;
179 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, buffer_id_);
180 glFlushMappedBufferRange(GL_DRAW_INDIRECT_BUFFER, 0, command_offset_);
181 glUnmapBuffer(GL_DRAW_INDIRECT_BUFFER);
183 data_offset_ += command_offset_;
189 glMultiDrawElementsIndirect(prim, gl_type, offset, command_len_, 0);
192 glMultiDrawArraysIndirect(prim, offset, command_len_, 0);
199 for (
int i = 0; i < command_len_; i++, cmd++) {
209 for (
int i = 0; i < command_len_; i++, cmd++) {
void GPU_batch_draw_advanced(blender::gpu::Batch *batch, int vertex_first, int vertex_count, int instance_first, int instance_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(Batch *batch, int i_first, int i_count) override
GPUIndexBufType index_type_
static GLenum to_gl(const GPUAttachmentType type)