Well, I don't know everything, but here's what I've got so far;
struct p_hundred
{
uint field_0;
uint field_4;
uint field_8;
uint field_C;
uint field_10;
struct texture_set *texture_set;
uint field_18;
uint field_1C;
uint field_20;
uint shademode;
uint lightstate_ambient;
uint field_2C;
void *lightstate_material_pointer;
uint srcblend;
uint destblend;
uint field_3C;
uint alpharef;
uint blend_mode;
uint zsort;
uint field_4C;
uint field_50;
uint field_54;
uint field_58;
uint vertex_alpha;
uint field_60;
};
Almost everything here is more or less irrelevant except blend_mode, which can have the following values:
0 - Average, source color / 2 + destination color / 2.
1 - Additive, source color + destination color.
2 - Subtractive, broken and unused but it should be destination color - source color.
3 - Not sure, but it seems broken and is never used.
4 - No blending (FF8 only)
field_8 and field_C are both bitfields with the following values;
enum effects
{
V_WIREFRAME, // 0x1
V_TEXTURE, // 0x2
V_LINEARFILTER, // 0x4
V_PERSPECTIVE, // 0x8
V_TMAPBLEND, // 0x10
V_WRAP_U, // 0x20
V_WRAP_V, // 0x40
V_UNKNOWN80, // 0x80
V_COLORKEY, // 0x100
V_DITHER, // 0x200
V_ALPHABLEND, // 0x400
V_ALPHATEST, // 0x800
V_ANTIALIAS, // 0x1000
V_CULLFACE, // 0x2000
V_NOCULL, // 0x4000
V_DEPTHTEST, // 0x8000
V_DEPTHMASK, // 0x10000
V_SHADEMODE, // 0x20000
V_SPECULAR, // 0x40000
V_LIGHTSTATE, // 0x80000
V_FOG, // 0x100000
V_TEXADDR, // 0x200000
};
Every bit set in field_C changes one part of the renderstate and the same bit in field_8 picks one of two possible options.
The custom driver only implements V_WIREFRAME, V_TEXTURE, V_LINEARFILTER, V_NOCULL, V_CULLFACE, V_DEPTHTEST, V_DEPTHMASK, V_ALPHABLEND and V_SHADEMODE so just forget about everything else, you wont need it.
The rest of the structure is either runtime data, filled in by querying the driver about the blend mode or just never used.