protonscr

[d3d9] World in Conflict → crash "There is not enough memory to run this program"

dxvkclosed
doitsujin/dxvk#1744 · opened 2020-08-24 by NerosTie · updated 2022-07-29 · 6 comments · github
NNerosTie 2020-08-24 github

The crash occurs at the end of the second mission, before the cutescene when "Berlin-Ouest 11:30" is displayed.

The error message:

Screenshot_20200824_173344

Also, I can't activate the option "Use DX10 Rendering". When I restart the game, the option is unchecked. No such issue with WineD3D.

Software information

Important: the crash occurs when the settings are set to "high" or "very high". It doesn't crash when it's set to "normal" or below.

System information

  • GPU: Nvidia Geforce 730M
  • Driver: 450.66
  • Wine version: Wine Staging 5.15
  • DXVK version: 1344

Apitrace file(s)

https://mega.nz/file/LjJxSK7b#ABsT2QDv6wtswaCKC5IpZAoYgJTTV9Cp3Myw3CouGaI

Log files

world-in-conflict.log

IIglu47 2020-08-24 github
  • DXVK version: 1344

it's not using master, only 743f309253f0512db9f2931b59499d6bd54e30f1

I have and check only gog version pe_header_info_wic.exe.txt
this 32-bit game don't have set LARGE_ADDRESS_AWARE flag by default

so need a special wine-build with laa.patch -> for staging which will allow using the WINE_LARGE_ADDRESS_AWARE=1
or (without building wine) need to change 1 bit in the file-exe header yourself for example or something

I prefer to use a simple python script

just manually make backup of original exe-file, cp wic.exe wic.exe.bak
save python-script (for example as laa-flag-set.py)
make it executable and run once

#!/usr/bin/env python3.8
# See http://en.wikibooks.org/wiki/X86_Disassembly/Windows_Executable_Files#PE_Header
# and https://msdn.microsoft.com/en-us/library/ms680349%28v=vs.85%29.aspx

import struct

IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x0020
PE_HEADER_OFFSET = 60
CHARACTERISTICS_OFFSET = 18

def set_large_address_aware(filename):
    f = open(filename, 'rb+')
    # Check for MZ Header
    if f.read(2) != b'MZ':
        print('Not MZ')
        return False
    # Get PE header location
    f.seek(PE_HEADER_OFFSET)
    pe_header_loc, = struct.unpack('i', f.read(4))
    # Get PE header, check it
    f.seek(pe_header_loc)
    if f.read(4) != b'PE\0\0':
        print('error in PE header')
        return False
    # Get Characteristics, check if IMAGE_FILE_LARGE_ADDRESS_AWARE bit is set
    charac_offset = pe_header_loc + 4 + CHARACTERISTICS_OFFSET
    f.seek(charac_offset)
    bits, = struct.unpack('h', f.read(2))
    if (bits & IMAGE_FILE_LARGE_ADDRESS_AWARE) == IMAGE_FILE_LARGE_ADDRESS_AWARE:
        return True
    else:
        print('large_address_aware is NOT set - will try to set')
        f.seek(charac_offset)
        bytes = struct.pack('h', (bits | IMAGE_FILE_LARGE_ADDRESS_AWARE))
        f.write(bytes)
    f.close()
    return False

if set_large_address_aware('wic.exe'):
    print('large_address_aware is set')
else:
    print('large_address_aware was NOT set')

some additional info:
https://github.com/doitsujin/dxvk/issues/1318
https://www.gog.com/forum/world_in_conflict_complete_edition/out_of_memory

also i found that it looks like a wine has some problem with d3d10 for this game
https://appdb.winehq.org/objectManager.php?sClass=version&iId=9237#notes

Regards

NNerosTie 2020-08-24 github

Your patch fixed the crash! 🥳

But in that case, why it doesn't crash with WineD3D?

DDadSchoorse 2020-08-24 github

But in that case, why it doesn't crash with WineD3D?

classic case of #1318.

NNerosTie 2020-08-24 github

Ok, I've read everything, I understand better.

Should I close this issue or leave it open?

I remove the mentions about the DX10 option, it's an issue with Wine or the game. It's even broken on Windows...

Ddoitsujin maintainer 2020-08-25 github

Force large address awareness in wine/proton, there's not much else we can do to fix this right now.

KK0bin maintainer 2022-07-29 github

This should be fixed now. Please reopen if it's not.

Launch options

Upstream links