|
@@ -155,9 +155,6 @@ uint SwizzleOffset(uvec2 pos) {
|
|
|
// Replicates low num_bits such that [(to_bit - 1):(to_bit - 1 - from_bit)]
|
|
// Replicates low num_bits such that [(to_bit - 1):(to_bit - 1 - from_bit)]
|
|
|
// is the same as [(num_bits - 1):0] and repeats all the way down.
|
|
// is the same as [(num_bits - 1):0] and repeats all the way down.
|
|
|
uint Replicate(uint val, uint num_bits, uint to_bit) {
|
|
uint Replicate(uint val, uint num_bits, uint to_bit) {
|
|
|
- if (num_bits == 0 || to_bit == 0) {
|
|
|
|
|
- return 0;
|
|
|
|
|
- }
|
|
|
|
|
const uint v = val & uint((1 << num_bits) - 1);
|
|
const uint v = val & uint((1 << num_bits) - 1);
|
|
|
uint res = v;
|
|
uint res = v;
|
|
|
uint reslen = num_bits;
|
|
uint reslen = num_bits;
|
|
@@ -187,42 +184,57 @@ uint ReplicateBitTo9(uint value) {
|
|
|
return REPLICATE_1_BIT_TO_9_TABLE[value];
|
|
return REPLICATE_1_BIT_TO_9_TABLE[value];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-uint FastReplicateTo8(uint value, uint num_bits) {
|
|
|
|
|
- switch (num_bits) {
|
|
|
|
|
- case 1:
|
|
|
|
|
- return REPLICATE_1_BIT_TO_8_TABLE[value];
|
|
|
|
|
- case 2:
|
|
|
|
|
- return REPLICATE_2_BIT_TO_8_TABLE[value];
|
|
|
|
|
- case 3:
|
|
|
|
|
- return REPLICATE_3_BIT_TO_8_TABLE[value];
|
|
|
|
|
- case 4:
|
|
|
|
|
- return REPLICATE_4_BIT_TO_8_TABLE[value];
|
|
|
|
|
- case 5:
|
|
|
|
|
- return REPLICATE_5_BIT_TO_8_TABLE[value];
|
|
|
|
|
- case 6:
|
|
|
|
|
- return REPLICATE_6_BIT_TO_8_TABLE[value];
|
|
|
|
|
- case 7:
|
|
|
|
|
- return REPLICATE_7_BIT_TO_8_TABLE[value];
|
|
|
|
|
- case 8:
|
|
|
|
|
|
|
+uint FastReplicate(uint value, uint num_bits, uint to_bit) {
|
|
|
|
|
+ if (num_bits == 0) {
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (num_bits == to_bit) {
|
|
|
return value;
|
|
return value;
|
|
|
}
|
|
}
|
|
|
- return Replicate(value, num_bits, 8);
|
|
|
|
|
|
|
+ if (to_bit == 6) {
|
|
|
|
|
+ switch (num_bits) {
|
|
|
|
|
+ case 1:
|
|
|
|
|
+ return REPLICATE_1_BIT_TO_6_TABLE[value];
|
|
|
|
|
+ case 2:
|
|
|
|
|
+ return REPLICATE_2_BIT_TO_6_TABLE[value];
|
|
|
|
|
+ case 3:
|
|
|
|
|
+ return REPLICATE_3_BIT_TO_6_TABLE[value];
|
|
|
|
|
+ case 4:
|
|
|
|
|
+ return REPLICATE_4_BIT_TO_6_TABLE[value];
|
|
|
|
|
+ case 5:
|
|
|
|
|
+ return REPLICATE_5_BIT_TO_6_TABLE[value];
|
|
|
|
|
+ default:
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ } else { /* if (to_bit == 8) */
|
|
|
|
|
+ switch (num_bits) {
|
|
|
|
|
+ case 1:
|
|
|
|
|
+ return REPLICATE_1_BIT_TO_8_TABLE[value];
|
|
|
|
|
+ case 2:
|
|
|
|
|
+ return REPLICATE_2_BIT_TO_8_TABLE[value];
|
|
|
|
|
+ case 3:
|
|
|
|
|
+ return REPLICATE_3_BIT_TO_8_TABLE[value];
|
|
|
|
|
+ case 4:
|
|
|
|
|
+ return REPLICATE_4_BIT_TO_8_TABLE[value];
|
|
|
|
|
+ case 5:
|
|
|
|
|
+ return REPLICATE_5_BIT_TO_8_TABLE[value];
|
|
|
|
|
+ case 6:
|
|
|
|
|
+ return REPLICATE_6_BIT_TO_8_TABLE[value];
|
|
|
|
|
+ case 7:
|
|
|
|
|
+ return REPLICATE_7_BIT_TO_8_TABLE[value];
|
|
|
|
|
+ default:
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return Replicate(value, num_bits, to_bit);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+uint FastReplicateTo8(uint value, uint num_bits) {
|
|
|
|
|
+ return FastReplicate(value, num_bits, 8);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
uint FastReplicateTo6(uint value, uint num_bits) {
|
|
uint FastReplicateTo6(uint value, uint num_bits) {
|
|
|
- switch (num_bits) {
|
|
|
|
|
- case 1:
|
|
|
|
|
- return REPLICATE_1_BIT_TO_6_TABLE[value];
|
|
|
|
|
- case 2:
|
|
|
|
|
- return REPLICATE_2_BIT_TO_6_TABLE[value];
|
|
|
|
|
- case 3:
|
|
|
|
|
- return REPLICATE_3_BIT_TO_6_TABLE[value];
|
|
|
|
|
- case 4:
|
|
|
|
|
- return REPLICATE_4_BIT_TO_6_TABLE[value];
|
|
|
|
|
- case 5:
|
|
|
|
|
- return REPLICATE_5_BIT_TO_6_TABLE[value];
|
|
|
|
|
- }
|
|
|
|
|
- return Replicate(value, num_bits, 6);
|
|
|
|
|
|
|
+ return FastReplicate(value, num_bits, 6);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
uint Div3Floor(uint v) {
|
|
uint Div3Floor(uint v) {
|