From ceedc3a3e9d98541b0d5e98b28b32661ed602f98 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Fri, 22 May 2026 14:13:15 +0300 Subject: [PATCH] Moved begin and end of Query and writes to Buffer to GL State --- src/CRE/GL/array_buffer.cpp | 96 --------- src/CRE/GL/array_buffer.hpp | 16 -- src/CRE/GL/element_array_buffer.cpp | 96 --------- src/CRE/GL/element_array_buffer.hpp | 16 -- src/CRE/GL/shader_storage_buffer.cpp | 96 --------- src/CRE/GL/shader_storage_buffer.hpp | 16 -- src/CRE/GL/uniform_buffer.cpp | 96 --------- src/CRE/GL/uniform_buffer.hpp | 16 -- src/CRE/Glitter/render_scene.cpp | 29 ++- src/CRE/Glitter/scene.cpp | 3 +- src/CRE/Vulkan/gl_wrap.cpp | 103 +++++++++- src/CRE/effect.cpp | 91 +++++---- src/CRE/gl_rend_state.cpp | 295 ++++++++++++++++++++++++++- src/CRE/gl_rend_state.hpp | 35 ++++ src/CRE/gl_state.cpp | 192 +++++++++++++++++ src/CRE/gl_state.hpp | 32 +++ src/CRE/mdl/disp_manager.cpp | 4 +- src/CRE/render.cpp | 36 ++-- src/CRE/render_context.cpp | 22 +- src/CRE/render_manager.cpp | 24 +-- src/CRE/renderer/dof.cpp | 2 +- src/CRE/renderer/transparency.cpp | 2 +- src/CRE/rob/ex_block.cpp | 6 +- src/CRE/rob/rob.cpp | 6 +- src/CRE/shader_ft.cpp | 2 +- src/CRE/sprite.cpp | 6 +- src/CRE/sss.cpp | 2 +- src/ReDIVA/app.cpp | 2 +- src/ReDIVA/x_pv_game.cpp | 2 +- 29 files changed, 777 insertions(+), 567 deletions(-) diff --git a/src/CRE/GL/array_buffer.cpp b/src/CRE/GL/array_buffer.cpp index 8aa57ebb..d926bd52 100644 --- a/src/CRE/GL/array_buffer.cpp +++ b/src/CRE/GL/array_buffer.cpp @@ -78,54 +78,6 @@ namespace GL { } } - void* ArrayBuffer::MapMemory(gl_state_struct& gl_st) { - if (!buffer) - return 0; - - void* data; - if (GLAD_GL_VERSION_4_5) - data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); - else { - gl_st.bind_array_buffer(buffer); - data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - } - - if (data) - return data; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_st.bind_array_buffer(0); - } - return 0; - } - - void* ArrayBuffer::MapMemory(p_gl_rend_state& p_gl_rend_st) { - if (!buffer) - return 0; - - void* data; - if (GLAD_GL_VERSION_4_5) - data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); - else { - p_gl_rend_st.bind_array_buffer(buffer); - data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - } - - if (data) - return data; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - p_gl_rend_st.bind_array_buffer(0); - } - return 0; - } - void ArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage) { if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) { Destroy(); @@ -161,52 +113,4 @@ namespace GL { } } } - - void ArrayBuffer::UnmapMemory(gl_state_struct& gl_st) { - if (!buffer) - return; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_st.bind_array_buffer(0); - } - } - - void ArrayBuffer::UnmapMemory(p_gl_rend_state& p_gl_rend_st) { - if (!buffer) - return; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - p_gl_rend_st.bind_array_buffer(0); - } - } - - void ArrayBuffer::WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data) { - if (!buffer || !size) - return; - - if (GLAD_GL_VERSION_4_5) - glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); - else { - gl_st.bind_array_buffer(buffer); - glBufferSubData(GL_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); - } - } - - void ArrayBuffer::WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data) { - if (!buffer || !size) - return; - - if (GLAD_GL_VERSION_4_5) - glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); - else { - p_gl_rend_st.bind_array_buffer(buffer); - glBufferSubData(GL_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); - } - } } diff --git a/src/CRE/GL/array_buffer.hpp b/src/CRE/GL/array_buffer.hpp index afe50fd6..f6a2f54a 100644 --- a/src/CRE/GL/array_buffer.hpp +++ b/src/CRE/GL/array_buffer.hpp @@ -33,14 +33,8 @@ namespace GL { 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, 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); - void WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data); inline bool IsNull() { return !buffer; @@ -50,16 +44,6 @@ namespace GL { return !!buffer; } - template - inline void WriteMemory(gl_state_struct& gl_st, T& data) { - WriteMemory(gl_st, 0, sizeof(T), &data); - } - - template - inline void WriteMemory(p_gl_rend_state& p_gl_rend_st, T& data) { - WriteMemory(p_gl_rend_st, 0, sizeof(T), &data); - } - inline operator GLuint() const { return buffer; } diff --git a/src/CRE/GL/element_array_buffer.cpp b/src/CRE/GL/element_array_buffer.cpp index 88a69975..c26fccde 100644 --- a/src/CRE/GL/element_array_buffer.cpp +++ b/src/CRE/GL/element_array_buffer.cpp @@ -78,54 +78,6 @@ namespace GL { } } - void* ElementArrayBuffer::MapMemory(gl_state_struct& gl_st) { - if (!buffer) - return 0; - - void* data; - if (GLAD_GL_VERSION_4_5) - data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); - else { - gl_st.bind_element_array_buffer(buffer); - data = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); - } - - if (data) - return data; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); - gl_st.bind_element_array_buffer(0); - } - return 0; - } - - void* ElementArrayBuffer::MapMemory(p_gl_rend_state& p_gl_rend_st) { - if (!buffer) - return 0; - - void* data; - if (GLAD_GL_VERSION_4_5) - data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); - else { - p_gl_rend_st.bind_element_array_buffer(buffer); - data = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); - } - - if (data) - return data; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); - p_gl_rend_st.bind_element_array_buffer(0); - } - return 0; - } - void ElementArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage) { if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) { Destroy(); @@ -161,52 +113,4 @@ namespace GL { } } } - - void ElementArrayBuffer::UnmapMemory(gl_state_struct& gl_st) { - if (!buffer) - return; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); - gl_st.bind_element_array_buffer(0); - } - } - - void ElementArrayBuffer::UnmapMemory(p_gl_rend_state& p_gl_rend_st) { - if (!buffer) - return; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); - p_gl_rend_st.bind_element_array_buffer(0); - } - } - - void ElementArrayBuffer::WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data) { - if (!buffer || !size) - return; - - if (GLAD_GL_VERSION_4_5) - glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); - else { - gl_st.bind_element_array_buffer(buffer); - glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); - } - } - - void ElementArrayBuffer::WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data) { - if (!buffer || !size) - return; - - if (GLAD_GL_VERSION_4_5) - glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); - else { - p_gl_rend_st.bind_element_array_buffer(buffer); - glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); - } - } } diff --git a/src/CRE/GL/element_array_buffer.hpp b/src/CRE/GL/element_array_buffer.hpp index 8f585468..02398ee7 100644 --- a/src/CRE/GL/element_array_buffer.hpp +++ b/src/CRE/GL/element_array_buffer.hpp @@ -33,14 +33,8 @@ namespace GL { 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, 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); - void WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data); inline bool IsNull() { return !buffer; @@ -50,16 +44,6 @@ namespace GL { return !!buffer; } - template - inline void WriteMemory(gl_state_struct& gl_st, T& data) { - WriteMemory(gl_st, 0, sizeof(T), &data); - } - - template - inline void WriteMemory(p_gl_rend_state& p_gl_rend_st, T& data) { - WriteMemory(p_gl_rend_st, 0, sizeof(T), &data); - } - inline operator GLuint() const { return buffer; } diff --git a/src/CRE/GL/shader_storage_buffer.cpp b/src/CRE/GL/shader_storage_buffer.cpp index 5ad016f8..592f289e 100644 --- a/src/CRE/GL/shader_storage_buffer.cpp +++ b/src/CRE/GL/shader_storage_buffer.cpp @@ -78,54 +78,6 @@ namespace GL { } } - void* ShaderStorageBuffer::MapMemory(gl_state_struct& gl_st) { - if (!buffer) - return 0; - - void* data; - if (GLAD_GL_VERSION_4_5) - data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); - else { - gl_st.bind_shader_storage_buffer(buffer); - data = glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_WRITE_ONLY); - } - - if (data) - return data; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); - gl_st.bind_shader_storage_buffer(0); - } - return 0; - } - - void* ShaderStorageBuffer::MapMemory(p_gl_rend_state& p_gl_rend_st) { - if (!buffer) - return 0; - - void* data; - if (GLAD_GL_VERSION_4_5) - data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); - else { - p_gl_rend_st.bind_shader_storage_buffer(buffer); - data = glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_WRITE_ONLY); - } - - if (data) - return data; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); - p_gl_rend_st.bind_shader_storage_buffer(0); - } - return 0; - } - void ShaderStorageBuffer::Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage) { if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) { Destroy(); @@ -161,52 +113,4 @@ namespace GL { } } } - - void ShaderStorageBuffer::UnmapMemory(gl_state_struct& gl_st) { - if (!buffer) - return; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); - gl_st.bind_shader_storage_buffer(0); - } - } - - void ShaderStorageBuffer::UnmapMemory(p_gl_rend_state& p_gl_rend_st) { - if (!buffer) - return; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); - p_gl_rend_st.bind_shader_storage_buffer(0); - } - } - - void ShaderStorageBuffer::WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data) { - if (!buffer || !size) - return; - - if (GLAD_GL_VERSION_4_5) - glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); - else { - gl_st.bind_shader_storage_buffer(buffer); - glBufferSubData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); - } - } - - void ShaderStorageBuffer::WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data) { - if (!buffer || !size) - return; - - if (GLAD_GL_VERSION_4_5) - glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); - else { - p_gl_rend_st.bind_shader_storage_buffer(buffer); - glBufferSubData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); - } - } } diff --git a/src/CRE/GL/shader_storage_buffer.hpp b/src/CRE/GL/shader_storage_buffer.hpp index 2180f627..868339eb 100644 --- a/src/CRE/GL/shader_storage_buffer.hpp +++ b/src/CRE/GL/shader_storage_buffer.hpp @@ -33,14 +33,8 @@ namespace GL { 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, 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); - void WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data); inline bool IsNull() { return !buffer; @@ -50,16 +44,6 @@ namespace GL { return !!buffer; } - template - inline void WriteMemory(gl_state_struct& gl_st, T& data) { - WriteMemory(gl_st, 0, sizeof(T), &data); - } - - template - inline void WriteMemory(p_gl_rend_state& p_gl_rend_st, T& data) { - WriteMemory(p_gl_rend_st, 0, sizeof(T), &data); - } - inline operator GLuint() const { return buffer; } diff --git a/src/CRE/GL/uniform_buffer.cpp b/src/CRE/GL/uniform_buffer.cpp index 9567c7f2..d5f0baab 100644 --- a/src/CRE/GL/uniform_buffer.cpp +++ b/src/CRE/GL/uniform_buffer.cpp @@ -78,54 +78,6 @@ namespace GL { } } - void* UniformBuffer::MapMemory(gl_state_struct& gl_st) { - if (!buffer) - return 0; - - void* data; - if (GLAD_GL_VERSION_4_5) - data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); - else { - gl_st.bind_uniform_buffer(buffer); - data = glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY); - } - - if (data) - return data; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_UNIFORM_BUFFER); - gl_st.bind_uniform_buffer(0); - } - return 0; - } - - void* UniformBuffer::MapMemory(p_gl_rend_state& p_gl_rend_st) { - if (!buffer) - return 0; - - void* data; - if (GLAD_GL_VERSION_4_5) - data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); - else { - p_gl_rend_st.bind_uniform_buffer(buffer); - data = glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY); - } - - if (data) - return data; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_UNIFORM_BUFFER); - p_gl_rend_st.bind_uniform_buffer(0); - } - return 0; - } - void UniformBuffer::Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage) { if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) { Destroy(); @@ -161,52 +113,4 @@ namespace GL { } } } - - void UniformBuffer::UnmapMemory(gl_state_struct& gl_st) { - if (!buffer) - return; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_UNIFORM_BUFFER); - gl_st.bind_uniform_buffer(0); - } - } - - void UniformBuffer::UnmapMemory(p_gl_rend_state& p_gl_rend_st) { - if (!buffer) - return; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_UNIFORM_BUFFER); - p_gl_rend_st.bind_uniform_buffer(0); - } - } - - void UniformBuffer::WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data) { - if (!buffer || !size) - return; - - if (GLAD_GL_VERSION_4_5) - glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); - else { - gl_st.bind_uniform_buffer(buffer); - glBufferSubData(GL_UNIFORM_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); - } - } - - void UniformBuffer::WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data) { - if (!buffer || !size) - return; - - if (GLAD_GL_VERSION_4_5) - glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); - else { - p_gl_rend_st.bind_uniform_buffer(buffer); - glBufferSubData(GL_UNIFORM_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); - } - } }; diff --git a/src/CRE/GL/uniform_buffer.hpp b/src/CRE/GL/uniform_buffer.hpp index 7a54c93c..98344efa 100644 --- a/src/CRE/GL/uniform_buffer.hpp +++ b/src/CRE/GL/uniform_buffer.hpp @@ -33,14 +33,8 @@ namespace GL { 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, 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); - void WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data); inline bool IsNull() { return !buffer; @@ -50,16 +44,6 @@ namespace GL { return !!buffer; } - template - inline void WriteMemory(gl_state_struct& gl_st, T& data) { - WriteMemory(gl_st, 0, sizeof(T), &data); - } - - template - inline void WriteMemory(p_gl_rend_state& p_gl_rend_st, T& data) { - WriteMemory(p_gl_rend_st, 0, sizeof(T), &data); - } - inline operator GLuint() const { return buffer; } diff --git a/src/CRE/Glitter/render_scene.cpp b/src/CRE/Glitter/render_scene.cpp index 8d798ac2..f47c487e 100644 --- a/src/CRE/Glitter/render_scene.cpp +++ b/src/CRE/Glitter/render_scene.cpp @@ -5,6 +5,7 @@ #include "glitter.hpp" #include "../gl_rend_state.hpp" +#include "../gl_state.hpp" #include "../render_context.hpp" #include "../shader.hpp" #include "../shader_ft.hpp" @@ -307,7 +308,8 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + gl_state.write_array_buffer(rend_group->vbo, + 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -458,7 +460,8 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + gl_state.write_array_buffer(rend_group->vbo, + 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -652,7 +655,8 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + gl_state.write_array_buffer(rend_group->vbo, + 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -875,7 +879,8 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + gl_state.write_array_buffer(rend_group->vbo, + 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -986,7 +991,7 @@ namespace Glitter { shader_data.g_glitter_blend_color = 1.0f; shader_data.g_state_material_diffuse = 0.0f; shader_data.g_state_material_emission = { emission, emission, emission, 1.0f }; - rctx_ptr->glitter_batch_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(rctx_ptr->glitter_batch_ubo, shader_data); GLenum blend_src; GLenum blend_dst; @@ -1303,7 +1308,8 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + gl_state.write_array_buffer(rend_group->vbo, + 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -1452,7 +1458,8 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + gl_state.write_array_buffer(rend_group->vbo, + 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -1639,7 +1646,8 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + gl_state.write_array_buffer(rend_group->vbo, + 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -1853,7 +1861,8 @@ namespace Glitter { rend_group->disp = disp; #if !SHARED_GLITTER_BUFFER - rend_group->vbo.WriteMemory(gl_state, 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); + gl_state.write_array_buffer(rend_group->vbo, + 0, (buf - rend_group->buffer) * sizeof(Buffer), rend_group->buffer); #endif } @@ -1980,7 +1989,7 @@ namespace Glitter { shader_data.g_glitter_blend_color = 1.0f; shader_data.g_state_material_diffuse = 0.0f; shader_data.g_state_material_emission = { emission, emission, emission, 1.0f }; - rctx_ptr->glitter_batch_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(rctx_ptr->glitter_batch_ubo, shader_data); GLenum blend_src; GLenum blend_dst; diff --git a/src/CRE/Glitter/scene.cpp b/src/CRE/Glitter/scene.cpp index ec928c40..b7da1be0 100644 --- a/src/CRE/Glitter/scene.cpp +++ b/src/CRE/Glitter/scene.cpp @@ -79,7 +79,8 @@ namespace Glitter { } if (disp) - effect_group->vbo.WriteMemory(gl_state, 0, effect_group->max_count * sizeof(Buffer), effect_group->buffer); + gl_state.write_array_buffer(effect_group->vbo, + 0, effect_group->max_count * sizeof(Buffer), effect_group->buffer); #endif } diff --git a/src/CRE/Vulkan/gl_wrap.cpp b/src/CRE/Vulkan/gl_wrap.cpp index 247bb621..7c091dee 100644 --- a/src/CRE/Vulkan/gl_wrap.cpp +++ b/src/CRE/Vulkan/gl_wrap.cpp @@ -146,11 +146,14 @@ namespace Vulkan { static GLenum gl_wrap_manager_check_framebuffer_status(GLenum target); static void gl_wrap_manager_clear(GLbitfield mask); static void gl_wrap_manager_clear_buffer(GLenum buffer, GLint drawbuffer, const GLfloat* value); + static void gl_wrap_manager_clear_buffer(GLenum buffer, GLint drawbuffer, const GLint* value); static void gl_wrap_manager_clear_color(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); static void gl_wrap_manager_clear_depth(GLfloat depth); static void gl_wrap_manager_clear_stencil(GLint s); static void gl_wrap_manager_clear_named_framebuffer(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat* value); + static void gl_wrap_manager_clear_named_framebuffer(GLuint framebuffer, + GLenum buffer, GLint drawbuffer, const GLint* value); static void gl_wrap_manager_color_mask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); static void gl_wrap_manager_compressed_tex_image_2d(GLenum target, GLint level, GLenum internal_format, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); @@ -1461,6 +1464,7 @@ namespace Vulkan { glCheckFramebufferStatus = gl_wrap_manager_check_framebuffer_status; glClear = gl_wrap_manager_clear; glClearBufferfv = gl_wrap_manager_clear_buffer; + glClearBufferiv = gl_wrap_manager_clear_buffer; glClearColor = gl_wrap_manager_clear_color; glClearDepthf = gl_wrap_manager_clear_depth; glClearStencil = gl_wrap_manager_clear_stencil; @@ -4289,6 +4293,10 @@ namespace Vulkan { gl_wrap_manager_clear_named_framebuffer(gl_state.draw_framebuffer_binding, buffer, drawbuffer, value); } + static void gl_wrap_manager_clear_buffer(GLenum buffer, GLint drawbuffer, const GLint* value) { + gl_wrap_manager_clear_named_framebuffer(gl_state.draw_framebuffer_binding, buffer, drawbuffer, value); + } + static void gl_wrap_manager_clear_color(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { gl_state.clear_color.x = red; gl_state.clear_color.y = green; @@ -4388,7 +4396,100 @@ namespace Vulkan { case GL_DEPTH: { VkClearDepthStencilValue clear_depth_stencil_value; clear_depth_stencil_value.depth = value[0]; - clear_depth_stencil_value.stencil = 0; + clear_depth_stencil_value.stencil = gl_state.clear_stencil; + vkCmdClearDepthStencilImage(Vulkan::current_command_buffer, image, + new_layout, &clear_depth_stencil_value, 1, &range); + } break; + } + Vulkan::Image::PipelineBarrierSingle(Vulkan::current_command_buffer, image, + aspect_mask, 0, 0, new_layout, old_layout); + } + + static void gl_wrap_manager_clear_named_framebuffer(GLuint framebuffer, + GLenum buffer, GLint drawbuffer, const GLint* value) { + VkImageAspectFlags aspect_mask; + switch (buffer) { + case GL_COLOR: + aspect_mask = VK_IMAGE_ASPECT_COLOR_BIT; + if (drawbuffer < 0 || drawbuffer >= Vulkan::MAX_COLOR_ATTACHMENTS) { + gl_wrap_manager_ptr->push_error(GL_INVALID_VALUE); + return; + } + break; + case GL_STENCIL: + aspect_mask = VK_IMAGE_ASPECT_STENCIL_BIT; + if (drawbuffer) { + gl_wrap_manager_ptr->push_error(GL_INVALID_VALUE); + return; + } + break; + default: + gl_wrap_manager_ptr->push_error(GL_INVALID_OPERATION); + return; + } + + gl_framebuffer* vk_fbo = gl_framebuffer::get(framebuffer); + if (framebuffer && !vk_fbo) { + gl_wrap_manager_ptr->push_error(GL_INVALID_OPERATION); + return; + } + + VkImage image; + VkImageLayout old_layout; + + if (!vk_fbo) { + if (buffer != GL_COLOR) + return; + + image = Vulkan::current_swapchain_image; + old_layout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + } + else { + if (buffer == GL_STENCIL) { + GLuint texture = vk_fbo->depth_attachment; + if (!texture) + return; + + Vulkan::Image& vk_image = gl_texture::get(texture)->image; + image = vk_image; + old_layout = vk_image.GetImageLayout(0, 0); + } + else { + GLuint texture = vk_fbo->get_draw_buffer_texture(drawbuffer); + if (!texture) + return; + + Vulkan::Image& vk_image = gl_texture::get(texture)->image; + image = vk_image; + old_layout = vk_image.GetImageLayout(0, 0); + } + } + + VkImageSubresourceRange range; + range.aspectMask = aspect_mask; + range.baseMipLevel = 0; + range.levelCount = 1; + range.baseArrayLayer = 0; + range.layerCount = 1; + + const VkImageLayout new_layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + + Vulkan::Image::PipelineBarrierSingle(Vulkan::current_command_buffer, image, + aspect_mask, 0, 0, old_layout, new_layout); + switch (buffer) { + case GL_COLOR: { + VkClearColorValue clear_color_value; + clear_color_value.float32[0] = (float_t)value[0]; + clear_color_value.float32[1] = (float_t)value[1]; + clear_color_value.float32[2] = (float_t)value[2]; + clear_color_value.float32[3] = (float_t)value[3]; + vkCmdClearColorImage(Vulkan::current_command_buffer, image, + new_layout, &clear_color_value, 1, &range); + } break; + case GL_STENCIL: { + VkClearDepthStencilValue clear_depth_stencil_value; + clear_depth_stencil_value.depth = gl_state.clear_depth; + clear_depth_stencil_value.stencil = value[0]; vkCmdClearDepthStencilImage(Vulkan::current_command_buffer, image, new_layout, &clear_depth_stencil_value, 1, &range); } break; diff --git a/src/CRE/effect.cpp b/src/CRE/effect.cpp index 7f04944f..0a62793e 100644 --- a/src/CRE/effect.cpp +++ b/src/CRE/effect.cpp @@ -63,46 +63,46 @@ struct EffectStorage { p_gl_rend_st.draw_arrays_instanced(mode, first, 6, count / 6); } - inline void* MapMemory(gl_state_struct& gl_st) { + inline void* map_buffer(gl_state_struct& gl_st) { if (GLAD_GL_VERSION_4_3) - return ssbo.MapMemory(gl_st); + return gl_st.map_shader_storage_buffer(ssbo); else - return vbo.MapMemory(gl_st); + return gl_st.map_array_buffer(vbo); } - inline void* MapMemory(p_gl_rend_state& p_gl_rend_st) { + inline void* map_buffer(p_gl_rend_state& p_gl_rend_st) { if (GLAD_GL_VERSION_4_3) - return ssbo.MapMemory(p_gl_rend_st); + return p_gl_rend_st.map_shader_storage_buffer(ssbo); else - return vbo.MapMemory(p_gl_rend_st); + return p_gl_rend_st.map_array_buffer(vbo); } - inline void UnmapMemory(gl_state_struct& gl_st) { + inline void unmap_buffer(gl_state_struct& gl_st) { if (GLAD_GL_VERSION_4_3) - ssbo.UnmapMemory(gl_st); + gl_st.unmap_shader_storage_buffer(ssbo); else - vbo.UnmapMemory(gl_st); + gl_st.unmap_array_buffer(vbo); } - inline void UnmapMemory(p_gl_rend_state& p_gl_rend_st) { + inline void unmap_buffer(p_gl_rend_state& p_gl_rend_st) { if (GLAD_GL_VERSION_4_3) - ssbo.UnmapMemory(p_gl_rend_st); + p_gl_rend_st.unmap_shader_storage_buffer(ssbo); else - vbo.UnmapMemory(p_gl_rend_st); + p_gl_rend_st.unmap_array_buffer(vbo); } - inline void WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data) { + inline void write_buffer(gl_state_struct& gl_st, size_t offset, size_t size, const void* data) { if (GLAD_GL_VERSION_4_3) - ssbo.WriteMemory(gl_st, offset, size, data); + gl_st.write_shader_storage_buffer(ssbo, offset, size, data); else - vbo.WriteMemory(gl_st, offset, size, data); + gl_st.write_array_buffer(vbo, offset, size, data); } - inline void WriteMemory(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data) { + inline void write_buffer(p_gl_rend_state& p_gl_rend_st, size_t offset, size_t size, const void* data) { if (GLAD_GL_VERSION_4_3) - ssbo.WriteMemory(p_gl_rend_st, offset, size, data); + p_gl_rend_st.write_shader_storage_buffer(ssbo, offset, size, data); else - vbo.WriteMemory(p_gl_rend_st, offset, size, data); + p_gl_rend_st.write_array_buffer(vbo, offset, size, data); } }; @@ -1372,7 +1372,7 @@ void leaf_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) rend_data_ctx.get_scene_light(&shader_data.g_light_env_stage_diffuse, &shader_data.g_light_env_stage_specular, &shader_data.g_lit_dir, &shader_data.g_lit_luce, 0, 0); - leaf_particle_scene_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(leaf_particle_scene_ubo, shader_data); rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_LEAF_PT); @@ -1410,7 +1410,7 @@ void rain_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) scene_shader_data.g_proj[3] = temp.row3; scene_shader_data.g_range_scale = { range_scale.x, range_scale.y, range_scale.z, 0.0f }; scene_shader_data.g_range_offset = { range_offset.x, range_offset.y, range_offset.z, 0.0f }; - rain_particle_scene_ubo.WriteMemory(rend_data_ctx.state, scene_shader_data); + rend_data_ctx.state.write_uniform_buffer(rain_particle_scene_ubo, scene_shader_data); rend_data_ctx.state.enable_blend(); rend_data_ctx.state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -1441,7 +1441,7 @@ void rain_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) batch_shader_data.g_pos_offset = { pos_offset.x, pos_offset.y, pos_offset.z, 0.075f }; batch_shader_data.g_tangent = { tangent.x, tangent.y, tangent.z, tangent_sign }; batch_shader_data.g_color = color; - rain_particle_batch_ubo.WriteMemory(rend_data_ctx.state, batch_shader_data); + rend_data_ctx.state.write_uniform_buffer(rain_particle_batch_ubo, batch_shader_data); rain_storage.Draw(rend_data_ctx.state, GL_TRIANGLES, first, count); } rend_data_ctx.state.bind_vertex_array(0); @@ -1458,7 +1458,7 @@ void particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) { if (!count) return; - ptcl_vbo.WriteMemory(rend_data_ctx.state, 0, sizeof(particle_vertex_data) * count, ptcl_vertex_data); + rend_data_ctx.state.write_array_buffer(ptcl_vbo, 0, sizeof(particle_vertex_data) * count, ptcl_vertex_data); const light_data& light_chara = rctx_ptr->light_set[LIGHT_SET_MAIN].lights[LIGHT_CHARA]; @@ -1472,7 +1472,7 @@ void particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) { rctx_ptr->camera->get_view_point(shader_data.g_view_pos); light_chara.get_diffuse(shader_data.g_light_env_chara_diffuse); light_chara.get_specular(shader_data.g_light_env_chara_specular); - particle_scene_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(particle_scene_ubo, shader_data); shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_PARTICL); rend_data_ctx.state.bind_uniform_buffer_base(0, particle_scene_ubo); @@ -1520,12 +1520,12 @@ void snow_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) snow_scene.g_range_offset.x = snow->offset_gpu.x - snow->range_gpu.x * 0.5f; snow_scene.g_range_offset.y = snow->offset_gpu.y; snow_scene.g_range_offset.z = snow->offset_gpu.z - snow->range_gpu.z * 0.5f; - snow_particle_scene_ubo.WriteMemory(rend_data_ctx.state, snow_scene); + rend_data_ctx.state.write_uniform_buffer(snow_particle_scene_ubo, snow_scene); snow_particle_batch_shader_data snow_batch = {}; snow_batch.g_color = snow->color; snow_batch.start_vertex_location.x = 0; - snow_particle_batch_ubo.WriteMemory(rend_data_ctx.state, snow_batch); + rend_data_ctx.state.write_uniform_buffer(snow_particle_batch_ubo, snow_batch); rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->render.rend_texture[0].get_depth_texture_glid()); @@ -1550,7 +1550,7 @@ void snow_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) point_attenuation = powf(tanf(cam.get_fov() * 0.5f) * 3.4f, 2.0f) * 0.06f; snow_scene.g_state_point_attenuation = { 0.0f, 0.0f, point_attenuation, 0.0f }; - snow_particle_scene_ubo.WriteMemory(rend_data_ctx.state, snow_scene); + rend_data_ctx.state.write_uniform_buffer(snow_particle_scene_ubo, snow_scene); snow_gpu_storage.Bind(rend_data_ctx.state, 0); @@ -1567,7 +1567,7 @@ void snow_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) snow_batch.g_pos_offset = { pos_offset.x, pos_offset.y, pos_offset.z, 0.0f }; snow_batch.g_color = color; snow_batch.start_vertex_location.x = first; - snow_particle_batch_ubo.WriteMemory(rend_data_ctx.state, snow_batch); + rend_data_ctx.state.write_uniform_buffer(snow_particle_batch_ubo, snow_batch); snow_gpu_storage.Draw(rend_data_ctx.state, GL_TRIANGLES, 0, count); first += count; @@ -2365,7 +2365,7 @@ void EffectFogRing::calc_vert() { float_t density = this->density; fog_ring_data* ptcl_data = this->ptcl_data; - fog_ring_vertex_data* ptcl_vtx_data = (fog_ring_vertex_data*)storage.MapMemory(gl_state); + fog_ring_vertex_data* ptcl_vtx_data = (fog_ring_vertex_data*)storage.map_buffer(gl_state); if (!ptcl_vtx_data) { num_vtx = 0; return; @@ -2384,7 +2384,7 @@ void EffectFogRing::calc_vert() { ptcl_vtx_data->size = size; } - storage.UnmapMemory(gl_state); + storage.unmap_buffer(gl_state); num_vtx = (int32_t)(num_ptcls * 6LL); } @@ -4237,7 +4237,7 @@ void water_particle::draw(render_data_context& rend_data_ctx, const cam_data& ca if (count <= 0) return; - storage.WriteMemory(rend_data_ctx.state, 0, sizeof(water_particle_vertex_data) * count, ptcl_data.data()); + storage.write_buffer(rend_data_ctx.state, 0, sizeof(water_particle_vertex_data) * count, ptcl_data.data()); water_particle_scene_shader_data scene_shader_data = {}; mat4 temp; @@ -4257,7 +4257,7 @@ void water_particle::draw(render_data_context& rend_data_ctx, const cam_data& ca scene_shader_data.g_size_in_projection.y = (float_t)(1.0 / 720.0); scene_shader_data.g_size_in_projection.z = 1.0; scene_shader_data.g_size_in_projection.w = 60.0; - water_particle_scene_ubo.WriteMemory(rend_data_ctx.state, scene_shader_data); + rend_data_ctx.state.write_uniform_buffer(water_particle_scene_ubo, scene_shader_data); rend_data_ctx.state.disable_cull_face(); shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_W_PTCL); @@ -5218,7 +5218,7 @@ void star_catalog_milky_way::draw(render_data_context& rend_data_ctx, scene_shader_data.g_transform[1] = temp.row1; scene_shader_data.g_transform[2] = temp.row2; scene_shader_data.g_transform[3] = temp.row3; - scene_ubo.WriteMemory(rend_data_ctx.state, scene_shader_data); + rend_data_ctx.state.write_uniform_buffer(scene_ubo, scene_shader_data); rend_data_ctx.state.enable_cull_face(); rend_data_ctx.state.disable_blend(); @@ -5312,7 +5312,7 @@ void star_catalog::draw(render_data_context& rend_data_ctx, const cam_data& cam) scene_shader_data.g_transform[1] = temp.row1; scene_shader_data.g_transform[2] = temp.row2; scene_shader_data.g_transform[3] = temp.row3; - scene_ubo.WriteMemory(rend_data_ctx.state, scene_shader_data); + rend_data_ctx.state.write_uniform_buffer(scene_ubo, scene_shader_data); rend_data_ctx.shader_flags.arr[U_STAR] = 0; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_STAR); @@ -5333,7 +5333,7 @@ void star_catalog::draw(render_data_context& rend_data_ctx, const cam_data& cam) modifiers.pos_scale, modifiers.pos_scale * modifiers.offset_scale }; batch_shader_data.g_thresholds = { modifiers.threshold * modifiers.pos_scale, 0.0f, 0.0f, 0.0f }; - batch_ubo.WriteMemory(rend_data_ctx.state, batch_shader_data); + rend_data_ctx.state.write_uniform_buffer(batch_ubo, batch_shader_data); rend_data_ctx.state.bind_uniform_buffer_base(0, scene_ubo); rend_data_ctx.state.bind_uniform_buffer_base(1, batch_ubo); @@ -5789,7 +5789,7 @@ static void draw_ripple_particles(render_data_context& rend_data_ctx, if (data->count > 5000) return; - vec3* vtx_data = (vec3*)ripple_emit_storage.MapMemory(rend_data_ctx.state); + vec3* vtx_data = (vec3*)ripple_emit_storage.map_buffer(rend_data_ctx.state); if (!vtx_data) return; @@ -5799,7 +5799,7 @@ static void draw_ripple_particles(render_data_context& rend_data_ctx, for (size_t i = data->count; i; i--, vtx_data++, position++, color++) *vtx_data = { position->x, -position->z, (float_t)color->a * (float_t)(1.0 / 255.0) }; - ripple_emit_storage.UnmapMemory(rend_data_ctx.state); + ripple_emit_storage.unmap_buffer(rend_data_ctx.state); int32_t size = (int32_t)(data->size + 0.5f); @@ -5822,7 +5822,7 @@ static void draw_ripple_particles(render_data_context& rend_data_ctx, 1.0f / (float_t)width, 1.0f / (float_t)height, 0.0f, 0.0f }; - ripple_emit_scene_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(ripple_emit_scene_ubo, shader_data); rend_data_ctx.shader_flags.arr[U_RIPPLE] = data->ripple_uniform; rend_data_ctx.shader_flags.arr[U_RIPPLE_EMIT] = data->ripple_emit_uniform; @@ -5996,7 +5996,8 @@ static int32_t leaf_particle_disp(render_data_context& rend_data_ctx) { normal[2] = sub_1406427A0(vec3(-0.2f, -0.2f, 1.0f), vec3(0.0f, 1.0f, 0.0f)).first; normal[3] = sub_1406427A0(vec3( 0.4f, -0.4f, 1.0f), vec3(0.0f, 1.0f, 0.0f)).first; - leaf_particle_vertex_data* vtx_data = (leaf_particle_vertex_data*)leaf_ptcl_vbo.MapMemory(rend_data_ctx.state); + leaf_particle_vertex_data* vtx_data + = (leaf_particle_vertex_data*)rend_data_ctx.state.map_array_buffer(leaf_ptcl_vbo); if (!vtx_data) return 0; @@ -6074,7 +6075,7 @@ static int32_t leaf_particle_disp(render_data_context& rend_data_ctx) { } } - leaf_ptcl_vbo.UnmapMemory(rend_data_ctx.state); + rend_data_ctx.state.unmap_array_buffer(leaf_ptcl_vbo); return vtx_count; } @@ -6644,7 +6645,7 @@ static void snow_particle_ctrl() { snow_particle_data_kill_fallen(snow_ptcl_fallen, true); } - snow_particle_vertex_data* vtx_data = (snow_particle_vertex_data*)snow_storage.MapMemory(gl_state); + snow_particle_vertex_data* vtx_data = (snow_particle_vertex_data*)snow_storage.map_buffer(gl_state); if (vtx_data) { particle_data* snow_ptcl = snow_ptcl_data; for (int32_t i = snow->num_snow; i; i--, snow_ptcl++, vtx_data++) { @@ -6653,9 +6654,9 @@ static void snow_particle_ctrl() { vtx_data->alpha = snow_ptcl->alpha; } } - snow_storage.UnmapMemory(gl_state); + snow_storage.unmap_buffer(gl_state); - snow_particle_vertex_data* fallen_vtx_data = (snow_particle_vertex_data*)snow_fallen_storage.MapMemory(gl_state); + snow_particle_vertex_data* fallen_vtx_data = (snow_particle_vertex_data*)snow_fallen_storage.map_buffer(gl_state); if (fallen_vtx_data) { particle_data* snow_ptcl_fallen = snow_ptcl_fallen_data; for (size_t i = snow_ptcl_fallen_count; i; i--, snow_ptcl_fallen++, fallen_vtx_data++) { @@ -6664,7 +6665,7 @@ static void snow_particle_ctrl() { fallen_vtx_data->alpha = snow_ptcl_fallen->alpha; } } - snow_fallen_storage.UnmapMemory(gl_state); + snow_fallen_storage.unmap_buffer(gl_state); } static void snow_particle_data_init() { @@ -6803,11 +6804,11 @@ static void ripple_propagate_sub(render_data_context& rend_data_ctx, (float_t)width / (float_t)(width - 2), (float_t)height / (float_t)(height - 2) }; ripple_scene.g_texcoord = { 1.0f, 0.0f, 0.0f, 0.0f }; - ripple_scene_ubo.WriteMemory(rend_data_ctx.state, ripple_scene); + rend_data_ctx.state.write_uniform_buffer(ripple_scene_ubo, ripple_scene); ripple_batch_shader_data ripple_batch = {}; ripple_batch.g_params = { params.wake_attn, 0.0f, 0.0f, 0.0f }; - ripple_batch_ubo.WriteMemory(rend_data_ctx.state, ripple_batch); + rend_data_ctx.state.write_uniform_buffer(ripple_batch_ubo, ripple_batch); rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_RIPPLE); diff --git a/src/CRE/gl_rend_state.cpp b/src/CRE/gl_rend_state.cpp index 8aadd091..e6545786 100644 --- a/src/CRE/gl_rend_state.cpp +++ b/src/CRE/gl_rend_state.cpp @@ -181,6 +181,7 @@ struct gl_rend_state { void active_bind_texture_cube_map(int32_t index, GLuint texture); void active_texture(int32_t index); void begin_event(const char* message, int32_t length); + void begin_query(GLenum target, GLuint id); void bind_framebuffer(GLuint framebuffer); void bind_read_framebuffer(GLuint framebuffer); void bind_draw_framebuffer(GLuint framebuffer); @@ -203,6 +204,7 @@ struct gl_rend_state { GLenum check_framebuffer_status(GLenum target); void clear(GLbitfield mask); void clear_buffer(GLenum buffer, GLint drawbuffer, const GLfloat* value); + void clear_buffer(GLenum buffer, GLint drawbuffer, const GLint* value); void clear_color(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); void clear_depth(GLfloat depth); void clear_stencil(GLint stencil); @@ -232,6 +234,7 @@ struct gl_rend_state { void enable_scissor_test(); void enable_stencil_test(); void end_event(); + void end_query(GLenum target); void finish(); void generate_mipmap(GLenum target); void generate_texture_mipmap(GLuint texture); @@ -242,6 +245,10 @@ struct gl_rend_state { void get_scissor(GLint& x, GLint& y, GLsizei& width, GLsizei& height); gl_rend_state_rect get_viewport(); void get_viewport(GLint& x, GLint& y, GLsizei& width, GLsizei& height); + void* map_array_buffer(GLuint buffer); + void* map_element_array_buffer(GLuint buffer); + void* map_uniform_buffer(GLuint buffer); + void* map_shader_storage_buffer(GLuint buffer); void set_blend_func(GLenum src, GLenum dst); void set_blend_func_separate(GLenum src_rgb, GLenum dst_rgb, GLenum src_alpha, GLenum dst_alpha); @@ -263,6 +270,10 @@ struct gl_rend_state { void set_viewport(GLint x, GLint y, GLsizei width, GLsizei height); void tex_sub_image_2d(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); + void unmap_array_buffer(GLuint buffer); + void unmap_element_array_buffer(GLuint buffer); + void unmap_uniform_buffer(GLuint buffer); + void unmap_shader_storage_buffer(GLuint buffer); void update(); void update_program(); void update_active_texture(); @@ -298,6 +309,10 @@ struct gl_rend_state { void update_clear_depth(); void update_clear_stencil(); void use_program(GLuint program); + void write_array_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); + void write_element_array_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); + void write_uniform_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); + void write_shader_storage_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); }; gl_rend_state gl_rend_state_data[GL_REND_STATE_COUNT] = { @@ -327,6 +342,10 @@ void p_gl_rend_state::begin_event(const char* message, int32_t length) { ptr.begin_event(message, length); } +void p_gl_rend_state::begin_query(GLenum target, GLuint id) { + ptr.begin_query(target, id); +} + void p_gl_rend_state::bind_framebuffer(GLuint framebuffer) { ptr.bind_framebuffer(framebuffer); } @@ -406,6 +425,10 @@ void p_gl_rend_state::clear_buffer(GLenum buffer, GLint drawbuffer, const GLfloa ptr.clear_buffer(buffer, drawbuffer, value); } +void p_gl_rend_state::clear_buffer(GLenum buffer, GLint drawbuffer, const GLint* value) { + ptr.clear_buffer(buffer, drawbuffer, value); +} + void p_gl_rend_state::clear_color(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { ptr.clear_color(red, green, blue, alpha); } @@ -508,6 +531,10 @@ void p_gl_rend_state::end_event() { ptr.end_event(); } +void p_gl_rend_state::end_query(GLenum target) { + ptr.end_query(target); +} + void p_gl_rend_state::finish() { ptr.finish(); } @@ -548,6 +575,22 @@ void p_gl_rend_state::get_viewport(GLint& x, GLint& y, GLsizei& width, GLsizei& ptr.get_viewport(x, y, width, height); } +void* p_gl_rend_state::map_array_buffer(GLuint buffer) { + return ptr.map_array_buffer(buffer); +} + +void* p_gl_rend_state::map_element_array_buffer(GLuint buffer) { + return ptr.map_element_array_buffer(buffer); +} + +void* p_gl_rend_state::map_uniform_buffer(GLuint buffer) { + return ptr.map_uniform_buffer(buffer); +} + +void* p_gl_rend_state::map_shader_storage_buffer(GLuint buffer) { + return ptr.map_shader_storage_buffer(buffer); +} + void p_gl_rend_state::set_blend_func(GLenum src, GLenum dst) { ptr.set_blend_func(src, dst); } @@ -627,6 +670,38 @@ void p_gl_rend_state::use_program(GLuint program) { ptr.use_program(program); } +void p_gl_rend_state::unmap_array_buffer(GLuint buffer) { + return ptr.unmap_array_buffer(buffer); +} + +void p_gl_rend_state::unmap_element_array_buffer(GLuint buffer) { + return ptr.unmap_element_array_buffer(buffer); +} + +void p_gl_rend_state::unmap_uniform_buffer(GLuint buffer) { + return ptr.unmap_uniform_buffer(buffer); +} + +void p_gl_rend_state::unmap_shader_storage_buffer(GLuint buffer) { + return ptr.unmap_shader_storage_buffer(buffer); +} + +void p_gl_rend_state::write_array_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { + ptr.write_array_buffer(buffer, offset, size, data); +} + +void p_gl_rend_state::write_element_array_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { + ptr.write_element_array_buffer(buffer, offset, size, data); +} + +void p_gl_rend_state::write_uniform_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { + ptr.write_uniform_buffer(buffer, offset, size, data); +} + +void p_gl_rend_state::write_shader_storage_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { + ptr.write_shader_storage_buffer(buffer, offset, size, data); +} + inline void gl_rend_state::active_bind_texture_2d(int32_t index, GLuint texture) { active_texture(index); bind_texture_2d(texture); @@ -647,6 +722,10 @@ inline void gl_rend_state::begin_event(const char* message, int32_t length) { glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, (GLsizei)length, message); } +inline void gl_rend_state::begin_query(GLenum target, GLuint id) { + glBeginQuery(target, id); +} + inline void gl_rend_state::bind_framebuffer(GLuint framebuffer) { read_framebuffer_binding = framebuffer; draw_framebuffer_binding = framebuffer; @@ -837,12 +916,25 @@ inline void gl_rend_state::clear_buffer(GLenum buffer, GLint drawbuffer, const G update_scissor_test(); update_scissor(); + glClearBufferfv(buffer, drawbuffer, value); + enum_or(flags, GL_REND_STATE_EXECUTE); +} + +inline void gl_rend_state::clear_buffer(GLenum buffer, GLint drawbuffer, const GLint* value) { + update_draw_framebuffer(); + + if (buffer == GL_COLOR) + update_color_mask(); + + update_scissor_test(); + update_scissor(); + if (buffer == GL_STENCIL) { update_stencil_test(); update_stencil_mask(); } - glClearBufferfv(buffer, drawbuffer, value); + glClearBufferiv(buffer, drawbuffer, value); enum_or(flags, GL_REND_STATE_EXECUTE); } @@ -1032,6 +1124,10 @@ inline void gl_rend_state::end_event() { glPopDebugGroup(); } +inline void gl_rend_state::end_query(GLenum target) { + glEndQuery(target); +} + inline void gl_rend_state::finish() { bind_vertex_array(0); update_vertex_array(); @@ -1272,6 +1368,102 @@ inline void gl_rend_state::get_viewport(GLint& x, GLint& y, GLsizei& width, GLsi height = viewport.height; } +inline void* gl_rend_state::map_array_buffer(GLuint buffer) { + if (!buffer) + return 0; + + void* data; + if (GLAD_GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + bind_array_buffer(buffer); + data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ARRAY_BUFFER); + bind_array_buffer(0); + } + return 0; +} + +inline void* gl_rend_state::map_element_array_buffer(GLuint buffer) { + if (!buffer) + return 0; + + void* data; + if (GLAD_GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + bind_element_array_buffer(buffer); + data = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); + bind_element_array_buffer(0); + } + return 0; +} + +inline void* gl_rend_state::map_uniform_buffer(GLuint buffer) { + if (!buffer) + return 0; + + void* data; + if (GLAD_GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + bind_uniform_buffer(buffer); + data = glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_UNIFORM_BUFFER); + bind_uniform_buffer(0); + } + return 0; +} + +inline void* gl_rend_state::map_shader_storage_buffer(GLuint buffer) { + if (!buffer) + return 0; + + void* data; + if (GLAD_GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + bind_shader_storage_buffer(buffer); + data = glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); + bind_shader_storage_buffer(0); + } + return 0; +} + inline void gl_rend_state::set_blend_func(GLenum src, GLenum dst) { blend_src_rgb = src; blend_dst_rgb = dst; @@ -1379,6 +1571,54 @@ inline void gl_rend_state::set_viewport(GLint x, GLint y, GLsizei width, GLsizei enum_or(update_flags, GL_REND_STATE_UPDATE_VIEWPORT); } +inline void gl_rend_state::unmap_array_buffer(GLuint buffer) { + if (!buffer) + return; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ARRAY_BUFFER); + bind_array_buffer(0); + } +} + +inline void gl_rend_state::unmap_element_array_buffer(GLuint buffer) { + if (!buffer) + return; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); + bind_element_array_buffer(0); + } +} + +inline void gl_rend_state::unmap_uniform_buffer(GLuint buffer) { + if (!buffer) + return; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_UNIFORM_BUFFER); + bind_uniform_buffer(0); + } +} + +inline void gl_rend_state::unmap_shader_storage_buffer(GLuint buffer) { + if (!buffer) + return; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); + bind_shader_storage_buffer(0); + } +} + inline void gl_rend_state::tex_sub_image_2d(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) { update_curr_active_texture(); @@ -1450,7 +1690,7 @@ inline void gl_rend_state::update_curr_active_texture() { GLuint index = curr_active_texture_index; bool bind = false; if (curr_texture_binding_2d[index] != texture_binding_2d[index]) { - glBindTexture(GL_TEXTURE_2D, texture_binding_2d[curr_active_texture_index]); + glBindTexture(GL_TEXTURE_2D, texture_binding_2d[index]); curr_texture_binding_2d[index] = texture_binding_2d[index]; bind = true; } @@ -1730,7 +1970,6 @@ inline void gl_rend_state::update_multisample() { (multisample ? glEnable : glDisable)(GL_MULTISAMPLE); curr_multisample = multisample; } - enum_and(update_flags, ~GL_REND_STATE_UPDATE_MULTISAMPLE); } } @@ -1799,7 +2038,7 @@ inline void gl_rend_state::update_stencil_func() { if (curr_stencil_test && (update_flags & GL_REND_STATE_UPDATE_STENCIL_FUNC)) { if (curr_stencil_func != stencil_func || curr_stencil_ref != stencil_ref || curr_stencil_value_mask != stencil_value_mask) { - glStencilFunc(stencil_func, stencil_ref, stencil_ref); + glStencilFunc(stencil_func, stencil_ref, stencil_value_mask); curr_stencil_func = stencil_func; curr_stencil_ref = stencil_ref; curr_stencil_value_mask = stencil_value_mask; @@ -1872,3 +2111,51 @@ inline void gl_rend_state::use_program(GLuint program) { this->program = program; enum_or(update_flags, GL_REND_STATE_UPDATE_PROGRAM); } + +inline void gl_rend_state::write_array_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { + if (!buffer || !size) + return; + + if (GLAD_GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + bind_array_buffer(buffer); + glBufferSubData(GL_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } +} + +inline void gl_rend_state::write_element_array_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { + if (!buffer || !size) + return; + + if (GLAD_GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + bind_element_array_buffer(buffer); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } +} + +inline void gl_rend_state::write_uniform_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { + if (!buffer || !size) + return; + + if (GLAD_GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + bind_uniform_buffer(buffer); + glBufferSubData(GL_UNIFORM_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } +} + +inline void gl_rend_state::write_shader_storage_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { + if (!buffer || !size) + return; + + if (GLAD_GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + bind_shader_storage_buffer(buffer); + glBufferSubData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } +} diff --git a/src/CRE/gl_rend_state.hpp b/src/CRE/gl_rend_state.hpp index 764ad00c..0e37ea58 100644 --- a/src/CRE/gl_rend_state.hpp +++ b/src/CRE/gl_rend_state.hpp @@ -32,6 +32,7 @@ struct p_gl_rend_state { void active_bind_texture_cube_map(int32_t index, GLuint texture); void active_texture(int32_t index); void begin_event(const char* message, int32_t length); + void begin_query(GLenum target, GLuint id); void bind_framebuffer(GLuint framebuffer); void bind_read_framebuffer(GLuint framebuffer); void bind_draw_framebuffer(GLuint framebuffer); @@ -54,6 +55,7 @@ struct p_gl_rend_state { GLenum check_framebuffer_status(GLenum target); void clear(GLbitfield mask); void clear_buffer(GLenum buffer, GLint drawbuffer, const GLfloat* value); + void clear_buffer(GLenum buffer, GLint drawbuffer, const GLint* value); void clear_color(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); void clear_depth(GLfloat depth); void clear_stencil(GLint stencil); @@ -83,6 +85,7 @@ struct p_gl_rend_state { void enable_scissor_test(); void enable_stencil_test(); void end_event(); + void end_query(GLenum target); void finish(); void generate_mipmap(GLenum target); void generate_texture_mipmap(GLuint texture); @@ -93,6 +96,10 @@ struct p_gl_rend_state { void get_scissor(GLint& x, GLint& y, GLsizei& width, GLsizei& height); gl_rend_state_rect get_viewport(); void get_viewport(GLint& x, GLint& y, GLsizei& width, GLsizei& height); + void* map_array_buffer(GLuint buffer); + void* map_element_array_buffer(GLuint buffer); + void* map_uniform_buffer(GLuint buffer); + void* map_shader_storage_buffer(GLuint buffer); void set_blend_func(GLenum src, GLenum dst); void set_blend_func_separate(GLenum src_rgb, GLenum dst_rgb, GLenum src_alpha, GLenum dst_alpha); @@ -114,10 +121,38 @@ struct p_gl_rend_state { void tex_sub_image_2d(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); void set_viewport(GLint x, GLint y, GLsizei width, GLsizei height); + void unmap_array_buffer(GLuint buffer); + void unmap_element_array_buffer(GLuint buffer); + void unmap_uniform_buffer(GLuint buffer); + void unmap_shader_storage_buffer(GLuint buffer); void use_program(GLuint program); + void write_array_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); + void write_element_array_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); + void write_uniform_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); + void write_shader_storage_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); template inline void begin_event(const char(&str)[size]) { begin_event(str, (GLsizei)(size - 1)); } + + template + inline void write_array_buffer(GLuint buffer, const T& data) { + write_array_buffer(buffer, 0, sizeof(T), &data); + } + + template + inline void write_element_array_buffer(GLuint buffer, const T& data) { + write_element_array_buffer(buffer, 0, sizeof(T), &data); + } + + template + inline void write_uniform_buffer(GLuint buffer, const T& data) { + write_uniform_buffer(buffer, 0, sizeof(T), &data); + } + + template + inline void write_shader_storage_buffer(GLuint buffer, const T& data) { + write_shader_storage_buffer(buffer, 0, sizeof(T), &data); + } }; diff --git a/src/CRE/gl_state.cpp b/src/CRE/gl_state.cpp index 26dc8e0a..9a0fe022 100644 --- a/src/CRE/gl_state.cpp +++ b/src/CRE/gl_state.cpp @@ -111,3 +111,195 @@ void gl_state_struct::get() { glGetIntegerv(GL_UNIFORM_BUFFER_BINDING, (GLint*)&uniform_buffer_binding); glGetIntegerv(GL_SHADER_STORAGE_BUFFER_BINDING, (GLint*)&shader_storage_buffer_binding); } + +void* gl_state_struct::map_array_buffer(GLuint buffer) { + if (!buffer) + return 0; + + void* data; + if (GLAD_GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + bind_array_buffer(buffer); + data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ARRAY_BUFFER); + bind_array_buffer(0); + } + return 0; +} + +void* gl_state_struct::map_element_array_buffer(GLuint buffer) { + if (!buffer) + return 0; + + void* data; + if (GLAD_GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + bind_element_array_buffer(buffer); + data = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); + bind_element_array_buffer(0); + } + return 0; +} + +void* gl_state_struct::map_uniform_buffer(GLuint buffer) { + if (!buffer) + return 0; + + void* data; + if (GLAD_GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + bind_uniform_buffer(buffer); + data = glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_UNIFORM_BUFFER); + bind_uniform_buffer(0); + } + return 0; +} + +void* gl_state_struct::map_shader_storage_buffer(GLuint buffer) { + if (!buffer) + return 0; + + void* data; + if (GLAD_GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + bind_shader_storage_buffer(buffer); + data = glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); + bind_shader_storage_buffer(0); + } + return 0; +} + +void gl_state_struct::unmap_array_buffer(GLuint buffer) { + if (!buffer) + return; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ARRAY_BUFFER); + bind_array_buffer(0); + } +} + +void gl_state_struct::unmap_element_array_buffer(GLuint buffer) { + if (!buffer) + return; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); + bind_element_array_buffer(0); + } +} + +void gl_state_struct::unmap_uniform_buffer(GLuint buffer) { + if (!buffer) + return; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_UNIFORM_BUFFER); + bind_uniform_buffer(0); + } +} + +void gl_state_struct::unmap_shader_storage_buffer(GLuint buffer) { + if (!buffer) + return; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); + bind_shader_storage_buffer(0); + } +} + +void gl_state_struct::write_array_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { + if (!buffer || !size) + return; + + if (GLAD_GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + bind_array_buffer(buffer); + glBufferSubData(GL_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } +} + +void gl_state_struct::write_element_array_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { + if (!buffer || !size) + return; + + if (GLAD_GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + bind_element_array_buffer(buffer); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } +} + +void gl_state_struct::write_uniform_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { + if (!buffer || !size) + return; + + if (GLAD_GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + bind_uniform_buffer(buffer); + glBufferSubData(GL_UNIFORM_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } +} + +void gl_state_struct::write_shader_storage_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { + if (!buffer || !size) + return; + + if (GLAD_GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + bind_shader_storage_buffer(buffer); + glBufferSubData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } +} diff --git a/src/CRE/gl_state.hpp b/src/CRE/gl_state.hpp index ce07a549..68d4d23d 100644 --- a/src/CRE/gl_state.hpp +++ b/src/CRE/gl_state.hpp @@ -34,6 +34,38 @@ struct gl_state_struct { bool check_texture_binding_2d(); bool check_texture_binding_cube_map(); void get(); + void* map_array_buffer(GLuint buffer); + void* map_element_array_buffer(GLuint buffer); + void* map_uniform_buffer(GLuint buffer); + void* map_shader_storage_buffer(GLuint buffer); + void unmap_array_buffer(GLuint buffer); + void unmap_element_array_buffer(GLuint buffer); + void unmap_uniform_buffer(GLuint buffer); + void unmap_shader_storage_buffer(GLuint buffer); + void write_array_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); + void write_element_array_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); + void write_uniform_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); + void write_shader_storage_buffer(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); + + template + inline void write_array_buffer(GLuint buffer, const T& data) { + write_array_buffer(buffer, 0, sizeof(T), &data); + } + + template + inline void write_element_array_buffer(GLuint buffer, const T& data) { + write_element_array_buffer(buffer, 0, sizeof(T), &data); + } + + template + inline void write_uniform_buffer(GLuint buffer, const T& data) { + write_uniform_buffer(buffer, 0, sizeof(T), &data); + } + + template + inline void write_shader_storage_buffer(GLuint buffer, const T& data) { + write_shader_storage_buffer(buffer, 0, sizeof(T), &data); + } }; extern gl_state_struct gl_state; diff --git a/src/CRE/mdl/disp_manager.cpp b/src/CRE/mdl/disp_manager.cpp index e036dfa5..de660e91 100644 --- a/src/CRE/mdl/disp_manager.cpp +++ b/src/CRE/mdl/disp_manager.cpp @@ -1030,7 +1030,7 @@ namespace mdl { gl_state.bind_element_array_buffer(0); } - vbo.WriteMemory(gl_state, 0, vertex_buffer.size(), vertex_buffer.data()); + gl_state.write_array_buffer(vbo, 0, vertex_buffer.size(), vertex_buffer.data()); if (ebo_index_count < index_buffer.size()) { if (!ebo_index_count) @@ -1048,7 +1048,7 @@ namespace mdl { gl_state.bind_element_array_buffer(0); } - ebo.WriteMemory(gl_state, 0, sizeof(uint32_t) * index_buffer.size(), index_buffer.data()); + gl_state.write_element_array_buffer(ebo, 0, sizeof(uint32_t) * index_buffer.size(), index_buffer.data()); gl_state.bind_array_buffer(0); gl_state.bind_element_array_buffer(0); diff --git a/src/CRE/render.cpp b/src/CRE/render.cpp index 1163d78f..c1a8b542 100644 --- a/src/CRE/render.cpp +++ b/src/CRE/render.cpp @@ -220,7 +220,7 @@ namespace rndr { shader_data.g_transform[1] = mat.row1; shader_data.g_transform[2] = mat.row2; shader_data.g_transform[3] = mat.row3; - rctx->camera_blur_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(rctx->camera_blur_ubo, shader_data); rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->camera_blur_ubo); } else { @@ -345,11 +345,11 @@ namespace rndr { shader_data.g_transform[2] = mat.row2; shader_data.g_transform[3] = mat.row3; shader_data.g_emission = 0.0f; - rctx_ptr->sun_quad_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(rctx_ptr->sun_quad_ubo, shader_data); - glBeginQuery(GL_SAMPLES_PASSED, chara_data->query[next_query_index]); + rend_data_ctx.state.begin_query(GL_SAMPLES_PASSED, chara_data->query[next_query_index]); rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - glEndQuery(GL_SAMPLES_PASSED); + rend_data_ctx.state.end_query(GL_SAMPLES_PASSED); if (chara_data->query_data[next_query_index] == -1) chara_data->query_data[next_query_index] = 0; @@ -466,11 +466,11 @@ namespace rndr { shader_data.g_transform[1] = mat.row1; shader_data.g_transform[2] = mat.row2; shader_data.g_transform[3] = mat.row3; - rctx_ptr->sun_quad_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(rctx_ptr->sun_quad_ubo, shader_data); - glBeginQuery(GL_SAMPLES_PASSED, lens_shaft_query[next_query_index]); + rend_data_ctx.state.begin_query(GL_SAMPLES_PASSED, lens_shaft_query[next_query_index]); rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - glEndQuery(GL_SAMPLES_PASSED); + rend_data_ctx.state.end_query(GL_SAMPLES_PASSED); mat4_mul_translate(&cam.get_view_mat(), (vec3*)&v44, &mat); mat4_clear_rot(&mat, &mat); @@ -482,11 +482,11 @@ namespace rndr { shader_data.g_transform[1] = mat.row1; shader_data.g_transform[2] = mat.row2; shader_data.g_transform[3] = mat.row3; - rctx_ptr->sun_quad_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(rctx_ptr->sun_quad_ubo, shader_data); - glBeginQuery(GL_SAMPLES_PASSED, lens_flare_query[next_query_index]); + rend_data_ctx.state.begin_query(GL_SAMPLES_PASSED, lens_flare_query[next_query_index]); rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - glEndQuery(GL_SAMPLES_PASSED); + rend_data_ctx.state.end_query(GL_SAMPLES_PASSED); rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); rend_data_ctx.state.set_depth_mask(GL_TRUE); @@ -521,7 +521,7 @@ namespace rndr { shader_data.g_transform[1] = mat.row1; shader_data.g_transform[2] = mat.row2; shader_data.g_transform[3] = mat.row3; - rctx_ptr->sun_quad_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(rctx_ptr->sun_quad_ubo, shader_data); rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); @@ -589,7 +589,7 @@ namespace rndr { quad.g_color = { param_x, param_y, param_z, param_w }; quad.g_texture_lod = 0.0f; - rctx_ptr->quad_ubo.WriteMemory(rend_data_ctx.state, quad); + rend_data_ctx.state.write_uniform_buffer(rctx_ptr->quad_ubo, quad); rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->quad_ubo); rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); @@ -644,7 +644,7 @@ namespace rndr { (float_t)(-(max_distance * min_distance) * (1.0 / (max_distance - min_distance))), (float_t)min_distance, (float_t)max_distance }; - rctx->contour_coef_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(rctx->contour_coef_ubo, shader_data); shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_CONTOUR); rend_data_ctx.state.bind_uniform_buffer_base(2, rctx->contour_coef_ubo); @@ -1875,7 +1875,7 @@ namespace rndr { shader_data.g_tone_offset.w = gamma > 0.0f ? 2.0f / (gamma * 3.0f) : 0.0f; memcpy(shader_data.g_texcoord_transforms, texcoord_transforms, sizeof(vec4) * 4); - rctx->tone_map_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(rctx->tone_map_ubo, shader_data); rend_data_ctx.state.set_viewport(0, 0, render_width, render_height); taa_buffer[2].begin_render(rend_data_ctx.state); @@ -1991,7 +1991,7 @@ namespace rndr { for (int32_t i = 0; i < 4 && i < ROB_ID_MAX; i++, chara_data++) for (int32_t j = 0; j < 8; j++) exposure_measure.g_spot_coefficients[i * 8 + j] = chara_data->spot_coefficients[j]; - rctx->exposure_measure_ubo.WriteMemory(rend_data_ctx.state, exposure_measure); + rend_data_ctx.state.write_uniform_buffer(rctx->exposure_measure_ubo, exposure_measure); rend_data_ctx.state.set_viewport(0, 0, 32, 1); downsample_texture.begin_render(rend_data_ctx.state); @@ -2061,7 +2061,7 @@ namespace rndr { *(vec3*)&gaussian_coef.g_coef[i] = gauss[i] * intensity; gaussian_coef.g_coef[i].w = 0.0f; } - rctx_ptr->gaussian_coef_ubo.WriteMemory(rend_data_ctx.state, gaussian_coef); + rend_data_ctx.state.write_uniform_buffer(rctx_ptr->gaussian_coef_ubo, gaussian_coef); } void Render::calc_taa_blend() { @@ -2182,7 +2182,7 @@ namespace rndr { const float_t angle_sin = sinf(angle); const float_t angle_cos = cosf(angle); - float_t* data = (float_t*)rctx_ptr->lens_ghost_vbo.MapMemory(rend_data_ctx.state); + float_t* data = (float_t*)rend_data_ctx.state.map_array_buffer(rctx_ptr->lens_ghost_vbo); if (!data) return; @@ -2200,7 +2200,7 @@ namespace rndr { make_ghost_quad((uint8_t)(i & 0x03), opacity, &mat, data); } - rctx_ptr->lens_ghost_vbo.UnmapMemory(rend_data_ctx.state); + rend_data_ctx.state.unmap_array_buffer(rctx_ptr->lens_ghost_vbo); rend_data_ctx.state.set_viewport(0, 0, render_width[0], render_height[0]); rend_texture[0].begin_render(rend_data_ctx.state); diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index ed98e416..2dc48bad 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -431,10 +431,10 @@ void render_data::init() { inv_view_mat = mat4_identity; if (GLAD_GL_VERSION_4_3) - buffer_skinning.WriteMemory(gl_state, + gl_state.write_shader_storage_buffer(buffer_skinning, 0, sizeof(obj_skinning_data), &buffer_skinning_data); else - buffer_skinning_ubo.WriteMemory(gl_state, + gl_state.write_uniform_buffer(buffer_skinning_ubo, 0, sizeof(obj_skinning_data), &buffer_skinning_data); } @@ -495,10 +495,10 @@ void render_data::set_skinning_data(p_gl_rend_state& p_gl_rend_st, const mat4* m } if (GLAD_GL_VERSION_4_3) - buffer_skinning.WriteMemory(p_gl_rend_st, + p_gl_rend_st.write_shader_storage_buffer(buffer_skinning, 0, sizeof(vec4) * 3 * count, &buffer_skinning_data); else - buffer_skinning_ubo.WriteMemory(p_gl_rend_st, + p_gl_rend_st.write_uniform_buffer(buffer_skinning_ubo, 0, sizeof(vec4) * 3 * count, &buffer_skinning_data); } } @@ -507,12 +507,12 @@ void render_data::set_state(p_gl_rend_state& p_gl_rend_st) { shaders_ft.set(p_gl_rend_st, shader_flags, shader_index); if (flags & RENDER_DATA_SHADER_UPDATE) { - buffer_shader.WriteMemory(p_gl_rend_st, buffer_shader_data); + p_gl_rend_st.write_uniform_buffer(buffer_shader, buffer_shader_data); enum_and(flags, ~RENDER_DATA_SHADER_UPDATE); } if (flags & RENDER_DATA_SCENE_UPDATE) { - buffer_scene.WriteMemory(p_gl_rend_st, buffer_scene_data); + p_gl_rend_st.write_uniform_buffer(buffer_scene, buffer_scene_data); enum_and(flags, ~RENDER_DATA_SCENE_UPDATE); } @@ -559,7 +559,7 @@ void render_data::set_state(p_gl_rend_state& p_gl_rend_st) { buffer_batch_data.g_joint_inverse[1] = temp.row1; buffer_batch_data.g_joint_inverse[2] = temp.row2; - buffer_batch.WriteMemory(p_gl_rend_st, buffer_batch_data); + p_gl_rend_st.write_uniform_buffer(buffer_batch, buffer_batch_data); enum_and(flags, ~RENDER_DATA_BATCH_UPDATE); } @@ -767,11 +767,11 @@ void render_data_context::set_batch_worlds(const mat4& mat) { void render_data_context::set_glitter_render_data_state() { data.buffer_shader_data.set_shader_flags(data.shader_flags.arr); - data.buffer_shader.WriteMemory(state, data.buffer_shader_data); + state.write_uniform_buffer(data.buffer_shader, data.buffer_shader_data); state.bind_uniform_buffer_base(0, data.buffer_shader); if (data.flags & RENDER_DATA_SCENE_UPDATE) { - data.buffer_scene.WriteMemory(state, data.buffer_scene_data); + state.write_uniform_buffer(data.buffer_scene, data.buffer_scene_data); enum_and(data.flags, ~RENDER_DATA_SCENE_UPDATE); } state.bind_uniform_buffer_base(1, data.buffer_scene); @@ -1670,7 +1670,7 @@ void render_context::pre_proc() { const size_t align = size - i.offset; if (align) memset((void*)((size_t)i.data + i.offset), 0, align); - i.buffer.WriteMemory(gl_state, 0, size, i.data); + gl_state.write_uniform_buffer(i.buffer, 0, size, i.data); } for (render_context::shared_uniform_buffer& i : shared_uniform_buffers) { @@ -1681,7 +1681,7 @@ void render_context::pre_proc() { const size_t align = size - i.offset; if (align) memset((void*)((size_t)i.data + i.offset), 0, align); - i.buffer.WriteMemory(gl_state, 0, size, i.data); + gl_state.write_uniform_buffer(i.buffer, 0, size, i.data); } for (render_context::texture_skinning_buffer& i : texture_skinning_buffers) { diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index 7c000478..55e0f8de 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -1204,7 +1204,7 @@ namespace rndr { quad_shader_data quad_data = {}; quad_data.g_texcoord_modifier = { 0.5f, 0.5f, 0.5f, 0.5f }; - rctx->quad_ubo.WriteMemory(rend_data_ctx.state, quad_data); + rend_data_ctx.state.write_uniform_buffer(rctx->quad_ubo, quad_data); contour_params_shader_data contour_params_data = {}; const double_t max_distance = cam.get_max_distance(); @@ -1214,7 +1214,7 @@ namespace rndr { (float_t)(-(max_distance * min_distance) * (1.0 / (max_distance - min_distance))), (float_t)min_distance, (float_t)max_distance }; - rctx->contour_params_ubo.WriteMemory(rend_data_ctx.state, contour_params_data); + rend_data_ctx.state.write_uniform_buffer(rctx->contour_params_ubo, contour_params_data); shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_CONTOUR_NPR); rend_data_ctx.state.active_bind_texture_2d(14, rt->get_depth_texture_glid()); @@ -1271,13 +1271,13 @@ void image_filter_scale(render_data_context& rend_data_ctx, image_filter_scene_shader_data filter_scene = {}; filter_scene.g_transform = { 1.0f, 1.0f, 0.0f, 0.0f }; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; - rctx->image_filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); + rend_data_ctx.state.write_uniform_buffer(rctx->image_filter_scene_ubo, filter_scene); image_filter_batch_shader_data image_filter_batch = {}; image_filter_batch.g_color_scale = scale; image_filter_batch.g_color_offset = 0.0f; image_filter_batch.g_texture_lod = 0.0f; - rctx->image_filter_batch_ubo.WriteMemory(rend_data_ctx.state, image_filter_batch); + rend_data_ctx.state.write_uniform_buffer(rctx->image_filter_batch_ubo, image_filter_batch); rend_data_ctx.shader_flags.arr[U_IMAGE_FILTER] = 5; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_IMGFILT); @@ -1421,7 +1421,7 @@ static void apply_esm_filter(render_data_context& rend_data_ctx, esm_filter_scene_shader_data filter_scene = {}; filter_scene.g_transform = 0.0f; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; - rctx->esm_filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); + rend_data_ctx.state.write_uniform_buffer(rctx->esm_filter_scene_ubo, filter_scene); esm_filter_batch_shader_data esm_filter_batch = {}; double_t v6 = 1.0 / (sqrt(M_PI * 2.0) * sigma); @@ -1438,7 +1438,7 @@ static void apply_esm_filter(render_data_context& rend_data_ctx, buf->begin_render(rend_data_ctx.state); esm_filter_batch.g_params = { 1.0f / (float_t)dst_tex->width, 0.0f, far_texel_offset, far_texel_offset }; - rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch); + rend_data_ctx.state.write_uniform_buffer(rctx->esm_filter_batch_ubo, esm_filter_batch); rend_data_ctx.state.active_bind_texture_2d(0, src_tex->glid); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); @@ -1447,7 +1447,7 @@ static void apply_esm_filter(render_data_context& rend_data_ctx, dst->begin_render(rend_data_ctx.state); esm_filter_batch.g_params = { 0.0f, 1.0f / (float_t)dst_tex->height, far_texel_offset, far_texel_offset }; - rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch); + rend_data_ctx.state.write_uniform_buffer(rctx->esm_filter_batch_ubo, esm_filter_batch); rend_data_ctx.state.active_bind_texture_2d(0, buf_tex->glid); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); @@ -1474,7 +1474,7 @@ static void apply_esm_min_filter(render_data_context& rend_data_ctx, esm_filter_scene_shader_data filter_scene = {}; filter_scene.g_transform = 0.0f; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; - rctx->esm_filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); + rend_data_ctx.state.write_uniform_buffer(rctx->esm_filter_scene_ubo, filter_scene); esm_filter_batch_shader_data esm_filter_batch = {}; esm_filter_batch.g_gauss[0] = 0.0f; @@ -1488,7 +1488,7 @@ static void apply_esm_min_filter(render_data_context& rend_data_ctx, buf->begin_render(rend_data_ctx.state); esm_filter_batch.g_params = { 1.0f / (float_t)src_tex->width, 1.0f / (float_t)src_tex->height, 0.0f, 0.0f }; - rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch); + rend_data_ctx.state.write_uniform_buffer(rctx->esm_filter_batch_ubo, esm_filter_batch); rend_data_ctx.shader_flags.arr[U_ESM_FILTER] = 0; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_ESMFILT); @@ -1502,7 +1502,7 @@ static void apply_esm_min_filter(render_data_context& rend_data_ctx, dst->begin_render(rend_data_ctx.state); esm_filter_batch.g_params = { 0.75f / (float_t)buf_tex->width, 0.75f / (float_t)buf_tex->height, 0.0f, 0.0f }; - rctx->esm_filter_batch_ubo.WriteMemory(rend_data_ctx.state, esm_filter_batch); + rend_data_ctx.state.write_uniform_buffer(rctx->esm_filter_batch_ubo, esm_filter_batch); rend_data_ctx.shader_flags.arr[U_ESM_FILTER] = 1; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_ESMFILT); @@ -1992,7 +1992,7 @@ static void apply_blur_filter_sub(render_data_context& rend_data_ctx, RenderText float_t h = res_scale.y / (float_t)src->get_height(); filter_scene.g_transform = { w, h, 0.0f, 0.0f }; filter_scene.g_texcoord = { 1.0f, 1.0f, 0.0f, 0.0f }; - rctx->image_filter_scene_ubo.WriteMemory(rend_data_ctx.state, filter_scene); + rend_data_ctx.state.write_uniform_buffer(rctx->image_filter_scene_ubo, filter_scene); image_filter_batch_shader_data image_filter_batch = {}; if (filter == BLUR_FILTER_32) @@ -2001,7 +2001,7 @@ static void apply_blur_filter_sub(render_data_context& rend_data_ctx, RenderText image_filter_batch.g_color_scale = scale * (float_t)(1.0 / 4.0); image_filter_batch.g_color_offset = offset; image_filter_batch.g_texture_lod = 0.0f; - rctx->image_filter_batch_ubo.WriteMemory(rend_data_ctx.state, image_filter_batch); + rend_data_ctx.state.write_uniform_buffer(rctx->image_filter_batch_ubo, image_filter_batch); rend_data_ctx.shader_flags.arr[U_IMAGE_FILTER] = filter == BLUR_FILTER_32 ? 1 : 0; rend_data_ctx.state.bind_vertex_array(rctx->box_vao); diff --git a/src/CRE/renderer/dof.cpp b/src/CRE/renderer/dof.cpp index 23f1b3ac..9aa2b33f 100644 --- a/src/CRE/renderer/dof.cpp +++ b/src/CRE/renderer/dof.cpp @@ -386,7 +386,7 @@ namespace renderer { shader_data.g_dof_param.y = dof_param_prefilter_tap_num; shader_data.g_dof_param.z = dof_param_sample_division; shader_data.g_dof_param.w = dof_param_upsample_tap_num; - common_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(common_ubo, shader_data); } template diff --git a/src/CRE/renderer/transparency.cpp b/src/CRE/renderer/transparency.cpp index d7bcbce8..845418c6 100644 --- a/src/CRE/renderer/transparency.cpp +++ b/src/CRE/renderer/transparency.cpp @@ -42,7 +42,7 @@ namespace renderer { void Transparency::combine(render_data_context& rend_data_ctx, RenderTexture* rt, float_t alpha) { transparency_batch_shader_data shader_data = {}; shader_data.g_opacity = { alpha, 0.0f, 0.0f, 0.0f }; - rctx_ptr->transparency_batch_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(rctx_ptr->transparency_batch_ubo, shader_data); rend_data_ctx.state.disable_blend(); rend_data_ctx.state.disable_depth_test(); diff --git a/src/CRE/rob/ex_block.cpp b/src/CRE/rob/ex_block.cpp index 691f8cb4..ca61085c 100644 --- a/src/CRE/rob/ex_block.cpp +++ b/src/CRE/rob/ex_block.cpp @@ -4331,8 +4331,8 @@ static void modify_cloth_object(obj_mesh* mesh, VertexBuffer* vb, return; vb->flip(); - GL::ArrayBuffer glvb = vb->get_glvb(); - size_t data = (size_t)glvb.MapMemory(gl_state); + GLuint glvb = vb->get_glvb(); + size_t data = (size_t)gl_state.map_array_buffer(glvb); if (!data) return; @@ -4468,5 +4468,5 @@ static void modify_cloth_object(obj_mesh* mesh, VertexBuffer* vb, break; } - glvb.UnmapMemory(gl_state); + gl_state.unmap_array_buffer(glvb); } diff --git a/src/CRE/rob/rob.cpp b/src/CRE/rob/rob.cpp index 4088d17e..6f2e0590 100644 --- a/src/CRE/rob/rob.cpp +++ b/src/CRE/rob/rob.cpp @@ -18110,8 +18110,8 @@ void rob_chara_age_age_object::disp(render_context* rctx, size_t id, vb.flip(); - GL::ArrayBuffer glvb = vb.get_glvb(); - size_t vtx_data = (size_t)glvb.MapMemory(gl_state); + GLuint glvb = vb.get_glvb(); + size_t vtx_data = (size_t)gl_state.map_array_buffer(glvb); if (!vtx_data) return; @@ -18120,7 +18120,7 @@ void rob_chara_age_age_object::disp(render_context* rctx, size_t id, memmove((void*)(vtx_data + vertex_array_size * i), (void*)((size_t)vertex_data + vertex_array_size * v44[i].second), vertex_array_size); - glvb.UnmapMemory(gl_state); + gl_state.unmap_array_buffer(glvb); mesh.num_vertex = disp_count * num_vertex; sub_mesh.num_index = disp_count * num_index; diff --git a/src/CRE/shader_ft.cpp b/src/CRE/shader_ft.cpp index e48cd4d7..0843a3c3 100644 --- a/src/CRE/shader_ft.cpp +++ b/src/CRE/shader_ft.cpp @@ -2886,7 +2886,7 @@ static void glass_eye_set(p_gl_rend_state& p_gl_rend_st, glass_eye_struct* glass glass_eye_batch.g_tex_scale.w = glass_eye->lens_depth; extern render_context* rctx_ptr; - rctx_ptr->glass_eye_batch_ubo.WriteMemory(p_gl_rend_st, glass_eye_batch); + p_gl_rend_st.write_uniform_buffer(rctx_ptr->glass_eye_batch_ubo, glass_eye_batch); p_gl_rend_st.bind_uniform_buffer_base(3, rctx_ptr->glass_eye_batch_ubo); } diff --git a/src/CRE/sprite.cpp b/src/CRE/sprite.cpp index e6bdfabd..966d5638 100644 --- a/src/CRE/sprite.cpp +++ b/src/CRE/sprite.cpp @@ -1734,7 +1734,7 @@ namespace spr { gl_state.bind_vertex_array(0); } - vbo.WriteMemory(gl_state, 0, vertex_buffer.size(), vertex_buffer.data()); + gl_state.write_element_array_buffer(vbo, 0, vertex_buffer.size(), vertex_buffer.data()); if (ebo_index_count < index_buffer.size()) { while (ebo_index_count < index_buffer.size()) @@ -1753,7 +1753,7 @@ namespace spr { gl_state.bind_element_array_buffer(0); } - ebo.WriteMemory(gl_state, 0, sizeof(uint32_t) * index_buffer.size(), index_buffer.data()); + gl_state.write_element_array_buffer(ebo, 0, sizeof(uint32_t) * index_buffer.size(), index_buffer.data()); gl_state.bind_array_buffer(0); gl_state.bind_element_array_buffer(0); @@ -1955,7 +1955,7 @@ namespace spr { 1.0f / (float_t)overlay_tex->height, 0.0f, 0.0f }; mat4_transpose(&view_projection, &shader_data.g_transform); - rctx_ptr->sprite_scene_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(rctx_ptr->sprite_scene_ubo, shader_data); rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->sprite_scene_ubo); for (uint32_t j = SPR_PRIO_MAX; j; j--, obj_list++) diff --git a/src/CRE/sss.cpp b/src/CRE/sss.cpp index 970de1c1..b2be8b05 100644 --- a/src/CRE/sss.cpp +++ b/src/CRE/sss.cpp @@ -78,7 +78,7 @@ void sss_data::apply_filter(struct render_data_context& rend_data_ctx) { sss_calc_coef(1.0, sss_count, reflect_draw ? sss_inverse_scale_reflect : sss_inverse_scale, 3, weights, r_radius, g_radius, b_radius, shader_data.g_coef); - rctx->sss_filter_gaussian_coef_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.write_uniform_buffer(rctx->sss_filter_gaussian_coef_ubo, shader_data); textures[reflect_draw ? 3 : 1].begin_render(rend_data_ctx.state); rend_data_ctx.state.set_viewport(0, 0, 320, 180); rend_data_ctx.shader_flags.arr[U_SSS_FILTER] = 3; diff --git a/src/ReDIVA/app.cpp b/src/ReDIVA/app.cpp index c53211a6..0370f2e2 100644 --- a/src/ReDIVA/app.cpp +++ b/src/ReDIVA/app.cpp @@ -1242,7 +1242,7 @@ static void render_context_disp(render_context* rctx) { shader_data.g_vp[3] = mat.row3; shader_data.g_texture_lod.x = ibl_index == 1 ? 1.0f : 0.0f; shader_data.g_texture_lod.y = 1.0f / (float_t)ibl_scale; - rctx_ptr->glitter_batch_ubo.WriteMemory(post_rend_data_ctx.state, shader_data); + post_rend_data_ctx.state.write_uniform_buffer(rctx_ptr->glitter_batch_ubo, shader_data); post_rend_data_ctx.state.bind_uniform_buffer_base(3, rctx_ptr->glitter_batch_ubo); shaders_dev.set(post_rend_data_ctx.state, post_rend_data_ctx.shader_flags, SHADER_DEV_CUBEMAP_DISPLAY); diff --git a/src/ReDIVA/x_pv_game.cpp b/src/ReDIVA/x_pv_game.cpp index 2d2bf471..40187030 100644 --- a/src/ReDIVA/x_pv_game.cpp +++ b/src/ReDIVA/x_pv_game.cpp @@ -7969,7 +7969,7 @@ void x_pv_game::post() { quad.g_color = 1.0f; quad.g_texture_lod = 0.0f; - rctx_ptr->quad_ubo.WriteMemory(rend_data_ctx.state, quad); + rend_data_ctx.state.write_uniform_buffer(rctx_ptr->quad_ubo, quad); rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->quad_ubo); rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4);