mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-16 07:20:59 +00:00
rsx: Move SPIRV stuff into common code
This commit is contained in:
parent
afcfd81496
commit
4594c912a6
@ -502,6 +502,7 @@ target_sources(rpcs3_emu PRIVATE
|
|||||||
RSX/Program/GLSLCommon.cpp
|
RSX/Program/GLSLCommon.cpp
|
||||||
RSX/Program/program_util.cpp
|
RSX/Program/program_util.cpp
|
||||||
RSX/Program/ProgramStateCache.cpp
|
RSX/Program/ProgramStateCache.cpp
|
||||||
|
RSX/Program/SPIRVCommon.cpp
|
||||||
RSX/Program/VertexProgramDecompiler.cpp
|
RSX/Program/VertexProgramDecompiler.cpp
|
||||||
RSX/Capture/rsx_capture.cpp
|
RSX/Capture/rsx_capture.cpp
|
||||||
RSX/Capture/rsx_replay.cpp
|
RSX/Capture/rsx_replay.cpp
|
||||||
|
@ -118,7 +118,7 @@ namespace glsl
|
|||||||
|
|
||||||
void insert_vertex_input_fetch(std::stringstream& OS, glsl_rules rules, bool glsl4_compliant)
|
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
|
// Actually decode a vertex attribute from a raw byte stream
|
||||||
program_common::define_glsl_constants<int>(OS,
|
program_common::define_glsl_constants<int>(OS,
|
||||||
|
@ -12,7 +12,7 @@ namespace glsl
|
|||||||
enum glsl_rules : unsigned char
|
enum glsl_rules : unsigned char
|
||||||
{
|
{
|
||||||
glsl_rules_opengl4,
|
glsl_rules_opengl4,
|
||||||
glsl_rules_spirv
|
glsl_rules_vulkan
|
||||||
};
|
};
|
||||||
|
|
||||||
struct shader_properties
|
struct shader_properties
|
||||||
|
200
rpcs3/Emu/RSX/Program/SPIRVCommon.cpp
Normal file
200
rpcs3/Emu/RSX/Program/SPIRVCommon.cpp
Normal file
@ -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<u32>& 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<EShMessages>(EShMsgVulkanRules | EShMsgSpvRules | EShMsgEnhanced);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
client = glslang::EShClientOpenGL;
|
||||||
|
target_version = glslang::EShTargetClientVersion::EShTargetOpenGL_450;
|
||||||
|
msg = static_cast<EShMessages>(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();
|
||||||
|
}
|
||||||
|
}
|
15
rpcs3/Emu/RSX/Program/SPIRVCommon.h
Normal file
15
rpcs3/Emu/RSX/Program/SPIRVCommon.h
Normal file
@ -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<u32>& spv, std::string& shader, ::glsl::program_domain domain, ::glsl::glsl_rules rules);
|
||||||
|
|
||||||
|
void initialize_compiler_context();
|
||||||
|
void finalize_compiler_context();
|
||||||
|
}
|
@ -1,128 +1,10 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "VKCommonDecompiler.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
|
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<std::pair<std::string_view, int>, 18> varying_registers =
|
static constexpr std::array<std::pair<std::string_view, int>, 18> varying_registers =
|
||||||
{{
|
{ {
|
||||||
{ "tc0", 0 },
|
{ "tc0", 0 },
|
||||||
{ "tc1", 1 },
|
{ "tc1", 1 },
|
||||||
{ "tc2", 2 },
|
{ "tc2", 2 },
|
||||||
@ -139,7 +21,7 @@ namespace vk
|
|||||||
{ "spec_color1", 13 },
|
{ "spec_color1", 13 },
|
||||||
{ "fog_c", 14 },
|
{ "fog_c", 14 },
|
||||||
{ "fogc", 14 }
|
{ "fogc", 14 }
|
||||||
}};
|
} };
|
||||||
|
|
||||||
int get_varying_register_location(std::string_view varying_register_name)
|
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);
|
fmt::throw_exception("Unknown register name: %s", varying_register_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool compile_glsl_to_spv(std::string& shader, program_domain domain, std::vector<u32>& 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<EShMessages>(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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -6,8 +6,4 @@ namespace vk
|
|||||||
using namespace ::glsl;
|
using namespace ::glsl;
|
||||||
|
|
||||||
int get_varying_register_location(std::string_view varying_register_name);
|
int get_varying_register_location(std::string_view varying_register_name);
|
||||||
bool compile_glsl_to_spv(std::string& shader, program_domain domain, std::vector<u32> &spv);
|
|
||||||
|
|
||||||
void initialize_compiler_context();
|
|
||||||
void finalize_compiler_context();
|
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "Emu/Memory/vm_locking.h"
|
#include "Emu/Memory/vm_locking.h"
|
||||||
|
|
||||||
#include "../Program/program_state_cache2.hpp"
|
#include "../Program/program_state_cache2.hpp"
|
||||||
|
#include "../Program/SPIRVCommon.h"
|
||||||
|
|
||||||
#include "util/asm.hpp"
|
#include "util/asm.hpp"
|
||||||
|
|
||||||
@ -693,7 +694,7 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar)
|
|||||||
null_buffer = std::make_unique<vk::buffer>(*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 = std::make_unique<vk::buffer>(*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<vk::buffer_view>(*m_device, null_buffer->value, VK_FORMAT_R8_UINT, 0, 32);
|
null_buffer_view = std::make_unique<vk::buffer_view>(*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);
|
vk::initialize_pipe_compiler(g_cfg.video.shader_compiler_threads_count);
|
||||||
|
|
||||||
m_prog_buffer = std::make_unique<vk::program_cache>
|
m_prog_buffer = std::make_unique<vk::program_cache>
|
||||||
@ -918,9 +919,9 @@ VKGSRender::~VKGSRender()
|
|||||||
m_flush_requests.clear_pending_flag();
|
m_flush_requests.clear_pending_flag();
|
||||||
|
|
||||||
// Shaders
|
// Shaders
|
||||||
vk::destroy_pipe_compiler(); // Ensure no pending shaders being compiled
|
vk::destroy_pipe_compiler(); // Ensure no pending shaders being compiled
|
||||||
vk::finalize_compiler_context(); // Shut down the glslang compiler
|
spirv::finalize_compiler_context(); // Shut down the glslang compiler
|
||||||
m_prog_buffer->clear(); // Delete shader objects
|
m_prog_buffer->clear(); // Delete shader objects
|
||||||
m_shader_interpreter.destroy();
|
m_shader_interpreter.destroy();
|
||||||
|
|
||||||
m_persistent_attribute_storage.reset();
|
m_persistent_attribute_storage.reset();
|
||||||
|
@ -2,7 +2,8 @@
|
|||||||
#include "VKProgramPipeline.h"
|
#include "VKProgramPipeline.h"
|
||||||
#include "vkutils/descriptors.h"
|
#include "vkutils/descriptors.h"
|
||||||
#include "vkutils/device.h"
|
#include "vkutils/device.h"
|
||||||
#include <string>
|
|
||||||
|
#include "../Program/SPIRVCommon.h"
|
||||||
|
|
||||||
namespace vk
|
namespace vk
|
||||||
{
|
{
|
||||||
@ -20,7 +21,7 @@ namespace vk
|
|||||||
{
|
{
|
||||||
ensure(m_handle == VK_NULL_HANDLE);
|
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" :
|
const std::string shader_type = type == ::glsl::program_domain::glsl_vertex_program ? "vertex" :
|
||||||
type == ::glsl::program_domain::glsl_fragment_program ? "fragment" : "compute";
|
type == ::glsl::program_domain::glsl_fragment_program ? "fragment" : "compute";
|
||||||
|
@ -44,7 +44,7 @@ namespace vk
|
|||||||
"};\n\n";
|
"};\n\n";
|
||||||
|
|
||||||
::glsl::insert_glsl_legacy_function(builder, properties);
|
::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();
|
builder << program_common::interpreter::get_vertex_interpreter();
|
||||||
const std::string s = builder.str();
|
const std::string s = builder.str();
|
||||||
|
@ -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);
|
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_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
|
// Declare global registers with optional initialization
|
||||||
std::string registers;
|
std::string registers;
|
||||||
|
@ -117,6 +117,7 @@
|
|||||||
<ClCompile Include="Emu\RSX\Overlays\Shaders\shader_loading_dialog_native.cpp" />
|
<ClCompile Include="Emu\RSX\Overlays\Shaders\shader_loading_dialog_native.cpp" />
|
||||||
<ClCompile Include="Emu\RSX\Program\ProgramStateCache.cpp" />
|
<ClCompile Include="Emu\RSX\Program\ProgramStateCache.cpp" />
|
||||||
<ClCompile Include="Emu\RSX\Program\program_util.cpp" />
|
<ClCompile Include="Emu\RSX\Program\program_util.cpp" />
|
||||||
|
<ClCompile Include="Emu\RSX\Program\SPIRVCommon.cpp" />
|
||||||
<ClCompile Include="Emu\RSX\RSXDisAsm.cpp" />
|
<ClCompile Include="Emu\RSX\RSXDisAsm.cpp" />
|
||||||
<ClCompile Include="Emu\RSX\RSXZCULL.cpp" />
|
<ClCompile Include="Emu\RSX\RSXZCULL.cpp" />
|
||||||
<ClCompile Include="Emu\RSX\rsx_vertex_data.cpp" />
|
<ClCompile Include="Emu\RSX\rsx_vertex_data.cpp" />
|
||||||
@ -622,6 +623,7 @@
|
|||||||
<ClInclude Include="Emu\RSX\Overlays\overlay_utils.h" />
|
<ClInclude Include="Emu\RSX\Overlays\overlay_utils.h" />
|
||||||
<ClInclude Include="Emu\RSX\Overlays\Shaders\shader_loading_dialog.h" />
|
<ClInclude Include="Emu\RSX\Overlays\Shaders\shader_loading_dialog.h" />
|
||||||
<ClInclude Include="Emu\RSX\Overlays\Shaders\shader_loading_dialog_native.h" />
|
<ClInclude Include="Emu\RSX\Overlays\Shaders\shader_loading_dialog_native.h" />
|
||||||
|
<ClInclude Include="Emu\RSX\Program\SPIRVCommon.h" />
|
||||||
<ClInclude Include="Emu\RSX\RSXDisAsm.h" />
|
<ClInclude Include="Emu\RSX\RSXDisAsm.h" />
|
||||||
<ClInclude Include="Emu\RSX\RSXZCULL.h" />
|
<ClInclude Include="Emu\RSX\RSXZCULL.h" />
|
||||||
<ClInclude Include="Emu\savestate_utils.hpp" />
|
<ClInclude Include="Emu\savestate_utils.hpp" />
|
||||||
|
@ -1207,6 +1207,9 @@
|
|||||||
<ClCompile Include="Emu\Io\rb3drums_config.cpp">
|
<ClCompile Include="Emu\Io\rb3drums_config.cpp">
|
||||||
<Filter>Emu\Io</Filter>
|
<Filter>Emu\Io</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="Emu\RSX\Program\SPIRVCommon.cpp">
|
||||||
|
<Filter>Emu\GPU\RSX\Program</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="Crypto\aes.h">
|
<ClInclude Include="Crypto\aes.h">
|
||||||
@ -2443,6 +2446,9 @@
|
|||||||
<ClInclude Include="Input\raw_mouse_config.h">
|
<ClInclude Include="Input\raw_mouse_config.h">
|
||||||
<Filter>Emu\Io</Filter>
|
<Filter>Emu\Io</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="Emu\RSX\Program\SPIRVCommon.h">
|
||||||
|
<Filter>Emu\GPU\RSX\Program</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Emu\RSX\Program\GLSLSnippets\GPUDeswizzle.glsl">
|
<None Include="Emu\RSX\Program\GLSLSnippets\GPUDeswizzle.glsl">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user