diff options
| author | Yong He <yonghe@outlook.com> | 2021-03-04 16:25:58 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-04 16:25:58 -0800 |
| commit | a5ac4999b4dea546a7ef824669ab1809224b6448 (patch) | |
| tree | 15bb22eb98a94f7f81489deef55396461501d3dc /tools/graphics-app-framework/gui.cpp | |
| parent | 13ff0bd345990c0fdfb7b52ebd5339cddb04889e (diff) | |
Refactor `gfx` to surface `CommandBuffer` interface. (#1735)
* Refactor `gfx` to surface `CommandBuffer` interface.
* Fixes.
* Fix code review issues, and make vulkan runnable on devices without VK_EXT_extended_dynamic_states.
* Update solution files
* Move out-of-date examples to examples/experimental
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'tools/graphics-app-framework/gui.cpp')
| -rw-r--r-- | tools/graphics-app-framework/gui.cpp | 76 |
1 files changed, 49 insertions, 27 deletions
diff --git a/tools/graphics-app-framework/gui.cpp b/tools/graphics-app-framework/gui.cpp index 0d416ec85..3d4283131 100644 --- a/tools/graphics-app-framework/gui.cpp +++ b/tools/graphics-app-framework/gui.cpp @@ -36,8 +36,13 @@ void setNativeWindowHook(Window* window, WNDPROC proc); #endif -GUI::GUI(Window* window, IRenderer* inRenderer, IFramebufferLayout* framebufferLayout) +GUI::GUI( + Window* window, + IRenderer* inRenderer, + ICommandQueue* inQueue, + IFramebufferLayout* framebufferLayout) : renderer(inRenderer) + , queue(inQueue) { ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); @@ -236,6 +241,20 @@ GUI::GUI(Window* window, IRenderer* inRenderer, IFramebufferLayout* framebufferL ISamplerState::Desc desc; samplerState = renderer->createSamplerState(desc); } + + { + IRenderPassLayout::Desc desc; + desc.framebufferLayout = framebufferLayout; + IRenderPassLayout::AttachmentAccessDesc colorAccess; + desc.depthStencilAccess = nullptr; + colorAccess.initialState = ResourceState::Present; + colorAccess.finalState = ResourceState::Present; + colorAccess.loadOp = IRenderPassLayout::AttachmentLoadOp::Load; + colorAccess.storeOp = IRenderPassLayout::AttachmentStoreOp::Store; + desc.renderTargetAccess = &colorAccess; + desc.renderTargetCount = 1; + renderPass = renderer->createRenderPassLayout(desc); + } } @@ -248,7 +267,7 @@ void GUI::beginFrame() ImGui::NewFrame(); } -void GUI::endFrame() +void GUI::endFrame(IFramebuffer* framebuffer) { ImGui::Render(); @@ -278,22 +297,23 @@ void GUI::endFrame() auto indexBuffer = renderer->createBufferResource( IResource::Usage::IndexBuffer, indexBufferDesc); - + auto cmdBuf = queue->createCommandBuffer(); + auto encoder = cmdBuf->encodeResourceCommands(); { - ImDrawVert* dstVertex = (ImDrawVert*) renderer->map(vertexBuffer, MapFlavor::WriteDiscard); - ImDrawIdx* dstIndex = (ImDrawIdx*) renderer->map(indexBuffer, MapFlavor::WriteDiscard); - for(int ii = 0; ii < commandListCount; ++ii) { const ImDrawList* commandList = draw_data->CmdLists[ii]; - memcpy(dstVertex, commandList->VtxBuffer.Data, commandList->VtxBuffer.Size * sizeof(ImDrawVert)); - memcpy(dstIndex, commandList->IdxBuffer.Data, commandList->IdxBuffer.Size * sizeof(ImDrawIdx)); - dstVertex += commandList->VtxBuffer.Size; - dstIndex += commandList->IdxBuffer.Size; + encoder->uploadBufferData( + vertexBuffer, + commandList->VtxBuffer.Size * ii * sizeof(ImDrawVert), + commandList->VtxBuffer.Size * sizeof(ImDrawVert), + commandList->VtxBuffer.Data); + encoder->uploadBufferData( + indexBuffer, + commandList->IdxBuffer.Size * ii * sizeof(ImDrawIdx), + commandList->IdxBuffer.Size * sizeof(ImDrawIdx), + commandList->IdxBuffer.Data); } - - renderer->unmap(vertexBuffer); - renderer->unmap(indexBuffer); } // Allocate a transient constant buffer for projection matrix @@ -306,8 +326,6 @@ void GUI::endFrame() constantBufferDesc); { - glm::mat4x4* dstMVP = (glm::mat4x4*) renderer->map(constantBuffer, MapFlavor::WriteDiscard); - float L = draw_data->DisplayPos.x; float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x; float T = draw_data->DisplayPos.y; @@ -319,11 +337,11 @@ void GUI::endFrame() { 0.0f, 0.0f, 0.5f, 0.0f }, { (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f }, }; - memcpy(dstMVP, mvp, sizeof(mvp)); - - renderer->unmap(constantBuffer); + encoder->uploadBufferData(constantBuffer, 0, sizeof(mvp), mvp); } + encoder->endEncoding(); + gfx::Viewport viewport; viewport.originX = 0; viewport.originY = 0; @@ -333,13 +351,15 @@ void GUI::endFrame() viewport.minZ = 0; viewport.maxZ = 1; - renderer->setViewport(viewport); + auto renderEncoder = cmdBuf->encodeRenderCommands(renderPass, framebuffer); + renderEncoder->setViewportAndScissor(viewport); - renderer->setPipelineState(pipelineState); + renderEncoder->setPipelineState(pipelineState); - renderer->setVertexBuffer(0, vertexBuffer, sizeof(ImDrawVert)); - renderer->setIndexBuffer(indexBuffer, sizeof(ImDrawIdx) == 2 ? Format::R_UInt16 : Format::R_UInt32); - renderer->setPrimitiveTopology(PrimitiveTopology::TriangleList); + renderEncoder->setVertexBuffer(0, vertexBuffer, sizeof(ImDrawVert)); + renderEncoder->setIndexBuffer( + indexBuffer, sizeof(ImDrawIdx) == 2 ? Format::R_UInt16 : Format::R_UInt32); + renderEncoder->setPrimitiveTopology(PrimitiveTopology::TriangleList); UInt vertexOffset = 0; UInt indexOffset = 0; @@ -364,7 +384,7 @@ void GUI::endFrame() (Int)(command->ClipRect.z - pos.x), (Int)(command->ClipRect.w - pos.y) }; - renderer->setScissorRect(rect); + renderEncoder->setScissorRects(1, &rect); // TODO: This should be a dynamic/transient descriptor set... auto descriptorSet = renderer->createDescriptorSet(descriptorSetLayout, gfx::IDescriptorSet::Flag::Transient); @@ -374,18 +394,20 @@ void GUI::endFrame() descriptorSet->setSampler(2, 0, samplerState); - renderer->setDescriptorSet( - PipelineType::Graphics, + renderEncoder->setDescriptorSet( pipelineLayout, 0, descriptorSet); - renderer->drawIndexed(command->ElemCount, indexOffset, vertexOffset); + renderEncoder->drawIndexed(command->ElemCount, indexOffset, vertexOffset); } indexOffset += command->ElemCount; } vertexOffset += commandList->VtxBuffer.Size; } + renderEncoder->endEncoding(); + cmdBuf->close(); + queue->executeCommandBuffer(cmdBuf); } GUI::~GUI() |
