| 240 | } |
| 241 | |
| 242 | void FlushDebug(HRenderContext render_context, uint32_t render_order) |
| 243 | { |
| 244 | if (!render_context->m_DebugRenderer.m_RenderContext) |
| 245 | return; |
| 246 | DebugRenderer& debug_renderer = render_context->m_DebugRenderer; |
| 247 | uint32_t total_vertex_count = 0; |
| 248 | uint32_t total_render_objects = 0; |
| 249 | dmGraphics::SetVertexBufferData(debug_renderer.m_VertexBuffer, 0, 0, dmGraphics::BUFFER_USAGE_STREAM_DRAW); |
| 250 | for (uint32_t i = 0; i < MAX_DEBUG_RENDER_TYPE_COUNT; ++i) |
| 251 | { |
| 252 | DebugRenderTypeData& type_data = debug_renderer.m_TypeData[i]; |
| 253 | RenderObject& ro = type_data.m_RenderObject; |
| 254 | uint32_t vertex_count = ro.m_VertexCount; |
| 255 | if (vertex_count > 0) |
| 256 | { |
| 257 | ro.m_VertexStart = total_vertex_count; |
| 258 | total_vertex_count += vertex_count; |
| 259 | total_render_objects++; |
| 260 | } |
| 261 | } |
| 262 | |
| 263 | dmGraphics::SetVertexBufferData(debug_renderer.m_VertexBuffer, total_vertex_count * sizeof(DebugVertex), 0, dmGraphics::BUFFER_USAGE_STREAM_DRAW); |
| 264 | |
| 265 | dmRender::RenderListEntry* render_list = dmRender::RenderListAlloc(render_context, total_render_objects); |
| 266 | dmRender::HRenderListDispatch dispatch = dmRender::RenderListMakeDispatch(render_context, &DebugRenderListDispatch, &debug_renderer); |
| 267 | dmRender::RenderListEntry* write_ptr = render_list; |
| 268 | |
| 269 | // Upgrade the batch key, since we might submit these render object multiple times |
| 270 | // during a frame (because render scripts might draw lines, and then we are forced to flush |
| 271 | // debug rendering during command queue execution, and thus submit the same objects again). |
| 272 | // |
| 273 | // TODO: Rewrite this so we can flush only what has been added since last time. |
| 274 | // |
| 275 | debug_renderer.m_RenderBatchVersion++; |
| 276 | |
| 277 | for (uint32_t i = 0; i < MAX_DEBUG_RENDER_TYPE_COUNT; ++i) |
| 278 | { |
| 279 | DebugRenderTypeData& type_data = debug_renderer.m_TypeData[i]; |
| 280 | RenderObject& ro = type_data.m_RenderObject; |
| 281 | uint32_t vertex_count = ro.m_VertexCount; |
| 282 | if (vertex_count > 0) |
| 283 | { |
| 284 | dmGraphics::SetVertexBufferSubData(debug_renderer.m_VertexBuffer, ro.m_VertexStart * sizeof(DebugVertex), vertex_count * sizeof(DebugVertex), type_data.m_ClientBuffer); |
| 285 | write_ptr->m_MinorOrder = 0; |
| 286 | write_ptr->m_MajorOrder = RENDER_ORDER_AFTER_WORLD; |
| 287 | write_ptr->m_Order = render_order; |
| 288 | write_ptr->m_UserData = (uintptr_t) &ro; |
| 289 | write_ptr->m_BatchKey = debug_renderer.m_RenderBatchVersion; |
| 290 | write_ptr->m_TagListKey = dmRender::GetMaterialTagListKey(ro.m_Material); |
| 291 | write_ptr->m_Dispatch = dispatch; |
| 292 | write_ptr++; |
| 293 | } |
| 294 | } |
| 295 | |
| 296 | dmRender::RenderListSubmit(render_context, render_list, write_ptr); |
| 297 | } |
| 298 | } |
no test coverage detected