summaryrefslogtreecommitdiff
path: root/tools/graphics-app-framework
diff options
context:
space:
mode:
Diffstat (limited to 'tools/graphics-app-framework')
-rw-r--r--tools/graphics-app-framework/gui.cpp76
-rw-r--r--tools/graphics-app-framework/gui.h6
-rw-r--r--tools/graphics-app-framework/windows/win-window.cpp18
3 files changed, 67 insertions, 33 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()
diff --git a/tools/graphics-app-framework/gui.h b/tools/graphics-app-framework/gui.h
index 22b4bf2f5..680cea14b 100644
--- a/tools/graphics-app-framework/gui.h
+++ b/tools/graphics-app-framework/gui.h
@@ -12,14 +12,16 @@ namespace gfx {
struct GUI : Slang::RefObject
{
- GUI(Window* window, IRenderer* renderer, IFramebufferLayout* framebufferLayout);
+ GUI(Window* window, IRenderer* renderer, ICommandQueue* queue, IFramebufferLayout* framebufferLayout);
~GUI();
void beginFrame();
- void endFrame();
+ void endFrame(IFramebuffer* framebuffer);
private:
Slang::ComPtr<IRenderer> renderer;
+ Slang::ComPtr<ICommandQueue> queue;
+ Slang::ComPtr<IRenderPassLayout> renderPass;
Slang::ComPtr<IPipelineState> pipelineState;
Slang::ComPtr<IDescriptorSetLayout> descriptorSetLayout;
Slang::ComPtr<IPipelineLayout> pipelineLayout;
diff --git a/tools/graphics-app-framework/windows/win-window.cpp b/tools/graphics-app-framework/windows/win-window.cpp
index 3bbf2575a..a86e360d0 100644
--- a/tools/graphics-app-framework/windows/win-window.cpp
+++ b/tools/graphics-app-framework/windows/win-window.cpp
@@ -243,7 +243,7 @@ static ATOM createWindowClassAtom()
windowClassDesc.cbWndExtra = 0;
windowClassDesc.hInstance = (HINSTANCE) GetModuleHandle(0);
windowClassDesc.hIcon = 0;
- windowClassDesc.hCursor = 0;
+ windowClassDesc.hCursor = LoadCursorW(NULL, IDC_ARROW);
windowClassDesc.hbrBackground = 0;
windowClassDesc.lpszMenuName = 0;
windowClassDesc.lpszClassName = L"SlangGraphicsWindow";
@@ -269,22 +269,32 @@ Window* createWindow(WindowDesc const& desc)
OSString windowTitle(desc.title);
DWORD windowExtendedStyle = 0;
- DWORD windowStyle = 0;
+ DWORD windowStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU;
HINSTANCE instance = (HINSTANCE) GetModuleHandle(0);
+ RECT windowRect;
+ windowRect.left = 0;
+ windowRect.top = 0;
+ windowRect.bottom = desc.height;
+ windowRect.right = desc.width;
+ AdjustWindowRect(&windowRect, windowStyle, FALSE);
+
HWND windowHandle = CreateWindowExW(
windowExtendedStyle,
(LPWSTR) getWindowClassAtom(),
windowTitle,
windowStyle,
- 0, 0, // x, y
- desc.width, desc.height,
+ CW_USEDEFAULT,
+ 0, // x, y
+ windowRect.right,
+ windowRect.bottom,
NULL, // parent
NULL, // menu
instance,
window);
+
if(!windowHandle)
{
delete window;