[SPIR-V] Some initial bits of the translator
This commit is contained in:
@@ -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") {
|
||||
|
||||
Reference in New Issue
Block a user