Deprecate DLL precaching support. It has bitrotted and should be reimplemented with support from the Reactor back-end if needed again. Bug swiftshader:10 Change-Id: Ie926903ccd8117e91b9d13bf031a7b88287e7276 Reviewed-on: https://swiftshader-review.googlesource.com/7250 Tested-by: Nicolas Capens <capn@google.com> Reviewed-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt index d8cd924..c147ac9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -677,8 +677,6 @@ ${SOURCE_DIR}/Main/FrameBufferGDI.hpp ${SOURCE_DIR}/Main/FrameBufferWin.cpp ${SOURCE_DIR}/Main/FrameBufferWin.hpp - ${SOURCE_DIR}/Reactor/DLL.cpp - ${SOURCE_DIR}/Reactor/DLL.hpp ) list(APPEND OPENGL_COMPILER_LIST ${OPENGL_COMPILER_DIR}/ossource_win.cpp) list(APPEND EGL_LIST ${OPENGL_DIR}/libEGL/libEGL.rc)
diff --git a/src/Reactor/BUILD.gn b/src/Reactor/BUILD.gn index baba9c0..0e3e8f4 100644 --- a/src/Reactor/BUILD.gn +++ b/src/Reactor/BUILD.gn
@@ -47,7 +47,6 @@ ] if (is_win) { - sources += [ "DLL.cpp" ] configs -= [ "//build/config/win:unicode" ] }
diff --git a/src/Reactor/DLL.cpp b/src/Reactor/DLL.cpp deleted file mode 100644 index b6d6d1e..0000000 --- a/src/Reactor/DLL.cpp +++ /dev/null
@@ -1,381 +0,0 @@ -// Copyright 2016 The SwiftShader Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "DLL.hpp" - -#include <time.h> - -#ifndef IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE -#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040 -#endif - -#ifndef IMAGE_DLLCHARACTERISTICS_NX_COMPAT -#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100 -#endif - -namespace sw -{ - #ifdef _M_AMD64 - const bool AMD64 = true; - #else - const bool AMD64 = false; - #endif - - DLL::DLL(const char *name, const void *constants, int constSize) : constants(constants), constSize(constSize) - { - dllName = new char[strlen(name) + 1]; - strcpy(dllName, name); - - codeSize = 0; - } - - DLL::~DLL() - { - delete[] dllName; - - for(FunctionList::iterator i = functionList.begin(); i != functionList.end(); i++) - { - delete i->second; - } - } - - void DLL::addFunction(const void *function, const void *entry, int size) - { - functionOrder.push_back(function); - functionList[function] = new Function(codeSize, function, entry, size); - - codeSize += size; - } - - void DLL::addRelocation(const void *function, const void *address, bool ripRelative) - { - globalRelocations[function].push_back(Relocation((unsigned int)((unsigned char*)address - (unsigned char*)function), ripRelative)); - } - - void DLL::emit() - { - if(codeSize == 0) - { - return; - } - - for(GlobalRelocations::iterator i = globalRelocations.begin(); i != globalRelocations.end(); i++) - { - const unsigned char *function = (const unsigned char*)i->first; - const std::vector<Relocation> &functionRelocations = i->second; - unsigned int location = functionList[function]->location; - - for(unsigned int j = 0; j < functionRelocations.size(); j++) - { - unsigned int address = location + functionRelocations[j].offset; - unsigned int page = address / 0x1000; - unsigned short reloc = address - page * 0x1000; - - unsigned int relocType = AMD64 ? IMAGE_REL_BASED_DIR64 : IMAGE_REL_BASED_HIGHLOW; - pageRelocations[page].push_back((relocType << 12) | reloc); - } - } - - if(pageRelocations.empty()) - { - pageRelocations[0]; // Initialize an emtpy list - } - - int relocSize = 0; - - for(PageRelocations::iterator i = pageRelocations.begin(); i != pageRelocations.end(); i++) - { - if(i->second.size() % 2) // Pad to align to DWORD - { - i->second.push_back(0); - } - - relocSize += (int)sizeof(IMAGE_BASE_RELOCATION) + (int)i->second.size() * (int)sizeof(unsigned short); - } - - unsigned long timeDateStamp = (unsigned long)time(0); - - memset(&DOSheader, 0, sizeof(DOSheader)); - DOSheader.e_magic = IMAGE_DOS_SIGNATURE; // "MZ" - DOSheader.e_lfanew = sizeof(DOSheader); - - int base = 0x10000000; - int codePage = pageAlign(sizeof(DOSheader) + (AMD64 ? sizeof(COFFheader64) : sizeof(COFFheader32))); - int exportsPage = codePage + pageAlign(codeSize); - int exportsSize = (int)(sizeof(IMAGE_EXPORT_DIRECTORY) + functionList.size() * sizeof(void*) + (strlen(dllName) + 1)); - int relocPage = exportsPage + pageAlign(exportsSize); - int constPage = relocPage + pageAlign(relocSize); - - if(!AMD64) - { - memset(&COFFheader32, 0, sizeof(COFFheader32)); - COFFheader32.Signature = IMAGE_NT_SIGNATURE; // "PE" - COFFheader32.FileHeader.Machine = IMAGE_FILE_MACHINE_I386; - COFFheader32.FileHeader.NumberOfSections = 4; - COFFheader32.FileHeader.TimeDateStamp = timeDateStamp; - COFFheader32.FileHeader.PointerToSymbolTable = 0; // Deprecated COFF symbol table - COFFheader32.FileHeader.NumberOfSymbols = 0; - COFFheader32.FileHeader.SizeOfOptionalHeader = sizeof(IMAGE_OPTIONAL_HEADER32); - COFFheader32.FileHeader.Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE | - IMAGE_FILE_32BIT_MACHINE | - IMAGE_FILE_DLL; - - COFFheader32.OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR32_MAGIC; - COFFheader32.OptionalHeader.MajorLinkerVersion = 8; - COFFheader32.OptionalHeader.MinorLinkerVersion = 0; - COFFheader32.OptionalHeader.SizeOfCode = fileAlign(codeSize); - COFFheader32.OptionalHeader.SizeOfInitializedData = fileAlign(exportsSize) + fileAlign(relocSize) + fileAlign(constSize); - COFFheader32.OptionalHeader.SizeOfUninitializedData = 0; - COFFheader32.OptionalHeader.AddressOfEntryPoint = 0; - COFFheader32.OptionalHeader.BaseOfCode = codePage; - COFFheader32.OptionalHeader.BaseOfData = exportsPage; - - COFFheader32.OptionalHeader.ImageBase = base; - COFFheader32.OptionalHeader.SectionAlignment = 0x1000; - COFFheader32.OptionalHeader.FileAlignment = 0x200; - COFFheader32.OptionalHeader.MajorOperatingSystemVersion = 4; - COFFheader32.OptionalHeader.MinorOperatingSystemVersion = 0; - COFFheader32.OptionalHeader.MajorImageVersion = 0; - COFFheader32.OptionalHeader.MinorImageVersion = 0; - COFFheader32.OptionalHeader.MajorSubsystemVersion = 4; - COFFheader32.OptionalHeader.MinorSubsystemVersion = 0; - COFFheader32.OptionalHeader.Win32VersionValue = 0; - COFFheader32.OptionalHeader.SizeOfImage = constPage + pageAlign(constSize); - COFFheader32.OptionalHeader.SizeOfHeaders = fileAlign(sizeof(DOSheader) + sizeof(COFFheader32)); - COFFheader32.OptionalHeader.CheckSum = 0; - COFFheader32.OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI; - COFFheader32.OptionalHeader.DllCharacteristics = IMAGE_DLLCHARACTERISTICS_NO_SEH | - IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE | // Base address randomization - IMAGE_DLLCHARACTERISTICS_NX_COMPAT; // Data Execution Prevention compatible - COFFheader32.OptionalHeader.SizeOfStackReserve = 1024 * 1024; - COFFheader32.OptionalHeader.SizeOfStackCommit = 4 * 1024; - COFFheader32.OptionalHeader.SizeOfHeapReserve = 1024 * 1024; - COFFheader32.OptionalHeader.SizeOfHeapCommit = 4 * 1024; - COFFheader32.OptionalHeader.LoaderFlags = 0; - COFFheader32.OptionalHeader.NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES; - - COFFheader32.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = exportsPage; - COFFheader32.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size = exportsSize; - - COFFheader32.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = relocPage; - COFFheader32.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size = relocSize; - } - else - { - memset(&COFFheader64, 0, sizeof(COFFheader64)); - COFFheader64.Signature = IMAGE_NT_SIGNATURE; // "PE" - COFFheader64.FileHeader.Machine = IMAGE_FILE_MACHINE_AMD64; - COFFheader64.FileHeader.NumberOfSections = 4; - COFFheader64.FileHeader.TimeDateStamp = timeDateStamp; - COFFheader64.FileHeader.PointerToSymbolTable = 0; // Deprecated COFF symbol table - COFFheader64.FileHeader.NumberOfSymbols = 0; - COFFheader64.FileHeader.SizeOfOptionalHeader = sizeof(IMAGE_OPTIONAL_HEADER64); - COFFheader64.FileHeader.Characteristics = IMAGE_FILE_EXECUTABLE_IMAGE | - IMAGE_FILE_LARGE_ADDRESS_AWARE | - IMAGE_FILE_DLL; - - COFFheader64.OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR64_MAGIC; - COFFheader64.OptionalHeader.MajorLinkerVersion = 8; - COFFheader64.OptionalHeader.MinorLinkerVersion = 0; - COFFheader64.OptionalHeader.SizeOfCode = fileAlign(codeSize); - COFFheader64.OptionalHeader.SizeOfInitializedData = fileAlign(exportsSize) + fileAlign(relocSize) + fileAlign(constSize); - COFFheader64.OptionalHeader.SizeOfUninitializedData = 0; - COFFheader64.OptionalHeader.AddressOfEntryPoint = 0; - COFFheader64.OptionalHeader.BaseOfCode = codePage; - - COFFheader64.OptionalHeader.ImageBase = base; - COFFheader64.OptionalHeader.SectionAlignment = 0x1000; - COFFheader64.OptionalHeader.FileAlignment = 0x200; - COFFheader64.OptionalHeader.MajorOperatingSystemVersion = 4; - COFFheader64.OptionalHeader.MinorOperatingSystemVersion = 0; - COFFheader64.OptionalHeader.MajorImageVersion = 0; - COFFheader64.OptionalHeader.MinorImageVersion = 0; - COFFheader64.OptionalHeader.MajorSubsystemVersion = 4; - COFFheader64.OptionalHeader.MinorSubsystemVersion = 0; - COFFheader64.OptionalHeader.Win32VersionValue = 0; - COFFheader64.OptionalHeader.SizeOfImage = constPage + pageAlign(constSize); - COFFheader64.OptionalHeader.SizeOfHeaders = fileAlign(sizeof(DOSheader) + sizeof(COFFheader64)); - COFFheader64.OptionalHeader.CheckSum = 0; - COFFheader64.OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI; - COFFheader64.OptionalHeader.DllCharacteristics = IMAGE_DLLCHARACTERISTICS_NO_SEH | - IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE | // Base address randomization - IMAGE_DLLCHARACTERISTICS_NX_COMPAT; // Data Execution Prevention compatible - COFFheader64.OptionalHeader.SizeOfStackReserve = 1024 * 1024; - COFFheader64.OptionalHeader.SizeOfStackCommit = 4 * 1024; - COFFheader64.OptionalHeader.SizeOfHeapReserve = 1024 * 1024; - COFFheader64.OptionalHeader.SizeOfHeapCommit = 4 * 1024; - COFFheader64.OptionalHeader.LoaderFlags = 0; - COFFheader64.OptionalHeader.NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES; - - COFFheader64.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = exportsPage; - COFFheader64.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size = exportsSize; - - COFFheader64.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = relocPage; - COFFheader64.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size = relocSize; - } - - memset(&textSection, 0, sizeof(textSection)); - strcpy((char*)&textSection.Name, ".text"); - textSection.Misc.VirtualSize = pageAlign(codeSize); - textSection.VirtualAddress = codePage; - textSection.SizeOfRawData = fileAlign(codeSize); - textSection.PointerToRawData = fileAlign(sizeof(DOSheader) + (AMD64 ? sizeof(COFFheader64) : sizeof(COFFheader32))); - textSection.PointerToRelocations = 0; - textSection.PointerToLinenumbers = 0; - textSection.NumberOfRelocations = 0; - textSection.NumberOfLinenumbers = 0; - textSection.Characteristics = IMAGE_SCN_CNT_CODE | - IMAGE_SCN_MEM_EXECUTE | - IMAGE_SCN_MEM_READ; - - memset(&exportsSection, 0, sizeof(exportsSection)); - strcpy((char*)&exportsSection.Name, ".edata"); - exportsSection.Misc.VirtualSize = pageAlign(exportsSize); - exportsSection.VirtualAddress = exportsPage; - exportsSection.SizeOfRawData = fileAlign(exportsSize); - exportsSection.PointerToRawData = textSection.PointerToRawData + fileAlign(codeSize); - exportsSection.PointerToRelocations = 0; - exportsSection.PointerToLinenumbers = 0; - exportsSection.NumberOfRelocations = 0; - exportsSection.NumberOfLinenumbers = 0; - exportsSection.Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | - IMAGE_SCN_MEM_READ; - - memset(&relocSection, 0, sizeof(relocSection)); - strcpy((char*)&relocSection.Name, ".reloc"); - relocSection.Misc.VirtualSize = pageAlign(relocSize); - relocSection.VirtualAddress = relocPage; - relocSection.SizeOfRawData = fileAlign(relocSize); - relocSection.PointerToRawData = exportsSection.PointerToRawData + fileAlign(exportsSize); - relocSection.PointerToRelocations = 0; - relocSection.PointerToLinenumbers = 0; - relocSection.NumberOfRelocations = 0; - relocSection.NumberOfLinenumbers = 0; - relocSection.Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | - IMAGE_SCN_MEM_DISCARDABLE | - IMAGE_SCN_MEM_READ; - - memset(&constSection, 0, sizeof(constSection)); - strcpy((char*)&constSection.Name, ".rdata"); - constSection.Misc.VirtualSize = pageAlign(constSize); - constSection.VirtualAddress = constPage; - constSection.SizeOfRawData = fileAlign(constSize); - constSection.PointerToRawData = relocSection.PointerToRawData + fileAlign(relocSize); - constSection.PointerToRelocations = 0; - constSection.PointerToLinenumbers = 0; - constSection.NumberOfRelocations = 0; - constSection.NumberOfLinenumbers = 0; - constSection.Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | - IMAGE_SCN_MEM_READ; - - memset(&exportDirectory, 0, sizeof(exportDirectory)); - exportDirectory.Characteristics = 0; - exportDirectory.TimeDateStamp = timeDateStamp; - exportDirectory.MajorVersion = 0; - exportDirectory.MinorVersion = 0; - exportDirectory.Name = (unsigned long)(exportsPage + sizeof(IMAGE_EXPORT_DIRECTORY) + functionList.size() * sizeof(void*)); - exportDirectory.Base = 1; - exportDirectory.NumberOfFunctions = (unsigned long)functionList.size(); - exportDirectory.NumberOfNames = 0; - exportDirectory.AddressOfFunctions = exportsPage + sizeof(IMAGE_EXPORT_DIRECTORY); - exportDirectory.AddressOfNames = 0; - exportDirectory.AddressOfNameOrdinals = 0; - - FILE *file = fopen(dllName, "wb"); - - if(file) - { - fwrite(&DOSheader, 1, sizeof(DOSheader), file); - - if(AMD64) - { - fwrite(&COFFheader64, 1, sizeof(COFFheader64), file); - } - else - { - fwrite(&COFFheader32, 1, sizeof(COFFheader32), file); - } - - fwrite(&textSection, 1, sizeof(textSection), file); - fwrite(&exportsSection, 1, sizeof(textSection), file); - fwrite(&relocSection, 1, sizeof(relocSection), file); - fwrite(&constSection, 1, sizeof(constSection), file); - - for(FunctionList::iterator i = functionList.begin(); i != functionList.end(); i++) - { - const void *function = i->first; - unsigned int location = i->second->location; - const std::vector<Relocation> &functionRelocations = globalRelocations[function]; - - for(unsigned int j = 0; j < functionRelocations.size(); j++) - { - unsigned int *address = (unsigned int*)((unsigned char*)i->second->buffer + functionRelocations[j].offset); - - if(functionRelocations[j].ripRelative) - { - *address = base + codePage + location + (*address - (unsigned int)(size_t)function); - } - else - { - *address = base + constPage + (*address - (unsigned int)(size_t)constants); - } - } - - fseek(file, textSection.PointerToRawData + location, SEEK_SET); - fwrite(i->second->buffer, 1, i->second->size, file); - } - - fseek(file, exportsSection.PointerToRawData, SEEK_SET); - fwrite(&exportDirectory, 1, sizeof(exportDirectory), file); - - for(unsigned int i = 0; i < functionOrder.size(); i++) - { - const void *buffer = functionOrder[i]; - Function *function = functionList[buffer]; - - unsigned int functionAddress = codePage + function->location; - unsigned int functionEntry = functionAddress + (int)((size_t)function->entry - (size_t)buffer); - fwrite(&functionEntry, 1, sizeof(functionEntry), file); - } - - fwrite(dllName, 1, strlen(dllName) + 1, file); - - fseek(file, relocSection.PointerToRawData, SEEK_SET); - - for(PageRelocations::iterator i = pageRelocations.begin(); i != pageRelocations.end(); i++) - { - IMAGE_BASE_RELOCATION relocationBlock; - - relocationBlock.VirtualAddress = codePage + i->first * 0x1000; - relocationBlock.SizeOfBlock = (unsigned long)(sizeof(IMAGE_BASE_RELOCATION) + i->second.size() * sizeof(unsigned short)); - - fwrite(&relocationBlock, 1, sizeof(IMAGE_BASE_RELOCATION), file); - - if(i->second.size() > 0) - { - fwrite(&i->second[0], 1, i->second.size() * sizeof(unsigned short), file); - } - } - - fseek(file, constSection.PointerToRawData, SEEK_SET); - fwrite(constants, 1, constSize, file); - - char *padding = new char[fileAlign(constSize) - constSize]; - fwrite(padding, 1, fileAlign(constSize) - constSize, file); - delete[] padding; - - fclose(file); - } - } -}
diff --git a/src/Reactor/DLL.hpp b/src/Reactor/DLL.hpp deleted file mode 100644 index f8cbf50..0000000 --- a/src/Reactor/DLL.hpp +++ /dev/null
@@ -1,105 +0,0 @@ -// Copyright 2016 The SwiftShader Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef sw_DLL_hpp -#define sw_DLL_hpp - -#include <windows.h> -#include <vector> -#include <map> - -namespace sw -{ - class DLL - { - public: - DLL(const char *name, const void *constants = 0, int constSize = 0); - - ~DLL(); - - void addFunction(const void *function, const void *entry, int size); - void addRelocation(const void *function, const void *address, bool ripRelative); - void emit(); - - private: - int pageAlign(int address) // Align to 4 kB virtual page size - { - return (address + 0xFFF) & -0x1000; - } - - int fileAlign(int address) // Align to 512 byte file sections - { - return (address + 0x1FF) & -0x200; - } - - char *dllName; - - IMAGE_DOS_HEADER DOSheader; - IMAGE_NT_HEADERS32 COFFheader32; - IMAGE_NT_HEADERS64 COFFheader64; - IMAGE_SECTION_HEADER textSection; - IMAGE_SECTION_HEADER exportsSection; - IMAGE_SECTION_HEADER relocSection; - IMAGE_SECTION_HEADER constSection; - - IMAGE_EXPORT_DIRECTORY exportDirectory; - - struct Function - { - Function() {}; - Function(unsigned int location, const void *function, const void *entry, int size) : location(location), entry(entry), size(size) - { - buffer = new unsigned char[size]; - - memcpy(buffer, function, size); - } - - ~Function() - { - delete[] buffer; - } - - void *buffer; - - unsigned int location; - const void *entry; - int size; - }; - - std::vector<const void*> functionOrder; - typedef std::map<const void*, Function*> FunctionList; - FunctionList functionList; - int codeSize; - - const void *constants; - int constSize; - - struct Relocation - { - Relocation(unsigned int offset, bool ripRelative) : offset(offset), ripRelative(ripRelative) - { - } - - unsigned int offset; - bool ripRelative; - }; - - typedef std::map<const void*, std::vector<Relocation> > GlobalRelocations; - GlobalRelocations globalRelocations; - typedef std::map<unsigned int, std::vector<unsigned short> > PageRelocations; - PageRelocations pageRelocations; - }; -} - -#endif // sw_DLL_hpp
diff --git a/src/Reactor/Reactor.vcxproj b/src/Reactor/Reactor.vcxproj index f3e7326..f9e24b6 100644 --- a/src/Reactor/Reactor.vcxproj +++ b/src/Reactor/Reactor.vcxproj
@@ -266,13 +266,11 @@ </ProjectReference> </ItemDefinitionGroup> <ItemGroup> - <ClCompile Include="DLL.cpp" /> <ClCompile Include="Nucleus.cpp" /> <ClCompile Include="Routine.cpp" /> <ClCompile Include="RoutineManager.cpp" /> </ItemGroup> <ItemGroup> - <ClInclude Include="DLL.hpp" /> <ClInclude Include="Nucleus.hpp" /> <ClInclude Include="Reactor.hpp" /> <ClInclude Include="Routine.hpp" />
diff --git a/src/Reactor/Reactor.vcxproj.filters b/src/Reactor/Reactor.vcxproj.filters index e2d2f68..2a86f26 100644 --- a/src/Reactor/Reactor.vcxproj.filters +++ b/src/Reactor/Reactor.vcxproj.filters
@@ -15,9 +15,6 @@ </Filter> </ItemGroup> <ItemGroup> - <ClCompile Include="DLL.cpp"> - <Filter>Source Files</Filter> - </ClCompile> <ClCompile Include="Nucleus.cpp"> <Filter>Source Files</Filter> </ClCompile> @@ -29,9 +26,6 @@ </ClCompile> </ItemGroup> <ItemGroup> - <ClInclude Include="DLL.hpp"> - <Filter>Header Files</Filter> - </ClInclude> <ClInclude Include="Nucleus.hpp"> <Filter>Header Files</Filter> </ClInclude>
diff --git a/src/Renderer/RoutineCache.hpp b/src/Renderer/RoutineCache.hpp index 1fdb66c..74dd842 100644 --- a/src/Renderer/RoutineCache.hpp +++ b/src/Renderer/RoutineCache.hpp
@@ -34,141 +34,15 @@ HMODULE precacheDLL; #endif }; -} -#if defined(_WIN32) - #include "Shader/Constants.hpp" - #include "Reactor/DLL.hpp" -#endif - -namespace sw -{ template<class State> RoutineCache<State>::RoutineCache(int n, const char *precache) : LRUCache<State, Routine>(n), precache(precache) { - #if defined(_WIN32) - precacheDLL = 0; - - if(precache) - { - char dllName[1024]; sprintf(dllName, "%s.dll", precache); - char dirName[1024]; sprintf(dirName, "%s.dir", precache); - - precacheDLL = LoadLibrary(dllName); - FILE *dir = fopen(dirName, "rb"); - uintptr_t ordinal = 1; - - while(precacheDLL && dir) - { - State state; - int offset; - int size; - - size_t bytes = fread(&state, 1, sizeof(State), dir); - bytes += fread(&offset, 1, sizeof(offset), dir); - bytes += fread(&size, 1, sizeof(size), dir); - - if(bytes != sizeof(State) + sizeof(offset) + sizeof(size)) - { - break; - } - - void (*routine)(void) = (void(*)(void))GetProcAddress(precacheDLL, (char*)ordinal); - ordinal++; - - if(routine) - { - add(state, new Routine(routine, size, offset)); - } - } - - if(dir) - { - fclose(dir); - } - } - #endif } template<class State> RoutineCache<State>::~RoutineCache() { - #if defined(_WIN32) - char dllName[1024]; sprintf(dllName, "%s.dll", precache); - char dirName[1024]; sprintf(dirName, "%s.dir", precache); - - if(precache) - { - DLL dll(dllName, &constants, sizeof(Constants)); - FILE *dir = fopen(dirName, "wb"); - - for(int i = 0; i < getSize(); i++) - { - State &state = getKey(i); - Routine *routine = query(state); - - if(routine) - { - unsigned char *buffer = (unsigned char*)routine->getBuffer(); - unsigned char *entry = (unsigned char*)routine->getEntry(); - int size = routine->getBufferSize(); - int codeSize = routine->getCodeSize(); - - #ifndef _M_AMD64 - for(int j = 1; j < codeSize - 4; j++) - { - unsigned char modRM_SIB = entry[j - 1]; - unsigned int address = *(unsigned int*)&entry[j]; - - if((modRM_SIB & 0x05) == 0x05 && (address % 4) == 0) - { - if(address >= (unsigned int)buffer && address < (unsigned int)entry) // Constant stored above the function entry - { - dll.addRelocation(buffer, &entry[j], true); - - j += 4; - } - } - } - #else - for(int j = 1; j < codeSize - 4; j++) - { - // unsigned char modRM_SIB = entry[j - 1]; - uint64_t address = *(uint64_t*)&entry[j]; - - // if((modRM_SIB & 0x05) == 0x05 && (address % 4) == 0) - { - if(address >= (uint64_t)buffer && address < (uint64_t)entry) // Constant stored above the function entry - { - dll.addRelocation(buffer, &entry[j], true); - - j += 4; - } - } - } - #endif - - dll.addFunction(buffer, entry, size); - fwrite(&state, 1, sizeof(State), dir); - int offset = (int)(entry - buffer); - fwrite(&offset, 1, sizeof(offset), dir); - fwrite(&size, 1, sizeof(size), dir); - } - } - - FreeLibrary(precacheDLL); - - dll.emit(); - fclose(dir); - } - else - { - FreeLibrary(precacheDLL); - - remove(dllName); - remove(dirName); - } - #endif } }