| // SwiftShader Software Renderer | |
| // | |
| // Copyright(c) 2005-2012 TransGaming Inc. | |
| // | |
| // All rights reserved. No part of this software may be copied, distributed, transmitted, | |
| // transcribed, stored in a retrieval system, translated into any human or computer | |
| // language by any means, or disclosed to third parties without the explicit written | |
| // agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express | |
| // or implied, including but not limited to any patent rights, are granted to you. | |
| // | |
| #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 |