generated from Persson-dev/OpenGLComputeShader
fix shader buffer size
This commit is contained in:
16
src/Main.cpp
16
src/Main.cpp
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user