From 679edee591a47d6129f0c00d8febe856ae89f717 Mon Sep 17 00:00:00 2001 From: Daynlight Date: Sat, 23 May 2026 17:29:29 +0100 Subject: [PATCH] SSBO_BUFFER --- CWindow/Renderer/OpenGL/CMakeLists.txt | 3 ++ CWindow/Renderer/OpenGL/Renderer.h | 1 + .../Renderer/OpenGL/Shader/SSBO/Shader.cpp | 50 +++++++++++++++++++ CWindow/Renderer/OpenGL/Shader/SSBO/Shader.h | 46 +++++++++++++++++ .../Renderer/OpenGL/Shader/SSBO/Shader.hpp | 23 +++++++++ 5 files changed, 123 insertions(+) create mode 100644 CWindow/Renderer/OpenGL/Shader/SSBO/Shader.cpp create mode 100644 CWindow/Renderer/OpenGL/Shader/SSBO/Shader.h create mode 100644 CWindow/Renderer/OpenGL/Shader/SSBO/Shader.hpp diff --git a/CWindow/Renderer/OpenGL/CMakeLists.txt b/CWindow/Renderer/OpenGL/CMakeLists.txt index 690d938..22337f5 100644 --- a/CWindow/Renderer/OpenGL/CMakeLists.txt +++ b/CWindow/Renderer/OpenGL/CMakeLists.txt @@ -17,6 +17,9 @@ set(src "Shader/Compute/Shader.cpp" "Shader/Compute/Shader.hpp" "Shader/Compute/Shader.h" + "Shader/SSBO/Shader.cpp" + "Shader/SSBO/Shader.hpp" + "Shader/SSBO/Shader.h" "Uniform/Uniform.cpp" "Uniform/Uniform.h" "Texture/Texture.cpp" diff --git a/CWindow/Renderer/OpenGL/Renderer.h b/CWindow/Renderer/OpenGL/Renderer.h index f43d5f4..f8cd725 100644 --- a/CWindow/Renderer/OpenGL/Renderer.h +++ b/CWindow/Renderer/OpenGL/Renderer.h @@ -6,6 +6,7 @@ #include "Shader/Shader/Shader.h" #include "Shader/Compute/Shader.h" +#include "Shader/SSBO/Shader.h" #include "Uniform/Uniform.h" diff --git a/CWindow/Renderer/OpenGL/Shader/SSBO/Shader.cpp b/CWindow/Renderer/OpenGL/Shader/SSBO/Shader.cpp new file mode 100644 index 0000000..8e62492 --- /dev/null +++ b/CWindow/Renderer/OpenGL/Shader/SSBO/Shader.cpp @@ -0,0 +1,50 @@ +#include "Shader.h" + + + + + + + +CW::Renderer::GPUStore::GPUStore() noexcept + :is_created(false) {}; + + + +CW::Renderer::GPUStore::~GPUStore() noexcept { + destroy(); +}; + + +void CW::Renderer::GPUStore::create() noexcept{ + if(is_created) + destroy(); + + glGenBuffers(1, &SSBO); + is_created = true; +} + +void CW::Renderer::GPUStore::destroy() noexcept { + if (is_created){ + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, slot, 0); + glDeleteBuffers(1, &SSBO); + SSBO = 0; + slot = 0; + }; + + is_created = false; +}; + + + +void CW::Renderer::GPUStore::bind(GLuint socket) noexcept{ + this->slot = socket; + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, socket, SSBO); +}; + + + +void CW::Renderer::GPUStore::unbind() noexcept{ + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, slot, 0); + slot = 0; +}; diff --git a/CWindow/Renderer/OpenGL/Shader/SSBO/Shader.h b/CWindow/Renderer/OpenGL/Shader/SSBO/Shader.h new file mode 100644 index 0000000..c1490e4 --- /dev/null +++ b/CWindow/Renderer/OpenGL/Shader/SSBO/Shader.h @@ -0,0 +1,46 @@ +#pragma once + +#include "glad/glad.h" +#include "GLFW/glfw3.h" +#include "glm/glm.hpp" + +#include +#include + + + + + + + +namespace CW::Renderer{ +class GPUStore{ +private: + GLuint SSBO; + + bool is_created = false; + unsigned int data_size = 0; + GLuint slot = 0; + +public: + GPUStore() noexcept; + ~GPUStore() noexcept; + + void create() noexcept; + void destroy() noexcept; + + template + void set(const std::vector& data) noexcept; + + void bind(GLuint socket = 0) noexcept; + void unbind() noexcept; +}; +}; + + + + + + + +#include "Shader.hpp" \ No newline at end of file diff --git a/CWindow/Renderer/OpenGL/Shader/SSBO/Shader.hpp b/CWindow/Renderer/OpenGL/Shader/SSBO/Shader.hpp new file mode 100644 index 0000000..762d84c --- /dev/null +++ b/CWindow/Renderer/OpenGL/Shader/SSBO/Shader.hpp @@ -0,0 +1,23 @@ +#include "Shader.h" + + + + + + + +template +void CW::Renderer::GPUStore::set(const std::vector& data) noexcept { + if (data.empty()) + return; + + if(!is_created) + create(); + + glBindBuffer(GL_SHADER_STORAGE_BUFFER, SSBO); + glBufferData(GL_SHADER_STORAGE_BUFFER, data.size() * sizeof(T), data.data(), GL_DYNAMIC_COPY); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); + + data_size = data.size(); +}; +