FPPS4/spirv/emit_sopp.pas

80 lines
1.6 KiB
Plaintext

unit emit_SOPP;
{$mode objfpc}{$H+}
interface
uses
sysutils,
ps4_pssl,
srType,
srConst,
srOp,
srOpUtils,
spirv,
emit_fetch;
type
TEmit_SOPP=class(TEmitFetch)
procedure emit_SOPP;
procedure emit_S_BARRIER;
end;
implementation
procedure TEmit_SOPP.emit_S_BARRIER;
Var
node:TspirvOp;
execution,memory,memory_semantics:TsrConst;
begin
//upgrade version to 1.3
Config.UpgradeVersion($10300);
node:=AddSpirvOp(line,Op.OpControlBarrier); //need first
execution :=ConstList.Fetch(dtUint32,Scope.Workgroup);
memory :=ConstList.Fetch(dtUint32,Scope.Workgroup);
memory_semantics:=ConstList.Fetch(dtUint32,MemorySemantics.AcquireRelease or MemorySemantics.WorkgroupMemory);
node.AddParam(execution);
node.AddParam(memory);
node.AddParam(memory_semantics);
end;
procedure TEmit_SOPP.emit_SOPP;
begin
Case FSPI.SOPP.OP of
S_NOP,
S_WAITCNT:;
S_TTRACEDATA:; //write_thread_trace_data(M0[31:0])
S_ENDPGM:
begin
if not is_term_op(line) then
begin
AddSpirvOp(Op.OpReturn);
end;
//mark hints
mark_end_of(vmEndpg);
end;
S_CBRANCH_SCC0 :; //It means that (scc == 0)
S_CBRANCH_SCC1 :; //It means that (scc == 1)
S_CBRANCH_VCCZ :; //It means that (vcc0 == 0) && (vcc1 == 0)
S_CBRANCH_VCCNZ :; //It means that (vcc0 != 0) || (vcc1 != 0)
S_CBRANCH_EXECZ :; //It means that (exec0 == 0) && (exec1 == 0)
S_CBRANCH_EXECNZ:; //It means that (exec0 != 0) || (exec1 != 0)
S_BRANCH :;
S_BARRIER :emit_S_BARRIER;
else
Assert(false,'SOPP?'+IntToStr(FSPI.SOPP.OP)+' '+get_str_spi(FSPI));
end;
end;
end.