| 
									
										
										
										
											2021-05-20 23:38:38 -04:00
										 |  |  | // 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/glsl/emit_context.h"
 | 
					
						
							| 
									
										
										
										
											2021-05-29 02:09:29 -04:00
										 |  |  | #include "shader_recompiler/backend/glsl/emit_glsl_instructions.h"
 | 
					
						
							| 
									
										
										
										
											2021-05-20 23:38:38 -04:00
										 |  |  | #include "shader_recompiler/frontend/ir/value.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Shader::Backend::GLSL { | 
					
						
							|  |  |  | namespace { | 
					
						
							|  |  |  | static void Alias(IR::Inst& inst, const IR::Value& value) { | 
					
						
							|  |  |  |     if (value.IsImmediate()) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-05-26 21:18:17 -04:00
										 |  |  |     IR::Inst& value_inst{*value.InstRecursive()}; | 
					
						
							| 
									
										
										
										
											2021-05-20 23:38:38 -04:00
										 |  |  |     value_inst.DestructiveAddUsage(inst.UseCount()); | 
					
						
							|  |  |  |     value_inst.DestructiveRemoveUsage(); | 
					
						
							|  |  |  |     inst.SetDefinition(value_inst.Definition<Id>()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | } // namespace
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-21 19:28:03 -04:00
										 |  |  | void EmitIdentity(EmitContext&, IR::Inst& inst, const IR::Value& value) { | 
					
						
							|  |  |  |     Alias(inst, value); | 
					
						
							| 
									
										
										
										
											2021-05-20 23:38:38 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2021-05-21 20:56:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | void EmitConditionRef(EmitContext& ctx, IR::Inst& inst, const IR::Value& value) { | 
					
						
							|  |  |  |     ctx.AddU1("{}={};", inst, ctx.reg_alloc.Consume(value)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-22 01:52:03 -04:00
										 |  |  | void EmitBitCastU16F16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst) { | 
					
						
							|  |  |  |     throw NotImplementedException("GLSL Instruction"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void EmitBitCastU32F32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | 
					
						
							|  |  |  |     ctx.AddU32("{}=floatBitsToUint({});", inst, value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void EmitBitCastU64F64(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | 
					
						
							|  |  |  |     ctx.AddU64("{}=doubleBitsToUint64({});", inst, value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void EmitBitCastF16U16([[maybe_unused]] EmitContext& ctx, [[maybe_unused]] IR::Inst& inst) { | 
					
						
							|  |  |  |     throw NotImplementedException("GLSL Instruction"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void EmitBitCastF32U32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | 
					
						
							|  |  |  |     ctx.AddF32("{}=uintBitsToFloat({});", inst, value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void EmitBitCastF64U64(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | 
					
						
							|  |  |  |     ctx.AddF64("{}=uint64BitsToDouble({});", inst, value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-21 20:56:46 -04:00
										 |  |  | void EmitPackUint2x32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | 
					
						
							|  |  |  |     ctx.AddU64("{}=packUint2x32({});", inst, value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void EmitUnpackUint2x32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | 
					
						
							|  |  |  |     ctx.AddU32x2("{}=unpackUint2x32({});", inst, value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-25 01:52:02 -04:00
										 |  |  | void EmitPackFloat2x16(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | 
					
						
							|  |  |  |     ctx.AddU32("{}=packFloat2x16({});", inst, value); | 
					
						
							| 
									
										
										
										
											2021-05-22 01:52:03 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-25 01:52:02 -04:00
										 |  |  | void EmitUnpackFloat2x16(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | 
					
						
							|  |  |  |     ctx.AddF16x2("{}=unpackFloat2x16({});", inst, value); | 
					
						
							| 
									
										
										
										
											2021-05-22 01:52:03 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void EmitPackHalf2x16(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | 
					
						
							|  |  |  |     ctx.AddU32("{}=packHalf2x16({});", inst, value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void EmitUnpackHalf2x16(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | 
					
						
							|  |  |  |     ctx.AddF32x2("{}=unpackHalf2x16({});", inst, value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void EmitPackDouble2x32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | 
					
						
							|  |  |  |     ctx.AddF64("{}=packDouble2x32({});", inst, value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void EmitUnpackDouble2x32(EmitContext& ctx, IR::Inst& inst, std::string_view value) { | 
					
						
							|  |  |  |     ctx.AddU32x2("{}=unpackDouble2x32({});", inst, value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-20 23:38:38 -04:00
										 |  |  | } // namespace Shader::Backend::GLSL
 |