61 #define MDI_ENABLED (buffer_size_ != 0)
62 #define MDI_DISABLED (buffer_size_ == 0)
63 #define MDI_INDEXED (base_index_ != UINT_MAX)
85 data_offset_ = buffer_size_;
93 void GLDrawList::init()
101 if (buffer_id_ == 0) {
103 glGenBuffers(1, &buffer_id_);
107 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, buffer_id_);
110 if (data_offset_ + command_size > buffer_size_) {
111 glBufferData(GL_DRAW_INDIRECT_BUFFER, buffer_size_,
nullptr, GL_DYNAMIC_DRAW);
115 GLbitfield flag = GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_FLUSH_EXPLICIT_BIT;
116 data_size_ = buffer_size_ - data_offset_;
117 data_ = (GLbyte *)glMapBufferRange(GL_DRAW_INDIRECT_BUFFER, data_offset_, data_size_, flag);
129 if (data_ ==
nullptr) {
134 if (
batch != batch_) {
168 command_offset_ += command_size;
172 if (command_offset_ + command_size > data_size_) {
179 if (command_len_ == 0) {
192 const bool is_finishing_a_buffer = (command_offset_ + command_size > data_size_);
193 if (command_len_ > 2 || is_finishing_a_buffer) {
194 GLenum prim =
to_gl(batch_->prim_type);
195 void *offset = (
void *)data_offset_;
197 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, buffer_id_);
198 glFlushMappedBufferRange(GL_DRAW_INDIRECT_BUFFER, 0, command_offset_);
199 glUnmapBuffer(GL_DRAW_INDIRECT_BUFFER);
201 data_offset_ += command_offset_;
207 glMultiDrawElementsIndirect(prim, gl_type, offset, command_len_, 0);
210 glMultiDrawArraysIndirect(prim, offset, command_len_, 0);
217 for (
int i = 0; i < command_len_; i++, cmd++) {
227 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)
SIMD_FORCE_INLINE btScalar length(const btQuaternion &q)
Return the length of a quaternion.
void draw(int v_first, int v_count, int i_first, int i_count) override
GLIndexBuf * elem_(void) const
static void buf_free(GLuint buf_id)
static bool multi_draw_indirect_support
void submit(void) override
void append(GPUBatch *batch, int i_first, int i_count) override
GPUIndexBufType index_type_
void KERNEL_FUNCTION_FULL_NAME() shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int filter, int i, int offset, int sample)
static GLenum to_gl(const GPUAttachmentType type)