early-access version 1789
This commit is contained in:
parent
eadd21a25c
commit
71a75eacdf
4 changed files with 36 additions and 32 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 1788.
|
This is the source code for early-access 1789.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -305,7 +305,11 @@ bool IOFile::Flush() const {
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
||||||
const auto flush_result = std::fflush(file) == 0;
|
#ifdef _WIN32
|
||||||
|
const auto flush_result = std::fflush(file) == 0 && _commit(fileno(file)) == 0;
|
||||||
|
#else
|
||||||
|
const auto flush_result = std::fflush(file) == 0 && fsync(fileno(file)) == 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!flush_result) {
|
if (!flush_result) {
|
||||||
const auto ec = std::error_code{errno, std::generic_category()};
|
const auto ec = std::error_code{errno, std::generic_category()};
|
||||||
|
|
|
@ -763,7 +763,7 @@ void ComputeEndpoints(out uvec4 ep1, out uvec4 ep2, uint color_endpoint_mode) {
|
||||||
case 1: {
|
case 1: {
|
||||||
READ_UINT_VALUES(2)
|
READ_UINT_VALUES(2)
|
||||||
uint L0 = (v[0] >> 2) | (v[1] & 0xC0);
|
uint L0 = (v[0] >> 2) | (v[1] & 0xC0);
|
||||||
uint L1 = max(L0 + (v[1] & 0x3F), 0xFFU);
|
uint L1 = min(L0 + (v[1] & 0x3F), 0xFFU);
|
||||||
ep1 = uvec4(0xFF, L0, L0, L0);
|
ep1 = uvec4(0xFF, L0, L0, L0);
|
||||||
ep2 = uvec4(0xFF, L1, L1, L1);
|
ep2 = uvec4(0xFF, L1, L1, L1);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1070,7 +1070,7 @@ static void UnquantizeTexelWeights(u32 out[2][144], const IntegerEncodedVector&
|
||||||
}
|
}
|
||||||
|
|
||||||
// Transfers a bit as described in C.2.14
|
// Transfers a bit as described in C.2.14
|
||||||
static inline void BitTransferSigned(s32& a, s32& b) {
|
static inline void BitTransferSigned(int& a, int& b) {
|
||||||
b >>= 1;
|
b >>= 1;
|
||||||
b |= a & 0x80;
|
b |= a & 0x80;
|
||||||
a >>= 1;
|
a >>= 1;
|
||||||
|
@ -1193,8 +1193,8 @@ static inline u32 Select2DPartition(s32 seed, s32 x, s32 y, s32 partitionCount,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Section C.2.14
|
// Section C.2.14
|
||||||
static void ComputeEndpos32s(Pixel& ep1, Pixel& ep2, const u32*& colorValues,
|
static void ComputeEndpoints(Pixel& ep1, Pixel& ep2, const u32*& colorValues,
|
||||||
u32 colorEndpos32Mode) {
|
u32 colorEndpointMode) {
|
||||||
#define READ_UINT_VALUES(N) \
|
#define READ_UINT_VALUES(N) \
|
||||||
u32 v[N]; \
|
u32 v[N]; \
|
||||||
for (u32 i = 0; i < N; i++) { \
|
for (u32 i = 0; i < N; i++) { \
|
||||||
|
@ -1204,10 +1204,10 @@ static void ComputeEndpos32s(Pixel& ep1, Pixel& ep2, const u32*& colorValues,
|
||||||
#define READ_INT_VALUES(N) \
|
#define READ_INT_VALUES(N) \
|
||||||
s32 v[N]; \
|
s32 v[N]; \
|
||||||
for (u32 i = 0; i < N; i++) { \
|
for (u32 i = 0; i < N; i++) { \
|
||||||
v[i] = static_cast<s32>(*(colorValues++)); \
|
v[i] = static_cast<int>(*(colorValues++)); \
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (colorEndpos32Mode) {
|
switch (colorEndpointMode) {
|
||||||
case 0: {
|
case 0: {
|
||||||
READ_UINT_VALUES(2)
|
READ_UINT_VALUES(2)
|
||||||
ep1 = Pixel(0xFF, v[0], v[0], v[0]);
|
ep1 = Pixel(0xFF, v[0], v[0], v[0]);
|
||||||
|
@ -1217,7 +1217,7 @@ static void ComputeEndpos32s(Pixel& ep1, Pixel& ep2, const u32*& colorValues,
|
||||||
case 1: {
|
case 1: {
|
||||||
READ_UINT_VALUES(2)
|
READ_UINT_VALUES(2)
|
||||||
u32 L0 = (v[0] >> 2) | (v[1] & 0xC0);
|
u32 L0 = (v[0] >> 2) | (v[1] & 0xC0);
|
||||||
u32 L1 = std::max(L0 + (v[1] & 0x3F), 0xFFU);
|
u32 L1 = std::min(L0 + (v[1] & 0x3F), 0xFFU);
|
||||||
ep1 = Pixel(0xFF, L0, L0, L0);
|
ep1 = Pixel(0xFF, L0, L0, L0);
|
||||||
ep2 = Pixel(0xFF, L1, L1, L1);
|
ep2 = Pixel(0xFF, L1, L1, L1);
|
||||||
} break;
|
} break;
|
||||||
|
@ -1359,23 +1359,23 @@ static void DecompressBlock(std::span<const u8, 16> inBuf, const u32 blockWidth,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Based on the number of partitions, read the color endpos32 mode for
|
// Based on the number of partitions, read the color endpoint mode for
|
||||||
// each partition.
|
// each partition.
|
||||||
|
|
||||||
// Determine partitions, partition index, and color endpos32 modes
|
// Determine partitions, partition index, and color endpoint modes
|
||||||
s32 planeIdx = -1;
|
s32 planeIdx = -1;
|
||||||
u32 partitionIndex;
|
u32 partitionIndex;
|
||||||
u32 colorEndpos32Mode[4] = {0, 0, 0, 0};
|
u32 colorEndpointMode[4] = {0, 0, 0, 0};
|
||||||
|
|
||||||
// Define color data.
|
// Define color data.
|
||||||
u8 colorEndpos32Data[16];
|
u8 colorEndpointData[16];
|
||||||
memset(colorEndpos32Data, 0, sizeof(colorEndpos32Data));
|
memset(colorEndpointData, 0, sizeof(colorEndpointData));
|
||||||
OutputBitStream colorEndpos32Stream(colorEndpos32Data, 16 * 8, 0);
|
OutputBitStream colorEndpointStream(colorEndpointData, 16 * 8, 0);
|
||||||
|
|
||||||
// Read extra config data...
|
// Read extra config data...
|
||||||
u32 baseCEM = 0;
|
u32 baseCEM = 0;
|
||||||
if (nPartitions == 1) {
|
if (nPartitions == 1) {
|
||||||
colorEndpos32Mode[0] = strm.ReadBits<4>();
|
colorEndpointMode[0] = strm.ReadBits<4>();
|
||||||
partitionIndex = 0;
|
partitionIndex = 0;
|
||||||
} else {
|
} else {
|
||||||
partitionIndex = strm.ReadBits<10>();
|
partitionIndex = strm.ReadBits<10>();
|
||||||
|
@ -1383,9 +1383,9 @@ static void DecompressBlock(std::span<const u8, 16> inBuf, const u32 blockWidth,
|
||||||
}
|
}
|
||||||
u32 baseMode = (baseCEM & 3);
|
u32 baseMode = (baseCEM & 3);
|
||||||
|
|
||||||
// Remaining bits are color endpos32 data...
|
// Remaining bits are color endpoint data...
|
||||||
u32 nWeightBits = weightParams.GetPackedBitSize();
|
u32 nWeightBits = weightParams.GetPackedBitSize();
|
||||||
s32 remainingBits = 128 - nWeightBits - static_cast<s32>(strm.GetBitsRead());
|
s32 remainingBits = 128 - nWeightBits - static_cast<int>(strm.GetBitsRead());
|
||||||
|
|
||||||
// Consider extra bits prior to texel data...
|
// Consider extra bits prior to texel data...
|
||||||
u32 extraCEMbits = 0;
|
u32 extraCEMbits = 0;
|
||||||
|
@ -1419,7 +1419,7 @@ static void DecompressBlock(std::span<const u8, 16> inBuf, const u32 blockWidth,
|
||||||
while (remainingBits > 0) {
|
while (remainingBits > 0) {
|
||||||
u32 nb = std::min(remainingBits, 8);
|
u32 nb = std::min(remainingBits, 8);
|
||||||
u32 b = strm.ReadBits(nb);
|
u32 b = strm.ReadBits(nb);
|
||||||
colorEndpos32Stream.WriteBits(b, nb);
|
colorEndpointStream.WriteBits(b, nb);
|
||||||
remainingBits -= 8;
|
remainingBits -= 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1446,34 +1446,34 @@ static void DecompressBlock(std::span<const u8, 16> inBuf, const u32 blockWidth,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (u32 i = 0; i < nPartitions; i++) {
|
for (u32 i = 0; i < nPartitions; i++) {
|
||||||
colorEndpos32Mode[i] = baseMode;
|
colorEndpointMode[i] = baseMode;
|
||||||
if (!(C[i]))
|
if (!(C[i]))
|
||||||
colorEndpos32Mode[i] -= 1;
|
colorEndpointMode[i] -= 1;
|
||||||
colorEndpos32Mode[i] <<= 2;
|
colorEndpointMode[i] <<= 2;
|
||||||
colorEndpos32Mode[i] |= M[i];
|
colorEndpointMode[i] |= M[i];
|
||||||
}
|
}
|
||||||
} else if (nPartitions > 1) {
|
} else if (nPartitions > 1) {
|
||||||
u32 CEM = baseCEM >> 2;
|
u32 CEM = baseCEM >> 2;
|
||||||
for (u32 i = 0; i < nPartitions; i++) {
|
for (u32 i = 0; i < nPartitions; i++) {
|
||||||
colorEndpos32Mode[i] = CEM;
|
colorEndpointMode[i] = CEM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make sure everything up till here is sane.
|
// Make sure everything up till here is sane.
|
||||||
for (u32 i = 0; i < nPartitions; i++) {
|
for (u32 i = 0; i < nPartitions; i++) {
|
||||||
assert(colorEndpos32Mode[i] < 16);
|
assert(colorEndpointMode[i] < 16);
|
||||||
}
|
}
|
||||||
assert(strm.GetBitsRead() + weightParams.GetPackedBitSize() == 128);
|
assert(strm.GetBitsRead() + weightParams.GetPackedBitSize() == 128);
|
||||||
|
|
||||||
// Decode both color data and texel weight data
|
// Decode both color data and texel weight data
|
||||||
u32 colorValues[32]; // Four values, two endpos32s, four maximum paritions
|
u32 colorValues[32]; // Four values, two endpoints, four maximum paritions
|
||||||
DecodeColorValues(colorValues, colorEndpos32Data, colorEndpos32Mode, nPartitions,
|
DecodeColorValues(colorValues, colorEndpointData, colorEndpointMode, nPartitions,
|
||||||
colorDataBits);
|
colorDataBits);
|
||||||
|
|
||||||
Pixel endpos32s[4][2];
|
Pixel endpoints[4][2];
|
||||||
const u32* colorValuesPtr = colorValues;
|
const u32* colorValuesPtr = colorValues;
|
||||||
for (u32 i = 0; i < nPartitions; i++) {
|
for (u32 i = 0; i < nPartitions; i++) {
|
||||||
ComputeEndpos32s(endpos32s[i][0], endpos32s[i][1], colorValuesPtr, colorEndpos32Mode[i]);
|
ComputeEndpoints(endpoints[i][0], endpoints[i][1], colorValuesPtr, colorEndpointMode[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the texel weight data..
|
// Read the texel weight data..
|
||||||
|
@ -1512,7 +1512,7 @@ static void DecompressBlock(std::span<const u8, 16> inBuf, const u32 blockWidth,
|
||||||
u32 weights[2][144];
|
u32 weights[2][144];
|
||||||
UnquantizeTexelWeights(weights, texelWeightValues, weightParams, blockWidth, blockHeight);
|
UnquantizeTexelWeights(weights, texelWeightValues, weightParams, blockWidth, blockHeight);
|
||||||
|
|
||||||
// Now that we have endpos32s and weights, we can s32erpolate and generate
|
// Now that we have endpoints and weights, we can interpolate and generate
|
||||||
// the proper decoding...
|
// the proper decoding...
|
||||||
for (u32 j = 0; j < blockHeight; j++)
|
for (u32 j = 0; j < blockHeight; j++)
|
||||||
for (u32 i = 0; i < blockWidth; i++) {
|
for (u32 i = 0; i < blockWidth; i++) {
|
||||||
|
@ -1522,9 +1522,9 @@ static void DecompressBlock(std::span<const u8, 16> inBuf, const u32 blockWidth,
|
||||||
|
|
||||||
Pixel p;
|
Pixel p;
|
||||||
for (u32 c = 0; c < 4; c++) {
|
for (u32 c = 0; c < 4; c++) {
|
||||||
u32 C0 = endpos32s[partition][0].Component(c);
|
u32 C0 = endpoints[partition][0].Component(c);
|
||||||
C0 = ReplicateByteTo16(C0);
|
C0 = ReplicateByteTo16(C0);
|
||||||
u32 C1 = endpos32s[partition][1].Component(c);
|
u32 C1 = endpoints[partition][1].Component(c);
|
||||||
C1 = ReplicateByteTo16(C1);
|
C1 = ReplicateByteTo16(C1);
|
||||||
|
|
||||||
u32 plane = 0;
|
u32 plane = 0;
|
||||||
|
|
Loading…
Reference in a new issue