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