Error MainRenderer::render(SceneGraph& scene) { ANKI_TRACE_START_EVENT(RENDER); // First thing, reset the temp mem pool m_frameAlloc.getMemoryPool().reset(); GrManager& gl = m_r->getGrManager(); CommandBufferInitInfo cinf; cinf.m_hints = m_cbInitHints; CommandBufferPtr cmdb = gl.newInstance<CommandBuffer>(cinf); // Set some of the dynamic state cmdb->setPolygonOffset(0.0, 0.0); // Run renderer RenderingContext ctx(m_frameAlloc); if(m_rDrawToDefaultFb) { ctx.m_outFb = m_defaultFb; ctx.m_outFbWidth = m_width; ctx.m_outFbHeight = m_height; } ctx.m_commandBuffer = cmdb; ctx.m_frustumComponent = &scene.getActiveCamera().getComponent<FrustumComponent>(); ANKI_CHECK(m_r->render(ctx)); // Blit renderer's result to default FB if needed if(!m_rDrawToDefaultFb) { cmdb->beginRenderPass(m_defaultFb); cmdb->setViewport(0, 0, m_width, m_height); cmdb->bindPipeline(m_blitPpline); cmdb->bindResourceGroup(m_rcGroup, 0, nullptr); m_r->drawQuad(cmdb); cmdb->endRenderPass(); } // Flush the command buffer cmdb->flush(); // Set the hints m_cbInitHints = cmdb->computeInitHints(); ANKI_TRACE_STOP_EVENT(RENDER); return ErrorCode::NONE; }
ANKI_TEST(Gr, SimpleDrawcall) { COMMON_BEGIN() PipelinePtr ppline = createSimplePpline(VERT_SRC, FRAG_SRC, *gr); FramebufferPtr fb = createDefaultFb(*gr); U iterations = 100; while(iterations--) { HighRezTimer timer; timer.start(); gr->beginFrame(); CommandBufferInitInfo cinit; CommandBufferPtr cmdb = gr->newInstance<CommandBuffer>(cinit); cmdb->setViewport(0, 0, WIDTH, HEIGHT); cmdb->setPolygonOffset(0.0, 0.0); cmdb->bindPipeline(ppline); cmdb->beginRenderPass(fb); cmdb->drawArrays(3); cmdb->endRenderPass(); cmdb->flush(); gr->swapBuffers(); timer.stop(); const F32 TICK = 1.0 / 30.0; if(timer.getElapsedTime() < TICK) { HighRezTimer::sleep(TICK - timer.getElapsedTime()); } } COMMON_END() }
ANKI_TEST(Gr, DrawWithUniforms) { COMMON_BEGIN() // A non-uploaded buffer BufferPtr b = gr->newInstance<Buffer>(sizeof(Vec4) * 3, BufferUsageBit::UNIFORM_ALL, BufferMapAccessBit::WRITE); Vec4* ptr = static_cast<Vec4*>(b->map(0, sizeof(Vec4) * 3, BufferMapAccessBit::WRITE)); ANKI_TEST_EXPECT_NEQ(ptr, nullptr); ptr[0] = Vec4(1.0, 0.0, 0.0, 0.0); ptr[1] = Vec4(0.0, 1.0, 0.0, 0.0); ptr[2] = Vec4(0.0, 0.0, 1.0, 0.0); b->unmap(); // Resource group ResourceGroupInitInfo rcinit; rcinit.m_uniformBuffers[0].m_buffer = b; rcinit.m_uniformBuffers[0].m_usage = BufferUsageBit::UNIFORM_ALL_GRAPHICS; rcinit.m_uniformBuffers[1].m_uploadedMemory = true; rcinit.m_uniformBuffers[1].m_usage = BufferUsageBit::UNIFORM_ALL_GRAPHICS; ResourceGroupPtr rc = gr->newInstance<ResourceGroup>(rcinit); // Ppline PipelinePtr ppline = createSimplePpline(VERT_UBO_SRC, FRAG_UBO_SRC, *gr); // FB FramebufferPtr fb = createDefaultFb(*gr); const U ITERATION_COUNT = 100; U iterations = ITERATION_COUNT; while(iterations--) { HighRezTimer timer; timer.start(); gr->beginFrame(); // Uploaded buffer TransientMemoryInfo transientInfo; Vec4* rotMat = static_cast<Vec4*>(gr->allocateFrameTransientMemory( sizeof(Vec4), BufferUsageBit::UNIFORM_ALL, transientInfo.m_uniformBuffers[1])); F32 angle = toRad(360.0f / ITERATION_COUNT * iterations); (*rotMat)[0] = cos(angle); (*rotMat)[1] = -sin(angle); (*rotMat)[2] = sin(angle); (*rotMat)[3] = cos(angle); CommandBufferInitInfo cinit; CommandBufferPtr cmdb = gr->newInstance<CommandBuffer>(cinit); cmdb->setViewport(0, 0, WIDTH, HEIGHT); cmdb->setPolygonOffset(0.0, 0.0); cmdb->bindPipeline(ppline); cmdb->beginRenderPass(fb); cmdb->bindResourceGroup(rc, 0, &transientInfo); cmdb->drawArrays(3); cmdb->endRenderPass(); cmdb->flush(); gr->swapBuffers(); timer.stop(); const F32 TICK = 1.0 / 30.0; if(timer.getElapsedTime() < TICK) { HighRezTimer::sleep(TICK - timer.getElapsedTime()); } } COMMON_END() }
ANKI_TEST(Ui, Ui) { Config cfg; initConfig(cfg); cfg.set("window.vsync", 1); cfg.set("window.debugContext", 0); cfg.set("width", 1024); cfg.set("height", 760); cfg.set("rsrc.dataPaths", "engine_data"); NativeWindow* win = createWindow(cfg); Input* in = new Input(); GrManager* gr = createGrManager(cfg, win); PhysicsWorld* physics; ResourceFilesystem* fs; ResourceManager* resource = createResourceManager(cfg, gr, physics, fs); UiManager* ui = new UiManager(); ANKI_TEST_EXPECT_NO_ERR(in->init(win)); StagingGpuMemoryManager* stagingMem = new StagingGpuMemoryManager(); ANKI_TEST_EXPECT_NO_ERR(stagingMem->init(gr, cfg)); HeapAllocator<U8> alloc(allocAligned, nullptr); ANKI_TEST_EXPECT_NO_ERR(ui->init(allocAligned, nullptr, resource, gr, stagingMem, in)); { FontPtr font; ANKI_TEST_EXPECT_NO_ERR(ui->newInstance(font, "UbuntuRegular.ttf", std::initializer_list<U32>{10, 20, 30, 60})); CanvasPtr canvas; ANKI_TEST_EXPECT_NO_ERR(ui->newInstance(canvas, font, 20, win->getWidth(), win->getHeight())); IntrusivePtr<Label> label; ANKI_TEST_EXPECT_NO_ERR(ui->newInstance(label)); Bool done = false; while(!done) { ANKI_TEST_EXPECT_NO_ERR(in->handleEvents()); HighRezTimer timer; timer.start(); canvas->handleInput(); if(in->getKey(KeyCode::ESCAPE)) { done = true; } canvas->beginBuilding(); label->build(canvas); TexturePtr presentTex = gr->acquireNextPresentableTexture(); FramebufferPtr fb; { TextureViewInitInfo init; init.m_texture = presentTex; TextureViewPtr view = gr->newTextureView(init); FramebufferInitInfo fbinit; fbinit.m_colorAttachmentCount = 1; fbinit.m_colorAttachments[0].m_clearValue.m_colorf = {{1.0, 0.0, 1.0, 1.0}}; fbinit.m_colorAttachments[0].m_textureView = view; fb = gr->newFramebuffer(fbinit); } CommandBufferInitInfo cinit; cinit.m_flags = CommandBufferFlag::GRAPHICS_WORK | CommandBufferFlag::SMALL_BATCH; CommandBufferPtr cmdb = gr->newCommandBuffer(cinit); cmdb->setTextureBarrier(presentTex, TextureUsageBit::NONE, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, TextureSubresourceInfo()); cmdb->beginRenderPass(fb, {{TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE}}, {}); canvas->appendToCommandBuffer(cmdb); cmdb->endRenderPass(); cmdb->setTextureBarrier(presentTex, TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE, TextureUsageBit::PRESENT, TextureSubresourceInfo()); cmdb->flush(); gr->swapBuffers(); stagingMem->endFrame(); timer.stop(); const F32 TICK = 1.0 / 30.0; if(timer.getElapsedTime() < TICK) { HighRezTimer::sleep(TICK - timer.getElapsedTime()); } } } delete ui; delete stagingMem; delete resource; delete physics; delete fs; GrManager::deleteInstance(gr); delete in; delete win; }