From ffbfdb22e0a13ec1d5ec4a12f79432c9d650be5b Mon Sep 17 00:00:00 2001 From: rdb Date: Tue, 6 Dec 2022 14:45:49 +0100 Subject: [PATCH] dist: Add `prefer_discrete_gpu` option to force use of dedicated GPU Currently only implemented on Windows. Fixes #680 --- direct/src/dist/commands.py | 12 +++++++--- direct/src/dist/pefile.py | 30 +++++++++++++++++++++++++ pandatool/src/deploy-stub/deploy-stub.c | 7 ++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/direct/src/dist/commands.py b/direct/src/dist/commands.py index d36d95f374..0cae76631b 100644 --- a/direct/src/dist/commands.py +++ b/direct/src/dist/commands.py @@ -250,6 +250,7 @@ class build_apps(setuptools.Command): self.log_filename = None self.log_filename_strftime = False self.log_append = False + self.prefer_discrete_gpu = False self.requirements_path = os.path.join(os.getcwd(), 'requirements.txt') self.use_optimized_wheels = True self.optimized_wheel_index = '' @@ -516,11 +517,16 @@ class build_apps(setuptools.Command): self.icon_objects.get('*', None), ) - if icon is not None: + if icon is not None or self.prefer_discrete_gpu: pef = pefile.PEFile() pef.open(runtime, 'r+') - pef.add_icon(icon) - pef.add_resource_section() + if icon is not None: + pef.add_icon(icon) + pef.add_resource_section() + if self.prefer_discrete_gpu: + if not pef.rename_export("SymbolPlaceholder___________________", "AmdPowerXpressRequestHighPerformance") or \ + not pef.rename_export("SymbolPlaceholder__", "NvOptimusEnablement"): + self.warn("Failed to apply prefer_discrete_gpu, newer target Panda3D version may be required") pef.write_changes() pef.close() diff --git a/direct/src/dist/pefile.py b/direct/src/dist/pefile.py index df7aac8432..2a98f7f0ce 100755 --- a/direct/src/dist/pefile.py +++ b/direct/src/dist/pefile.py @@ -605,6 +605,36 @@ class PEFile(object): if self.res_rva.addr and self.res_rva.size: self.resources.unpack_from(self.vmem, self.res_rva.addr) + def _mark_address_modified(self, rva): + for section in self.sections: + if rva >= section.vaddr and rva - section.vaddr <= section.size: + section.modified = True + + def rename_export(self, old_name, new_name): + """ Renames a symbol in the export table. """ + + assert len(new_name) <= len(old_name) + + new_name = new_name.ljust(len(old_name) + 1, '\0').encode('ascii') + + start = self.exp_rva.addr + expdir = expdirtab(*unpack('