Skip to content

Commit 9e3c9cd

Browse files
committed
fix: Work on Mali GPU
1 parent a5cae37 commit 9e3c9cd

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

library/src/main/jni/cge/filters/cgeWaveformFilter.cpp

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,28 @@ static CGEConstString s_fshWaveform = "#version 310 es\n" CGE_SHADER_STRING(
2929
// TODO: 直接使用 255 来描述最亮是没有问题的。 如果要实现颜色亮度叠加. 可以考虑使用 imageAtomicAdd.
3030
});
3131

32+
static CGEConstString s_cshWaveform = "#version 310 es\n" CGE_SHADER_STRING(
33+
precision highp float;
34+
precision highp int;
35+
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
36+
layout(rgba8ui, binding = 0) uniform readonly highp uimage2D inputImageTexture;
37+
layout(rgba8ui, binding = 1) uniform writeonly highp uimage2D outputImage;
38+
39+
void main() {
40+
ivec2 texCoord = ivec2(gl_GlobalInvocationID);
41+
uvec3 color = imageLoad(inputImageTexture, texCoord).rgb;
42+
float lum = dot(vec3(color.rgb), vec3(0.299, 0.587, 0.114));
43+
ivec2 newLoc = ivec2(texCoord.x, uint(lum));
44+
imageStore(outputImage, newLoc, uvec4(255, 255, 255, 255));
45+
});
46+
3247
namespace CGE
3348
{
34-
CGEWaveformFilter::~CGEWaveformFilter()
35-
{
36-
}
49+
CGEWaveformFilter::~CGEWaveformFilter() = default;
3750

3851
bool CGEWaveformFilter::init()
3952
{
40-
if (initShadersFromString(s_vshWaveform, s_fshWaveform))
53+
if (m_program.initWithComputeShader(s_cshWaveform))
4154
{
4255
m_program.bind();
4356
setFormPosition(0.1f, 0.1f);
@@ -49,6 +62,18 @@ bool CGEWaveformFilter::init()
4962
return true;
5063
}
5164

65+
// if (initShadersFromString(s_vshWaveform, s_fshWaveform))
66+
// {
67+
// m_program.bind();
68+
// setFormPosition(0.1f, 0.1f);
69+
// setFormSize(0.3f, 0.3f);
70+
// setColor(0.0f, 0.0f, 0.0f, 0.5f);
71+
// m_drawer.reset(TextureDrawer::create());
72+
// m_drawer->setFlipScale(1.0f, -1.0f); // flip upside down, meet the gl coord.
73+
// m_renderTarget = std::make_unique<FrameBufferWithTexture>();
74+
// return true;
75+
// }
76+
5277
CGE_LOG_ERROR(R"(CGEWaveformFilter::init failed. This filter needs GLES3.1 and later!
5378
Only GLES 3.1+ support image store.
5479
You need to imp a fallback version which reading pixels every frame like `cgeColorMappingFilter`
@@ -70,29 +95,16 @@ void CGEWaveformFilter::render2Texture(CGEImageHandlerInterface* handler, GLuint
7095
glClearColor(0, 0, 0, 1);
7196
glClear(GL_COLOR_BUFFER_BIT);
7297

73-
/// 在部分低端机型上, glClear 可能会发生在 shader write 之后. 这里必须控制一下时序.
74-
/// 经过测试, 使用 glMemoryBarrier(GL_ALL_BARRIER_BITS) 也不管用, 但是 glFlush 可以修复此问题
75-
/// 暂且这么实现.
76-
glFlush();
98+
glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT);
7799

78100
m_program.bind();
79101

80-
/// 渲染不写入, 使用 imageStore 写入.
81-
glColorMask(false, false, false, false);
82-
83-
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
84-
glEnableVertexAttribArray(0);
85-
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
86-
glActiveTexture(GL_TEXTURE0);
87-
glBindTexture(GL_TEXTURE_2D, srcTexture);
88-
89-
glActiveTexture(GL_TEXTURE1);
90-
glBindTexture(GL_TEXTURE_2D, 0);
102+
glBindImageTexture(0, handler->getTargetTextureID(), 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
91103
glBindImageTexture(1, m_renderTarget->texture(), 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8UI);
92104

93-
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
94-
glColorMask(true, true, true, true);
95-
glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT);
105+
glDispatchCompute(sz.width, sz.height, 1);
106+
107+
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
96108

97109
handler->setAsTarget();
98110
glViewport(m_position[0] * sz.width, m_position[1] * sz.height, m_size[0] * sz.width, m_size[1] * sz.height);

0 commit comments

Comments
 (0)