[SPIR-V] Some initial bits of the translator

This commit is contained in:
Triang3l
2020-10-11 20:22:15 +03:00
parent 3a308dedb3
commit b3339d7e46
3 changed files with 261 additions and 3 deletions

View File

@@ -9,9 +9,12 @@
#include <cinttypes>
#include <cstring>
#include <sstream>
#include <string>
#include <utility>
#include <vector>
#include "third_party/glslang/SPIRV/disassemble.h"
#include "xenia/base/cvar.h"
#include "xenia/base/logging.h"
#include "xenia/base/main.h"
@@ -19,6 +22,7 @@
#include "xenia/base/string.h"
#include "xenia/gpu/dxbc_shader_translator.h"
#include "xenia/gpu/shader_translator.h"
#include "xenia/gpu/spirv_shader_translator.h"
// For D3DDisassemble:
#if XE_PLATFORM_WIN32
@@ -31,7 +35,8 @@ DEFINE_string(shader_input_type, "",
"GPU");
DEFINE_path(shader_output, "", "Output shader file path.", "GPU");
DEFINE_string(shader_output_type, "ucode",
"Translator to use: [ucode, dxbc, dxbctext].", "GPU");
"Translator to use: [ucode, spirv, spirvtext, dxbc, dxbctext].",
"GPU");
DEFINE_string(
vertex_shader_output_type, "",
"Type of the host interface to produce the vertex or domain shader for: "
@@ -102,8 +107,11 @@ int shader_compiler_main(const std::vector<std::string>& args) {
shader_type, ucode_data_hash, ucode_dwords.data(), ucode_dwords.size());
std::unique_ptr<ShaderTranslator> translator;
if (cvars::shader_output_type == "dxbc" ||
cvars::shader_output_type == "dxbctext") {
if (cvars::shader_output_type == "spirv" ||
cvars::shader_output_type == "spirvtext") {
translator = std::make_unique<SpirvShaderTranslator>();
} else if (cvars::shader_output_type == "dxbc" ||
cvars::shader_output_type == "dxbctext") {
translator = std::make_unique<DxbcShaderTranslator>(
0, cvars::shader_output_bindless_resources,
cvars::shader_output_dxbc_rov);
@@ -140,6 +148,20 @@ int shader_compiler_main(const std::vector<std::string>& args) {
const void* source_data = shader->translated_binary().data();
size_t source_data_size = shader->translated_binary().size();
std::string spirv_disasm;
if (cvars::shader_output_type == "spirvtext") {
std::ostringstream spirv_disasm_stream;
std::vector<unsigned int> spirv_source;
spirv_source.reserve(source_data_size / sizeof(unsigned int));
spirv_source.insert(spirv_source.cend(),
reinterpret_cast<const unsigned int*>(source_data),
reinterpret_cast<const unsigned int*>(source_data) +
source_data_size / sizeof(unsigned int));
spv::Disassemble(spirv_disasm_stream, spirv_source);
spirv_disasm = std::move(spirv_disasm_stream.str());
source_data = spirv_disasm.c_str();
source_data_size = spirv_disasm.size();
}
#if XE_PLATFORM_WIN32
ID3DBlob* dxbc_disasm_blob = nullptr;
if (cvars::shader_output_type == "dxbctext") {