Skip to content

Commit a61dd20

Browse files
committed
[Fix] (Shader): Finally fix atomicCounter emulation.
1 parent 2d10487 commit a61dd20

4 files changed

Lines changed: 81 additions & 29 deletions

File tree

src/main/cpp/gl/DSA/DSAWrapper.cpp

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,10 @@ void temporarilyBindBuffer(GLuint bufferID, GLenum target = GL_ARRAY_BUFFER) {
7373
GLenum bindingQuery = GetBindingQuery(target);
7474
GLint prev = 0;
7575
glGetIntegerv(bindingQuery, &prev);
76-
76+
if (prev == bufferID) {
77+
bufferBindingStack[target].push_back(-1);
78+
return;
79+
}
7780
bufferBindingStack[target].push_back(static_cast<GLuint>(prev));
7881

7982
LOG_D("[DSA] [TempBind] target=0x%X, prev=%u -> bind=%u", target, prev, bufferID);
@@ -91,6 +94,11 @@ void restoreTemporaryBufferBinding(GLenum target = GL_ARRAY_BUFFER) {
9194
GLuint toRestore = it->second.back();
9295
it->second.pop_back();
9396

97+
if (toRestore == static_cast<GLuint>(-1)) {
98+
LOG_D("[DSA] [Restore] target=0x%X, no binding to restore", target);
99+
return;
100+
}
101+
94102
LOG_D("[DSA] [Restore] target=0x%X, bind back to %u", target, toRestore);
95103
CHECK_GL_ERROR;
96104
glBindBuffer(target, toRestore);
@@ -374,6 +382,10 @@ void temporarilyBindFramebuffer(GLuint framebufferID, GLenum target = GL_DRAW_FR
374382
GLenum bindingQuery = GetBindingQuery(target);
375383
GLint prev = 0;
376384
glGetIntegerv(bindingQuery, &prev);
385+
if (prev == framebufferID) {
386+
framebufferBindingStack[target].push_back(-1);
387+
return;
388+
}
377389
framebufferBindingStack[target].push_back(static_cast<GLuint>(prev));
378390
LOG_D("[DSA] [TempBind] target=0x%X, prev=%u -> bind=%u", target, prev, framebufferID);
379391
CHECK_GL_ERROR;
@@ -388,6 +400,10 @@ void restoreTemporaryFramebufferBinding(GLenum target = GL_DRAW_FRAMEBUFFER) {
388400
}
389401
GLuint toRestore = it->second.back();
390402
it->second.pop_back();
403+
if (toRestore == static_cast<GLuint>(-1)) {
404+
LOG_D("[DSA] [Restore] target=0x%X, no binding to restore", target);
405+
return;
406+
}
391407
LOG_D("[DSA] [Restore] target=0x%X, bind back to %u", target, toRestore);
392408
CHECK_GL_ERROR;
393409
glBindFramebuffer(target, toRestore);
@@ -674,6 +690,10 @@ void temporarilyBindRenderbuffer(GLuint renderbufferID) {
674690
GLenum bindingQuery = GetBindingQuery(GL_RENDERBUFFER);
675691
GLint prev = 0;
676692
glGetIntegerv(bindingQuery, &prev);
693+
if (prev == renderbufferID) {
694+
renderbufferBindingStack[GL_RENDERBUFFER].push_back(-1);
695+
return;
696+
}
677697
renderbufferBindingStack[GL_RENDERBUFFER].push_back(static_cast<GLuint>(prev));
678698
LOG_D("[DSA] [TempBind] prev=%u -> bind=%u", prev, renderbufferID);
679699
CHECK_GL_ERROR;
@@ -688,6 +708,10 @@ void restoreTemporaryRenderbufferBinding() {
688708
}
689709
GLuint toRestore = it->second.back();
690710
it->second.pop_back();
711+
if (toRestore == static_cast<GLuint>(-1)) {
712+
LOG_D("[DSA] [Restore] no binding to restore for GL_RENDERBUFFER");
713+
return;
714+
}
691715
LOG_D("[DSA] [Restore] bind back to %u", toRestore);
692716
CHECK_GL_ERROR;
693717
glBindRenderbuffer(GL_RENDERBUFFER, toRestore);
@@ -776,6 +800,10 @@ void temporarilyBindTexture(GLuint textureID, GLenum possibleTarget = 0) {
776800
GLenum bindingQuery = GetBindingQuery(target, true);
777801
GLint prev = 0;
778802
glGetIntegerv(bindingQuery, &prev);
803+
if (prev == static_cast<GLint>(textureID)) {
804+
textureBindingStack[target].push_back(-1);
805+
return;
806+
}
779807
textureBindingStack[target].push_back(static_cast<GLuint>(prev));
780808
LOG_D("[DSA] [TempBind] target=0x%X, prev=%u -> bind=%u", target, prev, textureID);
781809
CHECK_GL_ERROR;
@@ -793,6 +821,10 @@ void restoreTemporaryTextureBinding(GLuint textureID, GLenum possibleTarget = 0)
793821

794822
GLuint toRestore = stackIt->second.back();
795823
stackIt->second.pop_back();
824+
if (toRestore == static_cast<GLuint>(-1)) {
825+
LOG_D("[DSA] [Restore] target=0x%X, no binding to restore", target);
826+
return;
827+
}
796828
LOG_D("[DSA] [Restore] target=0x%X, bind back to %u", target, toRestore);
797829
CHECK_GL_ERROR;
798830
glBindTexture(target, toRestore);
@@ -1108,9 +1140,10 @@ void glGetTextureParameteriv(GLuint texture, GLenum pname, GLint* params) {
11081140
}
11091141

11101142
// vertex array
1111-
static thread_local GLint prevVAO = 0;
1143+
static thread_local GLint prevVAO = -1;
11121144
void temporarilyBindVertexArray(GLint vaoID) {
11131145
if (prevVAO == vaoID) {
1146+
prevVAO = -1;
11141147
return;
11151148
}
11161149
LOG_D("[DSA] [TempBind] VAO: %u -> bind=%u", prevVAO, vaoID);
@@ -1120,14 +1153,14 @@ void temporarilyBindVertexArray(GLint vaoID) {
11201153
CHECK_GL_ERROR_NO_INIT;
11211154
}
11221155
void restoreTemporaryVertexArrayBinding() {
1123-
if (prevVAO == 0) {
1156+
if (prevVAO == -1) {
11241157
return;
11251158
}
11261159
LOG_D("[DSA] [Restore] VAO: bind back to %u", prevVAO);
11271160
CHECK_GL_ERROR;
11281161
glBindVertexArray(prevVAO);
11291162
CHECK_GL_ERROR_NO_INIT;
1130-
prevVAO = 0;
1163+
prevVAO = -1;
11311164
}
11321165

11331166
void glCreateVertexArrays(GLsizei n, GLuint* arrays) {
@@ -1503,6 +1536,10 @@ static void pushXFB(GLuint xfb) {
15031536
LOG_D("[DSA] pushXFB, xfb: %u", xfb);
15041537
GLint prev = 0;
15051538
glGetIntegerv(GL_TRANSFORM_FEEDBACK_BINDING, &prev);
1539+
if (xfb == prev) {
1540+
g_xfbBindingStack.push_back(-1);
1541+
return;
1542+
}
15061543
g_xfbBindingStack.push_back(prev);
15071544
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, xfb);
15081545
CHECK_GL_ERROR;
@@ -1513,6 +1550,10 @@ static void popXFB() {
15131550
assert(!g_xfbBindingStack.empty());
15141551
GLint prev = g_xfbBindingStack.back();
15151552
g_xfbBindingStack.pop_back();
1553+
if (prev == -1) {
1554+
LOG_D("[DSA] No previous XFB binding to restore");
1555+
return;
1556+
}
15161557
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, (GLuint)prev);
15171558
CHECK_GL_ERROR;
15181559
}

src/main/cpp/gl/buffer.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,28 @@ void glBindBuffer(GLenum target, GLuint buffer) {
233233
CHECK_GL_ERROR
234234
}
235235

236+
struct atomic_buffer {
237+
GLuint id;
238+
GLsizeiptr size;
239+
GLintptr offset;
240+
};
241+
242+
static std::vector<atomic_buffer> g_buffer_map_atomic_buffer_info;
243+
static std::vector<GLuint> g_buffer_map_ssbo_id; // shall we use this in the future?
244+
245+
void bindAllAtomicCounterAsSSBO() {
246+
const size_t count = g_buffer_map_atomic_buffer_info.size();
247+
for (size_t i = 0; i < count; ++i) {
248+
atomic_buffer buf = g_buffer_map_atomic_buffer_info[i];
249+
if (buf.id != 0) {
250+
GLuint realID = find_real_buffer(buf.id);
251+
GLES.glBindBufferRange(GL_SHADER_STORAGE_BUFFER, i, realID, buf.offset, buf.size);
252+
LOG_D("Bound atomic counter buffer %u(real: %u) as SSBO at index %zu", buf, realID, i);
253+
}
254+
}
255+
256+
}
257+
236258
void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) {
237259
LOG()
238260
LOG_D("glBindBufferRange, target = %s, index = %d, buffer = %d, offset = %p, size = %zi", glEnumToString(target), index, buffer, (void*) offset, size)
@@ -254,6 +276,12 @@ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offs
254276
CHECK_GL_ERROR
255277
}
256278
GLES.glBindBufferRange(target, index, real_buffer, offset, size);
279+
if (target == GL_ATOMIC_COUNTER_BUFFER) {
280+
if (g_buffer_map_atomic_buffer_info.empty()) {
281+
g_buffer_map_atomic_buffer_info.resize(GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, {});
282+
}
283+
g_buffer_map_atomic_buffer_info[index] = { buffer, size, offset };
284+
}
257285
CHECK_GL_ERROR
258286
}
259287

@@ -278,6 +306,12 @@ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer) {
278306
CHECK_GL_ERROR
279307
}
280308
GLES.glBindBufferBase(target, index, real_buffer);
309+
if (target == GL_SHADER_STORAGE_BUFFER) {
310+
if (g_buffer_map_ssbo_id.empty()) {
311+
g_buffer_map_ssbo_id.resize(GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS, 0);
312+
}
313+
g_buffer_map_ssbo_id[index] = buffer;
314+
}
281315
CHECK_GL_ERROR
282316
}
283317

src/main/cpp/gl/drawing.cpp

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -132,30 +132,7 @@ void glUniform1i(GLint location, GLint v0) {
132132
CHECK_GL_ERROR
133133
}
134134

135-
void bindAllAtomicCounterAsSSBO() {
136-
GLint maxBindings = 0;
137-
GLES.glGetIntegerv(GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, &maxBindings);
138-
if (maxBindings <= 0) {
139-
LOG_W("No atomic counter buffer bindings available, maxBindings: %d", maxBindings);
140-
return;
141-
}
142-
143-
std::vector<GLuint> buffers(maxBindings, 0);
144-
145-
for (GLint i = 0; i < maxBindings; ++i) {
146-
GLES.glGetIntegeri_v(GL_ATOMIC_COUNTER_BUFFER_BINDING, i, reinterpret_cast<GLint*>(&buffers[i]));
147-
}
148-
149-
for (GLint i = 0; i < maxBindings; ++i) {
150-
GLuint buf = buffers[i];
151-
if (buf != 0) {
152-
GLES.glBindBufferBase(GL_SHADER_STORAGE_BUFFER, i, buf);
153-
}
154-
}
155-
156-
LOG_D("Bound %d atomic counter buffers as SSBOs", maxBindings);
157-
}
158-
135+
void bindAllAtomicCounterAsSSBO();
159136
void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z) {
160137
LOG()
161138
LOG_D("glDispatchCompute, num_groups_x: %d, num_groups_y: %d, num_groups_z: %d",

src/main/cpp/gl/glsl/glsl_for_es.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,7 @@ bool process_non_opaque_atomic_to_ssbo(std::string& source) {
563563
std::string matched_stmt = it->str();
564564
result += matched_stmt;
565565

566-
result += "\n memoryBarrierBuffer();";
566+
result += "\n memoryBarrierBuffer();barrier();";
567567

568568
processed_positions.insert(start_pos);
569569
last_pos = end_pos;

0 commit comments

Comments
 (0)