From a654b15190cdbc8ff21c24a5a40bc0dcdb15619c Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Wed, 18 Mar 2026 10:43:30 +0800 Subject: [PATCH] [Feat] (MG_Backend/DirectVulkan): naively implement `DrawElementsBaseVertex` and `MultiDrawElementsBaseVertex` --- .../MG_Backend/DirectVulkan/DirectVulkan.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp b/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp index 39af70f6..0d7fedfc 100644 --- a/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp @@ -105,14 +105,29 @@ namespace MobileGL::MG_Backend::DirectVulkan { void DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLint basevertex) { MOBILEGL_ASSERT(pVulkanRenderer, "DirectVulkan::DrawElementsBaseVertex called with null VulkanRenderer"); MOBILEGL_ASSERT(MG_State::pGLContext, "DirectVulkan::DrawElementsBaseVertex called with null GL context"); - + DrawIndexedCmd payload{}; + payload.mode = mode; + payload.indexType = type; + payload.indexByteOffset = reinterpret_cast(indices); + payload.indexCount = count; + payload.instanceCount = 1; + payload.firstIndex = 0; + payload.vertexOffset = basevertex; + payload.firstInstance = 0; + pVulkanRenderer->DrawElements(payload); } void MultiDrawElementsBaseVertex(GLenum mode, const GLsizei* count, GLenum type, const GLvoid* const* indices, GLsizei drawcount, const GLint* basevertex) { MOBILEGL_ASSERT(pVulkanRenderer, "DirectVulkan::MultiDrawElements called with null VulkanRenderer"); MOBILEGL_ASSERT(MG_State::pGLContext, "DirectVulkan::MultiDrawElements called with null GL context"); - + // TODO: properly batch the draw calls + for (GLsizei i = 0; i < drawcount; ++i) { + if (count[i] == 0) { + continue; + } + DrawElementsBaseVertex(mode, count[i], type, indices[i], basevertex[i]); + } } void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1,