summaryrefslogtreecommitdiff
path: root/examples/shader-toy/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/shader-toy/main.cpp')
-rw-r--r--examples/shader-toy/main.cpp87
1 files changed, 55 insertions, 32 deletions
diff --git a/examples/shader-toy/main.cpp b/examples/shader-toy/main.cpp
index 697bb1044..0d058fa2c 100644
--- a/examples/shader-toy/main.cpp
+++ b/examples/shader-toy/main.cpp
@@ -339,6 +339,8 @@ ComPtr<gfx::IDescriptorSet> gDescriptorSet;
ComPtr<gfx::IBufferResource> gVertexBuffer;
ComPtr<gfx::ISwapchain> gSwapchain;
Slang::List<ComPtr<gfx::IFramebuffer>> gFramebuffers;
+ComPtr<gfx::IRenderPassLayout> gRenderPass;
+ComPtr<gfx::ICommandQueue> gQueue;
Result initialize()
{
@@ -355,6 +357,10 @@ Result initialize()
Result res = gfxCreateRenderer(&rendererDesc, gRenderer.writeRef());
if(SLANG_FAILED(res)) return res;
+ ICommandQueue::Desc queueDesc = {};
+ queueDesc.type = ICommandQueue::QueueType::Graphics;
+ gQueue = gRenderer->createCommandQueue(queueDesc);
+
int constantBufferSize = sizeof(Uniforms);
IBufferResource::Desc constantBufferDesc;
@@ -423,6 +429,7 @@ Result initialize()
swapchainDesc.width = gWindowWidth;
swapchainDesc.height = gWindowHeight;
swapchainDesc.imageCount = kSwapchainImageCount;
+ swapchainDesc.queue = gQueue;
gSwapchain = gRenderer->createSwapchain(
swapchainDesc, gfx::WindowHandle::FromHwnd(getPlatformWindowHandle(gWindow)));
@@ -489,6 +496,24 @@ Result initialize()
gPipelineState = pipelineState;
+ // Create render pass.
+ gfx::IRenderPassLayout::Desc renderPassDesc = {};
+ renderPassDesc.framebufferLayout = framebufferLayout;
+ renderPassDesc.renderTargetCount = 1;
+ IRenderPassLayout::AttachmentAccessDesc renderTargetAccess = {};
+ IRenderPassLayout::AttachmentAccessDesc depthStencilAccess = {};
+ renderTargetAccess.loadOp = IRenderPassLayout::AttachmentLoadOp::Clear;
+ renderTargetAccess.storeOp = IRenderPassLayout::AttachmentStoreOp::Store;
+ renderTargetAccess.initialState = ResourceState::Undefined;
+ renderTargetAccess.finalState = ResourceState::Present;
+ depthStencilAccess.loadOp = IRenderPassLayout::AttachmentLoadOp::Clear;
+ depthStencilAccess.storeOp = IRenderPassLayout::AttachmentStoreOp::Store;
+ depthStencilAccess.initialState = ResourceState::Undefined;
+ depthStencilAccess.finalState = ResourceState::DepthWrite;
+ renderPassDesc.renderTargetAccess = &renderTargetAccess;
+ renderPassDesc.depthStencilAccess = &depthStencilAccess;
+ gRenderPass = gRenderer->createRenderPassLayout(renderPassDesc);
+
showWindow(gWindow);
return SLANG_OK;
@@ -506,26 +531,18 @@ uint64_t startTime = 0;
void renderFrame()
{
- gRenderer->beginFrame();
auto frameIndex = gSwapchain->acquireNextImage();
- gRenderer->setFramebuffer(gFramebuffers[frameIndex]);
+ auto commandBuffer = gQueue->createCommandBuffer();
if( firstTime )
{
startTime = getCurrentTime();
firstTime = false;
}
- gfx::Viewport viewport = {};
- viewport.maxZ = 1.0f;
- viewport.extentX = (float)gWindowWidth;
- viewport.extentY = (float)gWindowHeight;
- gRenderer->setViewportAndScissor(viewport);
-
- static const float kClearColor[] = { 0.25, 0.25, 0.25, 1.0 };
- gRenderer->setClearColor(kClearColor);
- gRenderer->clearFrame();
+ // Update uniform buffer.
+ auto uploadEncoder = commandBuffer->encodeResourceCommands();
- if(Uniforms* uniforms = (Uniforms*) gRenderer->map(gConstantBuffer, MapFlavor::WriteDiscard))
+ Uniforms uniforms = {};
{
bool isMouseClick = isMouseDown && !wasMouseDown;
wasMouseDown = isMouseDown;
@@ -536,35 +553,41 @@ void renderFrame()
clickMouseY = lastMouseY;
}
- uniforms->iMouse[0] = lastMouseX;
- uniforms->iMouse[1] = lastMouseY;
- uniforms->iMouse[2] = isMouseDown ? clickMouseX : -clickMouseX;
- uniforms->iMouse[3] = isMouseClick ? clickMouseY : -clickMouseY;
- uniforms->iTime = float( double(getCurrentTime() - startTime) / double(getTimerFrequency()) );
- uniforms->iResolution[0] = float(gWindowWidth);
- uniforms->iResolution[1] = float(gWindowHeight);
+ uniforms.iMouse[0] = lastMouseX;
+ uniforms.iMouse[1] = lastMouseY;
+ uniforms.iMouse[2] = isMouseDown ? clickMouseX : -clickMouseX;
+ uniforms.iMouse[3] = isMouseClick ? clickMouseY : -clickMouseY;
+ uniforms.iTime = float( double(getCurrentTime() - startTime) / double(getTimerFrequency()) );
+ uniforms.iResolution[0] = float(gWindowWidth);
+ uniforms.iResolution[1] = float(gWindowHeight);
- gRenderer->unmap(gConstantBuffer);
+ uploadEncoder->uploadBufferData(gConstantBuffer, 0, sizeof(Uniforms), &uniforms);
}
+ uploadEncoder->endEncoding();
- gRenderer->setPipelineState(gPipelineState);
- gRenderer->setDescriptorSet(PipelineType::Graphics, gPipelineLayout, 0, gDescriptorSet);
-
- gRenderer->setVertexBuffer(0, gVertexBuffer, sizeof(FullScreenTriangle::Vertex));
- gRenderer->setPrimitiveTopology(PrimitiveTopology::TriangleList);
-
- gRenderer->draw(3);
-
- gRenderer->makeSwapchainImagePresentable(gSwapchain);
-
- gRenderer->endFrame();
+ // Encode render commands.
+ auto encoder = commandBuffer->encodeRenderCommands(gRenderPass, gFramebuffers[frameIndex]);
+ gfx::Viewport viewport = {};
+ viewport.maxZ = 1.0f;
+ viewport.extentX = (float)gWindowWidth;
+ viewport.extentY = (float)gWindowHeight;
+ encoder->setViewportAndScissor(viewport);
+ encoder->setPipelineState(gPipelineState);
+ encoder->setDescriptorSet(gPipelineLayout, 0, gDescriptorSet);
+ encoder->setVertexBuffer(0, gVertexBuffer, sizeof(FullScreenTriangle::Vertex));
+ encoder->setPrimitiveTopology(PrimitiveTopology::TriangleList);
+ encoder->draw(3);
+ encoder->endEncoding();
+ commandBuffer->close();
+
+ gQueue->executeCommandBuffer(commandBuffer);
gSwapchain->present();
}
void finalize()
{
- gRenderer->waitForGpu();
+ gQueue->wait();
destroyWindow(gWindow);
}