44 bool find(uint16_t _width, uint16_t _height,
Pack2D& _pack)
46 uint16_t width = bx::min<uint16_t>(64, (_width + m_bw - 1) / m_bw);
47 uint16_t height = bx::min<uint16_t>(numBlocks, (_height + m_bh - 1) / m_bh);
48 uint16_t numx = 64 - width;
49 uint16_t numy = numBlocks - height;
51 const uint64_t scan = width == 64 ? UINT64_MAX : (UINT64_C(1) << width) - 1;
53 for(uint16_t starty = 0; starty <= numy; ++starty)
55 uint64_t mem = m_mem[starty];
56 uint16_t ntz = (uint16_t)bx::uint64_cnttz(mem);
57 uint64_t mask = scan << ntz;
59 for(uint16_t xx = ntz; xx <= numx; ++xx, mask <<= 1)
62 if((mem & mask) == mask)
64 uint16_t endy = starty + height;
65 while(yy < endy && (m_mem[yy] & mask) == mask)
72 uint64_t cmask = ~mask;
73 for(yy = starty; yy < endy; ++yy)
78 _pack.
m_x = xx * m_bw;
79 _pack.
m_y = starty * m_bh;
93 uint16_t startx = bx::min<uint16_t>(63, _pack.
m_x / m_bw);
94 uint16_t starty = bx::min<uint16_t>(numBlocks - 1, _pack.
m_y / m_bh);
95 uint16_t endx = bx::min<uint16_t>(64, (_pack.
m_width + m_bw - 1) / m_bw + startx);
96 uint16_t endy = bx::min<uint16_t>(numBlocks, (_pack.
m_height + m_bh - 1) / m_bh + starty);
97 uint16_t width = endx - startx;
99 const uint64_t mask = (width == 64 ? UINT64_MAX : (UINT64_C(1) << width) - 1) << startx;
101 for(uint16_t yy = starty; yy < endy; ++yy)