fix shader buffer size

This commit is contained in:
2025-11-09 11:06:44 +01:00
parent e7edf0cf6f
commit 9c4894eda2

View File

@@ -8,7 +8,10 @@
#include <chrono> #include <chrono>
constexpr int PARTICLE_COUNT = 64 * 5000; constexpr int WORK_GROUP_SIZE = 64;
constexpr int PARTICLE_COUNT = WORK_GROUP_SIZE * 1000;
constexpr int SWAP_INTERVAL = 60;
class Timer { class Timer {
public: public:
@@ -51,6 +54,7 @@ static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, i
if (key == GLFW_KEY_R) { if (key == GLFW_KEY_R) {
s_ComputeShader = ReloadComputeShader(s_ComputeShader, s_ComputeShaderPath); s_ComputeShader = ReloadComputeShader(s_ComputeShader, s_ComputeShaderPath);
s_GraphicsShader = ReloadGraphicsShader(s_GraphicsShader, s_VertexShaderPath, s_FragmentShaderPath); s_GraphicsShader = ReloadGraphicsShader(s_GraphicsShader, s_VertexShaderPath, s_FragmentShaderPath);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(float) * PARTICLE_COUNT * 2, nullptr, GL_DYNAMIC_COPY);
} }
} }
@@ -72,12 +76,12 @@ static GLuint CreateDummyVAO() {
return vertexArray; return vertexArray;
} }
static void CreateGpuBuffer(std::size_t a_Size) { static void CreateGpuBuffer() {
GLuint ssbo; GLuint ssbo;
glGenBuffers(1, &ssbo); glGenBuffers(1, &ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo); glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, ssbo); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, ssbo);
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(float) * a_Size, nullptr, glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(float) * 2 * PARTICLE_COUNT, nullptr,
GL_DYNAMIC_COPY); // sizeof(data) only works for statically sized C/C++ arrays. GL_DYNAMIC_COPY); // sizeof(data) only works for statically sized C/C++ arrays.
} }
@@ -103,7 +107,7 @@ static GLFWwindow* InitWindow() {
glfwMakeContextCurrent(window); glfwMakeContextCurrent(window);
gladLoadGL(); gladLoadGL();
glfwSwapInterval(1); glfwSwapInterval(SWAP_INTERVAL);
s_ComputeShader = CreateComputeShader(s_ComputeShaderPath); s_ComputeShader = CreateComputeShader(s_ComputeShaderPath);
if (s_ComputeShader == -1) { if (s_ComputeShader == -1) {
@@ -127,7 +131,7 @@ int main() {
auto vertexArray = CreateDummyVAO(); auto vertexArray = CreateDummyVAO();
CreateGpuBuffer(PARTICLE_COUNT); CreateGpuBuffer();
float lastTime = (float)glfwGetTime(); float lastTime = (float)glfwGetTime();
@@ -154,7 +158,7 @@ int main() {
// Compute // Compute
glUseProgram(s_ComputeShader); glUseProgram(s_ComputeShader);
glDispatchCompute(PARTICLE_COUNT / 64, 1, 1); glDispatchCompute(PARTICLE_COUNT / WORK_GROUP_SIZE, 1, 1);
// Ensure all writes to the image are complete // Ensure all writes to the image are complete
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);