mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 02:47:02 +02:00
shader: keep scalar payload and terminal conditions on the GPU
This commit is contained in:
@@ -435,7 +435,7 @@ void TestUnbasedFlatCacheHitMaterializes() {
|
||||
"unbased FLAT plan produced unexpected descriptors");
|
||||
}
|
||||
|
||||
void TestWrittenDescriptorPredicateReads(bool memory_condition) {
|
||||
void TestWrittenDescriptorPredicateReads(bool memory_condition, bool loop) {
|
||||
using namespace Libs::Graphics::ShaderRecompiler::IR;
|
||||
Program program;
|
||||
program.stage = Libs::Graphics::ShaderType::Compute;
|
||||
@@ -467,12 +467,26 @@ void TestWrittenDescriptorPredicateReads(bool memory_condition) {
|
||||
Libs::Graphics::ShaderRecompiler::CFG::TerminatorKind::ConditionalBranch;
|
||||
program.blocks[0]->terminator.true_block = program.blocks[1];
|
||||
program.blocks[0]->terminator.false_block = program.blocks[2];
|
||||
|
||||
program.blocks[1]->id = 1;
|
||||
program.blocks[1]->terminator.kind =
|
||||
Libs::Graphics::ShaderRecompiler::CFG::TerminatorKind::Return;
|
||||
program.blocks[2]->id = 2;
|
||||
program.blocks[2]->terminator.kind =
|
||||
Libs::Graphics::ShaderRecompiler::CFG::TerminatorKind::Return;
|
||||
if (loop) {
|
||||
// The predicate reaches the store through a continue block, then loops back.
|
||||
auto &continued = AddValueBlock(program);
|
||||
program.blocks[0]->terminator.true_block = &continued;
|
||||
continued.terminator.kind = Libs::Graphics::ShaderRecompiler::CFG::TerminatorKind::Branch;
|
||||
continued.terminator.true_block = &store_block;
|
||||
continued.AddBranch(&store_block);
|
||||
store_block.terminator.kind = Libs::Graphics::ShaderRecompiler::CFG::TerminatorKind::Branch;
|
||||
store_block.terminator.true_block = █
|
||||
store_block.AddBranch(&block);
|
||||
}
|
||||
block.AddBranch(program.blocks[0]->terminator.true_block);
|
||||
block.AddBranch(program.blocks[2]);
|
||||
program.memory_info.push_back({.kind = ResourceKind::Buffer, .resource = 0});
|
||||
auto &output = store_block.AppendNewInst(ValueOpcode::GetBufferResource,
|
||||
{source.dwords[0], source.dwords[1], source.dwords[2], source.dwords[3]});
|
||||
@@ -677,7 +691,8 @@ int main() {
|
||||
TestExactReciprocalDescriptorArithmetic();
|
||||
TestUnbasedFlatCacheHitMaterializes();
|
||||
for (const bool memory_condition : {false, true})
|
||||
TestWrittenDescriptorPredicateReads(memory_condition);
|
||||
for (const bool loop : {false, true})
|
||||
TestWrittenDescriptorPredicateReads(memory_condition, loop);
|
||||
TestFailedMaterializationRejectsStage();
|
||||
TestFiniteImageRefreshReusesScalarReads();
|
||||
TestMixedSamplerVariantsShareRuntimeDescriptor();
|
||||
|
||||
Reference in New Issue
Block a user