Skip to content

Commit 8213925

Browse files
committed
support compute shader
1 parent eaec361 commit 8213925

File tree

2 files changed

+25
-15
lines changed

2 files changed

+25
-15
lines changed

library/src/main/jni/cge/common/cgeShaderFunctions.cpp

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -135,15 +135,15 @@ void UniformParameters::pushf(const char* name, GLfloat x, GLfloat y, GLfloat z,
135135
void UniformParameters::pushSampler1D(const char* name, GLuint* textureID, GLint textureBindID)
136136
{
137137
UniformData* data = new UniformData(name, uniformSAMPLER1D);
138-
data->uniformValue[0].valueuPtr = textureID;
138+
data->uniformValue[0].valuePtr = textureID;
139139
data->uniformValue[1].valuei = textureBindID;
140140
m_vecUniforms.push_back(data);
141141
}
142142

143143
void UniformParameters::pushSampler2D(const char* name, GLuint* textureID, GLint textureBindID)
144144
{
145145
UniformData* data = new UniformData(name, uniformSAMPLER2D);
146-
data->uniformValue[0].valueuPtr = textureID;
146+
data->uniformValue[0].valuePtr = textureID;
147147
data->uniformValue[1].valuei = textureBindID;
148148
m_vecUniforms.push_back(data);
149149
}
@@ -217,15 +217,15 @@ void UniformParameters::assignUniforms(CGEImageHandlerInterface* hander, GLuint
217217
#ifdef GL_TEXTURE_1D
218218
int texutreBindID = CGE_TEXTURE_START + (*iter)->uniformValue[1].valuei;
219219
glActiveTexture(texutreBindID);
220-
glBindTexture(GL_TEXTURE_1D, *(*iter)->uniformValue[0].valueuPtr);
220+
glBindTexture(GL_TEXTURE_1D, *(*iter)->uniformValue[0].valuePtr);
221221
glUniform1i(uniformID, texutreBindID - GL_TEXTURE0);
222222
#endif
223223
}
224224
break;
225225
case uniformSAMPLER2D: {
226226
int texutreBindID = CGE_TEXTURE_START + (*iter)->uniformValue[1].valuei;
227227
glActiveTexture(texutreBindID);
228-
glBindTexture(GL_TEXTURE_2D, *(*iter)->uniformValue[0].valueuPtr);
228+
glBindTexture(GL_TEXTURE_2D, *(*iter)->uniformValue[0].valuePtr);
229229
glUniform1i(uniformID, texutreBindID - GL_TEXTURE0);
230230
}
231231
break;
@@ -306,14 +306,19 @@ ProgramObject::~ProgramObject()
306306
glDeleteProgram(m_programID);
307307
}
308308

309+
bool ProgramObject::initWithComputeShader(const char* csh)
310+
{
311+
return m_fragOrComputeShader.init(GL_COMPUTE_SHADER) && m_fragOrComputeShader.loadShaderSourceFromString(csh) && linkWithShaderObject(m_fragOrComputeShader, m_fragOrComputeShader, true);
312+
}
313+
309314
bool ProgramObject::initFragmentShaderSourceFromString(const char* fragShader)
310315
{
311-
return m_fragObj.init(GL_FRAGMENT_SHADER) && m_fragObj.loadShaderSourceFromString(fragShader);
316+
return m_fragOrComputeShader.init(GL_FRAGMENT_SHADER) && m_fragOrComputeShader.loadShaderSourceFromString(fragShader);
312317
}
313318

314319
bool ProgramObject::initVertexShaderSourceFromString(const char* vertShader)
315320
{
316-
return m_vertObj.init(GL_VERTEX_SHADER) && m_vertObj.loadShaderSourceFromString(vertShader);
321+
return m_vertShader.init(GL_VERTEX_SHADER) && m_vertShader.loadShaderSourceFromString(vertShader);
317322
}
318323

319324
bool ProgramObject::initWithShaderStrings(const char* vsh, const char* fsh)
@@ -338,17 +343,21 @@ bool ProgramObject::linkWithShaderObject(ShaderObject& vertObj, ShaderObject& fr
338343
{
339344
m_programID = glCreateProgram();
340345
}
346+
341347
GLint programStatus;
342-
glAttachShader(m_programID, vertObj.shaderID());
348+
349+
if (vertObj.shaderID() != fragObj.shaderID()) /// equals when using compute shader.
350+
glAttachShader(m_programID, vertObj.shaderID());
343351
glAttachShader(m_programID, fragObj.shaderID());
352+
344353
cgeCheckGLError("Attach Shaders in useProgram");
345354
glLinkProgram(m_programID);
346355
glGetProgramiv(m_programID, GL_LINK_STATUS, &programStatus);
347356

348357
if (shouldClear)
349358
{
350-
m_vertObj.clear();
351-
m_fragObj.clear();
359+
m_vertShader.clear();
360+
m_fragOrComputeShader.clear();
352361
}
353362

354363
if (programStatus != GL_TRUE)

library/src/main/jni/cge/common/cgeShaderFunctions.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class UniformParameters
7373
{
7474
GLfloat valuef;
7575
GLint valuei;
76-
GLuint* valueuPtr;
76+
GLuint* valuePtr;
7777
} UniformValue;
7878

7979
typedef struct UniformData
@@ -131,20 +131,21 @@ class UniformParameters
131131

132132
class ProgramObject
133133
{
134-
private:
135-
explicit ProgramObject(const ProgramObject&) {}
136-
137134
public:
138135
ProgramObject();
139136
~ProgramObject();
137+
explicit ProgramObject(const ProgramObject&) = delete;
138+
139+
// For compute shader
140+
bool initWithComputeShader(const char* csh);
140141

141142
bool initWithShaderStrings(const char* vsh, const char* fsh);
142143

143144
bool initFragmentShaderSourceFromString(const char* fragShader);
144145
bool initVertexShaderSourceFromString(const char* vertShader);
145146

146147
bool linkWithShaderObject(ShaderObject& vertObj, ShaderObject& fragObj, bool shouldClear = true);
147-
inline bool link() { return linkWithShaderObject(m_vertObj, m_fragObj); }
148+
inline bool link() { return linkWithShaderObject(m_vertShader, m_fragOrComputeShader); }
148149
inline void bind() { glUseProgram(m_programID); }
149150

150151
// For usage convenience, do not use template here.
@@ -230,7 +231,7 @@ class ProgramObject
230231
}
231232

232233
private:
233-
ShaderObject m_vertObj, m_fragObj;
234+
ShaderObject m_vertShader, m_fragOrComputeShader;
234235
GLuint m_programID;
235236
};
236237

0 commit comments

Comments
 (0)