summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorGravatar Ameer J2023-07-30 12:56:32 -0400
committerGravatar Ameer J2023-08-06 14:54:57 -0400
commitb8ca47e094738689e4e8470b0f1f00d60ee26f4c (patch)
tree9c5fb2cf6fb7d01f63b5f79b8af7a53f8dd86f07 /src/video_core
parentflattening (diff)
downloadyuzu-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.comp113
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;
33END_PUSH_CONSTANTS 33END_PUSH_CONSTANTS
34 34
35struct EncodingData { 35struct EncodingData {
36 uint encoding; 36 uint data;
37 uint num_bits;
38 uint bit_value;
39 uint quint_trit_value;
40}; 37};
41 38
42struct TexelWeightParams { 39struct 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)
69EncodingData encoding_values[22] = EncodingData[]( 66const 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
76uint Encoding(EncodingData val) {
77 return bitfieldExtract(val.data, 0, 8);
78}
79uint NumBits(EncodingData val) {
80 return bitfieldExtract(val.data, 8, 8);
81}
82uint BitValue(EncodingData val) {
83 return bitfieldExtract(val.data, 16, 8);
84}
85uint QuintTritValue(EncodingData val) {
86 return bitfieldExtract(val.data, 24, 8);
87}
88
89void Encoding(inout EncodingData val, uint v) {
90 val.data = bitfieldInsert(val.data, v, 0, 8);
91}
92void NumBits(inout EncodingData val, uint v) {
93 val.data = bitfieldInsert(val.data, v, 8, 8);
94}
95void BitValue(inout EncodingData val, uint v) {
96 val.data = bitfieldInsert(val.data, v, 16, 8);
97}
98void QuintTritValue(inout EncodingData val, uint v) {
99 val.data = bitfieldInsert(val.data, v, 24, 8);
100}
101
102EncodingData 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.
381uint GetBitLength(uint n_vals, uint encoding_index) { 408uint 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
515void DecodeIntegerSequence(uint max_range, uint num_values) { 536void 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
808uint UnquantizeTexelWeight(EncodingData val) { 832uint 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);