diff options
| author | 2023-07-30 12:56:32 -0400 | |
|---|---|---|
| committer | 2023-08-06 14:54:57 -0400 | |
| commit | b8ca47e094738689e4e8470b0f1f00d60ee26f4c (patch) | |
| tree | 9c5fb2cf6fb7d01f63b5f79b8af7a53f8dd86f07 /src/video_core | |
| parent | flattening (diff) | |
| download | yuzu-b8ca47e094738689e4e8470b0f1f00d60ee26f4c.tar.gz yuzu-b8ca47e094738689e4e8470b0f1f00d60ee26f4c.tar.xz yuzu-b8ca47e094738689e4e8470b0f1f00d60ee26f4c.zip | |
EncodingData pack
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/host_shaders/astc_decoder.comp | 113 |
1 files changed, 69 insertions, 44 deletions
diff --git a/src/video_core/host_shaders/astc_decoder.comp b/src/video_core/host_shaders/astc_decoder.comp index f720df6d2..37b502324 100644 --- a/src/video_core/host_shaders/astc_decoder.comp +++ b/src/video_core/host_shaders/astc_decoder.comp | |||
| @@ -33,10 +33,7 @@ UNIFORM(6) uint block_height_mask; | |||
| 33 | END_PUSH_CONSTANTS | 33 | END_PUSH_CONSTANTS |
| 34 | 34 | ||
| 35 | struct EncodingData { | 35 | struct EncodingData { |
| 36 | uint encoding; | 36 | uint data; |
| 37 | uint num_bits; | ||
| 38 | uint bit_value; | ||
| 39 | uint quint_trit_value; | ||
| 40 | }; | 37 | }; |
| 41 | 38 | ||
| 42 | struct TexelWeightParams { | 39 | struct TexelWeightParams { |
| @@ -66,17 +63,47 @@ const int TRIT = 2; | |||
| 66 | 63 | ||
| 67 | // ASTC Encodings data, sorted in ascending order based on their BitLength value | 64 | // ASTC Encodings data, sorted in ascending order based on their BitLength value |
| 68 | // (see GetBitLength() function) | 65 | // (see GetBitLength() function) |
| 69 | EncodingData encoding_values[22] = EncodingData[]( | 66 | const EncodingData encoding_values[22] = EncodingData[]( |
| 70 | EncodingData(JUST_BITS, 0, 0, 0), EncodingData(JUST_BITS, 1, 0, 0), EncodingData(TRIT, 0, 0, 0), | 67 | EncodingData(JUST_BITS), EncodingData(JUST_BITS | (1u << 8u)), EncodingData(TRIT), EncodingData(JUST_BITS | (2u << 8u)), |
| 71 | EncodingData(JUST_BITS, 2, 0, 0), EncodingData(QUINT, 0, 0, 0), EncodingData(TRIT, 1, 0, 0), | 68 | EncodingData(QUINT), EncodingData(TRIT | (1u << 8u)), EncodingData(JUST_BITS | (3u << 8u)), EncodingData(QUINT | (1u << 8u)), |
| 72 | EncodingData(JUST_BITS, 3, 0, 0), EncodingData(QUINT, 1, 0, 0), EncodingData(TRIT, 2, 0, 0), | 69 | EncodingData(TRIT | (2u << 8u)), EncodingData(JUST_BITS | (4u << 8u)), EncodingData(QUINT | (2u << 8u)), EncodingData(TRIT | (3u << 8u)), |
| 73 | EncodingData(JUST_BITS, 4, 0, 0), EncodingData(QUINT, 2, 0, 0), EncodingData(TRIT, 3, 0, 0), | 70 | EncodingData(JUST_BITS | (5u << 8u)), EncodingData(QUINT | (3u << 8u)), EncodingData(TRIT | (4u << 8u)), EncodingData(JUST_BITS | (6u << 8u)), |
| 74 | EncodingData(JUST_BITS, 5, 0, 0), EncodingData(QUINT, 3, 0, 0), EncodingData(TRIT, 4, 0, 0), | 71 | EncodingData(QUINT | (4u << 8u)), EncodingData(TRIT | (5u << 8u)), EncodingData(JUST_BITS | (7u << 8u)), EncodingData(QUINT | (5u << 8u)), |
| 75 | EncodingData(JUST_BITS, 6, 0, 0), EncodingData(QUINT, 4, 0, 0), EncodingData(TRIT, 5, 0, 0), | 72 | EncodingData(TRIT | (6u << 8u)), EncodingData(JUST_BITS | (8u << 8u)) |
| 76 | EncodingData(JUST_BITS, 7, 0, 0), EncodingData(QUINT, 5, 0, 0), EncodingData(TRIT, 6, 0, 0), | ||
| 77 | EncodingData(JUST_BITS, 8, 0, 0) | ||
| 78 | ); | 73 | ); |
| 79 | 74 | ||
| 75 | // EncodingData helpers | ||
| 76 | uint Encoding(EncodingData val) { | ||
| 77 | return bitfieldExtract(val.data, 0, 8); | ||
| 78 | } | ||
| 79 | uint NumBits(EncodingData val) { | ||
| 80 | return bitfieldExtract(val.data, 8, 8); | ||
| 81 | } | ||
| 82 | uint BitValue(EncodingData val) { | ||
| 83 | return bitfieldExtract(val.data, 16, 8); | ||
| 84 | } | ||
| 85 | uint QuintTritValue(EncodingData val) { | ||
| 86 | return bitfieldExtract(val.data, 24, 8); | ||
| 87 | } | ||
| 88 | |||
| 89 | void Encoding(inout EncodingData val, uint v) { | ||
| 90 | val.data = bitfieldInsert(val.data, v, 0, 8); | ||
| 91 | } | ||
| 92 | void NumBits(inout EncodingData val, uint v) { | ||
| 93 | val.data = bitfieldInsert(val.data, v, 8, 8); | ||
| 94 | } | ||
| 95 | void BitValue(inout EncodingData val, uint v) { | ||
| 96 | val.data = bitfieldInsert(val.data, v, 16, 8); | ||
| 97 | } | ||
| 98 | void QuintTritValue(inout EncodingData val, uint v) { | ||
| 99 | val.data = bitfieldInsert(val.data, v, 24, 8); | ||
| 100 | } | ||
| 101 | |||
| 102 | EncodingData CreateEncodingData(uint encoding, uint num_bits, uint bit_val, uint quint_trit_val) { | ||
| 103 | return EncodingData(((encoding) << 0u) | ((num_bits) << 8u) | | ||
| 104 | ((bit_val) << 16u) | ((quint_trit_val) << 24u)); | ||
| 105 | } | ||
| 106 | |||
| 80 | // The following constants are expanded variants of the Replicate() | 107 | // The following constants are expanded variants of the Replicate() |
| 81 | // function calls corresponding to the following arguments: | 108 | // function calls corresponding to the following arguments: |
| 82 | // value: index into the generated table | 109 | // value: index into the generated table |
| @@ -379,10 +406,12 @@ void ResultEmplaceBack(EncodingData val) { | |||
| 379 | 406 | ||
| 380 | // Returns the number of bits required to encode n_vals values. | 407 | // Returns the number of bits required to encode n_vals values. |
| 381 | uint GetBitLength(uint n_vals, uint encoding_index) { | 408 | uint GetBitLength(uint n_vals, uint encoding_index) { |
| 382 | uint total_bits = encoding_values[encoding_index].num_bits * n_vals; | 409 | const EncodingData encoding_value = encoding_values[encoding_index]; |
| 383 | if (encoding_values[encoding_index].encoding == TRIT) { | 410 | const uint encoding = Encoding(encoding_value); |
| 411 | uint total_bits = NumBits(encoding_value) * n_vals; | ||
| 412 | if (encoding == TRIT) { | ||
| 384 | total_bits += Div5Ceil(n_vals * 8); | 413 | total_bits += Div5Ceil(n_vals * 8); |
| 385 | } else if (encoding_values[encoding_index].encoding == QUINT) { | 414 | } else if (encoding == QUINT) { |
| 386 | total_bits += Div3Ceil(n_vals * 7); | 415 | total_bits += Div3Ceil(n_vals * 7); |
| 387 | } | 416 | } |
| 388 | return total_bits; | 417 | return total_bits; |
| @@ -451,11 +480,7 @@ void DecodeQuintBlock(uint num_bits) { | |||
| 451 | } | 480 | } |
| 452 | } | 481 | } |
| 453 | for (uint i = 0; i < 3; i++) { | 482 | for (uint i = 0; i < 3; i++) { |
| 454 | EncodingData val; | 483 | const EncodingData val = CreateEncodingData(QUINT, num_bits, m[i], q[i]); |
| 455 | val.encoding = QUINT; | ||
| 456 | val.num_bits = num_bits; | ||
| 457 | val.bit_value = m[i]; | ||
| 458 | val.quint_trit_value = q[i]; | ||
| 459 | ResultEmplaceBack(val); | 484 | ResultEmplaceBack(val); |
| 460 | } | 485 | } |
| 461 | } | 486 | } |
| @@ -503,30 +528,28 @@ void DecodeTritBlock(uint num_bits) { | |||
| 503 | t[0] = (BitsBracket(C, 1) << 1) | (BitsBracket(C, 0) & ~BitsBracket(C, 1)); | 528 | t[0] = (BitsBracket(C, 1) << 1) | (BitsBracket(C, 0) & ~BitsBracket(C, 1)); |
| 504 | } | 529 | } |
| 505 | for (uint i = 0; i < 5; i++) { | 530 | for (uint i = 0; i < 5; i++) { |
| 506 | EncodingData val; | 531 | const EncodingData val = CreateEncodingData(TRIT, num_bits, m[i], t[i]); |
| 507 | val.encoding = TRIT; | ||
| 508 | val.num_bits = num_bits; | ||
| 509 | val.bit_value = m[i]; | ||
| 510 | val.quint_trit_value = t[i]; | ||
| 511 | ResultEmplaceBack(val); | 532 | ResultEmplaceBack(val); |
| 512 | } | 533 | } |
| 513 | } | 534 | } |
| 514 | 535 | ||
| 515 | void DecodeIntegerSequence(uint max_range, uint num_values) { | 536 | void DecodeIntegerSequence(uint max_range, uint num_values) { |
| 516 | EncodingData val = encoding_values[max_range]; | 537 | EncodingData val = encoding_values[max_range]; |
| 538 | const uint encoding = Encoding(val); | ||
| 539 | const uint num_bits = NumBits(val); | ||
| 517 | uint vals_decoded = 0; | 540 | uint vals_decoded = 0; |
| 518 | while (vals_decoded < num_values) { | 541 | while (vals_decoded < num_values) { |
| 519 | switch (val.encoding) { | 542 | switch (encoding) { |
| 520 | case QUINT: | 543 | case QUINT: |
| 521 | DecodeQuintBlock(val.num_bits); | 544 | DecodeQuintBlock(num_bits); |
| 522 | vals_decoded += 3; | 545 | vals_decoded += 3; |
| 523 | break; | 546 | break; |
| 524 | case TRIT: | 547 | case TRIT: |
| 525 | DecodeTritBlock(val.num_bits); | 548 | DecodeTritBlock(num_bits); |
| 526 | vals_decoded += 5; | 549 | vals_decoded += 5; |
| 527 | break; | 550 | break; |
| 528 | case JUST_BITS: | 551 | case JUST_BITS: |
| 529 | val.bit_value = StreamColorBits(val.num_bits); | 552 | BitValue(val, StreamColorBits(num_bits)); |
| 530 | ResultEmplaceBack(val); | 553 | ResultEmplaceBack(val); |
| 531 | vals_decoded++; | 554 | vals_decoded++; |
| 532 | break; | 555 | break; |
| @@ -554,17 +577,18 @@ void DecodeColorValues(uvec4 modes, uint num_partitions, uint color_data_bits) { | |||
| 554 | if (out_index >= num_values) { | 577 | if (out_index >= num_values) { |
| 555 | break; | 578 | break; |
| 556 | } | 579 | } |
| 557 | EncodingData val = result_vector[itr]; | 580 | const EncodingData val = result_vector[itr]; |
| 558 | uint bitlen = val.num_bits; | 581 | const uint encoding = Encoding(val); |
| 559 | uint bitval = val.bit_value; | 582 | const uint bitlen = NumBits(val); |
| 583 | const uint bitval = BitValue(val); | ||
| 560 | uint A = 0, B = 0, C = 0, D = 0; | 584 | uint A = 0, B = 0, C = 0, D = 0; |
| 561 | A = ReplicateBitTo9((bitval & 1)); | 585 | A = ReplicateBitTo9((bitval & 1)); |
| 562 | switch (val.encoding) { | 586 | switch (encoding) { |
| 563 | case JUST_BITS: | 587 | case JUST_BITS: |
| 564 | color_values[out_index++] = FastReplicateTo8(bitval, bitlen); | 588 | color_values[out_index++] = FastReplicateTo8(bitval, bitlen); |
| 565 | break; | 589 | break; |
| 566 | case TRIT: { | 590 | case TRIT: { |
| 567 | D = val.quint_trit_value; | 591 | D = QuintTritValue(val); |
| 568 | switch (bitlen) { | 592 | switch (bitlen) { |
| 569 | case 1: | 593 | case 1: |
| 570 | C = 204; | 594 | C = 204; |
| @@ -603,7 +627,7 @@ void DecodeColorValues(uvec4 modes, uint num_partitions, uint color_data_bits) { | |||
| 603 | break; | 627 | break; |
| 604 | } | 628 | } |
| 605 | case QUINT: { | 629 | case QUINT: { |
| 606 | D = val.quint_trit_value; | 630 | D = QuintTritValue(val); |
| 607 | switch (bitlen) { | 631 | switch (bitlen) { |
| 608 | case 1: | 632 | case 1: |
| 609 | C = 113; | 633 | C = 113; |
| @@ -636,7 +660,7 @@ void DecodeColorValues(uvec4 modes, uint num_partitions, uint color_data_bits) { | |||
| 636 | break; | 660 | break; |
| 637 | } | 661 | } |
| 638 | } | 662 | } |
| 639 | if (val.encoding != JUST_BITS) { | 663 | if (encoding != JUST_BITS) { |
| 640 | uint T = (D * C) + B; | 664 | uint T = (D * C) + B; |
| 641 | T ^= A; | 665 | T ^= A; |
| 642 | T = (A & 0x80) | (T >> 2); | 666 | T = (A & 0x80) | (T >> 2); |
| @@ -806,17 +830,18 @@ void ComputeEndpoints(out uvec4 ep1, out uvec4 ep2, uint color_endpoint_mode) { | |||
| 806 | } | 830 | } |
| 807 | 831 | ||
| 808 | uint UnquantizeTexelWeight(EncodingData val) { | 832 | uint UnquantizeTexelWeight(EncodingData val) { |
| 809 | uint bitval = val.bit_value; | 833 | const uint encoding = Encoding(val); |
| 810 | uint bitlen = val.num_bits; | 834 | const uint bitlen = NumBits(val); |
| 811 | uint A = ReplicateBitTo7((bitval & 1)); | 835 | const uint bitval = BitValue(val); |
| 836 | const uint A = ReplicateBitTo7((bitval & 1)); | ||
| 812 | uint B = 0, C = 0, D = 0; | 837 | uint B = 0, C = 0, D = 0; |
| 813 | uint result = 0; | 838 | uint result = 0; |
| 814 | switch (val.encoding) { | 839 | switch (encoding) { |
| 815 | case JUST_BITS: | 840 | case JUST_BITS: |
| 816 | result = FastReplicateTo6(bitval, bitlen); | 841 | result = FastReplicateTo6(bitval, bitlen); |
| 817 | break; | 842 | break; |
| 818 | case TRIT: { | 843 | case TRIT: { |
| 819 | D = val.quint_trit_value; | 844 | D = QuintTritValue(val); |
| 820 | switch (bitlen) { | 845 | switch (bitlen) { |
| 821 | case 0: { | 846 | case 0: { |
| 822 | uint results[3] = {0, 32, 63}; | 847 | uint results[3] = {0, 32, 63}; |
| @@ -845,7 +870,7 @@ uint UnquantizeTexelWeight(EncodingData val) { | |||
| 845 | break; | 870 | break; |
| 846 | } | 871 | } |
| 847 | case QUINT: { | 872 | case QUINT: { |
| 848 | D = val.quint_trit_value; | 873 | D = QuintTritValue(val); |
| 849 | switch (bitlen) { | 874 | switch (bitlen) { |
| 850 | case 0: { | 875 | case 0: { |
| 851 | uint results[5] = {0, 16, 32, 47, 63}; | 876 | uint results[5] = {0, 16, 32, 47, 63}; |
| @@ -866,7 +891,7 @@ uint UnquantizeTexelWeight(EncodingData val) { | |||
| 866 | break; | 891 | break; |
| 867 | } | 892 | } |
| 868 | } | 893 | } |
| 869 | if (val.encoding != JUST_BITS && bitlen > 0) { | 894 | if (encoding != JUST_BITS && bitlen > 0) { |
| 870 | result = D * C + B; | 895 | result = D * C + B; |
| 871 | result ^= A; | 896 | result ^= A; |
| 872 | result = (A & 0x20) | (result >> 2); | 897 | result = (A & 0x20) | (result >> 2); |