From 60e582a185df0c2959734da9103570c45d144d2b Mon Sep 17 00:00:00 2001
From: Li
Date: Wed, 24 Jun 2026 19:24:30 +1200
Subject: [PATCH 1/2] Add CGX Shader Format
---
README.md | 1 +
patterns/CGX.hexpat | 74 ++++++++++++++++++++++++
tests/patterns/test_data/cgx.hexpat.cgx | Bin 0 -> 1412 bytes
3 files changed, 75 insertions(+)
create mode 100644 patterns/CGX.hexpat
create mode 100644 tests/patterns/test_data/cgx.hexpat.cgx
diff --git a/README.md b/README.md
index 8d6bc376..10e18cfc 100644
--- a/README.md
+++ b/README.md
@@ -62,6 +62,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi
| CCHVA | | [`patterns/cchva.hexpat`](patterns/cchva.hexpat) | Command and Conquer Voxel Animation |
| CCVXL | | [`patterns/ccvxl.hexpat`](patterns/ccvxl.hexpat) | Command and Conquer Voxel Model |
| CCPAL | | [`patterns/ccpal.hexpat`](patterns/ccpal.hexpat) | Command and Conquer Voxel Palette |
+| CGX | | [`patterns/CGX.hexpat`](patterns/CGX.hexpat) | PlayStation Mobile Shader |
| CDA | | [`patterns/cda.hexpat`](patterns/cda.hexpat) | Compact Disc Audio track |
| CHD | | [`patterns/chd.hexpat`](patterns/chd.hexpat) | MAME Compressed Hunks of Data file |
| CHM | `application/vnd.ms-htmlhelp` | [`patterns/chm.hexpat`](patterns/chm.hexpat) | Windows HtmlHelp Data (ITSF / CHM) |
diff --git a/patterns/CGX.hexpat b/patterns/CGX.hexpat
new file mode 100644
index 00000000..caf2068a
--- /dev/null
+++ b/patterns/CGX.hexpat
@@ -0,0 +1,74 @@
+import std.io;
+
+enum CGXVariantType : u32 {
+ None = 0,
+ Vertex = 1,
+ Fragment = 2
+};
+
+struct CGXVariant {
+ char language[4];
+ u32 sourcePtr;
+ u32 sourceSz;
+ u32 reserved;
+
+ char shader[sourceSz] @ sourcePtr;
+};
+
+struct CGXUniform {
+ u32 uniformNamePtr;
+ u32 typeNamePtr;
+ u32 unk1;
+ u32 type;
+ u32 unk3;
+ u32 unk4;
+
+ char name[] @ uniformNamePtr;
+ char typeName[] @ typeNamePtr;
+};
+
+struct CGXVariantTableEntry {
+ u32 namePtr;
+ u32 variantListPtr;
+ u32 variantCount;
+ u32 uniformsPtr;
+ u32 uniformsNum;
+ u32 attributesNum;
+ u32 varyingsNum;
+ u32 unk4;
+
+ CGXVariant varients[variantCount] @ variantListPtr;
+ CGXUniform uniforms[uniformsNum] @ uniformsPtr;
+ CGXUniform attributes[attributesNum] @ uniformsPtr + sizeof(uniforms);
+ CGXUniform varyings[varyingsNum] @ uniformsPtr + sizeof(uniforms) + sizeof(attributes);
+ char name[] @ namePtr;
+};
+
+
+struct CgxHeader {
+ char magic[4];
+ char cgVer[4];
+ char glesVer[4];
+ u32 flags;
+ u32 unk0;
+ u32 unk1;
+
+ u32 vertexShaderVariantsPtr;
+ u32 unk2;
+ u32 fragmentShaderVariantsPtr;
+ u32 unk4;
+
+ u32 headerSize;
+ u32 shaderDataPtr;
+ u32 stringTblPtr;
+ u32 stringTblPtr2;
+ u32 totalSize;
+
+ u8 hash[0x14];
+
+ CGXVariantTableEntry vertexVarients @ vertexShaderVariantsPtr;
+ CGXVariantTableEntry fragmentVarients @ fragmentShaderVariantsPtr;
+};
+
+
+CgxHeader header @ 0x00;
\ No newline at end of file
diff --git a/tests/patterns/test_data/cgx.hexpat.cgx b/tests/patterns/test_data/cgx.hexpat.cgx
new file mode 100644
index 0000000000000000000000000000000000000000..e84af7f51248ce6e7bed6716d86b21ee364f2e74
GIT binary patch
literal 1412
zcmb_czi$&U6gCuw9=ehJjV(mU(FXBLL7<36l~NKB1PFvGleib7J3DgjlBUp&jRhfg
z{s9KW023op7X%Cc2MasTXW!4Zr~{TP+wXnf^Lx*q{HW8eU%poNytTodQzRdK-0Jhh
zuKMhu!8>c_D_mcHe|zrJkFCbLgZH<;yc~YJ_4)hQ`T_Jb9{_;W__t$
z;|1ClN7!9wCiw_L%Eb!o1d>Kg-~#A&Uru?%r2x1N{oY{n{$}rP&2^TS0aBcdBbepD
z!?;-R9jQW#-)+J}se;i1&gOk3pW9%ouJZ!7g+MI`<6xzbL#<4N)f=v}?>bl(aUB{(
zia(1Z1~WEn7FY(Yr>dllB&iCFUrYdvG-C1Ook8+G!2kjtgu+Rqxy#3+5&!@AUZYs)|?lw`Zt?cGcD
zm_DY}?-q@i;xsT=t1okCLCJ|d&2%(TY{;it@ni0fCq}dgsM@)R(3)PEJZd%O|5Z$q
tIbLbs|F}YIe>W8MkAoc1=K&8V0V8%PX^xc2BKem<(*J
Date: Sat, 27 Jun 2026 01:32:38 +1200
Subject: [PATCH 2/2] Add description and author
---
patterns/CGX.hexpat | 40 +++++++++++++++++++++++++++++-----------
1 file changed, 29 insertions(+), 11 deletions(-)
diff --git a/patterns/CGX.hexpat b/patterns/CGX.hexpat
index caf2068a..1c3ac915 100644
--- a/patterns/CGX.hexpat
+++ b/patterns/CGX.hexpat
@@ -1,9 +1,27 @@
+#pragma author Li
+#pragma description PlayStation Mobile Shader
+
import std.io;
-enum CGXVariantType : u32 {
- None = 0,
- Vertex = 1,
- Fragment = 2
+enum ShaderUniformType : u32 {
+ None = 0x0,
+ Float = 0x100,
+ Float2 = 0x101,
+ Float3 = 0x102,
+ Float4 = 0x103,
+ Float2x2 = 0x111,
+ Float3x3 = 0x122,
+ Float4x4 = 0x133,
+ Int = 0x400,
+ Int2 = 0x401,
+ Int3 = 0x402,
+ Int4 = 0x403,
+ Bool = 0x300,
+ Bool2 = 0x301,
+ Bool3 = 0x302,
+ Bool4 = 0x303,
+ Sampler2D = 0x8001,
+ SamplerCube = 0x8002
};
struct CGXVariant {
@@ -19,9 +37,9 @@ struct CGXUniform {
u32 uniformNamePtr;
u32 typeNamePtr;
u32 unk1;
- u32 type;
- u32 unk3;
- u32 unk4;
+ ShaderUniformType type;
+ u32 size;
+ u32 flags;
char name[] @ uniformNamePtr;
char typeName[] @ typeNamePtr;
@@ -37,7 +55,7 @@ struct CGXVariantTableEntry {
u32 varyingsNum;
u32 unk4;
- CGXVariant varients[variantCount] @ variantListPtr;
+ CGXVariant variants[variantCount] @ variantListPtr;
CGXUniform uniforms[uniformsNum] @ uniformsPtr;
CGXUniform attributes[attributesNum] @ uniformsPtr + sizeof(uniforms);
CGXUniform varyings[varyingsNum] @ uniformsPtr + sizeof(uniforms) + sizeof(attributes);
@@ -66,9 +84,9 @@ struct CgxHeader {
u8 hash[0x14];
- CGXVariantTableEntry vertexVarients @ vertexShaderVariantsPtr;
- CGXVariantTableEntry fragmentVarients @ fragmentShaderVariantsPtr;
+ CGXVariantTableEntry vertexVariants @ vertexShaderVariantsPtr;
+ CGXVariantTableEntry fragmentVariants @ fragmentShaderVariantsPtr;
};
+CgxHeader header @ 0x00;
-CgxHeader header @ 0x00;
\ No newline at end of file