1#include "ComputeShader.h"
2#include <ShaderUtils.h>
5ComputeShader::ComputeShader(std::string source)
7 GLuint shader = CompileShader(source, GL_COMPUTE_SHADER,
"Compute Shader");
8 m_Shader = CreateProgram();
9 glAttachShader(m_Shader, shader);
10 glLinkProgram(m_Shader);
12 glGetProgramiv(m_Shader, GL_LINK_STATUS, (
int *)&isLinked);
14 if (isLinked == GL_FALSE)
17 glGetProgramiv(m_Shader, GL_INFO_LOG_LENGTH, &maxLength);
18 char *errorLog = (
char *)malloc(maxLength);
19 memset(errorLog, 0, maxLength);
20 glGetProgramInfoLog(m_Shader, maxLength, &maxLength, errorLog);
21 glDeleteProgram(m_Shader);
22 glDeleteShader(shader);
27 glDetachShader(m_Shader, shader);
28 glDeleteShader(shader);
29 glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, &maxWorkGroupCount[0]);
30 glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, &maxWorkGroupCount[1]);
31 glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, &maxWorkGroupCount[2]);
32 glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 0, &maxWorkGroupSize[0]);
33 glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 1, &maxWorkGroupSize[1]);
34 glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 2, &maxWorkGroupSize[2]);
35 glGetIntegerv(GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS, &maxWorkGroupInvocations);
38ComputeShader::~ComputeShader()
40 glDeleteProgram(m_Shader);
43void ComputeShader::Bind()
45 glUseProgram(m_Shader);
48void ComputeShader::SetUniformf(std::string name,
float value)
50 uint32_t loc = glGetUniformLocation(m_Shader, name.c_str());
51 glUniform1f(loc, value);
54void ComputeShader::SetUniform3f(std::string name,
float *value)
58void ComputeShader::SetUniformi(std::string name,
int value)
60 uint32_t loc = glGetUniformLocation(m_Shader, name.c_str());
61 glUniform1i(loc, value);
64void ComputeShader::SetUniformMat4(std::string name, glm::mat4 &value)
68void ComputeShader::SetVec3(std::string name,
float a,
float b,
float c)
70 uint32_t loc = glGetUniformLocation(m_Shader, name.c_str());
71 glUniform3f(loc, a, b, c);
74void ComputeShader::Unbind()
79void ComputeShader::Dispatch(
int x,
int y,
int z)
81 glDispatchCompute(x, y, z);
84void ComputeShader::SetMemoryBarrier()
86 glMemoryBarrier(GL_ALL_BARRIER_BITS);