committed by
ameerj
32 changed files with 479 additions and 285 deletions
-
2src/shader_recompiler/CMakeLists.txt
-
29src/shader_recompiler/backend/spirv/emit_context.cpp
-
6src/shader_recompiler/backend/spirv/emit_context.h
-
2src/shader_recompiler/backend/spirv/emit_spirv.cpp
-
103src/shader_recompiler/backend/spirv/emit_spirv.h
-
28src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp
-
48src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp
-
2src/shader_recompiler/backend/spirv/emit_spirv_control_flow.cpp
-
89src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp
-
48src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp
-
16src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp
-
72src/shader_recompiler/backend/spirv/emit_spirv_logical.cpp
-
22src/shader_recompiler/backend/spirv/emit_spirv_memory.cpp
-
2src/shader_recompiler/frontend/ir/condition.h
-
70src/shader_recompiler/frontend/ir/ir_emitter.cpp
-
4src/shader_recompiler/frontend/ir/microinstruction.cpp
-
2src/shader_recompiler/frontend/ir/microinstruction.h
-
6src/shader_recompiler/frontend/ir/opcodes.inc
-
2src/shader_recompiler/frontend/ir/program.cpp
-
2src/shader_recompiler/frontend/maxwell/program.cpp
-
62src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_conversion_integer.cpp
-
2src/shader_recompiler/frontend/maxwell/translate/impl/impl.h
-
18src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp
-
12src/shader_recompiler/ir_opt/constant_propagation_pass.cpp
-
79src/shader_recompiler/ir_opt/lower_fp16_to_fp32.cpp
-
1src/shader_recompiler/ir_opt/passes.h
-
10src/shader_recompiler/main.cpp
-
2src/shader_recompiler/object_pool.h
-
3src/video_core/renderer_vulkan/vk_compute_pass.cpp
-
8src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
-
2src/video_core/renderer_vulkan/vk_rasterizer.cpp
-
10src/video_core/vulkan_common/vulkan_device.cpp
@ -0,0 +1,89 @@ |
|||
// Copyright 2021 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "shader_recompiler/backend/spirv/emit_spirv.h"
|
|||
|
|||
namespace Shader::Backend::SPIRV { |
|||
|
|||
Id EmitConvertS16F16(EmitContext& ctx, Id value) { |
|||
return ctx.OpUConvert(ctx.U32[1], ctx.OpConvertFToS(ctx.U16, value)); |
|||
} |
|||
|
|||
Id EmitConvertS16F32(EmitContext& ctx, Id value) { |
|||
return ctx.OpUConvert(ctx.U32[1], ctx.OpConvertFToS(ctx.U16, value)); |
|||
} |
|||
|
|||
Id EmitConvertS16F64(EmitContext& ctx, Id value) { |
|||
return ctx.OpUConvert(ctx.U32[1], ctx.OpConvertFToS(ctx.U16, value)); |
|||
} |
|||
|
|||
Id EmitConvertS32F16(EmitContext& ctx, Id value) { |
|||
return ctx.OpConvertFToS(ctx.U32[1], value); |
|||
} |
|||
|
|||
Id EmitConvertS32F32(EmitContext& ctx, Id value) { |
|||
return ctx.OpConvertFToS(ctx.U32[1], value); |
|||
} |
|||
|
|||
Id EmitConvertS32F64(EmitContext& ctx, Id value) { |
|||
return ctx.OpConvertFToS(ctx.U32[1], value); |
|||
} |
|||
|
|||
Id EmitConvertS64F16(EmitContext& ctx, Id value) { |
|||
return ctx.OpConvertFToS(ctx.U64, value); |
|||
} |
|||
|
|||
Id EmitConvertS64F32(EmitContext& ctx, Id value) { |
|||
return ctx.OpConvertFToS(ctx.U64, value); |
|||
} |
|||
|
|||
Id EmitConvertS64F64(EmitContext& ctx, Id value) { |
|||
return ctx.OpConvertFToS(ctx.U64, value); |
|||
} |
|||
|
|||
Id EmitConvertU16F16(EmitContext& ctx, Id value) { |
|||
return ctx.OpUConvert(ctx.U32[1], ctx.OpConvertFToU(ctx.U16, value)); |
|||
} |
|||
|
|||
Id EmitConvertU16F32(EmitContext& ctx, Id value) { |
|||
return ctx.OpUConvert(ctx.U32[1], ctx.OpConvertFToU(ctx.U16, value)); |
|||
} |
|||
|
|||
Id EmitConvertU16F64(EmitContext& ctx, Id value) { |
|||
return ctx.OpUConvert(ctx.U32[1], ctx.OpConvertFToU(ctx.U16, value)); |
|||
} |
|||
|
|||
Id EmitConvertU32F16(EmitContext& ctx, Id value) { |
|||
return ctx.OpConvertFToU(ctx.U32[1], value); |
|||
} |
|||
|
|||
Id EmitConvertU32F32(EmitContext& ctx, Id value) { |
|||
return ctx.OpConvertFToU(ctx.U32[1], value); |
|||
} |
|||
|
|||
Id EmitConvertU32F64(EmitContext& ctx, Id value) { |
|||
return ctx.OpConvertFToU(ctx.U32[1], value); |
|||
} |
|||
|
|||
Id EmitConvertU64F16(EmitContext& ctx, Id value) { |
|||
return ctx.OpConvertFToU(ctx.U64, value); |
|||
} |
|||
|
|||
Id EmitConvertU64F32(EmitContext& ctx, Id value) { |
|||
return ctx.OpConvertFToU(ctx.U64, value); |
|||
} |
|||
|
|||
Id EmitConvertU64F64(EmitContext& ctx, Id value) { |
|||
return ctx.OpConvertFToU(ctx.U64, value); |
|||
} |
|||
|
|||
Id EmitConvertU64U32(EmitContext& ctx, Id value) { |
|||
return ctx.OpUConvert(ctx.U64, value); |
|||
} |
|||
|
|||
Id EmitConvertU32U64(EmitContext& ctx, Id value) { |
|||
return ctx.OpUConvert(ctx.U32[1], value); |
|||
} |
|||
|
|||
} // namespace Shader::Backend::SPIRV
|
|||
@ -0,0 +1,79 @@ |
|||
// Copyright 2021 yuzu Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include <algorithm>
|
|||
|
|||
#include "shader_recompiler/frontend/ir/ir_emitter.h"
|
|||
#include "shader_recompiler/frontend/ir/microinstruction.h"
|
|||
#include "shader_recompiler/ir_opt/passes.h"
|
|||
|
|||
namespace Shader::Optimization { |
|||
namespace { |
|||
IR::Opcode Replace(IR::Opcode op) { |
|||
switch (op) { |
|||
case IR::Opcode::FPAbs16: |
|||
return IR::Opcode::FPAbs32; |
|||
case IR::Opcode::FPAdd16: |
|||
return IR::Opcode::FPAdd32; |
|||
case IR::Opcode::FPCeil16: |
|||
return IR::Opcode::FPCeil32; |
|||
case IR::Opcode::FPFloor16: |
|||
return IR::Opcode::FPFloor32; |
|||
case IR::Opcode::FPFma16: |
|||
return IR::Opcode::FPFma32; |
|||
case IR::Opcode::FPMul16: |
|||
return IR::Opcode::FPMul32; |
|||
case IR::Opcode::FPNeg16: |
|||
return IR::Opcode::FPNeg32; |
|||
case IR::Opcode::FPRoundEven16: |
|||
return IR::Opcode::FPRoundEven32; |
|||
case IR::Opcode::FPSaturate16: |
|||
return IR::Opcode::FPSaturate32; |
|||
case IR::Opcode::FPTrunc16: |
|||
return IR::Opcode::FPTrunc32; |
|||
case IR::Opcode::CompositeConstructF16x2: |
|||
return IR::Opcode::CompositeConstructF32x2; |
|||
case IR::Opcode::CompositeConstructF16x3: |
|||
return IR::Opcode::CompositeConstructF32x3; |
|||
case IR::Opcode::CompositeConstructF16x4: |
|||
return IR::Opcode::CompositeConstructF32x4; |
|||
case IR::Opcode::CompositeExtractF16x2: |
|||
return IR::Opcode::CompositeExtractF32x2; |
|||
case IR::Opcode::CompositeExtractF16x3: |
|||
return IR::Opcode::CompositeExtractF32x3; |
|||
case IR::Opcode::CompositeExtractF16x4: |
|||
return IR::Opcode::CompositeExtractF32x4; |
|||
case IR::Opcode::ConvertS16F16: |
|||
return IR::Opcode::ConvertS16F32; |
|||
case IR::Opcode::ConvertS32F16: |
|||
return IR::Opcode::ConvertS32F32; |
|||
case IR::Opcode::ConvertS64F16: |
|||
return IR::Opcode::ConvertS64F32; |
|||
case IR::Opcode::ConvertU16F16: |
|||
return IR::Opcode::ConvertU16F32; |
|||
case IR::Opcode::ConvertU32F16: |
|||
return IR::Opcode::ConvertU32F32; |
|||
case IR::Opcode::ConvertU64F16: |
|||
return IR::Opcode::ConvertU64F32; |
|||
case IR::Opcode::PackFloat2x16: |
|||
return IR::Opcode::PackHalf2x16; |
|||
case IR::Opcode::UnpackFloat2x16: |
|||
return IR::Opcode::UnpackHalf2x16; |
|||
default: |
|||
return op; |
|||
} |
|||
} |
|||
} // Anonymous namespace
|
|||
|
|||
void LowerFp16ToFp32(IR::Program& program) { |
|||
for (IR::Function& function : program.functions) { |
|||
for (IR::Block* const block : function.blocks) { |
|||
for (IR::Inst& inst : block->Instructions()) { |
|||
inst.ReplaceOpcode(Replace(inst.Opcode())); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
} // namespace Shader::Optimization
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue