TerraForge3D  2.3.1
3D Terrain And Landscape Generator
ComputeShader.cpp
1#include "ComputeShader.h"
2#include <ShaderUtils.h>
3
4
5ComputeShader::ComputeShader(std::string source)
6{
7 GLuint shader = CompileShader(source, GL_COMPUTE_SHADER, "Compute Shader");
8 m_Shader = CreateProgram();
9 glAttachShader(m_Shader, shader);
10 glLinkProgram(m_Shader);
11 GLint isLinked = 0;
12 glGetProgramiv(m_Shader, GL_LINK_STATUS, (int *)&isLinked);
13
14 if (isLinked == GL_FALSE)
15 {
16 GLint maxLength = 0;
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);
23 Log(errorLog);
24 return;
25 }
26
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);
36}
37
38ComputeShader::~ComputeShader()
39{
40 glDeleteProgram(m_Shader);
41}
42
43void ComputeShader::Bind()
44{
45 glUseProgram(m_Shader);
46}
47
48void ComputeShader::SetUniformf(std::string name, float value)
49{
50 uint32_t loc = glGetUniformLocation(m_Shader, name.c_str());
51 glUniform1f(loc, value);
52}
53
54void ComputeShader::SetUniform3f(std::string name, float *value)
55{
56}
57
58void ComputeShader::SetUniformi(std::string name, int value)
59{
60 uint32_t loc = glGetUniformLocation(m_Shader, name.c_str());
61 glUniform1i(loc, value);
62}
63
64void ComputeShader::SetUniformMat4(std::string name, glm::mat4 &value)
65{
66}
67
68void ComputeShader::SetVec3(std::string name, float a, float b, float c)
69{
70 uint32_t loc = glGetUniformLocation(m_Shader, name.c_str());
71 glUniform3f(loc, a, b, c);
72}
73
74void ComputeShader::Unbind()
75{
76 glUseProgram(0);
77}
78
79void ComputeShader::Dispatch(int x, int y, int z)
80{
81 glDispatchCompute(x, y, z);
82}
83
84void ComputeShader::SetMemoryBarrier()
85{
86 glMemoryBarrier(GL_ALL_BARRIER_BITS);
87}