| 2357 | }; |
| 2358 | |
| 2359 | static void decodeBlockBc7(uint8_t _dst[16*4], const uint8_t _src[16]) |
| 2360 | { |
| 2361 | if (!BX_ENABLED(BIMG_DECODE_BC7) ) |
| 2362 | { |
| 2363 | return; |
| 2364 | } |
| 2365 | |
| 2366 | BitReader bit(_src); |
| 2367 | |
| 2368 | uint8_t mode = 0; |
| 2369 | for (; mode < 8 && 0 == bit.read(1); ++mode) |
| 2370 | { |
| 2371 | } |
| 2372 | |
| 2373 | if (mode == 8) |
| 2374 | { |
| 2375 | bx::memSet(_dst, 0, 16*4); |
| 2376 | return; |
| 2377 | } |
| 2378 | |
| 2379 | const Bc7ModeInfo& mi = s_bp7ModeInfo[mode]; |
| 2380 | const uint8_t modePBits = 0 != mi.endpointPBits |
| 2381 | ? mi.endpointPBits |
| 2382 | : mi.sharedPBits |
| 2383 | ; |
| 2384 | |
| 2385 | const uint8_t partitionSetIdx = uint8_t(bit.read(mi.partitionBits) ); |
| 2386 | const uint8_t rotationMode = uint8_t(bit.read(mi.rotationBits) ); |
| 2387 | const uint8_t indexSelectionMode = uint8_t(bit.read(mi.indexSelectionBits) ); |
| 2388 | |
| 2389 | uint8_t epR[6]; |
| 2390 | uint8_t epG[6]; |
| 2391 | uint8_t epB[6]; |
| 2392 | uint8_t epA[6]; |
| 2393 | |
| 2394 | for (uint8_t ii = 0; ii < mi.numSubsets; ++ii) |
| 2395 | { |
| 2396 | epR[ii*2+0] = uint8_t(bit.read(mi.colorBits) << modePBits); |
| 2397 | epR[ii*2+1] = uint8_t(bit.read(mi.colorBits) << modePBits); |
| 2398 | } |
| 2399 | |
| 2400 | for (uint8_t ii = 0; ii < mi.numSubsets; ++ii) |
| 2401 | { |
| 2402 | epG[ii*2+0] = uint8_t(bit.read(mi.colorBits) << modePBits); |
| 2403 | epG[ii*2+1] = uint8_t(bit.read(mi.colorBits) << modePBits); |
| 2404 | } |
| 2405 | |
| 2406 | for (uint8_t ii = 0; ii < mi.numSubsets; ++ii) |
| 2407 | { |
| 2408 | epB[ii*2+0] = uint8_t(bit.read(mi.colorBits) << modePBits); |
| 2409 | epB[ii*2+1] = uint8_t(bit.read(mi.colorBits) << modePBits); |
| 2410 | } |
| 2411 | |
| 2412 | if (mi.alphaBits) |
| 2413 | { |
| 2414 | for (uint8_t ii = 0; ii < mi.numSubsets; ++ii) |
| 2415 | { |
| 2416 | epA[ii*2+0] = uint8_t(bit.read(mi.alphaBits) << modePBits); |
no test coverage detected