mirror of
https://github.com/PancakeTAS/lsfg-vk.git
synced 2026-04-22 10:21:43 +00:00
get rid of full dxvk
This commit is contained in:
parent
3ec418fd0f
commit
6a6465e12e
4 changed files with 87 additions and 75 deletions
|
|
@ -11,7 +11,7 @@ endif()
|
|||
|
||||
# subprojects
|
||||
|
||||
include(cmake/FetchDXVK.cmake)
|
||||
include(cmake/FetchDXBC.cmake)
|
||||
include(cmake/FetchPeParse.cmake)
|
||||
|
||||
add_subdirectory(lsfg-vk-common)
|
||||
|
|
@ -41,7 +41,7 @@ target_include_directories(lsfg-vk
|
|||
PRIVATE include)
|
||||
target_link_libraries(lsfg-vk PRIVATE
|
||||
lsfg-vk-common lsfg-vk-v3.1 lsfg-vk-v3.1p
|
||||
peparse dxvk vulkan)
|
||||
peparse dxvk_dxbc vulkan)
|
||||
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Release")
|
||||
set_target_properties(lsfg-vk PROPERTIES
|
||||
|
|
|
|||
33
cmake/FetchDXBC.cmake
Normal file
33
cmake/FetchDXBC.cmake
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
include(ExternalProject)
|
||||
|
||||
ExternalProject_Add(dxbc_git
|
||||
GIT_REPOSITORY "https://github.com/PancakeTAS/dxbc"
|
||||
GIT_TAG "d77124f"
|
||||
UPDATE_DISCONNECTED true
|
||||
USES_TERMINAL_CONFIGURE true
|
||||
USES_TERMINAL_BUILD true
|
||||
BUILD_IN_SOURCE true
|
||||
CONFIGURE_COMMAND
|
||||
cmake -S . -B build -G Ninja
|
||||
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
|
||||
-DCMAKE_C_COMPILER=clang
|
||||
-DCMAKE_CXX_COMPILER=clang++
|
||||
-DCMAKE_C_FLAGS=-fPIC
|
||||
-DCMAKE_CXX_FLAGS=-fPIC
|
||||
BUILD_COMMAND
|
||||
ninja -C build
|
||||
INSTALL_COMMAND ""
|
||||
)
|
||||
|
||||
ExternalProject_Get_Property(dxbc_git SOURCE_DIR)
|
||||
|
||||
add_library(dxvk_dxbc INTERFACE)
|
||||
add_dependencies(dxvk_dxbc dxbc_git)
|
||||
|
||||
target_link_directories(dxvk_dxbc
|
||||
INTERFACE ${SOURCE_DIR}/build)
|
||||
target_include_directories(dxvk_dxbc SYSTEM
|
||||
INTERFACE ${SOURCE_DIR}/include/dxbc
|
||||
INTERFACE ${SOURCE_DIR}/include/spirv ${SOURCE_DIR}/include/util ${SOURCE_DIR}/include/dxvk)
|
||||
target_link_libraries(dxvk_dxbc
|
||||
INTERFACE dxbc)
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
include(ExternalProject)
|
||||
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Release")
|
||||
set(BUILD_TYPE "release")
|
||||
set(STRIP_FLAG "--strip")
|
||||
else()
|
||||
set(BUILD_TYPE "debug")
|
||||
set(STRIP_FLAG "")
|
||||
endif()
|
||||
|
||||
ExternalProject_Add(dxvk_git
|
||||
GIT_REPOSITORY "https://github.com/doitsujin/dxvk"
|
||||
GIT_TAG "v2.6.2"
|
||||
UPDATE_DISCONNECTED true
|
||||
USES_TERMINAL_CONFIGURE true
|
||||
USES_TERMINAL_BUILD true
|
||||
BUILD_IN_SOURCE true
|
||||
CONFIGURE_COMMAND
|
||||
sed -i s/private://g
|
||||
src/dxvk/dxvk_shader.h &&
|
||||
CC=clang CXX=clang++ CFLAGS=-w CXXFLAGS=-w
|
||||
meson setup
|
||||
--buildtype ${BUILD_TYPE}
|
||||
--prefix <SOURCE_DIR>/build-native
|
||||
${STRIP_FLAG}
|
||||
-Dbuild_id=false
|
||||
-Denable_d3d8=false
|
||||
-Denable_d3d9=false
|
||||
-Denable_d3d10=false
|
||||
--force-fallback-for=libdisplay-info
|
||||
--wipe
|
||||
build
|
||||
BUILD_COMMAND
|
||||
ninja -C build install &&
|
||||
mv build/src/dxvk/libdxvk.a build/src/dxvk/libldxvk.a &&
|
||||
cd build/src/dxgi/libdxvk_dxgi.so.0.20602.p &&
|
||||
bash -c "ar rcs -o ../libdxgi.a *.o" &&
|
||||
cd ../../d3d11/libdxvk_d3d11.so.0.20602.p &&
|
||||
bash -c "ar rcs -o ../libd3d11.a *.o .*.o"
|
||||
INSTALL_COMMAND ""
|
||||
)
|
||||
|
||||
ExternalProject_Get_Property(dxvk_git SOURCE_DIR)
|
||||
|
||||
add_library(dxvk INTERFACE)
|
||||
add_dependencies(dxvk dxvk_git)
|
||||
|
||||
target_link_directories(dxvk
|
||||
INTERFACE ${SOURCE_DIR}/build/src/dxvk
|
||||
INTERFACE ${SOURCE_DIR}/build/src/dxbc
|
||||
INTERFACE ${SOURCE_DIR}/build/src/dxgi
|
||||
INTERFACE ${SOURCE_DIR}/build/src/d3d11
|
||||
INTERFACE ${SOURCE_DIR}/build/src/spirv
|
||||
INTERFACE ${SOURCE_DIR}/build/src/util)
|
||||
target_include_directories(dxvk SYSTEM
|
||||
INTERFACE ${SOURCE_DIR}/build-native/include/dxvk
|
||||
INTERFACE ${SOURCE_DIR}/src
|
||||
INTERFACE ${SOURCE_DIR}/include/spirv/include)
|
||||
target_link_libraries(dxvk INTERFACE
|
||||
-Wl,--start-group dxgi d3d11 util ldxvk dxbc spirv -Wl,--end-group)
|
||||
|
|
@ -1,8 +1,10 @@
|
|||
#include "extract/trans.hpp"
|
||||
|
||||
#include <dxbc/dxbc_modinfo.h>
|
||||
#include <dxbc/dxbc_module.h>
|
||||
#include <dxbc/dxbc_reader.h>
|
||||
#include <spirv/unified1/spirv.hpp>
|
||||
|
||||
#include <dxbc_modinfo.h>
|
||||
#include <dxbc_module.h>
|
||||
#include <dxbc_reader.h>
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstddef>
|
||||
|
|
@ -11,23 +13,60 @@
|
|||
|
||||
using namespace Extract;
|
||||
|
||||
struct BindingOffsets {
|
||||
uint32_t bindingIndex{};
|
||||
uint32_t bindingOffset{};
|
||||
uint32_t setIndex{};
|
||||
uint32_t setOffset{};
|
||||
};
|
||||
|
||||
std::vector<uint8_t> Extract::translateShader(std::vector<uint8_t> bytecode) {
|
||||
// compile the shader
|
||||
dxvk::DxbcReader reader(reinterpret_cast<const char*>(bytecode.data()), bytecode.size());
|
||||
dxvk::DxbcModule module(reader);
|
||||
const dxvk::DxbcModuleInfo info{};
|
||||
auto shader = module.compile(info, "CS");
|
||||
auto code = module.compile(info, "CS");
|
||||
|
||||
// extract spir-v from d3d11 shader
|
||||
auto code = shader->getRawCode();
|
||||
// find all bindings
|
||||
std::vector<BindingOffsets> bindingOffsets;
|
||||
std::vector<uint32_t> varIds;
|
||||
for (auto ins : code) {
|
||||
if (ins.opCode() == spv::OpDecorate) {
|
||||
if (ins.arg(2) == spv::DecorationBinding) {
|
||||
const uint32_t varId = ins.arg(1);
|
||||
bindingOffsets.resize(std::max(bindingOffsets.size(), size_t(varId + 1)));
|
||||
bindingOffsets[varId].bindingIndex = ins.arg(3);
|
||||
bindingOffsets[varId].bindingOffset = ins.offset() + 3;
|
||||
varIds.push_back(varId);
|
||||
}
|
||||
|
||||
// patch binding offsets
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
|
||||
for (size_t i = 0; i < shader->m_bindingOffsets.size(); i++)
|
||||
code.data()[shader->m_bindingOffsets.at(i).bindingOffset] // NOLINT
|
||||
= static_cast<uint8_t>(i);
|
||||
#pragma clang diagnostic pop
|
||||
if (ins.arg(2) == spv::DecorationDescriptorSet) {
|
||||
const uint32_t varId = ins.arg(1);
|
||||
bindingOffsets.resize(std::max(bindingOffsets.size(), size_t(varId + 1)));
|
||||
bindingOffsets[varId].setIndex = ins.arg(3);
|
||||
bindingOffsets[varId].setOffset = ins.offset() + 3;
|
||||
}
|
||||
}
|
||||
|
||||
if (ins.opCode() == spv::OpFunction)
|
||||
break;
|
||||
}
|
||||
|
||||
std::vector<BindingOffsets> validBindings;
|
||||
for (const auto varId : varIds) {
|
||||
auto info = bindingOffsets[varId];
|
||||
|
||||
if (info.bindingOffset)
|
||||
validBindings.push_back(info);
|
||||
}
|
||||
|
||||
// patch binding offset
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
|
||||
for (size_t i = 0; i < validBindings.size(); i++)
|
||||
code.data()[validBindings.at(i).bindingOffset] // NOLINT
|
||||
= static_cast<uint8_t>(i);
|
||||
#pragma clang diagnostic pop
|
||||
|
||||
// return the new bytecode
|
||||
std::vector<uint8_t> spirvBytecode(code.size());
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue