Skip to content

Commit

Permalink
Merge pull request #85863 from BlueCube3310/squish-rgtc-r-error
Browse files Browse the repository at this point in the history
Fix squish RGTC_R decompression corruption
  • Loading branch information
YuriSizov committed Dec 8, 2023
2 parents 26ba706 + 433a2a6 commit 13f6c68
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 4 deletions.
17 changes: 14 additions & 3 deletions thirdparty/squish/colourblock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@
-------------------------------------------------------------------------- */

#include "colourblock.h"
// -- Godot start --
// -- GODOT start --
#include "alpha.h"
// -- Godot end --
// -- GODOT end --

namespace squish {

Expand Down Expand Up @@ -214,7 +214,18 @@ void DecompressColour( u8* rgba, void const* block, bool isDxt1 )
}
}

// -- Godot start --
// -- GODOT start --
void DecompressColourBc4( u8* rgba, void const* block)
{
DecompressAlphaDxt5(rgba,block);
for ( int i = 0; i < 16; ++i ) {
rgba[i*4] = rgba[i*4 + 3];
rgba[i*4 + 1] = 0;
rgba[i*4 + 2] = 0;
rgba[i*4 + 3] = 255;
}
}

void DecompressColourBc5( u8* rgba, void const* block)
{
void const* rblock = block;
Expand Down
1 change: 1 addition & 0 deletions thirdparty/squish/colourblock.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ void WriteColourBlock4( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void*

void DecompressColour( u8* rgba, void const* block, bool isDxt1 );
// -- GODOT start --
void DecompressColourBc4( u8* rgba, void const* block );
void DecompressColourBc5( u8* rgba, void const* block );
// -- GODOT end --

Expand Down
109 changes: 109 additions & 0 deletions thirdparty/squish/godot-changes.patch
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,112 @@ index 1d22a64ad..fd11a147d 100644

// decompress alpha separately if necessary
if( ( flags & kDxt3 ) != 0 )

diff --git a/thirdparty/squish/colourblock.cpp b/thirdparty/squish/colourblock.cpp
index 49401358bc..f14c9362bd 100644
--- a/thirdparty/squish/colourblock.cpp
+++ b/thirdparty/squish/colourblock.cpp
@@ -24,9 +24,9 @@
-------------------------------------------------------------------------- */

#include "colourblock.h"
-// -- Godot start --
+// -- GODOT start --
#include "alpha.h"
-// -- Godot end --
+// -- GODOT end --

namespace squish {

diff --git a/thirdparty/squish/godot-changes.patch b/thirdparty/squish/godot-changes.patch
index ef7bafb4b4..655a8cffc2 100644
--- a/thirdparty/squish/godot-changes.patch
+++ b/thirdparty/squish/godot-changes.patch
@@ -1,22 +1,33 @@
diff --git a/thirdparty/squish/colourblock.cpp b/thirdparty/squish/colourblock.cpp
-index af8b98036..3d87adaa7 100644
+index af8b980365..f14c9362bd 100644
--- a/thirdparty/squish/colourblock.cpp
+++ b/thirdparty/squish/colourblock.cpp
@@ -24,6 +24,9 @@
-------------------------------------------------------------------------- */

#include "colourblock.h"
-+// -- Godot start --
++// -- GODOT start --
+#include "alpha.h"
-+// -- Godot end --
++// -- GODOT end --

namespace squish {

-@@ -211,4 +214,23 @@ void DecompressColour( u8* rgba, void const* block, bool isDxt1 )
+@@ -211,4 +214,34 @@ void DecompressColour( u8* rgba, void const* block, bool isDxt1 )
}
}

-+// -- Godot start --
++// -- GODOT start --
++void DecompressColourBc4( u8* rgba, void const* block)
++{
++ DecompressAlphaDxt5(rgba,block);
++ for ( int i = 0; i < 16; ++i ) {
++ rgba[i*4] = rgba[i*4 + 3];
++ rgba[i*4 + 1] = 0;
++ rgba[i*4 + 2] = 0;
++ rgba[i*4 + 3] = 255;
++ }
++}
++
+void DecompressColourBc5( u8* rgba, void const* block)
+{
+ void const* rblock = block;
@@ -37,21 +48,22 @@ index af8b98036..3d87adaa7 100644
+
} // namespace squish
diff --git a/thirdparty/squish/colourblock.h b/thirdparty/squish/colourblock.h
-index fee2cd7c5..3cb9b7e3b 100644
+index fee2cd7c5d..e1eb9e4917 100644
--- a/thirdparty/squish/colourblock.h
+++ b/thirdparty/squish/colourblock.h
-@@ -35,6 +35,9 @@ void WriteColourBlock3( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void*
+@@ -35,6 +35,10 @@ void WriteColourBlock3( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void*
void WriteColourBlock4( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void* block );

void DecompressColour( u8* rgba, void const* block, bool isDxt1 );
+// -- GODOT start --
++void DecompressColourBc4( u8* rgba, void const* block );
+void DecompressColourBc5( u8* rgba, void const* block );
+// -- GODOT end --

} // namespace squish

diff --git a/thirdparty/squish/config.h b/thirdparty/squish/config.h
-index 92edefe96..05f8d7259 100644
+index 92edefe966..05f8d72598 100644
--- a/thirdparty/squish/config.h
+++ b/thirdparty/squish/config.h
@@ -32,6 +32,26 @@
@@ -82,17 +94,19 @@ index 92edefe96..05f8d7259 100644
#define SQUISH_USE_SSE 0
#endif
diff --git a/thirdparty/squish/squish.cpp b/thirdparty/squish/squish.cpp
-index 1d22a64ad..fd11a147d 100644
+index 1d22a64ad6..086ba11cd0 100644
--- a/thirdparty/squish/squish.cpp
+++ b/thirdparty/squish/squish.cpp
-@@ -135,7 +135,13 @@ void Decompress( u8* rgba, void const* block, int flags )
+@@ -135,7 +135,15 @@ void Decompress( u8* rgba, void const* block, int flags )
colourBlock = reinterpret_cast< u8 const* >( block ) + 8;

// decompress colour
- DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
+ // -- GODOT start --
+ //DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
-+ if(( flags & ( kBc5 ) ) != 0)
++ if(( flags & ( kBc4 ) ) != 0)
++ DecompressColourBc4( rgba, colourBlock);
++ else if(( flags & ( kBc5 ) ) != 0)
+ DecompressColourBc5( rgba, colourBlock);
+ else
+ DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
4 changes: 3 additions & 1 deletion thirdparty/squish/squish.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,9 @@ void Decompress( u8* rgba, void const* block, int flags )
// decompress colour
// -- GODOT start --
//DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
if(( flags & ( kBc5 ) ) != 0)
if(( flags & ( kBc4 ) ) != 0)
DecompressColourBc4( rgba, colourBlock);
else if(( flags & ( kBc5 ) ) != 0)
DecompressColourBc5( rgba, colourBlock);
else
DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
Expand Down

0 comments on commit 13f6c68

Please sign in to comment.