diff --git a/UnleashedRecomp/gpu/cache/pipeline_state_cache.h b/UnleashedRecomp/gpu/cache/pipeline_state_cache.h new file mode 100644 index 00000000..e26e1741 --- /dev/null +++ b/UnleashedRecomp/gpu/cache/pipeline_state_cache.h @@ -0,0 +1,65 @@ +{ reinterpret_cast(0x135289E4F64C6EEA),reinterpret_cast(0x6B812461EA74928D),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0x8,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x135289E4F64C6EEA),reinterpret_cast(0x7C6A695E4296FA3B),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x135289E4F64C6EEA),reinterpret_cast(0xC20BFEE4B086F5EF),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0x8,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x1D29E1386144A506),reinterpret_cast(0x22CDDA5C6346A97),reinterpret_cast(0x5A2395E29F93DA3C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_FAN,{ 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 }, +{ reinterpret_cast(0x36DB3B40FA419EF6),reinterpret_cast(0x3BF885B6A8263F78),reinterpret_cast(0xFFFDDC62D86892F1),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_LIST,{ 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 }, +{ reinterpret_cast(0x36DB3B40FA419EF6),reinterpret_cast(0x3BF885B6A8263F78),reinterpret_cast(0xFFFDDC62D86892F1),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 }, +{ reinterpret_cast(0x681C97662BFE9150),reinterpret_cast(0xDC635C4E7013864E),reinterpret_cast(0x6196BF64CB935CA5),false,true,false,RenderBlend::ONE,RenderBlend::ONE,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 }, +{ reinterpret_cast(0x681E682667303C76),reinterpret_cast(0x38771885AC644B5),reinterpret_cast(0xC64D046063DE2F63),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::ONE,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 }, +{ reinterpret_cast(0x681E682667303C76),reinterpret_cast(0x604349CBF72CCF8C),reinterpret_cast(0xC64D046063DE2F63),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::ONE,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0x132D2F2079D74CB3),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0x198E2B57B47DAF53),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16_FLOAT,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0x3016DA5F348C87A7),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16_FLOAT,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0x3016DA5F348C87A7),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0x3016DA5F348C87A7),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0x4294510C775F4EE8),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0x48BE63A8F5F1C78A),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16_FLOAT,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0x50700665A5F55DFE),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0x605C1E349CC4CAAB),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0x65325B9C7DA3DB04),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0x67064E6EA39B439E),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0x7D9F06B0E048B75D),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0x891B8684FB17752B),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0x9FA5AACB5B14A226),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0xC47F2F91BA2A5D86),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x6DE86503F8AA38E2),reinterpret_cast(0xFB79F59782376846),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x720D6E5EDA78433B),reinterpret_cast(0x96EACBACDE1AAFAA),reinterpret_cast(0xA81F28FA43A9B511),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::ONE,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 }, +{ reinterpret_cast(0x7C34DB46DEEFB0C2),reinterpret_cast(0xDBD8B29544AC9277),reinterpret_cast(0xB22B7B7B968141C6),false,false,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::LESS,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::B8G8R8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x7CC3A0B01523741B),reinterpret_cast(0x315BB80DAE685834),reinterpret_cast(0xB22B7B7B968141C6),false,false,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::LESS,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::B8G8R8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x86FE3502D5EC24AA),reinterpret_cast(0x68FCC0B90EBC457B),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::LESS,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::B8G8R8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x86FE3502D5EC24AA),reinterpret_cast(0x94A71CC9B94E3101),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16_FLOAT,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x88F67387B88F932F),reinterpret_cast(0x49101E452DF2FE98),reinterpret_cast(0x84BACD816D86543C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 }, +{ reinterpret_cast(0x8A459F1CE0E957D3),reinterpret_cast(0x5D7ACAE543747185),reinterpret_cast(0x84BACD816D86543C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::ONE,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::D32_FLOAT,1,false,0x10 }, +{ reinterpret_cast(0x8E4BB23465BD909E),reinterpret_cast(0x0),reinterpret_cast(0xFFFDDC62D86892F1),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS_EQUAL,false,RenderBlendOperation::ADD,1,33554,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0x0,RenderPrimitiveTopology::TRIANGLE_LIST,{ 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::UNKNOWN,RenderFormat::D32_FLOAT,1,false,0x0 }, +{ reinterpret_cast(0x8E4BB23465BD909E),reinterpret_cast(0x0),reinterpret_cast(0xFFFDDC62D86892F1),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS_EQUAL,false,RenderBlendOperation::ADD,1,33554,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0x0,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::UNKNOWN,RenderFormat::D32_FLOAT,1,false,0x0 }, +{ reinterpret_cast(0x965929BAA69F0AE),reinterpret_cast(0x66578F29004F8FD0),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x965929BAA69F0AE),reinterpret_cast(0x6B9732B4CD7E7740),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x965929BAA69F0AE),reinterpret_cast(0x6C50210CBDA8A23A),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ONE,RenderCullMode::NONE,RenderComparisonFunction::LESS,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x965929BAA69F0AE),reinterpret_cast(0x6C50210CBDA8A23A),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::B8G8R8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x965929BAA69F0AE),reinterpret_cast(0x6C50210CBDA8A23A),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16_FLOAT,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x965929BAA69F0AE),reinterpret_cast(0x6C50210CBDA8A23A),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x965929BAA69F0AE),reinterpret_cast(0x6C50210CBDA8A23A),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x965929BAA69F0AE),reinterpret_cast(0x6C50210CBDA8A23A),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::LESS,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x965929BAA69F0AE),reinterpret_cast(0x92940FDD115733E1),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x965929BAA69F0AE),reinterpret_cast(0xA305C47ED9FB58CF),reinterpret_cast(0xD452411D3FB80A0D),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::ALWAYS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0x0,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::UNKNOWN,RenderFormat::D32_FLOAT,1,false,0x0 }, +{ reinterpret_cast(0x965929BAA69F0AE),reinterpret_cast(0xD44C189D5067922E),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0x965929BAA69F0AE),reinterpret_cast(0xD736237D80908063),reinterpret_cast(0xD452411D3FB80A0D),false,false,false,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::LESS,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R8G8B8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0xA3CD49F172D99214),reinterpret_cast(0xD5EA32DB758EF0B8),reinterpret_cast(0x7F12180DC3A24B53),true,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 32,24,4,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x14 }, +{ reinterpret_cast(0xA3FD368C62079765),reinterpret_cast(0xE8E3FF65F2356201),reinterpret_cast(0xB22B7B7B968141C6),false,false,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::LESS,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::B8G8R8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0xA3FD368C62079765),reinterpret_cast(0xE8E3FF65F2356201),reinterpret_cast(0xB22B7B7B968141C6),false,false,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::LESS,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::B8G8R8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x0 }, +{ reinterpret_cast(0xA4CF0215A03D9571),reinterpret_cast(0xA3A659F1590CC180),reinterpret_cast(0x5A2395E29F93DA3C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_FAN,{ 32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 }, +{ reinterpret_cast(0xB1086A4947A797DE),reinterpret_cast(0x996F5A774A646D92),reinterpret_cast(0x6FAE71C7134074A4),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::B8G8R8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x4 }, +{ reinterpret_cast(0xB1086A4947A797DE),reinterpret_cast(0x996F5A774A646D92),reinterpret_cast(0x6FAE71C7134074A4),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::B8G8R8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x4 }, +{ reinterpret_cast(0xB1086A4947A797DE),reinterpret_cast(0x996F5A774A646D92),reinterpret_cast(0x6FAE71C7134074A4),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::ONE,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::B8G8R8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x4 }, +{ reinterpret_cast(0xB1EA909C660122A7),reinterpret_cast(0xC96708D6F26CC6D9),reinterpret_cast(0x84BACD816D86543C),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 }, +{ reinterpret_cast(0xB4CAFC034A37C8A8),reinterpret_cast(0x31173204A896098A),reinterpret_cast(0x5A22D93C543DF925),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::B8G8R8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x4 }, +{ reinterpret_cast(0xB4CAFC034A37C8A8),reinterpret_cast(0x31173204A896098A),reinterpret_cast(0x5A22D93C543DF925),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::B8G8R8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x4 }, +{ reinterpret_cast(0xB4CAFC034A37C8A8),reinterpret_cast(0x31173204A896098A),reinterpret_cast(0x5A22D93C543DF925),false,true,false,RenderBlend::SRC_ALPHA,RenderBlend::ONE,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::B8G8R8A8_UNORM,RenderFormat::UNKNOWN,1,false,0x4 }, +{ reinterpret_cast(0xBBD01C46D72EDC37),reinterpret_cast(0x4E1399E5E0E40511),reinterpret_cast(0xE6B3B3D286909AB9),true,true,false,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,true,RenderBlendOperation::ADD,0,0,RenderBlend::SRC_ALPHA,RenderBlend::INV_SRC_ALPHA,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 32,24,4,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x10 }, +{ reinterpret_cast(0xBDA992649419F2DD),reinterpret_cast(0x5A4CFA9D29441E0),reinterpret_cast(0x25B8F9D92644DAE0),true,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,24,4,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x11 }, +{ reinterpret_cast(0xBDA992649419F2DD),reinterpret_cast(0x5A4CFA9D29441E0),reinterpret_cast(0x25B8F9D92644DAE0),true,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,24,4,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 }, +{ reinterpret_cast(0xCF28F33974EC44F6),reinterpret_cast(0xD5EA32DB758EF0B8),reinterpret_cast(0x7F12180DC3A24B53),true,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 32,24,4,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x14 }, +{ reinterpret_cast(0xD6EA5D49CB1F965C),reinterpret_cast(0x2FE1A3913EF3EE8A),reinterpret_cast(0x25B8F9D92644DAE0),true,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,24,4,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 }, +{ reinterpret_cast(0xD6EA5D49CB1F965C),reinterpret_cast(0x53EF4B071D1B59D3),reinterpret_cast(0x25B8F9D92644DAE0),true,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 44,24,4,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x15 }, +{ reinterpret_cast(0xD738D79626374EBE),reinterpret_cast(0xAAE40F54746EB116),reinterpret_cast(0xB7BBCC93738C9DE4),false,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::BACK,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0x0,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::UNKNOWN,RenderFormat::D32_FLOAT,1,false,0x11 }, +{ reinterpret_cast(0xFF5A2C4C81AA6FDF),reinterpret_cast(0xE105CB09EA634E60),reinterpret_cast(0x7F12180DC3A24B53),true,true,true,RenderBlend::ONE,RenderBlend::ZERO,RenderCullMode::NONE,RenderComparisonFunction::GREATER_EQUAL,false,RenderBlendOperation::ADD,0,0,RenderBlend::ONE,RenderBlend::ZERO,RenderBlendOperation::ADD,0xF,RenderPrimitiveTopology::TRIANGLE_STRIP,{ 32,24,4,0,0,0,0,0,0,0,0,0,0,0,0,0 },RenderFormat::R16G16B16A16_FLOAT,RenderFormat::D32_FLOAT,1,false,0x14 }, diff --git a/UnleashedRecomp/gpu/cache/vertex_declaration_cache.h b/UnleashedRecomp/gpu/cache/vertex_declaration_cache.h new file mode 100644 index 00000000..dbf9eabc --- /dev/null +++ b/UnleashedRecomp/gpu/cache/vertex_declaration_cache.h @@ -0,0 +1,14 @@ +g_vertexElements_25B8F9D92644DAE0, +g_vertexElements_5A22D93C543DF925, +g_vertexElements_5A2395E29F93DA3C, +g_vertexElements_6196BF64CB935CA5, +g_vertexElements_6FAE71C7134074A4, +g_vertexElements_7F12180DC3A24B53, +g_vertexElements_84BACD816D86543C, +g_vertexElements_A81F28FA43A9B511, +g_vertexElements_B22B7B7B968141C6, +g_vertexElements_B7BBCC93738C9DE4, +g_vertexElements_C64D046063DE2F63, +g_vertexElements_D452411D3FB80A0D, +g_vertexElements_E6B3B3D286909AB9, +g_vertexElements_FFFDDC62D86892F1, \ No newline at end of file diff --git a/UnleashedRecomp/gpu/cache/vertex_element_cache.h b/UnleashedRecomp/gpu/cache/vertex_element_cache.h new file mode 100644 index 00000000..0d152f08 --- /dev/null +++ b/UnleashedRecomp/gpu/cache/vertex_element_cache.h @@ -0,0 +1,14 @@ +static uint8_t g_vertexElements_25B8F9D92644DAE0[] = {0x0,0x0,0x0,0x0,0x0,0x2A,0x23,0xB9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xC,0x0,0x2A,0x21,0x90,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x10,0x0,0x2A,0x21,0x90,0x0,0x6,0x0,0x0,0x0,0x0,0x0,0x14,0x0,0x2A,0x21,0x90,0x0,0x7,0x0,0x0,0x0,0x0,0x0,0x18,0x0,0x2C,0x23,0x5F,0x0,0x5,0x0,0x0,0x0,0x0,0x0,0x1C,0x0,0x2C,0x23,0x5F,0x0,0x5,0x1,0x0,0x0,0x0,0x0,0x20,0x0,0x1A,0x20,0x86,0x0,0xA,0x0,0x0,0x0,0x0,0x0,0x24,0x0,0x1A,0x22,0x86,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x28,0x0,0x1A,0x20,0x86,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2A,0x23,0xB9,0x0,0x5,0x4,0x0,0x0,0x1,0x0,0xC,0x0,0x2C,0x21,0x59,0x0,0x5,0x5,0x0,0x0,0x1,0x0,0x10,0x0,0x2C,0x21,0x59,0x0,0x5,0x6,0x0,0x0,0x1,0x0,0x14,0x0,0x18,0x28,0x86,0x0,0xA,0x1,0x0,0x0,0x2,0x0,0x0,0x0,0x2C,0x82,0xA1,0x0,0x0,0x1,0x0,0x0,0xFF,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x0,0x0,0x0,0x0,}; +static uint8_t g_vertexElements_5A22D93C543DF925[] = {0x0,0x0,0x0,0x0,0x0,0x2C,0x23,0xA5,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x0,0x18,0x28,0x86,0x0,0xA,0x0,0x0,0x0,0x0,0x0,0xC,0x0,0x2C,0x23,0xA5,0x0,0x5,0x0,0x0,0x0,0xFF,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x0,0x0,0x0,0x0,}; +static uint8_t g_vertexElements_5A2395E29F93DA3C[] = {0x0,0x0,0x0,0x0,0x0,0x2A,0x23,0xB9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xC,0x0,0x2A,0x23,0xB9,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x18,0x0,0x2C,0x23,0xA5,0x0,0x5,0x0,0x0,0x0,0xFF,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x0,0x0,0x0,0x0,}; +static uint8_t g_vertexElements_6196BF64CB935CA5[] = {0x0,0x0,0x0,0x0,0x0,0x2A,0x23,0xB9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xC,0x0,0x2C,0x23,0xA5,0x0,0x5,0x0,0x0,0x0,0x0,0x0,0x14,0x0,0x18,0x28,0x86,0x0,0xA,0x0,0x0,0x0,0xFF,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x0,0x0,0x0,0x0,}; +static uint8_t g_vertexElements_6FAE71C7134074A4[] = {0x0,0x0,0x0,0x0,0x0,0x2C,0x23,0xA5,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x0,0x18,0x28,0x86,0x0,0xA,0x0,0x0,0x0,0xFF,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x0,0x0,0x0,0x0,}; +static uint8_t g_vertexElements_7F12180DC3A24B53[] = {0x0,0x0,0x0,0x0,0x0,0x2A,0x23,0xB9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xC,0x0,0x2A,0x23,0xB9,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x18,0x0,0x2C,0x23,0xA5,0x0,0x5,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2A,0x23,0xB9,0x0,0x5,0x1,0x0,0x0,0x1,0x0,0xC,0x0,0x1A,0x22,0x86,0x0,0x5,0x2,0x0,0x0,0x1,0x0,0x10,0x0,0x2C,0x21,0x59,0x0,0x5,0x3,0x0,0x0,0x1,0x0,0x14,0x0,0x18,0x28,0x86,0x0,0xA,0x1,0x0,0x0,0x2,0x0,0x0,0x0,0x2C,0x82,0xA1,0x0,0x0,0x1,0x0,0x0,0xFF,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x0,0x0,0x0,0x0,}; +static uint8_t g_vertexElements_84BACD816D86543C[] = {0x0,0x0,0x0,0x0,0x0,0x2A,0x23,0xB9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xC,0x0,0x2A,0x23,0xB9,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x18,0x0,0x2A,0x23,0xB9,0x0,0x6,0x0,0x0,0x0,0x0,0x0,0x24,0x0,0x2A,0x23,0xB9,0x0,0x7,0x0,0x0,0x0,0x0,0x0,0x30,0x0,0x2C,0x23,0xA5,0x0,0x5,0x0,0x0,0x0,0x0,0x0,0x38,0x0,0x2C,0x23,0xA5,0x0,0x5,0x1,0x0,0x0,0x0,0x0,0x40,0x0,0x2C,0x23,0xA5,0x0,0x5,0x2,0x0,0x0,0x0,0x0,0x48,0x0,0x2C,0x23,0xA5,0x0,0x5,0x3,0x0,0x0,0x0,0x0,0x50,0x0,0x1A,0x23,0xA6,0x0,0xA,0x0,0x0,0x0,0x0,0x0,0x60,0x0,0x1A,0x23,0x86,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x64,0x0,0x1A,0x20,0x86,0x0,0x1,0x0,0x0,0x0,0xFF,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x0,0x0,0x0,0x0,}; +static uint8_t g_vertexElements_A81F28FA43A9B511[] = {0x0,0x0,0x0,0x0,0x0,0x2A,0x23,0xB9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xC,0x0,0x2A,0x23,0xB9,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x18,0x0,0x2C,0x23,0xA5,0x0,0x5,0x0,0x0,0x0,0x0,0x0,0x20,0x0,0x18,0x28,0x86,0x0,0xA,0x0,0x0,0x0,0xFF,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x0,0x0,0x0,0x0,}; +static uint8_t g_vertexElements_B22B7B7B968141C6[] = {0x0,0x0,0x0,0x0,0x0,0x1A,0x23,0xA6,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10,0x0,0x18,0x28,0x86,0x0,0xA,0x0,0x0,0x0,0x0,0x0,0x14,0x0,0x2C,0x23,0xA5,0x0,0x5,0x0,0x0,0x0,0xFF,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x0,0x0,0x0,0x0,}; +static uint8_t g_vertexElements_B7BBCC93738C9DE4[] = {0x0,0x0,0x0,0x0,0x0,0x2A,0x23,0xB9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xC,0x0,0x1A,0x22,0x86,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x10,0x0,0x1A,0x20,0x86,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x14,0x0,0x2A,0x21,0x90,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x18,0x0,0x2A,0x21,0x90,0x0,0x6,0x0,0x0,0x0,0x0,0x0,0x1C,0x0,0x2A,0x21,0x90,0x0,0x7,0x0,0x0,0x0,0x0,0x0,0x20,0x0,0x2C,0x23,0x5F,0x0,0x5,0x0,0x0,0x0,0x0,0x0,0x24,0x0,0x1A,0x20,0x86,0x0,0xA,0x0,0x0,0x0,0xFF,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x0,0x0,0x0,0x0,}; +static uint8_t g_vertexElements_C64D046063DE2F63[] = {0x0,0x0,0x0,0x0,0x0,0x2A,0x23,0xB9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xC,0x0,0x1A,0x22,0x86,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x10,0x0,0x1A,0x20,0x86,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x14,0x0,0x2A,0x21,0x90,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x18,0x0,0x2A,0x21,0x90,0x0,0x6,0x0,0x0,0x0,0x0,0x0,0x1C,0x0,0x2A,0x21,0x90,0x0,0x7,0x0,0x0,0x0,0x0,0x0,0x20,0x0,0x2C,0x23,0x5F,0x0,0x5,0x0,0x0,0x0,0x0,0x0,0x24,0x0,0x2C,0x23,0x5F,0x0,0x5,0x1,0x0,0x0,0x0,0x0,0x28,0x0,0x1A,0x20,0x86,0x0,0xA,0x0,0x0,0x0,0xFF,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x0,0x0,0x0,0x0,}; +static uint8_t g_vertexElements_D452411D3FB80A0D[] = {0x0,0x0,0x0,0x0,0x0,0x2A,0x23,0xB9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xC,0x0,0x2C,0x23,0xA5,0x0,0x5,0x0,0x0,0x0,0xFF,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x0,0x0,0x0,0x0,}; +static uint8_t g_vertexElements_E6B3B3D286909AB9[] = {0x0,0x0,0x0,0x0,0x0,0x2A,0x23,0xB9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xC,0x0,0x2A,0x23,0xB9,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x18,0x0,0x2C,0x23,0xA5,0x0,0x5,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2A,0x23,0xB9,0x0,0x5,0x1,0x0,0x0,0x1,0x0,0xC,0x0,0x1A,0x22,0x86,0x0,0x5,0x2,0x0,0x0,0x1,0x0,0x10,0x0,0x2C,0x83,0xA4,0x0,0x5,0x3,0x0,0x0,0x1,0x0,0x14,0x0,0x18,0x28,0x86,0x0,0xA,0x1,0x0,0x0,0x2,0x0,0x0,0x0,0x2C,0x82,0xA1,0x0,0x0,0x1,0x0,0x0,0xFF,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x0,0x0,0x0,0x0,}; +static uint8_t g_vertexElements_FFFDDC62D86892F1[] = {0x0,0x0,0x0,0x0,0x0,0x2A,0x23,0xB9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xC,0x0,0x2C,0x23,0xA5,0x0,0x5,0x0,0x0,0x0,0x0,0x0,0x14,0x0,0x2A,0x23,0xB9,0x0,0x3,0x0,0x0,0x0,0xFF,0x0,0x0,0xFF,0xFF,0xFF,0xFF,0x0,0x0,0x0,0xC9,}; \ No newline at end of file diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp index baec44db..f1f9ea5a 100644 --- a/UnleashedRecomp/gpu/video.cpp +++ b/UnleashedRecomp/gpu/video.cpp @@ -11,7 +11,7 @@ #include "imgui_snapshot.h" #include "video.h" -#include +#include #include #include @@ -36,7 +36,7 @@ #include "shader/resolve_msaa_depth_8x.hlsl.dxil.h" #include "shader/resolve_msaa_depth_8x.hlsl.spirv.h" -#ifdef ASYNC_PSO_DEBUG +#if defined(ASYNC_PSO_DEBUG) || defined(PSO_CACHING) #include #endif @@ -248,9 +248,28 @@ static std::string g_pipelineDebugText; static Mutex g_debugMutex; #endif +#ifdef PSO_CACHING +static std::vector g_pipelineStatesToCache; +static Mutex g_pipelineCacheMutex; +#endif + static std::atomic g_compilingDataCount; static std::atomic g_pendingDataCount; +static const PipelineState g_pipelineStateCache[] = +{ +#include "cache/pipeline_state_cache.h" +}; + +static bool g_pendingPipelineStateCache = true; + +#include "cache/vertex_element_cache.h" + +static uint8_t* const g_vertexDeclarationCache[] = +{ +#include "cache/vertex_declaration_cache.h" +}; + static xxHashMap>> g_samplerStates; static Mutex g_vertexDeclarationMutex; @@ -1758,6 +1777,8 @@ static void ProcDrawImGui(const RenderCommand& cmd) } } +static bool g_precompiledPipelineStateCache = false; + static void Present() { DrawImGui(); @@ -1768,6 +1789,18 @@ static void Present() RenderCommand cmd; cmd.type = RenderCommandType::Present; g_renderQueue.enqueue(cmd); + + // All the shaders are available at this point. We can precompile embedded PSOs then. + if (!g_precompiledPipelineStateCache) + { + // This is all the model consumer thread needs to see. + ++g_compilingDataCount; + + if ((++g_pendingDataCount) == 1) + g_pendingDataCount.notify_all(); + + g_precompiledPipelineStateCache = true; + } } static void SetRootDescriptor(const UploadAllocation& allocation, size_t index) @@ -2841,6 +2874,11 @@ static RenderPipeline* CreateGraphicsPipelineInRenderThread(PipelineState pipeli + g_pipelineDebugText; } #endif + +#ifdef PSO_CACHING + std::lock_guard lock(g_pipelineCacheMutex); + g_pipelineStatesToCache.push_back(pipelineState); +#endif } return pipeline.get(); @@ -3321,7 +3359,7 @@ static RenderFormat ConvertDeclType(uint32_t type) } } -static GuestVertexDeclaration* CreateVertexDeclaration(GuestVertexElement* vertexElements) +static GuestVertexDeclaration* CreateVertexDeclarationWithoutAddRef(GuestVertexElement* vertexElements) { size_t vertexElementCount = 0; auto vertexElement = vertexElements; @@ -3335,12 +3373,13 @@ static GuestVertexDeclaration* CreateVertexDeclaration(GuestVertexElement* verte std::lock_guard lock(g_vertexDeclarationMutex); - auto& vertexDeclaration = g_vertexDeclarations[ - XXH3_64bits(vertexElements, vertexElementCount * sizeof(GuestVertexElement))]; + XXH64_hash_t hash = XXH3_64bits(vertexElements, vertexElementCount * sizeof(GuestVertexElement)); + auto& vertexDeclaration = g_vertexDeclarations[hash]; if (vertexDeclaration == nullptr) { vertexDeclaration = g_userHeap.AllocPhysical(ResourceType::VertexDeclaration); + vertexDeclaration->hash = hash; static std::vector inputElements; inputElements.clear(); @@ -3501,6 +3540,13 @@ static GuestVertexDeclaration* CreateVertexDeclaration(GuestVertexElement* verte return vertexDeclaration; } +static GuestVertexDeclaration* CreateVertexDeclaration(GuestVertexElement* vertexElements) +{ + auto vertexDeclaration = CreateVertexDeclarationWithoutAddRef(vertexElements); + vertexDeclaration->AddRef(); + return vertexDeclaration; +} + static void SetVertexDeclaration(GuestDevice* device, GuestVertexDeclaration* vertexDeclaration) { RenderCommand cmd; @@ -3550,16 +3596,16 @@ static GuestShader* CreateShader(const be* function, ResourceType reso if (findResult != nullptr) { - if (findResult->userData == nullptr) + if (findResult->guestShader == nullptr) { shader = g_userHeap.AllocPhysical(resourceType); shader->shaderCacheEntry = findResult; - findResult->userData = shader; + findResult->guestShader = shader; } else { - shader = reinterpret_cast(findResult->userData); + shader = findResult->guestShader; } } @@ -4246,7 +4292,7 @@ static void ScreenShaderInit(be* a1, uint32_t a2, uint32_t a3, GuestVe } if (g_movieVertexDeclaration == nullptr) - g_movieVertexDeclaration = CreateVertexDeclaration(vertexElements); + g_movieVertexDeclaration = CreateVertexDeclarationWithoutAddRef(vertexElements); g_moviePixelShader->AddRef(); g_movieVertexShader->AddRef(); @@ -4498,7 +4544,7 @@ static void EnqueueGraphicsPipelineCompilation(const PipelineState& pipelineStat if (shouldCompile) { - if (databaseDataHolderPair.counter == nullptr) + if (databaseDataHolderPair.counter == nullptr && databaseDataHolderPair.holder.databaseData.get() != nullptr) databaseDataHolderPair.counter = std::make_unique(std::move(databaseDataHolderPair.holder)); PipelineStateQueueItem queueItem; @@ -4567,12 +4613,12 @@ static void CompileMeshPipeline(Hedgehog::Mirage::CMeshData* mesh, MeshLayer lay if (layer == MeshLayer::PunchThrough) { - pipelineState.vertexShader = reinterpret_cast(FindShaderCacheEntry(0xDD4FA7BB53876300)->userData); - pipelineState.pixelShader = reinterpret_cast(FindShaderCacheEntry(0xE2ECA594590DDE8B)->userData); + pipelineState.vertexShader = FindShaderCacheEntry(0xDD4FA7BB53876300)->guestShader; + pipelineState.pixelShader = FindShaderCacheEntry(0xE2ECA594590DDE8B)->guestShader; } else { - pipelineState.vertexShader = reinterpret_cast(FindShaderCacheEntry(0x8E4BB23465BD909E)->userData); + pipelineState.vertexShader = FindShaderCacheEntry(0x8E4BB23465BD909E)->guestShader; } pipelineState.vertexDeclaration = vertexDeclaration; @@ -4597,8 +4643,8 @@ static void CompileMeshPipeline(Hedgehog::Mirage::CMeshData* mesh, MeshLayer lay if (compiledOutsideMainFramebuffer && args.hasMoreThanOneBone && layer == MeshLayer::Opaque) { PipelineState pipelineState{}; - pipelineState.vertexShader = reinterpret_cast(FindShaderCacheEntry(0x4620B236DC38100C)->userData); - pipelineState.pixelShader = reinterpret_cast(FindShaderCacheEntry(0xBBDB735BEACC8F41)->userData); + pipelineState.vertexShader = FindShaderCacheEntry(0x4620B236DC38100C)->guestShader; + pipelineState.pixelShader = FindShaderCacheEntry(0xBBDB735BEACC8F41)->guestShader; pipelineState.vertexDeclaration = vertexDeclaration; pipelineState.cullMode = RenderCullMode::NONE; pipelineState.zFunc = RenderComparisonFunction::GREATER_EQUAL; @@ -4613,7 +4659,7 @@ static void CompileMeshPipeline(Hedgehog::Mirage::CMeshData* mesh, MeshLayer lay if (args.velocityMapQuickStep) { - pipelineState.vertexShader = reinterpret_cast(FindShaderCacheEntry(0x99DC3F27E402700D)->userData); + pipelineState.vertexShader = FindShaderCacheEntry(0x99DC3F27E402700D)->guestShader; SanitizePipelineState(pipelineState); EnqueueGraphicsPipelineCompilation(pipelineState, args.holderPair, "FxVelocityMapQuickStep"); } @@ -4652,7 +4698,7 @@ static void CompileMeshPipeline(Hedgehog::Mirage::CMeshData* mesh, MeshLayer lay vertexElements[vertexDeclaration->vertexElementCount] = { 2, 0, 0x2C83A4, 0, 0, 2 }; vertexElements[vertexDeclaration->vertexElementCount + 1] = D3DDECL_END(); - vertexDeclaration = CreateVertexDeclaration(vertexElements); + vertexDeclaration = CreateVertexDeclarationWithoutAddRef(vertexElements); } for (auto& [pixelShaderSubPermutations, pixelShader] : defaultFindResult->second.m_PixelShaders) @@ -4746,7 +4792,7 @@ static void CompileMeshPipeline(Hedgehog::Mirage::CMeshData* mesh, MeshLayer lay { // Sonic's mouth switches between "SonicSkin_dspf[b]" or "SonicSkinNodeInvX_dspf[b]" depending on the view angle. auto mouthPipelineState = pipelineState; - mouthPipelineState.vertexShader = reinterpret_cast(FindShaderCacheEntry(0x689AA3140AB9EBAA)->userData); + mouthPipelineState.vertexShader = FindShaderCacheEntry(0x689AA3140AB9EBAA)->guestShader; createGraphicsPipeline(mouthPipelineState); if (planarReflectionEnabled) @@ -4758,10 +4804,6 @@ static void CompileMeshPipeline(Hedgehog::Mirage::CMeshData* mesh, MeshLayer lay } } } - - // We created a vertex declaration beforehand that we need to release. - if (isFur) - vertexDeclaration->Release(); } template @@ -4838,8 +4880,8 @@ static void CompileParticleMaterialPipeline(const Hedgehog::Sparkle::CParticleMa 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 }; - auto unoptimizedVertexDeclaration = CreateVertexDeclaration(reinterpret_cast(unoptimizedVertexElements)); - auto sparkleVertexDeclaration = CreateVertexDeclaration(reinterpret_cast(g_memory.Translate(0x8211F540))); + auto unoptimizedVertexDeclaration = CreateVertexDeclarationWithoutAddRef(reinterpret_cast(unoptimizedVertexElements)); + auto sparkleVertexDeclaration = CreateVertexDeclarationWithoutAddRef(reinterpret_cast(g_memory.Translate(0x8211F540))); bool isMeshShader = strstr(shaderList->m_TypeAndName.c_str(), "Mesh") != nullptr; @@ -4919,9 +4961,6 @@ static void CompileParticleMaterialPipeline(const Hedgehog::Sparkle::CParticleMa } } } - - unoptimizedVertexDeclaration->Release(); - sparkleVertexDeclaration->Release(); } // SWA::CGameModeStage::ExitLoading @@ -5007,8 +5046,8 @@ void GetDatabaseDataMidAsmHook(PPCRegister& r1, PPCRegister& r4) g_pendingDataQueue.push_back(databaseData); } - ++g_pendingDataCount; - g_pendingDataCount.notify_all(); + if ((++g_pendingDataCount) == 1) + g_pendingDataCount.notify_all(); } } @@ -5111,6 +5150,59 @@ static void ModelConsumerThread() ctx.ensureValid(); + if (g_pendingPipelineStateCache) + { + DatabaseDataHolderPair emptyHolderPair; + + for (auto vertexElements : g_vertexDeclarationCache) + CreateVertexDeclarationWithoutAddRef(reinterpret_cast(vertexElements)); + + for (auto pipelineState : g_pipelineStateCache) + { + // The hashes were reinterpret casted to pointers in the cache. + pipelineState.vertexShader = FindShaderCacheEntry(reinterpret_cast(pipelineState.vertexShader))->guestShader; + + if (pipelineState.pixelShader != nullptr) + pipelineState.pixelShader = FindShaderCacheEntry(reinterpret_cast(pipelineState.pixelShader))->guestShader; + + { + std::lock_guard lock(g_vertexDeclarationMutex); + pipelineState.vertexDeclaration = g_vertexDeclarations[reinterpret_cast(pipelineState.vertexDeclaration)]; + } + + if (Config::GITextureFiltering == EGITextureFiltering::Bicubic) + pipelineState.specConstants |= SPEC_CONSTANT_BICUBIC_GI_FILTER; + + // Compile both MSAA and non MSAA variants to work with reflection maps. The render formats are an assumption but it should hold true. + if (Config::MSAA > 1 && + pipelineState.renderTargetFormat == RenderFormat::R16G16B16A16_FLOAT && + pipelineState.depthStencilFormat == RenderFormat::D32_FLOAT) + { + auto msaaPipelineState = pipelineState; + msaaPipelineState.sampleCount = Config::MSAA; + + if (Config::AlphaToCoverage && (msaaPipelineState.specConstants & SPEC_CONSTANT_ALPHA_TEST) != 0) + { + msaaPipelineState.enableAlphaToCoverage = true; + msaaPipelineState.specConstants &= ~SPEC_CONSTANT_ALPHA_TEST; + msaaPipelineState.specConstants |= SPEC_CONSTANT_ALPHA_TO_COVERAGE; + } + + SanitizePipelineState(msaaPipelineState); + EnqueueGraphicsPipelineCompilation(msaaPipelineState, emptyHolderPair, "Precompiled Pipeline MSAA"); + } + + SanitizePipelineState(pipelineState); + EnqueueGraphicsPipelineCompilation(pipelineState, emptyHolderPair, "Precompiled Pipeline"); + } + + g_pendingPipelineStateCache = false; + --g_pendingDataCount; + + if ((--g_compilingDataCount) == 0) + g_compilingDataCount.notify_all(); + } + { std::lock_guard lock(g_pendingModelMutex); localPendingDataQueue.insert(localPendingDataQueue.end(), g_pendingDataQueue.begin(), g_pendingDataQueue.end()); @@ -5208,6 +5300,137 @@ PPC_FUNC(sub_82E328D8) #endif +#ifdef PSO_CACHING +class SDLEventListenerForPSOCaching : public SDLEventListener +{ +public: + void OnSDLEvent(SDL_Event* event) override + { + if (event->type != SDL_QUIT) + return; + + std::lock_guard lock(g_pipelineCacheMutex); + if (g_pipelineStatesToCache.empty()) + return; + + FILE* f = fopen("send_this_file_to_skyth.txt", "ab"); + if (f != nullptr) + { + ankerl::unordered_dense::set vertexDeclarations; + xxHashMap pipelineStatesToCache; + + for (auto& pipelineState : g_pipelineStatesToCache) + { + if (pipelineState.vertexShader->shaderCacheEntry == nullptr || + (pipelineState.pixelShader != nullptr && pipelineState.pixelShader->shaderCacheEntry == nullptr)) + { + continue; + } + + vertexDeclarations.emplace(pipelineState.vertexDeclaration); + + // Mask out the config options. + pipelineState.sampleCount = 1; + pipelineState.enableAlphaToCoverage = false; + + pipelineState.specConstants &= ~SPEC_CONSTANT_BICUBIC_GI_FILTER; + if ((pipelineState.specConstants & SPEC_CONSTANT_ALPHA_TO_COVERAGE) != 0) + { + pipelineState.specConstants &= ~SPEC_CONSTANT_ALPHA_TO_COVERAGE; + pipelineState.specConstants |= SPEC_CONSTANT_ALPHA_TEST; + } + + pipelineStatesToCache.emplace(XXH3_64bits(&pipelineState, sizeof(pipelineState)), pipelineState); + } + + for (auto vertexDeclaration : vertexDeclarations) + { + std::print(f, "static uint8_t g_vertexElements_{:016X}[] = {{", vertexDeclaration->hash); + + auto bytes = reinterpret_cast(vertexDeclaration->vertexElements.get()); + for (size_t i = 0; i < vertexDeclaration->vertexElementCount * sizeof(GuestVertexElement); i++) + std::print(f, "0x{:X},", bytes[i]); + + std::println(f, "}};"); + } + + for (auto& [pipelineHash, pipelineState] : pipelineStatesToCache) + { + std::println(f, "{{ " + "reinterpret_cast(0x{:X})," + "reinterpret_cast(0x{:X})," + "reinterpret_cast(0x{:X})," + "{}," + "{}," + "{}," + "RenderBlend::{}," + "RenderBlend::{}," + "RenderCullMode::{}," + "RenderComparisonFunction::{}," + "{}," + "RenderBlendOperation::{}," + "{}," + "{}," + "RenderBlend::{}," + "RenderBlend::{}," + "RenderBlendOperation::{}," + "0x{:X}," + "RenderPrimitiveTopology::{}," + "{{ {},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{} }}," + "RenderFormat::{}," + "RenderFormat::{}," + "{}," + "{}," + "0x{:X} }},", + pipelineState.vertexShader->shaderCacheEntry->hash, + pipelineState.pixelShader != nullptr ? pipelineState.pixelShader->shaderCacheEntry->hash : 0, + pipelineState.vertexDeclaration->hash, + pipelineState.instancing, + pipelineState.zEnable, + pipelineState.zWriteEnable, + magic_enum::enum_name(pipelineState.srcBlend), + magic_enum::enum_name(pipelineState.destBlend), + magic_enum::enum_name(pipelineState.cullMode), + magic_enum::enum_name(pipelineState.zFunc), + pipelineState.alphaBlendEnable, + magic_enum::enum_name(pipelineState.blendOp), + pipelineState.slopeScaledDepthBias, + pipelineState.depthBias, + magic_enum::enum_name(pipelineState.srcBlendAlpha), + magic_enum::enum_name(pipelineState.destBlendAlpha), + magic_enum::enum_name(pipelineState.blendOpAlpha), + pipelineState.colorWriteEnable, + magic_enum::enum_name(pipelineState.primitiveTopology), + pipelineState.vertexStrides[0], + pipelineState.vertexStrides[1], + pipelineState.vertexStrides[2], + pipelineState.vertexStrides[3], + pipelineState.vertexStrides[4], + pipelineState.vertexStrides[5], + pipelineState.vertexStrides[6], + pipelineState.vertexStrides[7], + pipelineState.vertexStrides[8], + pipelineState.vertexStrides[9], + pipelineState.vertexStrides[10], + pipelineState.vertexStrides[11], + pipelineState.vertexStrides[12], + pipelineState.vertexStrides[13], + pipelineState.vertexStrides[14], + pipelineState.vertexStrides[15], + magic_enum::enum_name(pipelineState.renderTargetFormat), + magic_enum::enum_name(pipelineState.depthStencilFormat), + pipelineState.sampleCount, + pipelineState.enableAlphaToCoverage, + pipelineState.specConstants); + } + + fclose(f); + } + } +}; +SDLEventListenerForPSOCaching g_sdlEventListenerForPSOCaching; +#endif + GUEST_FUNCTION_HOOK(sub_82BD99B0, CreateDevice); GUEST_FUNCTION_HOOK(sub_82BE6230, DestructResource); diff --git a/UnleashedRecomp/gpu/video.h b/UnleashedRecomp/gpu/video.h index bd8b102b..90b14411 100644 --- a/UnleashedRecomp/gpu/video.h +++ b/UnleashedRecomp/gpu/video.h @@ -1,6 +1,7 @@ #pragma once //#define ASYNC_PSO_DEBUG +#define PSO_CACHING #include "rhi/rt64_render_interface.h" @@ -245,6 +246,7 @@ struct GuestVertexElement struct GuestVertexDeclaration : GuestResource { + XXH64_hash_t hash = 0; std::unique_ptr inputElements; std::unique_ptr vertexElements; uint32_t inputElementCount = 0; diff --git a/UnleashedRecomp/stdafx.h b/UnleashedRecomp/stdafx.h index 711a83ae..8fd5bb22 100644 --- a/UnleashedRecomp/stdafx.h +++ b/UnleashedRecomp/stdafx.h @@ -31,6 +31,7 @@ #include #include #include +#include using Microsoft::WRL::ComPtr; diff --git a/UnleashedRecomp/ui/window.cpp b/UnleashedRecomp/ui/window.cpp index 2df75973..304b93ee 100644 --- a/UnleashedRecomp/ui/window.cpp +++ b/UnleashedRecomp/ui/window.cpp @@ -10,6 +10,9 @@ int Window_OnSDLEvent(void*, SDL_Event* event) if (ImGui::GetIO().BackendPlatformUserData != nullptr) ImGui_ImplSDL2_ProcessEvent(event); + for (auto listener : Window::s_eventListeners) + listener->OnSDLEvent(event); + switch (event->type) { case SDL_QUIT: @@ -114,9 +117,6 @@ int Window_OnSDLEvent(void*, SDL_Event* event) } } - for (auto listener : Window::s_eventListeners) - listener->OnSDLEvent(event); - return 0; } diff --git a/UnleashedRecompLib/shader/shader_cache.h b/UnleashedRecompLib/shader/shader_cache.h index fabf80ee..43439403 100644 --- a/UnleashedRecompLib/shader/shader_cache.h +++ b/UnleashedRecompLib/shader/shader_cache.h @@ -8,7 +8,7 @@ struct ShaderCacheEntry const uint32_t spirvOffset; const uint32_t spirvSize; const uint32_t specConstantsMask; - void* userData; + struct GuestShader* guestShader; }; extern ShaderCacheEntry g_shaderCacheEntries[];