Browse Source

glasm: Implement local memory for glasm

pull/15/merge
ameerj 5 years ago
parent
commit
057dee4856
  1. 3
      src/shader_recompiler/backend/glasm/emit_glasm.cpp
  2. 8
      src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp
  3. 2
      src/shader_recompiler/backend/glasm/emit_glasm_instructions.h
  4. 8
      src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp

3
src/shader_recompiler/backend/glasm/emit_glasm.cpp

@ -306,6 +306,9 @@ std::string EmitGLASM(const Profile&, IR::Program& program, Bindings&) {
for (size_t index = 0; index < ctx.reg_alloc.NumUsedRegisters(); ++index) {
header += fmt::format("R{},", index);
}
if (program.local_memory_size > 0) {
header += fmt::format("lmem[{}],", program.local_memory_size);
}
header += "RC;"
"LONG TEMP ";
for (size_t index = 0; index < ctx.reg_alloc.NumUsedLongRegisters(); ++index) {

8
src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp

@ -113,4 +113,12 @@ void EmitSetFragDepth([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] Scalar
throw NotImplementedException("GLASM instruction");
}
void EmitLoadLocal(EmitContext& ctx, IR::Inst& inst, ScalarU32 word_offset) {
ctx.Add("MOV.U {},lmem[{}].x;", inst, word_offset);
}
void EmitWriteLocal(EmitContext& ctx, ScalarU32 word_offset, ScalarU32 value) {
ctx.Add("MOV.U lmem[{}].x,{};", word_offset, value);
}
} // namespace Shader::Backend::GLASM

2
src/shader_recompiler/backend/glasm/emit_glasm_instructions.h

@ -71,7 +71,7 @@ void EmitInvocationId(EmitContext& ctx);
void EmitSampleId(EmitContext& ctx);
void EmitIsHelperInvocation(EmitContext& ctx);
void EmitYDirection(EmitContext& ctx);
void EmitLoadLocal(EmitContext& ctx, ScalarU32 word_offset);
void EmitLoadLocal(EmitContext& ctx, IR::Inst& inst, ScalarU32 word_offset);
void EmitWriteLocal(EmitContext& ctx, ScalarU32 word_offset, ScalarU32 value);
void EmitUndefU1(EmitContext& ctx);
void EmitUndefU8(EmitContext& ctx);

8
src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp

@ -168,14 +168,6 @@ void EmitYDirection(EmitContext& ctx) {
NotImplemented();
}
void EmitLoadLocal(EmitContext& ctx, ScalarU32 word_offset) {
NotImplemented();
}
void EmitWriteLocal(EmitContext& ctx, ScalarU32 word_offset, ScalarU32 value) {
NotImplemented();
}
void EmitUndefU1(EmitContext& ctx) {
NotImplemented();
}

Loading…
Cancel
Save