taisei/src/renderer/gl33/common_buffer.h
2024-05-17 04:58:47 +02:00

77 lines
2.2 KiB
C

/*
* This software is licensed under the terms of the MIT License.
* See COPYING for further information.
* ---
* Copyright (c) 2011-2024, Lukas Weber <laochailan@web.de>.
* Copyright (c) 2012-2024, Andrei Alexeyev <akari@taisei-project.org>.
*/
#pragma once
#include "taisei.h"
#include "opengl.h"
#include "../api.h"
typedef struct CommonBuffer CommonBuffer;
struct CommonBuffer {
union {
SDL_RWops stream;
struct {
char padding[offsetof(SDL_RWops, hidden)];
struct {
char *buffer;
size_t update_begin;
size_t update_end;
} cache;
size_t offset;
size_t size;
size_t commited_size;
GLuint gl_handle;
GLuint gl_usage_hint;
uint bindidx;
char debug_label[R_DEBUG_LABEL_SIZE];
void (*pre_bind)(CommonBuffer *self);
void (*post_bind)(CommonBuffer *self);
};
};
};
static_assert(
offsetof(CommonBuffer, stream) == 0,
"stream should be the first member in CommonBuffer for simplicity"
);
CommonBuffer *gl33_buffer_create(uint bindidx, size_t alloc_size);
void gl33_buffer_init_cache(CommonBuffer *cbuf, size_t capacity);
void gl33_buffer_init(CommonBuffer *cbuf, size_t capacity, void *data, GLenum usage_hint);
void gl33_buffer_destroy(CommonBuffer *cbuf);
void gl33_buffer_invalidate(CommonBuffer *cbuf);
void gl33_buffer_resize(CommonBuffer *cbuf, size_t new_size);
SDL_RWops *gl33_buffer_get_stream(CommonBuffer *cbuf);
void gl33_buffer_flush(CommonBuffer *cbuf);
#define GL33_BUFFER_TEMP_BIND(cbuf, code) do { \
CommonBuffer *_tempbind_cbuf = (cbuf); \
attr_unused BufferBindingIndex _tempbind_bindidx = 0; \
attr_unused GLuint _tempbind_buf_saved = 0; \
if(_tempbind_cbuf->pre_bind != NULL) { \
assume(_tempbind_cbuf->post_bind != NULL); \
_tempbind_cbuf->pre_bind(cbuf); \
} else { \
_tempbind_bindidx = _tempbind_cbuf->bindidx; \
_tempbind_buf_saved = gl33_buffer_current(_tempbind_bindidx); \
gl33_bind_buffer(_tempbind_bindidx, _tempbind_cbuf->gl_handle); \
gl33_sync_buffer(_tempbind_bindidx); \
} \
{ code } \
if(_tempbind_cbuf->post_bind != NULL) { \
assume(_tempbind_cbuf->pre_bind != NULL); \
_tempbind_cbuf->post_bind(cbuf); \
} else { \
gl33_bind_buffer(_tempbind_bindidx, _tempbind_buf_saved); \
} \
} while(0)