mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2024-11-26 21:30:07 +00:00
Fix encode zero bits on word boundary bug
Bit stream writer was manifesting incorrect behaviour when the following two conditions were met: - writer was on 64-bit word boundary - WriteBits was invoked with num_bits=0 (can happen when a Huffman codec has only one value) The bug was causing very rare sporadic corruption which was detected by tests after a random experimental change in MARK-V model.
This commit is contained in:
parent
63e1e348b0
commit
d41a52415a
@ -300,6 +300,8 @@ void BitWriterWord64::WriteBits(uint64_t bits, size_t num_bits) {
|
|||||||
assert(is_little_endian && "Big-endian architecture support not implemented");
|
assert(is_little_endian && "Big-endian architecture support not implemented");
|
||||||
if (!is_little_endian) return;
|
if (!is_little_endian) return;
|
||||||
|
|
||||||
|
if (num_bits == 0) return;
|
||||||
|
|
||||||
bits = GetLowerBits(bits, num_bits);
|
bits = GetLowerBits(bits, num_bits);
|
||||||
|
|
||||||
EmitSequence(bits, num_bits);
|
EmitSequence(bits, num_bits);
|
||||||
|
@ -565,6 +565,25 @@ TEST(BitWriterWord64, WriteBits) {
|
|||||||
EXPECT_EQ(PadToWord<64>("110011100111001"), writer.GetStreamPadded64());
|
EXPECT_EQ(PadToWord<64>("110011100111001"), writer.GetStreamPadded64());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(BitWriterWord64, WriteZeroBits) {
|
||||||
|
BitWriterWord64 writer;
|
||||||
|
writer.WriteBits(0, 0);
|
||||||
|
writer.WriteBits(1, 0);
|
||||||
|
EXPECT_EQ(0u, writer.GetNumBits());
|
||||||
|
writer.WriteBits(1, 1);
|
||||||
|
writer.WriteBits(0, 0);
|
||||||
|
EXPECT_EQ(PadToWord<64>("1"), writer.GetStreamPadded64());
|
||||||
|
writer.WriteBits(0, 63);
|
||||||
|
EXPECT_EQ(64u, writer.GetNumBits());
|
||||||
|
writer.WriteBits(0, 0);
|
||||||
|
writer.WriteBits(7, 3);
|
||||||
|
writer.WriteBits(0, 0);
|
||||||
|
EXPECT_EQ(PadToWord<64>(
|
||||||
|
"1"
|
||||||
|
"000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
"111"), writer.GetStreamPadded64());
|
||||||
|
}
|
||||||
|
|
||||||
TEST(BitWriterWord64, ComparisonTestWriteLotsOfBits) {
|
TEST(BitWriterWord64, ComparisonTestWriteLotsOfBits) {
|
||||||
BitWriterStringStream writer1;
|
BitWriterStringStream writer1;
|
||||||
BitWriterWord64 writer2(16384);
|
BitWriterWord64 writer2(16384);
|
||||||
|
Loading…
Reference in New Issue
Block a user