summaryrefslogtreecommitdiffstats
path: root/tools/graphics-app-framework/gui.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2021-03-04 16:25:58 -0800
committerGitHub <noreply@github.com>2021-03-04 16:25:58 -0800
commita5ac4999b4dea546a7ef824669ab1809224b6448 (patch)
tree15bb22eb98a94f7f81489deef55396461501d3dc /tools/graphics-app-framework/gui.cpp
parent13ff0bd345990c0fdfb7b52ebd5339cddb04889e (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.cpp76
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()