[Optimization] (multidraw: compute): not quite right bisect

This commit is contained in:
Swung0x48 2025-04-23 10:41:40 +08:00
parent 3e70122664
commit a0bcd91257
2 changed files with 36 additions and 28 deletions

View File

@ -268,22 +268,26 @@ void main() {
return;
// Find out draw call #
int low = 0;
int high = draws.length();
for (low = 0; low < high; ++low) {
if (prefixSums[low] > outIdx) {
break;
}
}
// while (low < high) {
// int mid = low + (high - low) / 2;
// if (prefixSums[mid] > outIdx) {
// high = mid;
// } else {
// low = mid + 1;
// int low = 0;
// int high = draws.length();
// for (low = 0; low < high; ++low) {
// if (prefixSums[low] > outIdx) {
// break;
// }
// }
int low = 0;
int high = draws.length();
while (low < high) {
int mid = low + (high - low) / 2;
if (prefixSums[mid] <= outIdx) {
low = mid + 1; // next [mid + 1, high)
}
else {
high = mid; // next [low, mid)
}
}
// figure out which index to take
DrawCommand cmd = draws[low];
uint localIdx = outIdx - ((low == 0) ? 0u : (prefixSums[low - 1]));
@ -414,7 +418,7 @@ GLAPI GLAPIENTRY void mg_glMultiDrawElementsBaseVertex_compute(
GLES.glGetIntegerv(GL_CURRENT_PROGRAM, &prev_program);
CHECK_GL_ERROR_NO_INIT
GLint prev_vb = 0;
GLES.glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &prev_vb);
GLES.glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &prev_vb);
CHECK_GL_ERROR_NO_INIT
// Dispatch compute
@ -434,7 +438,7 @@ GLAPI GLAPIENTRY void mg_glMultiDrawElementsBaseVertex_compute(
LOG_D("draw")
GLES.glUseProgram(prev_program);
CHECK_GL_ERROR_NO_INIT
GLES.glBindBuffer(GL_VERTEX_ARRAY, prev_vb);
GLES.glBindBuffer(GL_ARRAY_BUFFER, prev_vb);
CHECK_GL_ERROR_NO_INIT
GLES.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_outputibo);
CHECK_GL_ERROR_NO_INIT

View File

@ -21,22 +21,26 @@ void main() {
return;
// Find out draw call #
int low = 0;
int high = draws.length();
for (low = 0; low < high; ++low) {
if (prefixSums[low] > outIdx) {
break;
}
}
// while (low < high) {
// int mid = low + (high - low) / 2;
// if (prefixSums[mid] > outIdx) {
// high = mid;
// } else {
// low = mid + 1;
// int low = 0;
// int high = draws.length();
// for (low = 0; low < high; ++low) {
// if (prefixSums[low] > outIdx) {
// break;
// }
// }
int low = 0;
int high = draws.length();
while (low < high) {
int mid = low + (high - low) / 2;
if (prefixSums[mid] <= outIdx) {
low = mid + 1; // next [mid + 1, high)
}
else {
high = mid; // next [low, mid)
}
}
// figure out which index to take
DrawCommand cmd = draws[low];
uint localIdx = outIdx - ((low == 0) ? 0u : (prefixSums[low - 1]));