Skip to content

Commit 01a4991

Browse files
committed
Fix: Be compatible with some devices (e.g. Mali-G76)
1 parent d3ab403 commit 01a4991

File tree

2 files changed

+31
-13
lines changed

2 files changed

+31
-13
lines changed

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

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,31 @@ static CGEConstString s_cshWaveform = "#version 310 es\n" CGE_SHADER_STRING(
1717
imageStore(outputImage, newLoc, uvec4(255, 255, 255, 255));
1818
});
1919

20+
static CGEConstString s_cshClearImage = "#version 310 es\n" CGE_SHADER_STRING(
21+
precision highp float;
22+
precision highp int;
23+
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
24+
layout(rgba8ui, binding = 1) uniform writeonly highp uimage2D outputImage;
25+
26+
void main() {
27+
ivec2 texCoord = ivec2(gl_GlobalInvocationID);
28+
imageStore(outputImage, texCoord, uvec4(0, 0, 0, 255));
29+
});
30+
2031
namespace CGE
2132
{
2233
CGEWaveformFilter::~CGEWaveformFilter() = default;
2334

2435
bool CGEWaveformFilter::init()
2536
{
26-
if (m_program.initWithComputeShader(s_cshWaveform))
37+
if (m_program.initWithComputeShader(s_cshWaveform) && m_clearImageProgram.initWithComputeShader(s_cshClearImage))
2738
{
2839
m_program.bind();
2940
setFormPosition(0.1f, 0.1f);
3041
setFormSize(0.3f, 0.3f);
3142
m_drawer.reset(TextureDrawer::create());
3243
m_drawer->setFlipScale(1.0f, -1.0f); // flip upside down, meet the gl coord.
33-
m_renderTarget = std::make_unique<FrameBufferWithTexture>();
44+
m_diagramTexture = std::make_unique<TextureObject>();
3445
return true;
3546
}
3647

@@ -45,21 +56,26 @@ bool CGEWaveformFilter::init()
4556
void CGEWaveformFilter::render2Texture(CGEImageHandlerInterface* handler, GLuint srcTexture, GLuint vertexBufferID)
4657
{
4758
auto&& sz = handler->getOutputFBOSize();
48-
if (sz.width != m_renderTarget->width() || m_renderTarget->texture() == 0)
59+
if (sz.width != m_diagramTexture->width() || m_diagramTexture->texture() == 0)
4960
{
50-
m_renderTarget->bindTexture2D(sz.width, 256);
61+
m_diagramTexture->resize(sz.width, 256);
5162
}
5263

53-
m_renderTarget->bind();
54-
glClearColor(0, 0, 0, 1);
55-
glClear(GL_COLOR_BUFFER_BIT);
64+
glBindImageTexture(0, handler->getTargetTextureID(), 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
65+
glBindImageTexture(1, m_diagramTexture->texture(), 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8UI);
5666

57-
glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT);
67+
// Clear diagram texture before frame.
68+
// You can also use glClear(GL_COLOR_BUFFER_BIT) on some devices.
69+
{
70+
// @attention: glClear does not work on some devices. e.g. Mali-G76
71+
// Perform clear with a compute shader.
72+
m_clearImageProgram.bind();
73+
glDispatchCompute(sz.width, sz.height, 1);
74+
}
5875

59-
m_program.bind();
76+
// glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
6077

61-
glBindImageTexture(0, handler->getTargetTextureID(), 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
62-
glBindImageTexture(1, m_renderTarget->texture(), 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8UI);
78+
m_program.bind();
6379

6480
glDispatchCompute(sz.width, sz.height, 1);
6581

@@ -73,7 +89,7 @@ void CGEWaveformFilter::render2Texture(CGEImageHandlerInterface* handler, GLuint
7389

7490
handler->setAsTarget();
7591
glViewport(m_position[0] * sz.width, m_position[1] * sz.height, m_size[0] * sz.width, m_size[1] * sz.height);
76-
m_drawer->drawTexture(m_renderTarget->texture());
92+
m_drawer->drawTexture(m_diagramTexture->texture());
7793

7894
#if USING_ALPHA
7995
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ class CGEWaveformFilter : public CGEImageFilterInterface
2727

2828
protected:
2929
std::unique_ptr<TextureDrawer> m_drawer;
30-
std::unique_ptr<FrameBufferWithTexture> m_renderTarget;
30+
std::unique_ptr<TextureObject> m_diagramTexture;
31+
ProgramObject m_clearImageProgram;
32+
3133
Vec2f m_position;
3234
Vec2f m_size;
3335
};

0 commit comments

Comments
 (0)