GL: Reworked Buffer (re)creation

This commit is contained in:
korenkonder
2025-11-14 01:13:36 +03:00
parent 1bf057dc89
commit 5fabbbbcd4
14 changed files with 325 additions and 166 deletions
+63 -33
View File
@@ -8,43 +8,66 @@
#include "../gl_state.hpp"
namespace GL {
void ArrayBuffer::Create(gl_state_struct& gl_st, size_t size) {
if (buffer)
void ArrayBuffer::Create(gl_state_struct& gl_st, size_t size, BufferUsage usage) {
if (buffer || !BufferUsageCheck(usage, false))
return;
if (usage != BUFFER_USAGE_STREAM) {
if (GLAD_GL_VERSION_4_4) {
GLbitfield flags = GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, flags);
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_array_buffer(buffer, true);
glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size, 0, flags);
}
return;
}
}
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_array_buffer(buffer);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size,
0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
else
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW);
gl_st.bind_array_buffer(buffer, true);
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
}
}
void ArrayBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) {
if (buffer)
void ArrayBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) {
if (buffer || !BufferUsageCheck(usage))
return;
if (usage != BUFFER_USAGE_STREAM) {
if (GLAD_GL_VERSION_4_4) {
GLbitfield flags = usage == BUFFER_USAGE_DYNAMIC
? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, data, flags);
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_array_buffer(buffer, true);
glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, flags);
}
return;
}
}
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_array_buffer(buffer);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
else
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
gl_st.bind_array_buffer(buffer, true);
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
}
}
@@ -103,32 +126,39 @@ namespace GL {
return 0;
}
void ArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size) {
if (GLAD_GL_VERSION_4_4) {
void ArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage) {
if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) {
Destroy();
Create(gl_st, size);
Create(gl_st, size, usage);
}
else {
if (!buffer)
Create(gl_st, size);
Create(gl_st, size, usage);
gl_st.bind_array_buffer(buffer, true);
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW);
if (GLAD_GL_VERSION_4_5)
glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
else {
gl_st.bind_array_buffer(buffer);
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
}
}
}
void ArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) {
if (GLAD_GL_VERSION_4_4) {
void ArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) {
if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) {
Destroy();
Create(gl_st, size, data, dynamic);
Create(gl_st, size, data, usage);
}
else {
if (!buffer)
Create(gl_st, size);
Create(gl_st, size, data, usage);
gl_st.bind_array_buffer(buffer, true);
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
if (GLAD_GL_VERSION_4_5)
glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
else {
gl_st.bind_array_buffer(buffer);
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
}
}
}
+5 -4
View File
@@ -7,6 +7,7 @@
#include "../../KKdLib/default.hpp"
#include "../gl.hpp"
#include "buffer.hpp"
struct gl_state_struct;
struct p_gl_rend_state;
@@ -29,13 +30,13 @@ namespace GL {
}
void Create(gl_state_struct& gl_st, size_t size);
void Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false);
void Create(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM);
void Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC);
void Destroy();
void* MapMemory(gl_state_struct& gl_st);
void* MapMemory(p_gl_rend_state& p_gl_rend_st);
void Recreate(gl_state_struct& gl_st, size_t size);
void Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false);
void Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM);
void Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC);
void UnmapMemory(gl_state_struct& gl_st);
void UnmapMemory(p_gl_rend_state& p_gl_rend_st);
void WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data);
+33
View File
@@ -0,0 +1,33 @@
/*
by korenkonder
GitHub/GitLab: korenkonder
*/
#pragma once
#include "../../KKdLib/default.hpp"
#include "../gl.hpp"
namespace GL {
enum BufferUsage {
BUFFER_USAGE_STREAM = 0,
BUFFER_USAGE_STATIC,
BUFFER_USAGE_DYNAMIC,
};
inline GLenum BufferUsageToGLenum(const BufferUsage usage) {
if (usage == BUFFER_USAGE_STREAM)
return GL_STREAM_DRAW;
else if (usage == BUFFER_USAGE_STATIC)
return GL_STATIC_DRAW;
else if (usage == BUFFER_USAGE_DYNAMIC)
return GL_DYNAMIC_DRAW;
else
return GL_NONE;
}
inline bool BufferUsageCheck(const BufferUsage usage, bool with_static = true) {
return usage == BUFFER_USAGE_STREAM || with_static && usage == BUFFER_USAGE_STATIC
|| usage == BUFFER_USAGE_DYNAMIC;
}
}
+61 -31
View File
@@ -8,43 +8,66 @@
#include "../gl_state.hpp"
namespace GL {
void ElementArrayBuffer::Create(gl_state_struct& gl_st, size_t size) {
if (buffer)
void ElementArrayBuffer::Create(gl_state_struct& gl_st, size_t size, BufferUsage usage) {
if (buffer || !BufferUsageCheck(usage, false))
return;
if (usage != BUFFER_USAGE_STREAM) {
if (GLAD_GL_VERSION_4_4) {
GLbitfield flags = GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, flags);
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_element_array_buffer(buffer, true);
glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, 0, flags);
}
return;
}
}
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_element_array_buffer(buffer, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size,
0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
else
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
}
}
void ElementArrayBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) {
if (buffer)
void ElementArrayBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) {
if (buffer || !BufferUsageCheck(usage))
return;
if (usage != BUFFER_USAGE_STREAM) {
if (GLAD_GL_VERSION_4_4) {
GLbitfield flags = usage == BUFFER_USAGE_DYNAMIC
? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, data, flags);
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_element_array_buffer(buffer, true);
glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data, flags);
}
return;
}
}
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_element_array_buffer(buffer, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
else
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
}
}
@@ -103,32 +126,39 @@ namespace GL {
return 0;
}
void ElementArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size) {
if (GLAD_GL_VERSION_4_4) {
void ElementArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage) {
if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) {
Destroy();
Create(gl_st, size);
Create(gl_st, size, usage);
}
else {
if (!buffer)
Create(gl_st, size);
Create(gl_st, size, usage);
gl_st.bind_element_array_buffer(buffer, true);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW);
if (GLAD_GL_VERSION_4_5)
glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
else {
gl_st.bind_element_array_buffer(buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
}
}
}
void ElementArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) {
if (GLAD_GL_VERSION_4_4) {
void ElementArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) {
if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) {
Destroy();
Create(gl_st, size, data, dynamic);
Create(gl_st, size, data, usage);
}
else {
if (!buffer)
Create(gl_st, size);
Create(gl_st, size, data, usage);
gl_st.bind_element_array_buffer(buffer, true);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
if (GLAD_GL_VERSION_4_5)
glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
else {
gl_st.bind_element_array_buffer(buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
}
}
}
+5 -4
View File
@@ -7,6 +7,7 @@
#include "../../KKdLib/default.hpp"
#include "../gl.hpp"
#include "buffer.hpp"
struct gl_state_struct;
struct p_gl_rend_state;
@@ -29,13 +30,13 @@ namespace GL {
}
void Create(gl_state_struct& gl_st, size_t size);
void Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false);
void Create(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM);
void Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC);
void Destroy();
void* MapMemory(gl_state_struct& gl_st);
void* MapMemory(p_gl_rend_state& p_gl_rend_st);
void Recreate(gl_state_struct& gl_st, size_t size);
void Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false);
void Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM);
void Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC);
void UnmapMemory(gl_state_struct& gl_st);
void UnmapMemory(p_gl_rend_state& p_gl_rend_st);
void WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data);
+61 -31
View File
@@ -8,43 +8,66 @@
#include "../gl_state.hpp"
namespace GL {
void ShaderStorageBuffer::Create(gl_state_struct& gl_st, size_t size) {
if (buffer)
void ShaderStorageBuffer::Create(gl_state_struct& gl_st, size_t size, BufferUsage usage) {
if (buffer || !BufferUsageCheck(usage, false))
return;
if (usage != BUFFER_USAGE_STREAM) {
if (GLAD_GL_VERSION_4_4) {
GLbitfield flags = GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, flags);
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_shader_storage_buffer(buffer, true);
glBufferStorage(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, 0, flags);
}
return;
}
}
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_shader_storage_buffer(buffer, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size,
0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
else
glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW);
glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
}
}
void ShaderStorageBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) {
if (buffer)
void ShaderStorageBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) {
if (buffer || !BufferUsageCheck(usage))
return;
if (usage != BUFFER_USAGE_STREAM) {
if (GLAD_GL_VERSION_4_4) {
GLbitfield flags = usage == BUFFER_USAGE_DYNAMIC
? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, data, flags);
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_shader_storage_buffer(buffer, true);
glBufferStorage(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, flags);
}
return;
}
}
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_shader_storage_buffer(buffer, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
else
glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
}
}
@@ -103,32 +126,39 @@ namespace GL {
return 0;
}
void ShaderStorageBuffer::Recreate(gl_state_struct& gl_st, size_t size) {
if (GLAD_GL_VERSION_4_4) {
void ShaderStorageBuffer::Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage) {
if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) {
Destroy();
Create(gl_st, size);
Create(gl_st, size, usage);
}
else {
if (!buffer)
Create(gl_st, size);
Create(gl_st, size, usage);
gl_st.bind_shader_storage_buffer(buffer, true);
glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW);
if (GLAD_GL_VERSION_4_5)
glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
else {
gl_st.bind_shader_storage_buffer(buffer);
glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
}
}
}
void ShaderStorageBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) {
if (GLAD_GL_VERSION_4_4) {
void ShaderStorageBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) {
if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) {
Destroy();
Create(gl_st, size, data, dynamic);
Create(gl_st, size, data, usage);
}
else {
if (!buffer)
Create(gl_st, size);
Create(gl_st, size, data, usage);
gl_st.bind_shader_storage_buffer(buffer, true);
glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
if (GLAD_GL_VERSION_4_5)
glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
else {
gl_st.bind_shader_storage_buffer(buffer);
glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
}
}
}
+5 -4
View File
@@ -7,6 +7,7 @@
#include "../../KKdLib/default.hpp"
#include "../gl.hpp"
#include "buffer.hpp"
struct gl_state_struct;
struct p_gl_rend_state;
@@ -29,13 +30,13 @@ namespace GL {
}
void Create(gl_state_struct& gl_st, size_t size);
void Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false);
void Create(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM);
void Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC);
void Destroy();
void* MapMemory(gl_state_struct& gl_st);
void* MapMemory(p_gl_rend_state& p_gl_rend_st);
void Recreate(gl_state_struct& gl_st, size_t size);
void Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false);
void Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM);
void Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC);
void UnmapMemory(gl_state_struct& gl_st);
void UnmapMemory(p_gl_rend_state& p_gl_rend_st);
void WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data);
+61 -31
View File
@@ -8,43 +8,66 @@
#include "../gl_state.hpp"
namespace GL {
void UniformBuffer::Create(gl_state_struct& gl_st, size_t size) {
if (buffer)
void UniformBuffer::Create(gl_state_struct& gl_st, size_t size, BufferUsage usage) {
if (buffer || !BufferUsageCheck(usage, false))
return;
if (usage != BUFFER_USAGE_STREAM) {
if (GLAD_GL_VERSION_4_4) {
GLbitfield flags = GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, flags);
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_uniform_buffer(buffer, true);
glBufferStorage(GL_UNIFORM_BUFFER, (GLsizeiptr)size, 0, flags);
}
return;
}
}
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_uniform_buffer(buffer, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_UNIFORM_BUFFER, (GLsizeiptr)size,
0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT);
else
glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW);
glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
}
}
void UniformBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) {
if (buffer)
void UniformBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) {
if (buffer || !BufferUsageCheck(usage))
return;
if (usage != BUFFER_USAGE_STREAM) {
if (GLAD_GL_VERSION_4_4) {
GLbitfield flags = usage == BUFFER_USAGE_DYNAMIC
? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0;
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, data, flags);
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_uniform_buffer(buffer, true);
glBufferStorage(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, flags);
}
return;
}
}
if (GLAD_GL_VERSION_4_5) {
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
}
else {
glGenBuffers(1, &buffer);
gl_st.bind_uniform_buffer(buffer, true);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
else
glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
}
}
@@ -103,32 +126,39 @@ namespace GL {
return 0;
}
void UniformBuffer::Recreate(gl_state_struct& gl_st, size_t size) {
if (GLAD_GL_VERSION_4_4) {
void UniformBuffer::Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage) {
if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) {
Destroy();
Create(gl_st, size);
Create(gl_st, size, usage);
}
else {
if (!buffer)
Create(gl_st, size);
Create(gl_st, size, usage);
gl_st.bind_uniform_buffer(buffer, true);
glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW);
if (GLAD_GL_VERSION_4_5)
glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage));
else {
gl_st.bind_uniform_buffer(buffer);
glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, 0, usage);
}
}
}
void UniformBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) {
if (GLAD_GL_VERSION_4_4) {
void UniformBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) {
if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) {
Destroy();
Create(gl_st, size, data, dynamic);
Create(gl_st, size, data, usage);
}
else {
if (!buffer)
Create(gl_st, size);
Create(gl_st, size, data, usage);
gl_st.bind_uniform_buffer(buffer, true);
glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
if (GLAD_GL_VERSION_4_5)
glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
else {
gl_st.bind_uniform_buffer(buffer);
glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
}
}
}
+5 -4
View File
@@ -7,6 +7,7 @@
#include "../../KKdLib/default.hpp"
#include "../gl.hpp"
#include "buffer.hpp"
struct gl_state_struct;
struct p_gl_rend_state;
@@ -29,13 +30,13 @@ namespace GL {
}
void Create(gl_state_struct& gl_st, size_t size);
void Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false);
void Create(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM);
void Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC);
void Destroy();
void* MapMemory(gl_state_struct& gl_st);
void* MapMemory(p_gl_rend_state& p_gl_rend_st);
void Recreate(gl_state_struct& gl_st, size_t size);
void Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false);
void Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM);
void Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC);
void UnmapMemory(gl_state_struct& gl_st);
void UnmapMemory(p_gl_rend_state& p_gl_rend_st);
void WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data);
+8 -8
View File
@@ -43,9 +43,9 @@ struct EffectStorage {
}
void Create(gl_state_struct& gl_st, size_t size, size_t count,
const EffectStorageAttrib* attribs);
const EffectStorageAttrib* attribs, GL::BufferUsage usage = GL::BUFFER_USAGE_STREAM);
void Create(gl_state_struct& gl_st, size_t size, size_t count,
const EffectStorageAttrib* attribs, const void* data, bool dynamic = false);
const EffectStorageAttrib* attribs, const void* data, GL::BufferUsage usage = GL::BUFFER_USAGE_STATIC);
void Destroy();
inline void Bind(p_gl_rend_state& p_gl_rend_st, int32_t index) {
@@ -1767,9 +1767,9 @@ bool effect_manager_unload() {
}
void EffectStorage::Create(gl_state_struct& gl_st, size_t size, size_t count,
const EffectStorageAttrib* attribs) {
const EffectStorageAttrib* attribs, GL::BufferUsage usage) {
if (GLAD_GL_VERSION_4_3) {
ssbo.Create(gl_st, size * count);
ssbo.Create(gl_st, size * count, usage);
return;
}
else if (vao || !attribs)
@@ -1778,7 +1778,7 @@ void EffectStorage::Create(gl_state_struct& gl_st, size_t size, size_t count,
glGenVertexArrays(1, &vao);
gl_st.bind_vertex_array(vao, true);
vbo.Create(gl_st, size * count);
vbo.Create(gl_st, size * count, usage);
gl_st.bind_array_buffer(vbo, true);
const EffectStorageAttrib* attrib = attribs;
@@ -1795,9 +1795,9 @@ void EffectStorage::Create(gl_state_struct& gl_st, size_t size, size_t count,
}
void EffectStorage::Create(gl_state_struct& gl_st, size_t size, size_t count,
const EffectStorageAttrib* attribs, const void* data, bool dynamic) {
const EffectStorageAttrib* attribs, const void* data, GL::BufferUsage usage) {
if (GLAD_GL_VERSION_4_3) {
ssbo.Create(gl_st, size * count, data, dynamic);
ssbo.Create(gl_st, size * count, data, usage);
return;
}
else if (vao || !attribs)
@@ -1806,7 +1806,7 @@ void EffectStorage::Create(gl_state_struct& gl_st, size_t size, size_t count,
glGenVertexArrays(1, &vao);
gl_st.bind_vertex_array(vao, true);
vbo.Create(gl_st, size * count, data, true);
vbo.Create(gl_st, size * count, data, usage);
gl_st.bind_array_buffer(vbo, true);
const EffectStorageAttrib* attrib = attribs;
+12 -11
View File
@@ -29,7 +29,7 @@ struct BufObjMgr {
};
static GLuint create_index_buffer(size_t size, const void* data);
static GLuint create_vertex_buffer(size_t size, const void* data, bool dynamic = false);
static GLuint create_vertex_buffer(size_t size, const void* data, GL::BufferUsage usage = GL::BUFFER_USAGE_STATIC);
static void free_index_buffer(GLuint buffer);
static void free_vertex_buffer(GLuint buffer);
@@ -171,7 +171,7 @@ GLsizeiptr obj_mesh_vertex_buffer::get_size() {
return 0;
}
bool obj_mesh_vertex_buffer::load(obj_mesh& mesh, bool dynamic) {
bool obj_mesh_vertex_buffer::load(obj_mesh& mesh, GL::BufferUsage usage) {
if (!mesh.num_vertex || !mesh.vertex_array)
return false;
@@ -194,12 +194,12 @@ bool obj_mesh_vertex_buffer::load(obj_mesh& mesh, bool dynamic) {
mesh.size_vertex = size_vertex;
bool ret = load_data((size_t)size_vertex * mesh.num_vertex,
vertex, mesh.attrib.m.double_buffer ? 2 : 1, dynamic);
vertex, mesh.attrib.m.double_buffer ? 2 : 1, usage);
free_def(vertex);
return ret;
}
bool obj_mesh_vertex_buffer::load_data(size_t size, const void* data, int32_t count, bool dynamic) {
bool obj_mesh_vertex_buffer::load_data(size_t size, const void* data, int32_t count, GL::BufferUsage usage) {
if (!size || count > 3)
return false;
@@ -210,7 +210,7 @@ bool obj_mesh_vertex_buffer::load_data(size_t size, const void* data, int32_t co
#endif
for (int32_t i = 0; i < count; i++) {
buffers[i] = create_vertex_buffer(size, data, dynamic);
buffers[i] = create_vertex_buffer(size, data, usage);
if (!buffers[i]) {
unload();
return false;
@@ -2433,16 +2433,17 @@ static GLuint create_index_buffer(size_t size, const void* data) {
return buffer;
}
static GLuint create_vertex_buffer(size_t size, const void* data, bool dynamic) {
static GLuint create_vertex_buffer(size_t size, const void* data, GL::BufferUsage usage) {
GLuint buffer = 0;
glGenBuffers(1, &buffer);
gl_state.bind_array_buffer(buffer);
if (GLAD_GL_VERSION_4_4)
glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0);
if (GLAD_GL_VERSION_4_4 && usage != GL::BUFFER_USAGE_STREAM) {
GLbitfield flags = usage == GL::BUFFER_USAGE_DYNAMIC
? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0;
glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, flags);
}
else
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data,
dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage));
gl_state.bind_array_buffer(0);
if (glGetError()) {
+3 -2
View File
@@ -13,6 +13,7 @@
#include "../KKdLib/obj.hpp"
#include "../KKdLib/txp.hpp"
#include "../KKdLib/vec.hpp"
#include "GL/buffer.hpp"
#include "file_handler.hpp"
#include "static_var.hpp"
#include "texture.hpp"
@@ -46,8 +47,8 @@ struct obj_mesh_vertex_buffer {
GLuint get_buffer();
size_t get_offset();
GLsizeiptr get_size();
bool load(obj_mesh& mesh, bool dynamic = false);
bool load_data(size_t size, const void* data, int32_t count, bool dynamic);
bool load(obj_mesh& mesh, GL::BufferUsage usage = GL::BUFFER_USAGE_STATIC);
bool load_data(size_t size, const void* data, int32_t count, GL::BufferUsage usage = GL::BUFFER_USAGE_STATIC);
void unload();
static void* fill_data(void* data, obj_mesh& mesh);
+2 -2
View File
@@ -1626,14 +1626,14 @@ void RobCloth::InitData(size_t root_count, size_t nodes_count, obj_skin_block_cl
}
this->index_buffer[0] = index_buffer[mesh_name_index];
if (!vertex_buffer[0].load(mesh[0], true))
if (!vertex_buffer[0].load(mesh[0], GL::BUFFER_USAGE_STREAM))
return;
this->index_buffer[1] = {};
if (cls_data->backface_mesh_name && backface_mesh_name_index != -1)
this->index_buffer[1] = index_buffer[backface_mesh_name_index];
if (cls_data->backface_mesh_name && !vertex_buffer[1].load(mesh[1], true))
if (cls_data->backface_mesh_name && !vertex_buffer[1].load(mesh[1], GL::BUFFER_USAGE_STREAM))
return;
flags = (((flags ^ (0x04 * loop)) & 0x04) ^ flags) | 0x03;
+1 -1
View File
@@ -18838,7 +18838,7 @@ void rob_chara_age_age_object::load(object_info obj_info, int32_t count) {
vtx_data->texcoord = vertex_array[k].texcoord0;
}
obj_vert_buf.load_data(vertex_data_size, vertex_data, 2, true);
obj_vert_buf.load_data(vertex_data_size, vertex_data, 2, GL::BUFFER_USAGE_STREAM);
this->num_index = num_index + 1;
int32_t num_idx_data = (int32_t)(count * (num_index + 1));