Skip to content

Commit 70979c5

Browse files
committed
Support large topologies resulting in more than 2**16 vertices
1 parent 10f7be0 commit 70979c5

2 files changed

Lines changed: 31 additions & 8 deletions

File tree

DebugGUI/src/DebugGUI.cxx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ void* initGUI(const char* name, void(*error_callback)(int, char const*descriptio
4848
ImGui::CreateContext();
4949
ImGuiIO& io = ImGui::GetIO();
5050
ImGui::StyleColorsDark();
51+
// This is needed to support more than 2**16 vertices
52+
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset;
5153
io.KeyMap[ImGuiKey_Tab] = GLFW_KEY_TAB;
5254
io.KeyMap[ImGuiKey_LeftArrow] = GLFW_KEY_LEFT;
5355
io.KeyMap[ImGuiKey_RightArrow] = GLFW_KEY_RIGHT;

DebugGUI/src/DebugGUIHeadless.cxx

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,15 @@ struct vtxContainer {
5858
};
5959

6060
struct cmdContainer {
61+
int list_id;
62+
int cmd_id;
6163
int count;
64+
int vtxOffset;
65+
int idxOffset;
66+
int vtxCount;
67+
int idxCount;
68+
int vtxBase;
69+
int idxBase;
6270
float rectX, rectY, rectZ, rectW;
6371
};
6472

@@ -109,31 +117,44 @@ void getFrameRaw(void *data, void **raw_data, int *size) {
109117
}
110118
}
111119

112-
int idx_offset = 0;
113120
short *data_idx_ptr = (short *)data_vtx_ptr;
114121
for (int cmd_id = 0; cmd_id < draw_data->CmdListsCount; ++cmd_id) {
115122
const auto cmd_list = draw_data->CmdLists[cmd_id];
123+
auto &cmd = cmd_list->CmdBuffer[cmd_id];
116124

117125
for (auto const &idx : cmd_list->IdxBuffer) {
118-
*data_idx_ptr = idx + (short)idx_offset;
126+
*data_idx_ptr = idx;
119127
data_idx_ptr++;
120128
}
121-
122-
idx_offset += cmd_list->VtxBuffer.size();
129+
// Before we move to the next Cmd, we need to offset all the
130+
// Vtx offset
123131
}
124132

125133
cmdContainer *data_cmd_ptr = (cmdContainer *)data_idx_ptr;
126-
for (int cmd_id = 0; cmd_id < draw_data->CmdListsCount; ++cmd_id) {
127-
const auto cmd_list = draw_data->CmdLists[cmd_id];
128-
129-
for (auto const &cmd : cmd_list->CmdBuffer) {
134+
int vtxBase = 0;
135+
int idxBase = 0;
136+
for (int list_id = 0; list_id < draw_data->CmdListsCount; ++list_id) {
137+
const auto cmd_list = draw_data->CmdLists[list_id];
138+
139+
for (int cmd_id = 0; cmd_id < cmd_list->CmdBuffer.size(); ++cmd_id) {
140+
const auto cmd = cmd_list->CmdBuffer[cmd_id];
141+
data_cmd_ptr->list_id = list_id;
142+
data_cmd_ptr->cmd_id = cmd_id;
130143
data_cmd_ptr->count = cmd.ElemCount;
144+
data_cmd_ptr->vtxOffset = cmd.VtxOffset;
145+
data_cmd_ptr->idxOffset = cmd.IdxOffset;
146+
data_cmd_ptr->vtxCount = cmd_list->VtxBuffer.size();
147+
data_cmd_ptr->idxCount = cmd_list->IdxBuffer.size();
148+
data_cmd_ptr->vtxBase = vtxBase;
149+
data_cmd_ptr->idxBase = idxBase;
131150
data_cmd_ptr->rectX = cmd.ClipRect.x;
132151
data_cmd_ptr->rectY = cmd.ClipRect.y;
133152
data_cmd_ptr->rectZ = cmd.ClipRect.z;
134153
data_cmd_ptr->rectW = cmd.ClipRect.w;
135154
data_cmd_ptr++;
136155
}
156+
vtxBase += cmd_list->VtxBuffer.size();
157+
idxBase += cmd_list->IdxBuffer.size();
137158
}
138159

139160
*size = buffer_size;

0 commit comments

Comments
 (0)