glasm: Use ARB_derivative_control conditionally
This commit is contained in:
		| @@ -265,9 +265,7 @@ void SetupOptions(const IR::Program& program, const Profile& profile, | ||||
|     // TODO: Track the shared atomic ops | ||||
|     header += "OPTION NV_internal;" | ||||
|               "OPTION NV_shader_storage_buffer;" | ||||
|               "OPTION NV_gpu_program_fp64;" | ||||
|               "OPTION NV_bindless_texture;" | ||||
|               "OPTION ARB_derivative_control;"; | ||||
|               "OPTION NV_gpu_program_fp64;"; | ||||
|     if (info.uses_int64_bit_atomics) { | ||||
|         header += "OPTION NV_shader_atomic_int64;"; | ||||
|     } | ||||
| @@ -295,6 +293,9 @@ void SetupOptions(const IR::Program& program, const Profile& profile, | ||||
|     if (info.uses_typeless_image_reads && profile.support_typeless_image_loads) { | ||||
|         header += "OPTION EXT_shader_image_load_formatted;"; | ||||
|     } | ||||
|     if (profile.support_derivative_control) { | ||||
|         header += "OPTION ARB_derivative_control;"; | ||||
|     } | ||||
|     if (stage == Stage::Fragment && runtime_info.force_early_z != 0) { | ||||
|         header += "OPTION NV_early_fragment_tests;"; | ||||
|     } | ||||
|   | ||||
| @@ -5,6 +5,7 @@ | ||||
| #include "shader_recompiler/backend/glasm/emit_context.h" | ||||
| #include "shader_recompiler/backend/glasm/emit_glasm_instructions.h" | ||||
| #include "shader_recompiler/frontend/ir/value.h" | ||||
| #include "shader_recompiler/profile.h" | ||||
|  | ||||
| namespace Shader::Backend::GLASM { | ||||
|  | ||||
| @@ -111,19 +112,39 @@ void EmitFSwizzleAdd(EmitContext& ctx, IR::Inst& inst, ScalarF32 op_a, ScalarF32 | ||||
| } | ||||
|  | ||||
| void EmitDPdxFine(EmitContext& ctx, IR::Inst& inst, ScalarF32 p) { | ||||
|     ctx.Add("DDX.FINE {}.x,{};", inst, p); | ||||
|     if (ctx.profile.support_derivative_control) { | ||||
|         ctx.Add("DDX.FINE {}.x,{};", inst, p); | ||||
|     } else { | ||||
|         // LOG_WARNING | ||||
|         ctx.Add("DDX {}.x,{};", inst, p); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void EmitDPdyFine(EmitContext& ctx, IR::Inst& inst, ScalarF32 p) { | ||||
|     ctx.Add("DDY.FINE {}.x,{};", inst, p); | ||||
|     if (ctx.profile.support_derivative_control) { | ||||
|         ctx.Add("DDY.FINE {}.x,{};", inst, p); | ||||
|     } else { | ||||
|         // LOG_WARNING | ||||
|         ctx.Add("DDY {}.x,{};", inst, p); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void EmitDPdxCoarse(EmitContext& ctx, IR::Inst& inst, ScalarF32 p) { | ||||
|     ctx.Add("DDX.COARSE {}.x,{};", inst, p); | ||||
|     if (ctx.profile.support_derivative_control) { | ||||
|         ctx.Add("DDX.COARSE {}.x,{};", inst, p); | ||||
|     } else { | ||||
|         // LOG_WARNING | ||||
|         ctx.Add("DDX {}.x,{};", inst, p); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void EmitDPdyCoarse(EmitContext& ctx, IR::Inst& inst, ScalarF32 p) { | ||||
|     ctx.Add("DDY.COARSE {}.x,{};", inst, p); | ||||
|     if (ctx.profile.support_derivative_control) { | ||||
|         ctx.Add("DDY.COARSE {}.x,{};", inst, p); | ||||
|     } else { | ||||
|         // LOG_WARNING | ||||
|         ctx.Add("DDY {}.x,{};", inst, p); | ||||
|     } | ||||
| } | ||||
|  | ||||
| } // namespace Shader::Backend::GLASM | ||||
|   | ||||
		Reference in New Issue
	
	Block a user