diff options
Diffstat (limited to 'examples/shader-toy/main.cpp')
| -rw-r--r-- | examples/shader-toy/main.cpp | 87 |
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); } |
