|
|
|
@ -1,3 +1,6 @@ |
|
|
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
|
|
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
|
|
|
@ -28,7 +31,7 @@ std::pair<Id, Id> ExtractArgs(EmitContext& ctx, Id offset, u32 mask, u32 count) |
|
|
|
} // Anonymous namespace
|
|
|
|
|
|
|
|
Id EmitLoadSharedU8(EmitContext& ctx, Id offset) { |
|
|
|
if (ctx.profile.support_explicit_workgroup_layout) { |
|
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
|
const Id pointer{ |
|
|
|
ctx.OpAccessChain(ctx.shared_u8, ctx.shared_memory_u8, ctx.u32_zero_value, offset)}; |
|
|
|
return ctx.OpUConvert(ctx.U32[1], ctx.OpLoad(ctx.U8, pointer)); |
|
|
|
@ -39,7 +42,7 @@ Id EmitLoadSharedU8(EmitContext& ctx, Id offset) { |
|
|
|
} |
|
|
|
|
|
|
|
Id EmitLoadSharedS8(EmitContext& ctx, Id offset) { |
|
|
|
if (ctx.profile.support_explicit_workgroup_layout) { |
|
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
|
const Id pointer{ |
|
|
|
ctx.OpAccessChain(ctx.shared_u8, ctx.shared_memory_u8, ctx.u32_zero_value, offset)}; |
|
|
|
return ctx.OpSConvert(ctx.U32[1], ctx.OpLoad(ctx.U8, pointer)); |
|
|
|
@ -50,7 +53,7 @@ Id EmitLoadSharedS8(EmitContext& ctx, Id offset) { |
|
|
|
} |
|
|
|
|
|
|
|
Id EmitLoadSharedU16(EmitContext& ctx, Id offset) { |
|
|
|
if (ctx.profile.support_explicit_workgroup_layout) { |
|
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
|
const Id pointer{Pointer(ctx, ctx.shared_u16, ctx.shared_memory_u16, offset, 1)}; |
|
|
|
return ctx.OpUConvert(ctx.U32[1], ctx.OpLoad(ctx.U16, pointer)); |
|
|
|
} else { |
|
|
|
@ -60,7 +63,7 @@ Id EmitLoadSharedU16(EmitContext& ctx, Id offset) { |
|
|
|
} |
|
|
|
|
|
|
|
Id EmitLoadSharedS16(EmitContext& ctx, Id offset) { |
|
|
|
if (ctx.profile.support_explicit_workgroup_layout) { |
|
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
|
const Id pointer{Pointer(ctx, ctx.shared_u16, ctx.shared_memory_u16, offset, 1)}; |
|
|
|
return ctx.OpSConvert(ctx.U32[1], ctx.OpLoad(ctx.U16, pointer)); |
|
|
|
} else { |
|
|
|
@ -70,7 +73,7 @@ Id EmitLoadSharedS16(EmitContext& ctx, Id offset) { |
|
|
|
} |
|
|
|
|
|
|
|
Id EmitLoadSharedU32(EmitContext& ctx, Id offset) { |
|
|
|
if (ctx.profile.support_explicit_workgroup_layout) { |
|
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32, ctx.shared_memory_u32, offset, 2)}; |
|
|
|
return ctx.OpLoad(ctx.U32[1], pointer); |
|
|
|
} else { |
|
|
|
@ -79,7 +82,7 @@ Id EmitLoadSharedU32(EmitContext& ctx, Id offset) { |
|
|
|
} |
|
|
|
|
|
|
|
Id EmitLoadSharedU64(EmitContext& ctx, Id offset) { |
|
|
|
if (ctx.profile.support_explicit_workgroup_layout) { |
|
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32x2, ctx.shared_memory_u32x2, offset, 3)}; |
|
|
|
return ctx.OpLoad(ctx.U32[2], pointer); |
|
|
|
} else { |
|
|
|
@ -94,7 +97,7 @@ Id EmitLoadSharedU64(EmitContext& ctx, Id offset) { |
|
|
|
} |
|
|
|
|
|
|
|
Id EmitLoadSharedU128(EmitContext& ctx, Id offset) { |
|
|
|
if (ctx.profile.support_explicit_workgroup_layout) { |
|
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32x4, ctx.shared_memory_u32x4, offset, 4)}; |
|
|
|
return ctx.OpLoad(ctx.U32[4], pointer); |
|
|
|
} |
|
|
|
@ -110,7 +113,7 @@ Id EmitLoadSharedU128(EmitContext& ctx, Id offset) { |
|
|
|
} |
|
|
|
|
|
|
|
void EmitWriteSharedU8(EmitContext& ctx, Id offset, Id value) { |
|
|
|
if (ctx.profile.support_explicit_workgroup_layout) { |
|
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
|
const Id pointer{ |
|
|
|
ctx.OpAccessChain(ctx.shared_u8, ctx.shared_memory_u8, ctx.u32_zero_value, offset)}; |
|
|
|
ctx.OpStore(pointer, ctx.OpUConvert(ctx.U8, value)); |
|
|
|
@ -120,7 +123,7 @@ void EmitWriteSharedU8(EmitContext& ctx, Id offset, Id value) { |
|
|
|
} |
|
|
|
|
|
|
|
void EmitWriteSharedU16(EmitContext& ctx, Id offset, Id value) { |
|
|
|
if (ctx.profile.support_explicit_workgroup_layout) { |
|
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
|
const Id pointer{Pointer(ctx, ctx.shared_u16, ctx.shared_memory_u16, offset, 1)}; |
|
|
|
ctx.OpStore(pointer, ctx.OpUConvert(ctx.U16, value)); |
|
|
|
} else { |
|
|
|
@ -130,7 +133,7 @@ void EmitWriteSharedU16(EmitContext& ctx, Id offset, Id value) { |
|
|
|
|
|
|
|
void EmitWriteSharedU32(EmitContext& ctx, Id offset, Id value) { |
|
|
|
Id pointer{}; |
|
|
|
if (ctx.profile.support_explicit_workgroup_layout) { |
|
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
|
pointer = Pointer(ctx, ctx.shared_u32, ctx.shared_memory_u32, offset, 2); |
|
|
|
} else { |
|
|
|
const Id shift{ctx.Const(2U)}; |
|
|
|
@ -141,7 +144,7 @@ void EmitWriteSharedU32(EmitContext& ctx, Id offset, Id value) { |
|
|
|
} |
|
|
|
|
|
|
|
void EmitWriteSharedU64(EmitContext& ctx, Id offset, Id value) { |
|
|
|
if (ctx.profile.support_explicit_workgroup_layout) { |
|
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32x2, ctx.shared_memory_u32x2, offset, 3)}; |
|
|
|
ctx.OpStore(pointer, value); |
|
|
|
return; |
|
|
|
@ -156,7 +159,7 @@ void EmitWriteSharedU64(EmitContext& ctx, Id offset, Id value) { |
|
|
|
} |
|
|
|
|
|
|
|
void EmitWriteSharedU128(EmitContext& ctx, Id offset, Id value) { |
|
|
|
if (ctx.profile.support_explicit_workgroup_layout) { |
|
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32x4, ctx.shared_memory_u32x4, offset, 4)}; |
|
|
|
ctx.OpStore(pointer, value); |
|
|
|
return; |
|
|
|
|