From 72a87093c55923ed29279f4cd44a294876b2438e Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 18 Oct 2017 09:50:30 +0200 Subject: [PATCH] [dxvk] Moved some SPIR-V bits to separate directory --- src/dxbc/dxbc_compiler.cpp | 48 +++++++++++-------- src/dxbc/dxbc_compiler.h | 3 +- src/dxvk/dxvk_shader.h | 4 +- src/dxvk/meson.build | 4 +- src/meson.build | 1 + src/spirv/meson.build | 6 +++ .../spirv_code_buffer.cpp} | 2 +- .../spirv_code_buffer.h} | 2 +- .../spirv_id_counter.h} | 2 +- src/spirv/spirv_include.h | 11 +++++ .../spirv_instruction.h} | 2 +- tests/dxbc/test_dxbc_compiler.cpp | 2 +- 12 files changed, 56 insertions(+), 31 deletions(-) create mode 100644 src/spirv/meson.build rename src/{dxvk/spirv/dxvk_spirv_code_buffer.cpp => spirv/spirv_code_buffer.cpp} (98%) rename src/{dxvk/spirv/dxvk_spirv_code_buffer.h => spirv/spirv_code_buffer.h} (99%) rename src/{dxvk/spirv/dxvk_spirv_id_counter.h => spirv/spirv_id_counter.h} (93%) create mode 100644 src/spirv/spirv_include.h rename src/{dxvk/spirv/dxvk_spirv_instruction.h => spirv/spirv_instruction.h} (98%) diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 63da715d..aef278a6 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -4,26 +4,8 @@ namespace dxvk { DxbcCompiler::DxbcCompiler(DxbcProgramVersion version) : m_version(version) { - m_spvCapabilities.enable(spv::CapabilityShader); - - m_spvEntryPoints.setMemoryModel( - spv::AddressingModelLogical, - spv::MemoryModelGLSL450); - - auto id = m_counter.nextId(); - m_spvEntryPoints.addEntryPoint(id, - spv::ExecutionModelGLCompute, - "main", 0, nullptr); - m_spvEntryPoints.setLocalSize(id, 64, 1, 1); - auto ft = m_spvTypeInfo.typeFunction(m_counter, - m_spvTypeInfo.typeVoid(m_counter), 0, nullptr); - m_spvCode.putIns (spv::OpFunction, 5); - m_spvCode.putWord (m_spvTypeInfo.typeVoid(m_counter)); - m_spvCode.putWord (id); - m_spvCode.putWord (0); - m_spvCode.putWord (ft); - m_spvCode.putIns (spv::OpFunctionEnd, 1); - m_entryPointId = m_counter.nextId(); + this->declareCapabilities(); + this->declareMemoryModel(); } @@ -50,4 +32,30 @@ namespace dxvk { std::move(codeBuffer), 0, nullptr); } + + void DxbcCompiler::declareCapabilities() { + m_spvCapabilities.enable(spv::CapabilityShader); + + switch (m_version.type()) { + case DxbcProgramType::GeometryShader: + m_spvCapabilities.enable(spv::CapabilityGeometry); + break; + + case DxbcProgramType::HullShader: + case DxbcProgramType::DomainShader: + m_spvCapabilities.enable(spv::CapabilityTessellation); + break; + + default: + break; + } + } + + + void DxbcCompiler::declareMemoryModel() { + m_spvEntryPoints.setMemoryModel( + spv::AddressingModelLogical, + spv::MemoryModelGLSL450); + } + } \ No newline at end of file diff --git a/src/dxbc/dxbc_compiler.h b/src/dxbc/dxbc_compiler.h index 107d1bfb..0cf6760b 100644 --- a/src/dxbc/dxbc_compiler.h +++ b/src/dxbc/dxbc_compiler.h @@ -43,7 +43,8 @@ namespace dxvk { DxbcTypeInfo m_spvTypeInfo; DxvkSpirvCodeBuffer m_spvCode; - uint32_t m_entryPointId = 0; + void declareCapabilities(); + void declareMemoryModel(); }; diff --git a/src/dxvk/dxvk_shader.h b/src/dxvk/dxvk_shader.h index 45f5617c..5da82b48 100644 --- a/src/dxvk/dxvk_shader.h +++ b/src/dxvk/dxvk_shader.h @@ -4,8 +4,8 @@ #include "dxvk_include.h" -#include "./spirv/dxvk_spirv_code_buffer.h" -#include "./spirv/dxvk_spirv_id_counter.h" +#include "../spirv/spirv_code_buffer.h" +#include "../spirv/spirv_id_counter.h" namespace dxvk { diff --git a/src/dxvk/meson.build b/src/dxvk/meson.build index 86155f30..7f32640f 100644 --- a/src/dxvk/meson.build +++ b/src/dxvk/meson.build @@ -25,8 +25,6 @@ dxvk_src = files([ 'dxvk_sync.cpp', 'dxvk_util.cpp', - 'spirv/dxvk_spirv_code_buffer.cpp', - 'vulkan/dxvk_vulkan_extensions.cpp', 'vulkan/dxvk_vulkan_loader.cpp', 'vulkan/dxvk_vulkan_names.cpp', @@ -35,7 +33,7 @@ dxvk_src = files([ thread_dep = dependency('threads') dxvk_lib = static_library('dxvk', dxvk_src, - link_with : [ util_lib ], + link_with : [ util_lib, spirv_lib ], dependencies : [ thread_dep, lib_vulkan, lib_sdl2 ], include_directories : [ dxvk_include_path ]) diff --git a/src/meson.build b/src/meson.build index 84a5d1ef..c65c8fdd 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,4 +1,5 @@ subdir('util') +subdir('spirv') subdir('dxvk') subdir('dxgi') subdir('dxbc') diff --git a/src/spirv/meson.build b/src/spirv/meson.build new file mode 100644 index 00000000..252e836f --- /dev/null +++ b/src/spirv/meson.build @@ -0,0 +1,6 @@ +spirv_src = files([ + 'spirv_code_buffer.cpp' +]) + +spirv_lib = static_library('spirv', spirv_src, + include_directories : [ dxvk_include_path ]) diff --git a/src/dxvk/spirv/dxvk_spirv_code_buffer.cpp b/src/spirv/spirv_code_buffer.cpp similarity index 98% rename from src/dxvk/spirv/dxvk_spirv_code_buffer.cpp rename to src/spirv/spirv_code_buffer.cpp index a2edb5c2..8936ff0e 100644 --- a/src/dxvk/spirv/dxvk_spirv_code_buffer.cpp +++ b/src/spirv/spirv_code_buffer.cpp @@ -1,7 +1,7 @@ #include #include -#include "dxvk_spirv_code_buffer.h" +#include "spirv_code_buffer.h" namespace dxvk { diff --git a/src/dxvk/spirv/dxvk_spirv_code_buffer.h b/src/spirv/spirv_code_buffer.h similarity index 99% rename from src/dxvk/spirv/dxvk_spirv_code_buffer.h rename to src/spirv/spirv_code_buffer.h index b7418845..c0a6f98d 100644 --- a/src/dxvk/spirv/dxvk_spirv_code_buffer.h +++ b/src/spirv/spirv_code_buffer.h @@ -5,7 +5,7 @@ #include #include -#include "dxvk_spirv_instruction.h" +#include "spirv_instruction.h" namespace dxvk { diff --git a/src/dxvk/spirv/dxvk_spirv_id_counter.h b/src/spirv/spirv_id_counter.h similarity index 93% rename from src/dxvk/spirv/dxvk_spirv_id_counter.h rename to src/spirv/spirv_id_counter.h index dfa2d968..19d0eb2d 100644 --- a/src/dxvk/spirv/dxvk_spirv_id_counter.h +++ b/src/spirv/spirv_id_counter.h @@ -1,6 +1,6 @@ #pragma once -#include "../dxvk_include.h" +#include "spirv_include.h" namespace dxvk { diff --git a/src/spirv/spirv_include.h b/src/spirv/spirv_include.h new file mode 100644 index 00000000..b38fbbd1 --- /dev/null +++ b/src/spirv/spirv_include.h @@ -0,0 +1,11 @@ +#pragma once + +#include "../util/log/log.h" +#include "../util/log/log_debug.h" + +#include "../util/util_error.h" +#include "../util/util_flags.h" +#include "../util/util_string.h" + +#include "../util/rc/util_rc.h" +#include "../util/rc/util_rc_ptr.h" diff --git a/src/dxvk/spirv/dxvk_spirv_instruction.h b/src/spirv/spirv_instruction.h similarity index 98% rename from src/dxvk/spirv/dxvk_spirv_instruction.h rename to src/spirv/spirv_instruction.h index fddc8e03..17e5d01e 100644 --- a/src/dxvk/spirv/dxvk_spirv_instruction.h +++ b/src/spirv/spirv_instruction.h @@ -2,7 +2,7 @@ #include -#include "../dxvk_include.h" +#include "spirv_include.h" namespace dxvk { diff --git a/tests/dxbc/test_dxbc_compiler.cpp b/tests/dxbc/test_dxbc_compiler.cpp index ddbc4bac..8c303277 100644 --- a/tests/dxbc/test_dxbc_compiler.cpp +++ b/tests/dxbc/test_dxbc_compiler.cpp @@ -1,8 +1,8 @@ #include #include -#include #include +#include #include #include