static void createCube(GrManager& gr, BufferPtr& verts, BufferPtr& indices) { static const Array<F32, 8 * 3> pos = { {1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1}}; static const Array<U16, 6 * 2 * 3> idx = { {0, 1, 3, 3, 1, 2, 1, 5, 6, 1, 6, 2, 7, 4, 0, 7, 0, 3, 6, 5, 7, 7, 5, 4, 0, 4, 5, 0, 5, 1, 3, 2, 6, 3, 6, 7}}; verts = gr.newInstance<Buffer>(sizeof(pos), BufferUsageBit::VERTEX, BufferMapAccessBit::WRITE); void* mapped = verts->map(0, sizeof(pos), BufferMapAccessBit::WRITE); memcpy(mapped, &pos[0], sizeof(pos)); verts->unmap(); indices = gr.newInstance<Buffer>(sizeof(idx), BufferUsageBit::INDEX, BufferMapAccessBit::WRITE); mapped = indices->map(0, sizeof(idx), BufferMapAccessBit::WRITE); memcpy(mapped, &idx[0], sizeof(idx)); indices->unmap(); }
ANKI_TEST(Gr, Buffer) { COMMON_BEGIN() BufferPtr a = gr->newInstance<Buffer>(512, BufferUsageBit::UNIFORM_ALL, BufferMapAccessBit::NONE); BufferPtr b = gr->newInstance<Buffer>(64, BufferUsageBit::STORAGE_ALL, BufferMapAccessBit::WRITE | BufferMapAccessBit::READ); void* ptr = b->map(0, 64, BufferMapAccessBit::WRITE); ANKI_TEST_EXPECT_NEQ(ptr, nullptr); U8 ptr2[64]; memset(ptr, 0xCC, 64); memset(ptr2, 0xCC, 64); b->unmap(); ptr = b->map(0, 64, BufferMapAccessBit::READ); ANKI_TEST_EXPECT_NEQ(ptr, nullptr); ANKI_TEST_EXPECT_EQ(memcmp(ptr, ptr2, 64), 0); b->unmap(); 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(Gr, DrawWithVertex) { COMMON_BEGIN() // The buffers struct Vert { Vec3 m_pos; Array<U8, 4> m_color; }; static_assert(sizeof(Vert) == sizeof(Vec4), "See file"); BufferPtr b = gr->newInstance<Buffer>(sizeof(Vert) * 3, BufferUsageBit::VERTEX, BufferMapAccessBit::WRITE); Vert* ptr = static_cast<Vert*>(b->map(0, sizeof(Vert) * 3, BufferMapAccessBit::WRITE)); ANKI_TEST_EXPECT_NEQ(ptr, nullptr); ptr[0].m_pos = Vec3(-1.0, 1.0, 0.0); ptr[1].m_pos = Vec3(0.0, -1.0, 0.0); ptr[2].m_pos = Vec3(1.0, 1.0, 0.0); ptr[0].m_color = {255, 0, 0}; ptr[1].m_color = {0, 255, 0}; ptr[2].m_color = {0, 0, 255}; b->unmap(); BufferPtr c = gr->newInstance<Buffer>(sizeof(Vec3) * 3, BufferUsageBit::VERTEX, BufferMapAccessBit::WRITE); Vec3* otherColor = static_cast<Vec3*>(c->map(0, sizeof(Vec3) * 3, BufferMapAccessBit::WRITE));