mirror of
				https://github.com/PancakeTAS/lsfg-vk.git
				synced 2025-10-30 07:01:10 +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
	
	 PancakeTAS
						PancakeTAS