From 71a75eacdfd0c901623405fba15f01e9db87f508 Mon Sep 17 00:00:00 2001 From: pineappleEA Date: Wed, 16 Jun 2021 05:07:18 +0200 Subject: [PATCH] early-access version 1789 --- README.md | 2 +- src/common/fs/file.cpp | 6 +- src/video_core/host_shaders/astc_decoder.comp | 2 +- src/video_core/textures/astc.cpp | 58 +++++++++---------- 4 files changed, 36 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index daab71b55..bacd15122 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ yuzu emulator early access ============= -This is the source code for early-access 1788. +This is the source code for early-access 1789. ## Legal Notice diff --git a/src/common/fs/file.cpp b/src/common/fs/file.cpp index a12836a0c..710e88b39 100755 --- a/src/common/fs/file.cpp +++ b/src/common/fs/file.cpp @@ -305,7 +305,11 @@ bool IOFile::Flush() const { 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) { const auto ec = std::error_code{errno, std::generic_category()}; diff --git a/src/video_core/host_shaders/astc_decoder.comp b/src/video_core/host_shaders/astc_decoder.comp index 703e34587..eaba1b103 100755 --- a/src/video_core/host_shaders/astc_decoder.comp +++ b/src/video_core/host_shaders/astc_decoder.comp @@ -763,7 +763,7 @@ void ComputeEndpoints(out uvec4 ep1, out uvec4 ep2, uint color_endpoint_mode) { case 1: { READ_UINT_VALUES(2) 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); ep2 = uvec4(0xFF, L1, L1, L1); break; diff --git a/src/video_core/textures/astc.cpp b/src/video_core/textures/astc.cpp index a24452205..9b2177ebd 100755 --- a/src/video_core/textures/astc.cpp +++ b/src/video_core/textures/astc.cpp @@ -1070,7 +1070,7 @@ static void UnquantizeTexelWeights(u32 out[2][144], const IntegerEncodedVector& } // 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 |= a & 0x80; a >>= 1; @@ -1193,8 +1193,8 @@ static inline u32 Select2DPartition(s32 seed, s32 x, s32 y, s32 partitionCount, } // Section C.2.14 -static void ComputeEndpos32s(Pixel& ep1, Pixel& ep2, const u32*& colorValues, - u32 colorEndpos32Mode) { +static void ComputeEndpoints(Pixel& ep1, Pixel& ep2, const u32*& colorValues, + u32 colorEndpointMode) { #define READ_UINT_VALUES(N) \ u32 v[N]; \ 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) \ s32 v[N]; \ for (u32 i = 0; i < N; i++) { \ - v[i] = static_cast(*(colorValues++)); \ + v[i] = static_cast(*(colorValues++)); \ } - switch (colorEndpos32Mode) { + switch (colorEndpointMode) { case 0: { READ_UINT_VALUES(2) 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: { READ_UINT_VALUES(2) 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); ep2 = Pixel(0xFF, L1, L1, L1); } break; @@ -1359,23 +1359,23 @@ static void DecompressBlock(std::span inBuf, const u32 blockWidth, 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. - // Determine partitions, partition index, and color endpos32 modes + // Determine partitions, partition index, and color endpoint modes s32 planeIdx = -1; u32 partitionIndex; - u32 colorEndpos32Mode[4] = {0, 0, 0, 0}; + u32 colorEndpointMode[4] = {0, 0, 0, 0}; // Define color data. - u8 colorEndpos32Data[16]; - memset(colorEndpos32Data, 0, sizeof(colorEndpos32Data)); - OutputBitStream colorEndpos32Stream(colorEndpos32Data, 16 * 8, 0); + u8 colorEndpointData[16]; + memset(colorEndpointData, 0, sizeof(colorEndpointData)); + OutputBitStream colorEndpointStream(colorEndpointData, 16 * 8, 0); // Read extra config data... u32 baseCEM = 0; if (nPartitions == 1) { - colorEndpos32Mode[0] = strm.ReadBits<4>(); + colorEndpointMode[0] = strm.ReadBits<4>(); partitionIndex = 0; } else { partitionIndex = strm.ReadBits<10>(); @@ -1383,9 +1383,9 @@ static void DecompressBlock(std::span inBuf, const u32 blockWidth, } u32 baseMode = (baseCEM & 3); - // Remaining bits are color endpos32 data... + // Remaining bits are color endpoint data... u32 nWeightBits = weightParams.GetPackedBitSize(); - s32 remainingBits = 128 - nWeightBits - static_cast(strm.GetBitsRead()); + s32 remainingBits = 128 - nWeightBits - static_cast(strm.GetBitsRead()); // Consider extra bits prior to texel data... u32 extraCEMbits = 0; @@ -1419,7 +1419,7 @@ static void DecompressBlock(std::span inBuf, const u32 blockWidth, while (remainingBits > 0) { u32 nb = std::min(remainingBits, 8); u32 b = strm.ReadBits(nb); - colorEndpos32Stream.WriteBits(b, nb); + colorEndpointStream.WriteBits(b, nb); remainingBits -= 8; } @@ -1446,34 +1446,34 @@ static void DecompressBlock(std::span inBuf, const u32 blockWidth, } for (u32 i = 0; i < nPartitions; i++) { - colorEndpos32Mode[i] = baseMode; + colorEndpointMode[i] = baseMode; if (!(C[i])) - colorEndpos32Mode[i] -= 1; - colorEndpos32Mode[i] <<= 2; - colorEndpos32Mode[i] |= M[i]; + colorEndpointMode[i] -= 1; + colorEndpointMode[i] <<= 2; + colorEndpointMode[i] |= M[i]; } } else if (nPartitions > 1) { u32 CEM = baseCEM >> 2; for (u32 i = 0; i < nPartitions; i++) { - colorEndpos32Mode[i] = CEM; + colorEndpointMode[i] = CEM; } } // Make sure everything up till here is sane. for (u32 i = 0; i < nPartitions; i++) { - assert(colorEndpos32Mode[i] < 16); + assert(colorEndpointMode[i] < 16); } assert(strm.GetBitsRead() + weightParams.GetPackedBitSize() == 128); // Decode both color data and texel weight data - u32 colorValues[32]; // Four values, two endpos32s, four maximum paritions - DecodeColorValues(colorValues, colorEndpos32Data, colorEndpos32Mode, nPartitions, + u32 colorValues[32]; // Four values, two endpoints, four maximum paritions + DecodeColorValues(colorValues, colorEndpointData, colorEndpointMode, nPartitions, colorDataBits); - Pixel endpos32s[4][2]; + Pixel endpoints[4][2]; const u32* colorValuesPtr = colorValues; 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.. @@ -1512,7 +1512,7 @@ static void DecompressBlock(std::span inBuf, const u32 blockWidth, u32 weights[2][144]; 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... for (u32 j = 0; j < blockHeight; j++) for (u32 i = 0; i < blockWidth; i++) { @@ -1522,9 +1522,9 @@ static void DecompressBlock(std::span inBuf, const u32 blockWidth, Pixel p; for (u32 c = 0; c < 4; c++) { - u32 C0 = endpos32s[partition][0].Component(c); + u32 C0 = endpoints[partition][0].Component(c); C0 = ReplicateByteTo16(C0); - u32 C1 = endpos32s[partition][1].Component(c); + u32 C1 = endpoints[partition][1].Component(c); C1 = ReplicateByteTo16(C1); u32 plane = 0;