committed by
ameerj
10 changed files with 1175 additions and 842 deletions
-
21src/shader_recompiler/backend/glasm/emit_context.cpp
-
5src/shader_recompiler/backend/glasm/emit_context.h
-
66src/shader_recompiler/backend/glasm/emit_glasm.cpp
-
125src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp
-
421src/shader_recompiler/backend/glasm/emit_glasm_floating_point.cpp
-
177src/shader_recompiler/backend/glasm/emit_glasm_instructions.h
-
228src/shader_recompiler/backend/glasm/emit_glasm_integer.cpp
-
178src/shader_recompiler/backend/glasm/emit_glasm_memory.cpp
-
790src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp
-
6src/shader_recompiler/frontend/ir/value.h
@ -0,0 +1,125 @@ |
|||
// Copyright 2021 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include <string_view>
|
|||
|
|||
#include "shader_recompiler/backend/glasm/emit_context.h"
|
|||
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
|
|||
#include "shader_recompiler/frontend/ir/value.h"
|
|||
|
|||
namespace Shader::Backend::GLASM { |
|||
namespace { |
|||
void GetCbuf(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, const IR::Value& offset, |
|||
std::string_view size) { |
|||
if (!binding.IsImmediate()) { |
|||
throw NotImplementedException("Indirect constant buffer loading"); |
|||
} |
|||
const std::string ret{ctx.reg_alloc.Define(inst)}; |
|||
ctx.Add("LDC.{} {},c{}[{}];", size, ret, binding.U32(), ctx.reg_alloc.Consume(offset)); |
|||
} |
|||
} // Anonymous namespace
|
|||
|
|||
void EmitGetCbufU8(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|||
const IR::Value& offset) { |
|||
GetCbuf(ctx, inst, binding, offset, "U8"); |
|||
} |
|||
|
|||
void EmitGetCbufS8(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|||
const IR::Value& offset) { |
|||
GetCbuf(ctx, inst, binding, offset, "S8"); |
|||
} |
|||
|
|||
void EmitGetCbufU16(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|||
const IR::Value& offset) { |
|||
GetCbuf(ctx, inst, binding, offset, "U16"); |
|||
} |
|||
|
|||
void EmitGetCbufS16(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|||
const IR::Value& offset) { |
|||
GetCbuf(ctx, inst, binding, offset, "S16"); |
|||
} |
|||
|
|||
void EmitGetCbufU32(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|||
const IR::Value& offset) { |
|||
GetCbuf(ctx, inst, binding, offset, "U32"); |
|||
} |
|||
|
|||
void EmitGetCbufF32(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|||
const IR::Value& offset) { |
|||
GetCbuf(ctx, inst, binding, offset, "F32"); |
|||
} |
|||
|
|||
void EmitGetCbufU32x2(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|||
const IR::Value& offset) { |
|||
GetCbuf(ctx, inst, binding, offset, "U32X2"); |
|||
} |
|||
|
|||
void EmitGetAttribute(EmitContext& ctx, IR::Inst& inst, IR::Attribute attr, |
|||
[[maybe_unused]] std::string_view vertex) { |
|||
if (IR::IsGeneric(attr)) { |
|||
const u32 index{IR::GenericAttributeIndex(attr)}; |
|||
const u32 element{IR::GenericAttributeElement(attr)}; |
|||
ctx.Add("MOV.F {},in_attr{}.{};", inst, index, "xyzw"[element]); |
|||
return; |
|||
} |
|||
throw NotImplementedException("Get attribute {}", attr); |
|||
} |
|||
|
|||
void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, std::string_view value, |
|||
[[maybe_unused]] std::string_view vertex) { |
|||
const u32 element{static_cast<u32>(attr) % 4}; |
|||
const char swizzle{"xyzw"[element]}; |
|||
if (IR::IsGeneric(attr)) { |
|||
const u32 index{IR::GenericAttributeIndex(attr)}; |
|||
ctx.Add("MOV.F out_attr{}.{},{};", index, swizzle, value); |
|||
return; |
|||
} |
|||
switch (attr) { |
|||
case IR::Attribute::PositionX: |
|||
case IR::Attribute::PositionY: |
|||
case IR::Attribute::PositionZ: |
|||
case IR::Attribute::PositionW: |
|||
ctx.Add("MOV.F result.position.{},{};", swizzle, value); |
|||
break; |
|||
default: |
|||
throw NotImplementedException("Set attribute {}", attr); |
|||
} |
|||
} |
|||
|
|||
void EmitGetAttributeIndexed([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view offset, |
|||
[[maybe_unused]] std::string_view vertex) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitSetAttributeIndexed([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view offset, |
|||
[[maybe_unused]] std::string_view value, |
|||
[[maybe_unused]] std::string_view vertex) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitGetPatch([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Patch patch) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitSetPatch([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Patch patch, |
|||
[[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitSetFragColor([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] u32 index, |
|||
[[maybe_unused]] u32 component, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitSetSampleMask([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitSetFragDepth([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
} // namespace Shader::Backend::GLASM
|
|||
@ -0,0 +1,421 @@ |
|||
// Copyright 2021 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include <string_view>
|
|||
|
|||
#include "shader_recompiler/backend/glasm/emit_context.h"
|
|||
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
|
|||
#include "shader_recompiler/frontend/ir/value.h"
|
|||
|
|||
namespace Shader::Backend::GLASM { |
|||
|
|||
void EmitFPAbs16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPAbs32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { |
|||
ctx.Add("MOV.F {},|{}|;", inst, value); |
|||
} |
|||
|
|||
void EmitFPAbs64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPAdd16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
|||
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPAdd32(EmitContext& ctx, IR::Inst& inst, std::string_view a, std::string_view b) { |
|||
ctx.Add("ADD.F {},{},{};", inst, a, b); |
|||
} |
|||
|
|||
void EmitFPAdd64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
|||
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPFma16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
|||
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b, |
|||
[[maybe_unused]] std::string_view c) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPFma32(EmitContext& ctx, IR::Inst& inst, std::string_view a, std::string_view b, |
|||
std::string_view c) { |
|||
ctx.Add("MAD.F {},{},{},{};", inst, a, b, c); |
|||
} |
|||
|
|||
void EmitFPFma64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
|||
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b, |
|||
[[maybe_unused]] std::string_view c) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPMax32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
|||
[[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPMax64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
|||
[[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPMin32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
|||
[[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPMin64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
|||
[[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPMul16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
|||
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPMul32(EmitContext& ctx, IR::Inst& inst, std::string_view a, std::string_view b) { |
|||
ctx.Add("MUL.F {},{},{};", inst, a, b); |
|||
} |
|||
|
|||
void EmitFPMul64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
|||
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPNeg16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPNeg32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { |
|||
if (value[0] == '-') { |
|||
// Guard against negating a negative immediate
|
|||
ctx.Add("MOV.F {},{};", inst, value.substr(1)); |
|||
} else { |
|||
ctx.Add("MOV.F {},-{};", inst, value); |
|||
} |
|||
} |
|||
|
|||
void EmitFPNeg64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPSin([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPCos([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPExp2([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPLog2([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPRecip32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPRecip64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPRecipSqrt32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPRecipSqrt64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPSqrt([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPSaturate16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPSaturate32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { |
|||
ctx.Add("MOV.F.SAT {},{};", inst, value); |
|||
} |
|||
|
|||
void EmitFPSaturate64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPClamp16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value, |
|||
[[maybe_unused]] std::string_view min_value, |
|||
[[maybe_unused]] std::string_view max_value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPClamp32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value, |
|||
[[maybe_unused]] std::string_view min_value, |
|||
[[maybe_unused]] std::string_view max_value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPClamp64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value, |
|||
[[maybe_unused]] std::string_view min_value, |
|||
[[maybe_unused]] std::string_view max_value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPRoundEven16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPRoundEven32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPRoundEven64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPFloor16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPFloor32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPFloor64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPCeil16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPCeil32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPCeil64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPTrunc16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPTrunc32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPTrunc64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdEqual32(EmitContext& ctx, IR::Inst& inst, std::string_view lhs, |
|||
std::string_view rhs) { |
|||
const std::string ret{ctx.reg_alloc.Define(inst)}; |
|||
ctx.Add("SEQ.F {},{},{};SNE.S {},{},0;", ret, lhs, rhs, ret, ret); |
|||
} |
|||
|
|||
void EmitFPOrdEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordEqual32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdNotEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdNotEqual32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdNotEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordNotEqual16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordNotEqual32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordNotEqual64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdLessThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdLessThan32(EmitContext& ctx, IR::Inst& inst, std::string_view lhs, |
|||
std::string_view rhs) { |
|||
const std::string ret{ctx.reg_alloc.Define(inst)}; |
|||
ctx.Add("SLT.F {},{},{};SNE.S {},{},0;", ret, lhs, rhs, ret, ret); |
|||
} |
|||
|
|||
void EmitFPOrdLessThan64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordLessThan16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordLessThan32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordLessThan64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdGreaterThan16([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdGreaterThan32([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdGreaterThan64([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordGreaterThan16([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordGreaterThan32([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordGreaterThan64([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdLessThanEqual16([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdLessThanEqual32(EmitContext& ctx, IR::Inst& inst, std::string_view lhs, |
|||
std::string_view rhs) { |
|||
const std::string ret{ctx.reg_alloc.Define(inst)}; |
|||
ctx.Add("SLE.F {},{},{};SNE.S {},{},0;", ret, lhs, rhs, ret, ret); |
|||
} |
|||
|
|||
void EmitFPOrdLessThanEqual64([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordLessThanEqual16([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordLessThanEqual32([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordLessThanEqual64([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdGreaterThanEqual16([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdGreaterThanEqual32([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPOrdGreaterThanEqual64([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordGreaterThanEqual16([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordGreaterThanEqual32([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFPUnordGreaterThanEqual64([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
} // namespace Shader::Backend::GLASM
|
|||
@ -0,0 +1,228 @@ |
|||
// Copyright 2021 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include <string_view>
|
|||
|
|||
#include "shader_recompiler/backend/glasm/emit_context.h"
|
|||
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
|
|||
#include "shader_recompiler/frontend/ir/value.h"
|
|||
|
|||
namespace Shader::Backend::GLASM { |
|||
|
|||
void EmitIAdd32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
|||
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitIAdd64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
|||
[[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitISub32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
|||
[[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitISub64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
|||
[[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitIMul32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
|||
[[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitINeg32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitINeg64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitIAbs32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitIAbs64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitShiftLeftLogical32([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view base, |
|||
[[maybe_unused]] std::string_view shift) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitShiftLeftLogical64([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view base, |
|||
[[maybe_unused]] std::string_view shift) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitShiftRightLogical32([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view base, |
|||
[[maybe_unused]] std::string_view shift) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitShiftRightLogical64([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view base, |
|||
[[maybe_unused]] std::string_view shift) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitShiftRightArithmetic32([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view base, |
|||
[[maybe_unused]] std::string_view shift) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitShiftRightArithmetic64([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view base, |
|||
[[maybe_unused]] std::string_view shift) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitBitwiseAnd32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
|||
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitBitwiseOr32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
|||
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitBitwiseXor32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
|||
[[maybe_unused]] std::string_view a, [[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitBitFieldInsert([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view base, |
|||
[[maybe_unused]] std::string_view insert, |
|||
[[maybe_unused]] std::string_view offset, |
|||
[[maybe_unused]] std::string_view count) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitBitFieldSExtract([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
|||
[[maybe_unused]] std::string_view base, |
|||
[[maybe_unused]] std::string_view offset, |
|||
[[maybe_unused]] std::string_view count) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitBitFieldUExtract([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
|||
[[maybe_unused]] std::string_view base, |
|||
[[maybe_unused]] std::string_view offset, |
|||
[[maybe_unused]] std::string_view count) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitBitReverse32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitBitCount32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitBitwiseNot32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFindSMsb32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitFindUMsb32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitSMin32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
|||
[[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitUMin32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
|||
[[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitSMax32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
|||
[[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitUMax32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view a, |
|||
[[maybe_unused]] std::string_view b) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitSClamp32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
|||
[[maybe_unused]] std::string_view value, [[maybe_unused]] std::string_view min, |
|||
[[maybe_unused]] std::string_view max) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitUClamp32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst, |
|||
[[maybe_unused]] std::string_view value, [[maybe_unused]] std::string_view min, |
|||
[[maybe_unused]] std::string_view max) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitSLessThan([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitULessThan([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitIEqual([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitSLessThanEqual([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitULessThanEqual([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitSGreaterThan([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitUGreaterThan([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitINotEqual([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitSGreaterThanEqual([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitUGreaterThanEqual([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view lhs, |
|||
[[maybe_unused]] std::string_view rhs) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
} // namespace Shader::Backend::GLASM
|
|||
@ -0,0 +1,178 @@ |
|||
// Copyright 2021 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include <string_view>
|
|||
|
|||
#include "shader_recompiler/backend/glasm/emit_context.h"
|
|||
#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h"
|
|||
#include "shader_recompiler/frontend/ir/program.h"
|
|||
#include "shader_recompiler/frontend/ir/value.h"
|
|||
|
|||
namespace Shader::Backend::GLASM { |
|||
namespace { |
|||
void StorageOp(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
|||
std::string_view then_expr, std::string_view else_expr = {}) { |
|||
// Operate on bindless SSBO, call the expression with bounds checking
|
|||
// address = c[binding].xy
|
|||
// length = c[binding].z
|
|||
const u32 sb_binding{binding.U32()}; |
|||
ctx.Add("PK64.U LC,c[{}];" // pointer = address
|
|||
"CVT.U64.U32 LC.z,{};" // offset = uint64_t(offset)
|
|||
"ADD.U64 LC.x,LC.x,LC.z;" // pointer += offset
|
|||
"SLT.U.CC RC.x,{},c[{}].z;", // cc = offset < length
|
|||
sb_binding, offset, offset, sb_binding); |
|||
if (else_expr.empty()) { |
|||
ctx.Add("{}", then_expr); |
|||
} else { |
|||
ctx.Add("IF NE.x;{}ELSE;{}ENDIF;", then_expr, else_expr); |
|||
} |
|||
} |
|||
|
|||
void Store(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
|||
std::string_view value, std::string_view size) { |
|||
StorageOp(ctx, binding, offset, fmt::format("STORE.{} {},LC.x;", size, value)); |
|||
} |
|||
|
|||
void Load(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, std::string_view offset, |
|||
std::string_view size) { |
|||
const std::string ret{ctx.reg_alloc.Define(inst)}; |
|||
StorageOp(ctx, binding, offset, fmt::format("STORE.{} {},LC.x;", size, ret), |
|||
fmt::format("MOV.U {},{{0,0,0,0}};", ret)); |
|||
} |
|||
} // Anonymous namespace
|
|||
|
|||
void EmitLoadGlobalU8([[maybe_unused]] EmitContext& ctx) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitLoadGlobalS8([[maybe_unused]] EmitContext& ctx) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitLoadGlobalU16([[maybe_unused]] EmitContext& ctx) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitLoadGlobalS16([[maybe_unused]] EmitContext& ctx) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitLoadGlobal32([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view address) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitLoadGlobal64([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view address) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitLoadGlobal128([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view address) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitWriteGlobalU8([[maybe_unused]] EmitContext& ctx) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitWriteGlobalS8([[maybe_unused]] EmitContext& ctx) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitWriteGlobalU16([[maybe_unused]] EmitContext& ctx) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitWriteGlobalS16([[maybe_unused]] EmitContext& ctx) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitWriteGlobal32([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view address, |
|||
[[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitWriteGlobal64([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] std::string_view address, |
|||
[[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitWriteGlobal128([[maybe_unused]] EmitContext& ctx, |
|||
[[maybe_unused]] std::string_view address, |
|||
[[maybe_unused]] std::string_view value) { |
|||
throw NotImplementedException("GLASM instruction"); |
|||
} |
|||
|
|||
void EmitLoadStorageU8(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|||
std::string_view offset) { |
|||
Load(ctx, inst, binding, offset, "U8"); |
|||
} |
|||
|
|||
void EmitLoadStorageS8(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|||
std::string_view offset) { |
|||
Load(ctx, inst, binding, offset, "S8"); |
|||
} |
|||
|
|||
void EmitLoadStorageU16(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|||
std::string_view offset) { |
|||
Load(ctx, inst, binding, offset, "U16"); |
|||
} |
|||
|
|||
void EmitLoadStorageS16(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|||
std::string_view offset) { |
|||
Load(ctx, inst, binding, offset, "S16"); |
|||
} |
|||
|
|||
void EmitLoadStorage32(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|||
std::string_view offset) { |
|||
Load(ctx, inst, binding, offset, "U32"); |
|||
} |
|||
|
|||
void EmitLoadStorage64(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|||
std::string_view offset) { |
|||
Load(ctx, inst, binding, offset, "U32X2"); |
|||
} |
|||
|
|||
void EmitLoadStorage128(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, |
|||
std::string_view offset) { |
|||
Load(ctx, inst, binding, offset, "U32X4"); |
|||
} |
|||
|
|||
void EmitWriteStorageU8(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
|||
std::string_view value) { |
|||
Store(ctx, binding, offset, value, "U8"); |
|||
} |
|||
|
|||
void EmitWriteStorageS8(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
|||
std::string_view value) { |
|||
Store(ctx, binding, offset, value, "S8"); |
|||
} |
|||
|
|||
void EmitWriteStorageU16(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
|||
std::string_view value) { |
|||
Store(ctx, binding, offset, value, "U16"); |
|||
} |
|||
|
|||
void EmitWriteStorageS16(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
|||
std::string_view value) { |
|||
Store(ctx, binding, offset, value, "S16"); |
|||
} |
|||
|
|||
void EmitWriteStorage32(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
|||
std::string_view value) { |
|||
Store(ctx, binding, offset, value, "U32"); |
|||
} |
|||
|
|||
void EmitWriteStorage64(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
|||
std::string_view value) { |
|||
Store(ctx, binding, offset, value, "U32X2"); |
|||
} |
|||
|
|||
void EmitWriteStorage128(EmitContext& ctx, const IR::Value& binding, std::string_view offset, |
|||
std::string_view value) { |
|||
Store(ctx, binding, offset, value, "U32X4"); |
|||
} |
|||
|
|||
} // namespace Shader::Backend::GLASM
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue