diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index a29b12828d..a0e610bae5 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -204,7 +204,7 @@ void GLFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) void GLFragmentDecompilerThread::insertMainStart(std::stringstream & OS) { if (properties.in_register_mask & in_fogc) - glsl::insert_fog_declaration(OS); + program_common::insert_fog_declaration(OS); std::set output_registers; if (m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS) diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp index 25d302fffc..ea1e9572a0 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp @@ -4,8 +4,21 @@ #include "GLSLCommon.h" #include "RSXFragmentProgram.h" +#include "../gcm_enums.h" + namespace program_common { + template + void define_glsl_constants(std::ostream& OS, std::initializer_list> enums) + { + for (const auto& e : enums) + { + OS << "#define " << e.first << " " << static_cast(e.second) << "\n"; + } + + OS << "\n"; + } + void insert_compare_op(std::ostream& OS) { OS << @@ -46,14 +59,19 @@ namespace program_common "}\n\n"; } - void insert_fog_declaration(std::ostream& OS, const std::string& wide_vector_type, const std::string& input_coord, bool declare) + void insert_fog_declaration(std::ostream& OS, std::string_view wide_vector_type, std::string_view input_coord) { - std::string template_body; + define_glsl_constants(OS, + { + { "FOG_LINEAR", rsx::fog_mode::linear }, + { "FOG_EXP", rsx::fog_mode::exponential }, + { "FOG_EXP2", rsx::fog_mode::exponential2 }, + { "FOG_LINEAR_ABS", rsx::fog_mode::linear_abs }, + { "FOG_EXP_ABS", rsx::fog_mode::exponential_abs }, + { "FOG_EXP2_ABS", rsx::fog_mode::exponential2_abs } + }); - if (!declare) - template_body += "$T fetch_fog_value(const in uint mode)\n"; - else - template_body += "$T fetch_fog_value(const in uint mode, const in $T $I)\n"; + std::string template_body = "$T fetch_fog_value(const in uint mode)\n"; template_body += "{\n" @@ -62,27 +80,27 @@ namespace program_common " {\n" " default:\n" " return result;\n" - " case 0:\n" + " case FOG_LINEAR:\n" " //linear\n" " result.y = fog_param1 * $I.x + (fog_param0 - 1.);\n" " break;\n" - " case 1:\n" + " case FOG_EXP:\n" " //exponential\n" " result.y = exp(11.084 * (fog_param1 * $I.x + fog_param0 - 1.5));\n" " break;\n" - " case 2:\n" + " case FOG_EXP2:\n" " //exponential2\n" " result.y = exp(-pow(4.709 * (fog_param1 * $I.x + fog_param0 - 1.5), 2.));\n" " break;\n" - " case 3:\n" + " case FOG_EXP_ABS:\n" " //exponential_abs\n" " result.y = exp(11.084 * (fog_param1 * abs($I.x) + fog_param0 - 1.5));\n" " break;\n" - " case 4:\n" + " case FOG_EXP2_ABS:\n" " //exponential2_abs\n" " result.y = exp(-pow(4.709 * (fog_param1 * abs($I.x) + fog_param0 - 1.5), 2.));\n" " break;\n" - " case 5:\n" + " case FOG_LINEAR_ABS:\n" " //linear_abs\n" " result.y = fog_param1 * abs($I.x) + (fog_param0 - 1.);\n" " break;\n" @@ -93,8 +111,10 @@ namespace program_common "}\n\n"; std::pair replacements[] = - {std::make_pair("$T", wide_vector_type), - std::make_pair("$I", input_coord)}; + { + std::make_pair("$T", std::string(wide_vector_type)), + std::make_pair("$I", std::string(input_coord)) + }; OS << fmt::replace_all(template_body, replacements); } @@ -182,15 +202,17 @@ namespace glsl { std::string vertex_id_name = (rules != glsl_rules_spirv) ? "gl_VertexID" : "gl_VertexIndex"; - //Actually decode a vertex attribute from a raw byte stream - OS << - "#define VTX_FMT_SNORM16 " << RSX_VERTEX_BASE_TYPE_SNORM16 << "\n" - "#define VTX_FMT_FLOAT32 " << RSX_VERTEX_BASE_TYPE_FLOAT << "\n" - "#define VTX_FMT_FLOAT16 " << RSX_VERTEX_BASE_TYPE_HALF_FLOAT << "\n" - "#define VTX_FMT_UNORM8 " << RSX_VERTEX_BASE_TYPE_UNORM8 << "\n" - "#define VTX_FMT_SINT16 " << RSX_VERTEX_BASE_TYPE_SINT16 << "\n" - "#define VTX_FMT_COMP32 " << RSX_VERTEX_BASE_TYPE_CMP32 << "\n" - "#define VTX_FMT_UINT8 " << RSX_VERTEX_BASE_TYPE_UINT8 << "\n\n"; + // Actually decode a vertex attribute from a raw byte stream + program_common::define_glsl_constants(OS, + { + { "VTX_FMT_SNORM16", RSX_VERTEX_BASE_TYPE_SNORM16 }, + { "VTX_FMT_FLOAT32", RSX_VERTEX_BASE_TYPE_FLOAT }, + { "VTX_FMT_FLOAT16", RSX_VERTEX_BASE_TYPE_HALF_FLOAT }, + { "VTX_FMT_UNORM8", RSX_VERTEX_BASE_TYPE_UNORM8 }, + { "VTX_FMT_SINT16", RSX_VERTEX_BASE_TYPE_SINT16 }, + { "VTX_FMT_COMP32", RSX_VERTEX_BASE_TYPE_CMP32 }, + { "VTX_FMT_UINT8", RSX_VERTEX_BASE_TYPE_UINT8 } + }); // For intel GPUs which cannot access vectors in indexed mode (driver bug? or glsl version too low?) // Note: Tested on Mesa iris with HD 530 and compilant path works fine, may be a bug on Windows proprietary drivers @@ -1010,11 +1032,6 @@ namespace glsl } } - void insert_fog_declaration(std::ostream& OS) - { - program_common::insert_fog_declaration(OS, "vec4", "fog_c"); - } - std::string getFunctionImpl(FUNCTION f) { switch (f) diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.h b/rpcs3/Emu/RSX/Program/GLSLCommon.h index 71dc2bc989..4346b3d5fe 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.h +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.h @@ -1,5 +1,6 @@ #pragma once #include +#include #include "GLSLTypes.h" #include "ShaderParam.h" @@ -79,7 +80,7 @@ namespace program_common { void insert_compare_op(std::ostream& OS, bool low_precision); void insert_compare_op_vector(std::ostream& OS); - void insert_fog_declaration(std::ostream& OS, const std::string& wide_vector_type, const std::string& input_coord, bool declare = false); + void insert_fog_declaration(std::ostream& OS, std::string_view vector_type = "vec4", std::string_view input_coord = "fog_c"); } namespace glsl @@ -105,7 +106,6 @@ namespace glsl void insert_rop_init(std::ostream& OS); void insert_rop(std::ostream& OS, const shader_properties& props); void insert_glsl_legacy_function(std::ostream& OS, const shader_properties& props); - void insert_fog_declaration(std::ostream& OS); std::string getFunctionImpl(FUNCTION f); void insert_subheader_block(std::ostream& OS); diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index baa75296a4..412b939fe7 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -256,7 +256,7 @@ void VKFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) void VKFragmentDecompilerThread::insertMainStart(std::stringstream & OS) { if (properties.in_register_mask & in_fogc) - glsl::insert_fog_declaration(OS); + program_common::insert_fog_declaration(OS); std::set output_registers; if (m_ctrl & CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS)