vk_shader_decompiler: Declare and stub interface for a SPIR-V decompiler
This commit is contained in:
parent
970d9e57c8
commit
ad53b233c5
|
@ -127,6 +127,8 @@ if (ENABLE_VULKAN)
|
||||||
renderer_vulkan/vk_sampler_cache.h
|
renderer_vulkan/vk_sampler_cache.h
|
||||||
renderer_vulkan/vk_scheduler.cpp
|
renderer_vulkan/vk_scheduler.cpp
|
||||||
renderer_vulkan/vk_scheduler.h
|
renderer_vulkan/vk_scheduler.h
|
||||||
|
renderer_vulkan/vk_shader_decompiler.cpp
|
||||||
|
renderer_vulkan/vk_shader_decompiler.h
|
||||||
renderer_vulkan/vk_stream_buffer.cpp
|
renderer_vulkan/vk_stream_buffer.cpp
|
||||||
renderer_vulkan/vk_stream_buffer.h
|
renderer_vulkan/vk_stream_buffer.h
|
||||||
renderer_vulkan/vk_swapchain.cpp
|
renderer_vulkan/vk_swapchain.cpp
|
||||||
|
|
45
src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
Normal file
45
src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
// Copyright 2019 yuzu Emulator Project
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include <sirit/sirit.h>
|
||||||
|
|
||||||
|
#include "common/assert.h"
|
||||||
|
#include "video_core/engines/maxwell_3d.h"
|
||||||
|
#include "video_core/engines/shader_header.h"
|
||||||
|
#include "video_core/renderer_vulkan/vk_shader_decompiler.h"
|
||||||
|
#include "video_core/shader/shader_ir.h"
|
||||||
|
|
||||||
|
namespace Vulkan::VKShader {
|
||||||
|
|
||||||
|
using namespace VideoCommon::Shader;
|
||||||
|
|
||||||
|
using ShaderStage = Tegra::Engines::Maxwell3D::Regs::ShaderStage;
|
||||||
|
|
||||||
|
class SPIRVDecompiler : public Sirit::Module {
|
||||||
|
public:
|
||||||
|
explicit SPIRVDecompiler(const ShaderIR& ir, ShaderStage stage)
|
||||||
|
: Module(0x00010300), ir{ir}, stage{stage}, header{ir.GetHeader()} {}
|
||||||
|
|
||||||
|
void Decompile() {
|
||||||
|
UNIMPLEMENTED();
|
||||||
|
}
|
||||||
|
|
||||||
|
ShaderEntries GetShaderEntries() const {
|
||||||
|
UNIMPLEMENTED();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
const ShaderIR& ir;
|
||||||
|
const ShaderStage stage;
|
||||||
|
const Tegra::Shader::Header header;
|
||||||
|
};
|
||||||
|
|
||||||
|
DecompilerResult Decompile(const VideoCommon::Shader::ShaderIR& ir, Maxwell::ShaderStage stage) {
|
||||||
|
auto decompiler = std::make_unique<SPIRVDecompiler>(ir, stage);
|
||||||
|
decompiler->Decompile();
|
||||||
|
return {std::move(decompiler), decompiler->GetShaderEntries()};
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Vulkan::VKShader
|
80
src/video_core/renderer_vulkan/vk_shader_decompiler.h
Normal file
80
src/video_core/renderer_vulkan/vk_shader_decompiler.h
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
// Copyright 2019 yuzu Emulator Project
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
#include <memory>
|
||||||
|
#include <set>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include <sirit/sirit.h>
|
||||||
|
|
||||||
|
#include "common/common_types.h"
|
||||||
|
#include "video_core/engines/maxwell_3d.h"
|
||||||
|
#include "video_core/shader/shader_ir.h"
|
||||||
|
|
||||||
|
namespace VideoCommon::Shader {
|
||||||
|
class ShaderIR;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Vulkan::VKShader {
|
||||||
|
|
||||||
|
using Maxwell = Tegra::Engines::Maxwell3D::Regs;
|
||||||
|
|
||||||
|
using SamplerEntry = VideoCommon::Shader::Sampler;
|
||||||
|
|
||||||
|
constexpr u32 DESCRIPTOR_SET = 0;
|
||||||
|
|
||||||
|
class ConstBufferEntry : public VideoCommon::Shader::ConstBuffer {
|
||||||
|
public:
|
||||||
|
explicit constexpr ConstBufferEntry(const VideoCommon::Shader::ConstBuffer& entry, u32 index)
|
||||||
|
: VideoCommon::Shader::ConstBuffer{entry}, index{index} {}
|
||||||
|
|
||||||
|
constexpr u32 GetIndex() const {
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
u32 index{};
|
||||||
|
};
|
||||||
|
|
||||||
|
class GlobalBufferEntry {
|
||||||
|
public:
|
||||||
|
explicit GlobalBufferEntry(u32 cbuf_index, u32 cbuf_offset)
|
||||||
|
: cbuf_index{cbuf_index}, cbuf_offset{cbuf_offset} {}
|
||||||
|
|
||||||
|
u32 GetCbufIndex() const {
|
||||||
|
return cbuf_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 GetCbufOffset() const {
|
||||||
|
return cbuf_offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
u32 cbuf_index{};
|
||||||
|
u32 cbuf_offset{};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ShaderEntries {
|
||||||
|
u32 const_buffers_base_binding{};
|
||||||
|
u32 global_buffers_base_binding{};
|
||||||
|
u32 samplers_base_binding{};
|
||||||
|
std::vector<ConstBufferEntry> const_buffers;
|
||||||
|
std::vector<GlobalBufferEntry> global_buffers;
|
||||||
|
std::vector<SamplerEntry> samplers;
|
||||||
|
std::set<u32> attributes;
|
||||||
|
std::array<bool, Maxwell::NumClipDistances> clip_distances{};
|
||||||
|
std::size_t shader_length{};
|
||||||
|
Sirit::Id entry_function{};
|
||||||
|
std::vector<Sirit::Id> interfaces;
|
||||||
|
};
|
||||||
|
|
||||||
|
using DecompilerResult = std::pair<std::unique_ptr<Sirit::Module>, ShaderEntries>;
|
||||||
|
|
||||||
|
DecompilerResult Decompile(const VideoCommon::Shader::ShaderIR& ir, Maxwell::ShaderStage stage);
|
||||||
|
|
||||||
|
} // namespace Vulkan::VKShader
|
Loading…
Reference in a new issue