From 4594c912a608f9e5e8c3ed82a14ccd3f2d216c4e Mon Sep 17 00:00:00 2001 From: kd-11 <15904127+kd-11@users.noreply.github.com> Date: Wed, 27 Mar 2024 20:20:21 +0300 Subject: [PATCH] rsx: Move SPIRV stuff into common code --- rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/Emu/RSX/Program/GLSLCommon.cpp | 2 +- rpcs3/Emu/RSX/Program/GLSLTypes.h | 2 +- rpcs3/Emu/RSX/Program/SPIRVCommon.cpp | 200 +++++++++++++++++++++++ rpcs3/Emu/RSX/Program/SPIRVCommon.h | 15 ++ rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp | 179 +------------------- rpcs3/Emu/RSX/VK/VKCommonDecompiler.h | 4 - rpcs3/Emu/RSX/VK/VKGSRender.cpp | 9 +- rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp | 5 +- rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp | 2 +- rpcs3/Emu/RSX/VK/VKVertexProgram.cpp | 2 +- rpcs3/emucore.vcxproj | 2 + rpcs3/emucore.vcxproj.filters | 6 + 13 files changed, 238 insertions(+), 191 deletions(-) create mode 100644 rpcs3/Emu/RSX/Program/SPIRVCommon.cpp create mode 100644 rpcs3/Emu/RSX/Program/SPIRVCommon.h diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 3c001bf98a..d6e1f44405 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -502,6 +502,7 @@ target_sources(rpcs3_emu PRIVATE RSX/Program/GLSLCommon.cpp RSX/Program/program_util.cpp RSX/Program/ProgramStateCache.cpp + RSX/Program/SPIRVCommon.cpp RSX/Program/VertexProgramDecompiler.cpp RSX/Capture/rsx_capture.cpp RSX/Capture/rsx_replay.cpp diff --git a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp index e0ce1481a0..6965a50371 100644 --- a/rpcs3/Emu/RSX/Program/GLSLCommon.cpp +++ b/rpcs3/Emu/RSX/Program/GLSLCommon.cpp @@ -118,7 +118,7 @@ namespace glsl void insert_vertex_input_fetch(std::stringstream& OS, glsl_rules rules, bool glsl4_compliant) { - std::string vertex_id_name = (rules != glsl_rules_spirv) ? "gl_VertexID" : "gl_VertexIndex"; + std::string vertex_id_name = (rules != glsl_rules_vulkan) ? "gl_VertexID" : "gl_VertexIndex"; // Actually decode a vertex attribute from a raw byte stream program_common::define_glsl_constants(OS, diff --git a/rpcs3/Emu/RSX/Program/GLSLTypes.h b/rpcs3/Emu/RSX/Program/GLSLTypes.h index e50b2d62e1..11f657ddf5 100644 --- a/rpcs3/Emu/RSX/Program/GLSLTypes.h +++ b/rpcs3/Emu/RSX/Program/GLSLTypes.h @@ -12,7 +12,7 @@ namespace glsl enum glsl_rules : unsigned char { glsl_rules_opengl4, - glsl_rules_spirv + glsl_rules_vulkan }; struct shader_properties diff --git a/rpcs3/Emu/RSX/Program/SPIRVCommon.cpp b/rpcs3/Emu/RSX/Program/SPIRVCommon.cpp new file mode 100644 index 0000000000..e1aac0bd33 --- /dev/null +++ b/rpcs3/Emu/RSX/Program/SPIRVCommon.cpp @@ -0,0 +1,200 @@ +#include "stdafx.h" + +#ifdef _MSC_VER +#pragma warning(push, 0) +#else +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wall" +#pragma GCC diagnostic ignored "-Wextra" +#pragma GCC diagnostic ignored "-Wold-style-cast" +#pragma GCC diagnostic ignored "-Wsuggest-override" +#ifdef __clang__ +#pragma clang diagnostic ignored "-Winconsistent-missing-override" +#endif +#endif +#include "3rdparty/glslang/glslang/SPIRV/GlslangToSpv.h" +#ifdef _MSC_VER +#pragma warning(pop) +#else +#pragma GCC diagnostic pop +#endif + +#include "SPIRVCommon.h" +#include "GLSLCommon.h" + +namespace spirv +{ + static TBuiltInResource g_default_config; + + void init_default_resources(TBuiltInResource& rsc) + { + rsc.maxLights = 32; + rsc.maxClipPlanes = 6; + rsc.maxTextureUnits = 32; + rsc.maxTextureCoords = 32; + rsc.maxVertexAttribs = 64; + rsc.maxVertexUniformComponents = 4096; + rsc.maxVaryingFloats = 64; + rsc.maxVertexTextureImageUnits = 32; + rsc.maxCombinedTextureImageUnits = 80; + rsc.maxTextureImageUnits = 32; + rsc.maxFragmentUniformComponents = 4096; + rsc.maxDrawBuffers = 32; + rsc.maxVertexUniformVectors = 128; + rsc.maxVaryingVectors = 8; + rsc.maxFragmentUniformVectors = 16; + rsc.maxVertexOutputVectors = 16; + rsc.maxFragmentInputVectors = 15; + rsc.minProgramTexelOffset = -8; + rsc.maxProgramTexelOffset = 7; + rsc.maxClipDistances = 8; + rsc.maxComputeWorkGroupCountX = 65535; + rsc.maxComputeWorkGroupCountY = 65535; + rsc.maxComputeWorkGroupCountZ = 65535; + rsc.maxComputeWorkGroupSizeX = 1024; + rsc.maxComputeWorkGroupSizeY = 1024; + rsc.maxComputeWorkGroupSizeZ = 64; + rsc.maxComputeUniformComponents = 1024; + rsc.maxComputeTextureImageUnits = 16; + rsc.maxComputeImageUniforms = 8; + rsc.maxComputeAtomicCounters = 8; + rsc.maxComputeAtomicCounterBuffers = 1; + rsc.maxVaryingComponents = 60; + rsc.maxVertexOutputComponents = 64; + rsc.maxGeometryInputComponents = 64; + rsc.maxGeometryOutputComponents = 128; + rsc.maxFragmentInputComponents = 128; + rsc.maxImageUnits = 8; + rsc.maxCombinedImageUnitsAndFragmentOutputs = 8; + rsc.maxCombinedShaderOutputResources = 8; + rsc.maxImageSamples = 0; + rsc.maxVertexImageUniforms = 0; + rsc.maxTessControlImageUniforms = 0; + rsc.maxTessEvaluationImageUniforms = 0; + rsc.maxGeometryImageUniforms = 0; + rsc.maxFragmentImageUniforms = 8; + rsc.maxCombinedImageUniforms = 8; + rsc.maxGeometryTextureImageUnits = 16; + rsc.maxGeometryOutputVertices = 256; + rsc.maxGeometryTotalOutputComponents = 1024; + rsc.maxGeometryUniformComponents = 1024; + rsc.maxGeometryVaryingComponents = 64; + rsc.maxTessControlInputComponents = 128; + rsc.maxTessControlOutputComponents = 128; + rsc.maxTessControlTextureImageUnits = 16; + rsc.maxTessControlUniformComponents = 1024; + rsc.maxTessControlTotalOutputComponents = 4096; + rsc.maxTessEvaluationInputComponents = 128; + rsc.maxTessEvaluationOutputComponents = 128; + rsc.maxTessEvaluationTextureImageUnits = 16; + rsc.maxTessEvaluationUniformComponents = 1024; + rsc.maxTessPatchComponents = 120; + rsc.maxPatchVertices = 32; + rsc.maxTessGenLevel = 64; + rsc.maxViewports = 16; + rsc.maxVertexAtomicCounters = 0; + rsc.maxTessControlAtomicCounters = 0; + rsc.maxTessEvaluationAtomicCounters = 0; + rsc.maxGeometryAtomicCounters = 0; + rsc.maxFragmentAtomicCounters = 8; + rsc.maxCombinedAtomicCounters = 8; + rsc.maxAtomicCounterBindings = 1; + rsc.maxVertexAtomicCounterBuffers = 0; + rsc.maxTessControlAtomicCounterBuffers = 0; + rsc.maxTessEvaluationAtomicCounterBuffers = 0; + rsc.maxGeometryAtomicCounterBuffers = 0; + rsc.maxFragmentAtomicCounterBuffers = 1; + rsc.maxCombinedAtomicCounterBuffers = 1; + rsc.maxAtomicCounterBufferSize = 16384; + rsc.maxTransformFeedbackBuffers = 4; + rsc.maxTransformFeedbackInterleavedComponents = 64; + rsc.maxCullDistances = 8; + rsc.maxCombinedClipAndCullDistances = 8; + rsc.maxSamples = 4; + + rsc.limits.nonInductiveForLoops = true; + rsc.limits.whileLoops = true; + rsc.limits.doWhileLoops = true; + rsc.limits.generalUniformIndexing = true; + rsc.limits.generalAttributeMatrixVectorIndexing = true; + rsc.limits.generalVaryingIndexing = true; + rsc.limits.generalSamplerIndexing = true; + rsc.limits.generalVariableIndexing = true; + rsc.limits.generalConstantMatrixVectorIndexing = true; + } + + bool compile_glsl_to_spv(std::vector& spv, std::string& shader, ::glsl::program_domain domain, ::glsl::glsl_rules rules) + { + EShLanguage lang = (domain == ::glsl::glsl_fragment_program) + ? EShLangFragment + : (domain == ::glsl::glsl_vertex_program) + ? EShLangVertex + : EShLangCompute; + + glslang::EShClient client; + glslang::EShTargetClientVersion target_version; + EShMessages msg; + + if (rules == ::glsl::glsl_rules_vulkan) + { + client = glslang::EShClientVulkan; + target_version = glslang::EShTargetClientVersion::EShTargetVulkan_1_0; + msg = static_cast(EShMsgVulkanRules | EShMsgSpvRules | EShMsgEnhanced); + } + else + { + client = glslang::EShClientOpenGL; + target_version = glslang::EShTargetClientVersion::EShTargetOpenGL_450; + msg = static_cast(EShMsgDefault | EShMsgSpvRules | EShMsgEnhanced); + } + + glslang::TProgram program; + glslang::TShader shader_object(lang); + + shader_object.setEnvInput(glslang::EShSourceGlsl, lang, client, 100); + shader_object.setEnvClient(client, target_version); + shader_object.setEnvTarget(glslang::EshTargetSpv, glslang::EShTargetLanguageVersion::EShTargetSpv_1_0); + + bool success = false; + const char* shader_text = shader.data(); + shader_object.setStrings(&shader_text, 1); + + if (shader_object.parse(&g_default_config, 430, EProfile::ECoreProfile, false, true, msg)) + { + program.addShader(&shader_object); + success = program.link(msg); + if (success) + { + glslang::SpvOptions options; + options.disableOptimizer = true; + options.optimizeSize = true; + glslang::GlslangToSpv(*program.getIntermediate(lang), spv, &options); + + // Now we optimize + //spvtools::Optimizer optimizer(SPV_ENV_VULKAN_1_0); + //optimizer.RegisterPass(spvtools::CreateUnifyConstantPass()); // Remove duplicate constants + //optimizer.RegisterPass(spvtools::CreateMergeReturnPass()); // Huge savings in vertex interpreter and likely normal vertex shaders + //optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); // Remove dead code + //optimizer.Run(spv.data(), spv.size(), &spv); + } + } + else + { + rsx_log.error("%s", shader_object.getInfoLog()); + rsx_log.error("%s", shader_object.getInfoDebugLog()); + } + + return success; + } + + void initialize_compiler_context() + { + glslang::InitializeProcess(); + init_default_resources(g_default_config); + } + + void finalize_compiler_context() + { + glslang::FinalizeProcess(); + } +} diff --git a/rpcs3/Emu/RSX/Program/SPIRVCommon.h b/rpcs3/Emu/RSX/Program/SPIRVCommon.h new file mode 100644 index 0000000000..b4dd3364a7 --- /dev/null +++ b/rpcs3/Emu/RSX/Program/SPIRVCommon.h @@ -0,0 +1,15 @@ +#pragma once + +namespace glsl +{ + enum program_domain : unsigned char; + enum glsl_rules : unsigned char; +} + +namespace spirv +{ + bool compile_glsl_to_spv(std::vector& spv, std::string& shader, ::glsl::program_domain domain, ::glsl::glsl_rules rules); + + void initialize_compiler_context(); + void finalize_compiler_context(); +} diff --git a/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp b/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp index a9005d5202..01e5cc07aa 100644 --- a/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp +++ b/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp @@ -1,128 +1,10 @@ #include "stdafx.h" #include "VKCommonDecompiler.h" -#ifdef _MSC_VER -#pragma warning(push, 0) -#else -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wall" -#pragma GCC diagnostic ignored "-Wextra" -#pragma GCC diagnostic ignored "-Wold-style-cast" -#pragma GCC diagnostic ignored "-Wsuggest-override" -#ifdef __clang__ -#pragma clang diagnostic ignored "-Winconsistent-missing-override" -#endif -#endif -#include "SPIRV/GlslangToSpv.h" -#ifdef _MSC_VER -#pragma warning(pop) -#else -#pragma GCC diagnostic pop -#endif - namespace vk { - static TBuiltInResource g_default_config; - - void init_default_resources(TBuiltInResource &rsc) - { - rsc.maxLights = 32; - rsc.maxClipPlanes = 6; - rsc.maxTextureUnits = 32; - rsc.maxTextureCoords = 32; - rsc.maxVertexAttribs = 64; - rsc.maxVertexUniformComponents = 4096; - rsc.maxVaryingFloats = 64; - rsc.maxVertexTextureImageUnits = 32; - rsc.maxCombinedTextureImageUnits = 80; - rsc.maxTextureImageUnits = 32; - rsc.maxFragmentUniformComponents = 4096; - rsc.maxDrawBuffers = 32; - rsc.maxVertexUniformVectors = 128; - rsc.maxVaryingVectors = 8; - rsc.maxFragmentUniformVectors = 16; - rsc.maxVertexOutputVectors = 16; - rsc.maxFragmentInputVectors = 15; - rsc.minProgramTexelOffset = -8; - rsc.maxProgramTexelOffset = 7; - rsc.maxClipDistances = 8; - rsc.maxComputeWorkGroupCountX = 65535; - rsc.maxComputeWorkGroupCountY = 65535; - rsc.maxComputeWorkGroupCountZ = 65535; - rsc.maxComputeWorkGroupSizeX = 1024; - rsc.maxComputeWorkGroupSizeY = 1024; - rsc.maxComputeWorkGroupSizeZ = 64; - rsc.maxComputeUniformComponents = 1024; - rsc.maxComputeTextureImageUnits = 16; - rsc.maxComputeImageUniforms = 8; - rsc.maxComputeAtomicCounters = 8; - rsc.maxComputeAtomicCounterBuffers = 1; - rsc.maxVaryingComponents = 60; - rsc.maxVertexOutputComponents = 64; - rsc.maxGeometryInputComponents = 64; - rsc.maxGeometryOutputComponents = 128; - rsc.maxFragmentInputComponents = 128; - rsc.maxImageUnits = 8; - rsc.maxCombinedImageUnitsAndFragmentOutputs = 8; - rsc.maxCombinedShaderOutputResources = 8; - rsc.maxImageSamples = 0; - rsc.maxVertexImageUniforms = 0; - rsc.maxTessControlImageUniforms = 0; - rsc.maxTessEvaluationImageUniforms = 0; - rsc.maxGeometryImageUniforms = 0; - rsc.maxFragmentImageUniforms = 8; - rsc.maxCombinedImageUniforms = 8; - rsc.maxGeometryTextureImageUnits = 16; - rsc.maxGeometryOutputVertices = 256; - rsc.maxGeometryTotalOutputComponents = 1024; - rsc.maxGeometryUniformComponents = 1024; - rsc.maxGeometryVaryingComponents = 64; - rsc.maxTessControlInputComponents = 128; - rsc.maxTessControlOutputComponents = 128; - rsc.maxTessControlTextureImageUnits = 16; - rsc.maxTessControlUniformComponents = 1024; - rsc.maxTessControlTotalOutputComponents = 4096; - rsc.maxTessEvaluationInputComponents = 128; - rsc.maxTessEvaluationOutputComponents = 128; - rsc.maxTessEvaluationTextureImageUnits = 16; - rsc.maxTessEvaluationUniformComponents = 1024; - rsc.maxTessPatchComponents = 120; - rsc.maxPatchVertices = 32; - rsc.maxTessGenLevel = 64; - rsc.maxViewports = 16; - rsc.maxVertexAtomicCounters = 0; - rsc.maxTessControlAtomicCounters = 0; - rsc.maxTessEvaluationAtomicCounters = 0; - rsc.maxGeometryAtomicCounters = 0; - rsc.maxFragmentAtomicCounters = 8; - rsc.maxCombinedAtomicCounters = 8; - rsc.maxAtomicCounterBindings = 1; - rsc.maxVertexAtomicCounterBuffers = 0; - rsc.maxTessControlAtomicCounterBuffers = 0; - rsc.maxTessEvaluationAtomicCounterBuffers = 0; - rsc.maxGeometryAtomicCounterBuffers = 0; - rsc.maxFragmentAtomicCounterBuffers = 1; - rsc.maxCombinedAtomicCounterBuffers = 1; - rsc.maxAtomicCounterBufferSize = 16384; - rsc.maxTransformFeedbackBuffers = 4; - rsc.maxTransformFeedbackInterleavedComponents = 64; - rsc.maxCullDistances = 8; - rsc.maxCombinedClipAndCullDistances = 8; - rsc.maxSamples = 4; - - rsc.limits.nonInductiveForLoops = true; - rsc.limits.whileLoops = true; - rsc.limits.doWhileLoops = true; - rsc.limits.generalUniformIndexing = true; - rsc.limits.generalAttributeMatrixVectorIndexing = true; - rsc.limits.generalVaryingIndexing = true; - rsc.limits.generalSamplerIndexing = true; - rsc.limits.generalVariableIndexing = true; - rsc.limits.generalConstantMatrixVectorIndexing = true; - } - static constexpr std::array, 18> varying_registers = - {{ + { { { "tc0", 0 }, { "tc1", 1 }, { "tc2", 2 }, @@ -139,7 +21,7 @@ namespace vk { "spec_color1", 13 }, { "fog_c", 14 }, { "fogc", 14 } - }}; + } }; int get_varying_register_location(std::string_view varying_register_name) { @@ -153,61 +35,4 @@ namespace vk fmt::throw_exception("Unknown register name: %s", varying_register_name); } - - bool compile_glsl_to_spv(std::string& shader, program_domain domain, std::vector& spv) - { - EShLanguage lang = (domain == glsl_fragment_program) ? EShLangFragment : - (domain == glsl_vertex_program)? EShLangVertex : EShLangCompute; - - glslang::TProgram program; - glslang::TShader shader_object(lang); - - shader_object.setEnvInput(glslang::EShSourceGlsl, lang, glslang::EShClientVulkan, 100); - shader_object.setEnvClient(glslang::EShClientVulkan, glslang::EShTargetClientVersion::EShTargetVulkan_1_0); - shader_object.setEnvTarget(glslang::EshTargetSpv, glslang::EShTargetLanguageVersion::EShTargetSpv_1_0); - - bool success = false; - const char *shader_text = shader.data(); - - shader_object.setStrings(&shader_text, 1); - - EShMessages msg = static_cast(EShMsgVulkanRules | EShMsgSpvRules); - if (shader_object.parse(&g_default_config, 400, EProfile::ECoreProfile, false, true, msg)) - { - program.addShader(&shader_object); - success = program.link(msg); - if (success) - { - glslang::SpvOptions options; - options.disableOptimizer = true; - options.optimizeSize = true; - glslang::GlslangToSpv(*program.getIntermediate(lang), spv, &options); - - // Now we optimize - //spvtools::Optimizer optimizer(SPV_ENV_VULKAN_1_0); - //optimizer.RegisterPass(spvtools::CreateUnifyConstantPass()); // Remove duplicate constants - //optimizer.RegisterPass(spvtools::CreateMergeReturnPass()); // Huge savings in vertex interpreter and likely normal vertex shaders - //optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); // Remove dead code - //optimizer.Run(spv.data(), spv.size(), &spv); - } - } - else - { - rsx_log.error("%s", shader_object.getInfoLog()); - rsx_log.error("%s", shader_object.getInfoDebugLog()); - } - - return success; - } - - void initialize_compiler_context() - { - glslang::InitializeProcess(); - init_default_resources(g_default_config); - } - - void finalize_compiler_context() - { - glslang::FinalizeProcess(); - } } diff --git a/rpcs3/Emu/RSX/VK/VKCommonDecompiler.h b/rpcs3/Emu/RSX/VK/VKCommonDecompiler.h index 5a28cfd86f..b0920e27f5 100644 --- a/rpcs3/Emu/RSX/VK/VKCommonDecompiler.h +++ b/rpcs3/Emu/RSX/VK/VKCommonDecompiler.h @@ -6,8 +6,4 @@ namespace vk using namespace ::glsl; int get_varying_register_location(std::string_view varying_register_name); - bool compile_glsl_to_spv(std::string& shader, program_domain domain, std::vector &spv); - - void initialize_compiler_context(); - void finalize_compiler_context(); } diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 64dfc85e51..df7e06ac3d 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -18,6 +18,7 @@ #include "Emu/Memory/vm_locking.h" #include "../Program/program_state_cache2.hpp" +#include "../Program/SPIRVCommon.h" #include "util/asm.hpp" @@ -693,7 +694,7 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar) null_buffer = std::make_unique(*m_device, 32, memory_map.device_local, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, 0, VMM_ALLOCATION_POOL_UNDEFINED); null_buffer_view = std::make_unique(*m_device, null_buffer->value, VK_FORMAT_R8_UINT, 0, 32); - vk::initialize_compiler_context(); + spirv::initialize_compiler_context(); vk::initialize_pipe_compiler(g_cfg.video.shader_compiler_threads_count); m_prog_buffer = std::make_unique @@ -918,9 +919,9 @@ VKGSRender::~VKGSRender() m_flush_requests.clear_pending_flag(); // Shaders - vk::destroy_pipe_compiler(); // Ensure no pending shaders being compiled - vk::finalize_compiler_context(); // Shut down the glslang compiler - m_prog_buffer->clear(); // Delete shader objects + vk::destroy_pipe_compiler(); // Ensure no pending shaders being compiled + spirv::finalize_compiler_context(); // Shut down the glslang compiler + m_prog_buffer->clear(); // Delete shader objects m_shader_interpreter.destroy(); m_persistent_attribute_storage.reset(); diff --git a/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp b/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp index 9fca1c58b5..57174caa98 100644 --- a/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp +++ b/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp @@ -2,7 +2,8 @@ #include "VKProgramPipeline.h" #include "vkutils/descriptors.h" #include "vkutils/device.h" -#include + +#include "../Program/SPIRVCommon.h" namespace vk { @@ -20,7 +21,7 @@ namespace vk { ensure(m_handle == VK_NULL_HANDLE); - if (!vk::compile_glsl_to_spv(m_source, type, m_compiled)) + if (!spirv::compile_glsl_to_spv(m_compiled, m_source, type, ::glsl::glsl_rules_vulkan)) { const std::string shader_type = type == ::glsl::program_domain::glsl_vertex_program ? "vertex" : type == ::glsl::program_domain::glsl_fragment_program ? "fragment" : "compute"; diff --git a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp index 1423079e5b..ecd59dc09d 100644 --- a/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp +++ b/rpcs3/Emu/RSX/VK/VKShaderInterpreter.cpp @@ -44,7 +44,7 @@ namespace vk "};\n\n"; ::glsl::insert_glsl_legacy_function(builder, properties); - ::glsl::insert_vertex_input_fetch(builder, ::glsl::glsl_rules::glsl_rules_spirv); + ::glsl::insert_vertex_input_fetch(builder, ::glsl::glsl_rules::glsl_rules_vulkan); builder << program_common::interpreter::get_vertex_interpreter(); const std::string s = builder.str(); diff --git a/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp b/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp index 5b8b7023e8..2faba9d014 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp @@ -211,7 +211,7 @@ void VKVertexDecompilerThread::insertMainStart(std::stringstream & OS) properties2.require_explicit_invariance = (vk::get_driver_vendor() == vk::driver_vendor::NVIDIA && g_cfg.video.shader_precision != gpu_preset_level::low); glsl::insert_glsl_legacy_function(OS, properties2); - glsl::insert_vertex_input_fetch(OS, glsl::glsl_rules_spirv); + glsl::insert_vertex_input_fetch(OS, glsl::glsl_rules_vulkan); // Declare global registers with optional initialization std::string registers; diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index c9eb9904a2..e7f0442c80 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -117,6 +117,7 @@ + @@ -622,6 +623,7 @@ + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 224fc986cb..665e056f92 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -1207,6 +1207,9 @@ Emu\Io + + Emu\GPU\RSX\Program + @@ -2443,6 +2446,9 @@ Emu\Io + + Emu\GPU\RSX\Program +