diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/ANNOUNCE wine-compholio-1.7.33~ubuntu15.04.1/ANNOUNCE --- wine-compholio-1.7.32~ubuntu15.04.1/ANNOUNCE 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/ANNOUNCE 2014-12-15 00:45:34.000000000 +0000 @@ -1,16 +1,16 @@ -The Wine development release 1.7.32 is now available. +The Wine development release 1.7.33 is now available. What's new in this release (see below for details): - - New version of the Mono engine. - - A few more functions implemented in MSHTML. - - Improved support for restoring display mode. - - Font metrics improvements in DirectWrite. + - Support for copy/paste commands in MSHTML. + - Some more font support in DirectWrite. + - Better handling for loss of focus in Direct3D windows. + - Several more API Sets DLLs. - Various bug fixes. The source is available from the following locations: - http://prdownloads.sourceforge.net/wine/wine-1.7.32.tar.bz2 - http://mirrors.ibiblio.org/wine/source/1.7/wine-1.7.32.tar.bz2 + http://prdownloads.sourceforge.net/wine/wine-1.7.33.tar.bz2 + http://mirrors.ibiblio.org/wine/source/1.7/wine-1.7.33.tar.bz2 Binary packages for various distributions will be available from: @@ -26,277 +26,283 @@ ---------------------------------------------------------------- -Bugs fixed in 1.7.32 (total 46): +Bugs fixed in 1.7.33 (total 29): - 9043 Adobe InDesign CS tryout hangs on startup - 10081 City of Heroes does not run if asked to use a dual core processor - 10348 Every Extend music does not play (quartz MP3) - 11582 Macromedia Flash 5 Trial hangs when you click "Try" (ShowWindow operations should avoid potentially blocking inter-thread SendMessage if show command is no-op) - 11745 Adobe InDesign CS trial black where icons should be - 13968 3D graphics in Chessmaster 11 are positioned incorrectly - 14449 "North American Birds" fails to launch (Unimplemented function ole2disp.dll.VARIANTCHANGETYPE) - 14666 [wined3d] volume/volumetex locking implementation - 17152 Blizzard Updater complains about javascript being turned off - 17922 LiveZilla 3.x/4.x (.NET 2.0 app) aborts due to unimplemented HTMLDocument_execCommand - 18148 Demise: dialog box won't react to click - 18894 Dungeon Keeper 2 game (animation) speed is too fast - 20520 SolidWorks 2007 crashes after splash screen - 21222 Mall Tycoon 2 Deluxe: Page fault on write access - 23236 WWIIOnline: joystick not responding - 23375 Flux Family Secrets: The Rabbit Hole sets gamma to 0 and never restores it - 23380 WoW trial fails to install, saying it doesn't have write access to Program Files - 25058 NFS Porsche: Crash at location setup - 27282 TDRABCSetup.exe hang on start up (FindWindowExW uses WM_GETTEXT to query for process' local window title text, leading to potential deadlock) - 27945 GdipDrawString LineAlignement does not work . - 28335 IE7 crashes when an active X control is called - 28479 Multiple applications crash on unimplemented function USER32.dll.SetGestureConfig (Solitaire from Windows 7, Illustrator CC) - 29429 The Master Genealogist 8.xx: Can't install because Installer buttons do not work. - 32254 Futuremark 3DMark Vantage v1.1.0 crashes on start up - 32293 Opera: wine uses builtin save file dialog, fails to save file - 32568 Visual Studio 2010 fails on startup, .NET Framework 4.0 WPF message dispatcher unexpectedly receives messages (CoWaitForMultipleHandles, COWAIT_FLAGS, message pump) - 33691 Directory Opus 10 locks up and crashes - 34064 Adobe CS4 installer fails (COM class factory for CLSID_NetFwOpenPort needed) - 34170 Cabri II Plus 1.4 fails on startup - 34386 Microsoft Visual Studio Test Agent 2010 Configuration Tool crash when apply settings is performed - 34950 Microsoft Visual Studio 2005 Tools for Applications installer crashes - 35670 iTunes 10.2.2 'DifXInstall32' sub-installer crashes on unimplemented function DIFXAPI.dll.SetDifxLogCallbackW - 35804 Open file window makes Photoshop CC crash - 35987 Adobe Photoshop CC file open dialog crashes the program - 36241 valgrind shows a leak in comdlg32/tests/printdlg.c - 36863 Mass Effect 3 [Origin] crash on startup (broken EA Origins in-game overlay/hook engine 'igo32.dll' needs 'opengl32.dll' prelinked < 2GB address range) - 37140 Photoshop CC 2014 Open and Save dialog missing features - 37231 Set iframe's src failed. - 37262 "We got a big error here" in Diablo 2 d2loader and wine >= 1.7.25 - 37512 Unreal Engine 4 Elemental benchmark demo crashes on startup ('K32GetPerformanceInfo' must not pass 'PERFORMANCE_INFORMATION' directly to 'NtQuerySystemInformation') - 37534 configure gives incorrect warning when Xrender can't be found due to missing libXext - 37546 mshtml: Possible null pointer dereference: post_data (Cppcheck) - 37563 Skype 6.x crashes trying to make an audio call (DestroyIRichEditOle must take reference count into account) - 37588 Visual Studio 2010 installer requires prefix restart in 'Windows Vista' mode (MSI component version 4.5.6001.22308 upgrade) - 37599 AlphaShadow v1.2 - AlphaVSS Volume Shadow Copy Library Sample Client (.NET 4.0 app) needs VSSAPI.DLL - 37622 Mixxx 1.11.0 installer fails (msiexec does not support /update option) + 23824 Starcraft II: Installer doesn't always launch + 26657 cannot paste text into wine iexplore.exe when browswing + 28937 YouSendIt shows blank GUI + 30471 powersim constructor 2.5 cannot save file (requires ole2.dll16.WRITECLASSSTG) + 32175 installer of PPTV: titlebar duplicated + 32438 winhttp:winhttp conformance test WinHttpGetProxyForUrl() failure + 33623 Unimplemented function ole2disp.dll16.VARIANTCHANGETYPEEX + 34207 Microsoft .NET Framework 2.0 service pack installers fail 'NGEN service version check' custom action (service not stopped before binary update) + 34888 OriginPro 8 freezes in a new installation of Wine (via MacPorts) after Lion->Mavericks upgrade + 34943 Visual C++ 2010 Express web installer exits silently during download of prerequisites + 35069 Patrol Falcon runs without sound + 35105 Ableton Live 9.1 crashes, needs MFReadWrite.dll + 36257 Gears of War fails on startup, reporting 'binkw32.dll: You cannot run the game with modified executable code. Please reinstall the game.' + 36472 Application ArdourXchange will not run in Wine + 36486 Age of Wushu: frequent display of in-game "Don't speed up!" dialog tip disrupts gameplay (Wine fails kernel32.GetTickCount API entry hook check) + 36569 TM.exe crashes at a certain time and native usp10 fixes it + 36642 IWinHttpRequest::Send returns immediately even when in synchronous mode + 36650 Winhttprequest authentication doesn't work anymore + 36938 Reason needs MFPlat.DLL and MFReadWrite.dll + 37159 valgrind shows a few uninitialized variables in riched20/tests/editor.c (test_EM_FINDWORDBREAK_A) + 37376 Visual C++ 2005 Express SP1 installer displays in French instead of English + 37424 Path of Exile: Graphical Glitches with GLSL Disabled + 37596 Sketchup 2015 fails on unimplemented function SHELL32.dll.SHAssocEnumHandlers + 37635 Explicit environment variables passed to spawn/exec are corrupted + 37653 valgrind shows a definite leak in comctl32/tests/imagelist.c + 37679 Puritan Hard Drive (PHD) KnowledgeBase Demo crashes on startup + 37690 Propellerhead Reason 8 needs kernel32.GetUserPreferredUILanguages + 37695 joySetCapture fails with uPeriod==0 + 37704 K-Lite installer complains about regsvr32 version being wrong ---------------------------------------------------------------- -Changes since 1.7.31: +Changes since 1.7.32: Alexandre Julliard (2): - d3d9/tests: Don't require a WM_MOVE message. - msxml3: Update pure_parser directive to avoid a deprecation warning. + taskschd/tests: Don't depend on the directory lookup order. + kernel32/tests: Allow the parent directory to receive a modified event. -André Hentschel (16): - winedbg: Declare debug channel only when needed (Clang). - msxml3: Remove unused strings (Clang). - gdi32: Remove unused string (Clang). - d3d10core: Remove unused struct (Clang). - dwrite: Remove unused code (Clang). - comctl32/tests: Remove unused structs (Clang). - crypt32/tests: Comment out an unused struct (Clang). - advapi32: Remove unused strings (Clang). - winecfg: Remove unused strings (Clang). - gdi32: Remove unused function (Clang). - d3dx9_36/tests: Remove unused functions (Clang). - winedbg: Declare debug channel only when needed in be_x86_64 (Clang). - ieframe/tests: Remove unused string (Clang). - control: Remove unused string (Clang). - jscript: Remove unused code (Clang). - dinput: Remove unused functions (Clang). - -Austin English (4): - cryptext.dll: Add a stub dll. - opengl32: Load dll below 2GB address space. - cryptext: Add stubs for CryptExtAddPFX/CryptExtAddPFXW. - ole2disp: Add a stub for VARIANTCHANGETYPE. - -Bruno Jesus (4): - include: Add SO_BSP_STATE definition. - dinput: Fix device type dump. - dbghelp: Remove a dead assignment (Cppcheck). - user32/tests: Ensure ShowWindow returns false when window is already hidden. - -Caron Wills (1): - wined3d: Add NVIDIA GeForce GTX 970 to supported device list. - -Detlef Riekenberg (1): - scrrun/tests: Ignore case in path names. - -Drew Ronneberg (2): - user32/tests: Add tests for calling ShowWindow(SW_HIDE) on a hidden window. - user32: Do not call SendMessage() to hide a window that is already hidden. - -François Gouget (1): - ddraw/tests: Fix compilation on systems that don't support nameless unions. - -Guillaume Charifi (1): - riched20: Do not destroy IRichEditOle if still referenced. - -Hans Leidekker (6): - ieframe: Send command state change notifications from history navigation handlers. - msi: Update version resource. - msiexec: Add support for /update. - vssapi: New dll. - vssapi: Add stub implementations for a couple of functions. - user32: Add a stub implementation of IsTouchWindow. - -Henri Verbeet (5): - d3d9: Remove some incorrect constants from d3d9types.h. - d2d1: Implement d2d_solid_color_brush_GetOpacity(). - wined3d: Explicitly convert the condition to bool shader_glsl_if(). - wined3d: Recognize the SM4 uge opcode. - d3d10core/tests: Port alpha_test() to d3d10core. - -Jacek Caban (24): - mshtml: Added IHTMLStyleSheet::cssText property partial implementation. - mshtml: Added IHTMLStyleSheet::cssText tests. - mshtml: Added support for IHTMLFrameBase::put_src call on detached element. - mshtml: Added IHTMLFrameBase::get_src implementation. - mshtml: Added IHTMLDOMTextNode2 stub interface. - mshtml: Added HTMLFrameBase2::allowTransparency semi-stub implementation. - mshtml: Added missing nsIHttpChannelInternal functions. - mshtml: Added nsIURI::GetPrePath implementation. - mshtml: Merge htmlelem3.c into htmlelem.c. - mshtml: Don't try to null terminate post data if it's not available. - mshtml: Added IHTMLTextNode2::appendData implementation. - mshtml: Improved IDM_RESPECTVISIBILITY_INDESIGN stub. - mshtml: Added IHTMLDocument2::execCommand implementation. - mshtml: Added IHTMLTxtRange::setEndPoint implementation. - mshtml/tests: Fixed some test failures. - mshtml: Added fontname command support to execCommand. - mshtml: Always ignore DISPATCH_PROPERTYPUTREF in InvokeEx. - jscript: Use DISPATCH_PROPERTYPUTREF flag when setting a property to VT_DISPATCH. - mshtml: Allow setting function properties to any VARIANT type. - mshtml: Better removeAttribute implementation. - mshtml: Correctly handle flags in IHTMLElement:setAttribute. - mshtml: Correctly handle flags in IHTMLElement:getAttribute. - mshtml: style attribute is a special case for setAttribute and removeAttribute. - mshtml: Added more attribute and IDispatchEx tests. - -Jactry Zeng (1): - explorer: Remove unnecessary backslash when parsing /select and /root. - -Michael Stefaniuc (15): - mscms/tests: Simplify the check for an empty string (PVS-Studio). - advpack: Simplify the check for an empty string (PVS-Studio). - mciseq: Simplify the check for an empty string. - comdlg32: Simplify check for an empty string (PVS-Studio). - winemapi: Simplify check for an empty string (PVS-Studio). - regedit: Simplify check for an empty string (PVS-Studio). - shell32/tests: Fix a copy and paste error (PVS-Studio). - msi/tests: Remove redundant if check (PVS-Studio). - shlwapi: Remove always true if-check (PVS-Studio). - comdlg32: Remove an always true if check (PVS-Studio). - cmd: Remove duplicated if-check (PVS-Studio). - comdlg32: RT_DIALOG is already an INTRESOURCE (PVS-Studio). - ieframe: IDC_ARROW is already an INTRESOURCE (PVS-Studio). - msvcrt/tests: Don't open code offsetof(). - gdi32/tests: Don't clear a variable before it goes out of scope (PVS-Studio). - -Nikolay Sivov (24): - dwrite: Implement compatible reference key for local files and remaining loader methods. - dwrite: Reuse local file stream instances. - dwrite: Remove null pointer checks that can't fail. - dwrite: Implement GetLastWriteTime() for local stream. - dwrite/tests: Some tests for ReadFileFragment(). - ole32/tests: Release() doesn't return HRESULT code. - ole32/tests: Use proper wrappers for IObjContext methods. - dwrite: Handle Unicode platform when looking for name record codepage. - dwrite: Implement SetCurrentTransform() for bitmap render target. - include: Added SHAssocEnumHandlers() and related interfaces definition. - dwrite: Load freetype on module attach, create one FT_Face per fontface. - dwrite: Forward more font methods to fontface. - dwrite: Update to IDWriteBitmapRenderTarget1. - dwrite: Use usWin* values from OS/2 table as font ascent/descent. - gdi32: Remove undefs for names that are never defined. - dwrite: Use file mapping for local file stream. - gdi32: Clarify read length values used with get_font_data(). - dwrite: Use stream fragment context when reading font tables. - dwrite: Remove DLL_WINE_PREATTACH case, native module can't be used. - dwrite: Hide factory vtable selection in init helper. - dwrite/tests: Fix some test failures on older dwrite versions. - dwrite: Estimate x-height and cap height metrics if they're missing. - dwrite: Respect typographic metrics when font instructs us to. - dwrite: Fix lineGap metric using 'hhea' table values. - -Piotr Caban (3): - ntdll: Handle ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID flag when opening manifest in RtlCreateActivationContext. - ws2_32: Add support for overlapping fd_sets in select. - ws2_32/tests: Add more select tests. +Alistair Leslie-Hughes (2): + winetest: Skip over stub dll if detected. + d3dx9: Make ID3DXFont_PreloadCharacters return S_OK. + +Andrew Eikum (2): + Revert "winmm: Increase mmdevapi buffer sizes.". + dsound: Report buffer notifications in offset order. + +André Hentschel (42): + d3dx9_36/tests: Remove unused function (Clang). + kernel32/tests: Remove unused strings (Clang). + mshtml/tests: Remove unused variable (Clang). + localspl: Remove unused strings (Clang). + msi/tests: Remove unused variables (Clang). + msi: Remove unused strings (Clang). + ole32: Remove unused string (Clang). + oleaut32: Remove unused code (Clang). + msxml3/tests: Remove unused code (Clang). + ole32/tests: Remove unused variable (Clang). + quartz: Remove unused code (Clang). + qmgr/tests: Remove unused code (Clang). + oleaut32/tests: Remove unused code (Clang). + fusion: Add implementation for CreateAssemblyCacheItem. + winedbg: Remove unused code (Clang). + wintrust: Remove unused variable (Clang). + user32/tests: Remove unused variables (Clang). + windowscodecs: Remove unused strings (Clang). + wineoss.drv: Remove unused string (Clang). + winex11.drv: Remove unused code (Clang). + winspool.drv: Remove unused strings (Clang). + kernel32/tests: Remove unused code (Clang). + secur32: Declare debug channels only when needed (Clang). + shell32: Remove unused string (Clang). + shell32/tests: Remove unused variables (Clang). + urlmon/tests: Remove unused strings (Clang). + wininet: Remove unused strings (Clang). + usp10: Remove unused function (Clang). + sxs/tests: Remove unused string (Clang). + winhttp/tests: Remove unused string (Clang). + fusion/tests: Add tests for CreateAssemblyCacheItem. + qmgr/tests: Remove unused macro. + ntdll: Remove unused macros. + widl: Fix compiler warnings with flag -Wunused-macros. + dbghelp: Fix compiler warnings with flag -Wunused-macros. + gdiplus: Fix compiler warnings with flag -Wunused-macros. + atl: Fix compiler warnings with flag -Wunused-macros. + msrle32: Remove superfluous defines. + itss/tests: Fix compiler warnings with flag -Wunused-macros. + iccvid: Fix compiler warnings with flag -Wunused-macros. + gdiplus/tests: Fix compiler warnings with flag -Wunused-macros. + kernel32: Make GetTickCount and GetTickCount64 hotpatchable. + +Austin English (5): + ole2disp: Add a stub for VariantChangeTypeEx. + ole2: Add a stub for WriteClassStg. + mfplat: Add stub dll. + kernel32: Add a stub for GetUserPreferredUILanguages. + mfreadwrite: Add stub dll. + +Bruno Jesus (9): + ws2_32/tests: Add SO_BSP_STATE tests. + ws2_32: Filter unset bits when argument is smaller than 32 bits. + ws2_32: Implement getsockopt(SO_BSP_STATE). + winmm: Handle NULL parameter in joyGetPos/joyGetPosEx. + winmm: Allow calling joyReleaseCapture multiple times. + winmm: The dwSize paramater of JOYINFOEX must be set correctly. + winmm: Allow any period value for setJoyCapture. + winmm: Handle invalid threshold values in joySetThreshold. + winmm/tests: Add joystick tests. + +Erich Hoover (1): + ddraw: Fix inverted logic for enumerating secondary devices. + +François Gouget (4): + Assorted spelling fixes. + msvcr120/tests: Make test_lconv*() static. + dwrite: Add a trailing '\n' to a FIXME(). + dwrite: Fix compilation on systems that don't support nameless unions. + +Gerald Pfeifer (1): + wordpad: Check for array index before using it in registry_set_filelist. + +Hans Leidekker (11): + msi: Properly handle service control events in Start/StopService. + cryptnet: Add support for base64 encoded certificates, CRLs and CTLs in CryptRetrieveObjectByUrl. + winhttp/tests: Handle more potential connection failures. + winhttp: Enable automatic authentication by default in the request object. + winhttp: Fill the read buffer first in drain_content. + winhttp: Convert the async parameter to VT_BOOL if necessary in IWinHttpRequest::Open. + winhttp: Don't report data pending in the socket. + winhttp: Double the size of the internal read buffer. + winhttp: Check the return value of send_request. + winhttp: Don't try to read data when the server response is HTTP_STATUS_NO_CONTENT or HTTP_STATUS_NOT_MODIFIED. + winhttp/tests: Close the connection immediately after authentication. + +Henri Verbeet (15): + wined3d: Assign the name to the correct signature in pixelshader_init(). + wined3d: Unbind shader resource views in state_unbind_resources(). + wined3d: Keep a reference to the resource in shader resource views. + d2d1: Make "transform" in d2d_d3d_render_target_Clear() const. + d2d1: Implement d2d_d3d_render_target_CreateBitmapBrush(). + wined3d: Validate register indices for WINED3DSIH_DCL instructions. + wined3d: Store resource types instead of sampler types in struct wined3d_shader_reg_maps. + wined3d: Handle SM4 resource declarations. + wined3d: Record the data type of shader resources. + wined3d: Take the resource data type into account in shader_glsl_gen_sample_code(). + wined3d: Use __builtin_clz() in wined3d_log2i() when available. + ddraw: Use wined3d_log2i() to calculate the level count in ddraw_surface_create(). + d3d8: Calculate texture levels in d3d8 instead of wined3d. + d3d9: Calculate texture levels in d3d9 instead of wined3d. + d3d10core: Calculate the texture level count before texture creation. + +Iván Matellanes (1): + msvcrt: Call the _nolock variant when the file is already locked. + +Jacek Caban (12): + mshtml: Added "indent" command support to execCommand. + mshtml: Added support for flag 2 in getAttribute. + mshtml: Allow setting fontWeight to empty string. + mshtml: Mark mousedown event as cancelable. + mshtml: Added support for copy, paste and cut commands in execCommand. + mshtml: Added support for IDM_PASTE command in browser mode. + mshtml: Added support for IDM_CUT command in browser mode. + mshtml: Pass HTMLPluginContainer to create_plugin_host. + mshtml: Create ActiveX object inside create_plugin_host. + mshtml: Do more initialization in create_plugin_host. + mshtml: Added IHTMLObjectElement2::put_classid semi-stub implementation. + dxgi1_2.idl: Added IDXGISwapChain1 declaration. + +Joachim Priesner (1): + ws2_32: Use qsort() to order routes by metric in WS_get_local_ips. + +Marc Bessières (1): + riched20/tests: Use SendMessageA with char buffer (Valgrind). + +Marcus Meissner (6): + dwrite: Avoid leaking filemapping (Coverity). + dwrite: Remove unused hresult assignment (Coverity). + dwrite: Initialize a variable (Coverity). + oleacc: Free the mapping on error (Coverity). + server: Initialize the _len parts to 0 (Coverity). + ntoskrnl.exe: Added IoBuildSynchronousFsdRequest and IoGetAttachedDevice stubs. + +Mark Harmstone (2): + mmdevapi: Allow GetPropValue function in audio drivers. + winealsa: Implement GetPropValue and return device path. + +Martin Storsjo (20): + api-ms-win-core-file-l2-1-1: Add stub dll. + api-ms-win-core-sysinfo-l1-2-1: Add stub dll. + api-ms-win-core-processthreads-l1-1-2: Add stub dll. + api-ms-win-core-winrt-l1-1-0: Add stub dll. + api-ms-win-core-fibers-l1-1-1: Add stub dll. + api-ms-win-core-file-l2-1-0: Add stub dll. + api-ms-win-core-localization-l1-2-1: Add stub dll. + api-ms-win-core-datetime-l1-1-1: Add stub dll. + api-ms-win-core-errorhandling-l1-1-2: Add stub dll. + msvcr120: Implement the _vacopy function. + msvcr120: Implement more C99 math functions. + wrc: Declare the data buffer as unsigned char. + api-ms-win-core-winrt-string-l1-1-0: Fix a typo in a function stub name. + msvcr120: Implement the _dclass/_fdclass/_ldclass functions. + combase: Add stub dll. + include: Add a roapi.h header. + api-ms-win-core-winrt-l1-1-0: Move implementations into combase. + msvcr120_app: Add forwarding dll. + include: Add hstring.idl and winstring.h. + msvcp120_app: Add forwarding dll. + +Michael Müller (4): + api-ms-win-core-fibers-l1-1-0: Add dll. + api-ms-win-core-datetime-l1-1-0: Add dll. + api-ms-win-core-xstate-l2-1-0: Add stub dll. + api-ms-win-core-winrt-error-l1-1-1: Add stub dll. + +Michael Stefaniuc (5): + joy.cpl: Avoid pointers to out of scope variables (PVS-Studio). + comctl32: Merge two if blocks with identical condition (PVS-Studio). + jscript: Merge two if blocks with identical condition (PVS-Studio). + comctl32: Remove a stray unused GetFocus() statement (PVS-Studio). + msi: Remove no-op toupperW() statement (PVS-Studio). + +Nikolay Sivov (11): + comctl32/tests: Fix imagelist leak (Valgrind). + dwrite: Make fonts installed in Fonts dir accessible through system collection. + shell32: Added a stub for SHAssocEnumHandlers(). + dwrite: Set font style to oblique when oblique simulation, was requested. + dwrite: Partially implement GetDesignGlyphMetrics(). + dwrite: Implement IsMonospacedFont(). + dwrite: Implement GetDesignGlyphAdvances(). + dwrite: Update to IDWriteFactory2. + dwrite: Block creation of unsupported face types. + regsvr32: Update program version. + dwrite_2.idl: Protect from D3DCOLORVALUE redefinition. + +Piotr Caban (6): + msvcrt: Call CreateProcess with CREATE_UNICODE_ENVIRONMENT flag in exec functions family. + msvcrt: Use fd critical section in _eof. + msvcrt: Use fd critical section in _locking. + msvcrt: Use fd critical section in _lseeki64. + msvcrt: Use fd critical section in _chsize_s. + msvcrt: Use fd critical section in _fstat64. Qian Hong (1): - comdlg32/tests: Fixed memory leak (Valgrind). + usp10: Make sure fallbackFont is NULL terminated. -Ralf Habacker (1): - comdlg32: Update dmFormName when changing paper size in print UI. - -Sebastian Lackner (29): - server: Close fd if there is no space in thread inflight fd list. - comctl32: Fix invalid usage of CompareString in StrStr functions. - shlwapi: Fix invalid usage of CompareString in StrStr functions. - server: Avoid leaking file descriptors if create_console_input fails. - server: Avoid leaking file descriptor on error in create_file_for_fd. - server: Avoid leaking file descriptor on error in create_thread function. - user32/tests: Remove unnecessary char array and add additional test in test_FindWindowEx. - user32/tests: Add tests for internal window messages of FindWindowEx. - user32/tests: Reenable test function for WM_GETTEXT. - user32/tests: Add single-threaded tests for WM_[GET|SET]TEXT and [Get|Set]WindowText. - user32/tests: Add multi-threaded tests for [Get|Set]WindowText. - user32: Avoid sending window messages in FindWindowExW. - comctl32: Fix incorrect usage of CompareString in SYSLINK_ParseText. - shlwapi: Fix invalid usage of CompareString in PathCreateFromUrlW. - comctl32: Fix invalid usage of CompareString in StrRStr functions. - server: Avoid reallocating region data when there is still enough space. - shlwapi: Fix incorrect usage of CompareString in StrRStrIA. - shlwapi: Fix incorrect usage of CompareString in StrRStrIW. - comctl32: Allow broken behaviour in StrRStr functions. - reg.exe: Fix incorrect usage of CompareString in get_rootkey. - regedit: Fix incorrect usage of CompareString in parseKeyName. - server: Avoid calling close on negative value in create_console_output handler (Coverity). - server: Always remove inflight fd if alloc_console fails. - server: Fix several fd leaks on error in new_process wineserver call. - ws2_32/tests: Wait for thread termination before cleaning up winsock. - ole32/tests: Add tests for CoWaitForMultipleHandles. - ole32: Verify arguments for CoWaitForMultipleHandles, always initialize index to zero. - ole32: Don't process window events when APC calls are queued. - configure: Fix detection of gnutls on Ubuntu 14.10. - -Stefan Dösinger (28): - wined3d: Minimize device windows on focus loss. - d3d9/tests: Test messages on focus loss. - d3d9/tests: Test style changes on focus loss. - d3d8/tests: Test messages on focus loss. - d3d8/tests: Test style changes on focus loss. - ddraw/tests: Test messages on focus loss. - ddraw/tests: Test focus loss style changes. - d3d9/tests: Test mode restoration on focus loss. - d3d8/tests: Test mode restoration on focus loss. - ddraw/tests: Test mode changes on focus loss and restore. - wined3d: Restore the display mode on focus change. - wined3d: Fix mode comparison in wined3d_set_adapter_display_mode. - wined3d: Set the device window size on focus window activation. - ddraw/tests: Test messages on window reactivation. - wined3d: Don't minimize hidden windows. - ddraw: Restore the registry display mode. - d3d9: Only one fullscreen swapchain is allowed. - d3d8: Only one fullscreen swapchain is allowed. - d3d8/tests: Fix test_cursor(). - d3d9/tests: Fix test_cursor(). - d3d8/tests: Call TestCooperativeLevel after Present. - wined3d: Vertex fog uses the absolute eye position z. - d3d/tests: Show that the vfog abs is not a property of D3DFOG_LINEAR. - d3d/tests: Table fog does not abs the fog coordinate. - d3d/tests: Rename fog_interpolation_test for consistency. - Revert "d3d10_1.idl: Added D3D10_1_SHADER_*_VERSION constants.". - includes: Remove some double defines in d3d11.idl. - wined3d: Update fragment program constants when switching from arb ffp draws. +Sebastian Lackner (3): + ws2_32/tests: Fix several copy and paste errors. + wintrust: Reset data->pWintrustData->u.pFile->hFile after closing handle. + ws2_32: Improve implementation of get_poll_results. + +Stefan Dösinger (11): + d3d9: Refuse to reset a lost device. + d3d8: Refuse to reset a lost device. + wined3d: Add a comment about reset during focus change. + d3d9/tests: Test focus loss message filtering. + d3d9/tests: Test focus loss message filtering in d3d9ex. + d3d8/tests: Test focus loss message filtering. + d3d9/test: Test WM_SYSCOMMAND handling. + d3d8/tests: Test WM_SYSCOMMAND handling. + ddraw/tests: Fix window deactivation in test_coop_level_activateapp. + ddraw/tests: Test WM_SYSCOMMAND handling. + wined3d: Filter messages generated by focus handling. Stefan Leichter (1): - difxapi: Add stubs for SetDifxLogCallbackA/W. + kernel32: Add stubs for CreateSymbolicLinkA/W. + +Vincent Povirk (3): + cabinet/tests: Add test for calling FDIIsCabinet with hf == 0. + cabinet: Accept hf == 0 in FDIIsCabinet. + wbemprox: Implement Win32_OperatingSystem::TotalVisibleMemorySize. -Vincent Povirk (1): - mscoree: Update Wine Mono to 4.5.4. +Yifu Wang (1): + msvcr120: Added wchar_t* fields to struct MSVCRT_lconv. -Yifu Wang (2): - msvcp120: Added std::ios_base::operator bool() implementation. - msvcp120: Added std::locale::facet::~facet() export. +Łukasz Wojniłowicz (1): + po: Update Polish translation. -- Alexandre Julliard diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/AUTHORS wine-compholio-1.7.33~ubuntu15.04.1/AUTHORS --- wine-compholio-1.7.32~ubuntu15.04.1/AUTHORS 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/AUTHORS 2014-12-15 00:45:34.000000000 +0000 @@ -850,6 +850,7 @@ Maksim Kuleshov Malte Starostik Manfred Weichel +Marc Bessières Marcel Baur Marcel Hasler Marcelo Duarte diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/configure wine-compholio-1.7.33~ubuntu15.04.1/configure --- wine-compholio-1.7.32~ubuntu15.04.1/configure 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/configure 2014-12-15 00:45:34.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for Wine 1.7.32. +# Generated by GNU Autoconf 2.69 for Wine 1.7.33. # # Report bugs to . # @@ -580,8 +580,8 @@ # Identity of this package. PACKAGE_NAME='Wine' PACKAGE_TARNAME='wine' -PACKAGE_VERSION='1.7.32' -PACKAGE_STRING='Wine 1.7.32' +PACKAGE_VERSION='1.7.33' +PACKAGE_STRING='Wine 1.7.33' PACKAGE_BUGREPORT='wine-devel@winehq.org' PACKAGE_URL='http://www.winehq.org' @@ -855,9 +855,16 @@ enable_amstream enable_api_ms_win_core_com_l1_1_0 enable_api_ms_win_core_console_l1_1_0 +enable_api_ms_win_core_datetime_l1_1_0 +enable_api_ms_win_core_datetime_l1_1_1 enable_api_ms_win_core_debug_l1_1_1 enable_api_ms_win_core_errorhandling_l1_1_1 +enable_api_ms_win_core_errorhandling_l1_1_2 +enable_api_ms_win_core_fibers_l1_1_0 +enable_api_ms_win_core_fibers_l1_1_1 enable_api_ms_win_core_file_l1_2_0 +enable_api_ms_win_core_file_l2_1_0 +enable_api_ms_win_core_file_l2_1_1 enable_api_ms_win_core_handle_l1_1_0 enable_api_ms_win_core_heap_l1_2_0 enable_api_ms_win_core_heap_obsolete_l1_1_0 @@ -866,6 +873,7 @@ enable_api_ms_win_core_kernel32_legacy_l1_1_0 enable_api_ms_win_core_libraryloader_l1_1_1 enable_api_ms_win_core_localization_l1_2_0 +enable_api_ms_win_core_localization_l1_2_1 enable_api_ms_win_core_localization_obsolete_l1_1_0 enable_api_ms_win_core_localregistry_l1_1_0 enable_api_ms_win_core_memory_l1_1_1 @@ -873,6 +881,7 @@ enable_api_ms_win_core_processenvironment_l1_2_0 enable_api_ms_win_core_processthreads_l1_1_0 enable_api_ms_win_core_processthreads_l1_1_1 +enable_api_ms_win_core_processthreads_l1_1_2 enable_api_ms_win_core_profile_l1_1_0 enable_api_ms_win_core_psapi_l1_1_0 enable_api_ms_win_core_registry_l1_1_0 @@ -881,12 +890,16 @@ enable_api_ms_win_core_string_l1_1_0 enable_api_ms_win_core_synch_l1_2_0 enable_api_ms_win_core_sysinfo_l1_2_0 +enable_api_ms_win_core_sysinfo_l1_2_1 enable_api_ms_win_core_threadpool_legacy_l1_1_0 enable_api_ms_win_core_timezone_l1_1_0 enable_api_ms_win_core_url_l1_1_0 enable_api_ms_win_core_util_l1_1_0 enable_api_ms_win_core_winrt_error_l1_1_0 +enable_api_ms_win_core_winrt_error_l1_1_1 +enable_api_ms_win_core_winrt_l1_1_0 enable_api_ms_win_core_winrt_string_l1_1_0 +enable_api_ms_win_core_xstate_l2_1_0 enable_api_ms_win_downlevel_advapi32_l1_1_0 enable_api_ms_win_downlevel_advapi32_l2_1_0 enable_api_ms_win_downlevel_normaliz_l1_1_0 @@ -922,6 +935,7 @@ enable_cards enable_cfgmgr32 enable_clusapi +enable_combase enable_comcat enable_comctl32 enable_comdlg32 @@ -1082,6 +1096,8 @@ enable_mciqtz32 enable_mciseq enable_mciwave +enable_mfplat +enable_mfreadwrite enable_mgmtapi enable_midimap enable_mlang @@ -1125,6 +1141,7 @@ enable_msvcp100 enable_msvcp110 enable_msvcp120 +enable_msvcp120_app enable_msvcp60 enable_msvcp70 enable_msvcp71 @@ -1133,6 +1150,7 @@ enable_msvcr100 enable_msvcr110 enable_msvcr120 +enable_msvcr120_app enable_msvcr70 enable_msvcr71 enable_msvcr80 @@ -1989,7 +2007,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures Wine 1.7.32 to adapt to many kinds of systems. +\`configure' configures Wine 1.7.33 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -2058,7 +2076,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Wine 1.7.32:";; + short | recursive ) echo "Configuration of Wine 1.7.33:";; esac cat <<\_ACEOF @@ -2254,7 +2272,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Wine configure 1.7.32 +Wine configure 1.7.33 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2772,7 +2790,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by Wine $as_me 1.7.32, which was +It was created by Wine $as_me 1.7.33, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -16332,8 +16350,6 @@ fi -ac_save_LIBS="$LIBS" -LIBS="$LIBS -lm" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf" >&5 $as_echo_n "checking for isinf... " >&6; } if ${ac_cv_have_isinf+:} false; then : @@ -16399,8 +16415,75 @@ $as_echo "#define HAVE_ISNAN 1" >>confdefs.h fi + +for ac_func in \ + cbrt \ + cbrtf \ + exp2 \ + exp2f \ + llrint \ + llrintf \ + llround \ + llroundf \ + log2 \ + log2f \ + lrint \ + lrintf \ + lround \ + lroundf \ + rint \ + rintf \ + round \ + roundf \ + trunc \ + truncf + +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + LIBS="$ac_save_LIBS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_clz" >&5 +$as_echo_n "checking for __builtin_clz... " >&6; } +if ${ac_cv_have___builtin_clz+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +return __builtin_clz(1) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_have___builtin_clz="yes" +else + ac_cv_have___builtin_clz="no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have___builtin_clz" >&5 +$as_echo "$ac_cv_have___builtin_clz" >&6; } +if test "$ac_cv_have___builtin_clz" = "yes" +then + +$as_echo "#define HAVE___BUILTIN_CLZ 1" >>confdefs.h + +fi + case $host_cpu in *i[3456789]86*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need to define __i386__" >&5 @@ -16769,9 +16852,16 @@ wine_fn_config_test dlls/amstream/tests amstream_test wine_fn_config_dll api-ms-win-core-com-l1-1-0 enable_api_ms_win_core_com_l1_1_0 wine_fn_config_dll api-ms-win-core-console-l1-1-0 enable_api_ms_win_core_console_l1_1_0 +wine_fn_config_dll api-ms-win-core-datetime-l1-1-0 enable_api_ms_win_core_datetime_l1_1_0 +wine_fn_config_dll api-ms-win-core-datetime-l1-1-1 enable_api_ms_win_core_datetime_l1_1_1 wine_fn_config_dll api-ms-win-core-debug-l1-1-1 enable_api_ms_win_core_debug_l1_1_1 wine_fn_config_dll api-ms-win-core-errorhandling-l1-1-1 enable_api_ms_win_core_errorhandling_l1_1_1 +wine_fn_config_dll api-ms-win-core-errorhandling-l1-1-2 enable_api_ms_win_core_errorhandling_l1_1_2 +wine_fn_config_dll api-ms-win-core-fibers-l1-1-0 enable_api_ms_win_core_fibers_l1_1_0 +wine_fn_config_dll api-ms-win-core-fibers-l1-1-1 enable_api_ms_win_core_fibers_l1_1_1 wine_fn_config_dll api-ms-win-core-file-l1-2-0 enable_api_ms_win_core_file_l1_2_0 +wine_fn_config_dll api-ms-win-core-file-l2-1-0 enable_api_ms_win_core_file_l2_1_0 +wine_fn_config_dll api-ms-win-core-file-l2-1-1 enable_api_ms_win_core_file_l2_1_1 wine_fn_config_dll api-ms-win-core-handle-l1-1-0 enable_api_ms_win_core_handle_l1_1_0 wine_fn_config_dll api-ms-win-core-heap-l1-2-0 enable_api_ms_win_core_heap_l1_2_0 wine_fn_config_dll api-ms-win-core-heap-obsolete-l1-1-0 enable_api_ms_win_core_heap_obsolete_l1_1_0 @@ -16780,6 +16870,7 @@ wine_fn_config_dll api-ms-win-core-kernel32-legacy-l1-1-0 enable_api_ms_win_core_kernel32_legacy_l1_1_0 wine_fn_config_dll api-ms-win-core-libraryloader-l1-1-1 enable_api_ms_win_core_libraryloader_l1_1_1 wine_fn_config_dll api-ms-win-core-localization-l1-2-0 enable_api_ms_win_core_localization_l1_2_0 +wine_fn_config_dll api-ms-win-core-localization-l1-2-1 enable_api_ms_win_core_localization_l1_2_1 wine_fn_config_dll api-ms-win-core-localization-obsolete-l1-1-0 enable_api_ms_win_core_localization_obsolete_l1_1_0 wine_fn_config_dll api-ms-win-core-localregistry-l1-1-0 enable_api_ms_win_core_localregistry_l1_1_0 wine_fn_config_dll api-ms-win-core-memory-l1-1-1 enable_api_ms_win_core_memory_l1_1_1 @@ -16787,6 +16878,7 @@ wine_fn_config_dll api-ms-win-core-processenvironment-l1-2-0 enable_api_ms_win_core_processenvironment_l1_2_0 wine_fn_config_dll api-ms-win-core-processthreads-l1-1-0 enable_api_ms_win_core_processthreads_l1_1_0 wine_fn_config_dll api-ms-win-core-processthreads-l1-1-1 enable_api_ms_win_core_processthreads_l1_1_1 +wine_fn_config_dll api-ms-win-core-processthreads-l1-1-2 enable_api_ms_win_core_processthreads_l1_1_2 wine_fn_config_dll api-ms-win-core-profile-l1-1-0 enable_api_ms_win_core_profile_l1_1_0 wine_fn_config_dll api-ms-win-core-psapi-l1-1-0 enable_api_ms_win_core_psapi_l1_1_0 wine_fn_config_dll api-ms-win-core-registry-l1-1-0 enable_api_ms_win_core_registry_l1_1_0 @@ -16795,12 +16887,16 @@ wine_fn_config_dll api-ms-win-core-string-l1-1-0 enable_api_ms_win_core_string_l1_1_0 wine_fn_config_dll api-ms-win-core-synch-l1-2-0 enable_api_ms_win_core_synch_l1_2_0 wine_fn_config_dll api-ms-win-core-sysinfo-l1-2-0 enable_api_ms_win_core_sysinfo_l1_2_0 +wine_fn_config_dll api-ms-win-core-sysinfo-l1-2-1 enable_api_ms_win_core_sysinfo_l1_2_1 wine_fn_config_dll api-ms-win-core-threadpool-legacy-l1-1-0 enable_api_ms_win_core_threadpool_legacy_l1_1_0 wine_fn_config_dll api-ms-win-core-timezone-l1-1-0 enable_api_ms_win_core_timezone_l1_1_0 wine_fn_config_dll api-ms-win-core-url-l1-1-0 enable_api_ms_win_core_url_l1_1_0 wine_fn_config_dll api-ms-win-core-util-l1-1-0 enable_api_ms_win_core_util_l1_1_0 wine_fn_config_dll api-ms-win-core-winrt-error-l1-1-0 enable_api_ms_win_core_winrt_error_l1_1_0 +wine_fn_config_dll api-ms-win-core-winrt-error-l1-1-1 enable_api_ms_win_core_winrt_error_l1_1_1 +wine_fn_config_dll api-ms-win-core-winrt-l1-1-0 enable_api_ms_win_core_winrt_l1_1_0 wine_fn_config_dll api-ms-win-core-winrt-string-l1-1-0 enable_api_ms_win_core_winrt_string_l1_1_0 +wine_fn_config_dll api-ms-win-core-xstate-l2-1-0 enable_api_ms_win_core_xstate_l2_1_0 wine_fn_config_dll api-ms-win-downlevel-advapi32-l1-1-0 enable_api_ms_win_downlevel_advapi32_l1_1_0 wine_fn_config_dll api-ms-win-downlevel-advapi32-l2-1-0 enable_api_ms_win_downlevel_advapi32_l2_1_0 wine_fn_config_dll api-ms-win-downlevel-normaliz-l1-1-0 enable_api_ms_win_downlevel_normaliz_l1_1_0 @@ -16845,6 +16941,7 @@ wine_fn_config_dll cards enable_cards implib wine_fn_config_dll cfgmgr32 enable_cfgmgr32 implib wine_fn_config_dll clusapi enable_clusapi implib +wine_fn_config_dll combase enable_combase wine_fn_config_dll comcat enable_comcat wine_fn_config_test dlls/comcat/tests comcat_test wine_fn_config_dll comctl32 enable_comctl32 implib,po @@ -17083,6 +17180,8 @@ wine_fn_config_dll mciqtz32 enable_mciqtz32 wine_fn_config_dll mciseq enable_mciseq wine_fn_config_dll mciwave enable_mciwave +wine_fn_config_dll mfplat enable_mfplat +wine_fn_config_dll mfreadwrite enable_mfreadwrite wine_fn_config_dll mgmtapi enable_mgmtapi wine_fn_config_dll midimap enable_midimap wine_fn_config_dll mlang enable_mlang clean,implib @@ -17144,6 +17243,7 @@ wine_fn_config_test dlls/msvcp100/tests msvcp100_test wine_fn_config_dll msvcp110 enable_msvcp110 wine_fn_config_dll msvcp120 enable_msvcp120 +wine_fn_config_dll msvcp120_app enable_msvcp120_app wine_fn_config_dll msvcp60 enable_msvcp60 wine_fn_config_test dlls/msvcp60/tests msvcp60_test wine_fn_config_dll msvcp70 enable_msvcp70 @@ -17155,6 +17255,8 @@ wine_fn_config_test dlls/msvcr100/tests msvcr100_test wine_fn_config_dll msvcr110 enable_msvcr110 implib wine_fn_config_dll msvcr120 enable_msvcr120 implib +wine_fn_config_test dlls/msvcr120/tests msvcr120_test +wine_fn_config_dll msvcr120_app enable_msvcr120_app wine_fn_config_dll msvcr70 enable_msvcr70 implib wine_fn_config_dll msvcr71 enable_msvcr71 implib wine_fn_config_dll msvcr80 enable_msvcr80 implib @@ -18217,7 +18319,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by Wine $as_me 1.7.32, which was +This file was extended by Wine $as_me 1.7.33, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -18288,7 +18390,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -Wine config.status 1.7.32 +Wine config.status 1.7.33 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/configure.ac wine-compholio-1.7.33~ubuntu15.04.1/configure.ac --- wine-compholio-1.7.32~ubuntu15.04.1/configure.ac 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/configure.ac 2014-12-15 00:45:34.000000000 +0000 @@ -2556,8 +2556,6 @@ fi dnl Check for isinf -ac_save_LIBS="$LIBS" -LIBS="$LIBS -lm" AC_CACHE_CHECK([for isinf], ac_cv_have_isinf, AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[float f = 0.0; return isinf(f)]])],[ac_cv_have_isinf="yes"],[ac_cv_have_isinf="no"])) if test "$ac_cv_have_isinf" = "yes" @@ -2572,8 +2570,40 @@ then AC_DEFINE(HAVE_ISNAN, 1, [Define to 1 if you have the `isnan' function.]) fi + +AC_CHECK_FUNCS(\ + cbrt \ + cbrtf \ + exp2 \ + exp2f \ + llrint \ + llrintf \ + llround \ + llroundf \ + log2 \ + log2f \ + lrint \ + lrintf \ + lround \ + lroundf \ + rint \ + rintf \ + round \ + roundf \ + trunc \ + truncf +) LIBS="$ac_save_LIBS" +dnl Check for __builtin_clz +AC_CACHE_CHECK([for __builtin_clz], ac_cv_have___builtin_clz, + AC_LINK_IFELSE([AC_LANG_PROGRAM(,[[return __builtin_clz(1)]])], + [ac_cv_have___builtin_clz="yes"], [ac_cv_have___builtin_clz="no"])) +if test "$ac_cv_have___builtin_clz" = "yes" +then + AC_DEFINE(HAVE___BUILTIN_CLZ, 1, [Define to 1 if you have the `__builtin_clz' built-in function.]) +fi + dnl *** check for the need to define platform-specific symbols case $host_cpu in @@ -2647,9 +2677,16 @@ WINE_CONFIG_TEST(dlls/amstream/tests) WINE_CONFIG_DLL(api-ms-win-core-com-l1-1-0) WINE_CONFIG_DLL(api-ms-win-core-console-l1-1-0) +WINE_CONFIG_DLL(api-ms-win-core-datetime-l1-1-0) +WINE_CONFIG_DLL(api-ms-win-core-datetime-l1-1-1) WINE_CONFIG_DLL(api-ms-win-core-debug-l1-1-1) WINE_CONFIG_DLL(api-ms-win-core-errorhandling-l1-1-1) +WINE_CONFIG_DLL(api-ms-win-core-errorhandling-l1-1-2) +WINE_CONFIG_DLL(api-ms-win-core-fibers-l1-1-0) +WINE_CONFIG_DLL(api-ms-win-core-fibers-l1-1-1) WINE_CONFIG_DLL(api-ms-win-core-file-l1-2-0) +WINE_CONFIG_DLL(api-ms-win-core-file-l2-1-0) +WINE_CONFIG_DLL(api-ms-win-core-file-l2-1-1) WINE_CONFIG_DLL(api-ms-win-core-handle-l1-1-0) WINE_CONFIG_DLL(api-ms-win-core-heap-l1-2-0) WINE_CONFIG_DLL(api-ms-win-core-heap-obsolete-l1-1-0) @@ -2658,6 +2695,7 @@ WINE_CONFIG_DLL(api-ms-win-core-kernel32-legacy-l1-1-0) WINE_CONFIG_DLL(api-ms-win-core-libraryloader-l1-1-1) WINE_CONFIG_DLL(api-ms-win-core-localization-l1-2-0) +WINE_CONFIG_DLL(api-ms-win-core-localization-l1-2-1) WINE_CONFIG_DLL(api-ms-win-core-localization-obsolete-l1-1-0) WINE_CONFIG_DLL(api-ms-win-core-localregistry-l1-1-0) WINE_CONFIG_DLL(api-ms-win-core-memory-l1-1-1) @@ -2665,6 +2703,7 @@ WINE_CONFIG_DLL(api-ms-win-core-processenvironment-l1-2-0) WINE_CONFIG_DLL(api-ms-win-core-processthreads-l1-1-0) WINE_CONFIG_DLL(api-ms-win-core-processthreads-l1-1-1) +WINE_CONFIG_DLL(api-ms-win-core-processthreads-l1-1-2) WINE_CONFIG_DLL(api-ms-win-core-profile-l1-1-0) WINE_CONFIG_DLL(api-ms-win-core-psapi-l1-1-0) WINE_CONFIG_DLL(api-ms-win-core-registry-l1-1-0) @@ -2673,12 +2712,16 @@ WINE_CONFIG_DLL(api-ms-win-core-string-l1-1-0) WINE_CONFIG_DLL(api-ms-win-core-synch-l1-2-0) WINE_CONFIG_DLL(api-ms-win-core-sysinfo-l1-2-0) +WINE_CONFIG_DLL(api-ms-win-core-sysinfo-l1-2-1) WINE_CONFIG_DLL(api-ms-win-core-threadpool-legacy-l1-1-0) WINE_CONFIG_DLL(api-ms-win-core-timezone-l1-1-0) WINE_CONFIG_DLL(api-ms-win-core-url-l1-1-0) WINE_CONFIG_DLL(api-ms-win-core-util-l1-1-0) WINE_CONFIG_DLL(api-ms-win-core-winrt-error-l1-1-0) +WINE_CONFIG_DLL(api-ms-win-core-winrt-error-l1-1-1) +WINE_CONFIG_DLL(api-ms-win-core-winrt-l1-1-0) WINE_CONFIG_DLL(api-ms-win-core-winrt-string-l1-1-0) +WINE_CONFIG_DLL(api-ms-win-core-xstate-l2-1-0) WINE_CONFIG_DLL(api-ms-win-downlevel-advapi32-l1-1-0) WINE_CONFIG_DLL(api-ms-win-downlevel-advapi32-l2-1-0) WINE_CONFIG_DLL(api-ms-win-downlevel-normaliz-l1-1-0) @@ -2723,6 +2766,7 @@ WINE_CONFIG_DLL(cards,,[implib]) WINE_CONFIG_DLL(cfgmgr32,,[implib]) WINE_CONFIG_DLL(clusapi,,[implib]) +WINE_CONFIG_DLL(combase) WINE_CONFIG_DLL(comcat) WINE_CONFIG_TEST(dlls/comcat/tests) WINE_CONFIG_DLL(comctl32,,[implib,po]) @@ -2961,6 +3005,8 @@ WINE_CONFIG_DLL(mciqtz32) WINE_CONFIG_DLL(mciseq) WINE_CONFIG_DLL(mciwave) +WINE_CONFIG_DLL(mfplat) +WINE_CONFIG_DLL(mfreadwrite) WINE_CONFIG_DLL(mgmtapi) WINE_CONFIG_DLL(midimap) WINE_CONFIG_DLL(mlang,,[clean,implib]) @@ -3022,6 +3068,7 @@ WINE_CONFIG_TEST(dlls/msvcp100/tests) WINE_CONFIG_DLL(msvcp110) WINE_CONFIG_DLL(msvcp120) +WINE_CONFIG_DLL(msvcp120_app) WINE_CONFIG_DLL(msvcp60) WINE_CONFIG_TEST(dlls/msvcp60/tests) WINE_CONFIG_DLL(msvcp70) @@ -3033,6 +3080,8 @@ WINE_CONFIG_TEST(dlls/msvcr100/tests) WINE_CONFIG_DLL(msvcr110,,[implib]) WINE_CONFIG_DLL(msvcr120,,[implib]) +WINE_CONFIG_TEST(dlls/msvcr120/tests) +WINE_CONFIG_DLL(msvcr120_app) WINE_CONFIG_DLL(msvcr70,,[implib]) WINE_CONFIG_DLL(msvcr71,,[implib]) WINE_CONFIG_DLL(msvcr80,,[implib]) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/debian/bzr-builder.manifest wine-compholio-1.7.33~ubuntu15.04.1/debian/bzr-builder.manifest --- wine-compholio-1.7.32~ubuntu15.04.1/debian/bzr-builder.manifest 2014-11-30 16:47:29.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/debian/bzr-builder.manifest 2014-12-15 01:35:49.000000000 +0000 @@ -1,3 +1,3 @@ -# bzr-builder format 0.4 deb-version 1.7.32 -lp:wine revid:git-v1:fe2466ffdfa505329d009dac14cf933e77a14495 -merge compholio-release-package lp:wine-compholio revid:git-v1:1e1522ed25de14027590a29a37a4d2fd667ffba9 +# bzr-builder format 0.4 deb-version 1.7.33 +lp:wine revid:git-v1:aa026e061446d5afee9d55b808402998fae94f1f +merge compholio-release-package lp:wine-compholio revid:git-v1:14dd3801bfcaede29ea3d5a03c8eb00c81dd04bc diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/debian/changelog wine-compholio-1.7.33~ubuntu15.04.1/debian/changelog --- wine-compholio-1.7.32~ubuntu15.04.1/debian/changelog 2014-11-30 16:47:29.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/debian/changelog 2014-12-15 01:35:49.000000000 +0000 @@ -1,8 +1,35 @@ -wine-compholio (1.7.32~ubuntu15.04.1) vivid; urgency=low +wine-compholio (1.7.33~ubuntu15.04.1) vivid; urgency=low * Auto build. - -- Sebastian Lackner Sun, 30 Nov 2014 16:47:29 +0000 + -- Sebastian Lackner Mon, 15 Dec 2014 01:35:49 +0000 + +wine-compholio (1.7.33) unstable; urgency=low + * Various improvements of patchupdate.py. + * Added patches for wined3d CSMT (command stream) support. + * Added additional tests for VerifyVersionInfoA. + * Added patch to fix condition handling in RtlVerifyVersionInfo. + * Added patch to set last error when GetRawInputDeviceList fails. + * Added patch to fix possible segfault in pulse_rd_loop of PulseAudio backend. + * Added patch to implement support for GetPropValue to PulseAudio backend. + * Added patch to implement shlwapi.StrCatChainW. + * Added patch to allow Accept-Encoding for HTTP/1.0 in wininet. + * Added patch for combase HSTRING objects. + * Added patch to implement stubs for MFStartup and MFShutdown. + * Added patch for additional tests of CoWaitForMultipleHandles with WM_QUIT. + * Added patch to fix return value of ScrollWindowEx for invisible windows. + * Added patch to ignore unsupported flags for CoInternetSetFeatureEnabled. + * Added patch to provide named entry point shell32.SHILCreateFromPath for vista apps. + * Added patch to reallocate buffer when adding records to AVI files. + * Added patch to implement support for loader dll redirections. + * Added patch to add winecfg Staging tab. + * Removed patch to fix copy and paste errors in ws2_32 tests (accepted upstream). + * Removed patch to fix ordering of IP addresses by metric if two addresses have the same metric (accepted upstream). + * Removed patch to reset data->pWintrustData->u.pFile->hFile after closing handle (accepted upstream). + * Removed patch to simplify implementation of ws32 get_poll_results (accepted upstream). + * Removed patch to fix passing of unicode environment from msvcrt to CreateProcessW (accepted upstream). + * Removed patches for api-ms-win-core-* stub dlls (accepted upstream). + -- Sebastian Lackner Mon, 15 Dec 2014 00:53:01 +0100 wine-compholio (1.7.32) unstable; urgency=low * Various optimizations of patchupdate.py. diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/debian/tools/patchlist.sh wine-compholio-1.7.33~ubuntu15.04.1/debian/tools/patchlist.sh --- wine-compholio-1.7.32~ubuntu15.04.1/debian/tools/patchlist.sh 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/debian/tools/patchlist.sh 2014-12-15 01:08:14.000000000 +0000 @@ -4,12 +4,10 @@ PATCH_LINES=$((${PATCH_LINES}+23)); cat < +From: Wine Staging Team Subject: Autogenerated patch list. ---- diff --git a/include/wine/library.h b/include/wine/library.h -index 242bb69..fae73fe 100644 --- a/include/wine/library.h +++ b/include/wine/library.h @@ -43,6 +43,7 @@ extern const char *wine_get_data_dir(void); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/debian/tools/patchupdate.py wine-compholio-1.7.33~ubuntu15.04.1/debian/tools/patchupdate.py --- wine-compholio-1.7.32~ubuntu15.04.1/debian/tools/patchupdate.py 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/debian/tools/patchupdate.py 2014-12-15 01:08:14.000000000 +0000 @@ -55,16 +55,20 @@ path_README_md = "README.md" path_template_README_md = "debian/tools/README.md.in" + path_IfDefined = "9999-IfDefined.patch" + class PatchUpdaterError(RuntimeError): """Failed to update patches.""" pass class PatchSet(object): - def __init__(self, name): + def __init__(self, name, directory): self.name = name + self.directory = directory self.fixes = [] self.changes = [] self.disabled = False + self.ifdefined = None self.files = [] self.patches = [] @@ -172,10 +176,10 @@ if revision is None: for name in os.listdir(path): if name in [".", ".."]: continue - subdirectory = os.path.join(path, name) - if not os.path.isdir(subdirectory): + directory = os.path.join(path, name) + if not os.path.isdir(directory): continue - dirs.append((name, subdirectory)) + dirs.append((name, directory)) else: filename = "%s:%s" % (revision, path) try: @@ -206,9 +210,10 @@ except subprocess.CalledProcessError: raise IOError("Failed to load %s" % filename) - depends = set() - fixes = [] - disabled = False + depends = set() + fixes = [] + disabled = False + ifdefined = None for line in content.split("\n"): if line.startswith("#"): @@ -216,12 +221,14 @@ tmp = line.split(":", 1) if len(tmp) != 2: continue + key, val = tmp[0].lower(), tmp[1].strip() if key == "depends": if name_to_id is not None: if not name_to_id.has_key(val): raise PatchUpdaterError("Definition file %s references unknown dependency %s" % (filename, val)) depends.add(name_to_id[val]) + elif key == "fixes": r = re.match("^[0-9]+$", val) if r: @@ -232,12 +239,17 @@ fixes.append((int(r.group(1)), r.group(2).strip())) continue fixes.append((None, val)) + elif key == "disabled": disabled = _parse_int(val) + + elif key == "ifdefined": + ifdefined = val + elif revision is None: print "WARNING: Ignoring unknown command in definition file %s: %s" % (filename, line) - return depends, fixes, disabled + return depends, fixes, disabled, ifdefined def read_patchset(revision = None): """Read information about all patchsets for a specific revision.""" @@ -246,21 +258,25 @@ name_to_id = {} # Read in sorted order (to ensure created Makefile doesn't change too much) - for name, subdirectory in sorted(enum_directories(revision, config.path_patches)): - patch = PatchSet(name) + for name, directory in sorted(enum_directories(revision, config.path_patches)): + patch = PatchSet(name, directory) if revision is None: # If its the latest revision, then request additional information - if not os.path.isdir(subdirectory): - raise RuntimeError("Unable to open directory %s" % subdirectory) + if not os.path.isdir(directory): + raise RuntimeError("Unable to open directory %s" % directory) # Enumerate .patch files in the given directory, enumerate individual patches and affected files - for f in sorted(os.listdir(subdirectory)): - if not f.endswith(".patch") or not os.path.isfile(os.path.join(subdirectory, f)): + for f in sorted(os.listdir(directory)): + if not re.match("^[0-9]{4}-.*\\.patch$", f): + continue + if f.startswith(config.path_IfDefined): + continue + if not os.path.isfile(os.path.join(directory, f)): continue patch.files.append(f) - for p in patchutils.read_patch(os.path.join(subdirectory, f)): + for p in patchutils.read_patch(os.path.join(directory, f)): patch.modified_files.add(p.modified_file) patch.patches.append(p) @@ -276,10 +292,10 @@ # Now read the definition files in a second step for i, patch in all_patches.iteritems(): try: - patch.depends, patch.fixes, patch.disabled = \ + patch.depends, patch.fixes, patch.disabled, patch.ifdefined = \ read_definition(revision, os.path.join(config.path_patches, patch.name), name_to_id) except IOError: - patch.depends, patch.fixes, patch.disabled = set(), [], False + patch.depends, patch.fixes, patch.disabled, patch.ifdefined = set(), [], False, None return all_patches @@ -333,26 +349,28 @@ result.flush() # shouldn't be necessary because the subprocess writes directly to the fd return result +def extract_patch(patchset, filename): + """Extract all changes to a specific file from a patchset.""" + p = tempfile.NamedTemporaryFile() + m = hashlib.sha256() + + for patch in patchset.patches: + if patch.modified_file != filename: + continue + for chunk in patch.read_chunks(): + p.write(chunk) + m.update(chunk) + p.write("\n") + m.update("\n") + + p.flush() + return (m.digest(), p) + def select_patches(all_patches, indices, filename): """Create a temporary patch file for each patchset and calculate the checksum.""" selected_patches = {} - for i in indices: - p = tempfile.NamedTemporaryFile() - m = hashlib.sha256() - - for patch in all_patches[i].patches: - if patch.modified_file != filename: - continue - for chunk in patch.read_chunks(): - p.write(chunk) - m.update(chunk) - p.write("\n") - m.update("\n") - - p.flush() - selected_patches[i] = (m.digest(), p) - + selected_patches[i] = extract_patch(all_patches[i], filename) return selected_patches def verify_patch_order(all_patches, indices, filename, pool): @@ -403,9 +421,8 @@ try: while len(patch_stack_indices) < len(permutation): i = permutation[len(patch_stack_indices)] - original = patch_stack_patches[-1] if len(patch_stack_indices) else original_content - patchfile = selected_patches[i][1] - patch_stack_patches.append(patchutils.apply_patch(original, patchfile, fuzz=0)) + original = patch_stack_patches[-1] if len(patch_stack_indices) else original_content + patch_stack_patches.append(patchutils.apply_patch(original, selected_patches[i][1], fuzz=0)) patch_stack_indices.append(i) output_hash = _sha256(patch_stack_patches[-1]) @@ -472,6 +489,81 @@ else: assert len(last_result_hash) == 32 +def resolve_dependencies(all_patches, index): + """Returns a sorted list with all dependencies for a given patch.""" + + def _resolve(depends): + for i in depends: + # Dependencies already resolved + if all_patches[i].verify_resolved > 0: + continue + # Detect circular dependency + if all_patches[i].verify_resolved < 0: + raise PatchUpdaterError("Circular dependency while trying to resolve dependencies of %s" % all_patches[index].name) + + # Recusively resolve dependencies + all_patches[i].verify_resolved = -1 + _resolve(all_patches[i].depends) + all_patches[i].verify_resolved = 1 + resolved.append(i) + + for _, patch in all_patches.iteritems(): + patch.verify_resolved = 0 + + resolved = [] + _resolve(all_patches[index].depends) + return resolved + +def generate_ifdefined(all_patches): + """Update autogenerated ifdefined patches, which can be used to selectively disable features at compile time.""" + enabled_patches = dict([(i, patch) for i, patch in all_patches.iteritems() if not patch.disabled]) + + for i, patch in enabled_patches.iteritems(): + if patch.ifdefined is None: + continue + + filename = os.path.join(patch.directory, config.path_IfDefined) + with open(filename, "wb") as fp: + fp.write("From: Wine Staging Team \n") + fp.write("Subject: Autogenerated #ifdef patch for %s.\n" % patch.name) + fp.write("\n") + + depends = resolve_dependencies(enabled_patches, i) + for f in patch.modified_files: + + # Reconstruct the state after applying the dependencies + original = get_wine_file(f) + for _, (_, p) in select_patches(enabled_patches, depends, f).iteritems(): + original = patchutils.apply_patch(original, p, fuzz=0) + + # Now apply the main patch + p = extract_patch(patch, f)[1] + patched = patchutils.apply_patch(original, p, fuzz=0) + + # Now get the diff between both + diff = patchutils.generate_ifdef_patch(original, patched, ifdef=patch.ifdefined) + if diff is not None: + fp.write("diff --git a/%s b/%s\n" % (f, f)) + fp.write("--- a/%s\n" % f) + fp.write("+++ b/%s\n" % f) + while True: + buf = diff.read(16384) + if buf == "": break + fp.write(buf) + diff.close() + + # Close the file + fp.close() + + # Add changes to git + subprocess.call(["git", "add", filename]) + + # Add the autogenerated file as a last patch + patch.files.append(os.path.basename(filename)) + for p in patchutils.read_patch(filename): + assert p.modified_file in patch.modified_files + patch.patches.append(p) + def verify_dependencies(all_patches): """Resolve dependencies, and afterwards run verify_patch_order() to check if everything applies properly.""" @@ -487,7 +579,7 @@ enabled_patches = dict([(i, patch) for i, patch in all_patches.iteritems() if not patch.disabled]) max_patches = max(enabled_patches.keys()) + 1 - for i, patch in enabled_patches.iteritems(): + for _, patch in enabled_patches.iteritems(): patch.verify_depends = set(patch.depends) patch.verify_time = [0]*max_patches @@ -559,7 +651,7 @@ # Generate dependencies and code to apply patches fp.write(".INTERMEDIATE: %s.ok\n" % patch.name) - depends = " ".join([""] + ["%s.ok" % all_patches[d].name for d in patch.depends]) if len(patch.depends) else "" + depends = " ".join([""] + sorted(["%s.ok" % all_patches[d].name for d in patch.depends])) if len(patch.depends) else "" fp.write("%s.ok:%s\n" % (patch.name, depends)) for f in patch.files: fp.write("\t$(call APPLY_FILE,%s)\n" % os.path.join(patch.name, f)) @@ -575,6 +667,9 @@ fp.write("\ttouch %s.ok\n" % patch.name) fp.write("\n"); + # Add changes to git + subprocess.call(["git", "add", config.path_Makefile]) + def generate_markdown(all_patches, stable_patches, stable_compholio_version): """Generate README.md including information about specific patches and bugfixes.""" @@ -632,6 +727,9 @@ with open(config.path_README_md, "w") as fp: fp.write(template.format(fixes="\n".join(lines))) + # Add changes to git + subprocess.call(["git", "add", config.path_README_md]) + if __name__ == "__main__": verbose = "-v" in sys.argv[1:] @@ -651,6 +749,9 @@ all_patches = read_patchset() stable_patches = read_patchset(revision="v%s" % stable_compholio_version) + # Update autogenerated ifdefined patches + generate_ifdefined(all_patches) + # Check dependencies verify_dependencies(all_patches) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/debian/tools/patchutils.py wine-compholio-1.7.33~ubuntu15.04.1/debian/tools/patchutils.py --- wine-compholio-1.7.32~ubuntu15.04.1/debian/tools/patchutils.py 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/debian/tools/patchutils.py 2014-12-15 01:08:14.000000000 +0000 @@ -40,6 +40,14 @@ """Failed to apply/merge patch.""" pass +class PatchDiffError(RuntimeError): + """Failed to compute diff.""" + pass + +class CParserError(RuntimeError): + """Unable to parse C source.""" + pass + class PatchObject(object): def __init__(self, filename, header): self.patch_author = header['author'] @@ -362,3 +370,299 @@ except: os.unlink(result.name) raise + +def generate_ifdef_patch(original, patched, ifdef): + """Generate a patch which adds #ifdef where necessary to keep both the original and patched version.""" + + def _preprocess_source(fp): + """Simple C preprocessor to determine where we can savely add #ifdef instructions.""" + + _re_state0 = re.compile("(\"|/[/*])") + _re_state1 = re.compile("(\\\"|\")") + _re_state2 = re.compile("\\*/") + + # We need to read the original file, and figure out where lines can be splitted + lines = [] + original.seek(0) + for line in original: + lines.append(line.rstrip("\n")) + + split = set([0]) + state = 0 + + i = 0 + while i < len(lines): + + # Read a full line (and handle line continuation) + line = lines[i] + i += 1 + while line.endswith("\\"): + if i >= len(lines): + raise CParserError("Unexpected end of file.") + line = line[:-1] + lines[i] + i += 1 + + # To find out where we can add our #ifdef tags we use a simple + # statemachine. This allows finding the beginning of a multiline + # instruction or comment. + j = 0 + while True: + + # State 0: No context + if state == 0: + match = _re_state0.search(line, j) + if match is None: break + + if match.group(0) == "\"": + state = 1 # Begin of string + elif match.group(0) == "/*": + state = 2 # Begin of comment + elif match.group(0) == "//": + break # Rest of the line is a comment, which can be savely ignored + else: + assert 0 + + # State 1: Inside of string + elif state == 1: + match = _re_state1.search(line, j) + if match is None: + raise CParserError("Line ended in the middle of a string.") + + if match.group(0) == "\"": + state = 0 # End of string + elif match.group(0) != "\\\"": + assert 0 + + # State 2: Multiline comment + elif state == 2: + match = _re_state2.search(line, j) + if match is None: break + + if match.group(0) == "*/": + state = 0 # End of comment + else: + assert 0 + + else: + raise CParserError("Internal state error.") + j = match.end() + + # Only in state 0 (no context) we can split here + if state == 0: + split.add(i) + + # Ensure that the last comment is properly terminated + if state != 0: + raise CParserError("Unexpected end of file.") + return lines, split + + # + # The basic of idea of this algorithm is as following: + # + # (1) determine diff between original file and patched file + # (2) run the preprocessor, to determine where #ifdefs can be savely added + # (3) use diff and preprocessor information to create a merged version containing #ifdefs + # (4) create another diff to apply the changes on the patched version + # + + with tempfile.NamedTemporaryFile() as diff: + exitcode = subprocess.call(["diff", "-u", original.name, patched.name], + stdout=diff, stderr=_devnull) + if exitcode == 0: + return None + elif exitcode != 1: + raise PatchDiffError("Failed to compute diff (exitcode %d)." % exitcode) + + # Preprocess the original C source + lines, split = _preprocess_source(original) + + # Parse the created diff file + diff.flush() + diff.seek(0) + + # We expect this output format from 'diff', if this is not the case things might go wrong. + line = diff.readline() + assert line.startswith("--- ") + line = diff.readline() + assert line.startswith("+++ ") + + hunks = [] + while True: + line = diff.readline() + if line == "": + break + + # Parse each hunk, and extract the srclines and dstlines. This algorithm is very + # similar to _read_single_patch. + if not line.startswith("@@ -"): + raise PatchParserError("Unable to parse line '%s'." % line) + + r = re.match("^@@ -(([0-9]+),)?([0-9]+) \+(([0-9]+),)?([0-9]+) @@", line) + if not r: raise PatchParserError("Unable to parse hunk header '%s'." % line) + srcpos = max(int(r.group(2)) - 1, 0) if r.group(2) else 0 + dstpos = max(int(r.group(5)) - 1, 0) if r.group(5) else 0 + srclines, dstlines = int(r.group(3)), int(r.group(6)) + if srclines <= 0 and dstlines <= 0: + raise PatchParserError("Empty hunk doesn't make sense.") + + srcdata = [] + dstdata = [] + + try: + while srclines > 0 or dstlines > 0: + line = diff.readline().rstrip("\n") + if line[0] == " ": + if srclines == 0 or dstlines == 0: + raise PatchParserError("Corrupted patch.") + srcdata.append(line[1:]) + dstdata.append(line[1:]) + srclines -= 1 + dstlines -= 1 + elif line[0] == "-": + if srclines == 0: + raise PatchParserError("Corrupted patch.") + srcdata.append(line[1:]) + srclines -= 1 + elif line[0] == "+": + if dstlines == 0: + raise PatchParserError("Corrupted patch.") + dstdata.append(line[1:]) + dstlines -= 1 + elif line[0] == "\\": + pass # ignore + else: + raise PatchParserError("Unexpected line in hunk.") + except IndexError: # triggered by ""[0] + raise PatchParserError("Truncated patch.") + + # Ensure that the patch would really apply in practice + if lines[srcpos:srcpos + len(srcdata)] != srcdata: + raise PatchParserError("Patch failed to apply.") + + # Strip common lines from the beginning and end + while len(srcdata) > 0 and len(dstdata) > 0 and \ + srcdata[0] == dstdata[0]: + srcdata.pop(0) + dstdata.pop(0) + srcpos += 1 + dstpos += 1 + + while len(srcdata) > 0 and len(dstdata) > 0 and \ + srcdata[-1] == dstdata[-1]: + srcdata.pop() + dstdata.pop() + + # Ensure that diff generated valid output + assert len(srcdata) > 0 or len(dstdata) > 0 + + # If this is the first hunk, then check if we have to extend it at the beginning + if len(hunks) == 0: + while srcpos > 0 and srcpos not in split: + srcpos -= 1 + srcdata.insert(0, lines[srcpos]) + dstdata.insert(0, lines[srcpos]) + hunks.append((srcpos, dstpos, srcdata, dstdata)) + + # Check if we can merge with the previous hunk + else: + prev_srcpos, prev_dstpos, prev_srcdata, prev_dstdata = hunks[-1] + prev_endpos = prev_srcpos + len(prev_srcdata) + + found = 0 + for i in xrange(prev_endpos, srcpos): + if i in split: + found += 1 + + # At least two possible splitting positions inbetween + if found >= 2: + while prev_endpos not in split: + prev_srcdata.append(lines[prev_endpos]) + prev_dstdata.append(lines[prev_endpos]) + prev_endpos += 1 + + while srcpos not in split: + srcpos -= 1 + srcdata.insert(0, lines[srcpos]) + dstdata.insert(0, lines[srcpos]) + hunks.append((srcpos, dstpos, srcdata, dstdata)) + + # Merge hunks + else: + while prev_endpos < srcpos: + prev_srcdata.append(lines[prev_endpos]) + prev_dstdata.append(lines[prev_endpos]) + prev_endpos += 1 + assert prev_dstpos + len(prev_dstdata) == dstpos + hunks[-1][2] += srcdata + hunks[-1][3] += dstdata + + # Ready with this hunk + pass + + # We might have to extend the last hunk + if len(hunks): + prev_srcpos, prev_dstpos, prev_srcdata, prev_dstdata = hunks[-1] + prev_endpos = prev_srcpos + len(prev_srcdata) + + while prev_endpos < len(lines) and prev_endpos not in split: + prev_srcdata.append(lines[prev_endpos]) + prev_dstdata.append(lines[prev_endpos]) + prev_endpos += 1 + + # We don't need the diff anymore, all hunks are in memory + diff.close() + + # Generate resulting file with #ifdefs + with tempfile.NamedTemporaryFile() as intermediate: + + pos = 0 + while len(hunks): + srcpos, dstpos, srcdata, dstdata = hunks.pop(0) + if pos < srcpos: + intermediate.write("\n".join(lines[pos:srcpos])) + intermediate.write("\n") + + if len(srcdata) and len(dstdata): + intermediate.write("#if defined(%s)\n" % ifdef) + intermediate.write("\n".join(dstdata)) + intermediate.write("\n#else /* %s */\n" % ifdef) + intermediate.write("\n".join(srcdata)) + intermediate.write("\n#endif /* %s */\n" % ifdef) + + elif len(srcdata): + intermediate.write("#if !defined(%s)\n" % ifdef) + intermediate.write("\n".join(srcdata)) + intermediate.write("\n#endif /* %s */\n" % ifdef) + + elif len(dstdata): + intermediate.write("#if defined(%s)\n" % ifdef) + intermediate.write("\n".join(dstdata)) + intermediate.write("\n#endif /* %s */\n" % ifdef) + + else: + assert 0 + pos = srcpos + len(srcdata) + + if pos < len(lines): + intermediate.write("\n".join(lines[pos:])) + intermediate.write("\n") + intermediate.flush() + + # Now we can finally compute the diff between the patched file and our intermediate file + diff = tempfile.NamedTemporaryFile() + exitcode = subprocess.call(["diff", "-u", patched.name, intermediate.name], + stdout=diff, stderr=_devnull) + if exitcode != 1: # exitcode 0 cannot (=shouldn't) happen in this situation + raise PatchDiffError("Failed to compute diff (exitcode %d)." % exitcode) + + diff.flush() + diff.seek(0) + + # We expect this output format from 'diff', if this is not the case things might go wrong. + line = diff.readline() + assert line.startswith("--- ") + line = diff.readline() + assert line.startswith("+++ ") + + # Return the final diff + return diff diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-0/api-ms-win-core-datetime-l1-1-0.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-0/api-ms-win-core-datetime-l1-1-0.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-0/api-ms-win-core-datetime-l1-1-0.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-0/api-ms-win-core-datetime-l1-1-0.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,4 @@ +@ stdcall GetDateFormatA(long long ptr str ptr long) kernel32.GetDateFormatA +@ stdcall GetDateFormatW(long long ptr wstr ptr long) kernel32.GetDateFormatW +@ stdcall GetTimeFormatA(long long ptr str ptr long) kernel32.GetTimeFormatA +@ stdcall GetTimeFormatW(long long ptr wstr ptr long) kernel32.GetTimeFormatW diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-0/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-0/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-0/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-0/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = api-ms-win-core-datetime-l1-1-0.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-1/api-ms-win-core-datetime-l1-1-1.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-1/api-ms-win-core-datetime-l1-1-1.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-1/api-ms-win-core-datetime-l1-1-1.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-1/api-ms-win-core-datetime-l1-1-1.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,6 @@ +@ stdcall GetDateFormatA(long long ptr str ptr long) kernel32.GetDateFormatA +@ stub GetDateFormatEx +@ stdcall GetDateFormatW(long long ptr wstr ptr long) kernel32.GetDateFormatW +@ stdcall GetTimeFormatA(long long ptr str ptr long) kernel32.GetTimeFormatA +@ stub GetTimeFormatEx +@ stdcall GetTimeFormatW(long long ptr wstr ptr long) kernel32.GetTimeFormatW diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-1/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-1/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-1/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-datetime-l1-1-1/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = api-ms-win-core-datetime-l1-1-1.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-errorhandling-l1-1-2/api-ms-win-core-errorhandling-l1-1-2.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-errorhandling-l1-1-2/api-ms-win-core-errorhandling-l1-1-2.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-errorhandling-l1-1-2/api-ms-win-core-errorhandling-l1-1-2.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-errorhandling-l1-1-2/api-ms-win-core-errorhandling-l1-1-2.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,13 @@ +@ stdcall AddVectoredContinueHandler(long ptr) kernel32.AddVectoredContinueHandler +@ stdcall AddVectoredExceptionHandler(long ptr) kernel32.AddVectoredExceptionHandler +@ stdcall GetErrorMode() kernel32.GetErrorMode +@ stdcall GetLastError() kernel32.GetLastError +@ stdcall RaiseException(long long long ptr) kernel32.RaiseException +@ stub RaiseFailFastException +@ stdcall RemoveVectoredContinueHandler(ptr) kernel32.RemoveVectoredContinueHandler +@ stdcall RemoveVectoredExceptionHandler(ptr) kernel32.RemoveVectoredExceptionHandler +@ stdcall RestoreLastError(long) kernel32.RestoreLastError +@ stdcall SetErrorMode(long) kernel32.SetErrorMode +@ stdcall SetLastError(long) kernel32.SetLastError +@ stdcall SetUnhandledExceptionFilter(ptr) kernel32.SetUnhandledExceptionFilter +@ stdcall UnhandledExceptionFilter(ptr) kernel32.UnhandledExceptionFilter diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-errorhandling-l1-1-2/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-errorhandling-l1-1-2/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-errorhandling-l1-1-2/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-errorhandling-l1-1-2/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = api-ms-win-core-errorhandling-l1-1-2.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-0/api-ms-win-core-fibers-l1-1-0.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-0/api-ms-win-core-fibers-l1-1-0.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-0/api-ms-win-core-fibers-l1-1-0.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-0/api-ms-win-core-fibers-l1-1-0.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,4 @@ +@ stdcall FlsAlloc(ptr) kernel32.FlsAlloc +@ stdcall FlsFree(long) kernel32.FlsFree +@ stdcall FlsGetValue(long) kernel32.FlsGetValue +@ stdcall FlsSetValue(long ptr) kernel32.FlsSetValue diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-0/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-0/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-0/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-0/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = api-ms-win-core-fibers-l1-1-0.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-1/api-ms-win-core-fibers-l1-1-1.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-1/api-ms-win-core-fibers-l1-1-1.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-1/api-ms-win-core-fibers-l1-1-1.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-1/api-ms-win-core-fibers-l1-1-1.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,5 @@ +@ stdcall FlsAlloc(ptr) kernel32.FlsAlloc +@ stdcall FlsFree(long) kernel32.FlsFree +@ stdcall FlsGetValue(long) kernel32.FlsGetValue +@ stdcall FlsSetValue(long ptr) kernel32.FlsSetValue +@ stdcall IsThreadAFiber() kernel32.IsThreadAFiber diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-1/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-1/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-1/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-fibers-l1-1-1/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = api-ms-win-core-fibers-l1-1-1.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-0/api-ms-win-core-file-l2-1-0.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-0/api-ms-win-core-file-l2-1-0.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-0/api-ms-win-core-file-l2-1-0.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-0/api-ms-win-core-file-l2-1-0.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,11 @@ +@ stub CopyFile2 +@ stdcall CopyFileExW(wstr wstr ptr ptr ptr long) kernel32.CopyFileExW +@ stdcall CreateDirectoryExW(wstr wstr ptr) kernel32.CreateDirectoryExW +@ stdcall CreateHardLinkW(wstr wstr ptr) kernel32.CreateHardLinkW +@ stdcall CreateSymbolicLinkW(wstr wstr long) kernel32.CreateSymbolicLinkW +@ stdcall GetFileInformationByHandleEx(long long ptr long) kernel32.GetFileInformationByHandleEx +@ stdcall MoveFileExW(wstr wstr long) kernel32.MoveFileExW +@ stdcall MoveFileWithProgressW(wstr wstr ptr ptr long) kernel32.MoveFileWithProgressW +@ stub ReOpenFile +@ stdcall ReadDirectoryChangesW(long ptr long long long ptr ptr ptr) kernel32.ReadDirectoryChangesW +@ stdcall ReplaceFileW(wstr wstr wstr long ptr ptr) kernel32.ReplaceFileW diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-0/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-0/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-0/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-0/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = api-ms-win-core-file-l2-1-0.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-1/api-ms-win-core-file-l2-1-1.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-1/api-ms-win-core-file-l2-1-1.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-1/api-ms-win-core-file-l2-1-1.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-1/api-ms-win-core-file-l2-1-1.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,12 @@ +@ stub CopyFile2 +@ stdcall CopyFileExW(wstr wstr ptr ptr ptr long) kernel32.CopyFileExW +@ stdcall CreateDirectoryExW(wstr wstr ptr) kernel32.CreateDirectoryExW +@ stdcall CreateHardLinkW(wstr wstr ptr) kernel32.CreateHardLinkW +@ stdcall CreateSymbolicLinkW(wstr wstr long) kernel32.CreateSymbolicLinkW +@ stdcall GetFileInformationByHandleEx(long long ptr long) kernel32.GetFileInformationByHandleEx +@ stdcall MoveFileExW(wstr wstr long) kernel32.MoveFileExW +@ stdcall MoveFileWithProgressW(wstr wstr ptr ptr long) kernel32.MoveFileWithProgressW +@ stdcall OpenFileById(long ptr long long ptr long) kernel32.OpenFileById +@ stub ReOpenFile +@ stdcall ReadDirectoryChangesW(long ptr long long long ptr ptr ptr) kernel32.ReadDirectoryChangesW +@ stdcall ReplaceFileW(wstr wstr wstr long ptr ptr) kernel32.ReplaceFileW diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-1/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-1/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-1/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-file-l2-1-1/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = api-ms-win-core-file-l2-1-1.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-localization-l1-2-0/api-ms-win-core-localization-l1-2-0.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-localization-l1-2-0/api-ms-win-core-localization-l1-2-0.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-localization-l1-2-0/api-ms-win-core-localization-l1-2-0.spec 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-localization-l1-2-0/api-ms-win-core-localization-l1-2-0.spec 2014-12-15 00:45:34.000000000 +0000 @@ -32,7 +32,7 @@ @ stdcall GetUserDefaultLangID() kernel32.GetUserDefaultLangID @ stdcall GetUserDefaultLocaleName(ptr long) kernel32.GetUserDefaultLocaleName @ stdcall GetUserGeoID(long) kernel32.GetUserGeoID -@ stub GetUserPreferredUILanguages +@ stdcall GetUserPreferredUILanguages(long ptr ptr ptr) kernel32.GetUserPreferredUILanguages @ stdcall IdnToAscii(long wstr long ptr long) kernel32.IdnToAscii @ stdcall IdnToUnicode(long wstr long ptr long) kernel32.IdnToUnicode @ stdcall IsDBCSLeadByte(long) kernel32.IsDBCSLeadByte diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-localization-l1-2-1/api-ms-win-core-localization-l1-2-1.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-localization-l1-2-1/api-ms-win-core-localization-l1-2-1.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-localization-l1-2-1/api-ms-win-core-localization-l1-2-1.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-localization-l1-2-1/api-ms-win-core-localization-l1-2-1.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,60 @@ +@ stdcall ConvertDefaultLocale(long) kernel32.ConvertDefaultLocale +@ stdcall EnumSystemGeoID(long long ptr) kernel32.EnumSystemGeoID +@ stdcall EnumSystemLocalesA(ptr long) kernel32.EnumSystemLocalesA +@ stdcall EnumSystemLocalesEx(ptr long long ptr) kernel32.EnumSystemLocalesEx +@ stdcall EnumSystemLocalesW(ptr long) kernel32.EnumSystemLocalesW +@ stub FindNLSString +@ stub FindNLSStringEx +@ stdcall FormatMessageA(long ptr long long ptr long ptr) kernel32.FormatMessageA +@ stdcall FormatMessageW(long ptr long long ptr long ptr) kernel32.FormatMessageW +@ stdcall GetACP() kernel32.GetACP +@ stdcall GetCPInfo(long ptr) kernel32.GetCPInfo +@ stdcall GetCPInfoExW(long long ptr) kernel32.GetCPInfoExW +@ stdcall GetCalendarInfoEx(wstr long ptr long ptr long ptr) kernel32.GetCalendarInfoEx +@ stdcall GetCalendarInfoW(long long long ptr long ptr) kernel32.GetCalendarInfoW +@ stub GetFileMUIInfo +@ stub GetFileMUIPath +@ stdcall GetGeoInfoW(long long ptr long long) kernel32.GetGeoInfoW +@ stdcall GetLocaleInfoA(long long ptr long) kernel32.GetLocaleInfoA +@ stdcall GetLocaleInfoEx(wstr long ptr long) kernel32.GetLocaleInfoEx +@ stdcall GetLocaleInfoW(long long ptr long) kernel32.GetLocaleInfoW +@ stub GetNLSVersion +@ stub GetNLSVersionEx +@ stdcall GetOEMCP() kernel32.GetOEMCP +@ stub GetProcessPreferredUILanguages +@ stdcall GetSystemDefaultLCID() kernel32.GetSystemDefaultLCID +@ stdcall GetSystemDefaultLangID() kernel32.GetSystemDefaultLangID +@ stub GetSystemPreferredUILanguages +@ stdcall GetThreadLocale() kernel32.GetThreadLocale +@ stdcall GetThreadPreferredUILanguages(long ptr ptr ptr) kernel32.GetThreadPreferredUILanguages +@ stdcall GetThreadUILanguage() kernel32.GetThreadUILanguage +@ stub GetUILanguageInfo +@ stdcall GetUserDefaultLCID() kernel32.GetUserDefaultLCID +@ stdcall GetUserDefaultLangID() kernel32.GetUserDefaultLangID +@ stdcall GetUserDefaultLocaleName(ptr long) kernel32.GetUserDefaultLocaleName +@ stdcall GetUserGeoID(long) kernel32.GetUserGeoID +@ stdcall GetUserPreferredUILanguages(long ptr ptr ptr) kernel32.GetUserPreferredUILanguages +@ stdcall IdnToAscii(long wstr long ptr long) kernel32.IdnToAscii +@ stdcall IdnToUnicode(long wstr long ptr long) kernel32.IdnToUnicode +@ stdcall IsDBCSLeadByte(long) kernel32.IsDBCSLeadByte +@ stdcall IsDBCSLeadByteEx(long long) kernel32.IsDBCSLeadByteEx +@ stub IsNLSDefinedString +@ stdcall IsValidCodePage(long) kernel32.IsValidCodePage +@ stdcall IsValidLanguageGroup(long long) kernel32.IsValidLanguageGroup +@ stdcall IsValidLocale(long long) kernel32.IsValidLocale +@ stdcall IsValidLocaleName(wstr) kernel32.IsValidLocaleName +@ stub IsValidNLSVersion +@ stdcall LCMapStringA(long long str long ptr long) kernel32.LCMapStringA +@ stdcall LCMapStringEx(wstr long wstr long ptr long ptr ptr long) kernel32.LCMapStringEx +@ stdcall LCMapStringW(long long wstr long ptr long) kernel32.LCMapStringW +@ stdcall LocaleNameToLCID(wstr long) kernel32.LocaleNameToLCID +@ stub ResolveLocaleName +@ stdcall SetCalendarInfoW(long long long wstr) kernel32.SetCalendarInfoW +@ stdcall SetLocaleInfoW(long long wstr) kernel32.SetLocaleInfoW +@ stub SetProcessPreferredUILanguages +@ stdcall SetThreadLocale(long) kernel32.SetThreadLocale +@ stdcall SetThreadPreferredUILanguages(long ptr ptr) kernel32.SetThreadPreferredUILanguages +@ stdcall SetThreadUILanguage(long) kernel32.SetThreadUILanguage +@ stdcall SetUserGeoID(long) kernel32.SetUserGeoID +@ stdcall VerLanguageNameA(long str long) kernel32.VerLanguageNameA +@ stdcall VerLanguageNameW(long wstr long) kernel32.VerLanguageNameW diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-localization-l1-2-1/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-localization-l1-2-1/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-localization-l1-2-1/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-localization-l1-2-1/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = api-ms-win-core-localization-l1-2-1.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-processthreads-l1-1-2/api-ms-win-core-processthreads-l1-1-2.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-processthreads-l1-1-2/api-ms-win-core-processthreads-l1-1-2.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-processthreads-l1-1-2/api-ms-win-core-processthreads-l1-1-2.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-processthreads-l1-1-2/api-ms-win-core-processthreads-l1-1-2.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,70 @@ +@ stdcall CreateProcessA(str str ptr ptr long long ptr str ptr ptr) kernel32.CreateProcessA +@ stub CreateProcessAsUserW +@ stdcall CreateProcessW(wstr wstr ptr ptr long long ptr wstr ptr ptr) kernel32.CreateProcessW +@ stdcall CreateRemoteThread(long ptr long ptr long long ptr) kernel32.CreateRemoteThread +@ stub CreateRemoteThreadEx +@ stdcall CreateThread(ptr long ptr long long ptr) kernel32.CreateThread +@ stub DeleteProcThreadAttributeList +@ stdcall ExitProcess(long) kernel32.ExitProcess +@ stdcall ExitThread(long) kernel32.ExitThread +@ stdcall FlushInstructionCache(long long long) kernel32.FlushInstructionCache +@ stdcall FlushProcessWriteBuffers() kernel32.FlushProcessWriteBuffers +@ stdcall -norelay GetCurrentProcess() kernel32.GetCurrentProcess +@ stdcall -norelay GetCurrentProcessId() kernel32.GetCurrentProcessId +@ stdcall GetCurrentProcessorNumber() kernel32.GetCurrentProcessorNumber +@ stub GetCurrentProcessorNumberEx +@ stdcall -norelay GetCurrentThread() kernel32.GetCurrentThread +@ stdcall -norelay GetCurrentThreadId() kernel32.GetCurrentThreadId +@ stub GetCurrentThreadStackLimits +@ stdcall GetExitCodeProcess(long ptr) kernel32.GetExitCodeProcess +@ stdcall GetExitCodeThread(long ptr) kernel32.GetExitCodeThread +@ stdcall GetPriorityClass(long) kernel32.GetPriorityClass +@ stdcall GetProcessHandleCount(long ptr) kernel32.GetProcessHandleCount +@ stdcall GetProcessId(long) kernel32.GetProcessId +@ stub GetProcessIdOfThread +@ stub GetProcessMitigationPolicy +@ stdcall GetProcessPriorityBoost(long ptr) kernel32.GetProcessPriorityBoost +@ stdcall GetProcessTimes(long ptr ptr ptr ptr) kernel32.GetProcessTimes +@ stdcall GetProcessVersion(long) kernel32.GetProcessVersion +@ stdcall GetStartupInfoW(ptr) kernel32.GetStartupInfoW +@ stdcall GetSystemTimes(ptr ptr ptr) kernel32.GetSystemTimes +@ stdcall GetThreadContext(long ptr) kernel32.GetThreadContext +@ stdcall GetThreadIOPendingFlag(long ptr) kernel32.GetThreadIOPendingFlag +@ stdcall GetThreadId(ptr) kernel32.GetThreadId +@ stub GetThreadIdealProcessorEx +@ stub GetThreadInformation +@ stdcall GetThreadPriority(long) kernel32.GetThreadPriority +@ stdcall GetThreadPriorityBoost(long ptr) kernel32.GetThreadPriorityBoost +@ stdcall GetThreadTimes(long ptr ptr ptr ptr) kernel32.GetThreadTimes +@ stub InitializeProcThreadAttributeList +@ stub IsProcessCritical +@ stdcall IsProcessorFeaturePresent(long) kernel32.IsProcessorFeaturePresent +@ stdcall OpenProcess(long long long) kernel32.OpenProcess +@ stub OpenProcessToken +@ stdcall OpenThread(long long long) kernel32.OpenThread +@ stub OpenThreadToken +@ stdcall ProcessIdToSessionId(long ptr) kernel32.ProcessIdToSessionId +@ stub QueryProcessAffinityUpdateMode +@ stdcall QueueUserAPC(ptr long long) kernel32.QueueUserAPC +@ stdcall ResumeThread(long) kernel32.ResumeThread +@ stdcall SetPriorityClass(long long) kernel32.SetPriorityClass +@ stub SetProcessAffinityUpdateMode +@ stub SetProcessMitigationPolicy +@ stdcall SetProcessPriorityBoost(long long) kernel32.SetProcessPriorityBoost +@ stdcall SetProcessShutdownParameters(long long) kernel32.SetProcessShutdownParameters +@ stdcall SetThreadContext(long ptr) kernel32.SetThreadContext +@ stub SetThreadIdealProcessorEx +@ stub SetThreadInformation +@ stdcall SetThreadPriority(long long) kernel32.SetThreadPriority +@ stdcall SetThreadPriorityBoost(long long) kernel32.SetThreadPriorityBoost +@ stdcall SetThreadStackGuarantee(ptr) kernel32.SetThreadStackGuarantee +@ stub SetThreadToken +@ stdcall SuspendThread(long) kernel32.SuspendThread +@ stdcall SwitchToThread() kernel32.SwitchToThread +@ stdcall TerminateProcess(long long) kernel32.TerminateProcess +@ stdcall TerminateThread(long long) kernel32.TerminateThread +@ stdcall TlsAlloc() kernel32.TlsAlloc +@ stdcall TlsFree(long) kernel32.TlsFree +@ stdcall TlsGetValue(long) kernel32.TlsGetValue +@ stdcall TlsSetValue(long ptr) kernel32.TlsSetValue +@ stub UpdateProcThreadAttribute diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-processthreads-l1-1-2/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-processthreads-l1-1-2/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-processthreads-l1-1-2/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-processthreads-l1-1-2/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = api-ms-win-core-processthreads-l1-1-2.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-sysinfo-l1-2-1/api-ms-win-core-sysinfo-l1-2-1.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-sysinfo-l1-2-1/api-ms-win-core-sysinfo-l1-2-1.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-sysinfo-l1-2-1/api-ms-win-core-sysinfo-l1-2-1.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-sysinfo-l1-2-1/api-ms-win-core-sysinfo-l1-2-1.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,36 @@ +@ stub DnsHostnameToComputerNameExW +@ stub EnumSystemFirmwareTables +@ stdcall GetComputerNameExA(long ptr ptr) kernel32.GetComputerNameExA +@ stdcall GetComputerNameExW(long ptr ptr) kernel32.GetComputerNameExW +@ stdcall GetLocalTime(ptr) kernel32.GetLocalTime +@ stdcall GetLogicalProcessorInformation(ptr ptr) kernel32.GetLogicalProcessorInformation +@ stdcall GetLogicalProcessorInformationEx(long ptr ptr) kernel32.GetLogicalProcessorInformationEx +@ stdcall GetNativeSystemInfo(ptr) kernel32.GetNativeSystemInfo +@ stub GetOsSafeBootMode +@ stub GetPhysicallyInstalledSystemMemory +@ stdcall GetProductInfo(long long long long ptr) kernel32.GetProductInfo +@ stdcall GetSystemDirectoryA(ptr long) kernel32.GetSystemDirectoryA +@ stdcall GetSystemDirectoryW(ptr long) kernel32.GetSystemDirectoryW +@ stub GetSystemFirmwareTable +@ stdcall GetSystemInfo(ptr) kernel32.GetSystemInfo +@ stdcall GetSystemTime(ptr) kernel32.GetSystemTime +@ stdcall GetSystemTimeAdjustment(ptr ptr ptr) kernel32.GetSystemTimeAdjustment +@ stdcall GetSystemTimeAsFileTime(ptr) kernel32.GetSystemTimeAsFileTime +@ stub GetSystemTimePreciseAsFileTime +@ stdcall GetSystemWindowsDirectoryA(ptr long) kernel32.GetSystemWindowsDirectoryA +@ stdcall GetSystemWindowsDirectoryW(ptr long) kernel32.GetSystemWindowsDirectoryW +@ stdcall -ret64 GetTickCount64() kernel32.GetTickCount64 +@ stdcall GetTickCount() kernel32.GetTickCount +@ stdcall GetVersion() kernel32.GetVersion +@ stdcall GetVersionExA(ptr) kernel32.GetVersionExA +@ stdcall GetVersionExW(ptr) kernel32.GetVersionExW +@ stdcall GetWindowsDirectoryA(ptr long) kernel32.GetWindowsDirectoryA +@ stdcall GetWindowsDirectoryW(ptr long) kernel32.GetWindowsDirectoryW +@ stdcall GlobalMemoryStatusEx(ptr) kernel32.GlobalMemoryStatusEx +@ stub InstallELAMCertificateInfo +@ stub SetComputerNameEx2W +@ stdcall SetComputerNameExW(long wstr) kernel32.SetComputerNameExW +@ stdcall SetLocalTime(ptr) kernel32.SetLocalTime +@ stdcall SetSystemTime(ptr) kernel32.SetSystemTime +@ stdcall SetSystemTimeAdjustment(long long) kernel32.SetSystemTimeAdjustment +@ stdcall -ret64 VerSetConditionMask(long long long long) kernel32.VerSetConditionMask diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-sysinfo-l1-2-1/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-sysinfo-l1-2-1/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-sysinfo-l1-2-1/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-sysinfo-l1-2-1/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = api-ms-win-core-sysinfo-l1-2-1.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-winrt-error-l1-1-1/api-ms-win-core-winrt-error-l1-1-1.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-winrt-error-l1-1-1/api-ms-win-core-winrt-error-l1-1-1.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-winrt-error-l1-1-1/api-ms-win-core-winrt-error-l1-1-1.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-winrt-error-l1-1-1/api-ms-win-core-winrt-error-l1-1-1.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,19 @@ +@ stub GetRestrictedErrorInfo +@ stub IsErrorPropagationEnabled +@ stub RoCaptureErrorContext +@ stub RoClearError +@ stub RoFailFastWithErrorContext +@ stub RoGetErrorReportingFlags +@ stub RoGetMatchingRestrictedErrorInfo +@ stub RoInspectCapturedStackBackTrace +@ stub RoInspectThreadErrorInfo +@ stub RoOriginateError +@ stub RoOriginateErrorW +@ stub RoOriginateLanguageException +@ stub RoReportFailedDelegate +@ stub RoReportUnhandledError +@ stub RoResolveRestrictedErrorInfoReference +@ stub RoSetErrorReportingFlags +@ stub RoTransformError +@ stub RoTransformErrorW +@ stub SetRestrictedErrorInfo diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-winrt-error-l1-1-1/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-winrt-error-l1-1-1/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-winrt-error-l1-1-1/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-winrt-error-l1-1-1/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = api-ms-win-core-winrt-error-l1-1-1.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-winrt-l1-1-0/api-ms-win-core-winrt-l1-1-0.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-winrt-l1-1-0/api-ms-win-core-winrt-l1-1-0.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-winrt-l1-1-0/api-ms-win-core-winrt-l1-1-0.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-winrt-l1-1-0/api-ms-win-core-winrt-l1-1-0.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,9 @@ +@ stub RoActivateInstance +@ stub RoGetActivationFactory +@ stub RoGetApartmentIdentifier +@ stdcall RoInitialize(long) combase.RoInitialize +@ stub RoRegisterActivationFactories +@ stub RoRegisterForApartmentShutdown +@ stub RoRevokeActivationFactories +@ stdcall RoUninitialize() combase.RoUninitialize +@ stub RoUnregisterForApartmentShutdown diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-winrt-l1-1-0/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-winrt-l1-1-0/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-winrt-l1-1-0/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-winrt-l1-1-0/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = api-ms-win-core-winrt-l1-1-0.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec 2014-12-15 00:45:34.000000000 +0000 @@ -22,6 +22,6 @@ @ stub WindowsReplaceString @ stub WindowsStringHasEmbeddedNull @ stub WindowsSubstring -@ stub WindowsSubstringwithSpecifiedLength +@ stub WindowsSubstringWithSpecifiedLength @ stub WindowsTrimStringEnd @ stub WindowsTrimStringStart diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-xstate-l2-1-0/api-ms-win-core-xstate-l2-1-0.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-xstate-l2-1-0/api-ms-win-core-xstate-l2-1-0.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-xstate-l2-1-0/api-ms-win-core-xstate-l2-1-0.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-xstate-l2-1-0/api-ms-win-core-xstate-l2-1-0.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,6 @@ +@ stub CopyContext +@ stub GetEnabledXStateFeatures +@ stub GetXStateFeaturesMask +@ stub InitializeContext +@ stub LocateXStateFeature +@ stub SetXStateFeaturesMask diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-xstate-l2-1-0/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-xstate-l2-1-0/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/api-ms-win-core-xstate-l2-1-0/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/api-ms-win-core-xstate-l2-1-0/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = api-ms-win-core-xstate-l2-1-0.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/atl/atl_ax.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/atl/atl_ax.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/atl/atl_ax.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/atl/atl_ax.c 2014-12-15 00:45:34.000000000 +0000 @@ -1137,7 +1137,6 @@ #define GET_DWORD(x) (*(const DWORD *)(x)) #define PUT_BLOCK(x,y) do {if (!advance_array(&output, &allocated, &filled, (x), (y))) return NULL;} while (0) #define PUT_WORD(x) do {WORD w = (x);PUT_BLOCK(&w, 1);} while(0) -#define PUT_DWORD(x) do {DWORD w = (x);PUT_BLOCK(&w, 2);} while(0) const WORD *tmp, *src = (const WORD *)src_tmpl; WORD *output; DWORD allocated, filled; /* in WORDs */ diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/cabinet/fdi.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/cabinet/fdi.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/cabinet/fdi.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/cabinet/fdi.c 2014-12-15 00:45:34.000000000 +0000 @@ -702,11 +702,6 @@ if (!fdi) return FALSE; - if (!hf) { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - if (!pfdici) { SetLastError(ERROR_BAD_ARGUMENTS); return FALSE; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/cabinet/tests/fdi.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/cabinet/tests/fdi.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/cabinet/tests/fdi.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/cabinet/tests/fdi.c 2014-12-15 00:45:34.000000000 +0000 @@ -187,6 +187,39 @@ return SetFilePointer(handle, dist, NULL, seektype); } +/* Callbacks for testing FDIIsCabinet with hf == 0 */ +static INT_PTR static_fdi_handle; + +static INT_PTR CDECL fdi_open_static(char *pszFile, int oflag, int pmode) +{ + ok(0, "FDIIsCabinet shouldn't call pfnopen\n"); + return 1; +} + +static UINT CDECL fdi_read_static(INT_PTR hf, void *pv, UINT cb) +{ + ok(hf == 0, "unexpected hf %lx\n", hf); + return fdi_read(static_fdi_handle, pv, cb); +} + +static UINT CDECL fdi_write_static(INT_PTR hf, void *pv, UINT cb) +{ + ok(0, "FDIIsCabinet shouldn't call pfnwrite\n"); + return 0; +} + +static int CDECL fdi_close_static(INT_PTR hf) +{ + ok(0, "FDIIsCabinet shouldn't call pfnclose\n"); + return 0; +} + +static LONG CDECL fdi_seek_static(INT_PTR hf, LONG dist, int seektype) +{ + ok(hf == 0, "unexpected hf %lx\n", hf); + return fdi_seek(static_fdi_handle, dist, seektype); +} + static void test_FDICreate(void) { HFDI hfdi; @@ -683,6 +716,28 @@ fdi_close(fd); FDIDestroy(hfdi); + + hfdi = FDICreate(fdi_alloc, fdi_free, fdi_open_static, fdi_read_static, + fdi_write_static, fdi_close_static, fdi_seek_static, + cpuUNKNOWN, &erf); + ok(hfdi != NULL, "Expected non-NULL context\n"); + + /* FDIIsCabinet accepts hf == 0 even though it's not a valid result of pfnopen */ + static_fdi_handle = fdi_open(extract, 0, 0); + ZeroMemory(&cabinfo, sizeof(FDICABINETINFO)); + SetLastError(0xdeadbeef); + ret = FDIIsCabinet(hfdi, 0, &cabinfo); + ok(ret == TRUE, "Expected TRUE, got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); + ok(cabinfo.cFiles == 4, "Expected 4, got %d\n", cabinfo.cFiles); + ok(cabinfo.cFolders == 1, "Expected 1, got %d\n", cabinfo.cFolders); + ok(cabinfo.setID == 0xbeef, "Expected 0xbeef, got %d\n", cabinfo.setID); + ok(cabinfo.cbCabinet == 182, "Expected 182, got %d\n", cabinfo.cbCabinet); + ok(cabinfo.iCabinet == 0, "Expected 0, got %d\n", cabinfo.iCabinet); + + fdi_close(static_fdi_handle); + FDIDestroy(hfdi); + delete_test_files(); } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/combase/combase.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/combase/combase.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/combase/combase.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/combase/combase.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,308 @@ +@ stub ObjectStublessClient3 +@ stub ObjectStublessClient4 +@ stub ObjectStublessClient5 +@ stub ObjectStublessClient6 +@ stub ObjectStublessClient7 +@ stub ObjectStublessClient8 +@ stub ObjectStublessClient9 +@ stub ObjectStublessClient10 +@ stub ObjectStublessClient11 +@ stub ObjectStublessClient12 +@ stub ObjectStublessClient13 +@ stub ObjectStublessClient14 +@ stub ObjectStublessClient15 +@ stub ObjectStublessClient16 +@ stub ObjectStublessClient17 +@ stub ObjectStublessClient18 +@ stub ObjectStublessClient19 +@ stub ObjectStublessClient20 +@ stub ObjectStublessClient21 +@ stub ObjectStublessClient22 +@ stub ObjectStublessClient23 +@ stub ObjectStublessClient24 +@ stub ObjectStublessClient25 +@ stub ObjectStublessClient26 +@ stub ObjectStublessClient27 +@ stub ObjectStublessClient28 +@ stub ObjectStublessClient29 +@ stub ObjectStublessClient30 +@ stub ObjectStublessClient31 +@ stub ObjectStublessClient32 +@ stub NdrProxyForwardingFunction3 +@ stub NdrProxyForwardingFunction4 +@ stub NdrProxyForwardingFunction5 +@ stub NdrProxyForwardingFunction6 +@ stub NdrProxyForwardingFunction7 +@ stub NdrProxyForwardingFunction8 +@ stub NdrProxyForwardingFunction9 +@ stub NdrProxyForwardingFunction10 +@ stub NdrProxyForwardingFunction11 +@ stub NdrProxyForwardingFunction12 +@ stub NdrProxyForwardingFunction13 +@ stub NdrProxyForwardingFunction14 +@ stub NdrProxyForwardingFunction15 +@ stub NdrProxyForwardingFunction16 +@ stub NdrProxyForwardingFunction17 +@ stub NdrProxyForwardingFunction18 +@ stub NdrProxyForwardingFunction19 +@ stub NdrProxyForwardingFunction20 +@ stub NdrProxyForwardingFunction21 +@ stub NdrProxyForwardingFunction22 +@ stub NdrProxyForwardingFunction23 +@ stub NdrProxyForwardingFunction24 +@ stub NdrProxyForwardingFunction25 +@ stub NdrProxyForwardingFunction26 +@ stub NdrProxyForwardingFunction27 +@ stub NdrProxyForwardingFunction28 +@ stub NdrProxyForwardingFunction29 +@ stub NdrProxyForwardingFunction30 +@ stub NdrProxyForwardingFunction31 +@ stub NdrProxyForwardingFunction32 +@ stub NdrOleInitializeExtension +@ stub RoFailFastWithErrorContextInternal2 +@ stub RoFailFastWithErrorContextInternal +@ stub UpdateProcessTracing +@ stub CLSIDFromOle1Class +@ stdcall CLSIDFromProgID(wstr ptr) ole32.CLSIDFromProgID +@ stdcall CLSIDFromString(wstr ptr) ole32.CLSIDFromString +@ stub CleanupOleStateInAllTls +@ stub CleanupTlsOleState +@ stub ClearCleanupFlag +@ stdcall CoAddRefServerProcess() ole32.CoAddRefServerProcess +@ stub CoAllowUnmarshalerCLSID +@ stub CoCancelCall +@ stdcall CoCopyProxy(ptr ptr) ole32.CoCopyProxy +@ stub CoCreateErrorInfo +@ stdcall CoCreateFreeThreadedMarshaler(ptr ptr) ole32.CoCreateFreeThreadedMarshaler +@ stdcall CoCreateGuid(ptr) ole32.CoCreateGuid +@ stdcall CoCreateInstance(ptr ptr long ptr ptr) ole32.CoCreateInstance +@ stdcall CoCreateInstanceEx(ptr ptr long ptr long ptr) ole32.CoCreateInstanceEx +@ stub CoCreateInstanceFromApp +@ stub CoCreateObjectInContext +@ stub CoDeactivateObject +@ stub CoDecodeProxy +@ stub CoDecrementMTAUsage +@ stub CoDisableCallCancellation +@ stub CoDisconnectContext +@ stdcall CoDisconnectObject(ptr long) ole32.CoDisconnectObject +@ stub CoEnableCallCancellation +@ stdcall CoFreeUnusedLibraries() ole32.CoFreeUnusedLibraries +@ stdcall CoFreeUnusedLibrariesEx(long long) ole32.CoFreeUnusedLibrariesEx +@ stub CoGetActivationState +@ stub CoGetApartmentID +@ stub CoGetApartmentType +@ stdcall CoGetCallContext(ptr ptr) ole32.CoGetCallContext +@ stub CoGetCallState +@ stdcall CoGetCallerTID(ptr) ole32.CoGetCallerTID +@ stub CoGetCancelObject +@ stdcall CoGetClassObject(ptr long ptr ptr ptr) ole32.CoGetClassObject +@ stub CoGetClassVersion +@ stdcall CoGetContextToken(ptr) ole32.CoGetContextToken +@ stdcall CoGetCurrentLogicalThreadId(ptr) ole32.CoGetCurrentLogicalThreadId +@ stdcall CoGetCurrentProcess() ole32.CoGetCurrentProcess +@ stdcall CoGetDefaultContext(long ptr ptr) ole32.CoGetDefaultContext +@ stub CoGetErrorInfo +@ stdcall CoGetInstanceFromFile(ptr ptr ptr long long wstr long ptr) ole32.CoGetInstanceFromFile +@ stdcall CoGetInstanceFromIStorage(ptr ptr ptr long ptr long ptr) ole32.CoGetInstanceFromIStorage +@ stdcall CoGetInterfaceAndReleaseStream(ptr ptr ptr) ole32.CoGetInterfaceAndReleaseStream +@ stdcall CoGetMalloc(long ptr) ole32.CoGetMalloc +@ stdcall CoGetMarshalSizeMax(ptr ptr ptr long ptr long) ole32.CoGetMarshalSizeMax +@ stub CoGetModuleType +@ stdcall CoGetObjectContext(ptr ptr) ole32.CoGetObjectContext +@ stdcall CoGetPSClsid(ptr ptr) ole32.CoGetPSClsid +@ stub CoGetProcessIdentifier +@ stdcall CoGetStandardMarshal(ptr ptr long ptr long ptr) ole32.CoGetStandardMarshal +@ stub CoGetStdMarshalEx +@ stub CoGetSystemSecurityPermissions +@ stdcall CoGetTreatAsClass(ptr ptr) ole32.CoGetTreatAsClass +@ stdcall CoImpersonateClient() ole32.CoImpersonateClient +@ stub CoIncrementMTAUsage +@ stdcall CoInitializeEx(ptr long) ole32.CoInitializeEx +@ stdcall CoInitializeSecurity(ptr long ptr ptr long long ptr long ptr) ole32.CoInitializeSecurity +@ stdcall CoInitializeWOW(long long) ole32.CoInitializeWOW +@ stub CoInvalidateRemoteMachineBindings +@ stdcall CoIsHandlerConnected(ptr) ole32.CoIsHandlerConnected +@ stdcall CoLockObjectExternal(ptr long long) ole32.CoLockObjectExternal +@ stdcall CoMarshalHresult(ptr long) ole32.CoMarshalHresult +@ stdcall CoMarshalInterThreadInterfaceInStream(ptr ptr ptr) ole32.CoMarshalInterThreadInterfaceInStream +@ stdcall CoMarshalInterface(ptr ptr ptr long ptr long) ole32.CoMarshalInterface +@ stub CoPopServiceDomain +@ stub CoPushServiceDomain +@ stub CoQueryAuthenticationServices +@ stdcall CoQueryClientBlanket(ptr ptr ptr ptr ptr ptr ptr) ole32.CoQueryClientBlanket +@ stdcall CoQueryProxyBlanket(ptr ptr ptr ptr ptr ptr ptr ptr) ole32.CoQueryProxyBlanket +@ stub CoReactivateObject +@ stub CoRegisterActivationFilter +@ stdcall CoRegisterClassObject(ptr ptr long long ptr) ole32.CoRegisterClassObject +@ stdcall CoRegisterInitializeSpy(ptr ptr) ole32.CoRegisterInitializeSpy +@ stdcall CoRegisterMallocSpy(ptr) ole32.CoRegisterMallocSpy +@ stdcall CoRegisterMessageFilter(ptr ptr) ole32.CoRegisterMessageFilter +@ stdcall CoRegisterPSClsid(ptr ptr) ole32.CoRegisterPSClsid +@ stub CoRegisterSurrogate +@ stub CoRegisterSurrogateEx +@ stdcall CoReleaseMarshalData(ptr) ole32.CoReleaseMarshalData +@ stdcall CoReleaseServerProcess() ole32.CoReleaseServerProcess +@ stdcall CoResumeClassObjects() ole32.CoResumeClassObjects +@ stub CoRetireServer +@ stdcall CoRevertToSelf() ole32.CoRevertToSelf +@ stdcall CoRevokeClassObject(long) ole32.CoRevokeClassObject +@ stdcall CoRevokeInitializeSpy(int64) ole32.CoRevokeInitializeSpy +@ stdcall CoRevokeMallocSpy() ole32.CoRevokeMallocSpy +@ stub CoSetCancelObject +@ stub CoSetErrorInfo +@ stdcall CoSetProxyBlanket(ptr long long ptr long long ptr long) ole32.CoSetProxyBlanket +@ stdcall CoSuspendClassObjects() ole32.CoSuspendClassObjects +@ stdcall CoSwitchCallContext(ptr ptr) ole32.CoSwitchCallContext +@ stdcall CoTaskMemAlloc(long) ole32.CoTaskMemAlloc +@ stdcall CoTaskMemFree(ptr) ole32.CoTaskMemFree +@ stdcall CoTaskMemRealloc(ptr long) ole32.CoTaskMemRealloc +@ stub CoTestCancel +@ stdcall CoUninitialize() ole32.CoUninitialize +@ stub CoUnloadingWOW +@ stdcall CoUnmarshalHresult(ptr ptr) ole32.CoUnmarshalHresult +@ stdcall CoUnmarshalInterface(ptr ptr ptr) ole32.CoUnmarshalInterface +@ stub CoVrfCheckThreadState +@ stub CoVrfGetThreadState +@ stub CoVrfReleaseThreadState +@ stdcall CoWaitForMultipleHandles(long long long ptr ptr) ole32.CoWaitForMultipleHandles +@ stub CoWaitForMultipleObjects +@ stdcall CreateErrorInfo(ptr) ole32.CreateErrorInfo +@ stdcall CreateStreamOnHGlobal(ptr long ptr) ole32.CreateStreamOnHGlobal +@ stub DcomChannelSetHResult +@ stdcall DllDebugObjectRPCHook(long ptr) ole32.DllDebugObjectRPCHook +@ stub DllGetActivationFactory +@ stdcall -private DllGetClassObject(ptr ptr ptr) ole32.DllGetClassObject +@ stub EnableHookObject +@ stdcall FreePropVariantArray(long ptr) ole32.FreePropVariantArray +@ stub FreePropVariantArrayWorker +@ stub GetCatalogHelper +@ stdcall GetErrorInfo(long ptr) ole32.GetErrorInfo +@ stub GetFuncDescs +@ stdcall GetHGlobalFromStream(ptr ptr) ole32.GetHGlobalFromStream +@ stub GetHookInterface +@ stub GetRestrictedErrorInfo +@ stub HSTRING_UserFree +@ stub HSTRING_UserFree64 +@ stub HSTRING_UserMarshal +@ stub HSTRING_UserMarshal64 +@ stub HSTRING_UserSize +@ stub HSTRING_UserSize64 +@ stub HSTRING_UserUnmarshal +@ stub HSTRING_UserUnmarshal64 +@ stub HkOleRegisterObject +@ stdcall IIDFromString(wstr ptr) ole32.IIDFromString +@ stub InternalAppInvokeExceptionFilter +@ stub InternalCCFreeUnused +@ stub InternalCCGetClassInformationForDde +@ stub InternalCCGetClassInformationFromKey +@ stub InternalCCSetDdeServerWindow +@ stub InternalCMLSendReceive +@ stub InternalCallAsProxyExceptionFilter +@ stub InternalCallFrameExceptionFilter +@ stub InternalCallerIsAppContainer +@ stub InternalCanMakeOutCall +@ stub InternalCoIsSurrogateProcess +@ stub InternalCoRegisterDisconnectCallback +@ stub InternalCoRegisterSurrogatedObject +@ stub InternalCoStdMarshalObject +@ stub InternalCoUnregisterDisconnectCallback +@ stub InternalCompleteObjRef +@ stub InternalCreateCAggId +@ stub InternalCreateIdentityHandler +@ stub InternalDoATClassCreate +@ stub InternalFillLocalOXIDInfo +@ stub InternalFreeObjRef +@ stub InternalGetWindowPropInterface +@ stub InternalIrotEnumRunning +@ stub InternalIrotGetObject +@ stub InternalIrotGetTimeOfLastChange +@ stub InternalIrotIsRunning +@ stub InternalIrotNoteChangeTime +@ stub InternalIrotRegister +@ stub InternalIrotRevoke +@ stub InternalIsApartmentInitialized +@ stub InternalIsProcessInitialized +@ stub InternalMarshalObjRef +@ stub InternalNotifyDDStartOrStop +@ stub InternalOleModalLoopBlockFn +@ stub InternalRegisterWindowPropInterface +@ stub InternalReleaseMarshalObjRef +@ stub InternalSTAInvoke +@ stub InternalServerExceptionFilter +@ stub InternalSetAptCallCtrlOnTlsIfRequired +@ stub InternalSetOleThunkWowPtr +@ stub InternalStubInvoke +@ stub InternalTlsAllocData +@ stub InternalUnmarshalObjRef +@ stub IsErrorPropagationEnabled +@ stub NdrExtStubInitialize +@ stub NdrOleDllGetClassObject +@ stub NdrpFindInterface +@ stdcall ProgIDFromCLSID(ptr ptr) ole32.ProgIDFromCLSID +@ stdcall PropVariantClear(ptr) ole32.PropVariantClear +@ stdcall PropVariantCopy(ptr ptr) ole32.PropVariantCopy +@ stub ReleaseFuncDescs +@ stub RoActivateInstance +@ stub RoCaptureErrorContext +@ stub RoClearError +@ stub RoFailFastWithErrorContext +@ stub RoFreeParameterizedTypeExtra +@ stub RoGetActivatableClassRegistration +@ stub RoGetActivationFactory +@ stub RoGetAgileReference +@ stub RoGetApartmentIdentifier +@ stub RoGetErrorReportingFlags +@ stub RoGetMatchingRestrictedErrorInfo +@ stub RoGetParameterizedTypeInstanceIID +@ stub RoGetServerActivatableClasses +@ stdcall RoInitialize(long) +@ stub RoInspectCapturedStackBackTrace +@ stub RoInspectThreadErrorInfo +@ stub RoOriginateError +@ stub RoOriginateErrorW +@ stub RoOriginateLanguageException +@ stub RoParameterizedTypeExtraGetTypeSignature +@ stub RoRegisterActivationFactories +@ stub RoRegisterForApartmentShutdown +@ stub RoReportCapabilityCheckFailure +@ stub RoReportFailedDelegate +@ stub RoReportUnhandledError +@ stub RoResolveRestrictedErrorInfoReference +@ stub RoRevokeActivationFactories +@ stub RoSetErrorReportingFlags +@ stub RoTransformError +@ stub RoTransformErrorW +@ stdcall RoUninitialize() +@ stub RoUnregisterForApartmentShutdown +@ stub SetCleanupFlag +@ stdcall SetErrorInfo(long ptr) ole32.SetErrorInfo +@ stub SetRestrictedErrorInfo +@ stdcall StringFromCLSID(ptr ptr) ole32.StringFromCLSID +@ stdcall StringFromGUID2(ptr ptr long) ole32.StringFromGUID2 +@ stdcall StringFromIID(ptr ptr) ole32.StringFromIID +@ stub UpdateDCOMSettings +@ stdcall WdtpInterfacePointer_UserMarshal(ptr long ptr ptr ptr) ole32.WdtpInterfacePointer_UserMarshal +@ stub WdtpInterfacePointer_UserMarshal64 +@ stdcall WdtpInterfacePointer_UserSize(ptr long ptr long ptr) ole32.WdtpInterfacePointer_UserSize +@ stub WdtpInterfacePointer_UserSize64 +@ stdcall WdtpInterfacePointer_UserUnmarshal(ptr ptr ptr ptr) ole32.WdtpInterfacePointer_UserUnmarshal +@ stub WdtpInterfacePointer_UserUnmarshal64 +@ stub WindowsCompareStringOrdinal +@ stub WindowsConcatString +@ stub WindowsCreateString +@ stub WindowsCreateStringReference +@ stub WindowsDeleteString +@ stub WindowsDeleteStringBuffer +@ stub WindowsDuplicateString +@ stub WindowsGetStringLen +@ stub WindowsGetStringRawBuffer +@ stub WindowsInspectString +@ stub WindowsIsStringEmpty +@ stub WindowsPreallocateStringBuffer +@ stub WindowsPromoteStringBuffer +@ stub WindowsReplaceString +@ stub WindowsStringHasEmbeddedNull +@ stub WindowsSubstring +@ stub WindowsSubstringWithSpecifiedLength +@ stub WindowsTrimStringEnd +@ stub WindowsTrimStringStart diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/combase/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/combase/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/combase/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/combase/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,5 @@ +MODULE = combase.dll +IMPORTS = ole32 + +C_SRCS = \ + roapi.c diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/combase/roapi.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/combase/roapi.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/combase/roapi.c 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/combase/roapi.c 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,47 @@ +/* + * Copyright 2014 Martin Storsjo + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "objbase.h" +#include "roapi.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(combase); + +/*********************************************************************** + * RoInitialize (combase.@) + */ +HRESULT WINAPI RoInitialize(RO_INIT_TYPE type) +{ + switch (type) { + case RO_INIT_SINGLETHREADED: + return CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + default: + FIXME("type %d\n", type); + case RO_INIT_MULTITHREADED: + return CoInitializeEx(NULL, COINIT_MULTITHREADED); + } +} + +/*********************************************************************** + * RoUninitialize (combase.@) + */ +void WINAPI RoUninitialize(void) +{ + CoUninitialize(); +} diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/comctl32/listview.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/comctl32/listview.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/comctl32/listview.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/comctl32/listview.c 2014-12-15 00:45:34.000000000 +0000 @@ -4005,10 +4005,7 @@ rect.top = rect.bottom = infoPtr->ptClickPos.y; InflateRect(&rect, GetSystemMetrics(SM_CXDRAG), GetSystemMetrics(SM_CYDRAG)); - } - if (infoPtr->bLButtonDown) - { if (infoPtr->bMarqueeSelect) { POINT coords_orig; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/comctl32/tests/imagelist.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/comctl32/tests/imagelist.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/comctl32/tests/imagelist.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/comctl32/tests/imagelist.c 2014-12-15 00:45:34.000000000 +0000 @@ -295,6 +295,7 @@ drag = ImageList_GetDragImage(NULL, NULL); ok(ret && drag, "ImageList drag was created\n"); ImageList_EndDrag(); + ImageList_Destroy(himl); } static void test_hotspot(void) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/comctl32/toolbar.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/comctl32/toolbar.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/comctl32/toolbar.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/comctl32/toolbar.c 2014-12-15 00:45:34.000000000 +0000 @@ -5067,8 +5067,6 @@ TOOLBAR_SetHotItemEx(infoPtr, nHotItem, lParam); - GetFocus(); - return (nOldHotItem < 0) ? -1 : (LRESULT)nOldHotItem; } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/cryptnet/cryptnet_main.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/cryptnet/cryptnet_main.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/cryptnet/cryptnet_main.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/cryptnet/cryptnet_main.c 2014-12-15 00:45:34.000000000 +0000 @@ -1184,10 +1184,27 @@ typedef BOOL (WINAPI *AddContextToStore)(HCERTSTORE hCertStore, const void *pContext, DWORD dwAddDisposition, const void **ppStoreContext); +static BOOL decode_base64_blob( const CRYPT_DATA_BLOB *in, CRYPT_DATA_BLOB *out ) +{ + BOOL ret; + DWORD len = in->cbData; + + while (len && !in->pbData[len - 1]) len--; + if (!CryptStringToBinaryA( (char *)in->pbData, len, CRYPT_STRING_BASE64_ANY, + NULL, &out->cbData, NULL, NULL )) return FALSE; + + if (!(out->pbData = CryptMemAlloc( out->cbData ))) return FALSE; + ret = CryptStringToBinaryA( (char *)in->pbData, len, CRYPT_STRING_BASE64_ANY, + out->pbData, &out->cbData, NULL, NULL ); + if (!ret) CryptMemFree( out->pbData ); + return ret; +} + static BOOL CRYPT_CreateContext(const CRYPT_BLOB_ARRAY *pObject, DWORD dwExpectedContentTypeFlags, AddContextToStore addFunc, void **ppvContext) { BOOL ret = TRUE; + CRYPT_DATA_BLOB blob; if (!pObject->cBlob) { @@ -1197,9 +1214,20 @@ } else if (pObject->cBlob == 1) { - if (!CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &pObject->rgBlob[0], - dwExpectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_BINARY, 0, NULL, - NULL, NULL, NULL, NULL, (const void **)ppvContext)) + if (decode_base64_blob(&pObject->rgBlob[0], &blob)) + { + ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, + dwExpectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_BINARY, 0, + NULL, NULL, NULL, NULL, NULL, (const void **)ppvContext); + CryptMemFree(blob.pbData); + } + else + { + ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &pObject->rgBlob[0], + dwExpectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_BINARY, 0, + NULL, NULL, NULL, NULL, NULL, (const void **)ppvContext); + } + if (!ret) { SetLastError(CRYPT_E_NO_MATCH); ret = FALSE; @@ -1217,10 +1245,21 @@ for (i = 0; i < pObject->cBlob; i++) { - if (CryptQueryObject(CERT_QUERY_OBJECT_BLOB, - &pObject->rgBlob[i], dwExpectedContentTypeFlags, - CERT_QUERY_FORMAT_FLAG_BINARY, 0, NULL, NULL, NULL, NULL, - NULL, &context)) + if (decode_base64_blob(&pObject->rgBlob[i], &blob)) + { + ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, + dwExpectedContentTypeFlags, CERT_QUERY_FORMAT_FLAG_BINARY, + 0, NULL, NULL, NULL, NULL, NULL, &context); + CryptMemFree(blob.pbData); + } + else + { + ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, + &pObject->rgBlob[i], dwExpectedContentTypeFlags, + CERT_QUERY_FORMAT_FLAG_BINARY, 0, NULL, NULL, NULL, NULL, + NULL, &context); + } + if (ret) { if (!addFunc(store, context, CERT_STORE_ADD_ALWAYS, NULL)) ret = FALSE; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d2d1/brush.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/d2d1/brush.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d2d1/brush.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d2d1/brush.c 2014-12-15 00:45:34.000000000 +0000 @@ -448,11 +448,184 @@ (ID2D1BrushVtbl *)&d2d_linear_gradient_brush_vtbl); } +static inline struct d2d_brush *impl_from_ID2D1BitmapBrush(ID2D1BitmapBrush *iface) +{ + return CONTAINING_RECORD(iface, struct d2d_brush, ID2D1Brush_iface); +} + +static HRESULT STDMETHODCALLTYPE d2d_bitmap_brush_QueryInterface(ID2D1BitmapBrush *iface, + REFIID iid, void **out) +{ + TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); + + if (IsEqualGUID(iid, &IID_ID2D1BitmapBrush) + || IsEqualGUID(iid, &IID_ID2D1Brush) + || IsEqualGUID(iid, &IID_ID2D1Resource) + || IsEqualGUID(iid, &IID_IUnknown)) + { + ID2D1BitmapBrush_AddRef(iface); + *out = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG STDMETHODCALLTYPE d2d_bitmap_brush_AddRef(ID2D1BitmapBrush *iface) +{ + struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface); + ULONG refcount = InterlockedIncrement(&brush->refcount); + + TRACE("%p increasing refcount to %u.\n", iface, refcount); + + return refcount; +} + +static ULONG STDMETHODCALLTYPE d2d_bitmap_brush_Release(ID2D1BitmapBrush *iface) +{ + struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface); + ULONG refcount = InterlockedDecrement(&brush->refcount); + + TRACE("%p decreasing refcount to %u.\n", iface, refcount); + + if (!refcount) + HeapFree(GetProcessHeap(), 0, brush); + + return refcount; +} + +static void STDMETHODCALLTYPE d2d_bitmap_brush_GetFactory(ID2D1BitmapBrush *iface, + ID2D1Factory **factory) +{ + FIXME("iface %p, factory %p stub!\n", iface, factory); + + *factory = NULL; +} + +static void STDMETHODCALLTYPE d2d_bitmap_brush_SetOpacity(ID2D1BitmapBrush *iface, float opacity) +{ + struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface); + + TRACE("iface %p, opacity %.8e.\n", iface, opacity); + + brush->opacity = opacity; +} + +static void STDMETHODCALLTYPE d2d_bitmap_brush_SetTransform(ID2D1BitmapBrush *iface, + const D2D1_MATRIX_3X2_F *transform) +{ + FIXME("iface %p, transform %p stub!\n", iface, transform); +} + +static float STDMETHODCALLTYPE d2d_bitmap_brush_GetOpacity(ID2D1BitmapBrush *iface) +{ + struct d2d_brush *brush = impl_from_ID2D1BitmapBrush(iface); + + TRACE("iface %p.\n", iface); + + return brush->opacity; +} + +static void STDMETHODCALLTYPE d2d_bitmap_brush_GetTransform(ID2D1BitmapBrush *iface, + D2D1_MATRIX_3X2_F *transform) +{ + static const D2D1_MATRIX_3X2_F identity = + { + 1.0f, 0.0f, + 0.0f, 1.0f, + 0.0f, 0.0f, + }; + + FIXME("iface %p, transform %p stub!\n", iface, transform); + + *transform = identity; +} + +static void STDMETHODCALLTYPE d2d_bitmap_brush_SetExtendModeX(ID2D1BitmapBrush *iface, D2D1_EXTEND_MODE mode) +{ + FIXME("iface %p, mode %#x stub!\n", iface, mode); +} + +static void STDMETHODCALLTYPE d2d_bitmap_brush_SetExtendModeY(ID2D1BitmapBrush *iface, D2D1_EXTEND_MODE mode) +{ + FIXME("iface %p, mode %#x stub!\n", iface, mode); +} + +static void STDMETHODCALLTYPE d2d_bitmap_brush_SetInterpolationMode(ID2D1BitmapBrush *iface, + D2D1_BITMAP_INTERPOLATION_MODE mode) +{ + FIXME("iface %p, mode %#x stub!\n", iface, mode); +} + +static void STDMETHODCALLTYPE d2d_bitmap_brush_SetBitmap(ID2D1BitmapBrush *iface, ID2D1Bitmap *bitmap) +{ + FIXME("iface %p, bitmap %p stub!\n", iface, bitmap); +} + +static D2D1_EXTEND_MODE STDMETHODCALLTYPE d2d_bitmap_brush_GetExtendModeX(ID2D1BitmapBrush *iface) +{ + FIXME("iface %p stub!\n", iface); + + return D2D1_EXTEND_MODE_CLAMP; +} + +static D2D1_EXTEND_MODE STDMETHODCALLTYPE d2d_bitmap_brush_GetExtendModeY(ID2D1BitmapBrush *iface) +{ + FIXME("iface %p stub!\n", iface); + + return D2D1_EXTEND_MODE_CLAMP; +} + +static D2D1_BITMAP_INTERPOLATION_MODE STDMETHODCALLTYPE d2d_bitmap_brush_GetInterpolationMode(ID2D1BitmapBrush *iface) +{ + FIXME("iface %p stub!\n", iface); + + return D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR; +} + +static void STDMETHODCALLTYPE d2d_bitmap_brush_GetBitmap(ID2D1BitmapBrush *iface, ID2D1Bitmap **bitmap) +{ + FIXME("iface %p, bitmap %p stub!\n", iface, bitmap); +} + +static const struct ID2D1BitmapBrushVtbl d2d_bitmap_brush_vtbl = +{ + d2d_bitmap_brush_QueryInterface, + d2d_bitmap_brush_AddRef, + d2d_bitmap_brush_Release, + d2d_bitmap_brush_GetFactory, + d2d_bitmap_brush_SetOpacity, + d2d_bitmap_brush_SetTransform, + d2d_bitmap_brush_GetOpacity, + d2d_bitmap_brush_GetTransform, + d2d_bitmap_brush_SetExtendModeX, + d2d_bitmap_brush_SetExtendModeY, + d2d_bitmap_brush_SetInterpolationMode, + d2d_bitmap_brush_SetBitmap, + d2d_bitmap_brush_GetExtendModeX, + d2d_bitmap_brush_GetExtendModeY, + d2d_bitmap_brush_GetInterpolationMode, + d2d_bitmap_brush_GetBitmap, +}; + +void d2d_bitmap_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target, const ID2D1Bitmap *bitmap, + const D2D1_BITMAP_BRUSH_PROPERTIES *bitmap_brush_desc, const D2D1_BRUSH_PROPERTIES *brush_desc) +{ + FIXME("Ignoring brush properties.\n"); + + d2d_brush_init(brush, render_target, D2D_BRUSH_TYPE_BITMAP, brush_desc, + (ID2D1BrushVtbl *)&d2d_bitmap_brush_vtbl); +} + struct d2d_brush *unsafe_impl_from_ID2D1Brush(ID2D1Brush *iface) { if (!iface) return NULL; assert(iface->lpVtbl == (const ID2D1BrushVtbl *)&d2d_solid_color_brush_vtbl - || iface->lpVtbl == (const ID2D1BrushVtbl *)&d2d_linear_gradient_brush_vtbl); + || iface->lpVtbl == (const ID2D1BrushVtbl *)&d2d_linear_gradient_brush_vtbl + || iface->lpVtbl == (const ID2D1BrushVtbl *)&d2d_bitmap_brush_vtbl); return CONTAINING_RECORD(iface, struct d2d_brush, ID2D1Brush_iface); } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d2d1/d2d1_private.h wine-compholio-1.7.33~ubuntu15.04.1/dlls/d2d1/d2d1_private.h --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d2d1/d2d1_private.h 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d2d1/d2d1_private.h 2014-12-15 00:45:34.000000000 +0000 @@ -34,6 +34,7 @@ { D2D_BRUSH_TYPE_SOLID, D2D_BRUSH_TYPE_LINEAR, + D2D_BRUSH_TYPE_BITMAP, }; struct d2d_clip_stack @@ -124,6 +125,9 @@ void d2d_linear_gradient_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target, const D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES *gradient_brush_desc, const D2D1_BRUSH_PROPERTIES *brush_desc, ID2D1GradientStopCollection *gradient) DECLSPEC_HIDDEN; +void d2d_bitmap_brush_init(struct d2d_brush *brush, ID2D1RenderTarget *render_target, + const ID2D1Bitmap *bitmap, const D2D1_BITMAP_BRUSH_PROPERTIES *bitmap_brush_desc, + const D2D1_BRUSH_PROPERTIES *brush_desc) DECLSPEC_HIDDEN; struct d2d_brush *unsafe_impl_from_ID2D1Brush(ID2D1Brush *iface) DECLSPEC_HIDDEN; struct d2d_stroke_style diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d2d1/render_target.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/d2d1/render_target.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d2d1/render_target.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d2d1/render_target.c 2014-12-15 00:45:34.000000000 +0000 @@ -364,10 +364,20 @@ ID2D1Bitmap *bitmap, const D2D1_BITMAP_BRUSH_PROPERTIES *bitmap_brush_desc, const D2D1_BRUSH_PROPERTIES *brush_desc, ID2D1BitmapBrush **brush) { - FIXME("iface %p, bitmap %p, bitmap_brush_desc %p, brush_desc %p, brush %p stub!\n", + struct d2d_brush *object; + + TRACE("iface %p, bitmap %p, bitmap_brush_desc %p, brush_desc %p, brush %p.\n", iface, bitmap, bitmap_brush_desc, brush_desc, brush); - return E_NOTIMPL; + if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)))) + return E_OUTOFMEMORY; + + d2d_bitmap_brush_init(object, iface, bitmap, bitmap_brush_desc, brush_desc); + + TRACE("Created brush %p.\n", object); + *brush = (ID2D1BitmapBrush *)&object->ID2D1Brush_iface; + + return S_OK; } static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateSolidColorBrush(ID2D1RenderTarget *iface, @@ -826,7 +836,7 @@ ID3D10Buffer *vs_cb, *ps_cb; HRESULT hr; - static float transform[] = + static const float transform[] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d10core/texture.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d10core/texture.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d10core/texture.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d10core/texture.c 2014-12-15 00:45:34.000000000 +0000 @@ -251,6 +251,7 @@ const D3D10_TEXTURE2D_DESC *desc) { struct wined3d_resource_desc wined3d_desc; + unsigned int levels; HRESULT hr; texture->ID3D10Texture2D_iface.lpVtbl = &d3d10_texture2d_vtbl; @@ -300,7 +301,9 @@ wined3d_desc.depth = 1; wined3d_desc.size = 0; - if (FAILED(hr = wined3d_texture_create(device->wined3d_device, &wined3d_desc, desc->MipLevels, + levels = desc->MipLevels ? desc->MipLevels : wined3d_log2i(max(desc->Width, desc->Height)) + 1; + + if (FAILED(hr = wined3d_texture_create(device->wined3d_device, &wined3d_desc, levels, 0, texture, &d3d10_texture2d_wined3d_parent_ops, &texture->wined3d_texture))) { WARN("Failed to create wined3d texture, hr %#x.\n", hr); @@ -308,7 +311,7 @@ IUnknown_Release(texture->dxgi_surface); return hr; } - texture->desc.MipLevels = wined3d_texture_get_level_count(texture->wined3d_texture); + texture->desc.MipLevels = levels; texture->device = &device->ID3D10Device1_iface; ID3D10Device1_AddRef(texture->device); @@ -517,6 +520,7 @@ const D3D10_TEXTURE3D_DESC *desc) { struct wined3d_resource_desc wined3d_desc; + unsigned int levels; HRESULT hr; texture->ID3D10Texture3D_iface.lpVtbl = &d3d10_texture3d_vtbl; @@ -534,13 +538,15 @@ wined3d_desc.depth = desc->Depth; wined3d_desc.size = 0; - if (FAILED(hr = wined3d_texture_create(device->wined3d_device, &wined3d_desc, desc->MipLevels, + levels = desc->MipLevels ? desc->MipLevels : wined3d_log2i(max(max(desc->Width, desc->Height), desc->Depth)) + 1; + + if (FAILED(hr = wined3d_texture_create(device->wined3d_device, &wined3d_desc, levels, 0, texture, &d3d10_texture3d_wined3d_parent_ops, &texture->wined3d_texture))) { WARN("Failed to create wined3d texture, hr %#x.\n", hr); return hr; } - texture->desc.MipLevels = wined3d_texture_get_level_count(texture->wined3d_texture); + texture->desc.MipLevels = levels; texture->device = &device->ID3D10Device1_iface; ID3D10Device1_AddRef(texture->device); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d10core/view.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d10core/view.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d10core/view.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d10core/view.c 2014-12-15 00:45:34.000000000 +0000 @@ -987,6 +987,7 @@ HRESULT d3d10_shader_resource_view_init(struct d3d10_shader_resource_view *view, struct d3d10_device *device, ID3D10Resource *resource, const D3D10_SHADER_RESOURCE_VIEW_DESC *desc) { + struct wined3d_resource *wined3d_resource; HRESULT hr; view->ID3D10ShaderResourceView_iface.lpVtbl = &d3d10_shader_resource_view_vtbl; @@ -1002,7 +1003,14 @@ view->desc = *desc; } - if (FAILED(hr = wined3d_shader_resource_view_create(view, &d3d10_null_wined3d_parent_ops, &view->wined3d_view))) + if (!(wined3d_resource = wined3d_resource_from_resource(resource))) + { + ERR("Failed to get wined3d resource for d3d10 resource %p.\n", resource); + return E_FAIL; + } + + if (FAILED(hr = wined3d_shader_resource_view_create(wined3d_resource, + view, &d3d10_null_wined3d_parent_ops, &view->wined3d_view))) { WARN("Failed to create wined3d shader resource view, hr %#x.\n", hr); return hr; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d8/device.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d8/device.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d8/device.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d8/device.c 2014-12-15 00:45:34.000000000 +0000 @@ -647,6 +647,12 @@ TRACE("iface %p, present_parameters %p.\n", iface, present_parameters); + if (device->device_state == D3D8_DEVICE_STATE_LOST) + { + WARN("App not active, returning D3DERR_DEVICELOST.\n"); + return D3DERR_DEVICELOST; + } + wined3d_mutex_lock(); if (device->vertex_buffer) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d8/tests/device.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d8/tests/device.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d8/tests/device.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d8/tests/device.c 2014-12-15 00:45:34.000000000 +0000 @@ -2181,8 +2181,9 @@ WPARAM expect_wparam; }; -static const struct message *expect_messages, *unexpected_messages; +static const struct message *expect_messages; static HWND device_window, focus_window; +static BOOL windowposchanged_received; struct wndproc_thread_param { @@ -2230,12 +2231,12 @@ } } - if (unexpected_messages) - { - const struct message *i; - for (i = unexpected_messages; i->message; i++) - ok(i->message != message, "Got unexpected message %x on window %p.\n", message, hwnd); - } + /* KDE randomly does something with the hidden window during the + * mode change that sometimes generates a WM_WINDOWPOSCHANGING + * message. A WM_WINDOWPOSCHANGED message is not generated, so + * just flag WM_WINDOWPOSCHANGED as bad. */ + if (message == WM_WINDOWPOSCHANGED) + windowposchanged_received = TRUE; return DefWindowProcA(hwnd, message, wparam, lparam); } @@ -2344,13 +2345,45 @@ {WM_ACTIVATEAPP, FOCUS_WINDOW, TRUE, FALSE}, {0, 0, FALSE, 0}, }; - static const struct message focus_loss_messages_hidden_unexpected[] = + static const struct message focus_loss_messages_filtered[] = + { + /* WM_ACTIVATE is delivered to the window proc because it is + * generated by SetForegroundWindow before the d3d routine + * starts it work. Don't check for it due to focus-follows-mouse + * WMs though. */ + {WM_DISPLAYCHANGE, FOCUS_WINDOW, FALSE, 0}, + {WM_ACTIVATEAPP, FOCUS_WINDOW, TRUE, FALSE}, + {0, 0, FALSE, 0}, + }; + static const struct message reactivate_messages_filtered[] = + { + {WM_ACTIVATEAPP, FOCUS_WINDOW, TRUE, TRUE}, + {0, 0, FALSE, 0}, + }; + static const struct message sc_restore_messages[] = + { + {WM_WINDOWPOSCHANGING, FOCUS_WINDOW, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FOCUS_WINDOW, FALSE, 0}, + {WM_SIZE, FOCUS_WINDOW, TRUE, SIZE_RESTORED}, + {WM_SYSCOMMAND, FOCUS_WINDOW, TRUE, SC_RESTORE}, + {0, 0, FALSE, 0}, + }; + static const struct message sc_minimize_messages[] = + { + {WM_SYSCOMMAND, FOCUS_WINDOW, TRUE, SC_MINIMIZE}, + {WM_WINDOWPOSCHANGING, FOCUS_WINDOW, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FOCUS_WINDOW, FALSE, 0}, + {WM_MOVE, FOCUS_WINDOW, FALSE, 0}, + {WM_SIZE, FOCUS_WINDOW, TRUE, SIZE_MINIMIZED}, + {0, 0, FALSE, 0}, + }; + static const struct message sc_maximize_messages[] = { - /* KDE randomly does something with the hidden window during the - * mode change that sometimes generates a WM_WINDOWPOSCHANGING - * message. A WM_WINDOWPOSCHANGED message is not generated, so - * just flag WM_WINDOWPOSCHANGED as bad. */ - {WM_WINDOWPOSCHANGED, 0, FALSE, 0}, + {WM_SYSCOMMAND, FOCUS_WINDOW, TRUE, SC_MAXIMIZE}, + {WM_WINDOWPOSCHANGING, FOCUS_WINDOW, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FOCUS_WINDOW, FALSE, 0}, + {WM_MOVE, FOCUS_WINDOW, FALSE, 0}, + {WM_SIZE, FOCUS_WINDOW, TRUE, SIZE_MAXIMIZED}, {0, 0, FALSE, 0}, }; @@ -2568,18 +2601,48 @@ flush_events(); expect_messages = focus_loss_messages_hidden; - unexpected_messages = focus_loss_messages_hidden_unexpected; + windowposchanged_received = FALSE; SetForegroundWindow(GetDesktopWindow()); ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it.\n", expect_messages->message, expect_messages->window); + ok(!windowposchanged_received, "Received WM_WINDOWPOSCHANGED but did not expect it.\n"); expect_messages = NULL; - unexpected_messages = NULL; + flush_events(); ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); ok(ret, "Failed to get display mode.\n"); ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth, "Got unexpect width %u.\n", devmode.dmPelsWidth); ok(devmode.dmPelsHeight == registry_mode.dmPelsHeight, "Got unexpect height %u.\n", devmode.dmPelsHeight); + /* SW_SHOWMINNOACTIVE is needed to make FVWM happy. SW_SHOWNOACTIVATE is needed to make windows + * send SIZE_RESTORED after ShowWindow(SW_SHOWMINNOACTIVE). */ + ShowWindow(focus_window, SW_SHOWNOACTIVATE); + ShowWindow(focus_window, SW_SHOWMINNOACTIVE); + flush_events(); + + expect_messages = sc_restore_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_RESTORE, 0); + todo_wine ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it.\n", + expect_messages->message, expect_messages->window); + expect_messages = NULL; + flush_events(); + + expect_messages = sc_minimize_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_MINIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it.\n", + expect_messages->message, expect_messages->window); + expect_messages = NULL; + flush_events(); + + expect_messages = sc_maximize_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_MAXIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it.\n", + expect_messages->message, expect_messages->window); + expect_messages = NULL; + flush_events(); + + SetForegroundWindow(GetDesktopWindow()); + ShowWindow(device_window, SW_MINIMIZE); ShowWindow(focus_window, SW_MINIMIZE); ShowWindow(focus_window, SW_RESTORE); SetForegroundWindow(focus_window); @@ -2601,6 +2664,16 @@ ok(proc == (LONG_PTR)test_proc, "Expected wndproc %#lx, got %#lx.\n", (LONG_PTR)test_proc, proc); + /* Hide the device window. It prevents WM_ACTIVATEAPP messages from being sent + * on native in the test below. It isn't needed anyways. Creating the third + * device will show it again. */ + filter_messages = NULL; + ShowWindow(device_window, SW_HIDE); + /* Remove the maximized state from the SYSCOMMAND test while we're not + * interfering with a device. */ + ShowWindow(focus_window, SW_SHOWNORMAL); + filter_messages = focus_window; + device_desc.device_window = focus_window; if (!(device = create_device(d3d8, focus_window, &device_desc))) { @@ -2608,6 +2681,70 @@ goto done; } + filter_messages = NULL; + + expect_messages = focus_loss_messages_filtered; + windowposchanged_received = FALSE; + SetForegroundWindow(GetDesktopWindow()); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it.\n", + expect_messages->message, expect_messages->window); + ok(!windowposchanged_received, "Received WM_WINDOWPOSCHANGED but did not expect it.\n"); + expect_messages = NULL; + + /* The window is iconic even though no message was sent. */ + ok(IsIconic(focus_window), "The focus window is not iconic.\n"); + + hr = IDirect3DDevice8_TestCooperativeLevel(device); + ok(hr == D3DERR_DEVICELOST, "Got unexpected hr %#x.\n", hr); + + expect_messages = sc_restore_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_RESTORE, 0); + todo_wine ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it.\n", + expect_messages->message, expect_messages->window); + expect_messages = NULL; + flush_events(); + + /* For FVWM. */ + ShowWindow(focus_window, SW_RESTORE); + flush_events(); + + expect_messages = sc_minimize_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_MINIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it.\n", + expect_messages->message, expect_messages->window); + expect_messages = NULL; + /* Needed to make the next test reliably send WM_SIZE(SIZE_MAXIMIZED). Without + * this call it sends WM_SIZE(SIZE_RESTORED). */ + ShowWindow(focus_window, SW_RESTORE); + flush_events(); + + expect_messages = sc_maximize_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_MAXIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it.\n", + expect_messages->message, expect_messages->window); + expect_messages = NULL; + SetForegroundWindow(GetDesktopWindow()); + flush_events(); + + /* ShowWindow(SW_RESTORE); SetForegroundWindow(desktop); SetForegroundWindow(focus); + * results in the second SetForegroundWindow call failing and the device not being + * restored on native. Directly useing ShowWindow(SW_RESTORE) works, but it means + * we cannot test for the absence of WM_WINDOWPOSCHANGED messages. */ + expect_messages = reactivate_messages_filtered; + ShowWindow(focus_window, SW_RESTORE); + SetForegroundWindow(focus_window); + flush_events(); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it\n", + expect_messages->message, expect_messages->window); + expect_messages = NULL; + + filter_messages = focus_window; + hr = IDirect3DDevice8_TestCooperativeLevel(device); + ok(hr == D3DERR_DEVICENOTRESET, "Got unexpected hr %#x.\n", hr); + + hr = reset_device(device, &device_desc); + ok(SUCCEEDED(hr), "Failed to reset device, hr %#x.\n", hr); + ref = IDirect3DDevice8_Release(device); ok(ref == 0, "The device was not properly freed: refcount %u.\n", ref); @@ -6863,6 +7000,17 @@ hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL); todo_wine ok(hr == D3DERR_DEVICELOST, "Got unexpected hr %#x.\n", hr); + ret = SetForegroundWindow(GetDesktopWindow()); + ok(ret, "Failed to set foreground window.\n"); + hr = reset_device(device, &device_desc); + ok(hr == D3DERR_DEVICELOST, "Got unexpected hr %#x.\n", hr); + ret = ShowWindow(window, SW_RESTORE); + ok(ret, "Failed to restore window.\n"); + ret = SetForegroundWindow(window); + ok(ret, "Failed to set foreground window.\n"); + hr = reset_device(device, &device_desc); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + refcount = IDirect3DDevice8_Release(device); ok(!refcount, "Device has %u references left.\n", refcount); done: diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d8/texture.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d8/texture.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d8/texture.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d8/texture.c 2014-12-15 00:45:34.000000000 +0000 @@ -1172,6 +1172,9 @@ if (pool != D3DPOOL_DEFAULT || (usage & D3DUSAGE_DYNAMIC)) surface_flags |= WINED3D_SURFACE_MAPPABLE; + if (!levels) + levels = wined3d_log2i(max(width, height)) + 1; + wined3d_mutex_lock(); hr = wined3d_texture_create(device->wined3d_device, &desc, levels, surface_flags, texture, &d3d8_texture_wined3d_parent_ops, &texture->wined3d_texture); @@ -1214,6 +1217,9 @@ if (pool != D3DPOOL_DEFAULT || (usage & D3DUSAGE_DYNAMIC)) surface_flags |= WINED3D_SURFACE_MAPPABLE; + if (!levels) + levels = wined3d_log2i(edge_length) + 1; + wined3d_mutex_lock(); hr = wined3d_texture_create(device->wined3d_device, &desc, levels, surface_flags, texture, &d3d8_texture_wined3d_parent_ops, &texture->wined3d_texture); @@ -1252,6 +1258,9 @@ desc.depth = depth; desc.size = 0; + if (!levels) + levels = wined3d_log2i(max(max(width, height), depth)) + 1; + wined3d_mutex_lock(); hr = wined3d_texture_create(device->wined3d_device, &desc, levels, 0, texture, &d3d8_texture_wined3d_parent_ops, &texture->wined3d_texture); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d9/device.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d9/device.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d9/device.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d9/device.c 2014-12-15 00:45:34.000000000 +0000 @@ -635,6 +635,12 @@ TRACE("iface %p, present_parameters %p.\n", iface, present_parameters); + if (!device->d3d_parent->extended && device->device_state == D3D9_DEVICE_STATE_LOST) + { + WARN("App not active, returning D3DERR_DEVICELOST.\n"); + return D3DERR_DEVICELOST; + } + wined3d_mutex_lock(); if (device->vertex_buffer) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d9/tests/d3d9ex.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d9/tests/d3d9ex.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d9/tests/d3d9ex.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d9/tests/d3d9ex.c 2014-12-15 00:45:34.000000000 +0000 @@ -1374,6 +1374,23 @@ hr = IDirect3DDevice9Ex_CheckDeviceState(device, NULL); ok(hr == S_PRESENT_OCCLUDED, "Got unexpected hr %#x.\n", hr); + ret = SetForegroundWindow(GetDesktopWindow()); + ok(ret, "Failed to set foreground window.\n"); + hr = IDirect3DDevice9Ex_Present(device, NULL, NULL, NULL, NULL); + ok(hr == S_PRESENT_OCCLUDED, "Got unexpected hr %#x.\n", hr); + hr = reset_device(device, &desc); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirect3DDevice9Ex_TestCooperativeLevel(device); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirect3DDevice9Ex_Present(device, NULL, NULL, NULL, NULL); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirect3DDevice9Ex_PresentEx(device, NULL, NULL, NULL, NULL, 0); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirect3DDevice9Ex_CheckDeviceState(device, window); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + hr = IDirect3DDevice9Ex_CheckDeviceState(device, NULL); + ok(hr == S_PRESENT_OCCLUDED, "Got unexpected hr %#x.\n", hr); + refcount = IDirect3DDevice9Ex_Release(device); ok(!refcount, "Device has %u references left.\n", refcount); done: @@ -1706,8 +1723,9 @@ WPARAM expect_wparam; }; -static const struct message *expect_messages, *unexpected_messages; +static const struct message *expect_messages; static HWND device_window, focus_window; +static BOOL windowposchanged_received; struct wndproc_thread_param { @@ -1755,12 +1773,12 @@ } } - if (unexpected_messages) - { - const struct message *i; - for (i = unexpected_messages; i->message; i++) - ok(i->message != message, "Got unexpected message %x on window %p.\n", message, hwnd); - } + /* KDE randomly does something with the hidden window during the + * mode change that sometimes generates a WM_WINDOWPOSCHANGING + * message. A WM_WINDOWPOSCHANGED message is not generated, so + * just flag WM_WINDOWPOSCHANGED as bad. */ + if (message == WM_WINDOWPOSCHANGED) + windowposchanged_received = TRUE; return DefWindowProcA(hwnd, message, wparam, lparam); } @@ -1870,24 +1888,52 @@ {WM_ACTIVATEAPP, FOCUS_WINDOW, TRUE, FALSE}, {0, 0, FALSE, 0}, }; - static const struct message focus_loss_messages_hidden_unexpected[] = + static const struct message focus_loss_messages_filtered[] = + { + /* WM_ACTIVATE is delivered to the window proc because it is + * generated by SetForegroundWindow before the d3d routine + * starts it work. Don't check for it due to focus-follows-mouse + * WMs though. */ + {WM_DISPLAYCHANGE, FOCUS_WINDOW, FALSE, 0}, + {WM_ACTIVATEAPP, FOCUS_WINDOW, TRUE, FALSE}, + {0, 0, FALSE, 0}, + }; + static const struct message sc_restore_messages[] = { - /* KDE randomly does something with the hidden window during the - * mode change that sometimes generates a WM_WINDOWPOSCHANGING - * message. A WM_WINDOWPOSCHANGED message is not generated, so - * just flag WM_WINDOWPOSCHANGED as bad. */ - {WM_WINDOWPOSCHANGED, 0, FALSE, 0}, + {WM_WINDOWPOSCHANGING, FOCUS_WINDOW, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FOCUS_WINDOW, FALSE, 0}, + {WM_SIZE, FOCUS_WINDOW, TRUE, SIZE_RESTORED}, + {WM_SYSCOMMAND, FOCUS_WINDOW, TRUE, SC_RESTORE}, + {0, 0, FALSE, 0}, + }; + static const struct message sc_minimize_messages[] = + { + {WM_SYSCOMMAND, FOCUS_WINDOW, TRUE, SC_MINIMIZE}, + {WM_WINDOWPOSCHANGING, FOCUS_WINDOW, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FOCUS_WINDOW, FALSE, 0}, + {WM_MOVE, FOCUS_WINDOW, FALSE, 0}, + {WM_SIZE, FOCUS_WINDOW, TRUE, SIZE_MINIMIZED}, + {0, 0, FALSE, 0}, + }; + static const struct message sc_maximize_messages[] = + { + {WM_SYSCOMMAND, FOCUS_WINDOW, TRUE, SC_MAXIMIZE}, + {WM_WINDOWPOSCHANGING, FOCUS_WINDOW, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FOCUS_WINDOW, FALSE, 0}, + {WM_MOVE, FOCUS_WINDOW, FALSE, 0}, + /* WM_SIZE(SIZE_MAXIMIZED) is unreliable on native. */ {0, 0, FALSE, 0}, }; static const struct { DWORD create_flags; const struct message *focus_loss_messages; + BOOL iconic; } tests[] = { - {0, focus_loss_messages}, - {CREATE_DEVICE_NOWINDOWCHANGES, focus_loss_messages_nowc}, + {0, focus_loss_messages, TRUE}, + {CREATE_DEVICE_NOWINDOWCHANGES, focus_loss_messages_nowc, FALSE}, }; hr = pDirect3DCreate9Ex(D3D_SDK_VERSION, &d3d9ex); @@ -2105,18 +2151,48 @@ flush_events(); expect_messages = focus_loss_messages_hidden; - unexpected_messages = focus_loss_messages_hidden_unexpected; + windowposchanged_received = FALSE; SetForegroundWindow(GetDesktopWindow()); ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", expect_messages->message, expect_messages->window, i); + ok(!windowposchanged_received, "Received WM_WINDOWPOSCHANGED but did not expect it, i=%u.\n", i); expect_messages = NULL; - unexpected_messages = NULL; + flush_events(); ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); ok(ret, "Failed to get display mode.\n"); ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth, "Got unexpect width %u.\n", devmode.dmPelsWidth); ok(devmode.dmPelsHeight == registry_mode.dmPelsHeight, "Got unexpect height %u.\n", devmode.dmPelsHeight); + /* SW_SHOWMINNOACTIVE is needed to make FVWM happy. SW_SHOWNOACTIVATE is needed to make windows + * send SIZE_RESTORED after ShowWindow(SW_SHOWMINNOACTIVE). */ + ShowWindow(focus_window, SW_SHOWNOACTIVATE); + ShowWindow(focus_window, SW_SHOWMINNOACTIVE); + flush_events(); + + expect_messages = sc_restore_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_RESTORE, 0); + todo_wine ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + expect_messages = NULL; + flush_events(); + + expect_messages = sc_minimize_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_MINIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + expect_messages = NULL; + flush_events(); + + expect_messages = sc_maximize_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_MAXIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + expect_messages = NULL; + flush_events(); + + SetForegroundWindow(GetDesktopWindow()); + ShowWindow(device_window, SW_MINIMIZE); ShowWindow(device_window, SW_RESTORE); ShowWindow(focus_window, SW_MINIMIZE); ShowWindow(focus_window, SW_RESTORE); @@ -2135,13 +2211,76 @@ ok(proc == (LONG_PTR)test_proc, "Expected wndproc %#lx, got %#lx, i=%u.\n", (LONG_PTR)test_proc, proc, i); + /* Hide the device window. It prevents WM_ACTIVATEAPP messages from being sent + * on native in the test below. It isn't needed anyways. Creating the third + * device will show it again. */ + filter_messages = NULL; + ShowWindow(device_window, SW_HIDE); + /* Remove the maximized state from the SYSCOMMAND test while we're not + * interfering with a device. */ + ShowWindow(focus_window, SW_SHOWNORMAL); + filter_messages = focus_window; + device_desc.device_window = focus_window; if (!(device = create_device(focus_window, &device_desc))) { skip("Failed to create a D3D device, skipping tests.\n"); goto done; } + filter_messages = NULL; + SetForegroundWindow(focus_window); /* For KDE. */ + flush_events(); + + expect_messages = focus_loss_messages_filtered; + windowposchanged_received = FALSE; + SetForegroundWindow(GetDesktopWindow()); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + ok(!windowposchanged_received, "Received WM_WINDOWPOSCHANGED but did not expect it, i=%u.\n", i); + expect_messages = NULL; + + /* The window is iconic even though no message was sent. */ + ok(!IsIconic(focus_window) == !tests[i].iconic, + "Expected IsIconic %u, got %u, i=%u.\n", tests[i].iconic, IsIconic(focus_window), i); + + ShowWindow(focus_window, SW_SHOWNOACTIVATE); + ShowWindow(focus_window, SW_SHOWMINNOACTIVE); + flush_events(); + + expect_messages = sc_restore_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_RESTORE, 0); + todo_wine ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + expect_messages = NULL; + flush_events(); + + /* For FVWM. */ + ShowWindow(focus_window, SW_RESTORE); + flush_events(); + + expect_messages = sc_minimize_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_MINIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + expect_messages = NULL; + flush_events(); + + expect_messages = sc_maximize_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_MAXIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + expect_messages = NULL; + flush_events(); + /* This test can't activate, drop focus and restore focus like in plain d3d9 because d3d9ex + * immediately restores the device on activation. There are plenty of WM_WINDOWPOSCHANGED + * messages that are generated by ShowWindow, so testing for their absence is pointless. */ + ShowWindow(focus_window, SW_MINIMIZE); + ShowWindow(focus_window, SW_RESTORE); + SetForegroundWindow(focus_window); + flush_events(); + + filter_messages = focus_window; ref = IDirect3DDevice9Ex_Release(device); ok(ref == 0, "The device was not properly freed: refcount %u, i=%u.\n", ref, i); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d9/tests/device.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d9/tests/device.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d9/tests/device.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d9/tests/device.c 2014-12-15 00:45:34.000000000 +0000 @@ -3135,8 +3135,9 @@ WPARAM expect_wparam; }; -static const struct message *expect_messages, *unexpected_messages; +static const struct message *expect_messages; static HWND device_window, focus_window; +static BOOL windowposchanged_received; struct wndproc_thread_param { @@ -3184,12 +3185,12 @@ } } - if (unexpected_messages) - { - const struct message *i; - for (i = unexpected_messages; i->message; i++) - ok(i->message != message, "Got unexpected message %x on window %p.\n", message, hwnd); - } + /* KDE randomly does something with the hidden window during the + * mode change that sometimes generates a WM_WINDOWPOSCHANGING + * message. A WM_WINDOWPOSCHANGED message is not generated, so + * just flag WM_WINDOWPOSCHANGED as bad. */ + if (message == WM_WINDOWPOSCHANGED) + windowposchanged_received = TRUE; return DefWindowProcA(hwnd, message, wparam, lparam); } @@ -3312,24 +3313,57 @@ {WM_ACTIVATEAPP, FOCUS_WINDOW, TRUE, FALSE}, {0, 0, FALSE, 0}, }; - static const struct message focus_loss_messages_hidden_unexpected[] = + static const struct message focus_loss_messages_filtered[] = { - /* KDE randomly does something with the hidden window during the - * mode change that sometimes generates a WM_WINDOWPOSCHANGING - * message. A WM_WINDOWPOSCHANGED message is not generated, so - * just flag WM_WINDOWPOSCHANGED as bad. */ - {WM_WINDOWPOSCHANGED, 0, FALSE, 0}, + /* WM_ACTIVATE is delivered to the window proc because it is + * generated by SetForegroundWindow before the d3d routine + * starts it work. Don't check for it due to focus-follows-mouse + * WMs though. */ + {WM_DISPLAYCHANGE, FOCUS_WINDOW, FALSE, 0}, + {WM_ACTIVATEAPP, FOCUS_WINDOW, TRUE, FALSE}, + {0, 0, FALSE, 0}, + }; + static const struct message reactivate_messages_filtered[] = + { + {WM_ACTIVATEAPP, FOCUS_WINDOW, TRUE, TRUE}, + {0, 0, FALSE, 0}, + }; + static const struct message sc_restore_messages[] = + { + {WM_WINDOWPOSCHANGING, FOCUS_WINDOW, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FOCUS_WINDOW, FALSE, 0}, + {WM_SIZE, FOCUS_WINDOW, TRUE, SIZE_RESTORED}, + {WM_SYSCOMMAND, FOCUS_WINDOW, TRUE, SC_RESTORE}, + {0, 0, FALSE, 0}, + }; + static const struct message sc_minimize_messages[] = + { + {WM_SYSCOMMAND, FOCUS_WINDOW, TRUE, SC_MINIMIZE}, + {WM_WINDOWPOSCHANGING, FOCUS_WINDOW, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FOCUS_WINDOW, FALSE, 0}, + {WM_MOVE, FOCUS_WINDOW, FALSE, 0}, + {WM_SIZE, FOCUS_WINDOW, TRUE, SIZE_MINIMIZED}, + {0, 0, FALSE, 0}, + }; + static const struct message sc_maximize_messages[] = + { + {WM_SYSCOMMAND, FOCUS_WINDOW, TRUE, SC_MAXIMIZE}, + {WM_WINDOWPOSCHANGING, FOCUS_WINDOW, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FOCUS_WINDOW, FALSE, 0}, + {WM_MOVE, FOCUS_WINDOW, FALSE, 0}, + /* WM_SIZE(SIZE_MAXIMIZED) is unreliable on native. */ {0, 0, FALSE, 0}, }; static const struct { DWORD create_flags; const struct message *focus_loss_messages, *reactivate_messages; + BOOL iconic; } tests[] = { - {0, focus_loss_messages, reactivate_messages}, - {CREATE_DEVICE_NOWINDOWCHANGES, focus_loss_messages_nowc, reactivate_messages_nowc}, + {0, focus_loss_messages, reactivate_messages, TRUE}, + {CREATE_DEVICE_NOWINDOWCHANGES, focus_loss_messages_nowc, reactivate_messages_nowc, FALSE}, }; d3d9 = Direct3DCreate9(D3D_SDK_VERSION); @@ -3551,18 +3585,48 @@ flush_events(); expect_messages = focus_loss_messages_hidden; - unexpected_messages = focus_loss_messages_hidden_unexpected; + windowposchanged_received = FALSE; SetForegroundWindow(GetDesktopWindow()); ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", expect_messages->message, expect_messages->window, i); + ok(!windowposchanged_received, "Received WM_WINDOWPOSCHANGED but did not expect it.\n"); expect_messages = NULL; - unexpected_messages = NULL; + flush_events(); ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); ok(ret, "Failed to get display mode.\n"); ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth, "Got unexpect width %u.\n", devmode.dmPelsWidth); ok(devmode.dmPelsHeight == registry_mode.dmPelsHeight, "Got unexpect height %u.\n", devmode.dmPelsHeight); + /* SW_SHOWMINNOACTIVE is needed to make FVWM happy. SW_SHOWNOACTIVATE is needed to make windows + * send SIZE_RESTORED after ShowWindow(SW_SHOWMINNOACTIVE). */ + ShowWindow(focus_window, SW_SHOWNOACTIVATE); + ShowWindow(focus_window, SW_SHOWMINNOACTIVE); + flush_events(); + + expect_messages = sc_restore_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_RESTORE, 0); + todo_wine ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + expect_messages = NULL; + flush_events(); + + expect_messages = sc_minimize_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_MINIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + expect_messages = NULL; + flush_events(); + + expect_messages = sc_maximize_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_MAXIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + expect_messages = NULL; + flush_events(); + + SetForegroundWindow(GetDesktopWindow()); + ShowWindow(device_window, SW_MINIMIZE); ShowWindow(device_window, SW_RESTORE); ShowWindow(focus_window, SW_MINIMIZE); ShowWindow(focus_window, SW_RESTORE); @@ -3586,12 +3650,93 @@ ok(proc == (LONG_PTR)test_proc, "Expected wndproc %#lx, got %#lx, i=%u.\n", (LONG_PTR)test_proc, proc, i); + /* Hide the device window. It prevents WM_ACTIVATEAPP messages from being sent + * on native in the test below. It isn't needed anyways. Creating the third + * device will show it again. */ + filter_messages = NULL; + ShowWindow(device_window, SW_HIDE); + /* Remove the maximized state from the SYSCOMMAND test while we're not + * interfering with a device. */ + ShowWindow(focus_window, SW_SHOWNORMAL); + filter_messages = focus_window; + device_desc.device_window = focus_window; if (!(device = create_device(d3d9, focus_window, &device_desc))) { skip("Failed to create a D3D device, skipping tests.\n"); goto done; } + filter_messages = NULL; + SetForegroundWindow(focus_window); /* For KDE. */ + flush_events(); + + expect_messages = focus_loss_messages_filtered; + windowposchanged_received = FALSE; + SetForegroundWindow(GetDesktopWindow()); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + ok(!windowposchanged_received, "Received WM_WINDOWPOSCHANGED but did not expect it, i=%u.\n", i); + expect_messages = NULL; + + /* The window is iconic even though no message was sent. */ + ok(!IsIconic(focus_window) == !tests[i].iconic, + "Expected IsIconic %u, got %u, i=%u.\n", tests[i].iconic, IsIconic(focus_window), i); + + hr = IDirect3DDevice9_TestCooperativeLevel(device); + ok(hr == D3DERR_DEVICELOST, "Got unexpected hr %#x.\n", hr); + + if (tests[i].create_flags & CREATE_DEVICE_NOWINDOWCHANGES) + ShowWindow(focus_window, SW_MINIMIZE); + + expect_messages = sc_restore_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_RESTORE, 0); + todo_wine ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + expect_messages = NULL; + flush_events(); + + /* For FVWM. */ + ShowWindow(focus_window, SW_RESTORE); + flush_events(); + + expect_messages = sc_minimize_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_MINIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + expect_messages = NULL; + flush_events(); + + expect_messages = sc_maximize_messages; + SendMessageA(focus_window, WM_SYSCOMMAND, SC_MAXIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + expect_messages = NULL; + flush_events(); + + /* Make sure the SetWindowPos call done by d3d9 is not a no-op. */ + SetWindowPos(focus_window, NULL, 10, 10, 100, 100, SWP_NOZORDER | SWP_NOACTIVATE); + SetForegroundWindow(GetDesktopWindow()); + flush_events(); + SetForegroundWindow(GetDesktopWindow()); /* For FVWM. */ + flush_events(); + + expect_messages = reactivate_messages_filtered; + windowposchanged_received = FALSE; + SetForegroundWindow(focus_window); + flush_events(); + ok(!expect_messages->message, "Expected message %#x for window %#x, but didn't receive it, i=%u.\n", + expect_messages->message, expect_messages->window, i); + /* About 1 in 8 test runs receives WM_WINDOWPOSCHANGED on Vista. */ + ok(!windowposchanged_received || broken(1), + "Received WM_WINDOWPOSCHANGED but did not expect it, i=%u.\n", i); + expect_messages = NULL; + + filter_messages = focus_window; + hr = IDirect3DDevice9_TestCooperativeLevel(device); + ok(hr == D3DERR_DEVICENOTRESET, "Got unexpected hr %#x.\n", hr); + + hr = reset_device(device, &device_desc); + ok(SUCCEEDED(hr), "Failed to reset device, hr %#x.\n", hr); ref = IDirect3DDevice9_Release(device); ok(ref == 0, "The device was not properly freed: refcount %u, i=%u.\n", ref, i); @@ -9751,6 +9896,17 @@ hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + ret = SetForegroundWindow(GetDesktopWindow()); + ok(ret, "Failed to set foreground window.\n"); + hr = reset_device(device, &device_desc); + ok(hr == D3DERR_DEVICELOST, "Got unexpected hr %#x.\n", hr); + ret = ShowWindow(window, SW_RESTORE); + ok(ret, "Failed to restore window.\n"); + ret = SetForegroundWindow(window); + ok(ret, "Failed to set foreground window.\n"); + hr = reset_device(device, &device_desc); + ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr); + refcount = IDirect3DDevice9_Release(device); ok(!refcount, "Device has %u references left.\n", refcount); done: diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d9/texture.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d9/texture.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3d9/texture.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3d9/texture.c 2014-12-15 00:45:34.000000000 +0000 @@ -1296,6 +1296,14 @@ if (pool != D3DPOOL_DEFAULT || (usage & D3DUSAGE_DYNAMIC)) surface_flags |= WINED3D_SURFACE_MAPPABLE; + if (!levels) + { + if (usage & D3DUSAGE_AUTOGENMIPMAP) + levels = 1; + else + levels = wined3d_log2i(max(width, height)) + 1; + } + wined3d_mutex_lock(); hr = wined3d_texture_create(device->wined3d_device, &desc, levels, surface_flags, texture, &d3d9_texture_wined3d_parent_ops, &texture->wined3d_texture); @@ -1338,6 +1346,14 @@ if (pool != D3DPOOL_DEFAULT || (usage & D3DUSAGE_DYNAMIC)) surface_flags |= WINED3D_SURFACE_MAPPABLE; + if (!levels) + { + if (usage & D3DUSAGE_AUTOGENMIPMAP) + levels = 1; + else + levels = wined3d_log2i(edge_length) + 1; + } + wined3d_mutex_lock(); hr = wined3d_texture_create(device->wined3d_device, &desc, levels, surface_flags, texture, &d3d9_texture_wined3d_parent_ops, &texture->wined3d_texture); @@ -1376,6 +1392,14 @@ desc.depth = depth; desc.size = 0; + if (!levels) + { + if (usage & D3DUSAGE_AUTOGENMIPMAP) + levels = 1; + else + levels = wined3d_log2i(max(max(width, height), depth)) + 1; + } + wined3d_mutex_lock(); hr = wined3d_texture_create(device->wined3d_device, &desc, levels, 0, texture, &d3d9_texture_wined3d_parent_ops, &texture->wined3d_texture); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3dx9_36/font.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3dx9_36/font.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3dx9_36/font.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3dx9_36/font.c 2014-12-15 00:45:34.000000000 +0000 @@ -155,7 +155,7 @@ static HRESULT WINAPI ID3DXFontImpl_PreloadCharacters(ID3DXFont *iface, UINT first, UINT last) { FIXME("iface %p, first %u, last %u stub!\n", iface, first, last); - return E_NOTIMPL; + return S_OK; } static HRESULT WINAPI ID3DXFontImpl_PreloadGlyphs(ID3DXFont *iface, UINT first, UINT last) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3dx9_36/tests/core.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3dx9_36/tests/core.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3dx9_36/tests/core.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3dx9_36/tests/core.c 2014-12-15 00:45:34.000000000 +0000 @@ -511,15 +511,14 @@ hr = ID3DXFont_GetGlyphData(font, 0, &texture, &blackbox, NULL); if(SUCCEEDED(hr)) check_release((IUnknown*)texture, 1); ok(hr == D3D_OK, "ID3DXFont_GetGlyphData returned %#x, expected %#x\n", hr, D3D_OK); - + } hr = ID3DXFont_PreloadCharacters(font, 'b', 'a'); ok(hr == D3D_OK, "ID3DXFont_PreloadCharacters returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXFont_PreloadGlyphs(font, 1, 0); - ok(hr == D3D_OK, "ID3DXFont_PreloadGlyphs returned %#x, expected %#x\n", hr, D3D_OK); + todo_wine ok(hr == D3D_OK, "ID3DXFont_PreloadGlyphs returned %#x, expected %#x\n", hr, D3D_OK); hr = ID3DXFont_PreloadCharacters(font, 'a', 'a'); ok(hr == D3D_OK, "ID3DXFont_PreloadCharacters returned %#x, expected %#x\n", hr, D3D_OK); - } for(c = 'b'; c <= 'z'; c++) { WORD glyph; @@ -548,7 +547,7 @@ } hr = ID3DXFont_PreloadCharacters(font, 'a', 'z'); - todo_wine ok(hr == D3D_OK, "ID3DXFont_PreloadCharacters returned %#x, expected %#x\n", hr, D3D_OK); + ok(hr == D3D_OK, "ID3DXFont_PreloadCharacters returned %#x, expected %#x\n", hr, D3D_OK); check_release((IUnknown*)font, 0); } else skip("Failed to create a ID3DXFont object\n"); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3dx9_36/tests/surface.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3dx9_36/tests/surface.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/d3dx9_36/tests/surface.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/d3dx9_36/tests/surface.c 2014-12-15 00:45:34.000000000 +0000 @@ -24,12 +24,6 @@ #include "d3dx9tex.h" #include "resources.h" -static inline int get_ref(IUnknown *obj) -{ - IUnknown_AddRef(obj); - return IUnknown_Release(obj); -} - #define check_release(obj, exp) _check_release(__LINE__, obj, exp) static inline void _check_release(unsigned int line, IUnknown *obj, int exp) { diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/dbghelp/cpu_i386.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/dbghelp/cpu_i386.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/dbghelp/cpu_i386.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/dbghelp/cpu_i386.c 2014-12-15 00:45:34.000000000 +0000 @@ -29,7 +29,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(dbghelp); -#define STEP_FLAG 0x00000100 /* single step flag */ #define V86_FLAG 0x00020000 #define IS_VM86_MODE(ctx) (ctx->EFlags & V86_FLAG) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/dbghelp/cpu_x86_64.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/dbghelp/cpu_x86_64.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/dbghelp/cpu_x86_64.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/dbghelp/cpu_x86_64.c 2014-12-15 00:45:34.000000000 +0000 @@ -76,21 +76,6 @@ */ } UNWIND_INFO, *PUNWIND_INFO; -#define GetUnwindCodeEntry(info, index) \ - ((info)->UnwindCode[index]) - -#define GetLanguageSpecificDataPtr(info) \ - ((PVOID)&GetUnwindCodeEntry((info),((info)->CountOfCodes + 1) & ~1)) - -#define GetExceptionHandler(base, info) \ - ((PEXCEPTION_HANDLER)((base) + *(PULONG)GetLanguageSpecificDataPtr(info))) - -#define GetChainedFunctionEntry(base, info) \ - ((PRUNTIME_FUNCTION)((base) + *(PULONG)GetLanguageSpecificDataPtr(info))) - -#define GetExceptionDataPtr(info) \ - ((PVOID)((PULONG)GetLanguageSpecificData(info) + 1) - static BOOL x86_64_get_addr(HANDLE hThread, const CONTEXT* ctx, enum cpu_addr ca, ADDRESS64* addr) { @@ -107,6 +92,8 @@ } } +#ifdef __x86_64__ + enum st_mode {stm_start, stm_64bit, stm_done}; /* indexes in Reserved array */ @@ -118,7 +105,6 @@ #define curr_count (frame->Reserved[__CurrentCount]) /* #define ??? (frame->Reserved[__]) (unused) */ -#ifdef __x86_64__ union handler_data { RUNTIME_FUNCTION chain; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/dbghelp/msc.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/dbghelp/msc.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/dbghelp/msc.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/dbghelp/msc.c 2014-12-15 00:45:34.000000000 +0000 @@ -58,8 +58,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(dbghelp_msc); -#define MAX_PATHNAME_LEN 1024 - struct pdb_stream_name { const char* name; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ddraw/ddraw.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ddraw/ddraw.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ddraw/ddraw.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ddraw/ddraw.c 2014-12-15 00:45:34.000000000 +0000 @@ -4850,7 +4850,8 @@ ddraw->numIfaces = 1; ddraw->ref7 = 1; - flags = WINED3D_LEGACY_DEPTH_BIAS | WINED3D_VIDMEM_ACCOUNTING | WINED3D_RESTORE_MODE_ON_ACTIVATE; + flags = WINED3D_LEGACY_DEPTH_BIAS | WINED3D_VIDMEM_ACCOUNTING + | WINED3D_RESTORE_MODE_ON_ACTIVATE | WINED3D_FOCUS_MESSAGES; if (!(ddraw->wined3d = wined3d_create(flags))) { if (!(ddraw->wined3d = wined3d_create(flags | WINED3D_NO3D))) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ddraw/main.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ddraw/main.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ddraw/main.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ddraw/main.c 2014-12-15 00:45:34.000000000 +0000 @@ -430,7 +430,7 @@ cont_enum = callback(NULL, driver_desc, driver_name, context, 0); /* The Battle.net System Checker expects both a NULL device and a GUID-based device */ - if (cont_enum && (flags & ~DDENUM_ATTACHEDSECONDARYDEVICES)) + if (cont_enum && (flags & DDENUM_ATTACHEDSECONDARYDEVICES)) ddraw_enumerate_secondary_devices(wined3d, callback, context); } __EXCEPT_PAGE_FAULT diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ddraw/surface.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ddraw/surface.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ddraw/surface.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ddraw/surface.c 2014-12-15 00:45:34.000000000 +0000 @@ -5817,14 +5817,7 @@ { /* Undocumented feature: Create sublevels until either the * width or the height is 1. */ - DWORD min = desc->dwWidth < desc->dwHeight ? desc->dwWidth : desc->dwHeight; - - desc->u2.dwMipMapCount = 0; - while (min) - { - ++desc->u2.dwMipMapCount; - min >>= 1; - } + desc->u2.dwMipMapCount = wined3d_log2i(min(desc->dwWidth, desc->dwHeight)) + 1; } } else diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ddraw/tests/ddraw1.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ddraw/tests/ddraw1.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ddraw/tests/ddraw1.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ddraw/tests/ddraw1.c 2014-12-15 00:45:34.000000000 +0000 @@ -2233,6 +2233,30 @@ {WM_SIZE, TRUE, SIZE_RESTORED}, /* DefWindowProc. */ {0, FALSE, 0}, }; + static const struct message sc_restore_messages[] = + { + {WM_SYSCOMMAND, TRUE, SC_RESTORE}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_RESTORED}, + {0, FALSE, 0}, + }; + static const struct message sc_minimize_messages[] = + { + {WM_SYSCOMMAND, TRUE, SC_MINIMIZE}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_MINIMIZED}, + {0, FALSE, 0}, + }; + static const struct message sc_maximize_messages[] = + { + {WM_SYSCOMMAND, TRUE, SC_MAXIMIZE}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_MAXIMIZED}, + {0, FALSE, 0}, + }; static const struct message normal_messages[] = { @@ -2400,6 +2424,24 @@ * testbot. Another Restore call would presumably avoid the crash, but it also moots * the point of the GetSurfaceDesc call. */ + expect_messages = sc_minimize_messages; + SendMessageA(window, WM_SYSCOMMAND, SC_MINIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + expect_messages = NULL; + + expect_messages = sc_restore_messages; + SendMessageA(window, WM_SYSCOMMAND, SC_RESTORE, 0); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + expect_messages = NULL; + + expect_messages = sc_maximize_messages; + SendMessageA(window, WM_SYSCOMMAND, SC_MAXIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + expect_messages = NULL; + + hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); expect_messages = exclusive_messages; screen_size.cx = 0; @@ -3193,7 +3235,7 @@ WS_MAXIMIZE | WS_CAPTION , 0, 0, 640, 480, 0, 0, 0, 0); /* Exclusive with window already active. */ - SetActiveWindow(window); + SetForegroundWindow(window); activateapp_testdata.received = FALSE; hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); @@ -3202,7 +3244,7 @@ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Exclusive with window not active. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); @@ -3211,30 +3253,26 @@ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Normal with window not active, then exclusive with the same window. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); ok(!activateapp_testdata.received, "Received WM_ACTIVATEAPP when setting DDSCL_NORMAL.\n"); hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); - /* Except in the first SetCooperativeLevel call, Windows XP randomly does not send - * WM_ACTIVATEAPP. Windows 7 sends the message reliably. Mark the XP behavior broken. */ - ok(activateapp_testdata.received || broken(!activateapp_testdata.received), - "Expected WM_ACTIVATEAPP, but did not receive it.\n"); + ok(activateapp_testdata.received, "Expected WM_ACTIVATEAPP, but did not receive it.\n"); hr = IDirectDraw_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Recursive set of DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; activateapp_testdata.ddraw = ddraw; activateapp_testdata.window = window; activateapp_testdata.coop_level = DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN; hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); - ok(activateapp_testdata.received || broken(!activateapp_testdata.received), - "Expected WM_ACTIVATEAPP, but did not receive it.\n"); + ok(activateapp_testdata.received, "Expected WM_ACTIVATEAPP, but did not receive it.\n"); hr = IDirectDraw_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); @@ -3249,15 +3287,14 @@ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Setting DDSCL_NORMAL with recursive invocation. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; activateapp_testdata.ddraw = ddraw; activateapp_testdata.window = window; activateapp_testdata.coop_level = DDSCL_NORMAL; hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); - ok(activateapp_testdata.received || broken(!activateapp_testdata.received), - "Expected WM_ACTIVATEAPP, but did not receive it.\n"); + ok(activateapp_testdata.received, "Expected WM_ACTIVATEAPP, but did not receive it.\n"); /* DDraw is in exlusive mode now. */ memset(&ddsd, 0, sizeof(ddsd)); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ddraw/tests/ddraw2.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ddraw/tests/ddraw2.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ddraw/tests/ddraw2.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ddraw/tests/ddraw2.c 2014-12-15 00:45:34.000000000 +0000 @@ -2432,6 +2432,30 @@ {WM_SIZE, TRUE, SIZE_RESTORED}, /* DefWindowProc. */ {0, FALSE, 0}, }; + static const struct message sc_restore_messages[] = + { + {WM_SYSCOMMAND, TRUE, SC_RESTORE}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_RESTORED}, + {0, FALSE, 0}, + }; + static const struct message sc_minimize_messages[] = + { + {WM_SYSCOMMAND, TRUE, SC_MINIMIZE}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_MINIMIZED}, + {0, FALSE, 0}, + }; + static const struct message sc_maximize_messages[] = + { + {WM_SYSCOMMAND, TRUE, SC_MAXIMIZE}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_MAXIMIZED}, + {0, FALSE, 0}, + }; static const struct message normal_messages[] = { @@ -2606,6 +2630,24 @@ * testbot. Another Restore call would presumably avoid the crash, but it also moots * the point of the GetSurfaceDesc call. */ + expect_messages = sc_minimize_messages; + SendMessageA(window, WM_SYSCOMMAND, SC_MINIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + expect_messages = NULL; + + expect_messages = sc_restore_messages; + SendMessageA(window, WM_SYSCOMMAND, SC_RESTORE, 0); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + expect_messages = NULL; + + expect_messages = sc_maximize_messages; + SendMessageA(window, WM_SYSCOMMAND, SC_MAXIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + expect_messages = NULL; + + hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); expect_messages = exclusive_messages; screen_size.cx = 0; @@ -3756,7 +3798,7 @@ WS_MAXIMIZE | WS_CAPTION , 0, 0, 640, 480, 0, 0, 0, 0); /* Exclusive with window already active. */ - SetActiveWindow(window); + SetForegroundWindow(window); activateapp_testdata.received = FALSE; hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); @@ -3765,7 +3807,7 @@ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Exclusive with window not active. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); @@ -3774,30 +3816,26 @@ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Normal with window not active, then exclusive with the same window. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); ok(!activateapp_testdata.received, "Received WM_ACTIVATEAPP when setting DDSCL_NORMAL.\n"); hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); - /* Except in the first SetCooperativeLevel call, Windows XP randomly does not send - * WM_ACTIVATEAPP. Windows 7 sends the message reliably. Mark the XP behavior broken. */ - ok(activateapp_testdata.received || broken(!activateapp_testdata.received), - "Expected WM_ACTIVATEAPP, but did not receive it.\n"); + ok(activateapp_testdata.received, "Expected WM_ACTIVATEAPP, but did not receive it.\n"); hr = IDirectDraw2_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Recursive set of DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; activateapp_testdata.ddraw = ddraw; activateapp_testdata.window = window; activateapp_testdata.coop_level = DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN; hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); - ok(activateapp_testdata.received || broken(!activateapp_testdata.received), - "Expected WM_ACTIVATEAPP, but did not receive it.\n"); + ok(activateapp_testdata.received, "Expected WM_ACTIVATEAPP, but did not receive it.\n"); hr = IDirectDraw2_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); @@ -3812,15 +3850,14 @@ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Setting DDSCL_NORMAL with recursive invocation. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; activateapp_testdata.ddraw = ddraw; activateapp_testdata.window = window; activateapp_testdata.coop_level = DDSCL_NORMAL; hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); - ok(activateapp_testdata.received || broken(!activateapp_testdata.received), - "Expected WM_ACTIVATEAPP, but did not receive it.\n"); + ok(activateapp_testdata.received, "Expected WM_ACTIVATEAPP, but did not receive it.\n"); /* DDraw is in exlusive mode now. */ memset(&ddsd, 0, sizeof(ddsd)); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ddraw/tests/ddraw4.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ddraw/tests/ddraw4.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ddraw/tests/ddraw4.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ddraw/tests/ddraw4.c 2014-12-15 00:45:34.000000000 +0000 @@ -2619,6 +2619,30 @@ {WM_SIZE, TRUE, SIZE_RESTORED}, /* DefWindowProc. */ {0, FALSE, 0}, }; + static const struct message sc_restore_messages[] = + { + {WM_SYSCOMMAND, TRUE, SC_RESTORE}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_RESTORED}, + {0, FALSE, 0}, + }; + static const struct message sc_minimize_messages[] = + { + {WM_SYSCOMMAND, TRUE, SC_MINIMIZE}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_MINIMIZED}, + {0, FALSE, 0}, + }; + static const struct message sc_maximize_messages[] = + { + {WM_SYSCOMMAND, TRUE, SC_MAXIMIZE}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_MAXIMIZED}, + {0, FALSE, 0}, + }; static const struct message normal_messages[] = { @@ -2793,6 +2817,24 @@ * testbot. Another Restore call would presumably avoid the crash, but it also moots * the point of the GetSurfaceDesc call. */ + expect_messages = sc_minimize_messages; + SendMessageA(window, WM_SYSCOMMAND, SC_MINIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + expect_messages = NULL; + + expect_messages = sc_restore_messages; + SendMessageA(window, WM_SYSCOMMAND, SC_RESTORE, 0); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + expect_messages = NULL; + + expect_messages = sc_maximize_messages; + SendMessageA(window, WM_SYSCOMMAND, SC_MAXIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + expect_messages = NULL; + + hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); expect_messages = exclusive_messages; screen_size.cx = 0; @@ -4111,7 +4153,7 @@ WS_MAXIMIZE | WS_CAPTION , 0, 0, 640, 480, 0, 0, 0, 0); /* Exclusive with window already active. */ - SetActiveWindow(window); + SetForegroundWindow(window); activateapp_testdata.received = FALSE; hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); @@ -4120,7 +4162,7 @@ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Exclusive with window not active. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); @@ -4129,30 +4171,26 @@ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Normal with window not active, then exclusive with the same window. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); ok(!activateapp_testdata.received, "Received WM_ACTIVATEAPP when setting DDSCL_NORMAL.\n"); hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); - /* Except in the first SetCooperativeLevel call, Windows XP randomly does not send - * WM_ACTIVATEAPP. Windows 7 sends the message reliably. Mark the XP behavior broken. */ - ok(activateapp_testdata.received || broken(!activateapp_testdata.received), - "Expected WM_ACTIVATEAPP, but did not receive it.\n"); + ok(activateapp_testdata.received, "Expected WM_ACTIVATEAPP, but did not receive it.\n"); hr = IDirectDraw4_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Recursive set of DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; activateapp_testdata.ddraw = ddraw; activateapp_testdata.window = window; activateapp_testdata.coop_level = DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN; hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); - ok(activateapp_testdata.received || broken(!activateapp_testdata.received), - "Expected WM_ACTIVATEAPP, but did not receive it.\n"); + ok(activateapp_testdata.received, "Expected WM_ACTIVATEAPP, but did not receive it.\n"); hr = IDirectDraw4_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); @@ -4167,15 +4205,14 @@ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Setting DDSCL_NORMAL with recursive invocation. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; activateapp_testdata.ddraw = ddraw; activateapp_testdata.window = window; activateapp_testdata.coop_level = DDSCL_NORMAL; hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); - ok(activateapp_testdata.received || broken(!activateapp_testdata.received), - "Expected WM_ACTIVATEAPP, but did not receive it.\n"); + ok(activateapp_testdata.received, "Expected WM_ACTIVATEAPP, but did not receive it.\n"); /* DDraw is in exlusive mode now. */ memset(&ddsd, 0, sizeof(ddsd)); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ddraw/tests/ddraw7.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ddraw/tests/ddraw7.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ddraw/tests/ddraw7.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ddraw/tests/ddraw7.c 2014-12-15 00:45:34.000000000 +0000 @@ -2296,6 +2296,30 @@ {WM_SIZE, TRUE, SIZE_RESTORED}, /* DefWindowProc. */ {0, FALSE, 0}, }; + static const struct message sc_restore_messages[] = + { + {WM_SYSCOMMAND, TRUE, SC_RESTORE}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_RESTORED}, + {0, FALSE, 0}, + }; + static const struct message sc_minimize_messages[] = + { + {WM_SYSCOMMAND, TRUE, SC_MINIMIZE}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_MINIMIZED}, + {0, FALSE, 0}, + }; + static const struct message sc_maximize_messages[] = + { + {WM_SYSCOMMAND, TRUE, SC_MAXIMIZE}, + {WM_WINDOWPOSCHANGING, FALSE, 0}, + {WM_WINDOWPOSCHANGED, FALSE, 0}, + {WM_SIZE, TRUE, SIZE_MAXIMIZED}, + {0, FALSE, 0}, + }; static const struct message normal_messages[] = { @@ -2470,6 +2494,24 @@ * testbot. Another Restore call would presumably avoid the crash, but it also moots * the point of the GetSurfaceDesc call. */ + expect_messages = sc_minimize_messages; + SendMessageA(window, WM_SYSCOMMAND, SC_MINIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + expect_messages = NULL; + + expect_messages = sc_restore_messages; + SendMessageA(window, WM_SYSCOMMAND, SC_RESTORE, 0); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + expect_messages = NULL; + + expect_messages = sc_maximize_messages; + SendMessageA(window, WM_SYSCOMMAND, SC_MAXIMIZE, 0); + ok(!expect_messages->message, "Expected message %#x, but didn't receive it.\n", expect_messages->message); + expect_messages = NULL; + + hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(SUCCEEDED(hr), "SetCooperativeLevel failed, hr %#x.\n", hr); + PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); expect_messages = exclusive_messages; screen_size.cx = 0; @@ -3879,7 +3921,7 @@ WS_MAXIMIZE | WS_CAPTION , 0, 0, 640, 480, 0, 0, 0, 0); /* Exclusive with window already active. */ - SetActiveWindow(window); + SetForegroundWindow(window); activateapp_testdata.received = FALSE; hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); @@ -3888,7 +3930,7 @@ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Exclusive with window not active. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); @@ -3897,30 +3939,26 @@ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Normal with window not active, then exclusive with the same window. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); ok(!activateapp_testdata.received, "Received WM_ACTIVATEAPP when setting DDSCL_NORMAL.\n"); hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); - /* Except in the first SetCooperativeLevel call, Windows XP randomly does not send - * WM_ACTIVATEAPP. Windows 7 sends the message reliably. Mark the XP behavior broken. */ - ok(activateapp_testdata.received || broken(!activateapp_testdata.received), - "Expected WM_ACTIVATEAPP, but did not receive it.\n"); + ok(activateapp_testdata.received, "Expected WM_ACTIVATEAPP, but did not receive it.\n"); hr = IDirectDraw7_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Recursive set of DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; activateapp_testdata.ddraw = ddraw; activateapp_testdata.window = window; activateapp_testdata.coop_level = DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN; hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); - ok(activateapp_testdata.received || broken(!activateapp_testdata.received), - "Expected WM_ACTIVATEAPP, but did not receive it.\n"); + ok(activateapp_testdata.received, "Expected WM_ACTIVATEAPP, but did not receive it.\n"); hr = IDirectDraw7_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); @@ -3935,15 +3973,14 @@ ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); /* Setting DDSCL_NORMAL with recursive invocation. */ - SetActiveWindow(NULL); + SetForegroundWindow(GetDesktopWindow()); activateapp_testdata.received = FALSE; activateapp_testdata.ddraw = ddraw; activateapp_testdata.window = window; activateapp_testdata.coop_level = DDSCL_NORMAL; hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr); - ok(activateapp_testdata.received || broken(!activateapp_testdata.received), - "Expected WM_ACTIVATEAPP, but did not receive it.\n"); + ok(activateapp_testdata.received, "Expected WM_ACTIVATEAPP, but did not receive it.\n"); /* DDraw is in exlusive mode now. */ memset(&ddsd, 0, sizeof(ddsd)); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/dsound/buffer.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/dsound/buffer.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/dsound/buffer.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/dsound/buffer.c 2014-12-15 00:45:34.000000000 +0000 @@ -81,6 +81,27 @@ return ref; } +static int notify_compar(const void *l, const void *r) +{ + const DSBPOSITIONNOTIFY *left = l; + const DSBPOSITIONNOTIFY *right = r; + + /* place DSBPN_OFFSETSTOP at the start of the sorted array */ + if(left->dwOffset == DSBPN_OFFSETSTOP){ + if(right->dwOffset != DSBPN_OFFSETSTOP) + return -1; + }else if(right->dwOffset == DSBPN_OFFSETSTOP) + return 1; + + if(left->dwOffset == right->dwOffset) + return 0; + + if(left->dwOffset < right->dwOffset) + return -1; + + return 1; +} + static HRESULT WINAPI IDirectSoundNotifyImpl_SetNotificationPositions(IDirectSoundNotify *iface, DWORD howmuch, const DSBPOSITIONNOTIFY *notify) { @@ -113,6 +134,7 @@ } CopyMemory(This->notifies, notify, howmuch * sizeof(DSBPOSITIONNOTIFY)); This->nrofnotifies = howmuch; + qsort(This->notifies, howmuch, sizeof(DSBPOSITIONNOTIFY), notify_compar); } else { HeapFree(GetProcessHeap(), 0, This->notifies); This->notifies = NULL; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/dsound/mixer.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/dsound/mixer.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/dsound/mixer.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/dsound/mixer.c 2014-12-15 00:45:34.000000000 +0000 @@ -183,48 +183,67 @@ */ void DSOUND_CheckEvent(const IDirectSoundBufferImpl *dsb, DWORD playpos, int len) { - int i; - DWORD offset; - LPDSBPOSITIONNOTIFY event; - TRACE("(%p,%d)\n",dsb,len); - - if (dsb->nrofnotifies == 0) - return; - - TRACE("(%p) buflen = %d, playpos = %d, len = %d\n", - dsb, dsb->buflen, playpos, len); - for (i = 0; i < dsb->nrofnotifies ; i++) { - event = dsb->notifies + i; - offset = event->dwOffset; - TRACE("checking %d, position %d, event = %p\n", - i, offset, event->hEventNotify); - /* DSBPN_OFFSETSTOP has to be the last element. So this is */ - /* OK. [Inside DirectX, p274] */ - /* Windows does not seem to enforce this, and some apps rely */ - /* on that, so we can't stop there. */ - /* */ - /* This also means we can't sort the entries by offset, */ - /* because DSBPN_OFFSETSTOP == -1 */ - if (offset == DSBPN_OFFSETSTOP) { - if (dsb->state == STATE_STOPPED) { - SetEvent(event->hEventNotify); - TRACE("signalled event %p (%d)\n", event->hEventNotify, i); - } - continue; - } - if ((playpos + len) >= dsb->buflen) { - if ((offset < ((playpos + len) % dsb->buflen)) || - (offset >= playpos)) { - TRACE("signalled event %p (%d)\n", event->hEventNotify, i); - SetEvent(event->hEventNotify); - } - } else { - if ((offset >= playpos) && (offset < (playpos + len))) { - TRACE("signalled event %p (%d)\n", event->hEventNotify, i); - SetEvent(event->hEventNotify); - } - } - } + int first, left, right, check; + + if(dsb->nrofnotifies == 0) + return; + + if(dsb->state == STATE_STOPPED){ + TRACE("Stopped...\n"); + /* DSBPN_OFFSETSTOP notifies are always at the start of the sorted array */ + for(left = 0; left < dsb->nrofnotifies; ++left){ + if(dsb->notifies[left].dwOffset != DSBPN_OFFSETSTOP) + break; + + TRACE("Signalling %p\n", dsb->notifies[left].hEventNotify); + SetEvent(dsb->notifies[left].hEventNotify); + } + return; + } + + for(first = 0; first < dsb->nrofnotifies && dsb->notifies[first].dwOffset == DSBPN_OFFSETSTOP; ++first) + ; + + if(first == dsb->nrofnotifies) + return; + + check = left = first; + right = dsb->nrofnotifies - 1; + + /* find leftmost notify that is greater than playpos */ + while(left != right){ + check = left + (right - left) / 2; + if(dsb->notifies[check].dwOffset < playpos) + left = check + 1; + else if(dsb->notifies[check].dwOffset > playpos) + right = check; + else{ + left = check; + break; + } + } + + TRACE("Not stopped: first notify: %u (%u), range: [%u,%u)\n", first, + dsb->notifies[check].dwOffset, playpos, (playpos + len) % dsb->buflen); + + /* send notifications in range */ + for(check = left; check < dsb->nrofnotifies; ++check){ + if(dsb->notifies[check].dwOffset >= playpos + len) + break; + + TRACE("Signalling %p (%u)\n", dsb->notifies[check].hEventNotify, dsb->notifies[check].dwOffset); + SetEvent(dsb->notifies[check].hEventNotify); + } + + if(playpos + len > dsb->buflen){ + for(check = first; check < left; ++check){ + if(dsb->notifies[check].dwOffset >= (playpos + len) % dsb->buflen) + break; + + TRACE("Signalling %p (%u)\n", dsb->notifies[check].hEventNotify, dsb->notifies[check].dwOffset); + SetEvent(dsb->notifies[check].hEventNotify); + } + } } static inline float get_current_sample(const IDirectSoundBufferImpl *dsb, diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/dsound/tests/dsound.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/dsound/tests/dsound.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/dsound/tests/dsound.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/dsound/tests/dsound.c 2014-12-15 00:45:34.000000000 +0000 @@ -1486,6 +1486,89 @@ return S_OK; } +static void test_notifications(LPGUID lpGuid) +{ + HRESULT rc; + IDirectSound *dso; + IDirectSoundBuffer *buf; + IDirectSoundNotify *buf_notif; + DSBUFFERDESC bufdesc; + WAVEFORMATEX wfx; + DSBPOSITIONNOTIFY notifies[2]; + HANDLE handles[2]; + DWORD expect; + int cycles; + + rc = pDirectSoundCreate(lpGuid, &dso, NULL); + ok(rc == DS_OK || rc == DSERR_NODRIVER || rc == DSERR_ALLOCATED, + "DirectSoundCreate() failed: %08x\n", rc); + if(rc != DS_OK) + return; + + rc = IDirectSound_SetCooperativeLevel(dso, get_hwnd(), DSSCL_PRIORITY); + ok(rc == DS_OK, "IDirectSound_SetCooperativeLevel() failed: %08x\n", rc); + if(rc != DS_OK){ + IDirectSound_Release(dso); + return; + } + + wfx.wFormatTag = WAVE_FORMAT_PCM; + wfx.nChannels = 1; + wfx.nSamplesPerSec = 44100; + wfx.wBitsPerSample = 16; + wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + wfx.cbSize = 0; + + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize = sizeof(bufdesc); + bufdesc.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY; + bufdesc.dwBufferBytes = wfx.nSamplesPerSec * wfx.nBlockAlign / 2; /* 0.5s */ + bufdesc.lpwfxFormat = &wfx; + rc = IDirectSound_CreateSoundBuffer(dso, &bufdesc, &buf, NULL); + ok(rc == DS_OK && buf != NULL, "IDirectSound_CreateSoundBuffer() failed " + "to create a buffer %08x\n", rc); + + rc = IDirectSoundBuffer_QueryInterface(buf, &IID_IDirectSoundNotify, (void**)&buf_notif); + ok(rc == DS_OK, "QueryInterface(IID_IDirectSoundNotify): %08x\n", rc); + + /* create notifications at each end of the buffer */ + notifies[0].dwOffset = 0; + handles[0] = notifies[0].hEventNotify = CreateEventW(NULL, FALSE, FALSE, NULL); + notifies[1].dwOffset = bufdesc.dwBufferBytes - 1; + handles[1] = notifies[1].hEventNotify = CreateEventW(NULL, FALSE, FALSE, NULL); + + rc = IDirectSoundNotify_SetNotificationPositions(buf_notif, 2, notifies); + ok(rc == DS_OK, "SetNotificationPositions: %08x\n", rc); + + IDirectSoundNotify_Release(buf_notif); + + rc = IDirectSoundBuffer_Play(buf, 0, 0, DSBPLAY_LOOPING); + ok(rc == DS_OK, "Play: %08x\n", rc); + + expect = 0; + for(cycles = 0; cycles < 6 /* 1.5s */; ++cycles){ + DWORD wait; + + /* since the notifications are on opposite ends of the entire buffer, + * they should arrive well-ordered in an alternating sequence. */ + wait = WaitForMultipleObjects(2, handles, FALSE, 1000); + ok(wait <= WAIT_OBJECT_0 + 1 && wait - WAIT_OBJECT_0 == expect, + "Got unexpected notification order or timeout: %u\n", wait); + + expect = !expect; + } + + rc = IDirectSoundBuffer_Stop(buf); + ok(rc == DS_OK, "Stop: %08x\n", rc); + + CloseHandle(notifies[0].hEventNotify); + CloseHandle(notifies[1].hEventNotify); + + IDirectSoundBuffer_Release(buf); + IDirectSound_Release(dso); +} + static unsigned int number; static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription, @@ -1516,6 +1599,7 @@ test_frequency(lpGuid); test_duplicate(lpGuid); test_invalid_fmts(lpGuid); + test_notifications(lpGuid); } return TRUE; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/analyzer.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/analyzer.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/analyzer.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/analyzer.c 2014-12-15 00:45:34.000000000 +0000 @@ -845,7 +845,7 @@ { const struct dwritescript_properties *scriptprops; struct scriptshaping_context context; - struct scriptshaping_cache *cache; + struct scriptshaping_cache *cache = NULL; WCHAR *string; BOOL update_cluster; UINT32 i, g; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/dwrite_private.h wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/dwrite_private.h --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/dwrite_private.h 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/dwrite_private.h 2014-12-15 00:45:34.000000000 +0000 @@ -96,19 +96,21 @@ extern HRESULT create_textlayout(const WCHAR*,UINT32,IDWriteTextFormat*,FLOAT,FLOAT,IDWriteTextLayout**) DECLSPEC_HIDDEN; extern HRESULT create_trimmingsign(IDWriteInlineObject**) DECLSPEC_HIDDEN; extern HRESULT create_typography(IDWriteTypography**) DECLSPEC_HIDDEN; -extern HRESULT create_gdiinterop(IDWriteFactory*,IDWriteGdiInterop**) DECLSPEC_HIDDEN; +extern HRESULT create_gdiinterop(IDWriteFactory2*,IDWriteGdiInterop**) DECLSPEC_HIDDEN; extern void release_gdiinterop(IDWriteGdiInterop*) DECLSPEC_HIDDEN; extern HRESULT create_localizedstrings(IDWriteLocalizedStrings**) DECLSPEC_HIDDEN; extern HRESULT add_localizedstring(IDWriteLocalizedStrings*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN; extern HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **strings) DECLSPEC_HIDDEN; -extern HRESULT get_system_fontcollection(IDWriteFactory*,IDWriteFontCollection**) DECLSPEC_HIDDEN; +extern HRESULT get_system_fontcollection(IDWriteFactory2*,IDWriteFontCollection**) DECLSPEC_HIDDEN; extern HRESULT get_textanalyzer(IDWriteTextAnalyzer**) DECLSPEC_HIDDEN; extern HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *reference_key, UINT32 key_size, IDWriteFontFile **font_file) DECLSPEC_HIDDEN; extern HRESULT create_localfontfileloader(IDWriteLocalFontFileLoader** iface) DECLSPEC_HIDDEN; extern HRESULT create_fontface(DWRITE_FONT_FACE_TYPE,UINT32,IDWriteFontFile* const*,UINT32,DWRITE_FONT_SIMULATIONS,IDWriteFontFace2**) DECLSPEC_HIDDEN; -extern HRESULT create_font_collection(IDWriteFactory*,IDWriteFontFileEnumerator*,BOOL,IDWriteFontCollection**) DECLSPEC_HIDDEN; +extern HRESULT create_font_collection(IDWriteFactory2*,IDWriteFontFileEnumerator*,BOOL,IDWriteFontCollection**) DECLSPEC_HIDDEN; extern BOOL is_system_collection(IDWriteFontCollection*) DECLSPEC_HIDDEN; extern HRESULT get_local_refkey(const WCHAR*,const FILETIME*,void**,UINT32*) DECLSPEC_HIDDEN; +extern HRESULT get_filestream_from_file(IDWriteFontFile*,IDWriteFontFileStream**) DECLSPEC_HIDDEN; +extern BOOL is_face_type_supported(DWRITE_FONT_FACE_TYPE) DECLSPEC_HIDDEN; /* Opentype font table functions */ extern HRESULT opentype_analyze_font(IDWriteFontFileStream*,UINT32*,DWRITE_FONT_FILE_TYPE*,DWRITE_FONT_FACE_TYPE*,BOOL*) DECLSPEC_HIDDEN; @@ -124,10 +126,11 @@ extern WCHAR bidi_get_mirrored_char(WCHAR) DECLSPEC_HIDDEN; /* FreeType integration */ -struct ft_fontface; extern BOOL init_freetype(void) DECLSPEC_HIDDEN; -extern HRESULT alloc_ft_fontface(const void*,UINT32,UINT32,struct ft_fontface**) DECLSPEC_HIDDEN; -extern void release_ft_fontface(struct ft_fontface*) DECLSPEC_HIDDEN; +extern void release_freetype(void) DECLSPEC_HIDDEN; +extern HRESULT freetype_get_design_glyph_metrics(IDWriteFontFace2*,UINT16,UINT16,DWRITE_GLYPH_METRICS*) DECLSPEC_HIDDEN; +extern void freetype_notify_cacheremove(IDWriteFontFace2*) DECLSPEC_HIDDEN; +extern BOOL freetype_is_monospaced(IDWriteFontFace2*) DECLSPEC_HIDDEN; /* Glyph shaping */ enum SCRIPT_JUSTIFY diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/font.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/font.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/font.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/font.c 2014-12-15 00:45:34.000000000 +0000 @@ -43,7 +43,7 @@ IDWriteLocalizedStrings *info_strings[DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_CID_NAME+1]; /* data needed to create fontface instance */ - IDWriteFactory *factory; + IDWriteFactory2 *factory; DWRITE_FONT_FACE_TYPE face_type; IDWriteFontFile *file; UINT32 face_index; @@ -87,6 +87,7 @@ IDWriteFontFamily *family; USHORT simulations; + DWRITE_FONT_STYLE style; struct dwrite_font_data *data; }; @@ -96,6 +97,11 @@ UINT32 size; }; +#define GLYPH_BLOCK_SHIFT 8 +#define GLYPH_BLOCK_SIZE (1UL << GLYPH_BLOCK_SHIFT) +#define GLYPH_BLOCK_MASK (GLYPH_BLOCK_SIZE - 1) +#define GLYPH_MAX 65536 + struct dwrite_fontface { IDWriteFontFace2 IDWriteFontFace2_iface; LONG ref; @@ -110,7 +116,7 @@ DWRITE_FONT_METRICS1 metrics; struct dwrite_fonttable cmap; - struct ft_fontface *ft; + DWRITE_GLYPH_METRICS *glyphs[GLYPH_MAX/GLYPH_BLOCK_SIZE]; }; struct dwrite_fontfile { @@ -123,8 +129,6 @@ IDWriteFontFileStream *stream; }; -static HRESULT get_filestream_from_file(IDWriteFontFile*,IDWriteFontFileStream**); - static inline struct dwrite_fontface *impl_from_IDWriteFontFace2(IDWriteFontFace2 *iface) { return CONTAINING_RECORD(iface, struct dwrite_fontface, IDWriteFontFace2_iface); @@ -150,6 +154,31 @@ return CONTAINING_RECORD(iface, struct dwrite_fontcollection, IDWriteFontCollection_iface); } +static HRESULT get_cached_glyph_metrics(struct dwrite_fontface *fontface, UINT16 glyph, DWRITE_GLYPH_METRICS *metrics) +{ + static const DWRITE_GLYPH_METRICS nil; + DWRITE_GLYPH_METRICS *block = fontface->glyphs[glyph >> GLYPH_BLOCK_SHIFT]; + + if (!block || !memcmp(&block[glyph & GLYPH_BLOCK_MASK], &nil, sizeof(DWRITE_GLYPH_METRICS))) return S_FALSE; + memcpy(metrics, &block[glyph & GLYPH_BLOCK_MASK], sizeof(*metrics)); + return S_OK; +} + +static HRESULT set_cached_glyph_metrics(struct dwrite_fontface *fontface, UINT16 glyph, DWRITE_GLYPH_METRICS *metrics) +{ + DWRITE_GLYPH_METRICS **block = &fontface->glyphs[glyph >> GLYPH_BLOCK_SHIFT]; + + if (!*block) { + /* start new block */ + *block = heap_alloc_zero(sizeof(*metrics) * GLYPH_BLOCK_SIZE); + if (!*block) + return E_OUTOFMEMORY; + } + + memcpy(&(*block)[glyph & GLYPH_BLOCK_MASK], metrics, sizeof(*metrics)); + return S_OK; +} + static inline void* get_fontface_cmap(struct dwrite_fontface *fontface) { BOOL exists = FALSE; @@ -181,7 +210,7 @@ } IDWriteFontFile_Release(data->file); - IDWriteFactory_Release(data->factory); + IDWriteFactory2_Release(data->factory); heap_free(data->facename); heap_free(data); } @@ -246,7 +275,11 @@ if (This->files[i]) IDWriteFontFile_Release(This->files[i]); } - release_ft_fontface(This->ft); + + for (i = 0; i < sizeof(This->glyphs)/sizeof(This->glyphs[0]); i++) + heap_free(This->glyphs[i]); + + freetype_notify_cacheremove(iface); heap_free(This); } @@ -320,11 +353,34 @@ } static HRESULT WINAPI dwritefontface_GetDesignGlyphMetrics(IDWriteFontFace2 *iface, - UINT16 const *glyph_indices, UINT32 glyph_count, DWRITE_GLYPH_METRICS *metrics, BOOL is_sideways) + UINT16 const *glyphs, UINT32 glyph_count, DWRITE_GLYPH_METRICS *ret, BOOL is_sideways) { struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface); - FIXME("(%p)->(%p %u %p %d): stub\n", This, glyph_indices, glyph_count, metrics, is_sideways); - return E_NOTIMPL; + HRESULT hr; + UINT32 i; + + TRACE("(%p)->(%p %u %p %d)\n", This, glyphs, glyph_count, ret, is_sideways); + + if (!glyphs) + return E_INVALIDARG; + + if (is_sideways) + FIXME("sideways metrics are not supported.\n"); + + for (i = 0; i < glyph_count; i++) { + DWRITE_GLYPH_METRICS metrics; + + hr = get_cached_glyph_metrics(This, glyphs[i], &metrics); + if (hr != S_OK) { + freetype_get_design_glyph_metrics(iface, This->metrics.designUnitsPerEm, glyphs[i], &metrics); + hr = set_cached_glyph_metrics(This, glyphs[i], &metrics); + if (FAILED(hr)) + return hr; + } + ret[i] = metrics; + } + + return S_OK; } static HRESULT WINAPI dwritefontface_GetGlyphIndices(IDWriteFontFace2 *iface, UINT32 const *codepoints, @@ -439,16 +495,30 @@ static BOOL WINAPI dwritefontface1_IsMonospacedFont(IDWriteFontFace2 *iface) { struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface); - FIXME("(%p): stub\n", This); - return FALSE; + TRACE("(%p)\n", This); + return freetype_is_monospaced(iface); } static HRESULT WINAPI dwritefontface1_GetDesignGlyphAdvances(IDWriteFontFace2 *iface, - UINT32 glyph_count, UINT16 const *indices, INT32 *advances, BOOL is_sideways) + UINT32 glyph_count, UINT16 const *glyphs, INT32 *advances, BOOL is_sideways) { struct dwrite_fontface *This = impl_from_IDWriteFontFace2(iface); - FIXME("(%p)->(%u %p %p %d): stub\n", This, glyph_count, indices, advances, is_sideways); - return E_NOTIMPL; + UINT32 i; + + TRACE("(%p)->(%u %p %p %d)\n", This, glyph_count, glyphs, advances, is_sideways); + + for (i = 0; i < glyph_count; i++) { + DWRITE_GLYPH_METRICS metrics = { 0 }; + HRESULT hr; + + hr = IDWriteFontFace2_GetDesignGlyphMetrics(iface, glyphs + i, 1, &metrics, is_sideways); + if (FAILED(hr)) + return hr; + + advances[i] = is_sideways ? metrics.advanceHeight : metrics.advanceWidth; + } + + return S_OK; } static HRESULT WINAPI dwritefontface1_GetGdiCompatibleGlyphAdvances(IDWriteFontFace2 *iface, @@ -655,7 +725,7 @@ *fontface = NULL; - hr = IDWriteFactory_CreateFontFace(data->factory, data->face_type, 1, &data->file, + hr = IDWriteFactory2_CreateFontFace(data->factory, data->face_type, 1, &data->file, data->face_index, font->simulations, &face); if (FAILED(hr)) return hr; @@ -738,7 +808,7 @@ { struct dwrite_font *This = impl_from_IDWriteFont2(iface); TRACE("(%p)\n", This); - return This->data->style; + return This->style; } static BOOL WINAPI dwritefont_IsSymbolFont(IDWriteFont2 *iface) @@ -1001,9 +1071,14 @@ This->family = family; IDWriteFontFamily_AddRef(family); This->simulations = simulations; + This->style = data->style; This->data = data; InterlockedIncrement(&This->data->ref); + /* set oblique style from requested simulation */ + if ((simulations & DWRITE_FONT_SIMULATIONS_OBLIQUE) && data->style == DWRITE_FONT_STYLE_NORMAL) + This->style = DWRITE_FONT_STYLE_OBLIQUE; + *font = (IDWriteFont*)&This->IDWriteFont2_iface; return S_OK; @@ -1427,7 +1502,7 @@ return S_OK; } -static HRESULT get_filestream_from_file(IDWriteFontFile *file, IDWriteFontFileStream **stream) +HRESULT get_filestream_from_file(IDWriteFontFile *file, IDWriteFontFileStream **stream) { IDWriteFontFileLoader *loader; const void *key; @@ -1452,7 +1527,7 @@ return hr; } -static HRESULT init_font_data(IDWriteFactory *factory, IDWriteFontFile *file, UINT32 face_index, DWRITE_FONT_FACE_TYPE face_type, struct dwrite_font_data *data) +static HRESULT init_font_data(IDWriteFactory2 *factory, IDWriteFontFile *file, UINT32 face_index, DWRITE_FONT_FACE_TYPE face_type, struct dwrite_font_data *data) { void *os2_context, *head_context; const void *tt_os2 = NULL, *tt_head = NULL; @@ -1468,7 +1543,7 @@ data->face_index = face_index; data->face_type = face_type; IDWriteFontFile_AddRef(file); - IDWriteFactory_AddRef(factory); + IDWriteFactory2_AddRef(factory); opentype_get_font_table(stream, face_type, face_index, MS_OS2_TAG, &tt_os2, &os2_context, NULL, NULL); opentype_get_font_table(stream, face_type, face_index, MS_HEAD_TAG, &tt_head, &head_context, NULL, NULL); @@ -1503,7 +1578,7 @@ return S_OK; } -HRESULT create_font_collection(IDWriteFactory* factory, IDWriteFontFileEnumerator *enumerator, BOOL is_system, IDWriteFontCollection **ret) +HRESULT create_font_collection(IDWriteFactory2* factory, IDWriteFontFileEnumerator *enumerator, BOOL is_system, IDWriteFontCollection **ret) { struct dwrite_fontcollection *collection; BOOL current = FALSE; @@ -1586,7 +1661,7 @@ exists = FALSE; hr = collection_find_family(collection, buffer, &index, &exists); if (exists) - hr = fontfamily_add_font(collection->family_data[index], font_data); + fontfamily_add_font(collection->family_data[index], font_data); else { struct dwrite_fontfamily_data *family_data; @@ -1613,7 +1688,7 @@ IDWriteFontFileEnumerator IDWriteFontFileEnumerator_iface; LONG ref; - IDWriteFactory *factory; + IDWriteFactory2 *factory; HKEY hkey; int index; }; @@ -1648,7 +1723,7 @@ ULONG ref = InterlockedDecrement(&enumerator->ref); if (!ref) { - IDWriteFactory_Release(enumerator->factory); + IDWriteFactory2_Release(enumerator->factory); RegCloseKey(enumerator->hkey); heap_free(enumerator); } @@ -1660,8 +1735,8 @@ { struct system_fontfile_enumerator *enumerator = impl_from_IDWriteFontFileEnumerator(iface); DWORD ret, type, count; + WCHAR *filename; HRESULT hr; - BYTE *data; *file = NULL; @@ -1671,17 +1746,30 @@ if (RegEnumValueW(enumerator->hkey, enumerator->index, NULL, NULL, NULL, &type, NULL, &count)) return E_FAIL; - if (!(data = heap_alloc(count))) + if (!(filename = heap_alloc(count))) return E_OUTOFMEMORY; - ret = RegEnumValueW(enumerator->hkey, enumerator->index, NULL, NULL, NULL, &type, data, &count); + ret = RegEnumValueW(enumerator->hkey, enumerator->index, NULL, NULL, NULL, &type, (BYTE*)filename, &count); if (ret) { - heap_free(data); + heap_free(filename); return E_FAIL; } - hr = IDWriteFactory_CreateFontFileReference(enumerator->factory, (WCHAR*)data, NULL, file); - heap_free(data); + /* Fonts installed in 'Fonts' system dir don't get full path in registry font files cache */ + if (!strchrW(filename, '\\')) { + static const WCHAR fontsW[] = {'\\','f','o','n','t','s','\\',0}; + WCHAR fullpathW[MAX_PATH]; + + GetWindowsDirectoryW(fullpathW, sizeof(fullpathW)/sizeof(WCHAR)); + strcatW(fullpathW, fontsW); + strcatW(fullpathW, filename); + + hr = IDWriteFactory2_CreateFontFileReference(enumerator->factory, fullpathW, NULL, file); + } + else + hr = IDWriteFactory2_CreateFontFileReference(enumerator->factory, filename, NULL, file); + + heap_free(filename); return hr; } @@ -1717,7 +1805,7 @@ systemfontfileenumerator_GetCurrentFontFile }; -static HRESULT create_system_fontfile_enumerator(IDWriteFactory *factory, IDWriteFontFileEnumerator **ret) +static HRESULT create_system_fontfile_enumerator(IDWriteFactory2 *factory, IDWriteFontFileEnumerator **ret) { struct system_fontfile_enumerator *enumerator; static const WCHAR fontslistW[] = { @@ -1736,11 +1824,11 @@ enumerator->ref = 1; enumerator->factory = factory; enumerator->index = -1; - IDWriteFactory_AddRef(factory); + IDWriteFactory2_AddRef(factory); if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, fontslistW, 0, GENERIC_READ, &enumerator->hkey)) { ERR("failed to open fonts list key\n"); - IDWriteFactory_Release(factory); + IDWriteFactory2_Release(factory); heap_free(enumerator); return E_FAIL; } @@ -1750,7 +1838,7 @@ return S_OK; } -HRESULT get_system_fontcollection(IDWriteFactory *factory, IDWriteFontCollection **collection) +HRESULT get_system_fontcollection(IDWriteFactory2 *factory, IDWriteFontCollection **collection) { IDWriteFontFileEnumerator *enumerator; HRESULT hr; @@ -1913,10 +2001,7 @@ DWRITE_FONT_SIMULATIONS simulations, IDWriteFontFace2 **ret) { struct dwrite_fontface *fontface; - const void *data_ptr; HRESULT hr = S_OK; - void *context; - UINT64 size; int i; *ret = NULL; @@ -1944,7 +2029,7 @@ fontface->cmap.size = 0; fontface->index = index; fontface->simulations = simulations; - fontface->ft = NULL; + memset(fontface->glyphs, 0, sizeof(fontface->glyphs)); for (i = 0; i < fontface->file_count; i++) { hr = get_stream_from_file(font_files[i], &fontface->streams[i]); @@ -1959,25 +2044,8 @@ get_font_properties_from_stream(fontface->streams[0], facetype, index, &fontface->metrics, NULL, NULL, NULL); - hr = IDWriteFontFileStream_GetFileSize(fontface->streams[0], &size); - if (FAILED(hr)) - goto fail; - - hr = IDWriteFontFileStream_ReadFileFragment(fontface->streams[0], &data_ptr, 0, size, &context); - if (FAILED(hr)) - goto fail; - - hr = alloc_ft_fontface(data_ptr, size, fontface->index, &fontface->ft); - IDWriteFontFileStream_ReleaseFileFragment(fontface->streams[0], context); - if (FAILED(hr)) - goto fail; - *ret = &fontface->IDWriteFontFace2_iface; return S_OK; - -fail: - IDWriteFontFace2_Release(&fontface->IDWriteFontFace2_iface); - return hr; } /* IDWriteLocalFontFileLoader and its required IDWriteFontFileStream */ @@ -2107,8 +2175,8 @@ TRACE("(%p)->(%p)\n", This, last_writetime); - li.LowPart = This->entry->key->writetime.dwLowDateTime; - li.HighPart = This->entry->key->writetime.dwHighDateTime; + li.u.LowPart = This->entry->key->writetime.dwLowDateTime; + li.u.HighPart = This->entry->key->writetime.dwHighDateTime; *last_writetime = li.QuadPart; return S_OK; @@ -2228,8 +2296,10 @@ CloseHandle(mapping); stream = heap_alloc(sizeof(*stream)); - if (!stream) + if (!stream) { + UnmapViewOfFile(file_ptr); return E_OUTOFMEMORY; + } stream->key = heap_alloc(key_size); if (!stream->key) { diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/freetype.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/freetype.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/freetype.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/freetype.c 2014-12-15 00:45:34.000000000 +0000 @@ -18,15 +18,19 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#define COBJMACROS + #include "config.h" #include "wine/port.h" #ifdef HAVE_FT2BUILD_H #include +#include FT_CACHE_H #include FT_FREETYPE_H #endif /* HAVE_FT2BUILD_H */ #include "windef.h" +#include "dwrite_2.h" #include "wine/library.h" #include "wine/debug.h" @@ -36,8 +40,18 @@ #ifdef HAVE_FREETYPE +static CRITICAL_SECTION freetype_cs; +static CRITICAL_SECTION_DEBUG critsect_debug = +{ + 0, 0, &freetype_cs, + { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": freetype_cs") } +}; +static CRITICAL_SECTION freetype_cs = { &critsect_debug, -1, 0, 0, 0, 0 }; + static void *ft_handle = NULL; static FT_Library library = 0; +static FTC_Manager cache_manager = 0; typedef struct { FT_Int major; @@ -46,16 +60,63 @@ } FT_Version_t; #define MAKE_FUNCPTR(f) static typeof(f) * p##f = NULL -MAKE_FUNCPTR(FT_Done_Face); +MAKE_FUNCPTR(FT_Done_FreeType); MAKE_FUNCPTR(FT_Init_FreeType); MAKE_FUNCPTR(FT_Library_Version); +MAKE_FUNCPTR(FT_Load_Glyph); MAKE_FUNCPTR(FT_New_Memory_Face); +MAKE_FUNCPTR(FTC_Manager_New); +MAKE_FUNCPTR(FTC_Manager_Done); +MAKE_FUNCPTR(FTC_Manager_LookupFace); +MAKE_FUNCPTR(FTC_Manager_LookupSize); +MAKE_FUNCPTR(FTC_Manager_RemoveFaceID); #undef MAKE_FUNCPTR -struct ft_fontface +static FT_Error face_requester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *face) { - FT_Face face; -}; + IDWriteFontFace *fontface = (IDWriteFontFace*)face_id; + IDWriteFontFileStream *stream; + IDWriteFontFile *file; + const void *data_ptr; + UINT32 index, count; + FT_Error fterror; + UINT64 data_size; + void *context; + HRESULT hr; + + *face = NULL; + + count = 1; + hr = IDWriteFontFace_GetFiles(fontface, &count, &file); + if (FAILED(hr)) + return FT_Err_Ok; + + hr = get_filestream_from_file(file, &stream); + IDWriteFontFile_Release(file); + if (FAILED(hr)) + return FT_Err_Ok; + + hr = IDWriteFontFileStream_GetFileSize(stream, &data_size); + if (FAILED(hr)) { + fterror = FT_Err_Invalid_Stream_Read; + goto fail; + } + + hr = IDWriteFontFileStream_ReadFileFragment(stream, &data_ptr, 0, data_size, &context); + if (FAILED(hr)) { + fterror = FT_Err_Invalid_Stream_Read; + goto fail; + } + + index = IDWriteFontFace_GetIndex(fontface); + fterror = pFT_New_Memory_Face(library, data_ptr, data_size, index, face); + IDWriteFontFileStream_ReleaseFileFragment(stream, context); + +fail: + IDWriteFontFileStream_Release(stream); + + return fterror; +} BOOL init_freetype(void) { @@ -68,10 +129,16 @@ } #define LOAD_FUNCPTR(f) if((p##f = wine_dlsym(ft_handle, #f, NULL, 0)) == NULL){WARN("Can't find symbol %s\n", #f); goto sym_not_found;} - LOAD_FUNCPTR(FT_Done_Face) + LOAD_FUNCPTR(FT_Done_FreeType) LOAD_FUNCPTR(FT_Init_FreeType) LOAD_FUNCPTR(FT_Library_Version) + LOAD_FUNCPTR(FT_Load_Glyph) LOAD_FUNCPTR(FT_New_Memory_Face) + LOAD_FUNCPTR(FTC_Manager_New) + LOAD_FUNCPTR(FTC_Manager_Done) + LOAD_FUNCPTR(FTC_Manager_LookupFace) + LOAD_FUNCPTR(FTC_Manager_LookupSize) + LOAD_FUNCPTR(FTC_Manager_RemoveFaceID) #undef LOAD_FUNCPTR if (pFT_Init_FreeType(&library) != 0) { @@ -82,6 +149,15 @@ } pFT_Library_Version(library, &FT_Version.major, &FT_Version.minor, &FT_Version.patch); + /* init cache manager */ + if (pFTC_Manager_New(library, 0, 0, 0, &face_requester, NULL, &cache_manager) != 0) { + ERR("Failed to init FreeType cache\n"); + pFT_Done_FreeType(library); + wine_dlclose(ft_handle, NULL, 0); + ft_handle = NULL; + return FALSE; + } + TRACE("FreeType version is %d.%d.%d\n", FT_Version.major, FT_Version.minor, FT_Version.patch); return TRUE; @@ -92,30 +168,61 @@ return FALSE; } -HRESULT alloc_ft_fontface(const void *data_ptr, UINT32 data_size, UINT32 index, struct ft_fontface **ftface) +void release_freetype(void) { - FT_Face face; - FT_Error err; + pFTC_Manager_Done(cache_manager); + pFT_Done_FreeType(library); +} + +void freetype_notify_cacheremove(IDWriteFontFace2 *fontface) +{ + EnterCriticalSection(&freetype_cs); + pFTC_Manager_RemoveFaceID(cache_manager, fontface); + LeaveCriticalSection(&freetype_cs); +} + +HRESULT freetype_get_design_glyph_metrics(IDWriteFontFace2 *fontface, UINT16 unitsperEm, UINT16 glyph, DWRITE_GLYPH_METRICS *ret) +{ + FTC_ScalerRec scaler; + FT_Size size; + + scaler.face_id = fontface; + scaler.width = unitsperEm; + scaler.height = unitsperEm; + scaler.pixel = 1; + scaler.x_res = 0; + scaler.y_res = 0; + + EnterCriticalSection(&freetype_cs); + if (pFTC_Manager_LookupSize(cache_manager, &scaler, &size) == 0) { + if (pFT_Load_Glyph(size->face, glyph, FT_LOAD_NO_SCALE) == 0) { + FT_Glyph_Metrics *metrics = &size->face->glyph->metrics; - *ftface = heap_alloc_zero(sizeof(struct ft_fontface)); - if (!*ftface) - return E_OUTOFMEMORY; - - err = pFT_New_Memory_Face(library, data_ptr, data_size, index, &face); - if (err) { - ERR("FT_New_Memory_Face rets %d\n", err); - return E_FAIL; + ret->leftSideBearing = metrics->horiBearingX; + ret->advanceWidth = metrics->horiAdvance; + ret->rightSideBearing = metrics->horiAdvance - metrics->horiBearingX - metrics->width; + ret->topSideBearing = metrics->vertBearingY; + ret->advanceHeight = metrics->vertAdvance; + ret->bottomSideBearing = metrics->vertAdvance - metrics->vertBearingY - metrics->height; + ret->verticalOriginY = metrics->height + metrics->vertBearingY; + } } - (*ftface)->face = face; + LeaveCriticalSection(&freetype_cs); return S_OK; } -void release_ft_fontface(struct ft_fontface *ftface) +BOOL freetype_is_monospaced(IDWriteFontFace2 *fontface) { - if (!ftface) return; - pFT_Done_Face(ftface->face); - heap_free(ftface); + BOOL is_monospaced = FALSE; + FT_Face face; + + EnterCriticalSection(&freetype_cs); + if (pFTC_Manager_LookupFace(cache_manager, fontface, &face) == 0) + is_monospaced = FT_IS_FIXED_WIDTH(face); + LeaveCriticalSection(&freetype_cs); + + return is_monospaced; } #else /* HAVE_FREETYPE */ @@ -125,14 +232,22 @@ return FALSE; } -HRESULT alloc_ft_fontface(const void *data_ptr, UINT32 data_size, UINT32 index, struct ft_fontface **face) +void release_freetype(void) +{ +} + +void freetype_notify_cacheremove(IDWriteFontFace2 *fontface) { - *face = NULL; - return S_FALSE; } -void release_ft_fontface(struct ft_fontface *face) +HRESULT freetype_get_design_glyph_metrics(IDWriteFontFace2 *fontface, UINT16 unitsperEm, UINT16 glyph, DWRITE_GLYPH_METRICS *ret) { + return E_NOTIMPL; +} + +BOOL freetype_is_monospaced(IDWriteFontFace2 *fontface) +{ + return FALSE; } #endif /* HAVE_FREETYPE */ diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/gdiinterop.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/gdiinterop.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/gdiinterop.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/gdiinterop.c 2014-12-15 00:45:34.000000000 +0000 @@ -40,7 +40,7 @@ struct gdiinterop { IDWriteGdiInterop IDWriteGdiInterop_iface; - IDWriteFactory *factory; + IDWriteFactory2 *factory; }; struct rendertarget { @@ -299,14 +299,14 @@ { struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface); TRACE("(%p)\n", This); - return IDWriteFactory_AddRef(This->factory); + return IDWriteFactory2_AddRef(This->factory); } static ULONG WINAPI gdiinterop_Release(IDWriteGdiInterop *iface) { struct gdiinterop *This = impl_from_IDWriteGdiInterop(iface); TRACE("(%p)\n", This); - return IDWriteFactory_Release(This->factory); + return IDWriteFactory2_Release(This->factory); } static HRESULT WINAPI gdiinterop_CreateFontFromLOGFONT(IDWriteGdiInterop *iface, @@ -326,7 +326,7 @@ if (!logfont) return E_INVALIDARG; - hr = IDWriteFactory_GetSystemFontCollection(This->factory, &collection, FALSE); + hr = IDWriteFactory2_GetSystemFontCollection(This->factory, &collection, FALSE); if (FAILED(hr)) { ERR("failed to get system font collection: 0x%08x.\n", hr); return hr; @@ -465,7 +465,7 @@ gdiinterop_CreateBitmapRenderTarget }; -HRESULT create_gdiinterop(IDWriteFactory *factory, IDWriteGdiInterop **ret) +HRESULT create_gdiinterop(IDWriteFactory2 *factory, IDWriteGdiInterop **ret) { struct gdiinterop *This; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/main.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/main.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/main.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/main.c 2014-12-15 00:45:34.000000000 +0000 @@ -34,8 +34,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(dwrite); -static IDWriteFactory *shared_factory; -static void release_shared_factory(IDWriteFactory*); +static IDWriteFactory2 *shared_factory; +static void release_shared_factory(IDWriteFactory2*); BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, LPVOID reserved) { @@ -449,7 +449,7 @@ }; struct dwritefactory { - IDWriteFactory IDWriteFactory_iface; + IDWriteFactory2 IDWriteFactory2_iface; LONG ref; IDWriteFontCollection *system_collection; @@ -462,9 +462,9 @@ struct list file_loaders; }; -static inline struct dwritefactory *impl_from_IDWriteFactory(IDWriteFactory *iface) +static inline struct dwritefactory *impl_from_IDWriteFactory2(IDWriteFactory2 *iface) { - return CONTAINING_RECORD(iface, struct dwritefactory, IDWriteFactory_iface); + return CONTAINING_RECORD(iface, struct dwritefactory, IDWriteFactory2_iface); } static void release_fontface_cache(struct list *fontfaces) @@ -510,11 +510,11 @@ heap_free(factory); } -static void release_shared_factory(IDWriteFactory *iface) +static void release_shared_factory(IDWriteFactory2 *iface) { struct dwritefactory *factory; if (!iface) return; - factory = impl_from_IDWriteFactory(iface); + factory = impl_from_IDWriteFactory2(iface); release_dwritefactory(factory); } @@ -546,17 +546,19 @@ return found; } -static HRESULT WINAPI dwritefactory_QueryInterface(IDWriteFactory *iface, REFIID riid, void **obj) +static HRESULT WINAPI dwritefactory_QueryInterface(IDWriteFactory2 *iface, REFIID riid, void **obj) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj); - if (IsEqualIID(riid, &IID_IUnknown) || - IsEqualIID(riid, &IID_IDWriteFactory)) - { + if (IsEqualIID(riid, &IID_IDWriteFactory2) || + IsEqualIID(riid, &IID_IDWriteFactory1) || + IsEqualIID(riid, &IID_IDWriteFactory) || + IsEqualIID(riid, &IID_IUnknown)) + { *obj = iface; - IDWriteFactory_AddRef(iface); + IDWriteFactory2_AddRef(iface); return S_OK; } @@ -565,17 +567,17 @@ return E_NOINTERFACE; } -static ULONG WINAPI dwritefactory_AddRef(IDWriteFactory *iface) +static ULONG WINAPI dwritefactory_AddRef(IDWriteFactory2 *iface) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); ULONG ref = InterlockedIncrement(&This->ref); TRACE("(%p)->(%d)\n", This, ref); return ref; } -static ULONG WINAPI dwritefactory_Release(IDWriteFactory *iface) +static ULONG WINAPI dwritefactory_Release(IDWriteFactory2 *iface) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p)->(%d)\n", This, ref); @@ -586,11 +588,11 @@ return ref; } -static HRESULT WINAPI dwritefactory_GetSystemFontCollection(IDWriteFactory *iface, +static HRESULT WINAPI dwritefactory_GetSystemFontCollection(IDWriteFactory2 *iface, IDWriteFontCollection **collection, BOOL check_for_updates) { HRESULT hr = S_OK; - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); TRACE("(%p)->(%p %d)\n", This, collection, check_for_updates); if (check_for_updates) @@ -607,10 +609,10 @@ return hr; } -static HRESULT WINAPI dwritefactory_CreateCustomFontCollection(IDWriteFactory *iface, +static HRESULT WINAPI dwritefactory_CreateCustomFontCollection(IDWriteFactory2 *iface, IDWriteFontCollectionLoader *loader, void const *key, UINT32 key_size, IDWriteFontCollection **collection) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); IDWriteFontFileEnumerator *enumerator; struct collectionloader *found; HRESULT hr; @@ -626,7 +628,7 @@ if (!found) return E_INVALIDARG; - hr = IDWriteFontCollectionLoader_CreateEnumeratorFromKey(found->loader, iface, key, key_size, &enumerator); + hr = IDWriteFontCollectionLoader_CreateEnumeratorFromKey(found->loader, (IDWriteFactory*)iface, key, key_size, &enumerator); if (FAILED(hr)) return hr; @@ -635,10 +637,10 @@ return hr; } -static HRESULT WINAPI dwritefactory_RegisterFontCollectionLoader(IDWriteFactory *iface, +static HRESULT WINAPI dwritefactory_RegisterFontCollectionLoader(IDWriteFactory2 *iface, IDWriteFontCollectionLoader *loader) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); struct collectionloader *entry; TRACE("(%p)->(%p)\n", This, loader); @@ -660,10 +662,10 @@ return S_OK; } -static HRESULT WINAPI dwritefactory_UnregisterFontCollectionLoader(IDWriteFactory *iface, +static HRESULT WINAPI dwritefactory_UnregisterFontCollectionLoader(IDWriteFactory2 *iface, IDWriteFontCollectionLoader *loader) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); struct collectionloader *found; TRACE("(%p)->(%p)\n", This, loader); @@ -682,10 +684,10 @@ return S_OK; } -static HRESULT WINAPI dwritefactory_CreateFontFileReference(IDWriteFactory *iface, +static HRESULT WINAPI dwritefactory_CreateFontFileReference(IDWriteFactory2 *iface, WCHAR const *path, FILETIME const *writetime, IDWriteFontFile **font_file) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); UINT32 key_size; HRESULT hr; void *key; @@ -710,10 +712,10 @@ return hr; } -static HRESULT WINAPI dwritefactory_CreateCustomFontFileReference(IDWriteFactory *iface, +static HRESULT WINAPI dwritefactory_CreateCustomFontFileReference(IDWriteFactory2 *iface, void const *reference_key, UINT32 key_size, IDWriteFontFileLoader *loader, IDWriteFontFile **font_file) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); TRACE("(%p)->(%p %u %p %p)\n", This, reference_key, key_size, loader, font_file); @@ -723,26 +725,42 @@ return create_font_file(loader, reference_key, key_size, font_file); } -static HRESULT WINAPI dwritefactory_CreateFontFace(IDWriteFactory *iface, - DWRITE_FONT_FACE_TYPE facetype, UINT32 files_number, IDWriteFontFile* const* font_files, +static HRESULT WINAPI dwritefactory_CreateFontFace(IDWriteFactory2 *iface, + DWRITE_FONT_FACE_TYPE req_facetype, UINT32 files_number, IDWriteFontFile* const* font_files, UINT32 index, DWRITE_FONT_SIMULATIONS simulations, IDWriteFontFace **font_face) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); + DWRITE_FONT_FILE_TYPE file_type; + DWRITE_FONT_FACE_TYPE face_type; IDWriteFontFileLoader *loader; struct fontfacecached *cached; struct list *fontfaces; IDWriteFontFace2 *face; + UINT32 key_size, count; + BOOL is_supported; const void *key; - UINT32 key_size; HRESULT hr; - TRACE("(%p)->(%d %u %p %u 0x%x %p)\n", This, facetype, files_number, font_files, index, simulations, font_face); + TRACE("(%p)->(%d %u %p %u 0x%x %p)\n", This, req_facetype, files_number, font_files, index, simulations, font_face); *font_face = NULL; - if (facetype != DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION && index) + if (!is_face_type_supported(req_facetype)) return E_INVALIDARG; + if (req_facetype != DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION && index) + return E_INVALIDARG; + + /* check actual file/face type */ + is_supported = FALSE; + face_type = DWRITE_FONT_FACE_TYPE_UNKNOWN; + hr = IDWriteFontFile_Analyze(*font_files, &is_supported, &file_type, &face_type, &count); + if (FAILED(hr)) + return hr; + + if (!is_supported || (face_type != req_facetype)) + return E_FAIL; + hr = IDWriteFontFile_GetReferenceKey(*font_files, &key, &key_size); if (FAILED(hr)) return hr; @@ -794,7 +812,7 @@ } } - hr = create_fontface(facetype, files_number, font_files, index, simulations, &face); + hr = create_fontface(req_facetype, files_number, font_files, index, simulations, &face); if (FAILED(hr)) return hr; @@ -814,9 +832,9 @@ return S_OK; } -static HRESULT WINAPI dwritefactory_CreateRenderingParams(IDWriteFactory *iface, IDWriteRenderingParams **params) +static HRESULT WINAPI dwritefactory_CreateRenderingParams(IDWriteFactory2 *iface, IDWriteRenderingParams **params) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); HMONITOR monitor; POINT pt; @@ -824,34 +842,34 @@ pt.x = pt.y = 0; monitor = MonitorFromPoint(pt, MONITOR_DEFAULTTOPRIMARY); - return IDWriteFactory_CreateMonitorRenderingParams(iface, monitor, params); + return IDWriteFactory2_CreateMonitorRenderingParams(iface, monitor, params); } -static HRESULT WINAPI dwritefactory_CreateMonitorRenderingParams(IDWriteFactory *iface, HMONITOR monitor, +static HRESULT WINAPI dwritefactory_CreateMonitorRenderingParams(IDWriteFactory2 *iface, HMONITOR monitor, IDWriteRenderingParams **params) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); static int fixme_once = 0; TRACE("(%p)->(%p %p)\n", This, monitor, params); if (!fixme_once++) FIXME("(%p): monitor setting ignored\n", monitor); - return IDWriteFactory_CreateCustomRenderingParams(iface, 0.0, 0.0, 0.0, DWRITE_PIXEL_GEOMETRY_FLAT, + return IDWriteFactory_CreateCustomRenderingParams((IDWriteFactory*)iface, 0.0, 0.0, 0.0, DWRITE_PIXEL_GEOMETRY_FLAT, DWRITE_RENDERING_MODE_DEFAULT, params); } -static HRESULT WINAPI dwritefactory_CreateCustomRenderingParams(IDWriteFactory *iface, FLOAT gamma, FLOAT enhancedContrast, +static HRESULT WINAPI dwritefactory_CreateCustomRenderingParams(IDWriteFactory2 *iface, FLOAT gamma, FLOAT enhancedContrast, FLOAT cleartype_level, DWRITE_PIXEL_GEOMETRY geometry, DWRITE_RENDERING_MODE mode, IDWriteRenderingParams **params) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); TRACE("(%p)->(%f %f %f %d %d %p)\n", This, gamma, enhancedContrast, cleartype_level, geometry, mode, params); return create_renderingparams(gamma, enhancedContrast, cleartype_level, geometry, mode, params); } -static HRESULT WINAPI dwritefactory_RegisterFontFileLoader(IDWriteFactory *iface, IDWriteFontFileLoader *loader) +static HRESULT WINAPI dwritefactory_RegisterFontFileLoader(IDWriteFactory2 *iface, IDWriteFontFileLoader *loader) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); struct fileloader *entry; TRACE("(%p)->(%p)\n", This, loader); @@ -877,9 +895,9 @@ return S_OK; } -static HRESULT WINAPI dwritefactory_UnregisterFontFileLoader(IDWriteFactory *iface, IDWriteFontFileLoader *loader) +static HRESULT WINAPI dwritefactory_UnregisterFontFileLoader(IDWriteFactory2 *iface, IDWriteFontFileLoader *loader) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); struct fileloader *found; TRACE("(%p)->(%p)\n", This, loader); @@ -898,17 +916,17 @@ return S_OK; } -static HRESULT WINAPI dwritefactory_CreateTextFormat(IDWriteFactory *iface, WCHAR const* family_name, +static HRESULT WINAPI dwritefactory_CreateTextFormat(IDWriteFactory2 *iface, WCHAR const* family_name, IDWriteFontCollection *collection, DWRITE_FONT_WEIGHT weight, DWRITE_FONT_STYLE style, DWRITE_FONT_STRETCH stretch, FLOAT size, WCHAR const *locale, IDWriteTextFormat **format) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); TRACE("(%p)->(%s %p %d %d %d %f %s %p)\n", This, debugstr_w(family_name), collection, weight, style, stretch, size, debugstr_w(locale), format); if (!collection) { - HRESULT hr = IDWriteFactory_GetSystemFontCollection(iface, &collection, FALSE); + HRESULT hr = IDWriteFactory2_GetSystemFontCollection(iface, &collection, FALSE); if (hr != S_OK) return hr; /* Our ref count is 1 too many, since we will add ref in create_textformat */ @@ -917,16 +935,16 @@ return create_textformat(family_name, collection, weight, style, stretch, size, locale, format); } -static HRESULT WINAPI dwritefactory_CreateTypography(IDWriteFactory *iface, IDWriteTypography **typography) +static HRESULT WINAPI dwritefactory_CreateTypography(IDWriteFactory2 *iface, IDWriteTypography **typography) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); TRACE("(%p)->(%p)\n", This, typography); return create_typography(typography); } -static HRESULT WINAPI dwritefactory_GetGdiInterop(IDWriteFactory *iface, IDWriteGdiInterop **gdi_interop) +static HRESULT WINAPI dwritefactory_GetGdiInterop(IDWriteFactory2 *iface, IDWriteGdiInterop **gdi_interop) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); TRACE("(%p)->(%p)\n", This, gdi_interop); @@ -944,21 +962,21 @@ return S_OK; } -static HRESULT WINAPI dwritefactory_CreateTextLayout(IDWriteFactory *iface, WCHAR const* string, +static HRESULT WINAPI dwritefactory_CreateTextLayout(IDWriteFactory2 *iface, WCHAR const* string, UINT32 len, IDWriteTextFormat *format, FLOAT max_width, FLOAT max_height, IDWriteTextLayout **layout) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); TRACE("(%p)->(%s %u %p %f %f %p)\n", This, debugstr_w(string), len, format, max_width, max_height, layout); if (!format) return E_INVALIDARG; return create_textlayout(string, len, format, max_width, max_height, layout); } -static HRESULT WINAPI dwritefactory_CreateGdiCompatibleTextLayout(IDWriteFactory *iface, WCHAR const* string, +static HRESULT WINAPI dwritefactory_CreateGdiCompatibleTextLayout(IDWriteFactory2 *iface, WCHAR const* string, UINT32 len, IDWriteTextFormat *format, FLOAT layout_width, FLOAT layout_height, FLOAT pixels_per_dip, DWRITE_MATRIX const* transform, BOOL use_gdi_natural, IDWriteTextLayout **layout) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); FIXME("(%p)->(%s:%u %p %f %f %f %p %d %p): semi-stub\n", This, debugstr_wn(string, len), len, format, layout_width, layout_height, pixels_per_dip, transform, use_gdi_natural, layout); @@ -966,40 +984,103 @@ return create_textlayout(string, len, format, layout_width, layout_height, layout); } -static HRESULT WINAPI dwritefactory_CreateEllipsisTrimmingSign(IDWriteFactory *iface, IDWriteTextFormat *format, +static HRESULT WINAPI dwritefactory_CreateEllipsisTrimmingSign(IDWriteFactory2 *iface, IDWriteTextFormat *format, IDWriteInlineObject **trimming_sign) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); FIXME("(%p)->(%p %p): semi-stub\n", This, format, trimming_sign); return create_trimmingsign(trimming_sign); } -static HRESULT WINAPI dwritefactory_CreateTextAnalyzer(IDWriteFactory *iface, IDWriteTextAnalyzer **analyzer) +static HRESULT WINAPI dwritefactory_CreateTextAnalyzer(IDWriteFactory2 *iface, IDWriteTextAnalyzer **analyzer) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); TRACE("(%p)->(%p)\n", This, analyzer); return get_textanalyzer(analyzer); } -static HRESULT WINAPI dwritefactory_CreateNumberSubstitution(IDWriteFactory *iface, DWRITE_NUMBER_SUBSTITUTION_METHOD method, +static HRESULT WINAPI dwritefactory_CreateNumberSubstitution(IDWriteFactory2 *iface, DWRITE_NUMBER_SUBSTITUTION_METHOD method, WCHAR const* locale, BOOL ignore_user_override, IDWriteNumberSubstitution **substitution) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); TRACE("(%p)->(%d %s %d %p)\n", This, method, debugstr_w(locale), ignore_user_override, substitution); return create_numbersubstitution(method, locale, ignore_user_override, substitution); } -static HRESULT WINAPI dwritefactory_CreateGlyphRunAnalysis(IDWriteFactory *iface, DWRITE_GLYPH_RUN const *glyph_run, +static HRESULT WINAPI dwritefactory_CreateGlyphRunAnalysis(IDWriteFactory2 *iface, DWRITE_GLYPH_RUN const *glyph_run, FLOAT pixels_per_dip, DWRITE_MATRIX const* transform, DWRITE_RENDERING_MODE rendering_mode, DWRITE_MEASURING_MODE measuring_mode, FLOAT baseline_x, FLOAT baseline_y, IDWriteGlyphRunAnalysis **analysis) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); FIXME("(%p)->(%p %f %p %d %d %f %f %p): stub\n", This, glyph_run, pixels_per_dip, transform, rendering_mode, measuring_mode, baseline_x, baseline_y, analysis); return E_NOTIMPL; } -static const struct IDWriteFactoryVtbl dwritefactoryvtbl = { +static HRESULT WINAPI dwritefactory1_GetEudcFontCollection(IDWriteFactory2 *iface, IDWriteFontCollection **collection, + BOOL check_for_updates) +{ + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); + FIXME("(%p)->(%p %d): stub\n", This, collection, check_for_updates); + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritefactory1_CreateCustomRenderingParams(IDWriteFactory2 *iface, FLOAT gamma, + FLOAT enhcontrast, FLOAT enhcontrast_grayscale, FLOAT cleartype_level, DWRITE_PIXEL_GEOMETRY geometry, + DWRITE_RENDERING_MODE mode, IDWriteRenderingParams1** params) +{ + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); + FIXME("(%p)->(%.2f %.2f %.2f %.2f %d %d %p): stub\n", This, gamma, enhcontrast, enhcontrast_grayscale, + cleartype_level, geometry, mode, params); + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritefactory2_GetSystemFontFallback(IDWriteFactory2 *iface, IDWriteFontFallback **fallback) +{ + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); + FIXME("(%p)->(%p): stub\n", This, fallback); + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritefactory2_CreateFontFallbackBuilder(IDWriteFactory2 *iface, IDWriteFontFallbackBuilder **fallbackbuilder) +{ + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); + FIXME("(%p)->(%p): stub\n", This, fallbackbuilder); + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritefactory2_TranslateColorGlyphRun(IDWriteFactory2 *iface, FLOAT originX, FLOAT originY, + const DWRITE_GLYPH_RUN *run, const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr, DWRITE_MEASURING_MODE mode, + const DWRITE_MATRIX *transform, UINT32 palette_index, IDWriteColorGlyphRunEnumerator **colorlayers) +{ + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); + FIXME("(%p)->(%.2f %.2f %p %p %d %p %u %p): stub\n", This, originX, originY, run, rundescr, mode, + transform, palette_index, colorlayers); + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritefactory2_CreateCustomRenderingParams(IDWriteFactory2 *iface, FLOAT gamma, FLOAT contrast, + FLOAT grayscalecontrast, FLOAT cleartypeLevel, DWRITE_PIXEL_GEOMETRY pixelGeometry, DWRITE_RENDERING_MODE renderingMode, + DWRITE_GRID_FIT_MODE gridFitMode, IDWriteRenderingParams2 **params) +{ + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); + FIXME("(%p)->(%.2f %.2f %.2f %.2f %d %d %d %p): stub\n", This, gamma, contrast, grayscalecontrast, cleartypeLevel, + pixelGeometry, renderingMode, gridFitMode, params); + return E_NOTIMPL; +} + +static HRESULT WINAPI dwritefactory2_CreateGlyphRunAnalysis(IDWriteFactory2 *iface, const DWRITE_GLYPH_RUN *run, + const DWRITE_MATRIX *transform, DWRITE_RENDERING_MODE renderingMode, DWRITE_MEASURING_MODE measuringMode, + DWRITE_GRID_FIT_MODE gridFitMode, DWRITE_TEXT_ANTIALIAS_MODE antialiasMode, FLOAT originX, FLOAT originY, + IDWriteGlyphRunAnalysis **analysis) +{ + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); + FIXME("(%p)->(%p %p %d %d %d %d %.2f %.2f %p): stub\n", This, run, transform, renderingMode, measuringMode, + gridFitMode, antialiasMode, originX, originY, analysis); + return E_NOTIMPL; +} + +static const struct IDWriteFactory2Vtbl dwritefactoryvtbl = { dwritefactory_QueryInterface, dwritefactory_AddRef, dwritefactory_Release, @@ -1023,24 +1104,31 @@ dwritefactory_CreateEllipsisTrimmingSign, dwritefactory_CreateTextAnalyzer, dwritefactory_CreateNumberSubstitution, - dwritefactory_CreateGlyphRunAnalysis + dwritefactory_CreateGlyphRunAnalysis, + dwritefactory1_GetEudcFontCollection, + dwritefactory1_CreateCustomRenderingParams, + dwritefactory2_GetSystemFontFallback, + dwritefactory2_CreateFontFallbackBuilder, + dwritefactory2_TranslateColorGlyphRun, + dwritefactory2_CreateCustomRenderingParams, + dwritefactory2_CreateGlyphRunAnalysis }; -static ULONG WINAPI shareddwritefactory_AddRef(IDWriteFactory *iface) +static ULONG WINAPI shareddwritefactory_AddRef(IDWriteFactory2 *iface) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); TRACE("(%p)\n", This); return 2; } -static ULONG WINAPI shareddwritefactory_Release(IDWriteFactory *iface) +static ULONG WINAPI shareddwritefactory_Release(IDWriteFactory2 *iface) { - struct dwritefactory *This = impl_from_IDWriteFactory(iface); + struct dwritefactory *This = impl_from_IDWriteFactory2(iface); TRACE("(%p)\n", This); return 1; } -static const struct IDWriteFactoryVtbl shareddwritefactoryvtbl = { +static const struct IDWriteFactory2Vtbl shareddwritefactoryvtbl = { dwritefactory_QueryInterface, shareddwritefactory_AddRef, shareddwritefactory_Release, @@ -1064,12 +1152,19 @@ dwritefactory_CreateEllipsisTrimmingSign, dwritefactory_CreateTextAnalyzer, dwritefactory_CreateNumberSubstitution, - dwritefactory_CreateGlyphRunAnalysis + dwritefactory_CreateGlyphRunAnalysis, + dwritefactory1_GetEudcFontCollection, + dwritefactory1_CreateCustomRenderingParams, + dwritefactory2_GetSystemFontFallback, + dwritefactory2_CreateFontFallbackBuilder, + dwritefactory2_TranslateColorGlyphRun, + dwritefactory2_CreateCustomRenderingParams, + dwritefactory2_CreateGlyphRunAnalysis }; static void init_dwritefactory(struct dwritefactory *factory, DWRITE_FACTORY_TYPE type) { - factory->IDWriteFactory_iface.lpVtbl = type == DWRITE_FACTORY_TYPE_SHARED ? &shareddwritefactoryvtbl : &dwritefactoryvtbl; + factory->IDWriteFactory2_iface.lpVtbl = type == DWRITE_FACTORY_TYPE_SHARED ? &shareddwritefactoryvtbl : &dwritefactoryvtbl; factory->ref = 1; factory->localfontfileloader = NULL; factory->system_collection = NULL; @@ -1088,11 +1183,14 @@ *ret = NULL; - if (!IsEqualIID(riid, &IID_IDWriteFactory)) return E_FAIL; + if (!IsEqualIID(riid, &IID_IDWriteFactory) && + !IsEqualIID(riid, &IID_IDWriteFactory1) && + !IsEqualIID(riid, &IID_IDWriteFactory2)) + return E_FAIL; if (type == DWRITE_FACTORY_TYPE_SHARED && shared_factory) { *ret = (IUnknown*)shared_factory; - IDWriteFactory_AddRef(shared_factory); + IDWriteFactory2_AddRef(shared_factory); return S_OK; } @@ -1102,13 +1200,13 @@ init_dwritefactory(factory, type); if (type == DWRITE_FACTORY_TYPE_SHARED) - if (InterlockedCompareExchangePointer((void**)&shared_factory, factory, NULL)) { - release_shared_factory(&factory->IDWriteFactory_iface); + if (InterlockedCompareExchangePointer((void**)&shared_factory, &factory->IDWriteFactory2_iface, NULL)) { + release_shared_factory(&factory->IDWriteFactory2_iface); *ret = (IUnknown*)shared_factory; - IDWriteFactory_AddRef(shared_factory); + IDWriteFactory2_AddRef(shared_factory); return S_OK; } - *ret = (IUnknown*)&factory->IDWriteFactory_iface; + *ret = (IUnknown*)&factory->IDWriteFactory2_iface; return S_OK; } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/opentype.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/opentype.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/opentype.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/opentype.c 2014-12-15 00:45:34.000000000 +0000 @@ -591,9 +591,18 @@ OPENTYPE_STRING_POSTSCRIPT_CID_NAME }; +BOOL is_face_type_supported(DWRITE_FONT_FACE_TYPE type) +{ + return (type == DWRITE_FONT_FACE_TYPE_CFF) || + (type == DWRITE_FONT_FACE_TYPE_TRUETYPE) || + (type == DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION) || + (type == DWRITE_FONT_FACE_TYPE_RAW_CFF); +} + HRESULT opentype_analyze_font(IDWriteFontFileStream *stream, UINT32* font_count, DWRITE_FONT_FILE_TYPE *file_type, DWRITE_FONT_FACE_TYPE *face_type, BOOL *supported) { /* TODO: Do font validation */ + DWRITE_FONT_FACE_TYPE face; const void *font_data; const char* tag; void *context; @@ -604,10 +613,8 @@ return hr; tag = font_data; - *supported = FALSE; *file_type = DWRITE_FONT_FILE_TYPE_UNKNOWN; - if (face_type) - *face_type = DWRITE_FONT_FACE_TYPE_UNKNOWN; + face = DWRITE_FONT_FACE_TYPE_UNKNOWN; *font_count = 0; if (DWRITE_MAKE_OPENTYPE_TAG(tag[0], tag[1], tag[2], tag[3]) == MS_TTCF_TAG) @@ -615,23 +622,25 @@ const TTC_Header_V1 *header = font_data; *font_count = GET_BE_DWORD(header->numFonts); *file_type = DWRITE_FONT_FILE_TYPE_TRUETYPE_COLLECTION; - if (face_type) - *face_type = DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION; - *supported = TRUE; + face = DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION; } else if (GET_BE_DWORD(*(DWORD*)font_data) == 0x10000) { *font_count = 1; *file_type = DWRITE_FONT_FILE_TYPE_TRUETYPE; - if (face_type) - *face_type = DWRITE_FONT_FACE_TYPE_TRUETYPE; - *supported = TRUE; + face = DWRITE_FONT_FACE_TYPE_TRUETYPE; } else if (DWRITE_MAKE_OPENTYPE_TAG(tag[0], tag[1], tag[2], tag[3]) == MS_OTTO_TAG) { *file_type = DWRITE_FONT_FILE_TYPE_CFF; + face = DWRITE_FONT_FACE_TYPE_CFF; } + if (face_type) + *face_type = face; + + *supported = is_face_type_supported(face); + IDWriteFontFileStream_ReleaseFileFragment(stream, context); return S_OK; } @@ -1196,7 +1205,7 @@ heap_free(name_string); } else { - FIXME("handle NAME format 1"); + FIXME("handle NAME format 1\n"); continue; } } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/tests/font.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/tests/font.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/dwrite/tests/font.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/dwrite/tests/font.c 2014-12-15 00:45:34.000000000 +0000 @@ -66,6 +66,23 @@ return factory; } +static void create_testfontfile(const WCHAR *filename) +{ + DWORD written; + HANDLE file; + HRSRC res; + void *ptr; + file = CreateFileW(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( file != INVALID_HANDLE_VALUE, "file creation failed\n" ); + + res = FindResourceA(GetModuleHandleA(NULL), (LPCSTR)MAKEINTRESOURCE(1), (LPCSTR)RT_RCDATA); + ok( res != 0, "couldn't find resource\n" ); + ptr = LockResource( LoadResource( GetModuleHandleA(NULL), res )); + WriteFile( file, ptr, SizeofResource( GetModuleHandleA(NULL), res ), &written, NULL ); + ok( written == SizeofResource( GetModuleHandleA(NULL), res ), "couldn't write resource\n" ); + CloseHandle( file ); +} + struct test_fontenumerator { IDWriteFontFileEnumerator IDWriteFontFileEnumerator_iface; @@ -441,10 +458,10 @@ ok(weight == DWRITE_FONT_WEIGHT_NORMAL, "got %d\n", weight); style = IDWriteFont_GetStyle(font); -todo_wine { ok(style == DWRITE_FONT_STYLE_OBLIQUE, "got %d\n", style); +todo_wine ok(otm.otmfsSelection == 1, "got 0x%08x\n", otm.otmfsSelection); -} + ret = IDWriteFont_IsSymbolFont(font); ok(!ret, "got %d\n", ret); @@ -909,11 +926,16 @@ { IDWriteFontFace *fontface, *fontface2; IDWriteFontCollection *collection; + DWRITE_FONT_FILE_TYPE file_type; + DWRITE_FONT_FACE_TYPE face_type; IDWriteGdiInterop *interop; IDWriteFont *font, *font2; IDWriteFontFamily *family; IDWriteFactory *factory; + IDWriteFontFile *file; LOGFONTW logfont; + BOOL supported; + UINT32 count; HRESULT hr; factory = create_factory(); @@ -1001,7 +1023,53 @@ IDWriteFont_Release(font); IDWriteFontFamily_Release(family); IDWriteFontCollection_Release(collection); + + /* IDWriteFactory::CreateFontFace() */ + create_testfontfile(test_fontfile); + factory = create_factory(); + + hr = IDWriteFactory_CreateFontFileReference(factory, test_fontfile, NULL, &file); + ok(hr == S_OK, "got 0x%08x\n",hr); + + supported = FALSE; + file_type = DWRITE_FONT_FILE_TYPE_UNKNOWN; + face_type = DWRITE_FONT_FACE_TYPE_CFF; + count = 0; + hr = IDWriteFontFile_Analyze(file, &supported, &file_type, &face_type, &count); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(supported == TRUE, "got %i\n", supported); + ok(file_type == DWRITE_FONT_FILE_TYPE_TRUETYPE, "got %i\n", file_type); + ok(face_type == DWRITE_FONT_FACE_TYPE_TRUETYPE, "got %i\n", face_type); + ok(count == 1, "got %i\n", count); + + /* try mismatching face type, the one that's not supported */ + hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_CFF, 1, &file, 0, DWRITE_FONT_SIMULATIONS_NONE, &fontface); +todo_wine + ok(hr == DWRITE_E_FILEFORMAT, "got 0x%08x\n", hr); + + hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION, 1, &file, 0, + DWRITE_FONT_SIMULATIONS_NONE, &fontface); + ok(hr == E_FAIL, "got 0x%08x\n", hr); + + hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_RAW_CFF, 1, &file, 0, DWRITE_FONT_SIMULATIONS_NONE, &fontface); +todo_wine + ok(hr == DWRITE_E_UNSUPPORTEDOPERATION || broken(hr == E_INVALIDARG) /* older versions */, "got 0x%08x\n", hr); + + hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_TYPE1, 1, &file, 0, DWRITE_FONT_SIMULATIONS_NONE, &fontface); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_VECTOR, 1, &file, 0, DWRITE_FONT_SIMULATIONS_NONE, &fontface); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_BITMAP, 1, &file, 0, DWRITE_FONT_SIMULATIONS_NONE, &fontface); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_UNKNOWN, 1, &file, 0, DWRITE_FONT_SIMULATIONS_NONE, &fontface); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + IDWriteFontFile_Release(file); IDWriteFactory_Release(factory); + DeleteFileW(test_fontfile); } static void test_GetMetrics(void) @@ -1513,7 +1581,7 @@ ok(hr == S_OK, "got 0x%08x\n", hr); EXPECT_REF(idfont2, 1); EXPECT_REF(idfont, 1); - ok(idfont2 != idfont, "Font instances shoudl not match\n"); + ok(idfont2 != idfont, "Font instances should not match\n"); idfontface2 = NULL; hr = IDWriteFont_CreateFontFace(idfont2, &idfontface2); @@ -1648,6 +1716,7 @@ ok(count == 0, "got %i\n", count); hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_CFF, 1, &file, 0, 0, &face); +todo_wine ok(hr == 0x8faecafe, "got 0x%08x\n", hr); IDWriteFontFile_Release(file); @@ -1720,23 +1789,6 @@ IDWriteFactory_Release(factory); } -static void create_testfontfile(const WCHAR *filename) -{ - DWORD written; - HANDLE file; - HRSRC res; - void *ptr; - file = CreateFileW(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 ); - ok( file != INVALID_HANDLE_VALUE, "file creation failed\n" ); - - res = FindResourceA(GetModuleHandleA(NULL), (LPCSTR)MAKEINTRESOURCE(1), (LPCSTR)RT_RCDATA); - ok( res != 0, "couldn't find resource\n" ); - ptr = LockResource( LoadResource( GetModuleHandleA(NULL), res )); - WriteFile( file, ptr, SizeofResource( GetModuleHandleA(NULL), res ), &written, NULL ); - ok( written == SizeofResource( GetModuleHandleA(NULL), res ), "couldn't write resource\n" ); - CloseHandle( file ); -} - static void test_CreateFontFileReference(void) { HRESULT hr; @@ -2528,6 +2580,166 @@ DeleteFileW(test_fontfile); } +static void test_GetDesignGlyphMetrics(void) +{ + DWRITE_GLYPH_METRICS metrics[2]; + IDWriteFontFace *fontface; + IDWriteFactory *factory; + IDWriteFontFile *file; + UINT16 indices[2]; + UINT32 codepoint; + HRESULT hr; + + factory = create_factory(); + + create_testfontfile(test_fontfile); + + hr = IDWriteFactory_CreateFontFileReference(factory, test_fontfile, NULL, &file); + ok(hr == S_OK, "got 0x%08x\n",hr); + + hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_TRUETYPE, 1, &file, + 0, DWRITE_FONT_SIMULATIONS_NONE, &fontface); + ok(hr == S_OK, "got 0x%08x\n",hr); + IDWriteFontFile_Release(file); + + codepoint = 'A'; + indices[0] = 0; + hr = IDWriteFontFace_GetGlyphIndices(fontface, &codepoint, 1, &indices[0]); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(indices[0] > 0, "got %u\n", indices[0]); + + hr = IDWriteFontFace_GetDesignGlyphMetrics(fontface, NULL, 0, metrics, FALSE); + ok(hr == E_INVALIDARG, "got 0x%08x\n",hr); + + hr = IDWriteFontFace_GetDesignGlyphMetrics(fontface, NULL, 1, metrics, FALSE); + ok(hr == E_INVALIDARG, "got 0x%08x\n",hr); + + hr = IDWriteFontFace_GetDesignGlyphMetrics(fontface, indices, 0, metrics, FALSE); + ok(hr == S_OK, "got 0x%08x\n",hr); + + /* missing glyphs are ignored */ + indices[1] = 1; + memset(metrics, 0xcc, sizeof(metrics)); + hr = IDWriteFontFace_GetDesignGlyphMetrics(fontface, indices, 2, metrics, FALSE); + ok(hr == S_OK, "got 0x%08x\n",hr); + ok(metrics[0].advanceWidth == 1000, "got %d\n", metrics[0].advanceWidth); + ok(metrics[1].advanceWidth == 0, "got %d\n", metrics[1].advanceWidth); + + IDWriteFontFace_Release(fontface); + IDWriteFactory_Release(factory); + DeleteFileW(test_fontfile); +} + +static void test_IsMonospacedFont(void) +{ + static const WCHAR courierW[] = {'C','o','u','r','i','e','r',' ','N','e','w',0}; + IDWriteFontCollection *collection; + IDWriteFactory *factory; + UINT32 index; + BOOL exists; + HRESULT hr; + + factory = create_factory(); + hr = IDWriteFactory_GetSystemFontCollection(factory, &collection, FALSE); + ok(hr == S_OK, "got 0x%08x\n", hr); + + exists = FALSE; + hr = IDWriteFontCollection_FindFamilyName(collection, courierW, &index, &exists); + ok(hr == S_OK, "got 0x%08x\n", hr); + if (exists) { + IDWriteFontFamily *family; + IDWriteFont1 *font1; + IDWriteFont *font; + + hr = IDWriteFontCollection_GetFontFamily(collection, index, &family); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IDWriteFontFamily_GetFirstMatchingFont(family, DWRITE_FONT_WEIGHT_NORMAL, + DWRITE_FONT_STRETCH_NORMAL, DWRITE_FONT_STYLE_NORMAL, &font); + ok(hr == S_OK, "got 0x%08x\n", hr); + IDWriteFontFamily_Release(family); + + hr = IDWriteFont_QueryInterface(font, &IID_IDWriteFont1, (void**)&font1); + if (hr == S_OK) { + IDWriteFontFace1 *fontface1; + IDWriteFontFace *fontface; + BOOL is_monospaced; + + is_monospaced = IDWriteFont1_IsMonospacedFont(font1); + ok(is_monospaced, "got %d\n", is_monospaced); + + hr = IDWriteFont1_CreateFontFace(font1, &fontface); + ok(hr == S_OK, "got 0x%08x\n", hr); + hr = IDWriteFontFace_QueryInterface(fontface, &IID_IDWriteFontFace1, (void**)&fontface1); + ok(hr == S_OK, "got 0x%08x\n", hr); + is_monospaced = IDWriteFontFace1_IsMonospacedFont(fontface1); + ok(is_monospaced, "got %d\n", is_monospaced); + IDWriteFontFace1_Release(fontface1); + + IDWriteFontFace_Release(fontface); + IDWriteFont1_Release(font1); + } + else + win_skip("IsMonospacedFont() is not supported.\n"); + } + else + skip("Courier New font not found.\n"); + + IDWriteFontCollection_Release(collection); +} + +static void test_GetDesignGlyphAdvances(void) +{ + IDWriteFontFace1 *fontface1; + IDWriteFontFace *fontface; + IDWriteFactory *factory; + IDWriteFontFile *file; + HRESULT hr; + + factory = create_factory(); + + create_testfontfile(test_fontfile); + + hr = IDWriteFactory_CreateFontFileReference(factory, test_fontfile, NULL, &file); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IDWriteFactory_CreateFontFace(factory, DWRITE_FONT_FACE_TYPE_TRUETYPE, 1, &file, + 0, DWRITE_FONT_SIMULATIONS_NONE, &fontface); + ok(hr == S_OK, "got 0x%08x\n", hr); + IDWriteFontFile_Release(file); + + hr = IDWriteFontFace_QueryInterface(fontface, &IID_IDWriteFontFace1, (void**)&fontface1); + if (hr == S_OK) { + UINT32 codepoint; + UINT16 index; + INT32 advance; + + codepoint = 'A'; + index = 0; + hr = IDWriteFontFace1_GetGlyphIndices(fontface1, &codepoint, 1, &index); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(index > 0, "got %u\n", index); + + advance = 0; + hr = IDWriteFontFace1_GetDesignGlyphAdvances(fontface1, 1, &index, &advance, FALSE); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(advance == 1000, "got %i\n", advance); + + advance = 0; + hr = IDWriteFontFace1_GetDesignGlyphAdvances(fontface1, 1, &index, &advance, TRUE); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(advance == 2048, "got %i\n", advance); + + IDWriteFontFace1_Release(fontface1); + } + else + win_skip("GetDesignGlyphAdvances() is not supported.\n"); + + IDWriteFontFace_Release(fontface); + IDWriteFactory_Release(factory); + DeleteFileW(test_fontfile); +} + START_TEST(font) { IDWriteFactory *factory; @@ -2561,6 +2773,9 @@ test_ConvertFontToLOGFONT(); test_CreateStreamFromKey(); test_ReadFileFragment(); + test_GetDesignGlyphMetrics(); + test_GetDesignGlyphAdvances(); + test_IsMonospacedFont(); IDWriteFactory_Release(factory); } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/fusion/asmcache.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/fusion/asmcache.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/fusion/asmcache.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/fusion/asmcache.c 2014-12-15 00:45:34.000000000 +0000 @@ -41,6 +41,19 @@ WINE_DEFAULT_DEBUG_CHANNEL(fusion); +typedef struct { + IAssemblyCache IAssemblyCache_iface; + + LONG ref; + HANDLE lock; +} IAssemblyCacheImpl; + +typedef struct { + IAssemblyCacheItem IAssemblyCacheItem_iface; + + LONG ref; +} IAssemblyCacheItemImpl; + static const WCHAR cache_mutex_nameW[] = {'_','_','W','I','N','E','_','F','U','S','I','O','N','_','C','A','C','H','E','_','M','U','T','E','X','_','_',0}; @@ -141,13 +154,6 @@ /* IAssemblyCache */ -typedef struct { - IAssemblyCache IAssemblyCache_iface; - - LONG ref; - HANDLE lock; -} IAssemblyCacheImpl; - static inline IAssemblyCacheImpl *impl_from_IAssemblyCache(IAssemblyCache *iface) { return CONTAINING_RECORD(iface, IAssemblyCacheImpl, IAssemblyCache_iface); @@ -351,16 +357,33 @@ return hr; } +static const IAssemblyCacheItemVtbl AssemblyCacheItemVtbl; + static HRESULT WINAPI IAssemblyCacheImpl_CreateAssemblyCacheItem(IAssemblyCache *iface, DWORD dwFlags, PVOID pvReserved, IAssemblyCacheItem **ppAsmItem, LPCWSTR pszAssemblyName) { - FIXME("(%p, %d, %p, %p, %s) stub!\n", iface, dwFlags, pvReserved, + IAssemblyCacheItemImpl *item; + + FIXME("(%p, %d, %p, %p, %s) semi-stub!\n", iface, dwFlags, pvReserved, ppAsmItem, debugstr_w(pszAssemblyName)); - return E_NOTIMPL; + if (!ppAsmItem) + return E_INVALIDARG; + + *ppAsmItem = NULL; + + item = HeapAlloc(GetProcessHeap(), 0, sizeof(IAssemblyCacheItemImpl)); + if (!item) + return E_OUTOFMEMORY; + + item->IAssemblyCacheItem_iface.lpVtbl = &AssemblyCacheItemVtbl; + item->ref = 1; + + *ppAsmItem = &item->IAssemblyCacheItem_iface; + return S_OK; } static HRESULT WINAPI IAssemblyCacheImpl_CreateAssemblyScavenger(IAssemblyCache *iface, @@ -560,12 +583,6 @@ /* IAssemblyCacheItem */ -typedef struct { - IAssemblyCacheItem IAssemblyCacheItem_iface; - - LONG ref; -} IAssemblyCacheItemImpl; - static inline IAssemblyCacheItemImpl *impl_from_IAssemblyCacheItem(IAssemblyCacheItem *iface) { return CONTAINING_RECORD(iface, IAssemblyCacheItemImpl, IAssemblyCacheItem_iface); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/fusion/tests/asmcache.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/fusion/tests/asmcache.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/fusion/tests/asmcache.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/fusion/tests/asmcache.c 2014-12-15 00:45:34.000000000 +0000 @@ -881,6 +881,43 @@ IAssemblyCache_Release(cache); } +static void test_CreateAssemblyCacheItem(void) +{ + IAssemblyCache *cache; + IAssemblyCacheItem *item; + HRESULT hr; + + static const WCHAR wine[] = {'w','i','n','e',0}; + + hr = pCreateAssemblyCache(&cache, 0); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 0, NULL, NULL, NULL); + ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr); + + hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 0, NULL, &item, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + IAssemblyCacheItem_Release(item); + + hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 0, NULL, &item, wine); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + IAssemblyCacheItem_Release(item); + + hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 1, (void *)0xdeadbeef, &item, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + IAssemblyCacheItem_Release(item); + + hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 1, NULL, &item, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + IAssemblyCacheItem_Release(item); + + hr = IAssemblyCache_CreateAssemblyCacheItem(cache, 0, (void *)0xdeadbeef, &item, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + IAssemblyCacheItem_Release(item); + + IAssemblyCache_Release(cache); +} + static void test_InstallAssembly(void) { IAssemblyCache *cache; @@ -1550,6 +1587,7 @@ return; test_CreateAssemblyCache(); + test_CreateAssemblyCacheItem(); test_InstallAssembly(); test_QueryAssemblyInfo(); } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/gdiplus/image.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/gdiplus/image.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/gdiplus/image.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/gdiplus/image.c 2014-12-15 00:45:34.000000000 +0000 @@ -3876,11 +3876,6 @@ * Encoding functions - * These functions encode an image in different image file formats. */ -#define BITMAP_FORMAT_BMP 0x4d42 /* "BM" */ -#define BITMAP_FORMAT_JPEG 0xd8ff -#define BITMAP_FORMAT_GIF 0x4947 -#define BITMAP_FORMAT_PNG 0x5089 -#define BITMAP_FORMAT_APM 0xcdd7 static GpStatus encode_image_WIC(GpImage *image, IStream* stream, GDIPCONST CLSID* clsid, GDIPCONST EncoderParameters* params) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/gdiplus/tests/graphics.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/gdiplus/tests/graphics.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/gdiplus/tests/graphics.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/gdiplus/tests/graphics.c 2014-12-15 00:45:34.000000000 +0000 @@ -28,7 +28,6 @@ #define expect(expected, got) ok((got) == (expected), "Expected %d, got %d\n", (INT)(expected), (INT)(got)) #define expectf_(expected, got, precision) ok(fabs((expected) - (got)) <= (precision), "Expected %f, got %f\n", (expected), (got)) #define expectf(expected, got) expectf_((expected), (got), 0.001) -#define TABLE_LEN (23) static const REAL mm_per_inch = 25.4; static const REAL point_per_inch = 72.0; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/iccvid/iccvid.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/iccvid/iccvid.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/iccvid/iccvid.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/iccvid/iccvid.c 2014-12-15 00:45:34.000000000 +0000 @@ -58,8 +58,6 @@ #define ICCVID_MAGIC mmioFOURCC('c', 'v', 'i', 'd') #define compare_fourcc(fcc1, fcc2) (((fcc1)^(fcc2))&~0x20202020) - -#define DBUG 0 #define MAX_STRIPS 32 /* ------------------------------------------------------------------------ */ diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/itss/tests/protocol.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/itss/tests/protocol.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/itss/tests/protocol.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/itss/tests/protocol.c 2014-12-15 00:45:34.000000000 +0000 @@ -41,12 +41,6 @@ called_ ## func = TRUE; \ }while(0) -#define CHECK_EXPECT2(func) \ - do { \ - ok(expect_ ##func, "unexpected call " #func "\n"); \ - called_ ## func = TRUE; \ - }while(0) - #define SET_CALLED(func) \ expect_ ## func = called_ ## func = FALSE diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/joy.cpl/main.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/joy.cpl/main.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/joy.cpl/main.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/joy.cpl/main.c 2014-12-15 00:45:34.000000000 +0000 @@ -721,6 +721,9 @@ DWORD axes[2] = {DIJOFS_X, DIJOFS_Y}; int direction[2] = {0, 0}; struct Joystick *joystick = pvRef; + DIRAMPFORCE rforce; + DICONSTANTFORCE cforce; + DIPERIODIC pforce; if (joystick->effects == NULL) { @@ -744,8 +747,6 @@ if (IsEqualGUID(&pdei->guid, &GUID_RampForce)) { - DIRAMPFORCE rforce; - rforce.lStart = 0; rforce.lEnd = DI_FFNOMINALMAX; @@ -755,8 +756,6 @@ } else if (IsEqualGUID(&pdei->guid, &GUID_ConstantForce)) { - DICONSTANTFORCE cforce; - cforce.lMagnitude = DI_FFNOMINALMAX; dieffect.cbTypeSpecificParams = sizeof(cforce); @@ -769,8 +768,6 @@ IsEqualGUID(&pdei->guid, &GUID_SawtoothUp) || IsEqualGUID(&pdei->guid, &GUID_SawtoothDown)) { - DIPERIODIC pforce; - pforce.dwMagnitude = DI_FFNOMINALMAX; pforce.lOffset = 0; pforce.dwPhase = 0; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/jscript/array.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/jscript/array.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/jscript/array.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/jscript/array.c 2014-12-15 00:45:34.000000000 +0000 @@ -505,9 +505,7 @@ hres = set_length(jsthis, 0); if(FAILED(hres)) return hres; - } - if(!length) { if(r) *r = jsval_undefined(); return S_OK; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/kernel32.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/kernel32.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/kernel32.spec 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/kernel32.spec 2014-12-15 00:45:34.000000000 +0000 @@ -264,6 +264,8 @@ @ stdcall CreateSemaphoreExW(ptr long long wstr long long) @ stdcall CreateSemaphoreW(ptr long long wstr) @ stdcall CreateSocketHandle() +@ stdcall CreateSymbolicLinkA(str str long) +@ stdcall CreateSymbolicLinkW(wstr wstr long) @ stdcall CreateTapePartition(long long long long) @ stdcall CreateThread(ptr long ptr long long ptr) @ stdcall CreateTimerQueue () @@ -593,6 +595,7 @@ @ stdcall GetNumberOfConsoleMouseButtons(ptr) @ stdcall GetOEMCP() @ stdcall GetOverlappedResult(long ptr ptr long) +@ stdcall GetUserPreferredUILanguages(long ptr ptr ptr) @ stdcall GetPriorityClass(long) @ stdcall GetPrivateProfileIntA(str str long str) @ stdcall GetPrivateProfileIntW(wstr wstr long wstr) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/kernel_main.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/kernel_main.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/kernel_main.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/kernel_main.c 2014-12-15 00:45:34.000000000 +0000 @@ -179,7 +179,7 @@ /****************************************************************************** * GetTickCount64 (KERNEL32.@) */ -ULONGLONG WINAPI GetTickCount64(void) +ULONGLONG WINAPI DECLSPEC_HOTPATCH GetTickCount64(void) { LARGE_INTEGER counter, frequency; @@ -202,7 +202,7 @@ * NOTES * The value returned will wrap around every 2^32 milliseconds. */ -DWORD WINAPI GetTickCount(void) +DWORD WINAPI DECLSPEC_HOTPATCH GetTickCount(void) { return GetTickCount64(); } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/locale.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/locale.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/locale.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/locale.c 2014-12-15 00:45:34.000000000 +0000 @@ -5035,3 +5035,13 @@ return out; } + + +/****************************************************************************** + * GetUserPreferredUILanguages (KERNEL32.@) + */ +BOOL WINAPI GetUserPreferredUILanguages(DWORD flags, PULONG numlangs, PZZWSTR langbuffer, PULONG bufferlen) +{ + FIXME( "stub: %u %p %p %p\n", flags, numlangs, langbuffer, bufferlen ); + return FALSE; +} diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/path.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/path.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/path.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/path.c 2014-12-15 00:45:34.000000000 +0000 @@ -1954,3 +1954,21 @@ nt_name.Buffer[1] = '\\'; return nt_name.Buffer; } + +/************************************************************************* + * CreateSymbolicLinkW (KERNEL32.@) + */ +BOOL WINAPI CreateSymbolicLinkW(LPCWSTR link, LPCWSTR target, DWORD flags) +{ + FIXME("(%s %s %d): stub\n", debugstr_w(link), debugstr_w(target), flags); + return TRUE; +} + +/************************************************************************* + * CreateSymbolicLinkA (KERNEL32.@) + */ +BOOL WINAPI CreateSymbolicLinkA(LPCSTR link, LPCSTR target, DWORD flags) +{ + FIXME("(%s %s %d): stub\n", debugstr_a(link), debugstr_a(target), flags); + return TRUE; +} diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/tests/actctx.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/tests/actctx.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/tests/actctx.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/tests/actctx.c 2014-12-15 00:45:34.000000000 +0000 @@ -304,8 +304,6 @@ {'w','n','d','C','l','a','s','s','2',0}; static const WCHAR wndClass3W[] = {'w','n','d','C','l','a','s','s','3',0}; -static const WCHAR acr_manifest[] = - {'a','c','r','.','m','a','n','i','f','e','s','t',0}; static WCHAR app_dir[MAX_PATH], exe_path[MAX_PATH], work_dir[MAX_PATH], work_dir_subdir[MAX_PATH]; static WCHAR app_manifest_path[MAX_PATH], manifest_path[MAX_PATH], depmanifest_path[MAX_PATH]; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/tests/change.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/tests/change.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/tests/change.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/tests/change.c 2014-12-15 00:45:34.000000000 +0000 @@ -554,9 +554,18 @@ ok( r == WAIT_OBJECT_0, "should be ready\n" ); ok( (NTSTATUS)ov.Internal == STATUS_SUCCESS, "ov.Internal wrong\n"); - ok( ov.InternalHigh == 0x18, "ov.InternalHigh wrong\n"); + ok( ov.InternalHigh == 0x18 || ov.InternalHigh == 0x12 + 0x18, + "ov.InternalHigh wrong %lx\n", ov.InternalHigh); pfni = (PFILE_NOTIFY_INFORMATION) buffer; + if (pfni->NextEntryOffset) /* we may get a modified event on the parent dir */ + { + ok( pfni->NextEntryOffset == 0x12, "offset wrong %x\n", pfni->NextEntryOffset ); + ok( pfni->Action == FILE_ACTION_MODIFIED, "action wrong %d\n", pfni->Action ); + ok( pfni->FileNameLength == 3*sizeof(WCHAR), "len wrong\n" ); + ok( !memcmp(pfni->FileName,&szGa[1],3*sizeof(WCHAR)), "name wrong\n"); + pfni = (PFILE_NOTIFY_INFORMATION)((char *)pfni + pfni->NextEntryOffset); + } ok( pfni->NextEntryOffset == 0, "offset wrong\n" ); ok( pfni->Action == FILE_ACTION_ADDED, "action wrong\n" ); ok( pfni->FileNameLength == 6*sizeof(WCHAR), "len wrong\n" ); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/tests/file.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/tests/file.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/tests/file.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/tests/file.c 2014-12-15 00:45:34.000000000 +0000 @@ -47,9 +47,7 @@ static HRESULT (WINAPI *pCopyFile2)(PCWSTR,PCWSTR,COPYFILE2_EXTENDED_PARAMETERS*); static HANDLE (WINAPI *pCreateFile2)(LPCWSTR, DWORD, DWORD, DWORD, CREATEFILE2_EXTENDED_PARAMETERS*); -/* keep filename and filenameW the same */ static const char filename[] = "testfile.xxx"; -static const WCHAR filenameW[] = { 't','e','s','t','f','i','l','e','.','x','x','x',0 }; static const char sillytext[] = "en larvig liten text dx \033 gx hej 84 hej 4484 ! \001\033 bla bl\na.. bla bla." "1234 43 4kljf lf &%%%&&&&&& 34 4 34 3############# 33 3 3 3 # 3## 3" diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/tests/resource.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/tests/resource.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/tests/resource.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/tests/resource.c 2014-12-15 00:45:34.000000000 +0000 @@ -39,15 +39,8 @@ IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ }; -/* rodata @ [0x1000-0x4000) */ -static const IMAGE_SECTION_HEADER sh_rodata_2 = -{ - ".rodata", {3*page_size}, page_size, 3*page_size, page_size, 0, 0, 0, 0, - IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ -}; - /* rodata @ [0x1000-0x2000) */ -static const IMAGE_SECTION_HEADER sh_rodata_3 = +static const IMAGE_SECTION_HEADER sh_rodata_2 = { ".rodata", {page_size}, page_size, page_size, page_size, 0, 0, 0, 0, IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ @@ -60,50 +53,36 @@ IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ }; -/* rsrc @ [0x4000-0x5000) */ -static const IMAGE_SECTION_HEADER sh_rsrc_2 = -{ - ".rsrc\0\0", {page_size}, 4*page_size, page_size, 4*page_size, 0, 0, 0, 0, - IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ -}; - /* rsrc @ [0x2000-0x4000) */ -static const IMAGE_SECTION_HEADER sh_rsrc_3 = +static const IMAGE_SECTION_HEADER sh_rsrc_2 = { ".rsrc\0\0", {2*page_size}, rva_rsrc_start-page_size, 2*page_size, rva_rsrc_start-page_size, 0, 0, 0, 0, IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ }; /* rsrc @ [0x2000-0x3000) */ -static const IMAGE_SECTION_HEADER sh_rsrc_4 = +static const IMAGE_SECTION_HEADER sh_rsrc_3 = { ".rsrc\0\0", {page_size}, rva_rsrc_start-page_size, page_size, rva_rsrc_start-page_size, 0, 0, 0, 0, IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ }; /* rsrc @ [0x3000-0x6000) */ -static const IMAGE_SECTION_HEADER sh_rsrc_5 = +static const IMAGE_SECTION_HEADER sh_rsrc_4 = { ".rsrc\0\0", {3*page_size}, rva_rsrc_start, 3*page_size, rva_rsrc_start, 0, 0, 0, 0, IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ }; -/* rsrc @ [0x4000-0x7000) */ -static const IMAGE_SECTION_HEADER sh_rsrc_6 = -{ - ".rsrc\0\0", {3*page_size}, 4*page_size, 3*page_size, 4*page_size, 0, 0, 0, 0, - IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ -}; - /* rsrc @ [0x2000-0x5000) */ -static const IMAGE_SECTION_HEADER sh_rsrc_7 = +static const IMAGE_SECTION_HEADER sh_rsrc_5 = { ".rsrc\0\0", {3*page_size}, 2*page_size, 3*page_size, 2*page_size, 0, 0, 0, 0, IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ }; /* rsrc @ [0x3000-0x4000), small SizeOfRawData */ -static const IMAGE_SECTION_HEADER sh_rsrc_8 = +static const IMAGE_SECTION_HEADER sh_rsrc_6 = { ".rsrc\0\0", {page_size}, rva_rsrc_start, 8, rva_rsrc_start, 0, 0, 0, 0, IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ @@ -148,29 +127,17 @@ {{&sh_rodata_1, &sh_rsrc_1, NULL}, 4*page_size, 1, 0, 0}, {{&sh_rodata_1, &sh_rsrc_1, NULL}, 4*page_size, 1, 0, 0}, {{&sh_rodata_1, &sh_rsrc_1, NULL}, 4*page_size, 1, 0, 1}, - {{&sh_rodata_1, &sh_rsrc_5, NULL}, 6*page_size, 1, 0, 1} - }, - /* single .rodata section with compatible characteristics, data directory entry points to section end */ - /* Vista+ - existing section isn't used, new section is created at the end of file */ - /* NT4/2000/2003 - image is broken */ -#if 0 - { - {{&sh_rodata_2, NULL, NULL}}, - {{&sh_rodata_2, &sh_rsrc_2, NULL}, 5*page_size, 1, 0, 0}, - {{&sh_rodata_2, &sh_rsrc_2, NULL}, 5*page_size, 1, 0, 0}, - {{&sh_rodata_2, &sh_rsrc_2, NULL}, 5*page_size, 1, 0, 1}, - {{&sh_rodata_2, &sh_rsrc_6, NULL}, 7*page_size, 1, 0, 1} + {{&sh_rodata_1, &sh_rsrc_4, NULL}, 6*page_size, 1, 0, 1} }, -#endif /* .rsrc is the last section, data directory entry points to section end */ /* Vista+ - resources are moved to section start (trashing data that could be there), and section is trimmed */ /* NT4/2000/2003 - resources are moved to section start (trashing data that could be there); section isn't trimmed */ { - {{&sh_rodata_3, &sh_rsrc_3, NULL}}, - {{&sh_rodata_3, &sh_rsrc_4, NULL}, 3*page_size, 1, 0, 0}, - {{&sh_rodata_3, &sh_rsrc_4, NULL}, 3*page_size, 1, 0, 0}, - {{&sh_rodata_3, &sh_rsrc_4, NULL}, 3*page_size, 1, 0, 1}, - {{&sh_rodata_3, &sh_rsrc_7, NULL}, 5*page_size, 1, 0, 1} + {{&sh_rodata_2, &sh_rsrc_2, NULL}}, + {{&sh_rodata_2, &sh_rsrc_3, NULL}, 3*page_size, 1, 0, 0}, + {{&sh_rodata_2, &sh_rsrc_3, NULL}, 3*page_size, 1, 0, 0}, + {{&sh_rodata_2, &sh_rsrc_3, NULL}, 3*page_size, 1, 0, 1}, + {{&sh_rodata_2, &sh_rsrc_5, NULL}, 5*page_size, 1, 0, 1} }, /* .rsrc is not the last section */ /* section is reused; sections after .rsrc are shifted to give space to rsrc (in-image offset and RVA!) */ @@ -179,15 +146,15 @@ {{&sh_rodata_1, &sh_rsrc_1, &sh_junk}, 5*page_size, 1, 0, 0}, {{&sh_rodata_1, &sh_rsrc_1, &sh_junk}, 5*page_size, 1, 0, 0}, {{&sh_rodata_1, &sh_rsrc_1, &sh_junk}, 5*page_size, 1, 0, 1}, - {{&sh_rodata_1, &sh_rsrc_5, &sh_junk_2}, 7*page_size, 1, 0, 1} + {{&sh_rodata_1, &sh_rsrc_4, &sh_junk_2}, 7*page_size, 1, 0, 1} }, /* .rsrc is the last section, data directory entry points to whole section, file size is not aligned on FileAlign */ { - {{&sh_rodata_1, &sh_rsrc_8, NULL}}, + {{&sh_rodata_1, &sh_rsrc_6, NULL}}, {{&sh_rodata_1, &sh_rsrc_1, NULL}, 4*page_size, 1, 0, 0}, {{&sh_rodata_1, &sh_rsrc_1, NULL}, 4*page_size, 1, 0, 0}, {{&sh_rodata_1, &sh_rsrc_1, NULL}, 4*page_size, 1, 0, 1}, - {{&sh_rodata_1, &sh_rsrc_5, NULL}, 6*page_size, 1, 0, 1} + {{&sh_rodata_1, &sh_rsrc_4, NULL}, 6*page_size, 1, 0, 1} } }; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/tests/virtual.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/tests/virtual.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/kernel32/tests/virtual.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/kernel32/tests/virtual.c 2014-12-15 00:45:34.000000000 +0000 @@ -1618,7 +1618,7 @@ /* test behaviour of VirtualLock - first attempt should fail */ SetLastError( 0xdeadbeef ); success = VirtualLock( base, size ); - ok( !success, "VirtualLock unexpectedly succeded\n" ); + ok( !success, "VirtualLock unexpectedly succeeded\n" ); todo_wine ok( GetLastError() == STATUS_GUARD_PAGE_VIOLATION, "wrong error %u\n", GetLastError() ); @@ -1770,7 +1770,7 @@ /* test behaviour of VirtualLock - first attempt should fail without triggering write watches */ SetLastError( 0xdeadbeef ); success = VirtualLock( base, size ); - ok( !success, "VirtualLock unexpectedly succeded\n" ); + ok( !success, "VirtualLock unexpectedly succeeded\n" ); todo_wine ok( GetLastError() == STATUS_GUARD_PAGE_VIOLATION, "wrong error %u\n", GetLastError() ); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/localspl/provider.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/localspl/provider.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/localspl/provider.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/localspl/provider.c 2014-12-15 00:45:34.000000000 +0000 @@ -99,9 +99,7 @@ static const WCHAR configuration_fileW[] = {'C','o','n','f','i','g','u','r','a','t','i','o','n',' ','F','i','l','e',0}; static const WCHAR datatypeW[] = {'D','a','t','a','t','y','p','e',0}; static const WCHAR data_fileW[] = {'D','a','t','a',' ','F','i','l','e',0}; -static const WCHAR default_devmodeW[] = {'D','e','f','a','u','l','t',' ','D','e','v','M','o','d','e',0}; static const WCHAR dependent_filesW[] = {'D','e','p','e','n','d','e','n','t',' ','F','i','l','e','s',0}; -static const WCHAR descriptionW[] = {'D','e','s','c','r','i','p','t','i','o','n',0}; static const WCHAR driverW[] = {'D','r','i','v','e','r',0}; static const WCHAR emptyW[] = {0}; static const WCHAR fmt_driversW[] = { 'S','y','s','t','e','m','\\', @@ -116,13 +114,10 @@ 'P','r','i','n','t','\\', 'E','n','v','i','r','o','n','m','e','n','t','s','\\','%','s','\\', 'P','r','i','n','t',' ','P','r','o','c','e','s','s','o','r','s',0 }; -static const WCHAR hardwareidW[] = {'H','a','r','d','w','a','r','e','I','D',0}; static const WCHAR help_fileW[] = {'H','e','l','p',' ','F','i','l','e',0}; static const WCHAR ia64_envnameW[] = {'W','i','n','d','o','w','s',' ','I','A','6','4',0}; static const WCHAR ia64_subdirW[] = {'i','a','6','4',0}; static const WCHAR localportW[] = {'L','o','c','a','l',' ','P','o','r','t',0}; -static const WCHAR locationW[] = {'L','o','c','a','t','i','o','n',0}; -static const WCHAR manufacturerW[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0}; static const WCHAR monitorW[] = {'M','o','n','i','t','o','r',0}; static const WCHAR monitorsW[] = {'S','y','s','t','e','m','\\', 'C','u', 'r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', @@ -130,10 +125,6 @@ 'P','r','i','n','t','\\', 'M','o','n','i','t','o','r','s','\\',0}; static const WCHAR monitorUIW[] = {'M','o','n','i','t','o','r','U','I',0}; -static const WCHAR nameW[] = {'N','a','m','e',0}; -static const WCHAR oem_urlW[] = {'O','E','M',' ','U','r','l',0}; -static const WCHAR parametersW[] = {'P','a','r','a','m','e','t','e','r','s',0}; -static const WCHAR portW[] = {'P','o','r','t',0}; static const WCHAR previous_namesW[] = {'P','r','e','v','i','o','u','s',' ','N','a','m','e','s',0}; static const WCHAR printersW[] = {'S','y','s','t','e','m','\\', 'C','u', 'r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mfplat/main.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mfplat/main.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mfplat/main.c 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mfplat/main.c 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,38 @@ +/* + * + * Copyright 2014 Austin English + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ +#include "config.h" + +#include + +#include "windef.h" +#include "winbase.h" + +BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) +{ + switch (reason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(instance); + break; + } + + return TRUE; +} diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mfplat/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/mfplat/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mfplat/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mfplat/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,4 @@ +MODULE = mfplat.dll + +C_SRCS = \ + main.c diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mfplat/mfplat.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/mfplat/mfplat.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mfplat/mfplat.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mfplat/mfplat.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,156 @@ +@ stub FormatTagFromWfx +@ stub MFCreateGuid +@ stub MFGetIoPortHandle +@ stub MFGetPlatformVersion +@ stub MFGetRandomNumber +@ stub MFIsFeatureEnabled +@ stub MFIsQueueThread +@ stub MFPlatformBigEndian +@ stub MFPlatformLittleEndian +@ stub ValidateWaveFormat +@ stub CopyPropVariant +@ stub CreatePropVariant +@ stub CreatePropertyStore +@ stub DestroyPropVariant +@ stub GetAMSubtypeFromD3DFormat +@ stub GetD3DFormatFromMFSubtype +@ stub LFGetGlobalPool +@ stub MFAddPeriodicCallback +@ stub MFAllocateWorkQueue +@ stub MFAllocateWorkQueueEx +@ stub MFAppendCollection +@ stub MFAverageTimePerFrameToFrameRate +@ stub MFBeginCreateFile +@ stub MFBeginGetHostByName +@ stub MFBeginRegisterWorkQueueWithMMCSS +@ stub MFBeginUnregisterWorkQueueWithMMCSS +@ stub MFBlockThread +@ stub MFCalculateBitmapImageSize +@ stub MFCalculateImageSize +@ stub MFCancelCreateFile +@ stub MFCancelWorkItem +@ stub MFCompareFullToPartialMediaType +@ stub MFCompareSockaddrAddresses +@ stub MFConvertColorInfoFromDXVA +@ stub MFConvertColorInfoToDXVA +@ stub MFConvertFromFP16Array +@ stub MFConvertToFP16Array +@ stub MFCopyImage +@ stub MFCreateAMMediaTypeFromMFMediaType +@ stub MFCreateAlignedMemoryBuffer +@ stub MFCreateAsyncResult +@ stub MFCreateAttributes +@ stub MFCreateAudioMediaType +@ stub MFCreateCollection +@ stub MFCreateEventQueue +@ stub MFCreateFile +@ stub MFCreateLegacyMediaBufferOnMFMediaBuffer +@ stub MFCreateMFByteStreamOnStream +@ stub MFCreateMFVideoFormatFromMFMediaType +@ stub MFCreateMediaBufferWrapper +@ stub MFCreateMediaEvent +@ stub MFCreateMediaType +@ stub MFCreateMediaTypeFromRepresentation +@ stub MFCreateMemoryBuffer +@ stub MFCreateMemoryStream +@ stub MFCreatePathFromURL +@ stub MFCreatePresentationDescriptor +@ stub MFCreateSample +@ stub MFCreateSocket +@ stub MFCreateSocketListener +@ stub MFCreateSourceResolver +@ stub MFCreateStreamDescriptor +@ stub MFCreateSystemTimeSource +@ stub MFCreateSystemUnderlyingClock +@ stub MFCreateTempFile +@ stub MFCreateTransformActivate +@ stub MFCreateURLFromPath +@ stub MFCreateUdpSockets +@ stub MFCreateVideoMediaType +@ stub MFCreateVideoMediaTypeFromBitMapInfoHeader +@ stub MFCreateVideoMediaTypeFromBitMapInfoHeaderEx +@ stub MFCreateVideoMediaTypeFromSubtype +@ stub MFCreateVideoMediaTypeFromVideoInfoHeader2 +@ stub MFCreateVideoMediaTypeFromVideoInfoHeader +@ stub MFCreateWaveFormatExFromMFMediaType +@ stub MFDeserializeAttributesFromStream +@ stub MFDeserializeEvent +@ stub MFDeserializeMediaTypeFromStream +@ stub MFDeserializePresentationDescriptor +@ stub MFEndCreateFile +@ stub MFEndGetHostByName +@ stub MFEndRegisterWorkQueueWithMMCSS +@ stub MFEndUnregisterWorkQueueWithMMCSS +@ stub MFFrameRateToAverageTimePerFrame +@ stub MFFreeAdaptersAddresses +@ stub MFGetAdaptersAddresses +@ stub MFGetAttributesAsBlob +@ stub MFGetAttributesAsBlobSize +@ stub MFGetConfigurationDWORD +@ stub MFGetConfigurationPolicy +@ stub MFGetConfigurationStore +@ stub MFGetConfigurationString +@ stub MFGetMFTMerit +@ stub MFGetNumericNameFromSockaddr +@ stub MFGetPlaneSize +@ stub MFGetPlatform +@ stub MFGetPluginControl +@ stub MFGetPrivateWorkqueues +@ stub MFGetSockaddrFromNumericName +@ stub MFGetStrideForBitmapInfoHeader +@ stub MFGetSystemTime +@ stub MFGetTimerPeriodicity +@ stub MFGetUncompressedVideoFormat +@ stub MFGetWorkQueueMMCSSClass +@ stub MFGetWorkQueueMMCSSTaskId +@ stub MFHeapAlloc +@ stub MFHeapFree +@ stub MFInitAMMediaTypeFromMFMediaType +@ stub MFInitAttributesFromBlob +@ stub MFInitMediaTypeFromAMMediaType +@ stub MFInitMediaTypeFromMFVideoFormat +@ stub MFInitMediaTypeFromMPEG1VideoInfo +@ stub MFInitMediaTypeFromMPEG2VideoInfo +@ stub MFInitMediaTypeFromVideoInfoHeader2 +@ stub MFInitMediaTypeFromVideoInfoHeader +@ stub MFInitMediaTypeFromWaveFormatEx +@ stub MFInitVideoFormat +@ stub MFInitVideoFormat_RGB +@ stub MFInvokeCallback +@ stub MFJoinIoPort +@ stub MFLockPlatform +@ stub MFLockWorkQueue +@ stub MFPutWorkItem +@ stub MFPutWorkItemEx +@ stub MFRecordError +@ stub MFRemovePeriodicCallback +@ stub MFScheduleWorkItem +@ stub MFScheduleWorkItemEx +@ stub MFSerializeAttributesToStream +@ stub MFSerializeEvent +@ stub MFSerializeMediaTypeToStream +@ stub MFSerializePresentationDescriptor +@ stub MFSetSockaddrAny +@ stub MFShutdown +@ stub MFStartup +@ stub MFStreamDescriptorProtectMediaType +@ stub MFTEnum +@ stub MFTEnumEx +@ stub MFTGetInfo +@ stub MFTRegister +@ stub MFTRegisterLocal +@ stub MFTRegisterLocalByCLSID +@ stub MFTUnregister +@ stub MFTUnregisterLocal +@ stub MFTUnregisterLocalByCLSID +@ stub MFTraceError +@ stub MFTraceFuncEnter +@ stub MFUnblockThread +@ stub MFUnlockPlatform +@ stub MFUnlockWorkQueue +@ stub MFUnwrapMediaType +@ stub MFValidateMediaTypeSize +@ stub MFWrapMediaType +@ stub MFllMulDiv +@ stub PropVariantFromStream +@ stub PropVariantToStream diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mfreadwrite/main.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mfreadwrite/main.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mfreadwrite/main.c 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mfreadwrite/main.c 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,38 @@ +/* + * + * Copyright 2014 Austin English + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ +#include "config.h" + +#include + +#include "windef.h" +#include "winbase.h" + +BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) +{ + switch (reason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(instance); + break; + } + + return TRUE; +} diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mfreadwrite/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/mfreadwrite/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mfreadwrite/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mfreadwrite/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,4 @@ +MODULE = mfreadwrite.dll + +C_SRCS = \ + main.c diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mfreadwrite/mfreadwrite.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/mfreadwrite/mfreadwrite.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mfreadwrite/mfreadwrite.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mfreadwrite/mfreadwrite.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,7 @@ +@ stub DllCanUnloadNow +@ stub DllGetClassObject +@ stub MFCreateSinkWriterFromMediaSink +@ stub MFCreateSinkWriterFromURL +@ stub MFCreateSourceReaderFromByteStream +@ stub MFCreateSourceReaderFromMediaSource +@ stub MFCreateSourceReaderFromURL diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mmdevapi/devenum.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mmdevapi/devenum.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mmdevapi/devenum.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mmdevapi/devenum.c 2014-12-15 00:45:34.000000000 +0000 @@ -264,6 +264,25 @@ return hr; } +static HRESULT set_driver_prop_value(GUID *id, const EDataFlow flow, const PROPERTYKEY *prop) +{ + HRESULT hr; + PROPVARIANT pv; + + if (!drvs.pGetPropValue) + return E_NOTIMPL; + + hr = drvs.pGetPropValue(id, prop, &pv); + + if (SUCCEEDED(hr)) + { + MMDevice_SetPropValue(id, flow, prop, &pv); + PropVariantClear(&pv); + } + + return hr; +} + /* Creates or updates the state of a device * If GUID is null, a random guid will be assigned * and the device will be created @@ -279,6 +298,10 @@ {0x233164c8, 0x1b2c, 0x4c7d, {0xbc, 0x68, 0xb6, 0x71, 0x68, 0x7a, 0x25, 0x67}}, 1 }; + static const PROPERTYKEY devicepath_key = { + {0xb3f8fa53, 0x0004, 0x438e, {0x90, 0x03, 0x51, 0xa4, 0x6e, 0x13, 0x9b, 0xfc}}, 2 + }; + for (i = 0; i < MMDevice_count; ++i) { MMDevice *device = MMDevice_head[i]; @@ -338,6 +361,16 @@ pv.u.pwszVal = guidstr; MMDevice_SetPropValue(id, flow, &deviceinterface_key, &pv); + set_driver_prop_value(id, flow, &devicepath_key); + + if (FAILED(set_driver_prop_value(id, flow, &PKEY_AudioEndpoint_FormFactor))) + { + pv.vt = VT_UI4; + pv.u.ulVal = (flow == eCapture) ? Microphone : Speakers; + + MMDevice_SetPropValue(id, flow, &PKEY_AudioEndpoint_FormFactor, &pv); + } + RegCloseKey(keyprop); } RegCloseKey(key); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mmdevapi/main.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mmdevapi/main.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mmdevapi/main.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mmdevapi/main.c 2014-12-15 00:45:34.000000000 +0000 @@ -97,6 +97,9 @@ LDFC(GetAudioSessionManager); #undef LDFC + /* optional - do not fail if not found */ + driver->pGetPropValue = (void*)GetProcAddress(driver->module, "GetPropValue"); + driver->priority = driver->pGetPriority(); lstrcpyW(driver->module_name, driver_module); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mmdevapi/mmdevapi.h wine-compholio-1.7.33~ubuntu15.04.1/dlls/mmdevapi/mmdevapi.h --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mmdevapi/mmdevapi.h 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mmdevapi/mmdevapi.h 2014-12-15 00:45:34.000000000 +0000 @@ -54,6 +54,8 @@ IAudioClient **out); HRESULT (WINAPI *pGetAudioSessionManager)(IMMDevice *device, IAudioSessionManager2 **out); + HRESULT (WINAPI *pGetPropValue)(GUID *guid, + const PROPERTYKEY *prop, PROPVARIANT *out); } DriverFuncs; extern DriverFuncs drvs DECLSPEC_HIDDEN; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/htmldoc.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/htmldoc.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/htmldoc.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/htmldoc.c 2014-12-15 00:45:34.000000000 +0000 @@ -1096,14 +1096,22 @@ return S_OK; } +static const WCHAR copyW[] = + {'c','o','p','y',0}; +static const WCHAR cutW[] = + {'c','u','t',0}; static const WCHAR fontnameW[] = {'f','o','n','t','n','a','m','e',0}; +static const WCHAR indentW[] = + {'i','n','d','e','n','t',0}; static const WCHAR insertorderedlistW[] = {'i','n','s','e','r','t','o','r','d','e','r','e','d','l','i','s','t',0}; static const WCHAR insertunorderedlistW[] = {'i','n','s','e','r','t','u','n','o','r','d','e','r','e','d','l','i','s','t',0}; static const WCHAR outdentW[] = {'o','u','t','d','e','n','t',0}; +static const WCHAR pasteW[] = + {'p','a','s','t','e',0}; static const WCHAR respectvisibilityindesignW[] = {'r','e','s','p','e','c','t','v','i','s','i','b','i','l','i','t','y','i','n','d','e','s','i','g','n',0}; @@ -1111,10 +1119,14 @@ const WCHAR *name; OLECMDID id; }command_names[] = { + {copyW, IDM_COPY}, + {cutW, IDM_CUT}, {fontnameW, IDM_FONTNAME}, + {indentW, IDM_INDENT}, {insertorderedlistW, IDM_ORDERLIST}, {insertunorderedlistW, IDM_UNORDERLIST}, {outdentW, IDM_OUTDENT}, + {pasteW, IDM_PASTE}, {respectvisibilityindesignW, IDM_RESPECTVISIBILITY_INDESIGN} }; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/htmlelem.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/htmlelem.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/htmlelem.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/htmlelem.c 2014-12-15 00:45:34.000000000 +0000 @@ -606,6 +606,10 @@ wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); } +#define ATTRFLAG_CASESENSITIVE 0x0001 +#define ATTRFLAG_ASSTRING 0x0002 +#define ATTRFLAG_EXPANDURL 0x0004 + static HRESULT WINAPI HTMLElement_setAttribute(IHTMLElement *iface, BSTR strAttributeName, VARIANT AttributeValue, LONG lFlags) { @@ -618,7 +622,7 @@ TRACE("(%p)->(%s %s %08x)\n", This, debugstr_w(strAttributeName), debugstr_variant(&AttributeValue), lFlags); hres = IDispatchEx_GetDispID(&This->node.dispex.IDispatchEx_iface, strAttributeName, - (lFlags&1 ? fdexNameCaseSensitive : fdexNameCaseInsensitive) | fdexNameEnsure, &dispid); + (lFlags&ATTRFLAG_CASESENSITIVE ? fdexNameCaseSensitive : fdexNameCaseInsensitive) | fdexNameEnsure, &dispid); if(FAILED(hres)) return hres; @@ -647,8 +651,11 @@ TRACE("(%p)->(%s %08x %p)\n", This, debugstr_w(strAttributeName), lFlags, AttributeValue); + if(lFlags & ~(ATTRFLAG_CASESENSITIVE|ATTRFLAG_ASSTRING)) + FIXME("Unsuported flags %x\n", lFlags); + hres = IDispatchEx_GetDispID(&This->node.dispex.IDispatchEx_iface, strAttributeName, - lFlags&1 ? fdexNameCaseSensitive : fdexNameCaseInsensitive, &dispid); + lFlags&ATTRFLAG_CASESENSITIVE ? fdexNameCaseSensitive : fdexNameCaseInsensitive, &dispid); if(hres == DISP_E_UNKNOWNNAME) { V_VT(AttributeValue) = VT_NULL; return S_OK; @@ -659,8 +666,28 @@ return hres; } - return IDispatchEx_InvokeEx(&This->node.dispex.IDispatchEx_iface, dispid, LOCALE_SYSTEM_DEFAULT, + hres = IDispatchEx_InvokeEx(&This->node.dispex.IDispatchEx_iface, dispid, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, AttributeValue, &excep, NULL); + if(FAILED(hres)) + return hres; + + if(lFlags & ATTRFLAG_ASSTRING) { + switch(V_VT(AttributeValue)) { + case VT_BSTR: + break; + case VT_DISPATCH: + IDispatch_Release(V_DISPATCH(AttributeValue)); + V_VT(AttributeValue) = VT_BSTR; + V_BSTR(AttributeValue) = SysAllocString(NULL); + break; + default: + hres = VariantChangeType(AttributeValue, AttributeValue, 0, VT_BSTR); + if(FAILED(hres)) + return hres; + } + } + + return S_OK; } static HRESULT WINAPI HTMLElement_removeAttribute(IHTMLElement *iface, BSTR strAttributeName, @@ -673,7 +700,7 @@ TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(strAttributeName), lFlags, pfSuccess); hres = IDispatchEx_GetDispID(&This->node.dispex.IDispatchEx_iface, strAttributeName, - lFlags&1 ? fdexNameCaseSensitive : fdexNameCaseInsensitive, &id); + lFlags&ATTRFLAG_CASESENSITIVE ? fdexNameCaseSensitive : fdexNameCaseInsensitive, &id); if(hres == DISP_E_UNKNOWNNAME) { *pfSuccess = VARIANT_FALSE; return S_OK; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/htmlevent.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/htmlevent.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/htmlevent.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/htmlevent.c 2014-12-15 00:45:34.000000000 +0000 @@ -201,7 +201,7 @@ {loadW, onloadW, EVENTT_HTML, DISPID_EVMETH_ONLOAD, EVENT_BIND_TO_BODY}, {mousedownW, onmousedownW, EVENTT_MOUSE, DISPID_EVMETH_ONMOUSEDOWN, - EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, + EVENT_DEFAULTLISTENER|EVENT_BUBBLE|EVENT_CANCELABLE}, {mousemoveW, onmousemoveW, EVENTT_MOUSE, DISPID_EVMETH_ONMOUSEMOVE, EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, {mouseoutW, onmouseoutW, EVENTT_MOUSE, DISPID_EVMETH_ONMOUSEOUT, diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/htmlobject.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/htmlobject.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/htmlobject.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/htmlobject.c 2014-12-15 00:45:34.000000000 +0000 @@ -575,8 +575,29 @@ static HRESULT WINAPI HTMLObjectElement2_put_classid(IHTMLObjectElement2 *iface, BSTR v) { HTMLObjectElement *This = impl_from_IHTMLObjectElement2(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + HRESULT hres; + + static const WCHAR classidW[] = {'c','l','a','s','s','i','d',0}; + + FIXME("(%p)->(%s) semi-stub\n", This, debugstr_w(v)); + + hres = elem_string_attr_setter(&This->plugin_container.element, classidW, v); + if(FAILED(hres)) + return hres; + + if(This->plugin_container.plugin_host) { + FIXME("Host already asociated.\n"); + return E_NOTIMPL; + } + + /* + * NOTE: + * If the element is not yet in DOM tree, we should embed it as soon as it's added. + * However, Gecko for some reason decides not to create NP plugin in this case, + * so this won't work. + */ + + return create_plugin_host(This->plugin_container.element.node.doc, &This->plugin_container); } static HRESULT WINAPI HTMLObjectElement2_get_classid(IHTMLObjectElement2 *iface, BSTR *p) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/htmlstyle.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/htmlstyle.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/htmlstyle.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/htmlstyle.c 2014-12-15 00:45:34.000000000 +0000 @@ -935,19 +935,13 @@ TRACE("(%p)->(%s)\n", This, debugstr_w(v)); /* fontWeight can only be one of the following */ - if(!v || strcmpiW(szNormal, v) == 0 || strcmpiW(styleBold, v) == 0 || - strcmpiW(styleBolder, v) == 0 || strcmpiW(styleLighter, v) == 0 || - strcmpiW(style100, v) == 0 || strcmpiW(style200, v) == 0 || - strcmpiW(style300, v) == 0 || strcmpiW(style400, v) == 0 || - strcmpiW(style500, v) == 0 || strcmpiW(style600, v) == 0 || - strcmpiW(style700, v) == 0 || strcmpiW(style800, v) == 0 || - strcmpiW(style900, v) == 0 - ) - { - return set_nsstyle_attr(This->nsstyle, STYLEID_FONT_WEIGHT, v, 0); - } + if(v && *v && strcmpiW(szNormal, v) && strcmpiW(styleBold, v) && strcmpiW(styleBolder, v) + && strcmpiW(styleLighter, v) && strcmpiW(style100, v) && strcmpiW(style200, v) + && strcmpiW(style300, v) && strcmpiW(style400, v) && strcmpiW(style500, v) && strcmpiW(style600, v) + && strcmpiW(style700, v) && strcmpiW(style800, v) && strcmpiW(style900, v)) + return E_INVALIDARG; - return E_INVALIDARG; + return set_nsstyle_attr(This->nsstyle, STYLEID_FONT_WEIGHT, v, 0); } static HRESULT WINAPI HTMLStyle_get_fontWeight(IHTMLStyle *iface, BSTR *p) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/npplugin.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/npplugin.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/npplugin.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/npplugin.c 2014-12-15 00:45:34.000000000 +0000 @@ -264,386 +264,15 @@ return window->base.inner_window; } -static BOOL parse_classid(const PRUnichar *classid, CLSID *clsid) -{ - const WCHAR *ptr; - unsigned len; - HRESULT hres; - - static const PRUnichar clsidW[] = {'c','l','s','i','d',':'}; - - if(strncmpiW(classid, clsidW, sizeof(clsidW)/sizeof(WCHAR))) - return FALSE; - - ptr = classid + sizeof(clsidW)/sizeof(WCHAR); - len = strlenW(ptr); - - if(len == 38) { - hres = CLSIDFromString(ptr, clsid); - }else if(len == 36) { - WCHAR buf[39]; - - buf[0] = '{'; - memcpy(buf+1, ptr, len*sizeof(WCHAR)); - buf[37] = '}'; - buf[38] = 0; - hres = CLSIDFromString(buf, clsid); - }else { - return FALSE; - } - - return SUCCEEDED(hres); -} - -static BOOL get_elem_clsid(nsIDOMHTMLElement *elem, CLSID *clsid) -{ - const PRUnichar *val; - nsAString val_str; - nsresult nsres; - BOOL ret = FALSE; - - static const PRUnichar classidW[] = {'c','l','a','s','s','i','d',0}; - - nsres = get_elem_attr_value(elem, classidW, &val_str, &val); - if(NS_SUCCEEDED(nsres)) { - if(*val) - ret = parse_classid(val, clsid); - nsAString_Finish(&val_str); - } - - return ret; -} - -typedef struct { - IBindStatusCallback IBindStatusCallback_iface; - IWindowForBindingUI IWindowForBindingUI_iface; - LONG ref; -} InstallCallback; - -static inline InstallCallback *impl_from_IBindStatusCallback(IBindStatusCallback *iface) -{ - return CONTAINING_RECORD(iface, InstallCallback, IBindStatusCallback_iface); -} - -static HRESULT WINAPI InstallCallback_QueryInterface(IBindStatusCallback *iface, - REFIID riid, void **ppv) -{ - InstallCallback *This = impl_from_IBindStatusCallback(iface); - - if(IsEqualGUID(&IID_IUnknown, riid)) { - TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = &This->IBindStatusCallback_iface; - }else if(IsEqualGUID(&IID_IBindStatusCallback, riid)) { - TRACE("(%p)->(IID_IBindStatusCallback %p)\n", This, ppv); - *ppv = &This->IBindStatusCallback_iface; - }else if(IsEqualGUID(&IID_IWindowForBindingUI, riid)) { - TRACE("(%p)->(IID_IWindowForBindingUI %p)\n", This, ppv); - *ppv = &This->IWindowForBindingUI_iface; - }else { - TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); - *ppv = NULL; - return E_NOINTERFACE; - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; -} - -static ULONG WINAPI InstallCallback_AddRef(IBindStatusCallback *iface) -{ - InstallCallback *This = impl_from_IBindStatusCallback(iface); - LONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) ref=%d\n", This, ref); - - return ref; -} - -static ULONG WINAPI InstallCallback_Release(IBindStatusCallback *iface) -{ - InstallCallback *This = impl_from_IBindStatusCallback(iface); - LONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) ref=%d\n", This, ref); - - if(!ref) - heap_free(This); - - return ref; -} - -static HRESULT WINAPI InstallCallback_OnStartBinding(IBindStatusCallback *iface, - DWORD dwReserved, IBinding *pib) -{ - InstallCallback *This = impl_from_IBindStatusCallback(iface); - TRACE("(%p)->(%x %p)\n", This, dwReserved, pib); - return S_OK; -} - -static HRESULT WINAPI InstallCallback_GetPriority(IBindStatusCallback *iface, LONG *pnPriority) -{ - InstallCallback *This = impl_from_IBindStatusCallback(iface); - TRACE("(%p)->(%p)\n", This, pnPriority); - return E_NOTIMPL; -} - -static HRESULT WINAPI InstallCallback_OnLowResource(IBindStatusCallback *iface, DWORD dwReserved) -{ - InstallCallback *This = impl_from_IBindStatusCallback(iface); - TRACE("(%p)->(%x)\n", This, dwReserved); - return S_OK; -} - -static HRESULT WINAPI InstallCallback_OnProgress(IBindStatusCallback *iface, ULONG ulProgress, - ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText) -{ - InstallCallback *This = impl_from_IBindStatusCallback(iface); - TRACE("(%p)->(%u %u %u %s)\n", This, ulProgress, ulProgressMax, ulStatusCode, debugstr_w(szStatusText)); - return S_OK; -} - -static HRESULT WINAPI InstallCallback_OnStopBinding(IBindStatusCallback *iface, - HRESULT hresult, LPCWSTR szError) -{ - InstallCallback *This = impl_from_IBindStatusCallback(iface); - TRACE("(%p)->(%08x %s)\n", This, hresult, debugstr_w(szError)); - return S_OK; -} - -static HRESULT WINAPI InstallCallback_GetBindInfo(IBindStatusCallback *iface, - DWORD* grfBINDF, BINDINFO* pbindinfo) -{ - InstallCallback *This = impl_from_IBindStatusCallback(iface); - - TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo); - - *grfBINDF = BINDF_ASYNCHRONOUS; - return S_OK; -} - -static HRESULT WINAPI InstallCallback_OnDataAvailable(IBindStatusCallback *iface, DWORD grfBSCF, - DWORD dwSize, FORMATETC* pformatetc, STGMEDIUM* pstgmed) -{ - InstallCallback *This = impl_from_IBindStatusCallback(iface); - ERR("(%p)\n", This); - return E_NOTIMPL; -} - -static HRESULT WINAPI InstallCallback_OnObjectAvailable(IBindStatusCallback *iface, - REFIID riid, IUnknown* punk) -{ - InstallCallback *This = impl_from_IBindStatusCallback(iface); - ERR("(%p)\n", This); - return E_NOTIMPL; -} - -static IBindStatusCallbackVtbl InstallCallbackVtbl = { - InstallCallback_QueryInterface, - InstallCallback_AddRef, - InstallCallback_Release, - InstallCallback_OnStartBinding, - InstallCallback_GetPriority, - InstallCallback_OnLowResource, - InstallCallback_OnProgress, - InstallCallback_OnStopBinding, - InstallCallback_GetBindInfo, - InstallCallback_OnDataAvailable, - InstallCallback_OnObjectAvailable -}; - -static inline InstallCallback *impl_from_IWindowForBindingUI(IWindowForBindingUI *iface) -{ - return CONTAINING_RECORD(iface, InstallCallback, IWindowForBindingUI_iface); -} - -static HRESULT WINAPI WindowForBindingUI_QueryInterface(IWindowForBindingUI *iface, REFIID riid, void **ppv) -{ - InstallCallback *This = impl_from_IWindowForBindingUI(iface); - return IBindStatusCallback_QueryInterface(&This->IBindStatusCallback_iface, riid, ppv); -} - -static ULONG WINAPI WindowForBindingUI_AddRef(IWindowForBindingUI *iface) -{ - InstallCallback *This = impl_from_IWindowForBindingUI(iface); - return IBindStatusCallback_AddRef(&This->IBindStatusCallback_iface); -} - -static ULONG WINAPI WindowForBindingUI_Release(IWindowForBindingUI *iface) -{ - InstallCallback *This = impl_from_IWindowForBindingUI(iface); - return IBindStatusCallback_Release(&This->IBindStatusCallback_iface); -} - -static HRESULT WINAPI WindowForBindingUI_GetWindow(IWindowForBindingUI *iface, REFGUID rguidReason, HWND *phwnd) -{ - InstallCallback *This = impl_from_IWindowForBindingUI(iface); - FIXME("(%p)->(%s %p)\n", This, debugstr_guid(rguidReason), phwnd); - *phwnd = NULL; - return S_OK; -} - -static const IWindowForBindingUIVtbl WindowForBindingUIVtbl = { - WindowForBindingUI_QueryInterface, - WindowForBindingUI_AddRef, - WindowForBindingUI_Release, - WindowForBindingUI_GetWindow -}; - -typedef struct { - struct list entry; - IUri *uri; -} install_entry_t; - -static struct list install_list = LIST_INIT(install_list); - -static CRITICAL_SECTION cs_install_list; -static CRITICAL_SECTION_DEBUG cs_install_list_dbg = -{ - 0, 0, &cs_install_list, - { &cs_install_list_dbg.ProcessLocksList, &cs_install_list_dbg.ProcessLocksList }, - 0, 0, { (DWORD_PTR)(__FILE__ ": install_list") } -}; -static CRITICAL_SECTION cs_install_list = { &cs_install_list_dbg, -1, 0, 0, 0, 0 }; - -static void install_codebase(const WCHAR *url) -{ - InstallCallback *callback; - IBindCtx *bctx; - HRESULT hres; - - callback = heap_alloc(sizeof(*callback)); - if(!callback) - return; - - callback->IBindStatusCallback_iface.lpVtbl = &InstallCallbackVtbl; - callback->IWindowForBindingUI_iface.lpVtbl = &WindowForBindingUIVtbl; - callback->ref = 1; - - hres = CreateAsyncBindCtx(0, &callback->IBindStatusCallback_iface, NULL, &bctx); - IBindStatusCallback_Release(&callback->IBindStatusCallback_iface); - if(FAILED(hres)) - return; - - hres = AsyncInstallDistributionUnit(NULL, NULL, NULL, 0, 0, url, bctx, NULL, 0); - IBindCtx_Release(bctx); - if(FAILED(hres)) - WARN("FAILED: %08x\n", hres); -} - -static void check_codebase(HTMLInnerWindow *window, nsIDOMHTMLElement *nselem) -{ - BOOL is_on_list = FALSE; - install_entry_t *iter; - const PRUnichar *val; - nsAString val_str; - IUri *uri = NULL; - nsresult nsres; - HRESULT hres; - - static const PRUnichar codebaseW[] = {'c','o','d','e','b','a','s','e',0}; - - nsres = get_elem_attr_value(nselem, codebaseW, &val_str, &val); - if(NS_SUCCEEDED(nsres)) { - if(*val) { - hres = CoInternetCombineUrlEx(window->base.outer_window->uri, val, 0, &uri, 0); - if(FAILED(hres)) - uri = NULL; - } - nsAString_Finish(&val_str); - } - - if(!uri) - return; - - EnterCriticalSection(&cs_install_list); - - LIST_FOR_EACH_ENTRY(iter, &install_list, install_entry_t, entry) { - BOOL eq; - - hres = IUri_IsEqual(uri, iter->uri, &eq); - if(SUCCEEDED(hres) && eq) { - TRACE("already proceeded\n"); - is_on_list = TRUE; - break; - } - } - - if(!is_on_list) { - iter = heap_alloc(sizeof(*iter)); - if(iter) { - IUri_AddRef(uri); - iter->uri = uri; - - list_add_tail(&install_list, &iter->entry); - } - } - - LeaveCriticalSection(&cs_install_list); - - if(!is_on_list) { - BSTR display_uri; - - hres = IUri_GetDisplayUri(uri, &display_uri); - if(SUCCEEDED(hres)) { - install_codebase(display_uri); - SysFreeString(display_uri); - } - } - - IUri_Release(uri); -} - -static IUnknown *create_activex_object(HTMLInnerWindow *window, nsIDOMHTMLElement *nselem, CLSID *clsid) -{ - IClassFactoryEx *cfex; - IClassFactory *cf; - IUnknown *obj; - DWORD policy; - HRESULT hres; - - if(!get_elem_clsid(nselem, clsid)) { - WARN("Could not determine element CLSID\n"); - return NULL; - } - - TRACE("clsid %s\n", debugstr_guid(clsid)); - - policy = 0; - hres = IInternetHostSecurityManager_ProcessUrlAction(&window->doc->IInternetHostSecurityManager_iface, - URLACTION_ACTIVEX_RUN, (BYTE*)&policy, sizeof(policy), (BYTE*)clsid, sizeof(GUID), 0, 0); - if(FAILED(hres) || policy != URLPOLICY_ALLOW) { - WARN("ProcessUrlAction returned %08x %x\n", hres, policy); - return NULL; - } - - hres = CoGetClassObject(clsid, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, NULL, &IID_IClassFactory, (void**)&cf); - if(hres == REGDB_E_CLASSNOTREG) - check_codebase(window, nselem); - if(FAILED(hres)) - return NULL; - - hres = IClassFactory_QueryInterface(cf, &IID_IClassFactoryEx, (void**)&cfex); - if(SUCCEEDED(hres)) { - FIXME("Use IClassFactoryEx\n"); - IClassFactoryEx_Release(cfex); - } - - hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&obj); - IClassFactory_Release(cf); - if(FAILED(hres)) - return NULL; - - return obj; -} - static NPError CDECL NPP_New(NPMIMEType pluginType, NPP instance, UINT16 mode, INT16 argc, char **argn, char **argv, NPSavedData *saved) { + HTMLPluginContainer *container; nsIDOMHTMLElement *nselem; HTMLInnerWindow *window; - IUnknown *obj; - CLSID clsid; + HTMLDOMNode *node; NPError err = NPERR_NO_ERROR; + HRESULT hres; TRACE("(%s %p %x %d %p %p %p)\n", debugstr_a(pluginType), instance, mode, argc, argn, argv, saved); @@ -660,22 +289,30 @@ return NPERR_GENERIC_ERROR; } - obj = create_activex_object(window, nselem, &clsid); - if(obj) { - PluginHost *host; - HRESULT hres; + hres = get_node(window->doc, (nsIDOMNode*)nselem, TRUE, &node); + nsIDOMHTMLElement_Release(nselem); + if(FAILED(hres)) + return NPERR_GENERIC_ERROR; + + hres = IHTMLDOMNode_QueryInterface(&node->IHTMLDOMNode_iface, &IID_HTMLPluginContainer, + (void**)&container); + node_release(node); + if(FAILED(hres)) { + ERR("Not an object element\n"); + return NPERR_GENERIC_ERROR; + } - hres = create_plugin_host(window->doc, (nsIDOMElement*)nselem, obj, &clsid, &host); - IUnknown_Release(obj); - if(SUCCEEDED(hres)) - instance->pdata = host; - else + if(!container->plugin_host) { + hres = create_plugin_host(window->doc, container); + if(FAILED(hres)) err = NPERR_GENERIC_ERROR; }else { - err = NPERR_GENERIC_ERROR; + TRACE("plugin host already associated.\n"); } - nsIDOMHTMLElement_Release(nselem); + instance->pdata = container->plugin_host; + + node_release(&container->element.node); return err; } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/nsiface.idl wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/nsiface.idl --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/nsiface.idl 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/nsiface.idl 2014-12-15 00:45:34.000000000 +0000 @@ -3548,6 +3548,29 @@ [ object, + uuid(b8100c90-73be-11d2-92a5-00105a1b0d64), + local +] +interface nsIClipboardCommands : nsISupports +{ + nsresult CanCutSelection(bool *_retval); + nsresult CanCopySelection(bool *_retval); + nsresult CanCopyLinkLocation(bool *_retval); + nsresult CanCopyImageLocation(bool *_retval); + nsresult CanCopyImageContents(bool *_retval); + nsresult CanPaste(bool *_retval); + nsresult CutSelection(); + nsresult CopySelection(); + nsresult CopyLinkLocation(); + nsresult CopyImageLocation(); + nsresult CopyImageContents(); + nsresult Paste(); + nsresult SelectAll(); + nsresult SelectNone(); +} + +[ + object, uuid(edb99640-8378-4106-8673-e701a086eb1c), local ] diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/olecmd.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/olecmd.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/olecmd.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/olecmd.c 2014-12-15 00:45:34.000000000 +0000 @@ -62,6 +62,28 @@ nsICommandManager_Release(cmdmgr); } +static nsIClipboardCommands *get_clipboard_commands(HTMLDocument *doc) +{ + nsIClipboardCommands *clipboard_commands; + nsIDocShell *doc_shell; + nsresult nsres; + + nsres = get_nsinterface((nsISupports*)doc->window->nswindow, &IID_nsIDocShell, (void**)&doc_shell); + if(NS_FAILED(nsres)) { + ERR("Could not get nsIDocShell interface\n"); + return NULL; + } + + nsres = nsIDocShell_QueryInterface(doc_shell, &IID_nsIClipboardCommands, (void**)&clipboard_commands); + nsIDocShell_Release(doc_shell); + if(NS_FAILED(nsres)) { + ERR("Could not get nsIClipboardCommands interface\n"); + return NULL; + } + + return clipboard_commands; +} + /********************************************************** * IOleCommandTarget implementation */ @@ -551,13 +573,26 @@ static HRESULT exec_mshtml_cut(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out) { + nsIClipboardCommands *clipboard_commands; + nsresult nsres; + TRACE("(%p)->(%08x %p %p)\n", This, cmdexecopt, in, out); if(This->doc_obj->usermode == EDITMODE) return editor_exec_cut(This, cmdexecopt, in, out); - FIXME("Unimplemented in browse mode\n"); - return E_NOTIMPL; + clipboard_commands = get_clipboard_commands(This); + if(!clipboard_commands) + return E_UNEXPECTED; + + nsres = nsIClipboardCommands_CutSelection(clipboard_commands); + nsIClipboardCommands_Release(clipboard_commands); + if(NS_FAILED(nsres)) { + ERR("Paste failed: %08x\n", nsres); + return E_FAIL; + } + + return S_OK; } static HRESULT query_mshtml_paste(HTMLDocument *This, OLECMD *cmd) @@ -569,13 +604,26 @@ static HRESULT exec_mshtml_paste(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out) { + nsIClipboardCommands *clipboard_commands; + nsresult nsres; + TRACE("(%p)->(%08x %p %p)\n", This, cmdexecopt, in, out); if(This->doc_obj->usermode == EDITMODE) return editor_exec_paste(This, cmdexecopt, in, out); - FIXME("Unimplemented in browse mode\n"); - return E_NOTIMPL; + clipboard_commands = get_clipboard_commands(This); + if(!clipboard_commands) + return E_UNEXPECTED; + + nsres = nsIClipboardCommands_Paste(clipboard_commands); + nsIClipboardCommands_Release(clipboard_commands); + if(NS_FAILED(nsres)) { + ERR("Paste failed: %08x\n", nsres); + return E_FAIL; + } + + return S_OK; } static HRESULT exec_browsemode(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/pluginhost.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/pluginhost.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/pluginhost.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/pluginhost.c 2014-12-15 00:45:34.000000000 +0000 @@ -182,7 +182,7 @@ FIXME("No IPersistPropertyBag iface\n"); } -static void activate_plugin(PluginHost *host) +static void initialize_plugin_object(PluginHost *host) { IClientSecurity *client_security; IQuickActivate *quick_activate; @@ -191,12 +191,8 @@ IViewObjectEx *view_obj; IDispatchEx *dispex; IDispatch *disp; - RECT rect; HRESULT hres; - if(!host->plugin_unk) - return; - /* Note native calls QI on plugin for an undocumented IID and CLSID_HTMLDocument */ /* FIXME: call FreezeEvents(TRUE) */ @@ -281,6 +277,13 @@ FIXME("Use IOleCommandTarget\n"); IOleCommandTarget_Release(cmdtrg); } +} + +static void embed_plugin_object(PluginHost *host) +{ + IOleObject *ole_obj; + RECT rect; + HRESULT hres; hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IOleObject, (void**)&ole_obj); if(FAILED(hres)) { @@ -288,13 +291,11 @@ return; } - if(ole_obj) { - get_pos_rect(host, &rect); - hres = IOleObject_DoVerb(ole_obj, OLEIVERB_INPLACEACTIVATE, NULL, &host->IOleClientSite_iface, 0, host->hwnd, &rect); - IOleObject_Release(ole_obj); - if(FAILED(hres)) - WARN("DoVerb failed: %08x\n", hres); - } + get_pos_rect(host, &rect); + hres = IOleObject_DoVerb(ole_obj, OLEIVERB_INPLACEACTIVATE, NULL, &host->IOleClientSite_iface, 0, host->hwnd, &rect); + IOleObject_Release(ole_obj); + if(FAILED(hres)) + WARN("DoVerb failed: %08x\n", hres); if(host->ip_object) { HWND hwnd; @@ -323,7 +324,7 @@ if(!host->hwnd) { host->hwnd = hwnd; - activate_plugin(host); + embed_plugin_object(host); } if(rect_changed && host->ip_object) @@ -1634,29 +1635,378 @@ PHServiceProvider_QueryService }; -static HRESULT assoc_element(PluginHost *host, HTMLDocumentNode *doc, nsIDOMElement *nselem) +static BOOL parse_classid(const PRUnichar *classid, CLSID *clsid) { - HTMLPluginContainer *container_elem; - HTMLDOMNode *node; + const WCHAR *ptr; + unsigned len; HRESULT hres; - hres = get_node(doc, (nsIDOMNode*)nselem, TRUE, &node); - if(FAILED(hres)) - return hres; + static const PRUnichar clsidW[] = {'c','l','s','i','d',':'}; - hres = IHTMLDOMNode_QueryInterface(&node->IHTMLDOMNode_iface, &IID_HTMLPluginContainer, - (void**)&container_elem); - node_release(node); - if(FAILED(hres)) { - ERR("Not an object element\n"); - return hres; + if(strncmpiW(classid, clsidW, sizeof(clsidW)/sizeof(WCHAR))) + return FALSE; + + ptr = classid + sizeof(clsidW)/sizeof(WCHAR); + len = strlenW(ptr); + + if(len == 38) { + hres = CLSIDFromString(ptr, clsid); + }else if(len == 36) { + WCHAR buf[39]; + + buf[0] = '{'; + memcpy(buf+1, ptr, len*sizeof(WCHAR)); + buf[37] = '}'; + buf[38] = 0; + hres = CLSIDFromString(buf, clsid); + }else { + return FALSE; } - container_elem->plugin_host = host; - host->element = container_elem; + return SUCCEEDED(hres); +} + +static BOOL get_elem_clsid(nsIDOMHTMLElement *elem, CLSID *clsid) +{ + const PRUnichar *val; + nsAString val_str; + nsresult nsres; + BOOL ret = FALSE; + + static const PRUnichar classidW[] = {'c','l','a','s','s','i','d',0}; + + nsres = get_elem_attr_value(elem, classidW, &val_str, &val); + if(NS_SUCCEEDED(nsres)) { + if(*val) + ret = parse_classid(val, clsid); + nsAString_Finish(&val_str); + } + + return ret; +} + +typedef struct { + IBindStatusCallback IBindStatusCallback_iface; + IWindowForBindingUI IWindowForBindingUI_iface; + LONG ref; +} InstallCallback; + +static inline InstallCallback *impl_from_IBindStatusCallback(IBindStatusCallback *iface) +{ + return CONTAINING_RECORD(iface, InstallCallback, IBindStatusCallback_iface); +} + +static HRESULT WINAPI InstallCallback_QueryInterface(IBindStatusCallback *iface, + REFIID riid, void **ppv) +{ + InstallCallback *This = impl_from_IBindStatusCallback(iface); + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = &This->IBindStatusCallback_iface; + }else if(IsEqualGUID(&IID_IBindStatusCallback, riid)) { + TRACE("(%p)->(IID_IBindStatusCallback %p)\n", This, ppv); + *ppv = &This->IBindStatusCallback_iface; + }else if(IsEqualGUID(&IID_IWindowForBindingUI, riid)) { + TRACE("(%p)->(IID_IWindowForBindingUI %p)\n", This, ppv); + *ppv = &This->IWindowForBindingUI_iface; + }else { + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); return S_OK; } +static ULONG WINAPI InstallCallback_AddRef(IBindStatusCallback *iface) +{ + InstallCallback *This = impl_from_IBindStatusCallback(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + return ref; +} + +static ULONG WINAPI InstallCallback_Release(IBindStatusCallback *iface) +{ + InstallCallback *This = impl_from_IBindStatusCallback(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if(!ref) + heap_free(This); + + return ref; +} + +static HRESULT WINAPI InstallCallback_OnStartBinding(IBindStatusCallback *iface, + DWORD dwReserved, IBinding *pib) +{ + InstallCallback *This = impl_from_IBindStatusCallback(iface); + TRACE("(%p)->(%x %p)\n", This, dwReserved, pib); + return S_OK; +} + +static HRESULT WINAPI InstallCallback_GetPriority(IBindStatusCallback *iface, LONG *pnPriority) +{ + InstallCallback *This = impl_from_IBindStatusCallback(iface); + TRACE("(%p)->(%p)\n", This, pnPriority); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallCallback_OnLowResource(IBindStatusCallback *iface, DWORD dwReserved) +{ + InstallCallback *This = impl_from_IBindStatusCallback(iface); + TRACE("(%p)->(%x)\n", This, dwReserved); + return S_OK; +} + +static HRESULT WINAPI InstallCallback_OnProgress(IBindStatusCallback *iface, ULONG ulProgress, + ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText) +{ + InstallCallback *This = impl_from_IBindStatusCallback(iface); + TRACE("(%p)->(%u %u %u %s)\n", This, ulProgress, ulProgressMax, ulStatusCode, debugstr_w(szStatusText)); + return S_OK; +} + +static HRESULT WINAPI InstallCallback_OnStopBinding(IBindStatusCallback *iface, + HRESULT hresult, LPCWSTR szError) +{ + InstallCallback *This = impl_from_IBindStatusCallback(iface); + TRACE("(%p)->(%08x %s)\n", This, hresult, debugstr_w(szError)); + return S_OK; +} + +static HRESULT WINAPI InstallCallback_GetBindInfo(IBindStatusCallback *iface, + DWORD* grfBINDF, BINDINFO* pbindinfo) +{ + InstallCallback *This = impl_from_IBindStatusCallback(iface); + + TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo); + + *grfBINDF = BINDF_ASYNCHRONOUS; + return S_OK; +} + +static HRESULT WINAPI InstallCallback_OnDataAvailable(IBindStatusCallback *iface, DWORD grfBSCF, + DWORD dwSize, FORMATETC* pformatetc, STGMEDIUM* pstgmed) +{ + InstallCallback *This = impl_from_IBindStatusCallback(iface); + ERR("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI InstallCallback_OnObjectAvailable(IBindStatusCallback *iface, + REFIID riid, IUnknown* punk) +{ + InstallCallback *This = impl_from_IBindStatusCallback(iface); + ERR("(%p)\n", This); + return E_NOTIMPL; +} + +static IBindStatusCallbackVtbl InstallCallbackVtbl = { + InstallCallback_QueryInterface, + InstallCallback_AddRef, + InstallCallback_Release, + InstallCallback_OnStartBinding, + InstallCallback_GetPriority, + InstallCallback_OnLowResource, + InstallCallback_OnProgress, + InstallCallback_OnStopBinding, + InstallCallback_GetBindInfo, + InstallCallback_OnDataAvailable, + InstallCallback_OnObjectAvailable +}; + +static inline InstallCallback *impl_from_IWindowForBindingUI(IWindowForBindingUI *iface) +{ + return CONTAINING_RECORD(iface, InstallCallback, IWindowForBindingUI_iface); +} + +static HRESULT WINAPI WindowForBindingUI_QueryInterface(IWindowForBindingUI *iface, REFIID riid, void **ppv) +{ + InstallCallback *This = impl_from_IWindowForBindingUI(iface); + return IBindStatusCallback_QueryInterface(&This->IBindStatusCallback_iface, riid, ppv); +} + +static ULONG WINAPI WindowForBindingUI_AddRef(IWindowForBindingUI *iface) +{ + InstallCallback *This = impl_from_IWindowForBindingUI(iface); + return IBindStatusCallback_AddRef(&This->IBindStatusCallback_iface); +} + +static ULONG WINAPI WindowForBindingUI_Release(IWindowForBindingUI *iface) +{ + InstallCallback *This = impl_from_IWindowForBindingUI(iface); + return IBindStatusCallback_Release(&This->IBindStatusCallback_iface); +} + +static HRESULT WINAPI WindowForBindingUI_GetWindow(IWindowForBindingUI *iface, REFGUID rguidReason, HWND *phwnd) +{ + InstallCallback *This = impl_from_IWindowForBindingUI(iface); + FIXME("(%p)->(%s %p)\n", This, debugstr_guid(rguidReason), phwnd); + *phwnd = NULL; + return S_OK; +} + +static const IWindowForBindingUIVtbl WindowForBindingUIVtbl = { + WindowForBindingUI_QueryInterface, + WindowForBindingUI_AddRef, + WindowForBindingUI_Release, + WindowForBindingUI_GetWindow +}; + +typedef struct { + struct list entry; + IUri *uri; +} install_entry_t; + +static struct list install_list = LIST_INIT(install_list); + +static CRITICAL_SECTION cs_install_list; +static CRITICAL_SECTION_DEBUG cs_install_list_dbg = +{ + 0, 0, &cs_install_list, + { &cs_install_list_dbg.ProcessLocksList, &cs_install_list_dbg.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": install_list") } +}; +static CRITICAL_SECTION cs_install_list = { &cs_install_list_dbg, -1, 0, 0, 0, 0 }; + +static void install_codebase(const WCHAR *url) +{ + InstallCallback *callback; + IBindCtx *bctx; + HRESULT hres; + + callback = heap_alloc(sizeof(*callback)); + if(!callback) + return; + + callback->IBindStatusCallback_iface.lpVtbl = &InstallCallbackVtbl; + callback->IWindowForBindingUI_iface.lpVtbl = &WindowForBindingUIVtbl; + callback->ref = 1; + + hres = CreateAsyncBindCtx(0, &callback->IBindStatusCallback_iface, NULL, &bctx); + IBindStatusCallback_Release(&callback->IBindStatusCallback_iface); + if(FAILED(hres)) + return; + + hres = AsyncInstallDistributionUnit(NULL, NULL, NULL, 0, 0, url, bctx, NULL, 0); + IBindCtx_Release(bctx); + if(FAILED(hres)) + WARN("FAILED: %08x\n", hres); +} + +static void check_codebase(HTMLInnerWindow *window, nsIDOMHTMLElement *nselem) +{ + BOOL is_on_list = FALSE; + install_entry_t *iter; + const PRUnichar *val; + nsAString val_str; + IUri *uri = NULL; + nsresult nsres; + HRESULT hres; + + static const PRUnichar codebaseW[] = {'c','o','d','e','b','a','s','e',0}; + + nsres = get_elem_attr_value(nselem, codebaseW, &val_str, &val); + if(NS_SUCCEEDED(nsres)) { + if(*val) { + hres = CoInternetCombineUrlEx(window->base.outer_window->uri, val, 0, &uri, 0); + if(FAILED(hres)) + uri = NULL; + } + nsAString_Finish(&val_str); + } + + if(!uri) + return; + + EnterCriticalSection(&cs_install_list); + + LIST_FOR_EACH_ENTRY(iter, &install_list, install_entry_t, entry) { + BOOL eq; + + hres = IUri_IsEqual(uri, iter->uri, &eq); + if(SUCCEEDED(hres) && eq) { + TRACE("already proceeded\n"); + is_on_list = TRUE; + break; + } + } + + if(!is_on_list) { + iter = heap_alloc(sizeof(*iter)); + if(iter) { + IUri_AddRef(uri); + iter->uri = uri; + + list_add_tail(&install_list, &iter->entry); + } + } + + LeaveCriticalSection(&cs_install_list); + + if(!is_on_list) { + BSTR display_uri; + + hres = IUri_GetDisplayUri(uri, &display_uri); + if(SUCCEEDED(hres)) { + install_codebase(display_uri); + SysFreeString(display_uri); + } + } + + IUri_Release(uri); +} + +static IUnknown *create_activex_object(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, CLSID *clsid) +{ + IClassFactoryEx *cfex; + IClassFactory *cf; + IUnknown *obj; + DWORD policy; + HRESULT hres; + + if(!get_elem_clsid(nselem, clsid)) { + WARN("Could not determine element CLSID\n"); + return NULL; + } + + TRACE("clsid %s\n", debugstr_guid(clsid)); + + policy = 0; + hres = IInternetHostSecurityManager_ProcessUrlAction(&doc->IInternetHostSecurityManager_iface, + URLACTION_ACTIVEX_RUN, (BYTE*)&policy, sizeof(policy), (BYTE*)clsid, sizeof(GUID), 0, 0); + if(FAILED(hres) || policy != URLPOLICY_ALLOW) { + WARN("ProcessUrlAction returned %08x %x\n", hres, policy); + return NULL; + } + + hres = CoGetClassObject(clsid, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, NULL, &IID_IClassFactory, (void**)&cf); + if(hres == REGDB_E_CLASSNOTREG) + check_codebase(doc->window, nselem); + if(FAILED(hres)) + return NULL; + + hres = IClassFactory_QueryInterface(cf, &IID_IClassFactoryEx, (void**)&cfex); + if(SUCCEEDED(hres)) { + FIXME("Use IClassFactoryEx\n"); + IClassFactoryEx_Release(cfex); + } + + hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&obj); + IClassFactory_Release(cf); + if(FAILED(hres)) + return NULL; + + return obj; +} + void detach_plugin_host(PluginHost *host) { HRESULT hres; @@ -1717,14 +2067,23 @@ host->doc = NULL; } -HRESULT create_plugin_host(HTMLDocumentNode *doc, nsIDOMElement *nselem, IUnknown *unk, const CLSID *clsid, PluginHost **ret) +HRESULT create_plugin_host(HTMLDocumentNode *doc, HTMLPluginContainer *container) { PluginHost *host; - HRESULT hres; + IUnknown *unk; + CLSID clsid; + + assert(!container->plugin_host); + + unk = create_activex_object(doc, container->element.nselem, &clsid); + if(!unk) + return E_FAIL; host = heap_alloc_zero(sizeof(*host)); - if(!host) + if(!host) { + IUnknown_Release(unk); return E_OUTOFMEMORY; + } host->IOleClientSite_iface.lpVtbl = &OleClientSiteVtbl; host->IAdviseSinkEx_iface.lpVtbl = &AdviseSinkExVtbl; @@ -1737,19 +2096,16 @@ host->ref = 1; - hres = assoc_element(host, doc, nselem); - if(FAILED(hres)) { - heap_free(host); - return hres; - } - - IUnknown_AddRef(unk); host->plugin_unk = unk; - host->clsid = *clsid; + host->clsid = clsid; host->doc = doc; list_add_tail(&doc->plugin_hosts, &host->entry); - *ret = host; + container->plugin_host = host; + host->element = container; + + initialize_plugin_object(host); + return S_OK; } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/pluginhost.h wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/pluginhost.h --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/pluginhost.h 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/pluginhost.h 2014-12-15 00:45:34.000000000 +0000 @@ -60,7 +60,7 @@ extern const IID IID_HTMLPluginContainer DECLSPEC_HIDDEN; -HRESULT create_plugin_host(HTMLDocumentNode*,nsIDOMElement*,IUnknown*,const CLSID*,PluginHost**) DECLSPEC_HIDDEN; +HRESULT create_plugin_host(HTMLDocumentNode*,HTMLPluginContainer*) DECLSPEC_HIDDEN; void update_plugin_window(PluginHost*,HWND,const RECT*) DECLSPEC_HIDDEN; void detach_plugin_host(PluginHost*) DECLSPEC_HIDDEN; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/tests/activex.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/tests/activex.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/tests/activex.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/tests/activex.c 2014-12-15 00:45:34.000000000 +0000 @@ -217,6 +217,7 @@ static IOleClientSite *client_site; static IDispatch *sink_disp; static READYSTATE plugin_readystate = READYSTATE_UNINITIALIZED; +static BOOL have_container; static void set_plugin_readystate(READYSTATE state) { @@ -468,15 +469,19 @@ ok(!container->pUnkEventSink, "container->pUnkEventSink != NULL\n"); ok(container->dwAmbientFlags == (QACONTAINER_SUPPORTSMNEMONICS|QACONTAINER_MESSAGEREFLECT|QACONTAINER_USERMODE), "container->dwAmbientFlags = %x\n", container->dwAmbientFlags); - ok(!container->colorFore, "container->colorFore == 0\n"); /* FIXME */ + if(have_container) + ok(!container->colorFore, "container->colorFore = %d\n", container->colorFore); /* FIXME */ todo_wine ok(container->colorBack, "container->colorBack == 0\n"); /* FIXME */ - todo_wine - ok(container->pFont != NULL, "container->pFont == NULL\n"); + if(have_container) + todo_wine ok(container->pFont != NULL, "container->pFont == NULL\n"); + else + ok(!container->pFont, "container->pFont = %p\n", container->pFont); todo_wine ok(container->pUndoMgr != NULL, "container->pUndoMgr == NULL\n"); ok(!container->dwAppearance, "container->dwAppearance = %x\n", container->dwAppearance); - ok(!container->lcid, "container->lcid = %x\n", container->lcid); + if(have_container) + ok(!container->lcid, "container->lcid = %x\n", container->lcid); ok(!container->hpal, "container->hpal = %p\n", container->hpal); ok(!container->pBindHost, "container->pBindHost != NULL\n"); ok(!container->pOleControlSite, "container->pOleControlSite != NULL\n"); @@ -2366,6 +2371,7 @@ activex_refcnt = 0; no_quickact = behavior == TEST_NOQUICKACT || behavior == TEST_DISPONLY; + have_container = TRUE; } static void test_event_call(void) @@ -2594,6 +2600,73 @@ release_doc(doc); } +static void test_exec_script(IHTMLDocument2 *doc, const char *codea, const char *langa) +{ + IHTMLWindow2 *window; + BSTR code, lang; + VARIANT v; + HRESULT hres; + + hres = IHTMLDocument2_get_parentWindow(doc, &window); + ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres); + + code = a2bstr(codea); + lang = a2bstr(langa); + + hres = IHTMLWindow2_execScript(window, code, lang, &v); + ok(hres == S_OK, "execScript failed: %08x\n", hres); + SysFreeString(lang); + VariantClear(&v); + + IHTMLWindow2_Release(window); +} + +static void test_create_element(void) +{ + IHTMLDocument2 *doc; + + init_test(TEST_FLASH); + + doc = create_doc(""); + + have_container = FALSE; + + SET_EXPECT(CreateInstance); + SET_EXPECT(FreezeEvents_TRUE); + SET_EXPECT(QuickActivate); + SET_EXPECT(IPersistPropertyBag_InitNew); + SET_EXPECT(Invoke_READYSTATE); + SET_EXPECT(FreezeEvents_FALSE); + + test_exec_script(doc, + "var test_elem = document.createElement('object');" + "test_elem.classid = 'CLSID:178fc163-f585-4e24-9c13-4bb7f6680746';", + "javascript"); + + CHECK_CALLED(CreateInstance); + todo_wine CHECK_CALLED(FreezeEvents_TRUE); + CHECK_CALLED(QuickActivate); + CHECK_CALLED(IPersistPropertyBag_InitNew); + CHECK_CALLED(Invoke_READYSTATE); + todo_wine CHECK_CALLED(FreezeEvents_FALSE); + + have_container = TRUE; + + SET_EXPECT(DoVerb); + test_exec_script(doc, + "document.body.appendChild(test_elem);", + "javascript"); + todo_wine CHECK_CALLED(DoVerb); + + SET_EXPECT(InPlaceDeactivate); + SET_EXPECT(Close); + SET_EXPECT(SetClientSite_NULL); + release_doc(doc); + todo_wine CHECK_CALLED(InPlaceDeactivate); + CHECK_CALLED(Close); + CHECK_CALLED(SetClientSite_NULL); +} + static LRESULT WINAPI wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { return DefWindowProcW(hwnd, msg, wParam, lParam); @@ -2730,6 +2803,8 @@ test_nooleobj_ax(); trace("Testing event object binding...\n"); test_event_binding(); + trace("Testing createElement(object)...\n"); + test_create_element(); init_registry(FALSE); }else { skip("Could not register ActiveX\n"); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/tests/events.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/tests/events.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/tests/events.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/tests/events.c 2014-12-15 00:45:34.000000000 +0000 @@ -98,7 +98,6 @@ } xy_test_t; static const xy_test_t no_xy = {-10,-10,-10,-10}; -static const xy_test_t zero_xy = {0,0,0,0}; static const char empty_doc_str[] = ""; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/tests/jstest.html wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/tests/jstest.html --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/tests/jstest.html 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/tests/jstest.html 2014-12-15 00:45:34.000000000 +0000 @@ -148,12 +148,16 @@ x = input.getAttribute("style"); ok(x === s, "getAttribute('style') = " + x); ok(s.cssText === "", "s.cssText = " + s.cssText); + x = input.getAttribute("style", 2); + ok(x === "", "getAttribute('style') = " + x); input.setAttribute("style", "display: none"); x = input.getAttribute("style"); ok(x === s, "getAttribute('style') = " + x); ok(s.cssText === "", "s.cssText = " + s.cssText); ok(s.display === "", "s.display = " + s.display); + x = input.getAttribute("style", 2); + ok(x === "", "getAttribute('style') = " + x); s.display = "none"; ok(s.cssText != "", "s.cssText = " + s.cssText); @@ -163,6 +167,8 @@ ok(x === s, "getAttribute('style') = " + x); ok(s.cssText != "", "s.cssText = " + s.cssText); ok(s.display === "none", "s.display = " + s.display); + x = input.getAttribute("style", 2); + ok(x === "", "getAttribute('style') = " + x); input.setAttribute("style", null); x = input.getAttribute("style"); @@ -173,11 +179,15 @@ x = input.getAttribute("fireEvent"); ok(x === input.fireEvent, "input.getAttribute('fireEvent') = " + x); + x = input.getAttribute("fireEvent", 2); + ok(x === "", "getAttribute('fireEvent') = " + x); input.setAttribute("fireEvent", 3); ok(input.fireEvent === 3, "input.fireEvent = " + input.fireEvent); x = input.getAttribute("fireEvent"); ok(x === 3, "input.getAttribute('fireEvent') = " + x); + x = input.getAttribute("fireEvent", 2); + ok(x === "3", "getAttribute('fireEvent') = " + x); b = input.removeAttribute("style"); ok(b === true, "removeAttribute('style') failed"); @@ -186,6 +196,8 @@ ok(x === s, "getAttribute('style') = " + x); ok(s.display === "", "s.display = " + s.display); ok(s.cssText === "", "s.cssText = " + s.cssText); + x = input.getAttribute("style", 2); + ok(x === "", "getAttribute('style') = " + x); b = input.removeAttribute("style"); ok(b === true, "removeAttribute('style') failed"); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/tests/style.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/tests/style.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/mshtml/tests/style.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/mshtml/tests/style.c 2014-12-15 00:45:34.000000000 +0000 @@ -823,6 +823,16 @@ ok(!strcmp_wa(str, "900"), "str != style900\n"); SysFreeString(str); + str = a2bstr(""); + hres = IHTMLStyle_put_fontWeight(style, str); + ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres); + SysFreeString(str); + + hres = IHTMLStyle_get_fontWeight(style, &str); + ok(hres == S_OK, "get_fontWeight failed: %08x\n", hres); + ok(!str, "str != NULL\n"); + SysFreeString(str); + hres = IHTMLStyle_put_fontWeight(style, sDefault); ok(hres == S_OK, "put_fontWeight failed: %08x\n", hres); SysFreeString(sDefault); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msi/action.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/msi/action.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msi/action.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msi/action.c 2014-12-15 00:45:34.000000000 +0000 @@ -2423,7 +2423,6 @@ sprintfW( buf, fmtW, free.QuadPart / 512 ); msi_set_property( package->db, szPrimaryVolumeSpaceAvailable, buf, -1 ); } - toupperW( primary_folder[0] ); msi_set_property( package->db, szPrimaryVolumePath, primary_folder, 2 ); } msi_free( primary_folder ); @@ -5952,24 +5951,21 @@ if (!comp) return ERROR_SUCCESS; + event = MSI_RecordGetInteger( rec, 3 ); + deformat_string( package, MSI_RecordGetString( rec, 2 ), &name ); + comp->Action = msi_get_component_action( package, comp ); - if (comp->Action != INSTALLSTATE_LOCAL) + if (!(comp->Action == INSTALLSTATE_LOCAL && (event & msidbServiceControlEventStart)) && + !(comp->Action == INSTALLSTATE_ABSENT && (event & msidbServiceControlEventUninstallStart))) { - TRACE("component not scheduled for installation %s\n", debugstr_w(component)); + TRACE("not starting %s\n", debugstr_w(name)); + msi_free( name ); return ERROR_SUCCESS; } - deformat_string(package, MSI_RecordGetString(rec, 2), &name); deformat_string(package, MSI_RecordGetString(rec, 4), &args); - event = MSI_RecordGetInteger(rec, 3); wait = MSI_RecordGetInteger(rec, 5); - if (!(event & msidbServiceControlEventStart)) - { - r = ERROR_SUCCESS; - goto done; - } - scm = OpenSCManagerW(NULL, NULL, SC_MANAGER_CONNECT); if (!scm) { @@ -6159,23 +6155,24 @@ MSICOMPONENT *comp; MSIRECORD *uirow; LPCWSTR component; - LPWSTR name = NULL, display_name = NULL; + WCHAR *name, *display_name = NULL; DWORD event, len; SC_HANDLE scm; - event = MSI_RecordGetInteger( rec, 3 ); - if (!(event & msidbServiceControlEventStop)) - return ERROR_SUCCESS; - component = MSI_RecordGetString( rec, 6 ); comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; + event = MSI_RecordGetInteger( rec, 3 ); + deformat_string( package, MSI_RecordGetString( rec, 2 ), &name ); + comp->Action = msi_get_component_action( package, comp ); - if (comp->Action != INSTALLSTATE_ABSENT) + if (!(comp->Action == INSTALLSTATE_LOCAL && (event & msidbServiceControlEventStop)) && + !(comp->Action == INSTALLSTATE_ABSENT && (event & msidbServiceControlEventUninstallStop))) { - TRACE("component not scheduled for removal %s\n", debugstr_w(component)); + TRACE("not stopping %s\n", debugstr_w(name)); + msi_free( name ); return ERROR_SUCCESS; } @@ -6195,7 +6192,6 @@ } CloseServiceHandle( scm ); - deformat_string( package, MSI_RecordGetString( rec, 2 ), &name ); stop_service( name ); done: diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msi/registry.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/msi/registry.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msi/registry.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msi/registry.c 2014-12-15 00:45:34.000000000 +0000 @@ -100,12 +100,6 @@ '%','s','\\','P','r','o','d','u','c','t','s','\\','%','s','\\', 'I','n','s','t','a','l','l','P','r','o','p','e','r','t','i','e','s',0}; -static const WCHAR szInstaller_LocalManaged_fmt[] = { - 'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', - 'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', - 'I','n','s','t','a','l','l','e','r','\\','M','a','n','a','g','e','d','\\','%','s','\\', - 'I','n','s','t','a','l','l','e','r','\\','P','r','o','d','u','c','t','s',0}; - static const WCHAR szInstaller_LocalManagedProd_fmt[] = { 'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', 'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', @@ -128,11 +122,6 @@ 'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', 'I','n','s','t','a','l','l','e','r','\\','P','a','t','c','h','e','s',0}; -static const WCHAR szInstaller_Components[] = { - 'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', - 'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', - 'I','n','s','t','a','l','l','e','r','\\','C','o','m','p','o','n','e','n','t','s',0}; - static const WCHAR szInstaller_LocalClassesProducts[] = { 'S','o','f','t','w','a','r','e','\\','C','l','a','s','s','e','s','\\', 'I','n','s','t','a','l','l','e','r','\\','P','r','o','d','u','c','t','s',0}; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msi/tests/action.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/msi/tests/action.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msi/tests/action.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msi/tests/action.c 2014-12-15 00:45:34.000000000 +0000 @@ -247,7 +247,10 @@ "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n" "s72\tl255\ti2\tL255\tI2\ts72\n" "ServiceControl\tServiceControl\n" - "ServiceControl\tSpooler\t1\t\t0\tservice_comp"; + "ServiceControl\tSpooler\t1\t\t1\tservice_comp\n" + "ServiceControl2\tSpooler\t2\t\t1\tservice_comp\n" + "ServiceControl3\tSpooler\t16\t\t1\tservice_comp\n" + "ServiceControl4\tSpooler\t32\t\t1\tservice_comp\n"; static const char sss_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" @@ -260,11 +263,15 @@ "CostFinalize\t\t1000\n" "InstallValidate\t\t1400\n" "InstallInitialize\t\t1500\n" + "StopServices\t\t4000\n" "DeleteServices\t\t5000\n" "MoveFiles\t\t5100\n" "InstallFiles\t\t5200\n" "DuplicateFiles\t\t5300\n" "StartServices\t\t5400\n" + "RegisterProduct\t\t5500\n" + "PublishFeatures\t\t5600\n" + "PublishProduct\t\t5700\n" "InstallFinalize\t\t6000\n"; static const char sds_install_exec_seq_dat[] = @@ -5310,7 +5317,7 @@ DeleteFileA(msifile); } -static void test_start_services(void) +static void test_start_stop_services(void) { UINT r; SC_HANDLE scm, service; @@ -5359,6 +5366,23 @@ r = MsiInstallProductA(msifile, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + if (error == ERROR_SUCCESS) + { + SERVICE_STATUS status; + + scm = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS); + service = OpenServiceA(scm, "Spooler", SC_MANAGER_ALL_ACCESS); + + ret = ControlService(service, SERVICE_CONTROL_STOP, &status); + ok(ret, "ControlService failed %u\n", GetLastError()); + + CloseServiceHandle(service); + CloseServiceHandle(scm); + } + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); @@ -5373,9 +5397,6 @@ ok(delete_pf("msitest\\service2.exe", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "Directory not created\n"); - delete_test_files(); - DeleteFileA(msifile); - if (error == ERROR_SUCCESS) { SERVICE_STATUS status; @@ -5389,6 +5410,9 @@ CloseServiceHandle(service); CloseServiceHandle(scm); } + + delete_test_files(); + DeleteFileA(msifile); } static void test_delete_services(void) @@ -6869,7 +6893,7 @@ test_write_registry_values(); test_envvar(); test_create_remove_folder(); - test_start_services(); + test_start_stop_services(); test_delete_services(); test_install_services(); test_self_registration(); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msi/tests/install.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/msi/tests/install.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msi/tests/install.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msi/tests/install.c 2014-12-15 00:45:34.000000000 +0000 @@ -563,35 +563,11 @@ "2\t2\t\ttest2.cab\tDISK2\t\n" "3\t12\t\ttest3.cab\tDISK3\t\n"; -static const CHAR ci_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "CostFinalize\t\t1000\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "InstallFiles\t\t4000\n" - "InstallServices\t\t5000\n" - "InstallFinalize\t\t6600\n" - "InstallInitialize\t\t1500\n" - "RunInstall\t\t1600\n" - "InstallValidate\t\t1400\n" - "LaunchConditions\t\t100"; - -static const CHAR ci_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" - "s72\ti2\tS64\tS0\tS255\n" - "CustomAction\tAction\n" - "RunInstall\t87\tmsitest\\concurrent.msi\tMYPROP=[UILevel]\t\n"; - static const CHAR ci_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" "s72\tS38\ts72\ti2\tS255\tS72\n" "Component\tComponent\n" "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\tUILevel=5\tmaximus\n"; -static const CHAR ci2_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "augustus\t\tMSITESTDIR\t0\tUILevel=3 AND MYPROP=5\taugustus\n"; - static const CHAR ci2_feature_comp_dat[] = "Feature_\tComponent_\n" "s38\ts72\n" "FeatureComponents\tFeature_\tComponent_\n" @@ -659,13 +635,6 @@ "Component\tComponent\n" "augustus\t\tMSITESTDIR\t0\tMYPROP=2718 and MyProp=42\taugustus\n"; -static const CHAR rem_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "hydrogen\thydrogen\thydrogen\t0\t\t\t8192\t1\n" - "helium\thelium\thelium\t0\t\t\t8192\t1\n" - "lithium\tlithium\tlithium\t0\t\t\t8192\t1"; - static const CHAR rem_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" "s72\tS255\tI2\n" "InstallExecuteSequence\tAction\n" @@ -1543,31 +1512,6 @@ ADD_TABLE(property), }; -static const msi_table ci_tables[] = -{ - ADD_TABLE(ci_component), - ADD_TABLE(directory), - ADD_TABLE(rof_feature), - ADD_TABLE(rof_feature_comp), - ADD_TABLE(rof_file), - ADD_TABLE(ci_install_exec_seq), - ADD_TABLE(rof_media), - ADD_TABLE(property), - ADD_TABLE(ci_custom_action), -}; - -static const msi_table ci2_tables[] = -{ - ADD_TABLE(ci2_component), - ADD_TABLE(directory), - ADD_TABLE(rof_feature), - ADD_TABLE(ci2_feature_comp), - ADD_TABLE(ci2_file), - ADD_TABLE(install_exec_seq), - ADD_TABLE(rof_media), - ADD_TABLE(property), -}; - static const msi_table tp_tables[] = { ADD_TABLE(tp_component), diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msrle32/msrle32.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/msrle32/msrle32.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msrle32/msrle32.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msrle32/msrle32.c 2014-12-15 00:45:34.000000000 +0000 @@ -36,13 +36,10 @@ #define compare_fourcc(fcc1, fcc2) (((fcc1)^(fcc2))&~0x20202020) -#define ABS(a) ((a) < 0 ? -(a) : (a)) -#define SQR(a) ((a) * (a)) - static inline WORD ColorCmp(WORD clr1, WORD clr2) { UINT a = clr1 - clr2; - return SQR(a); + return a * a; } static inline WORD Intensity(RGBQUAD clr) { diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcp120_app/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcp120_app/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcp120_app/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcp120_app/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = msvcp120_app.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcp120_app/msvcp120_app.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcp120_app/msvcp120_app.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcp120_app/msvcp120_app.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcp120_app/msvcp120_app.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,3846 @@ +@ stub -arch=arm ??$_Getvals@_W@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAAX_WABV_Locinfo@1@@Z +@ stub -arch=i386 ??$_Getvals@_W@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEX_WABV_Locinfo@1@@Z +@ stub -arch=win64 ??$_Getvals@_W@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAX_WAEBV_Locinfo@1@@Z +@ stub -arch=arm ??$_Getvals@_W@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAAX_WABV_Locinfo@1@@Z +@ stub -arch=i386 ??$_Getvals@_W@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEX_WABV_Locinfo@1@@Z +@ stub -arch=win64 ??$_Getvals@_W@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAX_WAEBV_Locinfo@1@@Z +@ stub -arch=arm ??$_Getvals@_W@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAAX_WABV_Locinfo@1@@Z +@ stub -arch=i386 ??$_Getvals@_W@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEX_WABV_Locinfo@1@@Z +@ stub -arch=win64 ??$_Getvals@_W@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAX_WAEBV_Locinfo@1@@Z +@ cdecl -arch=arm ??0?$_Yarn@D@std@@QAA@ABV01@@Z(ptr ptr) msvcp120.??0?$_Yarn@D@std@@QAA@ABV01@@Z +@ thiscall -arch=i386 ??0?$_Yarn@D@std@@QAE@ABV01@@Z(ptr ptr) msvcp120.??0?$_Yarn@D@std@@QAE@ABV01@@Z +@ cdecl -arch=win64 ??0?$_Yarn@D@std@@QEAA@AEBV01@@Z(ptr ptr) msvcp120.??0?$_Yarn@D@std@@QEAA@AEBV01@@Z +@ cdecl -arch=arm ??0?$_Yarn@D@std@@QAA@PBD@Z(ptr str) msvcp120.??0?$_Yarn@D@std@@QAA@PBD@Z +@ thiscall -arch=i386 ??0?$_Yarn@D@std@@QAE@PBD@Z(ptr str) msvcp120.??0?$_Yarn@D@std@@QAE@PBD@Z +@ cdecl -arch=win64 ??0?$_Yarn@D@std@@QEAA@PEBD@Z(ptr str) msvcp120.??0?$_Yarn@D@std@@QEAA@PEBD@Z +@ cdecl -arch=arm ??0?$_Yarn@D@std@@QAA@XZ(ptr) msvcp120.??0?$_Yarn@D@std@@QAA@XZ +@ thiscall -arch=i386 ??0?$_Yarn@D@std@@QAE@XZ(ptr) msvcp120.??0?$_Yarn@D@std@@QAE@XZ +@ cdecl -arch=win64 ??0?$_Yarn@D@std@@QEAA@XZ(ptr) msvcp120.??0?$_Yarn@D@std@@QEAA@XZ +@ stub -arch=arm ??0?$_Yarn@_W@std@@QAA@XZ +@ stub -arch=i386 ??0?$_Yarn@_W@std@@QAE@XZ +@ stub -arch=win64 ??0?$_Yarn@_W@std@@QEAA@XZ +@ cdecl -arch=arm ??0?$basic_ios@DU?$char_traits@D@std@@@std@@IAA@XZ(ptr) msvcp120.??0?$basic_ios@DU?$char_traits@D@std@@@std@@IAA@XZ +@ thiscall -arch=i386 ??0?$basic_ios@DU?$char_traits@D@std@@@std@@IAE@XZ(ptr) msvcp120.??0?$basic_ios@DU?$char_traits@D@std@@@std@@IAE@XZ +@ cdecl -arch=win64 ??0?$basic_ios@DU?$char_traits@D@std@@@std@@IEAA@XZ(ptr) msvcp120.??0?$basic_ios@DU?$char_traits@D@std@@@std@@IEAA@XZ +@ cdecl -arch=arm ??0?$basic_ios@DU?$char_traits@D@std@@@std@@QAA@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z(ptr ptr) msvcp120.??0?$basic_ios@DU?$char_traits@D@std@@@std@@QAA@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z +@ thiscall -arch=i386 ??0?$basic_ios@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z(ptr ptr) msvcp120.??0?$basic_ios@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z +@ cdecl -arch=win64 ??0?$basic_ios@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z(ptr ptr) msvcp120.??0?$basic_ios@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z +@ cdecl -arch=arm ??0?$basic_ios@GU?$char_traits@G@std@@@std@@IAA@XZ(ptr) msvcp120.??0?$basic_ios@GU?$char_traits@G@std@@@std@@IAA@XZ +@ thiscall -arch=i386 ??0?$basic_ios@GU?$char_traits@G@std@@@std@@IAE@XZ(ptr) msvcp120.??0?$basic_ios@GU?$char_traits@G@std@@@std@@IAE@XZ +@ cdecl -arch=win64 ??0?$basic_ios@GU?$char_traits@G@std@@@std@@IEAA@XZ(ptr) msvcp120.??0?$basic_ios@GU?$char_traits@G@std@@@std@@IEAA@XZ +@ cdecl -arch=arm ??0?$basic_ios@GU?$char_traits@G@std@@@std@@QAA@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z(ptr ptr) msvcp120.??0?$basic_ios@GU?$char_traits@G@std@@@std@@QAA@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z +@ thiscall -arch=i386 ??0?$basic_ios@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z(ptr ptr) msvcp120.??0?$basic_ios@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z +@ cdecl -arch=win64 ??0?$basic_ios@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z(ptr ptr) msvcp120.??0?$basic_ios@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z +@ cdecl -arch=arm ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAA@XZ(ptr) msvcp120.??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAA@XZ +@ thiscall -arch=i386 ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAE@XZ(ptr) msvcp120.??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAE@XZ +@ cdecl -arch=win64 ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IEAA@XZ(ptr) msvcp120.??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IEAA@XZ +@ cdecl -arch=arm ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAA@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z(ptr ptr) msvcp120.??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAA@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z +@ thiscall -arch=i386 ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z(ptr ptr) msvcp120.??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z +@ cdecl -arch=win64 ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z(ptr ptr) msvcp120.??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z +@ stub -arch=arm ??0?$basic_iostream@DU?$char_traits@D@std@@@std@@IAA@$$QAV01@@Z +@ stub -arch=i386 ??0?$basic_iostream@DU?$char_traits@D@std@@@std@@IAE@$$QAV01@@Z +@ stub -arch=win64 ??0?$basic_iostream@DU?$char_traits@D@std@@@std@@IEAA@$$QEAV01@@Z +@ cdecl -arch=arm ??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QAA@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z(ptr ptr long) msvcp120.??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QAA@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z +@ thiscall -arch=i386 ??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z(ptr ptr long) msvcp120.??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z +@ cdecl -arch=win64 ??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z(ptr ptr long) msvcp120.??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z +@ stub -arch=arm ??0?$basic_iostream@GU?$char_traits@G@std@@@std@@IAA@$$QAV01@@Z +@ stub -arch=i386 ??0?$basic_iostream@GU?$char_traits@G@std@@@std@@IAE@$$QAV01@@Z +@ stub -arch=win64 ??0?$basic_iostream@GU?$char_traits@G@std@@@std@@IEAA@$$QEAV01@@Z +@ cdecl -arch=arm ??0?$basic_iostream@GU?$char_traits@G@std@@@std@@QAA@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z(ptr ptr long) msvcp120.??0?$basic_iostream@GU?$char_traits@G@std@@@std@@QAA@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z +@ thiscall -arch=i386 ??0?$basic_iostream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z(ptr ptr long) msvcp120.??0?$basic_iostream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z +@ cdecl -arch=win64 ??0?$basic_iostream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z(ptr ptr long) msvcp120.??0?$basic_iostream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z +@ stub -arch=arm ??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IAA@$$QAV01@@Z +@ stub -arch=i386 ??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IAE@$$QAV01@@Z +@ stub -arch=win64 ??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IEAA@$$QEAV01@@Z +@ cdecl -arch=arm ??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAA@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z(ptr ptr long) msvcp120.??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAA@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z +@ thiscall -arch=i386 ??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z(ptr ptr long) msvcp120.??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z +@ cdecl -arch=win64 ??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z(ptr ptr long) msvcp120.??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z +@ stub -arch=arm ??0?$basic_istream@DU?$char_traits@D@std@@@std@@IAA@$$QAV01@@Z +@ stub -arch=i386 ??0?$basic_istream@DU?$char_traits@D@std@@@std@@IAE@$$QAV01@@Z +@ stub -arch=win64 ??0?$basic_istream@DU?$char_traits@D@std@@@std@@IEAA@$$QEAV01@@Z +@ cdecl -arch=arm ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAA@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z(ptr ptr long long long) msvcp120.??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAA@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z +@ thiscall -arch=i386 ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z(ptr ptr long long long) msvcp120.??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z +@ cdecl -arch=win64 ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z(ptr ptr long long long) msvcp120.??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z +@ cdecl -arch=arm ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAA@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAA@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z +@ thiscall -arch=i386 ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z +@ cdecl -arch=win64 ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z +@ cdecl -arch=arm ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAA@W4_Uninitialized@1@@Z(ptr long long) msvcp120.??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAA@W4_Uninitialized@1@@Z +@ thiscall -arch=i386 ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@W4_Uninitialized@1@@Z(ptr long long) msvcp120.??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@W4_Uninitialized@1@@Z +@ cdecl -arch=win64 ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@@Z(ptr long long) msvcp120.??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@@Z +@ stub -arch=arm ??0?$basic_istream@GU?$char_traits@G@std@@@std@@IAA@$$QAV01@@Z +@ stub -arch=i386 ??0?$basic_istream@GU?$char_traits@G@std@@@std@@IAE@$$QAV01@@Z +@ stub -arch=win64 ??0?$basic_istream@GU?$char_traits@G@std@@@std@@IEAA@$$QEAV01@@Z +@ cdecl -arch=arm ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAA@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N1@Z(ptr ptr long long long) msvcp120.??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAA@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N1@Z +@ thiscall -arch=i386 ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N1@Z(ptr ptr long long long) msvcp120.??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N1@Z +@ cdecl -arch=win64 ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N1@Z(ptr ptr long long long) msvcp120.??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N1@Z +@ cdecl -arch=arm ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAA@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAA@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z +@ thiscall -arch=i386 ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z +@ cdecl -arch=win64 ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z +@ cdecl -arch=arm ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAA@W4_Uninitialized@1@@Z(ptr long long) msvcp120.??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAA@W4_Uninitialized@1@@Z +@ thiscall -arch=i386 ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@W4_Uninitialized@1@@Z(ptr long long) msvcp120.??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@W4_Uninitialized@1@@Z +@ cdecl -arch=win64 ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@@Z(ptr long long) msvcp120.??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@@Z +@ stub -arch=arm ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@IAA@$$QAV01@@Z +@ stub -arch=i386 ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@IAE@$$QAV01@@Z +@ stub -arch=win64 ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@IEAA@$$QEAV01@@Z +@ cdecl -arch=arm ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAA@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z(ptr ptr long long long) msvcp120.??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAA@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z +@ thiscall -arch=i386 ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z(ptr ptr long long long) msvcp120.??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z +@ cdecl -arch=win64 ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z(ptr ptr long long long) msvcp120.??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z +@ cdecl -arch=arm ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAA@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAA@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z +@ thiscall -arch=i386 ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z +@ cdecl -arch=win64 ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z +@ cdecl -arch=arm ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAA@W4_Uninitialized@1@@Z(ptr long long) msvcp120.??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAA@W4_Uninitialized@1@@Z +@ thiscall -arch=i386 ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@W4_Uninitialized@1@@Z(ptr long long) msvcp120.??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@W4_Uninitialized@1@@Z +@ cdecl -arch=win64 ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@@Z(ptr long long) msvcp120.??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@@Z +@ stub -arch=arm ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@IAA@$$QAV01@@Z +@ stub -arch=i386 ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@IAE@$$QAV01@@Z +@ stub -arch=win64 ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@IEAA@$$QEAV01@@Z +@ cdecl -arch=arm ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAA@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAA@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z +@ thiscall -arch=i386 ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z +@ cdecl -arch=win64 ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z +@ cdecl -arch=arm ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAA@W4_Uninitialized@1@_N@Z(ptr long long long) msvcp120.??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAA@W4_Uninitialized@1@_N@Z +@ thiscall -arch=i386 ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@W4_Uninitialized@1@_N@Z(ptr long long long) msvcp120.??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@W4_Uninitialized@1@_N@Z +@ cdecl -arch=win64 ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z(ptr long long long) msvcp120.??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z +@ stub -arch=arm ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@IAA@$$QAV01@@Z +@ stub -arch=i386 ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@IAE@$$QAV01@@Z +@ stub -arch=win64 ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@IEAA@$$QEAV01@@Z +@ cdecl -arch=arm ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QAA@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QAA@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z +@ thiscall -arch=i386 ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z +@ cdecl -arch=win64 ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z +@ cdecl -arch=arm ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QAA@W4_Uninitialized@1@_N@Z(ptr long long long) msvcp120.??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QAA@W4_Uninitialized@1@_N@Z +@ thiscall -arch=i386 ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE@W4_Uninitialized@1@_N@Z(ptr long long long) msvcp120.??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE@W4_Uninitialized@1@_N@Z +@ cdecl -arch=win64 ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z(ptr long long long) msvcp120.??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z +@ stub -arch=arm ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IAA@$$QAV01@@Z +@ stub -arch=i386 ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IAE@$$QAV01@@Z +@ stub -arch=win64 ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IEAA@$$QEAV01@@Z +@ cdecl -arch=arm ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAA@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAA@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z +@ thiscall -arch=i386 ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z +@ cdecl -arch=win64 ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z(ptr ptr long long) msvcp120.??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z +@ cdecl -arch=arm ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAA@W4_Uninitialized@1@_N@Z(ptr long long long) msvcp120.??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAA@W4_Uninitialized@1@_N@Z +@ thiscall -arch=i386 ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE@W4_Uninitialized@1@_N@Z(ptr long long long) msvcp120.??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE@W4_Uninitialized@1@_N@Z +@ cdecl -arch=win64 ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z(ptr long long long) msvcp120.??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z +@ stub -arch=arm ??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAA@ABV01@@Z +@ stub -arch=i386 ??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAE@ABV01@@Z +@ stub -arch=win64 ??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@AEBV01@@Z +@ cdecl -arch=arm ??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAA@W4_Uninitialized@1@@Z(ptr long) msvcp120.??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAA@W4_Uninitialized@1@@Z +@ thiscall -arch=i386 ??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAE@W4_Uninitialized@1@@Z(ptr long) msvcp120.??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAE@W4_Uninitialized@1@@Z +@ cdecl -arch=win64 ??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@W4_Uninitialized@1@@Z(ptr long) msvcp120.??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@W4_Uninitialized@1@@Z +@ cdecl -arch=arm ??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAA@XZ(ptr) msvcp120.??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAA@XZ +@ thiscall -arch=i386 ??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAE@XZ(ptr) msvcp120.??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAE@XZ +@ cdecl -arch=win64 ??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@XZ(ptr) msvcp120.??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@XZ +@ stub -arch=arm ??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAA@ABV01@@Z +@ stub -arch=i386 ??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAE@ABV01@@Z +@ stub -arch=win64 ??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAA@AEBV01@@Z +@ cdecl -arch=arm ??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAA@W4_Uninitialized@1@@Z(ptr long) msvcp120.??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAA@W4_Uninitialized@1@@Z +@ thiscall -arch=i386 ??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAE@W4_Uninitialized@1@@Z(ptr long) msvcp120.??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAE@W4_Uninitialized@1@@Z +@ cdecl -arch=win64 ??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAA@W4_Uninitialized@1@@Z(ptr long) msvcp120.??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAA@W4_Uninitialized@1@@Z +@ cdecl -arch=arm ??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAA@XZ(ptr) msvcp120.??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAA@XZ +@ thiscall -arch=i386 ??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAE@XZ(ptr) msvcp120.??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAE@XZ +@ cdecl -arch=win64 ??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAA@XZ(ptr) msvcp120.??0?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAA@XZ +@ stub -arch=arm ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAA@ABV01@@Z +@ stub -arch=i386 ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAE@ABV01@@Z +@ stub -arch=win64 ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@AEBV01@@Z +@ cdecl -arch=arm ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAA@W4_Uninitialized@1@@Z(ptr long) msvcp120.??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAA@W4_Uninitialized@1@@Z +@ thiscall -arch=i386 ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAE@W4_Uninitialized@1@@Z(ptr long) msvcp120.??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAE@W4_Uninitialized@1@@Z +@ cdecl -arch=win64 ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@W4_Uninitialized@1@@Z(ptr long) msvcp120.??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@W4_Uninitialized@1@@Z +@ cdecl -arch=arm ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAA@XZ(ptr) msvcp120.??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAA@XZ +@ thiscall -arch=i386 ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAE@XZ(ptr) msvcp120.??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAE@XZ +@ cdecl -arch=win64 ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@XZ(ptr) msvcp120.??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@XZ +@ cdecl -arch=arm ??0?$codecvt@DDH@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$codecvt@DDH@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$codecvt@DDH@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$codecvt@DDH@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$codecvt@DDH@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$codecvt@DDH@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$codecvt@DDH@std@@QAA@I@Z(ptr long) msvcp120.??0?$codecvt@DDH@std@@QAA@I@Z +@ thiscall -arch=i386 ??0?$codecvt@DDH@std@@QAE@I@Z(ptr long) msvcp120.??0?$codecvt@DDH@std@@QAE@I@Z +@ cdecl -arch=win64 ??0?$codecvt@DDH@std@@QEAA@_K@Z(ptr long) msvcp120.??0?$codecvt@DDH@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0?$codecvt@GDH@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$codecvt@GDH@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$codecvt@GDH@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$codecvt@GDH@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$codecvt@GDH@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$codecvt@GDH@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$codecvt@GDH@std@@QAA@I@Z(ptr long) msvcp120.??0?$codecvt@GDH@std@@QAA@I@Z +@ thiscall -arch=i386 ??0?$codecvt@GDH@std@@QAE@I@Z(ptr long) msvcp120.??0?$codecvt@GDH@std@@QAE@I@Z +@ cdecl -arch=win64 ??0?$codecvt@GDH@std@@QEAA@_K@Z(ptr long) msvcp120.??0?$codecvt@GDH@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0?$codecvt@_WDH@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$codecvt@_WDH@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$codecvt@_WDH@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$codecvt@_WDH@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$codecvt@_WDH@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$codecvt@_WDH@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$codecvt@_WDH@std@@QAA@I@Z(ptr long) msvcp120.??0?$codecvt@_WDH@std@@QAA@I@Z +@ thiscall -arch=i386 ??0?$codecvt@_WDH@std@@QAE@I@Z(ptr long) msvcp120.??0?$codecvt@_WDH@std@@QAE@I@Z +@ cdecl -arch=win64 ??0?$codecvt@_WDH@std@@QEAA@_K@Z(ptr long) msvcp120.??0?$codecvt@_WDH@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0?$ctype@D@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$ctype@D@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$ctype@D@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$ctype@D@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$ctype@D@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$ctype@D@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$ctype@D@std@@QAA@PBF_NI@Z(ptr ptr long long) msvcp120.??0?$ctype@D@std@@QAA@PBF_NI@Z +@ thiscall -arch=i386 ??0?$ctype@D@std@@QAE@PBF_NI@Z(ptr ptr long long) msvcp120.??0?$ctype@D@std@@QAE@PBF_NI@Z +@ cdecl -arch=win64 ??0?$ctype@D@std@@QEAA@PEBF_N_K@Z(ptr ptr long long) msvcp120.??0?$ctype@D@std@@QEAA@PEBF_N_K@Z +@ cdecl -arch=arm ??0?$ctype@G@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$ctype@G@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$ctype@G@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$ctype@G@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$ctype@G@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$ctype@G@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$ctype@G@std@@QAA@I@Z(ptr long) msvcp120.??0?$ctype@G@std@@QAA@I@Z +@ thiscall -arch=i386 ??0?$ctype@G@std@@QAE@I@Z(ptr long) msvcp120.??0?$ctype@G@std@@QAE@I@Z +@ cdecl -arch=win64 ??0?$ctype@G@std@@QEAA@_K@Z(ptr long) msvcp120.??0?$ctype@G@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0?$ctype@_W@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$ctype@_W@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$ctype@_W@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$ctype@_W@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$ctype@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$ctype@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$ctype@_W@std@@QAA@I@Z(ptr long) msvcp120.??0?$ctype@_W@std@@QAA@I@Z +@ thiscall -arch=i386 ??0?$ctype@_W@std@@QAE@I@Z(ptr long) msvcp120.??0?$ctype@_W@std@@QAE@I@Z +@ cdecl -arch=win64 ??0?$ctype@_W@std@@QEAA@_K@Z(ptr long) msvcp120.??0?$ctype@_W@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAA@I@Z(ptr long) msvcp120.??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAA@I@Z +@ thiscall -arch=i386 ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z(ptr long) msvcp120.??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z +@ cdecl -arch=win64 ??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z(ptr long) msvcp120.??0?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAA@I@Z(ptr long) msvcp120.??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAA@I@Z +@ thiscall -arch=i386 ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z(ptr long) msvcp120.??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z +@ cdecl -arch=win64 ??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z(ptr long) msvcp120.??0?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAA@I@Z(ptr long) msvcp120.??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAA@I@Z +@ thiscall -arch=i386 ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z(ptr long) msvcp120.??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z +@ cdecl -arch=win64 ??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z(ptr long) msvcp120.??0?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAA@I@Z(ptr long) msvcp120.??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAA@I@Z +@ thiscall -arch=i386 ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z(ptr long) msvcp120.??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z +@ cdecl -arch=win64 ??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z(ptr long) msvcp120.??0?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAA@I@Z(ptr long) msvcp120.??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAA@I@Z +@ thiscall -arch=i386 ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z(ptr long) msvcp120.??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z +@ cdecl -arch=win64 ??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z(ptr long) msvcp120.??0?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAA@I@Z(ptr long) msvcp120.??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAA@I@Z +@ thiscall -arch=i386 ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z(ptr long) msvcp120.??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z +@ cdecl -arch=win64 ??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z(ptr long) msvcp120.??0?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z +@ stub -arch=arm ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAA@PBDI@Z +@ stub -arch=i386 ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAE@PBDI@Z +@ stub -arch=win64 ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAA@PEBD_K@Z +@ stub -arch=arm ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z +@ stub -arch=i386 ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z +@ stub -arch=win64 ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ stub -arch=arm ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAA@I@Z +@ stub -arch=i386 ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z +@ stub -arch=win64 ??0?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z +@ stub -arch=arm ??0?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAA@PBDI@Z +@ stub -arch=i386 ??0?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAE@PBDI@Z +@ stub -arch=win64 ??0?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAA@PEBD_K@Z +@ stub -arch=arm ??0?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z +@ stub -arch=i386 ??0?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z +@ stub -arch=win64 ??0?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ stub -arch=arm ??0?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAA@I@Z +@ stub -arch=i386 ??0?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z +@ stub -arch=win64 ??0?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z +@ stub -arch=arm ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAA@PBDI@Z +@ stub -arch=i386 ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAE@PBDI@Z +@ stub -arch=win64 ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAA@PEBD_K@Z +@ stub -arch=arm ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z +@ stub -arch=i386 ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z +@ stub -arch=win64 ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ stub -arch=arm ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAA@I@Z +@ stub -arch=i386 ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z +@ stub -arch=win64 ??0?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAA@I@Z(ptr long) msvcp120.??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAA@I@Z +@ thiscall -arch=i386 ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z(ptr long) msvcp120.??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAE@I@Z +@ cdecl -arch=win64 ??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z(ptr long) msvcp120.??0?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAA@PBDI@Z(ptr str long) msvcp120.??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAA@PBDI@Z +@ thiscall -arch=i386 ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAE@PBDI@Z(ptr str long) msvcp120.??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAE@PBDI@Z +@ cdecl -arch=win64 ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAA@PEBD_K@Z(ptr str long) msvcp120.??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAA@PEBD_K@Z +@ cdecl -arch=arm ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAA@I@Z(ptr long) msvcp120.??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAA@I@Z +@ thiscall -arch=i386 ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z(ptr long) msvcp120.??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAE@I@Z +@ cdecl -arch=win64 ??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z(ptr long) msvcp120.??0?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAA@PBDI@Z(ptr str long) msvcp120.??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAA@PBDI@Z +@ thiscall -arch=i386 ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAE@PBDI@Z(ptr str long) msvcp120.??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAE@PBDI@Z +@ cdecl -arch=win64 ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAA@PEBD_K@Z(ptr str long) msvcp120.??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAA@PEBD_K@Z +@ cdecl -arch=arm ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAA@ABV_Locinfo@1@I@Z +@ thiscall -arch=i386 ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z(ptr ptr long) msvcp120.??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@ABV_Locinfo@1@I@Z +@ cdecl -arch=win64 ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z(ptr ptr long) msvcp120.??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@AEBV_Locinfo@1@_K@Z +@ cdecl -arch=arm ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAA@I@Z(ptr long) msvcp120.??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAA@I@Z +@ thiscall -arch=i386 ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z(ptr long) msvcp120.??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAE@I@Z +@ cdecl -arch=win64 ??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z(ptr long) msvcp120.??0?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0Init@ios_base@std@@QAA@XZ(ptr) msvcp120.??0Init@ios_base@std@@QAA@XZ +@ thiscall -arch=i386 ??0Init@ios_base@std@@QAE@XZ(ptr) msvcp120.??0Init@ios_base@std@@QAE@XZ +@ cdecl -arch=win64 ??0Init@ios_base@std@@QEAA@XZ(ptr) msvcp120.??0Init@ios_base@std@@QEAA@XZ +@ stub -arch=arm ??0_Concurrent_queue_base_v4@details@Concurrency@@IAA@I@Z +@ stub -arch=i386 ??0_Concurrent_queue_base_v4@details@Concurrency@@IAE@I@Z +@ stub -arch=win64 ??0_Concurrent_queue_base_v4@details@Concurrency@@IEAA@_K@Z +@ stub -arch=arm ??0_Concurrent_queue_iterator_base_v4@details@Concurrency@@IAA@ABV_Concurrent_queue_base_v4@12@@Z +@ stub -arch=i386 ??0_Concurrent_queue_iterator_base_v4@details@Concurrency@@IAE@ABV_Concurrent_queue_base_v4@12@@Z +@ stub -arch=win64 ??0_Concurrent_queue_iterator_base_v4@details@Concurrency@@IEAA@AEBV_Concurrent_queue_base_v4@12@@Z +@ cdecl -arch=arm ??0_Container_base12@std@@QAA@ABU01@@Z(ptr ptr) msvcp120.??0_Container_base12@std@@QAA@ABU01@@Z +@ thiscall -arch=i386 ??0_Container_base12@std@@QAE@ABU01@@Z(ptr ptr) msvcp120.??0_Container_base12@std@@QAE@ABU01@@Z +@ cdecl -arch=win64 ??0_Container_base12@std@@QEAA@AEBU01@@Z(ptr ptr) msvcp120.??0_Container_base12@std@@QEAA@AEBU01@@Z +@ cdecl -arch=arm ??0_Container_base12@std@@QAA@XZ(ptr) msvcp120.??0_Container_base12@std@@QAA@XZ +@ thiscall -arch=i386 ??0_Container_base12@std@@QAE@XZ(ptr) msvcp120.??0_Container_base12@std@@QAE@XZ +@ cdecl -arch=win64 ??0_Container_base12@std@@QEAA@XZ(ptr) msvcp120.??0_Container_base12@std@@QEAA@XZ +@ stub -arch=arm ??0_Facet_base@std@@QAA@ABV01@@Z +@ stub -arch=i386 ??0_Facet_base@std@@QAE@ABV01@@Z +@ stub -arch=win64 ??0_Facet_base@std@@QEAA@AEBV01@@Z +@ stub -arch=arm ??0_Facet_base@std@@QAA@XZ +@ stub -arch=i386 ??0_Facet_base@std@@QAE@XZ +@ stub -arch=win64 ??0_Facet_base@std@@QEAA@XZ +@ stub -arch=arm ??0_Init_locks@std@@QAA@XZ +@ stub -arch=i386 ??0_Init_locks@std@@QAE@XZ +@ stub -arch=win64 ??0_Init_locks@std@@QEAA@XZ +@ cdecl -arch=arm ??0_Locimp@locale@std@@AAA@ABV012@@Z(ptr ptr) msvcp120.??0_Locimp@locale@std@@AAA@ABV012@@Z +@ thiscall -arch=i386 ??0_Locimp@locale@std@@AAE@ABV012@@Z(ptr ptr) msvcp120.??0_Locimp@locale@std@@AAE@ABV012@@Z +@ cdecl -arch=win64 ??0_Locimp@locale@std@@AEAA@AEBV012@@Z(ptr ptr) msvcp120.??0_Locimp@locale@std@@AEAA@AEBV012@@Z +@ cdecl -arch=arm ??0_Locimp@locale@std@@AAA@_N@Z(ptr long) msvcp120.??0_Locimp@locale@std@@AAA@_N@Z +@ thiscall -arch=i386 ??0_Locimp@locale@std@@AAE@_N@Z(ptr long) msvcp120.??0_Locimp@locale@std@@AAE@_N@Z +@ cdecl -arch=win64 ??0_Locimp@locale@std@@AEAA@_N@Z(ptr long) msvcp120.??0_Locimp@locale@std@@AEAA@_N@Z +@ cdecl -arch=arm ??0_Locinfo@std@@QAA@HPBD@Z(ptr long str) msvcp120.??0_Locinfo@std@@QAA@HPBD@Z +@ thiscall -arch=i386 ??0_Locinfo@std@@QAE@HPBD@Z(ptr long str) msvcp120.??0_Locinfo@std@@QAE@HPBD@Z +@ cdecl -arch=win64 ??0_Locinfo@std@@QEAA@HPEBD@Z(ptr long str) msvcp120.??0_Locinfo@std@@QEAA@HPEBD@Z +@ cdecl -arch=arm ??0_Locinfo@std@@QAA@PBD@Z(ptr str) msvcp120.??0_Locinfo@std@@QAA@PBD@Z +@ thiscall -arch=i386 ??0_Locinfo@std@@QAE@PBD@Z(ptr str) msvcp120.??0_Locinfo@std@@QAE@PBD@Z +@ cdecl -arch=win64 ??0_Locinfo@std@@QEAA@PEBD@Z(ptr str) msvcp120.??0_Locinfo@std@@QEAA@PEBD@Z +@ cdecl -arch=arm ??0_Lockit@std@@QAA@H@Z(ptr long) msvcp120.??0_Lockit@std@@QAA@H@Z +@ thiscall -arch=i386 ??0_Lockit@std@@QAE@H@Z(ptr long) msvcp120.??0_Lockit@std@@QAE@H@Z +@ cdecl -arch=win64 ??0_Lockit@std@@QEAA@H@Z(ptr long) msvcp120.??0_Lockit@std@@QEAA@H@Z +@ cdecl -arch=arm ??0_Lockit@std@@QAA@XZ(ptr) msvcp120.??0_Lockit@std@@QAA@XZ +@ thiscall -arch=i386 ??0_Lockit@std@@QAE@XZ(ptr) msvcp120.??0_Lockit@std@@QAE@XZ +@ cdecl -arch=win64 ??0_Lockit@std@@QEAA@XZ(ptr) msvcp120.??0_Lockit@std@@QEAA@XZ +@ stub -arch=arm ??0_Pad@std@@QAA@ABV01@@Z +@ stub -arch=i386 ??0_Pad@std@@QAE@ABV01@@Z +@ stub -arch=win64 ??0_Pad@std@@QEAA@AEBV01@@Z +@ stub -arch=arm ??0_Pad@std@@QAA@XZ +@ stub -arch=i386 ??0_Pad@std@@QAE@XZ +@ stub -arch=win64 ??0_Pad@std@@QEAA@XZ +@ stub -arch=arm ??0_Runtime_object@details@Concurrency@@QAA@H@Z +@ stub -arch=i386 ??0_Runtime_object@details@Concurrency@@QAE@H@Z +@ stub -arch=win64 ??0_Runtime_object@details@Concurrency@@QEAA@H@Z +@ stub -arch=arm ??0_Runtime_object@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0_Runtime_object@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0_Runtime_object@details@Concurrency@@QEAA@XZ +@ cdecl -arch=arm ??0_Timevec@std@@QAA@ABV01@@Z(ptr ptr) msvcp120.??0_Timevec@std@@QAA@ABV01@@Z +@ thiscall -arch=i386 ??0_Timevec@std@@QAE@ABV01@@Z(ptr ptr) msvcp120.??0_Timevec@std@@QAE@ABV01@@Z +@ cdecl -arch=win64 ??0_Timevec@std@@QEAA@AEBV01@@Z(ptr ptr) msvcp120.??0_Timevec@std@@QEAA@AEBV01@@Z +@ cdecl -arch=arm ??0_Timevec@std@@QAA@PAX@Z(ptr ptr) msvcp120.??0_Timevec@std@@QAA@PAX@Z +@ thiscall -arch=i386 ??0_Timevec@std@@QAE@PAX@Z(ptr ptr) msvcp120.??0_Timevec@std@@QAE@PAX@Z +@ cdecl -arch=win64 ??0_Timevec@std@@QEAA@PEAX@Z(ptr ptr) msvcp120.??0_Timevec@std@@QEAA@PEAX@Z +@ stub -arch=arm ??0_UShinit@std@@QAA@XZ +@ stub -arch=i386 ??0_UShinit@std@@QAE@XZ +@ stub -arch=win64 ??0_UShinit@std@@QEAA@XZ +@ cdecl -arch=arm ??0_Winit@std@@QAA@XZ(ptr) msvcp120.??0_Winit@std@@QAA@XZ +@ thiscall -arch=i386 ??0_Winit@std@@QAE@XZ(ptr) msvcp120.??0_Winit@std@@QAE@XZ +@ cdecl -arch=win64 ??0_Winit@std@@QEAA@XZ(ptr) msvcp120.??0_Winit@std@@QEAA@XZ +@ stub -arch=arm ??0agent@Concurrency@@QAA@AAVScheduleGroup@1@@Z +@ stub -arch=i386 ??0agent@Concurrency@@QAE@AAVScheduleGroup@1@@Z +@ stub -arch=win64 ??0agent@Concurrency@@QEAA@AEAVScheduleGroup@1@@Z +@ stub -arch=arm ??0agent@Concurrency@@QAA@AAVScheduler@1@@Z +@ stub -arch=i386 ??0agent@Concurrency@@QAE@AAVScheduler@1@@Z +@ stub -arch=win64 ??0agent@Concurrency@@QEAA@AEAVScheduler@1@@Z +@ stub -arch=arm ??0agent@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0agent@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0agent@Concurrency@@QEAA@XZ +@ cdecl -arch=arm ??0codecvt_base@std@@QAA@I@Z(ptr long) msvcp120.??0codecvt_base@std@@QAA@I@Z +@ thiscall -arch=i386 ??0codecvt_base@std@@QAE@I@Z(ptr long) msvcp120.??0codecvt_base@std@@QAE@I@Z +@ cdecl -arch=win64 ??0codecvt_base@std@@QEAA@_K@Z(ptr long) msvcp120.??0codecvt_base@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0ctype_base@std@@QAA@I@Z(ptr long) msvcp120.??0ctype_base@std@@QAA@I@Z +@ thiscall -arch=i386 ??0ctype_base@std@@QAE@I@Z(ptr long) msvcp120.??0ctype_base@std@@QAE@I@Z +@ cdecl -arch=win64 ??0ctype_base@std@@QEAA@_K@Z(ptr long) msvcp120.??0ctype_base@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0facet@locale@std@@IAA@I@Z(ptr long) msvcp120.??0facet@locale@std@@IAA@I@Z +@ thiscall -arch=i386 ??0facet@locale@std@@IAE@I@Z(ptr long) msvcp120.??0facet@locale@std@@IAE@I@Z +@ cdecl -arch=win64 ??0facet@locale@std@@IEAA@_K@Z(ptr long) msvcp120.??0facet@locale@std@@IEAA@_K@Z +@ cdecl -arch=arm ??0id@locale@std@@QAA@I@Z(ptr long) msvcp120.??0id@locale@std@@QAA@I@Z +@ thiscall -arch=i386 ??0id@locale@std@@QAE@I@Z(ptr long) msvcp120.??0id@locale@std@@QAE@I@Z +@ cdecl -arch=win64 ??0id@locale@std@@QEAA@_K@Z(ptr long) msvcp120.??0id@locale@std@@QEAA@_K@Z +@ cdecl -arch=arm ??0ios_base@std@@IAA@XZ(ptr) msvcp120.??0ios_base@std@@IAA@XZ +@ thiscall -arch=i386 ??0ios_base@std@@IAE@XZ(ptr) msvcp120.??0ios_base@std@@IAE@XZ +@ cdecl -arch=win64 ??0ios_base@std@@IEAA@XZ(ptr) msvcp120.??0ios_base@std@@IEAA@XZ +@ stub -arch=arm ??0time_base@std@@QAA@I@Z +@ stub -arch=i386 ??0time_base@std@@QAE@I@Z +@ stub -arch=win64 ??0time_base@std@@QEAA@_K@Z +@ cdecl -arch=arm ??1?$_Yarn@D@std@@QAA@XZ(ptr) msvcp120.??1?$_Yarn@D@std@@QAA@XZ +@ thiscall -arch=i386 ??1?$_Yarn@D@std@@QAE@XZ(ptr) msvcp120.??1?$_Yarn@D@std@@QAE@XZ +@ cdecl -arch=win64 ??1?$_Yarn@D@std@@QEAA@XZ(ptr) msvcp120.??1?$_Yarn@D@std@@QEAA@XZ +@ stub -arch=arm ??1?$_Yarn@_W@std@@QAA@XZ +@ stub -arch=i386 ??1?$_Yarn@_W@std@@QAE@XZ +@ stub -arch=win64 ??1?$_Yarn@_W@std@@QEAA@XZ +@ cdecl -arch=arm ??1?$basic_ios@DU?$char_traits@D@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_ios@DU?$char_traits@D@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_ios@DU?$char_traits@D@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_ios@DU?$char_traits@D@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_ios@DU?$char_traits@D@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_ios@DU?$char_traits@D@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$basic_ios@GU?$char_traits@G@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_ios@GU?$char_traits@G@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_ios@GU?$char_traits@G@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_ios@GU?$char_traits@G@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_ios@GU?$char_traits@G@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_ios@GU?$char_traits@G@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$basic_ios@_WU?$char_traits@_W@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_ios@_WU?$char_traits@_W@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_ios@_WU?$char_traits@_W@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_ios@_WU?$char_traits@_W@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_ios@_WU?$char_traits@_W@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_ios@_WU?$char_traits@_W@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$basic_iostream@GU?$char_traits@G@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_iostream@GU?$char_traits@G@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_iostream@GU?$char_traits@G@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_iostream@GU?$char_traits@G@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_iostream@GU?$char_traits@G@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_iostream@GU?$char_traits@G@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$basic_istream@DU?$char_traits@D@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_istream@DU?$char_traits@D@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_istream@DU?$char_traits@D@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_istream@DU?$char_traits@D@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_istream@DU?$char_traits@D@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_istream@DU?$char_traits@D@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$basic_istream@GU?$char_traits@G@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_istream@GU?$char_traits@G@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_istream@GU?$char_traits@G@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_istream@GU?$char_traits@G@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_istream@GU?$char_traits@G@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_istream@GU?$char_traits@G@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$basic_ostream@GU?$char_traits@G@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_ostream@GU?$char_traits@G@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_ostream@GU?$char_traits@G@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_ostream@GU?$char_traits@G@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_ostream@GU?$char_traits@G@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_ostream@GU?$char_traits@G@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$basic_streambuf@GU?$char_traits@G@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_streambuf@GU?$char_traits@G@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_streambuf@GU?$char_traits@G@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_streambuf@GU?$char_traits@G@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_streambuf@GU?$char_traits@G@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_streambuf@GU?$char_traits@G@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAA@XZ(ptr) msvcp120.??1?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAA@XZ +@ thiscall -arch=i386 ??1?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAE@XZ(ptr) msvcp120.??1?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAE@XZ +@ cdecl -arch=win64 ??1?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAA@XZ(ptr) msvcp120.??1?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAA@XZ +@ cdecl -arch=arm ??1?$codecvt@DDH@std@@MAA@XZ(ptr) msvcp120.??1?$codecvt@DDH@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$codecvt@DDH@std@@MAE@XZ(ptr) msvcp120.??1?$codecvt@DDH@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$codecvt@DDH@std@@MEAA@XZ(ptr) msvcp120.??1?$codecvt@DDH@std@@MEAA@XZ +@ cdecl -arch=arm ??1?$codecvt@GDH@std@@MAA@XZ(ptr) msvcp120.??1?$codecvt@GDH@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$codecvt@GDH@std@@MAE@XZ(ptr) msvcp120.??1?$codecvt@GDH@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$codecvt@GDH@std@@MEAA@XZ(ptr) msvcp120.??1?$codecvt@GDH@std@@MEAA@XZ +@ cdecl -arch=arm ??1?$codecvt@_WDH@std@@MAA@XZ(ptr) msvcp120.??1?$codecvt@_WDH@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$codecvt@_WDH@std@@MAE@XZ(ptr) msvcp120.??1?$codecvt@_WDH@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$codecvt@_WDH@std@@MEAA@XZ(ptr) msvcp120.??1?$codecvt@_WDH@std@@MEAA@XZ +@ cdecl -arch=arm ??1?$ctype@D@std@@MAA@XZ(ptr) msvcp120.??1?$ctype@D@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$ctype@D@std@@MAE@XZ(ptr) msvcp120.??1?$ctype@D@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$ctype@D@std@@MEAA@XZ(ptr) msvcp120.??1?$ctype@D@std@@MEAA@XZ +@ cdecl -arch=arm ??1?$ctype@G@std@@MAA@XZ(ptr) msvcp120.??1?$ctype@G@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$ctype@G@std@@MAE@XZ(ptr) msvcp120.??1?$ctype@G@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$ctype@G@std@@MEAA@XZ(ptr) msvcp120.??1?$ctype@G@std@@MEAA@XZ +@ cdecl -arch=arm ??1?$ctype@_W@std@@MAA@XZ(ptr) msvcp120.??1?$ctype@_W@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$ctype@_W@std@@MAE@XZ(ptr) msvcp120.??1?$ctype@_W@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$ctype@_W@std@@MEAA@XZ(ptr) msvcp120.??1?$ctype@_W@std@@MEAA@XZ +@ cdecl -arch=arm ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAA@XZ(ptr) msvcp120.??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ(ptr) msvcp120.??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ(ptr) msvcp120.??1?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ +@ cdecl -arch=arm ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAA@XZ(ptr) msvcp120.??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ(ptr) msvcp120.??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ(ptr) msvcp120.??1?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ +@ cdecl -arch=arm ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAA@XZ(ptr) msvcp120.??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ(ptr) msvcp120.??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ(ptr) msvcp120.??1?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ +@ cdecl -arch=arm ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAA@XZ(ptr) msvcp120.??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ(ptr) msvcp120.??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ(ptr) msvcp120.??1?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ +@ cdecl -arch=arm ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAA@XZ(ptr) msvcp120.??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ(ptr) msvcp120.??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ(ptr) msvcp120.??1?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ +@ cdecl -arch=arm ??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAA@XZ(ptr) msvcp120.??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ(ptr) msvcp120.??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ(ptr) msvcp120.??1?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ +@ stub -arch=arm ??1?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAA@XZ +@ stub -arch=i386 ??1?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ +@ stub -arch=win64 ??1?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ +@ stub -arch=arm ??1?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAA@XZ +@ stub -arch=i386 ??1?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ +@ stub -arch=win64 ??1?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ +@ stub -arch=arm ??1?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAA@XZ +@ stub -arch=i386 ??1?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ +@ stub -arch=win64 ??1?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ +@ cdecl -arch=arm ??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAA@XZ(ptr) msvcp120.??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ(ptr) msvcp120.??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ(ptr) msvcp120.??1?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAA@XZ +@ cdecl -arch=arm ??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAA@XZ(ptr) msvcp120.??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ(ptr) msvcp120.??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ(ptr) msvcp120.??1?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEAA@XZ +@ cdecl -arch=arm ??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAA@XZ(ptr) msvcp120.??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAA@XZ +@ thiscall -arch=i386 ??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ(ptr) msvcp120.??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MAE@XZ +@ cdecl -arch=win64 ??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ(ptr) msvcp120.??1?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEAA@XZ +@ cdecl -arch=arm ??1Init@ios_base@std@@QAA@XZ(ptr) msvcp120.??1Init@ios_base@std@@QAA@XZ +@ thiscall -arch=i386 ??1Init@ios_base@std@@QAE@XZ(ptr) msvcp120.??1Init@ios_base@std@@QAE@XZ +@ cdecl -arch=win64 ??1Init@ios_base@std@@QEAA@XZ(ptr) msvcp120.??1Init@ios_base@std@@QEAA@XZ +@ stub -arch=arm ??1_Concurrent_queue_base_v4@details@Concurrency@@MAA@XZ +@ stub -arch=i386 ??1_Concurrent_queue_base_v4@details@Concurrency@@MAE@XZ +@ stub -arch=win64 ??1_Concurrent_queue_base_v4@details@Concurrency@@MEAA@XZ +@ stub -arch=arm ??1_Concurrent_queue_iterator_base_v4@details@Concurrency@@IAA@XZ +@ stub -arch=i386 ??1_Concurrent_queue_iterator_base_v4@details@Concurrency@@IAE@XZ +@ stub -arch=win64 ??1_Concurrent_queue_iterator_base_v4@details@Concurrency@@IEAA@XZ +@ stub -arch=arm ??1_Concurrent_vector_base_v4@details@Concurrency@@IAA@XZ +@ stub -arch=i386 ??1_Concurrent_vector_base_v4@details@Concurrency@@IAE@XZ +@ stub -arch=win64 ??1_Concurrent_vector_base_v4@details@Concurrency@@IEAA@XZ +@ cdecl -arch=arm ??1_Container_base12@std@@QAA@XZ(ptr) msvcp120.??1_Container_base12@std@@QAA@XZ +@ thiscall -arch=i386 ??1_Container_base12@std@@QAE@XZ(ptr) msvcp120.??1_Container_base12@std@@QAE@XZ +@ cdecl -arch=win64 ??1_Container_base12@std@@QEAA@XZ(ptr) msvcp120.??1_Container_base12@std@@QEAA@XZ +@ stub -arch=arm ??1_Facet_base@std@@UAA@XZ +@ stub -arch=i386 ??1_Facet_base@std@@UAE@XZ +@ stub -arch=win64 ??1_Facet_base@std@@UEAA@XZ +@ stub -arch=arm ??1_Init_locks@std@@QAA@XZ +@ stub -arch=i386 ??1_Init_locks@std@@QAE@XZ +@ stub -arch=win64 ??1_Init_locks@std@@QEAA@XZ +@ cdecl -arch=arm ??1_Locimp@locale@std@@MAA@XZ(ptr) msvcp120.??1_Locimp@locale@std@@MAA@XZ +@ thiscall -arch=i386 ??1_Locimp@locale@std@@MAE@XZ(ptr) msvcp120.??1_Locimp@locale@std@@MAE@XZ +@ cdecl -arch=win64 ??1_Locimp@locale@std@@MEAA@XZ(ptr) msvcp120.??1_Locimp@locale@std@@MEAA@XZ +@ cdecl -arch=arm ??1_Locinfo@std@@QAA@XZ(ptr) msvcp120.??1_Locinfo@std@@QAA@XZ +@ thiscall -arch=i386 ??1_Locinfo@std@@QAE@XZ(ptr) msvcp120.??1_Locinfo@std@@QAE@XZ +@ cdecl -arch=win64 ??1_Locinfo@std@@QEAA@XZ(ptr) msvcp120.??1_Locinfo@std@@QEAA@XZ +@ cdecl -arch=arm ??1_Lockit@std@@QAA@XZ(ptr) msvcp120.??1_Lockit@std@@QAA@XZ +@ thiscall -arch=i386 ??1_Lockit@std@@QAE@XZ(ptr) msvcp120.??1_Lockit@std@@QAE@XZ +@ cdecl -arch=win64 ??1_Lockit@std@@QEAA@XZ(ptr) msvcp120.??1_Lockit@std@@QEAA@XZ +@ stub -arch=arm ??1_Pad@std@@QAA@XZ +@ stub -arch=i386 ??1_Pad@std@@QAE@XZ +@ stub -arch=win64 ??1_Pad@std@@QEAA@XZ +@ cdecl -arch=arm ??1_Timevec@std@@QAA@XZ(ptr) msvcp120.??1_Timevec@std@@QAA@XZ +@ thiscall -arch=i386 ??1_Timevec@std@@QAE@XZ(ptr) msvcp120.??1_Timevec@std@@QAE@XZ +@ cdecl -arch=win64 ??1_Timevec@std@@QEAA@XZ(ptr) msvcp120.??1_Timevec@std@@QEAA@XZ +@ stub -arch=arm ??1_UShinit@std@@QAA@XZ +@ stub -arch=i386 ??1_UShinit@std@@QAE@XZ +@ stub -arch=win64 ??1_UShinit@std@@QEAA@XZ +@ cdecl -arch=arm ??1_Winit@std@@QAA@XZ(ptr) msvcp120.??1_Winit@std@@QAA@XZ +@ thiscall -arch=i386 ??1_Winit@std@@QAE@XZ(ptr) msvcp120.??1_Winit@std@@QAE@XZ +@ cdecl -arch=win64 ??1_Winit@std@@QEAA@XZ(ptr) msvcp120.??1_Winit@std@@QEAA@XZ +@ stub -arch=arm ??1agent@Concurrency@@UAA@XZ +@ stub -arch=i386 ??1agent@Concurrency@@UAE@XZ +@ stub -arch=win64 ??1agent@Concurrency@@UEAA@XZ +@ cdecl -arch=arm ??1codecvt_base@std@@UAA@XZ(ptr) msvcp120.??1codecvt_base@std@@UAA@XZ +@ thiscall -arch=i386 ??1codecvt_base@std@@UAE@XZ(ptr) msvcp120.??1codecvt_base@std@@UAE@XZ +@ cdecl -arch=win64 ??1codecvt_base@std@@UEAA@XZ(ptr) msvcp120.??1codecvt_base@std@@UEAA@XZ +@ cdecl -arch=arm ??1ctype_base@std@@UAA@XZ(ptr) msvcp120.??1ctype_base@std@@UAA@XZ +@ thiscall -arch=i386 ??1ctype_base@std@@UAE@XZ(ptr) msvcp120.??1ctype_base@std@@UAE@XZ +@ cdecl -arch=win64 ??1ctype_base@std@@UEAA@XZ(ptr) msvcp120.??1ctype_base@std@@UEAA@XZ +@ cdecl -arch=arm ??1facet@locale@std@@MAA@XZ(ptr) msvcp120.??1facet@locale@std@@MAA@XZ +@ thiscall -arch=i386 ??1facet@locale@std@@MAE@XZ(ptr) msvcp120.??1facet@locale@std@@MAE@XZ +@ cdecl -arch=win64 ??1facet@locale@std@@MEAA@XZ(ptr) msvcp120.??1facet@locale@std@@MEAA@XZ +@ cdecl -arch=arm ??1ios_base@std@@UAA@XZ(ptr) msvcp120.??1ios_base@std@@UAA@XZ +@ thiscall -arch=i386 ??1ios_base@std@@UAE@XZ(ptr) msvcp120.??1ios_base@std@@UAE@XZ +@ cdecl -arch=win64 ??1ios_base@std@@UEAA@XZ(ptr) msvcp120.??1ios_base@std@@UEAA@XZ +@ stub -arch=arm ??1time_base@std@@UAA@XZ +@ stub -arch=i386 ??1time_base@std@@UAE@XZ +@ stub -arch=win64 ??1time_base@std@@UEAA@XZ +@ stub -arch=arm ??4?$_Iosb@H@std@@QAAAAV01@ABV01@@Z +@ stub -arch=i386 ??4?$_Iosb@H@std@@QAEAAV01@ABV01@@Z +@ stub -arch=win64 ??4?$_Iosb@H@std@@QEAAAEAV01@AEBV01@@Z +@ cdecl -arch=arm ??4?$_Yarn@D@std@@QAAAAV01@ABV01@@Z(ptr ptr) msvcp120.??4?$_Yarn@D@std@@QAAAAV01@ABV01@@Z +@ thiscall -arch=i386 ??4?$_Yarn@D@std@@QAEAAV01@ABV01@@Z(ptr ptr) msvcp120.??4?$_Yarn@D@std@@QAEAAV01@ABV01@@Z +@ cdecl -arch=win64 ??4?$_Yarn@D@std@@QEAAAEAV01@AEBV01@@Z(ptr ptr) msvcp120.??4?$_Yarn@D@std@@QEAAAEAV01@AEBV01@@Z +@ cdecl -arch=arm ??4?$_Yarn@D@std@@QAAAAV01@PBD@Z(ptr str) msvcp120.??4?$_Yarn@D@std@@QAAAAV01@PBD@Z +@ thiscall -arch=i386 ??4?$_Yarn@D@std@@QAEAAV01@PBD@Z(ptr str) msvcp120.??4?$_Yarn@D@std@@QAEAAV01@PBD@Z +@ cdecl -arch=win64 ??4?$_Yarn@D@std@@QEAAAEAV01@PEBD@Z(ptr str) msvcp120.??4?$_Yarn@D@std@@QEAAAEAV01@PEBD@Z +@ stub -arch=arm ??4?$_Yarn@_W@std@@QAAAAV01@PB_W@Z +@ stub -arch=i386 ??4?$_Yarn@_W@std@@QAEAAV01@PB_W@Z +@ stub -arch=win64 ??4?$_Yarn@_W@std@@QEAAAEAV01@PEB_W@Z +@ stub -arch=arm ??4?$basic_iostream@DU?$char_traits@D@std@@@std@@IAAAAV01@$$QAV01@@Z +@ stub -arch=i386 ??4?$basic_iostream@DU?$char_traits@D@std@@@std@@IAEAAV01@$$QAV01@@Z +@ stub -arch=win64 ??4?$basic_iostream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z +@ stub -arch=arm ??4?$basic_iostream@GU?$char_traits@G@std@@@std@@IAAAAV01@$$QAV01@@Z +@ stub -arch=i386 ??4?$basic_iostream@GU?$char_traits@G@std@@@std@@IAEAAV01@$$QAV01@@Z +@ stub -arch=win64 ??4?$basic_iostream@GU?$char_traits@G@std@@@std@@IEAAAEAV01@$$QEAV01@@Z +@ stub -arch=arm ??4?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IAAAAV01@$$QAV01@@Z +@ stub -arch=i386 ??4?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IAEAAV01@$$QAV01@@Z +@ stub -arch=win64 ??4?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IEAAAEAV01@$$QEAV01@@Z +@ stub -arch=arm ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAAAAV01@$$QAV01@@Z +@ stub -arch=i386 ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAEAAV01@$$QAV01@@Z +@ stub -arch=win64 ??4?$basic_istream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z +@ stub -arch=arm ??4?$basic_istream@GU?$char_traits@G@std@@@std@@IAAAAV01@$$QAV01@@Z +@ stub -arch=i386 ??4?$basic_istream@GU?$char_traits@G@std@@@std@@IAEAAV01@$$QAV01@@Z +@ stub -arch=win64 ??4?$basic_istream@GU?$char_traits@G@std@@@std@@IEAAAEAV01@$$QEAV01@@Z +@ stub -arch=arm ??4?$basic_istream@_WU?$char_traits@_W@std@@@std@@IAAAAV01@$$QAV01@@Z +@ stub -arch=i386 ??4?$basic_istream@_WU?$char_traits@_W@std@@@std@@IAEAAV01@$$QAV01@@Z +@ stub -arch=win64 ??4?$basic_istream@_WU?$char_traits@_W@std@@@std@@IEAAAEAV01@$$QEAV01@@Z +@ stub -arch=arm ??4?$basic_ostream@DU?$char_traits@D@std@@@std@@IAAAAV01@$$QAV01@@Z +@ stub -arch=i386 ??4?$basic_ostream@DU?$char_traits@D@std@@@std@@IAEAAV01@$$QAV01@@Z +@ stub -arch=win64 ??4?$basic_ostream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z +@ stub -arch=arm ??4?$basic_ostream@GU?$char_traits@G@std@@@std@@IAAAAV01@$$QAV01@@Z +@ stub -arch=i386 ??4?$basic_ostream@GU?$char_traits@G@std@@@std@@IAEAAV01@$$QAV01@@Z +@ stub -arch=win64 ??4?$basic_ostream@GU?$char_traits@G@std@@@std@@IEAAAEAV01@$$QEAV01@@Z +@ stub -arch=arm ??4?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IAAAAV01@$$QAV01@@Z +@ stub -arch=i386 ??4?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IAEAAV01@$$QAV01@@Z +@ stub -arch=win64 ??4?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IEAAAEAV01@$$QEAV01@@Z +@ stub -arch=arm ??4?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAAAV01@ABV01@@Z +@ stub -arch=i386 ??4?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEAAV01@ABV01@@Z +@ stub -arch=win64 ??4?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAAEAV01@AEBV01@@Z +@ stub -arch=arm ??4?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAAAV01@ABV01@@Z +@ stub -arch=i386 ??4?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEAAV01@ABV01@@Z +@ stub -arch=win64 ??4?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAAEAV01@AEBV01@@Z +@ stub -arch=arm ??4?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAAAV01@ABV01@@Z +@ stub -arch=i386 ??4?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEAAV01@ABV01@@Z +@ stub -arch=win64 ??4?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAAEAV01@AEBV01@@Z +@ cdecl -arch=arm ??4Init@ios_base@std@@QAAAAV012@ABV012@@Z(ptr ptr) msvcp120.??4Init@ios_base@std@@QAAAAV012@ABV012@@Z +@ thiscall -arch=i386 ??4Init@ios_base@std@@QAEAAV012@ABV012@@Z(ptr ptr) msvcp120.??4Init@ios_base@std@@QAEAAV012@ABV012@@Z +@ cdecl -arch=win64 ??4Init@ios_base@std@@QEAAAEAV012@AEBV012@@Z(ptr ptr) msvcp120.??4Init@ios_base@std@@QEAAAEAV012@AEBV012@@Z +@ cdecl -arch=arm ??4_Container_base0@std@@QAAAAU01@ABU01@@Z(ptr ptr) msvcp120.??4_Container_base0@std@@QAAAAU01@ABU01@@Z +@ thiscall -arch=i386 ??4_Container_base0@std@@QAEAAU01@ABU01@@Z(ptr ptr) msvcp120.??4_Container_base0@std@@QAEAAU01@ABU01@@Z +@ cdecl -arch=win64 ??4_Container_base0@std@@QEAAAEAU01@AEBU01@@Z(ptr ptr) msvcp120.??4_Container_base0@std@@QEAAAEAU01@AEBU01@@Z +@ cdecl -arch=arm ??4_Container_base12@std@@QAAAAU01@ABU01@@Z(ptr ptr) msvcp120.??4_Container_base12@std@@QAAAAU01@ABU01@@Z +@ thiscall -arch=i386 ??4_Container_base12@std@@QAEAAU01@ABU01@@Z(ptr ptr) msvcp120.??4_Container_base12@std@@QAEAAU01@ABU01@@Z +@ cdecl -arch=win64 ??4_Container_base12@std@@QEAAAEAU01@AEBU01@@Z(ptr ptr) msvcp120.??4_Container_base12@std@@QEAAAEAU01@AEBU01@@Z +@ stub -arch=arm ??4_Facet_base@std@@QAAAAV01@ABV01@@Z +@ stub -arch=i386 ??4_Facet_base@std@@QAEAAV01@ABV01@@Z +@ stub -arch=win64 ??4_Facet_base@std@@QEAAAEAV01@AEBV01@@Z +@ stub -arch=arm ??4_Init_locks@std@@QAAAAV01@ABV01@@Z +@ stub -arch=i386 ??4_Init_locks@std@@QAEAAV01@ABV01@@Z +@ stub -arch=win64 ??4_Init_locks@std@@QEAAAEAV01@AEBV01@@Z +@ stub -arch=arm ??4_Pad@std@@QAAAAV01@ABV01@@Z +@ stub -arch=i386 ??4_Pad@std@@QAEAAV01@ABV01@@Z +@ stub -arch=win64 ??4_Pad@std@@QEAAAEAV01@AEBV01@@Z +@ cdecl -arch=arm ??4_Timevec@std@@QAAAAV01@ABV01@@Z(ptr ptr) msvcp120.??4_Timevec@std@@QAAAAV01@ABV01@@Z +@ thiscall -arch=i386 ??4_Timevec@std@@QAEAAV01@ABV01@@Z(ptr ptr) msvcp120.??4_Timevec@std@@QAEAAV01@ABV01@@Z +@ cdecl -arch=win64 ??4_Timevec@std@@QEAAAEAV01@AEBV01@@Z(ptr ptr) msvcp120.??4_Timevec@std@@QEAAAEAV01@AEBV01@@Z +@ stub -arch=arm ??4_UShinit@std@@QAAAAV01@ABV01@@Z +@ stub -arch=i386 ??4_UShinit@std@@QAEAAV01@ABV01@@Z +@ stub -arch=win64 ??4_UShinit@std@@QEAAAEAV01@AEBV01@@Z +@ cdecl -arch=arm ??4_Winit@std@@QAAAAV01@ABV01@@Z(ptr ptr) msvcp120.??4_Winit@std@@QAAAAV01@ABV01@@Z +@ thiscall -arch=i386 ??4_Winit@std@@QAEAAV01@ABV01@@Z(ptr ptr) msvcp120.??4_Winit@std@@QAEAAV01@ABV01@@Z +@ cdecl -arch=win64 ??4_Winit@std@@QEAAAEAV01@AEBV01@@Z(ptr ptr) msvcp120.??4_Winit@std@@QEAAAEAV01@AEBV01@@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAF@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAF@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAF@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAF@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAF@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAF@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAG@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAG@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAG@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAG@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAG@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAG@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAH@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAH@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAH@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAH@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAH@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAH@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAI@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAI@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAI@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAI@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAI@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAI@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAJ@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAJ@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAJ@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAJ@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAJ@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAJ@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAK@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAK@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAK@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAK@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAK@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAK@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAM@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAM@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAM@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAM@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAM@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAM@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAN@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAN@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAN@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAN@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAN@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAN@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAO@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAO@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAO@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAO@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAO@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAO@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAPAX@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AAPAX@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAPAX@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAPAX@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAPEAX@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAPEAX@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AA_J@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AA_J@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_J@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_J@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_J@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_J@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AA_K@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AA_K@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_K@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_K@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_K@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_K@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AA_N@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@AA_N@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_N@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_N@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_N@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_N@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@P6AAAV01@AAV01@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@P6AAAV01@AAV01@@Z@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@P6AAAV?$basic_ios@DU?$char_traits@D@std@@@1@AAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@P6AAAV?$basic_ios@DU?$char_traits@D@std@@@1@AAV21@@Z@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@DU?$char_traits@D@std@@@1@AAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@DU?$char_traits@D@std@@@1@AAV21@@Z@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@DU?$char_traits@D@std@@@1@AEAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@DU?$char_traits@D@std@@@1@AEAV21@@Z@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@P6AAAVios_base@1@AAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@P6AAAVios_base@1@AAV21@@Z@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z +@ cdecl -arch=arm ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV01@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z +@ thiscall -arch=i386 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z +@ cdecl -arch=win64 ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z(ptr ptr) msvcp120.??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAF@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAF@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAF@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAF@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAF@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAF@Z +@ stub -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAG@Z +@ stub -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAG@Z +@ stub -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAG@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAH@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAH@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAH@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAH@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAH@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAH@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAI@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAI@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAI@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAI@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAI@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAI@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAJ@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAJ@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAJ@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAJ@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAJ@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAJ@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAK@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAK@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAK@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAK@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAK@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAK@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAM@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAM@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAM@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAM@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAM@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAM@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAN@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAN@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAN@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAN@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAN@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAN@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAO@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAO@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAO@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAO@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAO@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAO@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAPAX@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AAPAX@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAPAX@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAPAX@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAPEAX@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAPEAX@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AA_J@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AA_J@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_J@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_J@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_J@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_J@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AA_K@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AA_K@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_K@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_K@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_K@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_K@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AA_N@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@AA_N@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_N@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_N@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_N@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_N@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@P6AAAV01@AAV01@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@P6AAAV01@AAV01@@Z@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@P6AAAV?$basic_ios@GU?$char_traits@G@std@@@1@AAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@P6AAAV?$basic_ios@GU?$char_traits@G@std@@@1@AAV21@@Z@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@GU?$char_traits@G@std@@@1@AAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@GU?$char_traits@G@std@@@1@AAV21@@Z@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@GU?$char_traits@G@std@@@1@AEAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@GU?$char_traits@G@std@@@1@AEAV21@@Z@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@P6AAAVios_base@1@AAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@P6AAAVios_base@1@AAV21@@Z@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z +@ cdecl -arch=arm ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z +@ thiscall -arch=i386 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z +@ cdecl -arch=win64 ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z(ptr ptr) msvcp120.??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAF@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAF@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAF@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAF@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAF@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAF@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAG@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAG@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAG@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAG@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAG@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAG@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAH@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAH@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAH@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAH@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAH@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAH@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAI@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAI@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAI@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAI@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAI@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAI@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAJ@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAJ@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAJ@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAJ@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAJ@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAJ@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAK@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAK@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAK@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAK@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAK@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAK@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAM@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAM@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAM@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAM@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAM@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAM@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAN@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAN@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAN@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAN@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAN@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAN@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAO@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAO@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAO@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAO@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAO@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAO@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAPAX@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AAPAX@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAPAX@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAPAX@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAPEAX@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAPEAX@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AA_J@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AA_J@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AA_J@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AA_J@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_J@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_J@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AA_K@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AA_K@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AA_K@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AA_K@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_K@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_K@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AA_N@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@AA_N@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AA_N@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AA_N@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_N@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_N@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@P6AAAV01@AAV01@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@P6AAAV01@AAV01@@Z@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@P6AAAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@P6AAAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AAV21@@Z@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AAV21@@Z@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AEAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AEAV21@@Z@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@P6AAAVios_base@1@AAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@P6AAAVios_base@1@AAV21@@Z@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z +@ cdecl -arch=arm ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z +@ thiscall -arch=i386 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z +@ cdecl -arch=win64 ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z(ptr ptr) msvcp120.??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@F@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@F@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@F@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@F@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@F@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@F@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@G@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@G@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@G@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@G@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@G@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@G@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@H@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@H@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@H@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@H@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@I@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@I@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@I@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@I@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@I@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@I@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@J@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@J@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@J@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@J@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@J@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@J@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@K@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@K@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@K@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@K@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@M@Z(ptr float) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@M@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@M@Z(ptr float) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@M@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@M@Z(ptr float) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@M@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@N@Z(ptr double) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@N@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@N@Z(ptr double) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@N@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@N@Z(ptr double) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@N@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@O@Z(ptr double) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@O@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@O@Z(ptr double) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@O@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@O@Z(ptr double) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@O@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@P6AAAV01@AAV01@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@P6AAAV01@AAV01@@Z@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@P6AAAV?$basic_ios@DU?$char_traits@D@std@@@1@AAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@P6AAAV?$basic_ios@DU?$char_traits@D@std@@@1@AAV21@@Z@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@DU?$char_traits@D@std@@@1@AAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@DU?$char_traits@D@std@@@1@AAV21@@Z@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@DU?$char_traits@D@std@@@1@AEAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@DU?$char_traits@D@std@@@1@AEAV21@@Z@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@P6AAAVios_base@1@AAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@P6AAAVios_base@1@AAV21@@Z@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@PBX@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@PBX@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@PBX@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@PBX@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEBX@Z(ptr ptr) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEBX@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@_J@Z(ptr int64) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@_J@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_J@Z(ptr int64) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_J@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_J@Z(ptr int64) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_J@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@_K@Z(ptr int64) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@_K@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_K@Z(ptr int64) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_K@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_K@Z(ptr int64) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_K@Z +@ cdecl -arch=arm ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@_N@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV01@_N@Z +@ thiscall -arch=i386 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_N@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_N@Z +@ cdecl -arch=win64 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_N@Z(ptr long) msvcp120.??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_N@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@F@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@F@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@F@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@F@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@F@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@F@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@G@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@G@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@G@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@G@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@G@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@G@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@H@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@H@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@H@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@H@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@H@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@H@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@I@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@I@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@I@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@I@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@I@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@I@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@J@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@J@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@J@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@J@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@J@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@J@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@K@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@K@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@K@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@K@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@K@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@K@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@M@Z(ptr float) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@M@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@M@Z(ptr float) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@M@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@M@Z(ptr float) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@M@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@N@Z(ptr double) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@N@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@N@Z(ptr double) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@N@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@N@Z(ptr double) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@N@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@O@Z(ptr double) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@O@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@O@Z(ptr double) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@O@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@O@Z(ptr double) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@O@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@P6AAAV01@AAV01@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@P6AAAV01@AAV01@@Z@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@P6AAAV?$basic_ios@GU?$char_traits@G@std@@@1@AAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@P6AAAV?$basic_ios@GU?$char_traits@G@std@@@1@AAV21@@Z@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@GU?$char_traits@G@std@@@1@AAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@GU?$char_traits@G@std@@@1@AAV21@@Z@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@GU?$char_traits@G@std@@@1@AEAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@GU?$char_traits@G@std@@@1@AEAV21@@Z@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@P6AAAVios_base@1@AAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@P6AAAVios_base@1@AAV21@@Z@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@PBX@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@PBX@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@PBX@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@PBX@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEBX@Z(ptr ptr) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEBX@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@_J@Z(ptr int64) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@_J@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_J@Z(ptr int64) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_J@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_J@Z(ptr int64) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_J@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@_K@Z(ptr int64) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@_K@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_K@Z(ptr int64) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_K@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_K@Z(ptr int64) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_K@Z +@ cdecl -arch=arm ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@_N@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV01@_N@Z +@ thiscall -arch=i386 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_N@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_N@Z +@ cdecl -arch=win64 ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_N@Z(ptr long) msvcp120.??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_N@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@F@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@F@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@F@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@F@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@F@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@F@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@G@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@G@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@G@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@G@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@G@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@G@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@H@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@H@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@H@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@H@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@H@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@H@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@I@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@I@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@I@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@I@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@I@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@I@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@J@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@J@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@J@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@J@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@J@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@J@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@K@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@K@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@K@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@K@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@K@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@K@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@M@Z(ptr float) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@M@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@M@Z(ptr float) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@M@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@M@Z(ptr float) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@M@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@N@Z(ptr double) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@N@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@N@Z(ptr double) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@N@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@N@Z(ptr double) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@N@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@O@Z(ptr double) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@O@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@O@Z(ptr double) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@O@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@O@Z(ptr double) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@O@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@P6AAAV01@AAV01@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@P6AAAV01@AAV01@@Z@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@P6AAAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@P6AAAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AAV21@@Z@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AAV21@@Z@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AEAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AEAV21@@Z@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@P6AAAVios_base@1@AAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@P6AAAVios_base@1@AAV21@@Z@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@PBX@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@PBX@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@PBX@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@PBX@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEBX@Z(ptr ptr) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEBX@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@_J@Z(ptr int64) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@_J@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@_J@Z(ptr int64) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@_J@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_J@Z(ptr int64) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_J@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@_K@Z(ptr int64) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@_K@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@_K@Z(ptr int64) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@_K@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_K@Z(ptr int64) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_K@Z +@ cdecl -arch=arm ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@_N@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV01@_N@Z +@ thiscall -arch=i386 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@_N@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@_N@Z +@ cdecl -arch=win64 ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_N@Z(ptr long) msvcp120.??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_N@Z +@ cdecl -arch=arm ??7ios_base@std@@QBA_NXZ(ptr) msvcp120.??7ios_base@std@@QBA_NXZ +@ thiscall -arch=i386 ??7ios_base@std@@QBE_NXZ(ptr) msvcp120.??7ios_base@std@@QBE_NXZ +@ cdecl -arch=win64 ??7ios_base@std@@QEBA_NXZ(ptr) msvcp120.??7ios_base@std@@QEBA_NXZ +@ cdecl -arch=arm ??Bid@locale@std@@QAAIXZ(ptr) msvcp120.??Bid@locale@std@@QAAIXZ +@ thiscall -arch=i386 ??Bid@locale@std@@QAEIXZ(ptr) msvcp120.??Bid@locale@std@@QAEIXZ +@ cdecl -arch=win64 ??Bid@locale@std@@QEAA_KXZ(ptr) msvcp120.??Bid@locale@std@@QEAA_KXZ +@ cdecl -arch=arm ??Bios_base@std@@QBA_NXZ(ptr) msvcp120.??Bios_base@std@@QBA_NXZ +@ thiscall -arch=i386 ??Bios_base@std@@QBE_NXZ(ptr) msvcp120.??Bios_base@std@@QBE_NXZ +@ cdecl -arch=win64 ??Bios_base@std@@QEBA_NXZ(ptr) msvcp120.??Bios_base@std@@QEBA_NXZ +@ extern ??_7?$basic_ios@DU?$char_traits@D@std@@@std@@6B@ msvcp120.??_7?$basic_ios@DU?$char_traits@D@std@@@std@@6B@ +@ extern ??_7?$basic_ios@GU?$char_traits@G@std@@@std@@6B@ msvcp120.??_7?$basic_ios@GU?$char_traits@G@std@@@std@@6B@ +@ extern ??_7?$basic_ios@_WU?$char_traits@_W@std@@@std@@6B@ msvcp120.??_7?$basic_ios@_WU?$char_traits@_W@std@@@std@@6B@ +@ extern ??_7?$basic_iostream@DU?$char_traits@D@std@@@std@@6B@ msvcp120.??_7?$basic_iostream@DU?$char_traits@D@std@@@std@@6B@ +@ extern ??_7?$basic_iostream@GU?$char_traits@G@std@@@std@@6B@ msvcp120.??_7?$basic_iostream@GU?$char_traits@G@std@@@std@@6B@ +@ extern ??_7?$basic_iostream@_WU?$char_traits@_W@std@@@std@@6B@ msvcp120.??_7?$basic_iostream@_WU?$char_traits@_W@std@@@std@@6B@ +@ extern ??_7?$basic_istream@DU?$char_traits@D@std@@@std@@6B@ msvcp120.??_7?$basic_istream@DU?$char_traits@D@std@@@std@@6B@ +@ extern ??_7?$basic_istream@GU?$char_traits@G@std@@@std@@6B@ msvcp120.??_7?$basic_istream@GU?$char_traits@G@std@@@std@@6B@ +@ extern ??_7?$basic_istream@_WU?$char_traits@_W@std@@@std@@6B@ msvcp120.??_7?$basic_istream@_WU?$char_traits@_W@std@@@std@@6B@ +@ extern ??_7?$basic_ostream@DU?$char_traits@D@std@@@std@@6B@ msvcp120.??_7?$basic_ostream@DU?$char_traits@D@std@@@std@@6B@ +@ extern ??_7?$basic_ostream@GU?$char_traits@G@std@@@std@@6B@ msvcp120.??_7?$basic_ostream@GU?$char_traits@G@std@@@std@@6B@ +@ extern ??_7?$basic_ostream@_WU?$char_traits@_W@std@@@std@@6B@ msvcp120.??_7?$basic_ostream@_WU?$char_traits@_W@std@@@std@@6B@ +@ extern ??_7?$basic_streambuf@DU?$char_traits@D@std@@@std@@6B@ msvcp120.??_7?$basic_streambuf@DU?$char_traits@D@std@@@std@@6B@ +@ extern ??_7?$basic_streambuf@GU?$char_traits@G@std@@@std@@6B@ msvcp120.??_7?$basic_streambuf@GU?$char_traits@G@std@@@std@@6B@ +@ extern ??_7?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@6B@ msvcp120.??_7?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@6B@ +@ extern ??_7?$codecvt@DDH@std@@6B@ msvcp120.??_7?$codecvt@DDH@std@@6B@ +@ extern ??_7?$codecvt@GDH@std@@6B@ msvcp120.??_7?$codecvt@GDH@std@@6B@ +@ extern ??_7?$codecvt@_WDH@std@@6B@ msvcp120.??_7?$codecvt@_WDH@std@@6B@ +@ extern ??_7?$ctype@D@std@@6B@ msvcp120.??_7?$ctype@D@std@@6B@ +@ extern ??_7?$ctype@G@std@@6B@ msvcp120.??_7?$ctype@G@std@@6B@ +@ extern ??_7?$ctype@_W@std@@6B@ msvcp120.??_7?$ctype@_W@std@@6B@ +@ extern ??_7?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ msvcp120.??_7?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ +@ extern ??_7?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ msvcp120.??_7?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ +@ extern ??_7?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ msvcp120.??_7?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ +@ extern ??_7?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ msvcp120.??_7?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ +@ extern ??_7?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ msvcp120.??_7?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ +@ extern ??_7?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ msvcp120.??_7?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ +# extern ??_7?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ +# extern ??_7?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ +# extern ??_7?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ +@ extern ??_7?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ msvcp120.??_7?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ +@ extern ??_7?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ msvcp120.??_7?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@6B@ +@ extern ??_7?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ msvcp120.??_7?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@6B@ +@ stub ??_7_Facet_base@std@@6B@ +@ extern ??_7_Locimp@locale@std@@6B@ msvcp120.??_7_Locimp@locale@std@@6B@ +@ stub ??_7_Pad@std@@6B@ +@ extern ??_7codecvt_base@std@@6B@ msvcp120.??_7codecvt_base@std@@6B@ +@ extern ??_7ctype_base@std@@6B@ msvcp120.??_7ctype_base@std@@6B@ +@ extern ??_7facet@locale@std@@6B@ msvcp120.??_7facet@locale@std@@6B@ +@ extern ??_7ios_base@std@@6B@ msvcp120.??_7ios_base@std@@6B@ +# extern ??_7time_base@std@@6B@ +@ extern ??_8?$basic_iostream@DU?$char_traits@D@std@@@std@@7B?$basic_istream@DU?$char_traits@D@std@@@1@@ msvcp120.??_8?$basic_iostream@DU?$char_traits@D@std@@@std@@7B?$basic_istream@DU?$char_traits@D@std@@@1@@ +@ extern ??_8?$basic_iostream@DU?$char_traits@D@std@@@std@@7B?$basic_ostream@DU?$char_traits@D@std@@@1@@ msvcp120.??_8?$basic_iostream@DU?$char_traits@D@std@@@std@@7B?$basic_ostream@DU?$char_traits@D@std@@@1@@ +@ extern ??_8?$basic_iostream@GU?$char_traits@G@std@@@std@@7B?$basic_istream@GU?$char_traits@G@std@@@1@@ msvcp120.??_8?$basic_iostream@GU?$char_traits@G@std@@@std@@7B?$basic_istream@GU?$char_traits@G@std@@@1@@ +@ extern ??_8?$basic_iostream@GU?$char_traits@G@std@@@std@@7B?$basic_ostream@GU?$char_traits@G@std@@@1@@ msvcp120.??_8?$basic_iostream@GU?$char_traits@G@std@@@std@@7B?$basic_ostream@GU?$char_traits@G@std@@@1@@ +@ extern ??_8?$basic_iostream@_WU?$char_traits@_W@std@@@std@@7B?$basic_istream@_WU?$char_traits@_W@std@@@1@@ msvcp120.??_8?$basic_iostream@_WU?$char_traits@_W@std@@@std@@7B?$basic_istream@_WU?$char_traits@_W@std@@@1@@ +@ extern ??_8?$basic_iostream@_WU?$char_traits@_W@std@@@std@@7B?$basic_ostream@_WU?$char_traits@_W@std@@@1@@ msvcp120.??_8?$basic_iostream@_WU?$char_traits@_W@std@@@std@@7B?$basic_ostream@_WU?$char_traits@_W@std@@@1@@ +@ extern ??_8?$basic_istream@DU?$char_traits@D@std@@@std@@7B@ msvcp120.??_8?$basic_istream@DU?$char_traits@D@std@@@std@@7B@ +@ extern ??_8?$basic_istream@GU?$char_traits@G@std@@@std@@7B@ msvcp120.??_8?$basic_istream@GU?$char_traits@G@std@@@std@@7B@ +@ extern ??_8?$basic_istream@_WU?$char_traits@_W@std@@@std@@7B@ msvcp120.??_8?$basic_istream@_WU?$char_traits@_W@std@@@std@@7B@ +@ extern ??_8?$basic_ostream@DU?$char_traits@D@std@@@std@@7B@ msvcp120.??_8?$basic_ostream@DU?$char_traits@D@std@@@std@@7B@ +@ extern ??_8?$basic_ostream@GU?$char_traits@G@std@@@std@@7B@ msvcp120.??_8?$basic_ostream@GU?$char_traits@G@std@@@std@@7B@ +@ extern ??_8?$basic_ostream@_WU?$char_traits@_W@std@@@std@@7B@ msvcp120.??_8?$basic_ostream@_WU?$char_traits@_W@std@@@std@@7B@ +@ cdecl -arch=arm ??_D?$basic_iostream@DU?$char_traits@D@std@@@std@@QAAXXZ(ptr) msvcp120.??_D?$basic_iostream@DU?$char_traits@D@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_D?$basic_iostream@DU?$char_traits@D@std@@@std@@QAEXXZ(ptr) msvcp120.??_D?$basic_iostream@DU?$char_traits@D@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_D?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAAXXZ(ptr) msvcp120.??_D?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_D?$basic_iostream@GU?$char_traits@G@std@@@std@@QAAXXZ(ptr) msvcp120.??_D?$basic_iostream@GU?$char_traits@G@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_D?$basic_iostream@GU?$char_traits@G@std@@@std@@QAEXXZ(ptr) msvcp120.??_D?$basic_iostream@GU?$char_traits@G@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_D?$basic_iostream@GU?$char_traits@G@std@@@std@@QEAAXXZ(ptr) msvcp120.??_D?$basic_iostream@GU?$char_traits@G@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_D?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAAXXZ(ptr) msvcp120.??_D?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_D?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ(ptr) msvcp120.??_D?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_D?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ(ptr) msvcp120.??_D?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_D?$basic_istream@DU?$char_traits@D@std@@@std@@QAAXXZ(ptr) msvcp120.??_D?$basic_istream@DU?$char_traits@D@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_D?$basic_istream@DU?$char_traits@D@std@@@std@@QAEXXZ(ptr) msvcp120.??_D?$basic_istream@DU?$char_traits@D@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_D?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAXXZ(ptr) msvcp120.??_D?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_D?$basic_istream@GU?$char_traits@G@std@@@std@@QAAXXZ(ptr) msvcp120.??_D?$basic_istream@GU?$char_traits@G@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_D?$basic_istream@GU?$char_traits@G@std@@@std@@QAEXXZ(ptr) msvcp120.??_D?$basic_istream@GU?$char_traits@G@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_D?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAXXZ(ptr) msvcp120.??_D?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_D?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAXXZ(ptr) msvcp120.??_D?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_D?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEXXZ(ptr) msvcp120.??_D?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_D?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ(ptr) msvcp120.??_D?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAXXZ(ptr) msvcp120.??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ(ptr) msvcp120.??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ(ptr) msvcp120.??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_D?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAXXZ(ptr) msvcp120.??_D?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_D?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ(ptr) msvcp120.??_D?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_D?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ(ptr) msvcp120.??_D?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_D?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAXXZ(ptr) msvcp120.??_D?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_D?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ(ptr) msvcp120.??_D?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_D?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ(ptr) msvcp120.??_D?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$codecvt@DDH@std@@QAAXXZ(ptr) msvcp120.??_F?$codecvt@DDH@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$codecvt@DDH@std@@QAEXXZ(ptr) msvcp120.??_F?$codecvt@DDH@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$codecvt@DDH@std@@QEAAXXZ(ptr) msvcp120.??_F?$codecvt@DDH@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$codecvt@GDH@std@@QAAXXZ(ptr) msvcp120.??_F?$codecvt@GDH@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$codecvt@GDH@std@@QAEXXZ(ptr) msvcp120.??_F?$codecvt@GDH@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$codecvt@GDH@std@@QEAAXXZ(ptr) msvcp120.??_F?$codecvt@GDH@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$codecvt@_WDH@std@@QAAXXZ(ptr) msvcp120.??_F?$codecvt@_WDH@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$codecvt@_WDH@std@@QAEXXZ(ptr) msvcp120.??_F?$codecvt@_WDH@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$codecvt@_WDH@std@@QEAAXXZ(ptr) msvcp120.??_F?$codecvt@_WDH@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$ctype@D@std@@QAAXXZ(ptr) msvcp120.??_F?$ctype@D@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$ctype@D@std@@QAEXXZ(ptr) msvcp120.??_F?$ctype@D@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$ctype@D@std@@QEAAXXZ(ptr) msvcp120.??_F?$ctype@D@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$ctype@G@std@@QAAXXZ(ptr) msvcp120.??_F?$ctype@G@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$ctype@G@std@@QAEXXZ(ptr) msvcp120.??_F?$ctype@G@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$ctype@G@std@@QEAAXXZ(ptr) msvcp120.??_F?$ctype@G@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$ctype@_W@std@@QAAXXZ(ptr) msvcp120.??_F?$ctype@_W@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$ctype@_W@std@@QAEXXZ(ptr) msvcp120.??_F?$ctype@_W@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$ctype@_W@std@@QEAAXXZ(ptr) msvcp120.??_F?$ctype@_W@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAAXXZ(ptr) msvcp120.??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ(ptr) msvcp120.??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ(ptr) msvcp120.??_F?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAAXXZ(ptr) msvcp120.??_F?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ(ptr) msvcp120.??_F?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ(ptr) msvcp120.??_F?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAAXXZ(ptr) msvcp120.??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ(ptr) msvcp120.??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ(ptr) msvcp120.??_F?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAAXXZ(ptr) msvcp120.??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ(ptr) msvcp120.??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ(ptr) msvcp120.??_F?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAAXXZ(ptr) msvcp120.??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ(ptr) msvcp120.??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ(ptr) msvcp120.??_F?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAAXXZ(ptr) msvcp120.??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ(ptr) msvcp120.??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ(ptr) msvcp120.??_F?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ +@ stub -arch=arm ??_F?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAAXXZ +@ stub -arch=i386 ??_F?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ +@ stub -arch=win64 ??_F?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ +@ stub -arch=arm ??_F?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAAXXZ +@ stub -arch=i386 ??_F?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ +@ stub -arch=win64 ??_F?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ +@ stub -arch=arm ??_F?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAAXXZ +@ stub -arch=i386 ??_F?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ +@ stub -arch=win64 ??_F?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAAXXZ(ptr) msvcp120.??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ(ptr) msvcp120.??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ(ptr) msvcp120.??_F?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAAXXZ(ptr) msvcp120.??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ(ptr) msvcp120.??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ(ptr) msvcp120.??_F?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAAXXZ(ptr) msvcp120.??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ(ptr) msvcp120.??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ(ptr) msvcp120.??_F?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ??_F_Locinfo@std@@QAAXXZ(ptr) msvcp120.??_F_Locinfo@std@@QAAXXZ +@ thiscall -arch=i386 ??_F_Locinfo@std@@QAEXXZ(ptr) msvcp120.??_F_Locinfo@std@@QAEXXZ +@ cdecl -arch=win64 ??_F_Locinfo@std@@QEAAXXZ(ptr) msvcp120.??_F_Locinfo@std@@QEAAXXZ +@ cdecl -arch=arm ??_F_Timevec@std@@QAAXXZ(ptr) msvcp120.??_F_Timevec@std@@QAAXXZ +@ thiscall -arch=i386 ??_F_Timevec@std@@QAEXXZ(ptr) msvcp120.??_F_Timevec@std@@QAEXXZ +@ cdecl -arch=win64 ??_F_Timevec@std@@QEAAXXZ(ptr) msvcp120.??_F_Timevec@std@@QEAAXXZ +@ cdecl -arch=arm ??_Fcodecvt_base@std@@QAAXXZ(ptr) msvcp120.??_Fcodecvt_base@std@@QAAXXZ +@ thiscall -arch=i386 ??_Fcodecvt_base@std@@QAEXXZ(ptr) msvcp120.??_Fcodecvt_base@std@@QAEXXZ +@ cdecl -arch=win64 ??_Fcodecvt_base@std@@QEAAXXZ(ptr) msvcp120.??_Fcodecvt_base@std@@QEAAXXZ +@ cdecl -arch=arm ??_Fctype_base@std@@QAAXXZ(ptr) msvcp120.??_Fctype_base@std@@QAAXXZ +@ thiscall -arch=i386 ??_Fctype_base@std@@QAEXXZ(ptr) msvcp120.??_Fctype_base@std@@QAEXXZ +@ cdecl -arch=win64 ??_Fctype_base@std@@QEAAXXZ(ptr) msvcp120.??_Fctype_base@std@@QEAAXXZ +@ cdecl -arch=arm ??_Ffacet@locale@std@@QAAXXZ(ptr) msvcp120.??_Ffacet@locale@std@@QAAXXZ +@ thiscall -arch=i386 ??_Ffacet@locale@std@@QAEXXZ(ptr) msvcp120.??_Ffacet@locale@std@@QAEXXZ +@ cdecl -arch=win64 ??_Ffacet@locale@std@@QEAAXXZ(ptr) msvcp120.??_Ffacet@locale@std@@QEAAXXZ +@ cdecl -arch=arm ??_Fid@locale@std@@QAAXXZ(ptr) msvcp120.??_Fid@locale@std@@QAAXXZ +@ thiscall -arch=i386 ??_Fid@locale@std@@QAEXXZ(ptr) msvcp120.??_Fid@locale@std@@QAEXXZ +@ cdecl -arch=win64 ??_Fid@locale@std@@QEAAXXZ(ptr) msvcp120.??_Fid@locale@std@@QEAAXXZ +@ stub -arch=arm ??_Ftime_base@std@@QAAXXZ +@ stub -arch=i386 ??_Ftime_base@std@@QAEXXZ +@ stub -arch=win64 ??_Ftime_base@std@@QEAAXXZ +@ stub ?GetNextAsyncId@platform@details@Concurrency@@YAIXZ +@ stub -arch=win32 ?NFS_Allocate@details@Concurrency@@YAPAXIIPAX@Z +@ stub -arch=win64 ?NFS_Allocate@details@Concurrency@@YAPEAX_K0PEAX@Z +@ stub -arch=win32 ?NFS_Free@details@Concurrency@@YAXPAX@Z +@ stub -arch=win64 ?NFS_Free@details@Concurrency@@YAXPEAX@Z +@ stub -arch=win32 ?NFS_GetLineSize@details@Concurrency@@YAIXZ +@ stub -arch=win64 ?NFS_GetLineSize@details@Concurrency@@YA_KXZ +@ stub ?_10@placeholders@std@@3V?$_Ph@$09@2@A +@ stub ?_11@placeholders@std@@3V?$_Ph@$0L@@2@A +@ stub ?_12@placeholders@std@@3V?$_Ph@$0M@@2@A +@ stub ?_13@placeholders@std@@3V?$_Ph@$0N@@2@A +@ stub ?_14@placeholders@std@@3V?$_Ph@$0O@@2@A +@ stub ?_15@placeholders@std@@3V?$_Ph@$0P@@2@A +@ stub ?_16@placeholders@std@@3V?$_Ph@$0BA@@2@A +@ stub ?_17@placeholders@std@@3V?$_Ph@$0BB@@2@A +@ stub ?_18@placeholders@std@@3V?$_Ph@$0BC@@2@A +@ stub ?_19@placeholders@std@@3V?$_Ph@$0BD@@2@A +@ stub ?_1@placeholders@std@@3V?$_Ph@$00@2@A +@ stub ?_20@placeholders@std@@3V?$_Ph@$0BE@@2@A +@ stub ?_2@placeholders@std@@3V?$_Ph@$01@2@A +@ stub ?_3@placeholders@std@@3V?$_Ph@$02@2@A +@ stub ?_4@placeholders@std@@3V?$_Ph@$03@2@A +@ stub ?_5@placeholders@std@@3V?$_Ph@$04@2@A +@ stub ?_6@placeholders@std@@3V?$_Ph@$05@2@A +@ stub ?_7@placeholders@std@@3V?$_Ph@$06@2@A +@ stub ?_8@placeholders@std@@3V?$_Ph@$07@2@A +@ stub ?_9@placeholders@std@@3V?$_Ph@$08@2@A +@ cdecl -arch=arm ?_Addcats@_Locinfo@std@@QAAAAV12@HPBD@Z(ptr long str) msvcp120.?_Addcats@_Locinfo@std@@QAAAAV12@HPBD@Z +@ thiscall -arch=i386 ?_Addcats@_Locinfo@std@@QAEAAV12@HPBD@Z(ptr long str) msvcp120.?_Addcats@_Locinfo@std@@QAEAAV12@HPBD@Z +@ cdecl -arch=win64 ?_Addcats@_Locinfo@std@@QEAAAEAV12@HPEBD@Z(ptr long str) msvcp120.?_Addcats@_Locinfo@std@@QEAAAEAV12@HPEBD@Z +@ cdecl -arch=arm ?_Addfac@_Locimp@locale@std@@AAAXPAVfacet@23@I@Z(ptr ptr long) msvcp120.?_Addfac@_Locimp@locale@std@@AAAXPAVfacet@23@I@Z +@ thiscall -arch=i386 ?_Addfac@_Locimp@locale@std@@AAEXPAVfacet@23@I@Z(ptr ptr long) msvcp120.?_Addfac@_Locimp@locale@std@@AAEXPAVfacet@23@I@Z +@ cdecl -arch=win64 ?_Addfac@_Locimp@locale@std@@AEAAXPEAVfacet@23@_K@Z(ptr ptr long) msvcp120.?_Addfac@_Locimp@locale@std@@AEAAXPEAVfacet@23@_K@Z +@ cdecl -arch=win32 ?_Addstd@ios_base@std@@SAXPAV12@@Z(ptr) msvcp120.?_Addstd@ios_base@std@@SAXPAV12@@Z +@ cdecl -arch=win64 ?_Addstd@ios_base@std@@SAXPEAV12@@Z(ptr) msvcp120.?_Addstd@ios_base@std@@SAXPEAV12@@Z +@ stub -arch=arm ?_Advance@_Concurrent_queue_iterator_base_v4@details@Concurrency@@IAAXXZ +@ stub -arch=i386 ?_Advance@_Concurrent_queue_iterator_base_v4@details@Concurrency@@IAEXXZ +@ stub -arch=win64 ?_Advance@_Concurrent_queue_iterator_base_v4@details@Concurrency@@IEAAXXZ +@ stub -arch=arm ?_Assign@_Concurrent_queue_iterator_base_v4@details@Concurrency@@IAAXABV123@@Z +@ stub -arch=i386 ?_Assign@_Concurrent_queue_iterator_base_v4@details@Concurrency@@IAEXABV123@@Z +@ stub -arch=win64 ?_Assign@_Concurrent_queue_iterator_base_v4@details@Concurrency@@IEAAXAEBV123@@Z +@ stub ?_Atexit@@YAXP6AXXZ@Z +@ extern ?_BADOFF@std@@3_JB msvcp120.?_BADOFF@std@@3_JB +@ stub ?_Byte_reverse_table@details@Concurrency@@3QBEB +@ cdecl -arch=arm ?_C_str@?$_Yarn@D@std@@QBAPBDXZ(ptr) msvcp120.?_C_str@?$_Yarn@D@std@@QBAPBDXZ +@ thiscall -arch=i386 ?_C_str@?$_Yarn@D@std@@QBEPBDXZ(ptr) msvcp120.?_C_str@?$_Yarn@D@std@@QBEPBDXZ +@ cdecl -arch=win64 ?_C_str@?$_Yarn@D@std@@QEBAPEBDXZ(ptr) msvcp120.?_C_str@?$_Yarn@D@std@@QEBAPEBDXZ +@ stub -arch=arm ?_C_str@?$_Yarn@_W@std@@QBAPB_WXZ +@ stub -arch=i386 ?_C_str@?$_Yarn@_W@std@@QBEPB_WXZ +@ stub -arch=win64 ?_C_str@?$_Yarn@_W@std@@QEBAPEB_WXZ +@ cdecl -arch=arm ?_Callfns@ios_base@std@@AAAXW4event@12@@Z(ptr long) msvcp120.?_Callfns@ios_base@std@@AAAXW4event@12@@Z +@ thiscall -arch=i386 ?_Callfns@ios_base@std@@AAEXW4event@12@@Z(ptr long) msvcp120.?_Callfns@ios_base@std@@AAEXW4event@12@@Z +@ cdecl -arch=win64 ?_Callfns@ios_base@std@@AEAAXW4event@12@@Z(ptr long) msvcp120.?_Callfns@ios_base@std@@AEAAXW4event@12@@Z +@ extern -arch=win32 ?_Clocptr@_Locimp@locale@std@@0PAV123@A msvcp120.?_Clocptr@_Locimp@locale@std@@0PAV123@A +@ extern -arch=win64 ?_Clocptr@_Locimp@locale@std@@0PEAV123@EA msvcp120.?_Clocptr@_Locimp@locale@std@@0PEAV123@EA +@ stub -arch=win32 ?_Close_dir@sys@tr2@std@@YAXPAX@Z +@ stub -arch=win64 ?_Close_dir@sys@tr2@std@@YAXPEAX@Z +@ stub -arch=win32 ?_Copy_file@sys@tr2@std@@YAHPBD0_N@Z +@ stub -arch=win64 ?_Copy_file@sys@tr2@std@@YAHPEBD0_N@Z +@ stub -arch=win32 ?_Copy_file@sys@tr2@std@@YAHPB_W0_N@Z +@ stub -arch=win64 ?_Copy_file@sys@tr2@std@@YAHPEB_W0_N@Z +@ stub -arch=win32 ?_Current_get@sys@tr2@std@@YAPADAAY0BAE@D@Z +@ stub -arch=win64 ?_Current_get@sys@tr2@std@@YAPEADAEAY0BAE@D@Z +@ stub -arch=win32 ?_Current_get@sys@tr2@std@@YAPA_WAAY0BAE@_W@Z +@ stub -arch=win64 ?_Current_get@sys@tr2@std@@YAPEA_WAEAY0BAE@_W@Z +@ stub -arch=win32 ?_Current_set@sys@tr2@std@@YA_NPBD@Z +@ stub -arch=win64 ?_Current_set@sys@tr2@std@@YA_NPEBD@Z +@ stub -arch=win32 ?_Current_set@sys@tr2@std@@YA_NPB_W@Z +@ stub -arch=win64 ?_Current_set@sys@tr2@std@@YA_NPEB_W@Z +@ cdecl -arch=arm ?_Decref@facet@locale@std@@UAAPAV_Facet_base@3@XZ(ptr) msvcp120.?_Decref@facet@locale@std@@UAAPAV_Facet_base@3@XZ +@ thiscall -arch=i386 ?_Decref@facet@locale@std@@UAEPAV_Facet_base@3@XZ(ptr) msvcp120.?_Decref@facet@locale@std@@UAEPAV_Facet_base@3@XZ +@ cdecl -arch=win64 ?_Decref@facet@locale@std@@UEAAPEAV_Facet_base@3@XZ(ptr) msvcp120.?_Decref@facet@locale@std@@UEAAPEAV_Facet_base@3@XZ +@ cdecl -arch=arm ?_Donarrow@?$ctype@G@std@@IBADGD@Z(ptr long long) msvcp120.?_Donarrow@?$ctype@G@std@@IBADGD@Z +@ thiscall -arch=i386 ?_Donarrow@?$ctype@G@std@@IBEDGD@Z(ptr long long) msvcp120.?_Donarrow@?$ctype@G@std@@IBEDGD@Z +@ cdecl -arch=win64 ?_Donarrow@?$ctype@G@std@@IEBADGD@Z(ptr long long) msvcp120.?_Donarrow@?$ctype@G@std@@IEBADGD@Z +@ cdecl -arch=arm ?_Donarrow@?$ctype@_W@std@@IBAD_WD@Z(ptr long long) msvcp120.?_Donarrow@?$ctype@_W@std@@IBAD_WD@Z +@ thiscall -arch=i386 ?_Donarrow@?$ctype@_W@std@@IBED_WD@Z(ptr long long) msvcp120.?_Donarrow@?$ctype@_W@std@@IBED_WD@Z +@ cdecl -arch=win64 ?_Donarrow@?$ctype@_W@std@@IEBAD_WD@Z(ptr long long) msvcp120.?_Donarrow@?$ctype@_W@std@@IEBAD_WD@Z +@ cdecl -arch=arm ?_Dowiden@?$ctype@G@std@@IBAGD@Z(ptr long) msvcp120.?_Dowiden@?$ctype@G@std@@IBAGD@Z +@ thiscall -arch=i386 ?_Dowiden@?$ctype@G@std@@IBEGD@Z(ptr long) msvcp120.?_Dowiden@?$ctype@G@std@@IBEGD@Z +@ cdecl -arch=win64 ?_Dowiden@?$ctype@G@std@@IEBAGD@Z(ptr long) msvcp120.?_Dowiden@?$ctype@G@std@@IEBAGD@Z +@ cdecl -arch=arm ?_Dowiden@?$ctype@_W@std@@IBA_WD@Z(ptr long) msvcp120.?_Dowiden@?$ctype@_W@std@@IBA_WD@Z +@ thiscall -arch=i386 ?_Dowiden@?$ctype@_W@std@@IBE_WD@Z(ptr long) msvcp120.?_Dowiden@?$ctype@_W@std@@IBE_WD@Z +@ cdecl -arch=win64 ?_Dowiden@?$ctype@_W@std@@IEBA_WD@Z(ptr long) msvcp120.?_Dowiden@?$ctype@_W@std@@IEBA_WD@Z +@ cdecl -arch=arm ?_Empty@?$_Yarn@D@std@@QBA_NXZ(ptr) msvcp120.?_Empty@?$_Yarn@D@std@@QBA_NXZ +@ thiscall -arch=i386 ?_Empty@?$_Yarn@D@std@@QBE_NXZ(ptr) msvcp120.?_Empty@?$_Yarn@D@std@@QBE_NXZ +@ cdecl -arch=win64 ?_Empty@?$_Yarn@D@std@@QEBA_NXZ(ptr) msvcp120.?_Empty@?$_Yarn@D@std@@QEBA_NXZ +@ stub -arch=arm ?_Empty@?$_Yarn@_W@std@@QBA_NXZ +@ stub -arch=i386 ?_Empty@?$_Yarn@_W@std@@QBE_NXZ +@ stub -arch=win64 ?_Empty@?$_Yarn@_W@std@@QEBA_NXZ +@ stub -arch=win32 ?_Equivalent@sys@tr2@std@@YAHPBD0@Z +@ stub -arch=win64 ?_Equivalent@sys@tr2@std@@YAHPEBD0@Z +@ stub -arch=win32 ?_Equivalent@sys@tr2@std@@YAHPB_W0@Z +@ stub -arch=win64 ?_Equivalent@sys@tr2@std@@YAHPEB_W0@Z +@ cdecl -arch=win32 ?_Ffmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAPADPADDH@Z(ptr ptr long long) msvcp120.?_Ffmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAPADPADDH@Z +@ cdecl -arch=win64 ?_Ffmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAPEADPEADDH@Z(ptr ptr long long) msvcp120.?_Ffmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAPEADPEADDH@Z +@ cdecl -arch=win32 ?_Ffmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAPADPADDH@Z(ptr ptr long long) msvcp120.?_Ffmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAPADPADDH@Z +@ cdecl -arch=win64 ?_Ffmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAPEADPEADDH@Z(ptr ptr long long) msvcp120.?_Ffmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAPEADPEADDH@Z +@ cdecl -arch=win32 ?_Ffmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAPADPADDH@Z(ptr ptr long long) msvcp120.?_Ffmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAPADPADDH@Z +@ cdecl -arch=win64 ?_Ffmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAPEADPEADDH@Z(ptr ptr long long) msvcp120.?_Ffmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAPEADPEADDH@Z +@ stub -arch=win32 ?_File_size@sys@tr2@std@@YA_KPBD@Z +@ stub -arch=win64 ?_File_size@sys@tr2@std@@YA_KPEBD@Z +@ stub -arch=win32 ?_File_size@sys@tr2@std@@YA_KPB_W@Z +@ stub -arch=win64 ?_File_size@sys@tr2@std@@YA_KPEB_W@Z +@ cdecl -arch=arm ?_Findarr@ios_base@std@@AAAAAU_Iosarray@12@H@Z(ptr long) msvcp120.?_Findarr@ios_base@std@@AAAAAU_Iosarray@12@H@Z +@ thiscall -arch=i386 ?_Findarr@ios_base@std@@AAEAAU_Iosarray@12@H@Z(ptr long) msvcp120.?_Findarr@ios_base@std@@AAEAAU_Iosarray@12@H@Z +@ cdecl -arch=win64 ?_Findarr@ios_base@std@@AEAAAEAU_Iosarray@12@H@Z(ptr long) msvcp120.?_Findarr@ios_base@std@@AEAAAEAU_Iosarray@12@H@Z +@ cdecl -arch=win32 ?_Fiopen@std@@YAPAU_iobuf@@PBDHH@Z(str long long) msvcp120.?_Fiopen@std@@YAPAU_iobuf@@PBDHH@Z +@ cdecl -arch=win64 ?_Fiopen@std@@YAPEAU_iobuf@@PEBDHH@Z(str long long) msvcp120.?_Fiopen@std@@YAPEAU_iobuf@@PEBDHH@Z +@ cdecl -arch=win32 ?_Fiopen@std@@YAPAU_iobuf@@PBGHH@Z(wstr long long) msvcp120.?_Fiopen@std@@YAPAU_iobuf@@PBGHH@Z +@ cdecl -arch=win64 ?_Fiopen@std@@YAPEAU_iobuf@@PEBGHH@Z(wstr long long) msvcp120.?_Fiopen@std@@YAPEAU_iobuf@@PEBGHH@Z +@ cdecl -arch=win32 ?_Fiopen@std@@YAPAU_iobuf@@PB_WHH@Z(wstr long long) msvcp120.?_Fiopen@std@@YAPAU_iobuf@@PB_WHH@Z +@ cdecl -arch=win64 ?_Fiopen@std@@YAPEAU_iobuf@@PEB_WHH@Z(wstr long long) msvcp120.?_Fiopen@std@@YAPEAU_iobuf@@PEB_WHH@Z +@ cdecl -arch=win32 ?_Fput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBDIIII@Z(ptr ptr long ptr ptr long str long long long long) msvcp120.?_Fput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBDIIII@Z +@ cdecl -arch=win64 ?_Fput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBD_K333@Z(ptr ptr ptr ptr long str long long long long) msvcp120.?_Fput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBD_K333@Z +@ cdecl -arch=win32 ?_Fput@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBDIIII@Z(ptr ptr long ptr ptr long str long long long long) msvcp120.?_Fput@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBDIIII@Z +@ cdecl -arch=win64 ?_Fput@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBD_K333@Z(ptr ptr ptr ptr long str long long long long) msvcp120.?_Fput@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBD_K333@Z +@ cdecl -arch=win32 ?_Fput@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBDIIII@Z(ptr ptr long ptr ptr long str long long long long) msvcp120.?_Fput@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBDIIII@Z +@ cdecl -arch=win64 ?_Fput@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBD_K444@Z(ptr ptr ptr ptr long str long long long long) msvcp120.?_Fput@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBD_K444@Z +@ stub -arch=win32 ?_Future_error_map@std@@YAPBDH@Z +@ stub -arch=win64 ?_Future_error_map@std@@YAPEBDH@Z +@ stub -arch=win32 ?_GetCombinableSize@details@Concurrency@@YAIXZ +@ stub -arch=win64 ?_GetCombinableSize@details@Concurrency@@YA_KXZ +@ cdecl -arch=win32 ?_Getcat@?$codecvt@DDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$codecvt@DDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$codecvt@DDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$codecvt@DDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@?$codecvt@GDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$codecvt@GDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$codecvt@GDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$codecvt@GDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@?$codecvt@_WDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$codecvt@_WDH@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$codecvt@_WDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$codecvt@_WDH@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$ctype@G@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$ctype@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$ctype@G@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ stub -arch=win32 ?_Getcat@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ stub -arch=win64 ?_Getcat@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ stub -arch=win32 ?_Getcat@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ stub -arch=win64 ?_Getcat@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ stub -arch=win32 ?_Getcat@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ stub -arch=win64 ?_Getcat@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z +@ cdecl -arch=win64 ?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z(ptr ptr) msvcp120.?_Getcat@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z +@ cdecl -arch=win32 ?_Getcat@facet@locale@std@@SAIPAPBV123@PBV23@@Z(ptr ptr) msvcp120.?_Getcat@facet@locale@std@@SAIPAPBV123@PBV23@@Z +@ cdecl -arch=win64 ?_Getcat@facet@locale@std@@SA_KPEAPEBV123@PEBV23@@Z(ptr ptr) msvcp120.?_Getcat@facet@locale@std@@SA_KPEAPEBV123@PEBV23@@Z +@ cdecl -arch=arm ?_Getcoll@_Locinfo@std@@QBA?AU_Collvec@@XZ(ptr ptr) msvcp120.?_Getcoll@_Locinfo@std@@QBA?AU_Collvec@@XZ +@ thiscall -arch=i386 ?_Getcoll@_Locinfo@std@@QBE?AU_Collvec@@XZ(ptr ptr) msvcp120.?_Getcoll@_Locinfo@std@@QBE?AU_Collvec@@XZ +@ cdecl -arch=win64 ?_Getcoll@_Locinfo@std@@QEBA?AU_Collvec@@XZ(ptr ptr) msvcp120.?_Getcoll@_Locinfo@std@@QEBA?AU_Collvec@@XZ +@ cdecl -arch=arm ?_Getctype@_Locinfo@std@@QBA?AU_Ctypevec@@XZ(ptr ptr) msvcp120.?_Getctype@_Locinfo@std@@QBA?AU_Ctypevec@@XZ +@ thiscall -arch=i386 ?_Getctype@_Locinfo@std@@QBE?AU_Ctypevec@@XZ(ptr ptr) msvcp120.?_Getctype@_Locinfo@std@@QBE?AU_Ctypevec@@XZ +@ cdecl -arch=win64 ?_Getctype@_Locinfo@std@@QEBA?AU_Ctypevec@@XZ(ptr ptr) msvcp120.?_Getctype@_Locinfo@std@@QEBA?AU_Ctypevec@@XZ +@ cdecl -arch=arm ?_Getcvt@_Locinfo@std@@QBA?AU_Cvtvec@@XZ(ptr ptr) msvcp120.?_Getcvt@_Locinfo@std@@QBA?AU_Cvtvec@@XZ +@ thiscall -arch=i386 ?_Getcvt@_Locinfo@std@@QBE?AU_Cvtvec@@XZ(ptr ptr) msvcp120.?_Getcvt@_Locinfo@std@@QBE?AU_Cvtvec@@XZ +@ cdecl -arch=win64 ?_Getcvt@_Locinfo@std@@QEBA?AU_Cvtvec@@XZ(ptr ptr) msvcp120.?_Getcvt@_Locinfo@std@@QEBA?AU_Cvtvec@@XZ +@ cdecl -arch=arm ?_Getdateorder@_Locinfo@std@@QBAHXZ(ptr) msvcp120.?_Getdateorder@_Locinfo@std@@QBAHXZ +@ thiscall -arch=i386 ?_Getdateorder@_Locinfo@std@@QBEHXZ(ptr) msvcp120.?_Getdateorder@_Locinfo@std@@QBEHXZ +@ cdecl -arch=win64 ?_Getdateorder@_Locinfo@std@@QEBAHXZ(ptr) msvcp120.?_Getdateorder@_Locinfo@std@@QEBAHXZ +@ cdecl -arch=arm ?_Getdays@_Locinfo@std@@QBAPBDXZ(ptr) msvcp120.?_Getdays@_Locinfo@std@@QBAPBDXZ +@ thiscall -arch=i386 ?_Getdays@_Locinfo@std@@QBEPBDXZ(ptr) msvcp120.?_Getdays@_Locinfo@std@@QBEPBDXZ +@ cdecl -arch=win64 ?_Getdays@_Locinfo@std@@QEBAPEBDXZ(ptr) msvcp120.?_Getdays@_Locinfo@std@@QEBAPEBDXZ +@ cdecl -arch=arm ?_Getfalse@_Locinfo@std@@QBAPBDXZ(ptr) msvcp120.?_Getfalse@_Locinfo@std@@QBAPBDXZ +@ thiscall -arch=i386 ?_Getfalse@_Locinfo@std@@QBEPBDXZ(ptr) msvcp120.?_Getfalse@_Locinfo@std@@QBEPBDXZ +@ cdecl -arch=win64 ?_Getfalse@_Locinfo@std@@QEBAPEBDXZ(ptr) msvcp120.?_Getfalse@_Locinfo@std@@QEBAPEBDXZ +@ stub -arch=win32 ?_Getffld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1AAVios_base@2@PAH@Z +@ stub -arch=win64 ?_Getffld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1AEAVios_base@2@PEAH@Z +@ stub -arch=win32 ?_Getffld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1AAVios_base@2@PAH@Z +@ stub -arch=win64 ?_Getffld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1AEAVios_base@2@PEAH@Z +@ stub -arch=win32 ?_Getffld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1AAVios_base@2@PAH@Z +@ stub -arch=win64 ?_Getffld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1AEAVios_base@2@PEAH@Z +@ cdecl -arch=win32 ?_Getffldx@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1AAVios_base@2@PAH@Z(ptr str ptr ptr ptr ptr) msvcp120.?_Getffldx@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1AAVios_base@2@PAH@Z +@ cdecl -arch=win64 ?_Getffldx@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1AEAVios_base@2@PEAH@Z(ptr str ptr ptr ptr ptr) msvcp120.?_Getffldx@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1AEAVios_base@2@PEAH@Z +@ cdecl -arch=win32 ?_Getffldx@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1AAVios_base@2@PAH@Z(ptr str ptr ptr ptr ptr) msvcp120.?_Getffldx@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1AAVios_base@2@PAH@Z +@ cdecl -arch=win64 ?_Getffldx@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1AEAVios_base@2@PEAH@Z(ptr str ptr ptr ptr ptr) msvcp120.?_Getffldx@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1AEAVios_base@2@PEAH@Z +@ cdecl -arch=win32 ?_Getffldx@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1AAVios_base@2@PAH@Z(ptr str ptr ptr ptr ptr) msvcp120.?_Getffldx@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1AAVios_base@2@PAH@Z +@ cdecl -arch=win64 ?_Getffldx@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1AEAVios_base@2@PEAH@Z(ptr str ptr ptr ptr ptr) msvcp120.?_Getffldx@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1AEAVios_base@2@PEAH@Z +@ stub -arch=arm ?_Getfmt@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@PBD@Z +@ stub -arch=i386 ?_Getfmt@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@PBD@Z +@ stub -arch=win64 ?_Getfmt@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@PEBD@Z +@ stub -arch=arm ?_Getfmt@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@PBD@Z +@ stub -arch=i386 ?_Getfmt@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@PBD@Z +@ stub -arch=win64 ?_Getfmt@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@PEBD@Z +@ stub -arch=arm ?_Getfmt@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@PBD@Z +@ stub -arch=i386 ?_Getfmt@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@PBD@Z +@ stub -arch=win64 ?_Getfmt@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@PEBD@Z +@ cdecl -arch=win32 ?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ() msvcp120.?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ +@ cdecl -arch=win64 ?_Getgloballocale@locale@std@@CAPEAV_Locimp@12@XZ() msvcp120.?_Getgloballocale@locale@std@@CAPEAV_Locimp@12@XZ +@ cdecl -arch=win32 ?_Getifld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1HABVlocale@2@@Z(ptr str ptr ptr long ptr) msvcp120.?_Getifld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1HABVlocale@2@@Z +@ cdecl -arch=win64 ?_Getifld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1HAEBVlocale@2@@Z(ptr str ptr ptr long ptr) msvcp120.?_Getifld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@1HAEBVlocale@2@@Z +@ cdecl -arch=win32 ?_Getifld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1HABVlocale@2@@Z(ptr str ptr ptr long ptr) msvcp120.?_Getifld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1HABVlocale@2@@Z +@ cdecl -arch=win64 ?_Getifld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1HAEBVlocale@2@@Z(ptr str ptr ptr long ptr) msvcp120.?_Getifld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@1HAEBVlocale@2@@Z +@ cdecl -arch=win32 ?_Getifld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1HABVlocale@2@@Z(ptr str ptr ptr long ptr) msvcp120.?_Getifld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1HABVlocale@2@@Z +@ cdecl -arch=win64 ?_Getifld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1HAEBVlocale@2@@Z(ptr str ptr ptr long ptr) msvcp120.?_Getifld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@1HAEBVlocale@2@@Z +@ stub -arch=win32 ?_Getint@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@0HHAAHABV?$ctype@D@2@@Z +@ stub -arch=win64 ?_Getint@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@0HHAEAHAEBV?$ctype@D@2@@Z +@ stub -arch=win32 ?_Getint@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAHAAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@0HHAAHABV?$ctype@G@2@@Z +@ stub -arch=win64 ?_Getint@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@0HHAEAHAEBV?$ctype@G@2@@Z +@ stub -arch=win32 ?_Getint@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@0HHAAHABV?$ctype@_W@2@@Z +@ stub -arch=win64 ?_Getint@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@0HHAEAHAEBV?$ctype@_W@2@@Z +@ cdecl -arch=arm ?_Getlconv@_Locinfo@std@@QBAPBUlconv@@XZ(ptr) msvcp120.?_Getlconv@_Locinfo@std@@QBAPBUlconv@@XZ +@ thiscall -arch=i386 ?_Getlconv@_Locinfo@std@@QBEPBUlconv@@XZ(ptr) msvcp120.?_Getlconv@_Locinfo@std@@QBEPBUlconv@@XZ +@ cdecl -arch=win64 ?_Getlconv@_Locinfo@std@@QEBAPEBUlconv@@XZ(ptr) msvcp120.?_Getlconv@_Locinfo@std@@QEBAPEBUlconv@@XZ +@ cdecl -arch=arm ?_Getmonths@_Locinfo@std@@QBAPBDXZ(ptr) msvcp120.?_Getmonths@_Locinfo@std@@QBAPBDXZ +@ thiscall -arch=i386 ?_Getmonths@_Locinfo@std@@QBEPBDXZ(ptr) msvcp120.?_Getmonths@_Locinfo@std@@QBEPBDXZ +@ cdecl -arch=win64 ?_Getmonths@_Locinfo@std@@QEBAPEBDXZ(ptr) msvcp120.?_Getmonths@_Locinfo@std@@QEBAPEBDXZ +@ stub -arch=arm ?_Getname@_Locinfo@std@@QBAPBDXZ +@ thiscall -arch=win32 ?_Getname@_Locinfo@std@@QBEPBDXZ(ptr) msvcp120.?_Getname@_Locinfo@std@@QBEPBDXZ +@ cdecl -arch=win64 ?_Getname@_Locinfo@std@@QEBAPEBDXZ(ptr) msvcp120.?_Getname@_Locinfo@std@@QEBAPEBDXZ +@ cdecl -arch=arm ?_Getpfirst@_Container_base12@std@@QBAPAPAU_Iterator_base12@2@XZ(ptr) msvcp120.?_Getpfirst@_Container_base12@std@@QBAPAPAU_Iterator_base12@2@XZ +@ thiscall -arch=i386 ?_Getpfirst@_Container_base12@std@@QBEPAPAU_Iterator_base12@2@XZ(ptr) msvcp120.?_Getpfirst@_Container_base12@std@@QBEPAPAU_Iterator_base12@2@XZ +@ cdecl -arch=win64 ?_Getpfirst@_Container_base12@std@@QEBAPEAPEAU_Iterator_base12@2@XZ(ptr) msvcp120.?_Getpfirst@_Container_base12@std@@QEBAPEAPEAU_Iterator_base12@2@XZ +@ cdecl -arch=arm ?_Getptr@_Timevec@std@@QBAPAXXZ(ptr) msvcp120.?_Getptr@_Timevec@std@@QBAPAXXZ +@ thiscall -arch=i386 ?_Getptr@_Timevec@std@@QBEPAXXZ(ptr) msvcp120.?_Getptr@_Timevec@std@@QBEPAXXZ +@ cdecl -arch=win64 ?_Getptr@_Timevec@std@@QEBAPEAXXZ(ptr) msvcp120.?_Getptr@_Timevec@std@@QEBAPEAXXZ +@ cdecl -arch=arm ?_Gettnames@_Locinfo@std@@QBA?AV_Timevec@2@XZ(ptr ptr) msvcp120.?_Gettnames@_Locinfo@std@@QBA?AV_Timevec@2@XZ +@ thiscall -arch=i386 ?_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ(ptr ptr) msvcp120.?_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ +@ cdecl -arch=win64 ?_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ(ptr ptr) msvcp120.?_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ +@ cdecl -arch=arm ?_Gettrue@_Locinfo@std@@QBAPBDXZ(ptr) msvcp120.?_Gettrue@_Locinfo@std@@QBAPBDXZ +@ thiscall -arch=i386 ?_Gettrue@_Locinfo@std@@QBEPBDXZ(ptr) msvcp120.?_Gettrue@_Locinfo@std@@QBEPBDXZ +@ cdecl -arch=win64 ?_Gettrue@_Locinfo@std@@QEBAPEBDXZ(ptr) msvcp120.?_Gettrue@_Locinfo@std@@QEBAPEBDXZ +@ cdecl -ret64 -arch=arm ?_Gnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBA_JXZ(ptr) msvcp120.?_Gnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBA_JXZ +@ thiscall -ret64 -arch=i386 ?_Gnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBE_JXZ(ptr) msvcp120.?_Gnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBE_JXZ +@ cdecl -arch=win64 ?_Gnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBA_JXZ(ptr) msvcp120.?_Gnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBA_JXZ +@ cdecl -ret64 -arch=arm ?_Gnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBA_JXZ(ptr) msvcp120.?_Gnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBA_JXZ +@ thiscall -ret64 -arch=i386 ?_Gnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBE_JXZ(ptr) msvcp120.?_Gnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBE_JXZ +@ cdecl -arch=win64 ?_Gnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBA_JXZ(ptr) msvcp120.?_Gnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBA_JXZ +@ cdecl -ret64 -arch=arm ?_Gnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBA_JXZ(ptr) msvcp120.?_Gnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBA_JXZ +@ thiscall -ret64 -arch=i386 ?_Gnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBE_JXZ(ptr) msvcp120.?_Gnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBE_JXZ +@ cdecl -arch=win64 ?_Gnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBA_JXZ(ptr) msvcp120.?_Gnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBA_JXZ +@ cdecl -arch=arm ?_Gndec@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAPADXZ(ptr) msvcp120.?_Gndec@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAPADXZ +@ thiscall -arch=i386 ?_Gndec@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ(ptr) msvcp120.?_Gndec@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ +@ cdecl -arch=win64 ?_Gndec@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ(ptr) msvcp120.?_Gndec@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ +@ cdecl -arch=arm ?_Gndec@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAPAGXZ(ptr) msvcp120.?_Gndec@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAPAGXZ +@ thiscall -arch=i386 ?_Gndec@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEPAGXZ(ptr) msvcp120.?_Gndec@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEPAGXZ +@ cdecl -arch=win64 ?_Gndec@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ(ptr) msvcp120.?_Gndec@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ +@ cdecl -arch=arm ?_Gndec@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAPA_WXZ(ptr) msvcp120.?_Gndec@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAPA_WXZ +@ thiscall -arch=i386 ?_Gndec@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEPA_WXZ(ptr) msvcp120.?_Gndec@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEPA_WXZ +@ cdecl -arch=win64 ?_Gndec@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ(ptr) msvcp120.?_Gndec@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ +@ cdecl -arch=arm ?_Gninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAPADXZ(ptr) msvcp120.?_Gninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAPADXZ +@ thiscall -arch=i386 ?_Gninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ(ptr) msvcp120.?_Gninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ +@ cdecl -arch=win64 ?_Gninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ(ptr) msvcp120.?_Gninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ +@ cdecl -arch=arm ?_Gninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAPAGXZ(ptr) msvcp120.?_Gninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAPAGXZ +@ thiscall -arch=i386 ?_Gninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEPAGXZ(ptr) msvcp120.?_Gninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEPAGXZ +@ cdecl -arch=win64 ?_Gninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ(ptr) msvcp120.?_Gninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ +@ cdecl -arch=arm ?_Gninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAPA_WXZ(ptr) msvcp120.?_Gninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAPA_WXZ +@ thiscall -arch=i386 ?_Gninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEPA_WXZ(ptr) msvcp120.?_Gninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEPA_WXZ +@ cdecl -arch=win64 ?_Gninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ(ptr) msvcp120.?_Gninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ +@ cdecl -arch=arm ?_Gnpreinc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAPADXZ(ptr) msvcp120.?_Gnpreinc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAPADXZ +@ thiscall -arch=i386 ?_Gnpreinc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ(ptr) msvcp120.?_Gnpreinc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ +@ cdecl -arch=win64 ?_Gnpreinc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ(ptr) msvcp120.?_Gnpreinc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ +@ cdecl -arch=arm ?_Gnpreinc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAPAGXZ(ptr) msvcp120.?_Gnpreinc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAPAGXZ +@ thiscall -arch=i386 ?_Gnpreinc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEPAGXZ(ptr) msvcp120.?_Gnpreinc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEPAGXZ +@ cdecl -arch=win64 ?_Gnpreinc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ(ptr) msvcp120.?_Gnpreinc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ +@ cdecl -arch=arm ?_Gnpreinc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAPA_WXZ(ptr) msvcp120.?_Gnpreinc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAPA_WXZ +@ thiscall -arch=i386 ?_Gnpreinc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEPA_WXZ(ptr) msvcp120.?_Gnpreinc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEPA_WXZ +@ cdecl -arch=win64 ?_Gnpreinc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ(ptr) msvcp120.?_Gnpreinc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ +@ extern ?_Id_cnt@id@locale@std@@0HA msvcp120.?_Id_cnt@id@locale@std@@0HA +@ cdecl -arch=win32 ?_Ifmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAPADPADPBDH@Z(ptr ptr str long) msvcp120.?_Ifmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAPADPADPBDH@Z +@ cdecl -arch=win64 ?_Ifmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z(ptr ptr str long) msvcp120.?_Ifmt@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z +@ cdecl -arch=win32 ?_Ifmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAPADPADPBDH@Z(ptr ptr str long) msvcp120.?_Ifmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAPADPADPBDH@Z +@ cdecl -arch=win64 ?_Ifmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z(ptr ptr str long) msvcp120.?_Ifmt@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z +@ cdecl -arch=win32 ?_Ifmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAPADPADPBDH@Z(ptr ptr str long) msvcp120.?_Ifmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAPADPADPBDH@Z +@ cdecl -arch=win64 ?_Ifmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z(ptr ptr str long) msvcp120.?_Ifmt@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAPEADPEADPEBDH@Z +@ cdecl -arch=arm ?_Incref@facet@locale@std@@UAAXXZ(ptr) msvcp120.?_Incref@facet@locale@std@@UAAXXZ +@ thiscall -arch=i386 ?_Incref@facet@locale@std@@UAEXXZ(ptr) msvcp120.?_Incref@facet@locale@std@@UAEXXZ +@ cdecl -arch=win64 ?_Incref@facet@locale@std@@UEAAXXZ(ptr) msvcp120.?_Incref@facet@locale@std@@UEAAXXZ +@ extern ?_Index@ios_base@std@@0HA msvcp120.?_Index@ios_base@std@@0HA +@ cdecl -arch=arm ?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXPAPAD0PAH001@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXPAPAD0PAH001@Z +@ thiscall -arch=i386 ?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXPAPAD0PAH001@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXPAPAD0PAH001@Z +@ cdecl -arch=win64 ?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAPEAD0PEAH001@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAPEAD0PEAH001@Z +@ cdecl -arch=arm ?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXXZ(ptr) msvcp120.?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXXZ +@ thiscall -arch=i386 ?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXXZ(ptr) msvcp120.?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXXZ +@ cdecl -arch=win64 ?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXXZ(ptr) msvcp120.?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXXZ +@ cdecl -arch=arm ?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXPAPAG0PAH001@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXPAPAG0PAH001@Z +@ thiscall -arch=i386 ?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXPAPAG0PAH001@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXPAPAG0PAH001@Z +@ cdecl -arch=win64 ?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAPEAG0PEAH001@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAPEAG0PEAH001@Z +@ cdecl -arch=arm ?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXXZ(ptr) msvcp120.?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXXZ +@ thiscall -arch=i386 ?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXXZ(ptr) msvcp120.?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXXZ +@ cdecl -arch=win64 ?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXXZ(ptr) msvcp120.?_Init@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXXZ +@ cdecl -arch=arm ?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXPAPA_W0PAH001@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXPAPA_W0PAH001@Z +@ thiscall -arch=i386 ?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPAPA_W0PAH001@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPAPA_W0PAH001@Z +@ cdecl -arch=win64 ?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEAPEA_W0PEAH001@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEAPEA_W0PEAH001@Z +@ cdecl -arch=arm ?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXXZ(ptr) msvcp120.?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXXZ +@ thiscall -arch=i386 ?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXXZ(ptr) msvcp120.?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXXZ +@ cdecl -arch=win64 ?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXXZ(ptr) msvcp120.?_Init@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXXZ +@ cdecl -arch=arm ?_Init@?$codecvt@DDH@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$codecvt@DDH@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$codecvt@DDH@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$codecvt@DDH@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$codecvt@DDH@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$codecvt@DDH@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@?$codecvt@GDH@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$codecvt@GDH@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$codecvt@GDH@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$codecvt@GDH@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$codecvt@GDH@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$codecvt@GDH@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@?$codecvt@_WDH@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$codecvt@_WDH@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$codecvt@_WDH@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$codecvt@_WDH@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$codecvt@_WDH@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$codecvt@_WDH@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@?$ctype@D@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$ctype@D@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$ctype@D@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$ctype@D@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$ctype@D@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$ctype@D@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@?$ctype@G@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$ctype@G@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$ctype@G@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$ctype@G@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$ctype@G@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$ctype@G@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@?$ctype@_W@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$ctype@_W@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$ctype@_W@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$ctype@_W@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$ctype@_W@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$ctype@_W@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z +@ stub -arch=arm ?_Init@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z +@ stub -arch=i386 ?_Init@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z +@ stub -arch=win64 ?_Init@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z +@ stub -arch=arm ?_Init@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z +@ stub -arch=i386 ?_Init@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z +@ stub -arch=win64 ?_Init@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z +@ stub -arch=arm ?_Init@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z +@ stub -arch=i386 ?_Init@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z +@ stub -arch=win64 ?_Init@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAAXABV_Locinfo@2@@Z +@ thiscall -arch=i386 ?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IAEXABV_Locinfo@2@@Z +@ cdecl -arch=win64 ?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z(ptr ptr) msvcp120.?_Init@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@IEAAXAEBV_Locinfo@2@@Z +@ cdecl -arch=arm ?_Init@ios_base@std@@IAAXXZ(ptr) msvcp120.?_Init@ios_base@std@@IAAXXZ +@ thiscall -arch=i386 ?_Init@ios_base@std@@IAEXXZ(ptr) msvcp120.?_Init@ios_base@std@@IAEXXZ +@ cdecl -arch=win64 ?_Init@ios_base@std@@IEAAXXZ(ptr) msvcp120.?_Init@ios_base@std@@IEAAXXZ +@ cdecl -arch=win32 ?_Init@locale@std@@CAPAV_Locimp@12@_N@Z(long) msvcp120.?_Init@locale@std@@CAPAV_Locimp@12@_N@Z +@ cdecl -arch=win64 ?_Init@locale@std@@CAPEAV_Locimp@12@_N@Z(long) msvcp120.?_Init@locale@std@@CAPEAV_Locimp@12@_N@Z +@ extern ?_Init_cnt@Init@ios_base@std@@0HA msvcp120.?_Init_cnt@Init@ios_base@std@@0HA +# extern ?_Init_cnt@_UShinit@std@@0HA +@ extern ?_Init_cnt@_Winit@std@@0HA msvcp120.?_Init_cnt@_Winit@std@@0HA +@ cdecl -arch=win32 ?_Init_cnt_func@Init@ios_base@std@@CAAAHXZ() msvcp120.?_Init_cnt_func@Init@ios_base@std@@CAAAHXZ +@ cdecl -arch=win64 ?_Init_cnt_func@Init@ios_base@std@@CAAEAHXZ() msvcp120.?_Init_cnt_func@Init@ios_base@std@@CAAEAHXZ +@ cdecl -arch=win32 ?_Init_ctor@Init@ios_base@std@@CAXPAV123@@Z(ptr) msvcp120.?_Init_ctor@Init@ios_base@std@@CAXPAV123@@Z +@ cdecl -arch=win64 ?_Init_ctor@Init@ios_base@std@@CAXPEAV123@@Z(ptr) msvcp120.?_Init_ctor@Init@ios_base@std@@CAXPEAV123@@Z +@ cdecl -arch=win32 ?_Init_dtor@Init@ios_base@std@@CAXPAV123@@Z(ptr) msvcp120.?_Init_dtor@Init@ios_base@std@@CAXPAV123@@Z +@ cdecl -arch=win64 ?_Init_dtor@Init@ios_base@std@@CAXPEAV123@@Z(ptr) msvcp120.?_Init_dtor@Init@ios_base@std@@CAXPEAV123@@Z +@ stub -arch=win32 ?_Init_locks_ctor@_Init_locks@std@@CAXPAV12@@Z +@ stub -arch=win64 ?_Init_locks_ctor@_Init_locks@std@@CAXPEAV12@@Z +@ stub -arch=win32 ?_Init_locks_dtor@_Init_locks@std@@CAXPAV12@@Z +@ stub -arch=win64 ?_Init_locks_dtor@_Init_locks@std@@CAXPEAV12@@Z +@ stub -arch=arm ?_Internal_assign@_Concurrent_vector_base_v4@details@Concurrency@@IAAXABV123@IP6AXPAXI@ZP6AX1PBXI@Z4@Z +@ stub -arch=i386 ?_Internal_assign@_Concurrent_vector_base_v4@details@Concurrency@@IAEXABV123@IP6AXPAXI@ZP6AX1PBXI@Z4@Z +@ stub -arch=win64 ?_Internal_assign@_Concurrent_vector_base_v4@details@Concurrency@@IEAAXAEBV123@_KP6AXPEAX1@ZP6AX2PEBX1@Z5@Z +@ stub -arch=arm ?_Internal_capacity@_Concurrent_vector_base_v4@details@Concurrency@@IBAIXZ +@ stub -arch=i386 ?_Internal_capacity@_Concurrent_vector_base_v4@details@Concurrency@@IBEIXZ +@ stub -arch=win64 ?_Internal_capacity@_Concurrent_vector_base_v4@details@Concurrency@@IEBA_KXZ +@ stub -arch=arm ?_Internal_clear@_Concurrent_vector_base_v4@details@Concurrency@@IAAIP6AXPAXI@Z@Z +@ stub -arch=i386 ?_Internal_clear@_Concurrent_vector_base_v4@details@Concurrency@@IAEIP6AXPAXI@Z@Z +@ stub -arch=win64 ?_Internal_clear@_Concurrent_vector_base_v4@details@Concurrency@@IEAA_KP6AXPEAX_K@Z@Z +@ stub -arch=arm ?_Internal_compact@_Concurrent_vector_base_v4@details@Concurrency@@IAAPAXIPAXP6AX0I@ZP6AX0PBXI@Z@Z +@ stub -arch=i386 ?_Internal_compact@_Concurrent_vector_base_v4@details@Concurrency@@IAEPAXIPAXP6AX0I@ZP6AX0PBXI@Z@Z +@ stub -arch=win64 ?_Internal_compact@_Concurrent_vector_base_v4@details@Concurrency@@IEAAPEAX_KPEAXP6AX10@ZP6AX1PEBX0@Z@Z +@ stub -arch=arm ?_Internal_copy@_Concurrent_vector_base_v4@details@Concurrency@@IAAXABV123@IP6AXPAXPBXI@Z@Z +@ stub -arch=i386 ?_Internal_copy@_Concurrent_vector_base_v4@details@Concurrency@@IAEXABV123@IP6AXPAXPBXI@Z@Z +@ stub -arch=win64 ?_Internal_copy@_Concurrent_vector_base_v4@details@Concurrency@@IEAAXAEBV123@_KP6AXPEAXPEBX1@Z@Z +@ stub -arch=arm ?_Internal_empty@_Concurrent_queue_base_v4@details@Concurrency@@IBA_NXZ +@ stub -arch=i386 ?_Internal_empty@_Concurrent_queue_base_v4@details@Concurrency@@IBE_NXZ +@ stub -arch=win64 ?_Internal_empty@_Concurrent_queue_base_v4@details@Concurrency@@IEBA_NXZ +@ stub -arch=arm ?_Internal_finish_clear@_Concurrent_queue_base_v4@details@Concurrency@@IAAXXZ +@ stub -arch=i386 ?_Internal_finish_clear@_Concurrent_queue_base_v4@details@Concurrency@@IAEXXZ +@ stub -arch=win64 ?_Internal_finish_clear@_Concurrent_queue_base_v4@details@Concurrency@@IEAAXXZ +@ stub -arch=arm ?_Internal_grow_by@_Concurrent_vector_base_v4@details@Concurrency@@IAAIIIP6AXPAXPBXI@Z1@Z +@ stub -arch=i386 ?_Internal_grow_by@_Concurrent_vector_base_v4@details@Concurrency@@IAEIIIP6AXPAXPBXI@Z1@Z +@ stub -arch=win64 ?_Internal_grow_by@_Concurrent_vector_base_v4@details@Concurrency@@IEAA_K_K0P6AXPEAXPEBX0@Z2@Z +@ stub -arch=arm ?_Internal_grow_to_at_least_with_result@_Concurrent_vector_base_v4@details@Concurrency@@IAAIIIP6AXPAXPBXI@Z1@Z +@ stub -arch=i386 ?_Internal_grow_to_at_least_with_result@_Concurrent_vector_base_v4@details@Concurrency@@IAEIIIP6AXPAXPBXI@Z1@Z +@ stub -arch=win64 ?_Internal_grow_to_at_least_with_result@_Concurrent_vector_base_v4@details@Concurrency@@IEAA_K_K0P6AXPEAXPEBX0@Z2@Z +@ stub -arch=arm ?_Internal_move_push@_Concurrent_queue_base_v4@details@Concurrency@@IAAXPAX@Z +@ stub -arch=i386 ?_Internal_move_push@_Concurrent_queue_base_v4@details@Concurrency@@IAEXPAX@Z +@ stub -arch=win64 ?_Internal_move_push@_Concurrent_queue_base_v4@details@Concurrency@@IEAAXPEAX@Z +@ stub -arch=arm ?_Internal_pop_if_present@_Concurrent_queue_base_v4@details@Concurrency@@IAA_NPAX@Z +@ stub -arch=i386 ?_Internal_pop_if_present@_Concurrent_queue_base_v4@details@Concurrency@@IAE_NPAX@Z +@ stub -arch=win64 ?_Internal_pop_if_present@_Concurrent_queue_base_v4@details@Concurrency@@IEAA_NPEAX@Z +@ stub -arch=arm ?_Internal_push@_Concurrent_queue_base_v4@details@Concurrency@@IAAXPBX@Z +@ stub -arch=i386 ?_Internal_push@_Concurrent_queue_base_v4@details@Concurrency@@IAEXPBX@Z +@ stub -arch=win64 ?_Internal_push@_Concurrent_queue_base_v4@details@Concurrency@@IEAAXPEBX@Z +@ stub -arch=arm ?_Internal_push_back@_Concurrent_vector_base_v4@details@Concurrency@@IAAPAXIAAI@Z +@ stub -arch=i386 ?_Internal_push_back@_Concurrent_vector_base_v4@details@Concurrency@@IAEPAXIAAI@Z +@ stub -arch=win64 ?_Internal_push_back@_Concurrent_vector_base_v4@details@Concurrency@@IEAAPEAX_KAEA_K@Z +@ stub -arch=arm ?_Internal_reserve@_Concurrent_vector_base_v4@details@Concurrency@@IAAXIII@Z +@ stub -arch=i386 ?_Internal_reserve@_Concurrent_vector_base_v4@details@Concurrency@@IAEXIII@Z +@ stub -arch=win64 ?_Internal_reserve@_Concurrent_vector_base_v4@details@Concurrency@@IEAAX_K00@Z +@ stub -arch=arm ?_Internal_resize@_Concurrent_vector_base_v4@details@Concurrency@@IAAXIIIP6AXPAXI@ZP6AX0PBXI@Z2@Z +@ stub -arch=i386 ?_Internal_resize@_Concurrent_vector_base_v4@details@Concurrency@@IAEXIIIP6AXPAXI@ZP6AX0PBXI@Z2@Z +@ stub -arch=win64 ?_Internal_resize@_Concurrent_vector_base_v4@details@Concurrency@@IEAAX_K00P6AXPEAX0@ZP6AX1PEBX0@Z3@Z +@ stub -arch=arm ?_Internal_size@_Concurrent_queue_base_v4@details@Concurrency@@IBAIXZ +@ stub -arch=i386 ?_Internal_size@_Concurrent_queue_base_v4@details@Concurrency@@IBEIXZ +@ stub -arch=win64 ?_Internal_size@_Concurrent_queue_base_v4@details@Concurrency@@IEBA_KXZ +@ stub -arch=arm ?_Internal_swap@_Concurrent_queue_base_v4@details@Concurrency@@IAAXAAV123@@Z +@ stub -arch=i386 ?_Internal_swap@_Concurrent_queue_base_v4@details@Concurrency@@IAEXAAV123@@Z +@ stub -arch=win64 ?_Internal_swap@_Concurrent_queue_base_v4@details@Concurrency@@IEAAXAEAV123@@Z +@ stub -arch=arm ?_Internal_swap@_Concurrent_vector_base_v4@details@Concurrency@@IAAXAAV123@@Z +@ stub -arch=i386 ?_Internal_swap@_Concurrent_vector_base_v4@details@Concurrency@@IAEXAAV123@@Z +@ stub -arch=win64 ?_Internal_swap@_Concurrent_vector_base_v4@details@Concurrency@@IEAAXAEAV123@@Z +@ stub -arch=arm ?_Internal_throw_exception@_Concurrent_queue_base_v4@details@Concurrency@@IBAXXZ +@ stub -arch=i386 ?_Internal_throw_exception@_Concurrent_queue_base_v4@details@Concurrency@@IBEXXZ +@ stub -arch=win64 ?_Internal_throw_exception@_Concurrent_queue_base_v4@details@Concurrency@@IEBAXXZ +@ stub -arch=arm ?_Internal_throw_exception@_Concurrent_vector_base_v4@details@Concurrency@@IBAXI@Z +@ stub -arch=i386 ?_Internal_throw_exception@_Concurrent_vector_base_v4@details@Concurrency@@IBEXI@Z +@ stub -arch=win64 ?_Internal_throw_exception@_Concurrent_vector_base_v4@details@Concurrency@@IEBAX_K@Z +@ cdecl -arch=win32 ?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z(ptr) msvcp120.?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z +@ cdecl -arch=win64 ?_Ios_base_dtor@ios_base@std@@CAXPEAV12@@Z(ptr) msvcp120.?_Ios_base_dtor@ios_base@std@@CAXPEAV12@@Z +@ cdecl -arch=arm ?_Ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAA_N_N@Z(ptr long) msvcp120.?_Ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAA_N_N@Z +@ thiscall -arch=i386 ?_Ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE_N_N@Z(ptr long) msvcp120.?_Ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE_N_N@Z +@ cdecl -arch=win64 ?_Ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_N_N@Z(ptr long) msvcp120.?_Ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_N_N@Z +@ cdecl -arch=arm ?_Ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAA_N_N@Z(ptr long) msvcp120.?_Ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAA_N_N@Z +@ thiscall -arch=i386 ?_Ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE_N_N@Z(ptr long) msvcp120.?_Ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE_N_N@Z +@ cdecl -arch=win64 ?_Ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_N_N@Z(ptr long) msvcp120.?_Ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_N_N@Z +@ cdecl -arch=arm ?_Ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAA_N_N@Z(ptr long) msvcp120.?_Ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAA_N_N@Z +@ thiscall -arch=i386 ?_Ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE_N_N@Z(ptr long) msvcp120.?_Ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE_N_N@Z +@ cdecl -arch=win64 ?_Ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_N_N@Z(ptr long) msvcp120.?_Ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_N_N@Z +@ cdecl -arch=win32 ?_Iput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPADI@Z(ptr ptr long ptr ptr long ptr long) msvcp120.?_Iput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPADI@Z +@ cdecl -arch=win64 ?_Iput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEAD_K@Z(ptr ptr ptr ptr long ptr long) msvcp120.?_Iput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEAD_K@Z +@ cdecl -arch=win32 ?_Iput@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPADI@Z(ptr ptr long ptr ptr long ptr long) msvcp120.?_Iput@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPADI@Z +@ cdecl -arch=win64 ?_Iput@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEAD_K@Z(ptr ptr ptr ptr long ptr long) msvcp120.?_Iput@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEAD_K@Z +@ cdecl -arch=win32 ?_Iput@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPADI@Z(ptr ptr long ptr ptr long ptr long) msvcp120.?_Iput@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPADI@Z +@ cdecl -arch=win64 ?_Iput@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEAD_K@Z(ptr ptr ptr ptr long ptr long) msvcp120.?_Iput@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEAD_K@Z +@ stub -arch=win32 ?_Last_write_time@sys@tr2@std@@YAXPBD_J@Z +@ stub -arch=win64 ?_Last_write_time@sys@tr2@std@@YAXPEBD_J@Z +@ stub -arch=win32 ?_Last_write_time@sys@tr2@std@@YAXPB_W_J@Z +@ stub -arch=win64 ?_Last_write_time@sys@tr2@std@@YAXPEB_W_J@Z +@ stub -arch=win32 ?_Last_write_time@sys@tr2@std@@YA_JPBD@Z +@ stub -arch=win64 ?_Last_write_time@sys@tr2@std@@YA_JPEBD@Z +@ stub -arch=win32 ?_Last_write_time@sys@tr2@std@@YA_JPB_W@Z +@ stub -arch=win64 ?_Last_write_time@sys@tr2@std@@YA_JPEB_W@Z +@ stub -arch=arm ?_Launch@_Pad@std@@QAAXPAU_Thrd_imp_t@@@Z +@ stub -arch=i386 ?_Launch@_Pad@std@@QAEXPAU_Thrd_imp_t@@@Z +@ stub -arch=win64 ?_Launch@_Pad@std@@QEAAXPEAU_Thrd_imp_t@@@Z +@ stub -arch=win32 ?_Link@sys@tr2@std@@YAHPBD0@Z +@ stub -arch=win64 ?_Link@sys@tr2@std@@YAHPEBD0@Z +@ stub -arch=win32 ?_Link@sys@tr2@std@@YAHPB_W0@Z +@ stub -arch=win64 ?_Link@sys@tr2@std@@YAHPEB_W0@Z +@ cdecl -arch=win32 ?_Locimp_Addfac@_Locimp@locale@std@@CAXPAV123@PAVfacet@23@I@Z(ptr ptr long) msvcp120.?_Locimp_Addfac@_Locimp@locale@std@@CAXPAV123@PAVfacet@23@I@Z +@ cdecl -arch=win64 ?_Locimp_Addfac@_Locimp@locale@std@@CAXPEAV123@PEAVfacet@23@_K@Z(ptr ptr long) msvcp120.?_Locimp_Addfac@_Locimp@locale@std@@CAXPEAV123@PEAVfacet@23@_K@Z +@ cdecl -arch=win32 ?_Locimp_ctor@_Locimp@locale@std@@CAXPAV123@ABV123@@Z(ptr ptr) msvcp120.?_Locimp_ctor@_Locimp@locale@std@@CAXPAV123@ABV123@@Z +@ cdecl -arch=win64 ?_Locimp_ctor@_Locimp@locale@std@@CAXPEAV123@AEBV123@@Z(ptr ptr) msvcp120.?_Locimp_ctor@_Locimp@locale@std@@CAXPEAV123@AEBV123@@Z +@ cdecl -arch=win32 ?_Locimp_dtor@_Locimp@locale@std@@CAXPAV123@@Z(ptr) msvcp120.?_Locimp_dtor@_Locimp@locale@std@@CAXPAV123@@Z +@ cdecl -arch=win64 ?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z(ptr) msvcp120.?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z +@ cdecl -arch=win32 ?_Locinfo_Addcats@_Locinfo@std@@SAAAV12@PAV12@HPBD@Z(ptr long str) msvcp120.?_Locinfo_Addcats@_Locinfo@std@@SAAAV12@PAV12@HPBD@Z +@ cdecl -arch=win64 ?_Locinfo_Addcats@_Locinfo@std@@SAAEAV12@PEAV12@HPEBD@Z(ptr long str) msvcp120.?_Locinfo_Addcats@_Locinfo@std@@SAAEAV12@PEAV12@HPEBD@Z +@ cdecl -arch=win32 ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@HPBD@Z(ptr long str) msvcp120.?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@HPBD@Z +@ cdecl -arch=win64 ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@HPEBD@Z(ptr long str) msvcp120.?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@HPEBD@Z +@ cdecl -arch=win32 ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@PBD@Z(ptr str) msvcp120.?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@PBD@Z +@ cdecl -arch=win64 ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z(ptr str) msvcp120.?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z +@ cdecl -arch=win32 ?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z(ptr) msvcp120.?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z +@ cdecl -arch=win64 ?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z(ptr) msvcp120.?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z +@ cdecl -arch=arm ?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAAXXZ(ptr) msvcp120.?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAAXXZ +@ thiscall -arch=i386 ?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAEXXZ(ptr) msvcp120.?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAEXXZ +@ cdecl -arch=win64 ?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ(ptr) msvcp120.?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ +@ cdecl -arch=arm ?_Lock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@UAAXXZ(ptr) msvcp120.?_Lock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@UAAXXZ +@ thiscall -arch=i386 ?_Lock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@UAEXXZ(ptr) msvcp120.?_Lock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@UAEXXZ +@ cdecl -arch=win64 ?_Lock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@UEAAXXZ(ptr) msvcp120.?_Lock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@UEAAXXZ +@ cdecl -arch=arm ?_Lock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAAXXZ(ptr) msvcp120.?_Lock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAAXXZ +@ thiscall -arch=i386 ?_Lock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAEXXZ(ptr) msvcp120.?_Lock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAEXXZ +@ cdecl -arch=win64 ?_Lock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAAXXZ(ptr) msvcp120.?_Lock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAAXXZ +@ cdecl -arch=win32 ?_Lockit_ctor@_Lockit@std@@CAXPAV12@@Z(ptr) msvcp120.?_Lockit_ctor@_Lockit@std@@CAXPAV12@@Z +@ cdecl -arch=win64 ?_Lockit_ctor@_Lockit@std@@CAXPEAV12@@Z(ptr) msvcp120.?_Lockit_ctor@_Lockit@std@@CAXPEAV12@@Z +@ cdecl -arch=win32 ?_Lockit_ctor@_Lockit@std@@CAXPAV12@H@Z(ptr long) msvcp120.?_Lockit_ctor@_Lockit@std@@CAXPAV12@H@Z +@ cdecl -arch=win64 ?_Lockit_ctor@_Lockit@std@@CAXPEAV12@H@Z(ptr long) msvcp120.?_Lockit_ctor@_Lockit@std@@CAXPEAV12@H@Z +@ cdecl ?_Lockit_ctor@_Lockit@std@@SAXH@Z(long) msvcp120.?_Lockit_ctor@_Lockit@std@@SAXH@Z +@ cdecl -arch=win32 ?_Lockit_dtor@_Lockit@std@@CAXPAV12@@Z(ptr) msvcp120.?_Lockit_dtor@_Lockit@std@@CAXPAV12@@Z +@ cdecl -arch=win64 ?_Lockit_dtor@_Lockit@std@@CAXPEAV12@@Z(ptr) msvcp120.?_Lockit_dtor@_Lockit@std@@CAXPEAV12@@Z +@ cdecl ?_Lockit_dtor@_Lockit@std@@SAXH@Z(long) msvcp120.?_Lockit_dtor@_Lockit@std@@SAXH@Z +@ stub -arch=win32 ?_Lstat@sys@tr2@std@@YA?AW4file_type@123@PBDAAH@Z +@ stub -arch=win64 ?_Lstat@sys@tr2@std@@YA?AW4file_type@123@PEBDAEAH@Z +@ stub -arch=win32 ?_Lstat@sys@tr2@std@@YA?AW4file_type@123@PB_WAAH@Z +@ stub -arch=win64 ?_Lstat@sys@tr2@std@@YA?AW4file_type@123@PEB_WAEAH@Z +@ stub -arch=win32 ?_MP_Add@std@@YAXQA_K_K@Z +@ stub -arch=win64 ?_MP_Add@std@@YAXQEA_K_K@Z +@ stub -arch=win32 ?_MP_Get@std@@YA_KQA_K@Z +@ stub -arch=win64 ?_MP_Get@std@@YA_KQEA_K@Z +@ stub -arch=win32 ?_MP_Mul@std@@YAXQA_K_K1@Z +@ stub -arch=win64 ?_MP_Mul@std@@YAXQEA_K_K1@Z +@ stub -arch=win32 ?_MP_Rem@std@@YAXQA_K_K@Z +@ stub -arch=win64 ?_MP_Rem@std@@YAXQEA_K_K@Z +@ stub -arch=win32 ?_Make_dir@sys@tr2@std@@YAHPBD@Z +@ stub -arch=win64 ?_Make_dir@sys@tr2@std@@YAHPEBD@Z +@ stub -arch=win32 ?_Make_dir@sys@tr2@std@@YAHPB_W@Z +@ stub -arch=win64 ?_Make_dir@sys@tr2@std@@YAHPEB_W@Z +@ cdecl -arch=win32 ?_Makeloc@_Locimp@locale@std@@CAPAV123@ABV_Locinfo@3@HPAV123@PBV23@@Z(ptr long ptr ptr) msvcp120.?_Makeloc@_Locimp@locale@std@@CAPAV123@ABV_Locinfo@3@HPAV123@PBV23@@Z +@ cdecl -arch=win64 ?_Makeloc@_Locimp@locale@std@@CAPEAV123@AEBV_Locinfo@3@HPEAV123@PEBV23@@Z(ptr long ptr ptr) msvcp120.?_Makeloc@_Locimp@locale@std@@CAPEAV123@AEBV_Locinfo@3@HPEAV123@PEBV23@@Z +@ cdecl -arch=win32 ?_Makeushloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z(ptr long ptr ptr) msvcp120.?_Makeushloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z +@ cdecl -arch=win64 ?_Makeushloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z(ptr long ptr ptr) msvcp120.?_Makeushloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z +@ cdecl -arch=win32 ?_Makewloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z(ptr long ptr ptr) msvcp120.?_Makewloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z +@ cdecl -arch=win64 ?_Makewloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z(ptr long ptr ptr) msvcp120.?_Makewloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z +@ cdecl -arch=win32 ?_Makexloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z(ptr long ptr ptr) msvcp120.?_Makexloc@_Locimp@locale@std@@CAXABV_Locinfo@3@HPAV123@PBV23@@Z +@ cdecl -arch=win64 ?_Makexloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z(ptr long ptr ptr) msvcp120.?_Makexloc@_Locimp@locale@std@@CAXAEBV_Locinfo@3@HPEAV123@PEBV23@@Z +@ stub -arch=win32 ?_Mtx_delete@threads@stdext@@YAXPAX@Z +@ stub -arch=win64 ?_Mtx_delete@threads@stdext@@YAXPEAX@Z +@ stub -arch=win32 ?_Mtx_lock@threads@stdext@@YAXPAX@Z +@ stub -arch=win64 ?_Mtx_lock@threads@stdext@@YAXPEAX@Z +@ stub -arch=win32 ?_Mtx_new@threads@stdext@@YAXAAPAX@Z +@ stub -arch=win64 ?_Mtx_new@threads@stdext@@YAXAEAPEAX@Z +@ stub -arch=win32 ?_Mtx_unlock@threads@stdext@@YAXPAX@Z +@ stub -arch=win64 ?_Mtx_unlock@threads@stdext@@YAXPEAX@Z +@ cdecl -arch=win32 ?_New_Locimp@_Locimp@locale@std@@CAPAV123@ABV123@@Z(ptr) msvcp120.?_New_Locimp@_Locimp@locale@std@@CAPAV123@ABV123@@Z +@ cdecl -arch=win64 ?_New_Locimp@_Locimp@locale@std@@CAPEAV123@AEBV123@@Z(ptr) msvcp120.?_New_Locimp@_Locimp@locale@std@@CAPEAV123@AEBV123@@Z +@ cdecl -arch=win32 ?_New_Locimp@_Locimp@locale@std@@CAPAV123@_N@Z(long) msvcp120.?_New_Locimp@_Locimp@locale@std@@CAPAV123@_N@Z +@ cdecl -arch=win64 ?_New_Locimp@_Locimp@locale@std@@CAPEAV123@_N@Z(long) msvcp120.?_New_Locimp@_Locimp@locale@std@@CAPEAV123@_N@Z +@ stub -arch=win32 ?_Open_dir@sys@tr2@std@@YAPAXAAY0BAE@DPBDAAHAAW4file_type@123@@Z +@ stub -arch=win64 ?_Open_dir@sys@tr2@std@@YAPEAXAEAY0BAE@DPEBDAEAHAEAW4file_type@123@@Z +@ stub -arch=win32 ?_Open_dir@sys@tr2@std@@YAPAXAAY0BAE@_WPB_WAAHAAW4file_type@123@@Z +@ stub -arch=win64 ?_Open_dir@sys@tr2@std@@YAPEAXAEAY0BAE@_WPEB_WAEAHAEAW4file_type@123@@Z +@ cdecl -arch=arm ?_Orphan_all@_Container_base0@std@@QAAXXZ(ptr) msvcp120.?_Orphan_all@_Container_base0@std@@QAAXXZ +@ thiscall -arch=i386 ?_Orphan_all@_Container_base0@std@@QAEXXZ(ptr) msvcp120.?_Orphan_all@_Container_base0@std@@QAEXXZ +@ cdecl -arch=win64 ?_Orphan_all@_Container_base0@std@@QEAAXXZ(ptr) msvcp120.?_Orphan_all@_Container_base0@std@@QEAAXXZ +@ cdecl -arch=arm ?_Orphan_all@_Container_base12@std@@QAAXXZ(ptr) msvcp120.?_Orphan_all@_Container_base12@std@@QAAXXZ +@ thiscall -arch=i386 ?_Orphan_all@_Container_base12@std@@QAEXXZ(ptr) msvcp120.?_Orphan_all@_Container_base12@std@@QAEXXZ +@ cdecl -arch=win64 ?_Orphan_all@_Container_base12@std@@QEAAXXZ(ptr) msvcp120.?_Orphan_all@_Container_base12@std@@QEAAXXZ +@ cdecl -arch=arm ?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAXXZ(ptr) msvcp120.?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ(ptr) msvcp120.?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ(ptr) msvcp120.?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ?_Osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAXXZ(ptr) msvcp120.?_Osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ?_Osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ(ptr) msvcp120.?_Osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ?_Osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ(ptr) msvcp120.?_Osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAXXZ(ptr) msvcp120.?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ(ptr) msvcp120.?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ(ptr) msvcp120.?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ +@ cdecl -ret64 -arch=arm ?_Pnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBA_JXZ(ptr) msvcp120.?_Pnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBA_JXZ +@ thiscall -ret64 -arch=i386 ?_Pnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBE_JXZ(ptr) msvcp120.?_Pnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBE_JXZ +@ cdecl -arch=win64 ?_Pnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBA_JXZ(ptr) msvcp120.?_Pnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBA_JXZ +@ cdecl -ret64 -arch=arm ?_Pnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBA_JXZ(ptr) msvcp120.?_Pnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBA_JXZ +@ thiscall -ret64 -arch=i386 ?_Pnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBE_JXZ(ptr) msvcp120.?_Pnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBE_JXZ +@ cdecl -arch=win64 ?_Pnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBA_JXZ(ptr) msvcp120.?_Pnavail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBA_JXZ +@ cdecl -ret64 -arch=arm ?_Pnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBA_JXZ(ptr) msvcp120.?_Pnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBA_JXZ +@ thiscall -ret64 -arch=i386 ?_Pnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBE_JXZ(ptr) msvcp120.?_Pnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBE_JXZ +@ cdecl -arch=win64 ?_Pnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBA_JXZ(ptr) msvcp120.?_Pnavail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBA_JXZ +@ cdecl -arch=arm ?_Pninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAPADXZ(ptr) msvcp120.?_Pninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAPADXZ +@ thiscall -arch=i386 ?_Pninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ(ptr) msvcp120.?_Pninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ +@ cdecl -arch=win64 ?_Pninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ(ptr) msvcp120.?_Pninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAPEADXZ +@ cdecl -arch=arm ?_Pninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAPAGXZ(ptr) msvcp120.?_Pninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAPAGXZ +@ thiscall -arch=i386 ?_Pninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEPAGXZ(ptr) msvcp120.?_Pninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEPAGXZ +@ cdecl -arch=win64 ?_Pninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ(ptr) msvcp120.?_Pninc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAPEAGXZ +@ cdecl -arch=arm ?_Pninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAPA_WXZ(ptr) msvcp120.?_Pninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAPA_WXZ +@ thiscall -arch=i386 ?_Pninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEPA_WXZ(ptr) msvcp120.?_Pninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEPA_WXZ +@ cdecl -arch=win64 ?_Pninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ(ptr) msvcp120.?_Pninc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAPEA_WXZ +@ extern -arch=win32 ?_Ptr_cerr@std@@3PAV?$basic_ostream@DU?$char_traits@D@std@@@1@A msvcp120.?_Ptr_cerr@std@@3PAV?$basic_ostream@DU?$char_traits@D@std@@@1@A +@ extern -arch=win64 ?_Ptr_cerr@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA msvcp120.?_Ptr_cerr@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA +@ extern -arch=win32 ?_Ptr_cin@std@@3PAV?$basic_istream@DU?$char_traits@D@std@@@1@A msvcp120.?_Ptr_cin@std@@3PAV?$basic_istream@DU?$char_traits@D@std@@@1@A +@ extern -arch=win64 ?_Ptr_cin@std@@3PEAV?$basic_istream@DU?$char_traits@D@std@@@1@EA msvcp120.?_Ptr_cin@std@@3PEAV?$basic_istream@DU?$char_traits@D@std@@@1@EA +@ extern -arch=win32 ?_Ptr_clog@std@@3PAV?$basic_ostream@DU?$char_traits@D@std@@@1@A msvcp120.?_Ptr_clog@std@@3PAV?$basic_ostream@DU?$char_traits@D@std@@@1@A +@ extern -arch=win64 ?_Ptr_clog@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA msvcp120.?_Ptr_clog@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA +@ extern -arch=win32 ?_Ptr_cout@std@@3PAV?$basic_ostream@DU?$char_traits@D@std@@@1@A msvcp120.?_Ptr_cout@std@@3PAV?$basic_ostream@DU?$char_traits@D@std@@@1@A +@ extern -arch=win64 ?_Ptr_cout@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA msvcp120.?_Ptr_cout@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA +@ extern -arch=win32 ?_Ptr_wcerr@std@@3PAV?$basic_ostream@GU?$char_traits@G@std@@@1@A msvcp120.?_Ptr_wcerr@std@@3PAV?$basic_ostream@GU?$char_traits@G@std@@@1@A +@ extern -arch=win64 ?_Ptr_wcerr@std@@3PEAV?$basic_ostream@GU?$char_traits@G@std@@@1@EA msvcp120.?_Ptr_wcerr@std@@3PEAV?$basic_ostream@GU?$char_traits@G@std@@@1@EA +@ extern -arch=win32 ?_Ptr_wcerr@std@@3PAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@A msvcp120.?_Ptr_wcerr@std@@3PAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@A +@ extern -arch=win64 ?_Ptr_wcerr@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA msvcp120.?_Ptr_wcerr@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA +@ extern -arch=win32 ?_Ptr_wcin@std@@3PAV?$basic_istream@GU?$char_traits@G@std@@@1@A msvcp120.?_Ptr_wcin@std@@3PAV?$basic_istream@GU?$char_traits@G@std@@@1@A +@ extern -arch=win64 ?_Ptr_wcin@std@@3PEAV?$basic_istream@GU?$char_traits@G@std@@@1@EA msvcp120.?_Ptr_wcin@std@@3PEAV?$basic_istream@GU?$char_traits@G@std@@@1@EA +@ extern -arch=win32 ?_Ptr_wcin@std@@3PAV?$basic_istream@_WU?$char_traits@_W@std@@@1@A msvcp120.?_Ptr_wcin@std@@3PAV?$basic_istream@_WU?$char_traits@_W@std@@@1@A +@ extern -arch=win64 ?_Ptr_wcin@std@@3PEAV?$basic_istream@_WU?$char_traits@_W@std@@@1@EA msvcp120.?_Ptr_wcin@std@@3PEAV?$basic_istream@_WU?$char_traits@_W@std@@@1@EA +@ extern -arch=win32 ?_Ptr_wclog@std@@3PAV?$basic_ostream@GU?$char_traits@G@std@@@1@A msvcp120.?_Ptr_wclog@std@@3PAV?$basic_ostream@GU?$char_traits@G@std@@@1@A +@ extern -arch=win64 ?_Ptr_wclog@std@@3PEAV?$basic_ostream@GU?$char_traits@G@std@@@1@EA msvcp120.?_Ptr_wclog@std@@3PEAV?$basic_ostream@GU?$char_traits@G@std@@@1@EA +@ extern -arch=win32 ?_Ptr_wclog@std@@3PAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@A msvcp120.?_Ptr_wclog@std@@3PAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@A +@ extern -arch=win64 ?_Ptr_wclog@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA msvcp120.?_Ptr_wclog@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA +@ extern -arch=win32 ?_Ptr_wcout@std@@3PAV?$basic_ostream@GU?$char_traits@G@std@@@1@A msvcp120.?_Ptr_wcout@std@@3PAV?$basic_ostream@GU?$char_traits@G@std@@@1@A +@ extern -arch=win64 ?_Ptr_wcout@std@@3PEAV?$basic_ostream@GU?$char_traits@G@std@@@1@EA msvcp120.?_Ptr_wcout@std@@3PEAV?$basic_ostream@GU?$char_traits@G@std@@@1@EA +@ extern -arch=win32 ?_Ptr_wcout@std@@3PAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@A msvcp120.?_Ptr_wcout@std@@3PAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@A +@ extern -arch=win64 ?_Ptr_wcout@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA msvcp120.?_Ptr_wcout@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA +@ cdecl -arch=win32 ?_Put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@PBDI@Z(ptr ptr long ptr str long) msvcp120.?_Put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@PBDI@Z +@ cdecl -arch=win64 ?_Put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@PEBD_K@Z(ptr ptr ptr str long) msvcp120.?_Put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@PEBD_K@Z +@ cdecl -arch=win32 ?_Put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@PBGI@Z(ptr ptr long ptr ptr long) msvcp120.?_Put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@PBGI@Z +@ cdecl -arch=win64 ?_Put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@PEBG_K@Z(ptr ptr ptr ptr long) msvcp120.?_Put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@PEBG_K@Z +@ cdecl -arch=win32 ?_Put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@PB_WI@Z(ptr ptr long ptr wstr long) msvcp120.?_Put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@PB_WI@Z +@ cdecl -arch=win64 ?_Put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@PEB_W_K@Z(ptr ptr ptr wstr long) msvcp120.?_Put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@PEB_W_K@Z +@ stub -arch=win32 ?_Raise_handler@std@@3P6AXABVexception@stdext@@@ZA +@ stub -arch=win64 ?_Raise_handler@std@@3P6AXAEBVexception@stdext@@@ZEA +@ cdecl ?_Random_device@std@@YAIXZ() msvcp120.?_Random_device@std@@YAIXZ +@ stub -arch=win32 ?_Read_dir@sys@tr2@std@@YAPADAAY0BAE@DPAXAAW4file_type@123@@Z +@ stub -arch=win64 ?_Read_dir@sys@tr2@std@@YAPEADAEAY0BAE@DPEAXAEAW4file_type@123@@Z +@ stub -arch=win32 ?_Read_dir@sys@tr2@std@@YAPA_WAAY0BAE@_WPAXAAW4file_type@123@@Z +@ stub -arch=win64 ?_Read_dir@sys@tr2@std@@YAPEA_WAEAY0BAE@_WPEAXAEAW4file_type@123@@Z +@ stub -arch=arm ?_Release@_Pad@std@@QAAXXZ +@ stub -arch=i386 ?_Release@_Pad@std@@QAEXXZ +@ stub -arch=win64 ?_Release@_Pad@std@@QEAAXXZ +@ stub -arch=win32 ?_Remove_dir@sys@tr2@std@@YA_NPBD@Z +@ stub -arch=win64 ?_Remove_dir@sys@tr2@std@@YA_NPEBD@Z +@ stub -arch=win32 ?_Remove_dir@sys@tr2@std@@YA_NPB_W@Z +@ stub -arch=win64 ?_Remove_dir@sys@tr2@std@@YA_NPEB_W@Z +@ stub -arch=win32 ?_Rename@sys@tr2@std@@YAHPBD0@Z +@ stub -arch=win64 ?_Rename@sys@tr2@std@@YAHPEBD0@Z +@ stub -arch=win32 ?_Rename@sys@tr2@std@@YAHPB_W0@Z +@ stub -arch=win64 ?_Rename@sys@tr2@std@@YAHPEB_W0@Z +@ cdecl -arch=win32 ?_Rep@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@DI@Z(ptr ptr long ptr long long) msvcp120.?_Rep@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@DI@Z +@ cdecl -arch=win64 ?_Rep@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@D_K@Z(ptr ptr ptr long long) msvcp120.?_Rep@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@D_K@Z +@ cdecl -arch=win32 ?_Rep@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@GI@Z(ptr ptr long ptr long long) msvcp120.?_Rep@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@GI@Z +@ cdecl -arch=win64 ?_Rep@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@G_K@Z(ptr ptr ptr long long) msvcp120.?_Rep@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@G_K@Z +@ cdecl -arch=win32 ?_Rep@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@_WI@Z(ptr ptr long ptr long long) msvcp120.?_Rep@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@_WI@Z +@ cdecl -arch=win64 ?_Rep@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@_W_K@Z(ptr ptr ptr long long) msvcp120.?_Rep@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@_W_K@Z +@ stub ?_Rethrow_future_exception@std@@YAXVexception_ptr@1@@Z +@ stub -arch=win32 ?_Rng_abort@std@@YAXPBD@Z +@ stub -arch=win64 ?_Rng_abort@std@@YAXPEBD@Z +@ stub -arch=win32 ?_Segment_index_of@_Concurrent_vector_base_v4@details@Concurrency@@KAII@Z +@ stub -arch=win64 ?_Segment_index_of@_Concurrent_vector_base_v4@details@Concurrency@@KA_K_K@Z +@ cdecl -arch=win32 ?_Setgloballocale@locale@std@@CAXPAX@Z(ptr) msvcp120.?_Setgloballocale@locale@std@@CAXPAX@Z +@ cdecl -arch=win64 ?_Setgloballocale@locale@std@@CAXPEAX@Z(ptr) msvcp120.?_Setgloballocale@locale@std@@CAXPEAX@Z +@ stub -arch=win32 ?_Src@?1??_Getffldx@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@3@1AAVios_base@3@PAH@Z@4QBDB +@ stub -arch=win64 ?_Src@?1??_Getffldx@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@3@1AEAVios_base@3@PEAH@Z@4QBDB +@ stub -arch=win32 ?_Src@?1??_Getffldx@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@GU?$char_traits@G@std@@@3@1AAVios_base@3@PAH@Z@4QBDB +@ stub -arch=win64 ?_Src@?1??_Getffldx@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@3@1AEAVios_base@3@PEAH@Z@4QBDB +@ stub -arch=win32 ?_Src@?1??_Getffldx@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@3@1AAVios_base@3@PAH@Z@4QBDB +@ stub -arch=win64 ?_Src@?1??_Getffldx@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@3@1AEAVios_base@3@PEAH@Z@4QBDB +@ stub -arch=win32 ?_Src@?1??_Getifld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@3@1HABVlocale@3@@Z@4QBDB +@ stub -arch=win64 ?_Src@?1??_Getifld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@3@1HAEBVlocale@3@@Z@4QBDB +@ stub -arch=win32 ?_Src@?1??_Getifld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@GU?$char_traits@G@std@@@3@1HABVlocale@3@@Z@4QBDB +@ stub -arch=win64 ?_Src@?1??_Getifld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@3@1HAEBVlocale@3@@Z@4QBDB +@ stub -arch=win32 ?_Src@?1??_Getifld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@3@1HABVlocale@3@@Z@4QBDB +@ stub -arch=win64 ?_Src@?1??_Getifld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@3@1HAEBVlocale@3@@Z@4QBDB +@ stub -arch=win32 ?_Src@?3??_Getffld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@3@1AAVios_base@3@PAH@Z@4QBDB +@ stub -arch=win64 ?_Src@?3??_Getffld@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@DU?$char_traits@D@std@@@3@1AEAVios_base@3@PEAH@Z@4QBDB +@ stub -arch=win32 ?_Src@?3??_Getffld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@GU?$char_traits@G@std@@@3@1AAVios_base@3@PAH@Z@4QBDB +@ stub -arch=win64 ?_Src@?3??_Getffld@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@GU?$char_traits@G@std@@@3@1AEAVios_base@3@PEAH@Z@4QBDB +@ stub -arch=win32 ?_Src@?3??_Getffld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@ABAHPADAAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@3@1AAVios_base@3@PAH@Z@4QBDB +@ stub -arch=win64 ?_Src@?3??_Getffld@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEBAHPEADAEAV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@3@1AEAVios_base@3@PEAH@Z@4QBDB +@ stub -arch=win32 ?_Stat@sys@tr2@std@@YA?AW4file_type@123@PBDAAH@Z +@ stub -arch=win64 ?_Stat@sys@tr2@std@@YA?AW4file_type@123@PEBDAEAH@Z +@ stub -arch=win32 ?_Stat@sys@tr2@std@@YA?AW4file_type@123@PB_WAAH@Z +@ stub -arch=win64 ?_Stat@sys@tr2@std@@YA?AW4file_type@123@PEB_WAEAH@Z +@ stub -arch=win32 ?_Statvfs@sys@tr2@std@@YA?AUspace_info@123@PBD@Z +@ stub -arch=win64 ?_Statvfs@sys@tr2@std@@YA?AUspace_info@123@PEBD@Z +@ stub -arch=win32 ?_Statvfs@sys@tr2@std@@YA?AUspace_info@123@PB_W@Z +@ stub -arch=win64 ?_Statvfs@sys@tr2@std@@YA?AUspace_info@123@PEB_W@Z +@ cdecl -arch=arm ?_Swap_all@_Container_base0@std@@QAAXAAU12@@Z(ptr ptr) msvcp120.?_Swap_all@_Container_base0@std@@QAAXAAU12@@Z +@ thiscall -arch=i386 ?_Swap_all@_Container_base0@std@@QAEXAAU12@@Z(ptr ptr) msvcp120.?_Swap_all@_Container_base0@std@@QAEXAAU12@@Z +@ cdecl -arch=win64 ?_Swap_all@_Container_base0@std@@QEAAXAEAU12@@Z(ptr ptr) msvcp120.?_Swap_all@_Container_base0@std@@QEAAXAEAU12@@Z +@ cdecl -arch=arm ?_Swap_all@_Container_base12@std@@QAAXAAU12@@Z(ptr ptr) msvcp120.?_Swap_all@_Container_base12@std@@QAAXAAU12@@Z +@ thiscall -arch=i386 ?_Swap_all@_Container_base12@std@@QAEXAAU12@@Z(ptr ptr) msvcp120.?_Swap_all@_Container_base12@std@@QAEXAAU12@@Z +@ cdecl -arch=win64 ?_Swap_all@_Container_base12@std@@QEAAXAEAU12@@Z(ptr ptr) msvcp120.?_Swap_all@_Container_base12@std@@QEAAXAEAU12@@Z +@ stub -arch=win32 ?_Symlink@sys@tr2@std@@YAHPBD0@Z +@ stub -arch=win64 ?_Symlink@sys@tr2@std@@YAHPEBD0@Z +@ stub -arch=win32 ?_Symlink@sys@tr2@std@@YAHPB_W0@Z +@ stub -arch=win64 ?_Symlink@sys@tr2@std@@YAHPEB_W0@Z +@ extern ?_Sync@ios_base@std@@0_NA msvcp120.?_Sync@ios_base@std@@0_NA +@ stub -arch=win32 ?_Syserror_map@std@@YAPBDH@Z +@ stub -arch=win64 ?_Syserror_map@std@@YAPEBDH@Z +@ stub ?_Throw_C_error@std@@YAXH@Z +@ stub ?_Throw_Cpp_error@std@@YAXH@Z +@ stub -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z +@ stub -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z +@ stub ?_Throw_lock_error@threads@stdext@@YAXXZ +@ stub ?_Throw_resource_error@threads@stdext@@YAXXZ +@ cdecl -arch=arm ?_Tidy@?$_Yarn@D@std@@AAAXXZ(ptr) msvcp120.?_Tidy@?$_Yarn@D@std@@AAAXXZ +@ thiscall -arch=i386 ?_Tidy@?$_Yarn@D@std@@AAEXXZ(ptr) msvcp120.?_Tidy@?$_Yarn@D@std@@AAEXXZ +@ cdecl -arch=win64 ?_Tidy@?$_Yarn@D@std@@AEAAXXZ(ptr) msvcp120.?_Tidy@?$_Yarn@D@std@@AEAAXXZ +@ stub -arch=arm ?_Tidy@?$_Yarn@_W@std@@AAAXXZ +@ stub -arch=i386 ?_Tidy@?$_Yarn@_W@std@@AAEXXZ +@ stub -arch=win64 ?_Tidy@?$_Yarn@_W@std@@AEAAXXZ +@ cdecl -arch=arm ?_Tidy@?$ctype@D@std@@IAAXXZ(ptr) msvcp120.?_Tidy@?$ctype@D@std@@IAAXXZ +@ thiscall -arch=i386 ?_Tidy@?$ctype@D@std@@IAEXXZ(ptr) msvcp120.?_Tidy@?$ctype@D@std@@IAEXXZ +@ cdecl -arch=win64 ?_Tidy@?$ctype@D@std@@IEAAXXZ(ptr) msvcp120.?_Tidy@?$ctype@D@std@@IEAAXXZ +@ stub -arch=arm ?_Tidy@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AAAXXZ +@ stub -arch=i386 ?_Tidy@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AAEXXZ +@ stub -arch=win64 ?_Tidy@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEAAXXZ +@ stub -arch=arm ?_Tidy@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AAAXXZ +@ stub -arch=i386 ?_Tidy@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AAEXXZ +@ stub -arch=win64 ?_Tidy@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@AEAAXXZ +@ stub -arch=arm ?_Tidy@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AAAXXZ +@ stub -arch=i386 ?_Tidy@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AAEXXZ +@ stub -arch=win64 ?_Tidy@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@AEAAXXZ +@ cdecl -arch=win32 ?_Tidy@ios_base@std@@AAAXXZ(ptr) msvcp120.?_Tidy@ios_base@std@@AAAXXZ +@ stub -arch=i386 ?_Tidy@ios_base@std@@AAEXXZ +@ cdecl -arch=win64 ?_Tidy@ios_base@std@@AEAAXXZ(ptr) msvcp120.?_Tidy@ios_base@std@@AEAAXXZ +@ stub -arch=win32 ?_Unlink@sys@tr2@std@@YAHPBD@Z +@ stub -arch=win64 ?_Unlink@sys@tr2@std@@YAHPEBD@Z +@ stub -arch=win32 ?_Unlink@sys@tr2@std@@YAHPB_W@Z +@ stub -arch=win64 ?_Unlink@sys@tr2@std@@YAHPEB_W@Z +@ cdecl -arch=arm ?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAAXXZ(ptr) msvcp120.?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAAXXZ +@ thiscall -arch=i386 ?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAEXXZ(ptr) msvcp120.?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAEXXZ +@ cdecl -arch=win64 ?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ(ptr) msvcp120.?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ +@ cdecl -arch=arm ?_Unlock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@UAAXXZ(ptr) msvcp120.?_Unlock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@UAAXXZ +@ thiscall -arch=i386 ?_Unlock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@UAEXXZ(ptr) msvcp120.?_Unlock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@UAEXXZ +@ cdecl -arch=win64 ?_Unlock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@UEAAXXZ(ptr) msvcp120.?_Unlock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@UEAAXXZ +@ cdecl -arch=arm ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAAXXZ(ptr) msvcp120.?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAAXXZ +@ thiscall -arch=i386 ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAEXXZ(ptr) msvcp120.?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAEXXZ +@ cdecl -arch=win64 ?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAAXXZ(ptr) msvcp120.?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAAXXZ +@ stub -arch=arm ?_W_Getdays@_Locinfo@std@@QBAPBGXZ +@ stub -arch=i386 ?_W_Getdays@_Locinfo@std@@QBEPBGXZ +@ stub -arch=win64 ?_W_Getdays@_Locinfo@std@@QEBAPEBGXZ +@ stub -arch=arm ?_W_Getmonths@_Locinfo@std@@QBAPBGXZ +@ stub -arch=i386 ?_W_Getmonths@_Locinfo@std@@QBEPBGXZ +@ stub -arch=win64 ?_W_Getmonths@_Locinfo@std@@QEBAPEBGXZ +@ stub -arch=arm ?_W_Gettnames@_Locinfo@std@@QBA?AV_Timevec@2@XZ +@ stub -arch=i386 ?_W_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ +@ stub -arch=win64 ?_W_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ +@ stub -arch=win32 ?_Winerror_map@std@@YAPBDH@Z +@ stub -arch=win64 ?_Winerror_map@std@@YAPEBDH@Z +@ stub ?_XLgamma@std@@YAMM@Z +@ stub ?_XLgamma@std@@YANN@Z +@ stub ?_XLgamma@std@@YAOO@Z +@ cdecl ?_Xbad_alloc@std@@YAXXZ() msvcp120.?_Xbad_alloc@std@@YAXXZ +@ stub ?_Xbad_function_call@std@@YAXXZ +@ cdecl -arch=win32 ?_Xinvalid_argument@std@@YAXPBD@Z(str) msvcp120.?_Xinvalid_argument@std@@YAXPBD@Z +@ cdecl -arch=win64 ?_Xinvalid_argument@std@@YAXPEBD@Z(str) msvcp120.?_Xinvalid_argument@std@@YAXPEBD@Z +@ cdecl -arch=win32 ?_Xlength_error@std@@YAXPBD@Z(str) msvcp120.?_Xlength_error@std@@YAXPBD@Z +@ cdecl -arch=win64 ?_Xlength_error@std@@YAXPEBD@Z(str) msvcp120.?_Xlength_error@std@@YAXPEBD@Z +@ cdecl -arch=win32 ?_Xout_of_range@std@@YAXPBD@Z(str) msvcp120.?_Xout_of_range@std@@YAXPBD@Z +@ cdecl -arch=win64 ?_Xout_of_range@std@@YAXPEBD@Z(str) msvcp120.?_Xout_of_range@std@@YAXPEBD@Z +@ stub -arch=win32 ?_Xoverflow_error@std@@YAXPBD@Z +@ stub -arch=win64 ?_Xoverflow_error@std@@YAXPEBD@Z +@ stub ?_Xregex_error@std@@YAXW4error_type@regex_constants@1@@Z +@ cdecl -arch=win32 ?_Xruntime_error@std@@YAXPBD@Z(str) msvcp120.?_Xruntime_error@std@@YAXPBD@Z +@ cdecl -arch=win64 ?_Xruntime_error@std@@YAXPEBD@Z(str) msvcp120.?_Xruntime_error@std@@YAXPEBD@Z +@ stub ?adopt_lock@std@@3Uadopt_lock_t@1@B +@ cdecl -arch=arm ?always_noconv@codecvt_base@std@@QBA_NXZ(ptr) msvcp120.?always_noconv@codecvt_base@std@@QBA_NXZ +@ thiscall -arch=i386 ?always_noconv@codecvt_base@std@@QBE_NXZ(ptr) msvcp120.?always_noconv@codecvt_base@std@@QBE_NXZ +@ cdecl -arch=win64 ?always_noconv@codecvt_base@std@@QEBA_NXZ(ptr) msvcp120.?always_noconv@codecvt_base@std@@QEBA_NXZ +@ cdecl -arch=arm ?bad@ios_base@std@@QBA_NXZ(ptr) msvcp120.?bad@ios_base@std@@QBA_NXZ +@ thiscall -arch=i386 ?bad@ios_base@std@@QBE_NXZ(ptr) msvcp120.?bad@ios_base@std@@QBE_NXZ +@ cdecl -arch=win64 ?bad@ios_base@std@@QEBA_NXZ(ptr) msvcp120.?bad@ios_base@std@@QEBA_NXZ +@ cdecl -arch=arm ?c_str@?$_Yarn@D@std@@QBAPBDXZ(ptr) msvcp120.?c_str@?$_Yarn@D@std@@QBAPBDXZ +@ thiscall -arch=i386 ?c_str@?$_Yarn@D@std@@QBEPBDXZ(ptr) msvcp120.?c_str@?$_Yarn@D@std@@QBEPBDXZ +@ cdecl -arch=win64 ?c_str@?$_Yarn@D@std@@QEBAPEBDXZ(ptr) msvcp120.?c_str@?$_Yarn@D@std@@QEBAPEBDXZ +@ stub -arch=arm ?cancel@agent@Concurrency@@QAA_NXZ +@ stub -arch=i386 ?cancel@agent@Concurrency@@QAE_NXZ +@ stub -arch=win64 ?cancel@agent@Concurrency@@QEAA_NXZ +@ extern ?cerr@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A msvcp120.?cerr@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A +@ extern ?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A msvcp120.?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A +@ cdecl -arch=win32 ?classic@locale@std@@SAABV12@XZ() msvcp120.?classic@locale@std@@SAABV12@XZ +@ cdecl -arch=win64 ?classic@locale@std@@SAAEBV12@XZ() msvcp120.?classic@locale@std@@SAAEBV12@XZ +@ stub -arch=win32 ?classic_table@?$ctype@D@std@@SAPBFXZ +@ stub -arch=win64 ?classic_table@?$ctype@D@std@@SAPEBFXZ +@ cdecl -arch=arm ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAXH_N@Z(ptr long long) msvcp120.?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAXH_N@Z +@ thiscall -arch=i386 ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z(ptr long long) msvcp120.?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z +@ cdecl -arch=win64 ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z(ptr long long) msvcp120.?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z +@ cdecl -arch=arm ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAXI@Z(ptr long) msvcp120.?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAXI@Z +@ thiscall -arch=i386 ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXI@Z(ptr long) msvcp120.?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXI@Z +@ cdecl -arch=win64 ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXI@Z(ptr long) msvcp120.?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXI@Z +@ cdecl -arch=arm ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAXH_N@Z(ptr long long) msvcp120.?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAXH_N@Z +@ thiscall -arch=i386 ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXH_N@Z(ptr long long) msvcp120.?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXH_N@Z +@ cdecl -arch=win64 ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXH_N@Z(ptr long long) msvcp120.?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXH_N@Z +@ cdecl -arch=arm ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAXI@Z(ptr long) msvcp120.?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAXI@Z +@ thiscall -arch=i386 ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXI@Z(ptr long) msvcp120.?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXI@Z +@ cdecl -arch=win64 ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXI@Z(ptr long) msvcp120.?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXI@Z +@ cdecl -arch=arm ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAXH_N@Z(ptr long long) msvcp120.?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAXH_N@Z +@ thiscall -arch=i386 ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z(ptr long long) msvcp120.?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z +@ cdecl -arch=win64 ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXH_N@Z(ptr long long) msvcp120.?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXH_N@Z +@ cdecl -arch=arm ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAXI@Z(ptr long) msvcp120.?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAXI@Z +@ thiscall -arch=i386 ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXI@Z(ptr long) msvcp120.?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXI@Z +@ cdecl -arch=win64 ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXI@Z(ptr long) msvcp120.?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXI@Z +@ cdecl -arch=arm ?clear@ios_base@std@@QAAXH@Z(ptr long) msvcp120.?clear@ios_base@std@@QAAXH@Z +@ thiscall -arch=i386 ?clear@ios_base@std@@QAEXH@Z(ptr long) msvcp120.?clear@ios_base@std@@QAEXH@Z +@ cdecl -arch=win64 ?clear@ios_base@std@@QEAAXH@Z(ptr long) msvcp120.?clear@ios_base@std@@QEAAXH@Z +@ cdecl -arch=arm ?clear@ios_base@std@@QAAXH_N@Z(ptr long long) msvcp120.?clear@ios_base@std@@QAAXH_N@Z +@ thiscall -arch=i386 ?clear@ios_base@std@@QAEXH_N@Z(ptr long long) msvcp120.?clear@ios_base@std@@QAEXH_N@Z +@ cdecl -arch=win64 ?clear@ios_base@std@@QEAAXH_N@Z(ptr long long) msvcp120.?clear@ios_base@std@@QEAAXH_N@Z +@ cdecl -arch=arm ?clear@ios_base@std@@QAAXI@Z(ptr long) msvcp120.?clear@ios_base@std@@QAAXI@Z +@ thiscall -arch=i386 ?clear@ios_base@std@@QAEXI@Z(ptr long) msvcp120.?clear@ios_base@std@@QAEXI@Z +@ cdecl -arch=win64 ?clear@ios_base@std@@QEAAXI@Z(ptr long) msvcp120.?clear@ios_base@std@@QEAAXI@Z +@ extern ?clog@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A msvcp120.?clog@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A +@ cdecl -arch=arm ?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAAAV12@ABV12@@Z(ptr ptr) msvcp120.?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAAAV12@ABV12@@Z +@ thiscall -arch=i386 ?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEAAV12@ABV12@@Z(ptr ptr) msvcp120.?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEAAV12@ABV12@@Z +@ cdecl -arch=win64 ?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEBV12@@Z(ptr ptr) msvcp120.?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEBV12@@Z +@ cdecl -arch=arm ?copyfmt@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAAAV12@ABV12@@Z(ptr ptr) msvcp120.?copyfmt@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAAAV12@ABV12@@Z +@ thiscall -arch=i386 ?copyfmt@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEAAV12@ABV12@@Z(ptr ptr) msvcp120.?copyfmt@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEAAV12@ABV12@@Z +@ cdecl -arch=win64 ?copyfmt@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEBV12@@Z(ptr ptr) msvcp120.?copyfmt@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEBV12@@Z +@ cdecl -arch=arm ?copyfmt@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAAAV12@ABV12@@Z(ptr ptr) msvcp120.?copyfmt@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAAAV12@ABV12@@Z +@ thiscall -arch=i386 ?copyfmt@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEAAV12@ABV12@@Z(ptr ptr) msvcp120.?copyfmt@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEAAV12@ABV12@@Z +@ cdecl -arch=win64 ?copyfmt@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEBV12@@Z(ptr ptr) msvcp120.?copyfmt@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEBV12@@Z +@ cdecl -arch=arm ?copyfmt@ios_base@std@@QAAAAV12@ABV12@@Z(ptr ptr) msvcp120.?copyfmt@ios_base@std@@QAAAAV12@ABV12@@Z +@ thiscall -arch=i386 ?copyfmt@ios_base@std@@QAEAAV12@ABV12@@Z(ptr ptr) msvcp120.?copyfmt@ios_base@std@@QAEAAV12@ABV12@@Z +@ cdecl -arch=win64 ?copyfmt@ios_base@std@@QEAAAEAV12@AEBV12@@Z(ptr ptr) msvcp120.?copyfmt@ios_base@std@@QEAAAEAV12@AEBV12@@Z +@ extern ?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A msvcp120.?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A +@ stub -arch=arm ?date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AW4dateorder@time_base@2@XZ +@ stub -arch=i386 ?date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AW4dateorder@time_base@2@XZ +@ stub -arch=win64 ?date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ +@ stub -arch=arm ?date_order@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AW4dateorder@time_base@2@XZ +@ stub -arch=i386 ?date_order@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AW4dateorder@time_base@2@XZ +@ stub -arch=win64 ?date_order@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ +@ stub -arch=arm ?date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AW4dateorder@time_base@2@XZ +@ stub -arch=i386 ?date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AW4dateorder@time_base@2@XZ +@ stub -arch=win64 ?date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ +@ stub ?defer_lock@std@@3Udefer_lock_t@1@B +@ stub -arch=arm ?do_always_noconv@?$codecvt@DDH@std@@MBA_NXZ +@ stub -arch=i386 ?do_always_noconv@?$codecvt@DDH@std@@MBE_NXZ +@ stub -arch=win64 ?do_always_noconv@?$codecvt@DDH@std@@MEBA_NXZ +@ cdecl -arch=arm ?do_always_noconv@?$codecvt@GDH@std@@MBA_NXZ(ptr) msvcp120.?do_always_noconv@?$codecvt@GDH@std@@MBA_NXZ +@ thiscall -arch=i386 ?do_always_noconv@?$codecvt@GDH@std@@MBE_NXZ(ptr) msvcp120.?do_always_noconv@?$codecvt@GDH@std@@MBE_NXZ +@ cdecl -arch=win64 ?do_always_noconv@?$codecvt@GDH@std@@MEBA_NXZ(ptr) msvcp120.?do_always_noconv@?$codecvt@GDH@std@@MEBA_NXZ +@ cdecl -arch=arm ?do_always_noconv@?$codecvt@_WDH@std@@MBA_NXZ(ptr) msvcp120.?do_always_noconv@?$codecvt@_WDH@std@@MBA_NXZ +@ thiscall -arch=i386 ?do_always_noconv@?$codecvt@_WDH@std@@MBE_NXZ(ptr) msvcp120.?do_always_noconv@?$codecvt@_WDH@std@@MBE_NXZ +@ cdecl -arch=win64 ?do_always_noconv@?$codecvt@_WDH@std@@MEBA_NXZ(ptr) msvcp120.?do_always_noconv@?$codecvt@_WDH@std@@MEBA_NXZ +@ cdecl -arch=arm ?do_always_noconv@codecvt_base@std@@MBA_NXZ(ptr) msvcp120.?do_always_noconv@codecvt_base@std@@MBA_NXZ +@ thiscall -arch=i386 ?do_always_noconv@codecvt_base@std@@MBE_NXZ(ptr) msvcp120.?do_always_noconv@codecvt_base@std@@MBE_NXZ +@ cdecl -arch=win64 ?do_always_noconv@codecvt_base@std@@MEBA_NXZ(ptr) msvcp120.?do_always_noconv@codecvt_base@std@@MEBA_NXZ +@ stub -arch=arm ?do_date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AW4dateorder@time_base@2@XZ +@ stub -arch=i386 ?do_date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AW4dateorder@time_base@2@XZ +@ stub -arch=win64 ?do_date_order@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AW4dateorder@time_base@2@XZ +@ stub -arch=arm ?do_date_order@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AW4dateorder@time_base@2@XZ +@ stub -arch=i386 ?do_date_order@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AW4dateorder@time_base@2@XZ +@ stub -arch=win64 ?do_date_order@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AW4dateorder@time_base@2@XZ +@ stub -arch=arm ?do_date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AW4dateorder@time_base@2@XZ +@ stub -arch=i386 ?do_date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AW4dateorder@time_base@2@XZ +@ stub -arch=win64 ?do_date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AW4dateorder@time_base@2@XZ +@ stub -arch=arm ?do_encoding@?$codecvt@GDH@std@@MBAHXZ +@ stub -arch=i386 ?do_encoding@?$codecvt@GDH@std@@MBEHXZ +@ stub -arch=win64 ?do_encoding@?$codecvt@GDH@std@@MEBAHXZ +@ stub -arch=arm ?do_encoding@?$codecvt@_WDH@std@@MBAHXZ +@ stub -arch=i386 ?do_encoding@?$codecvt@_WDH@std@@MBEHXZ +@ stub -arch=win64 ?do_encoding@?$codecvt@_WDH@std@@MEBAHXZ +@ cdecl -arch=arm ?do_encoding@codecvt_base@std@@MBAHXZ(ptr) msvcp120.?do_encoding@codecvt_base@std@@MBAHXZ +@ thiscall -arch=i386 ?do_encoding@codecvt_base@std@@MBEHXZ(ptr) msvcp120.?do_encoding@codecvt_base@std@@MBEHXZ +@ cdecl -arch=win64 ?do_encoding@codecvt_base@std@@MEBAHXZ(ptr) msvcp120.?do_encoding@codecvt_base@std@@MEBAHXZ +@ cdecl -arch=arm ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAG@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAG@Z +@ thiscall -arch=i386 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAG@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAG@Z +@ cdecl -arch=win64 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z +@ cdecl -arch=arm ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAI@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAI@Z +@ thiscall -arch=i386 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAI@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAI@Z +@ cdecl -arch=win64 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z +@ cdecl -arch=arm ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z +@ thiscall -arch=i386 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z +@ cdecl -arch=win64 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z +@ cdecl -arch=arm ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAK@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAK@Z +@ thiscall -arch=i386 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAK@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAK@Z +@ cdecl -arch=win64 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z +@ cdecl -arch=arm ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAM@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAM@Z +@ thiscall -arch=i386 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAM@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAM@Z +@ cdecl -arch=win64 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z +@ cdecl -arch=arm ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAN@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAN@Z +@ thiscall -arch=i386 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAN@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAN@Z +@ cdecl -arch=win64 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z +@ cdecl -arch=arm ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAO@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAO@Z +@ thiscall -arch=i386 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAO@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAO@Z +@ cdecl -arch=win64 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z +@ cdecl -arch=arm ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z +@ thiscall -arch=i386 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z +@ cdecl -arch=win64 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z +@ cdecl -arch=arm ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z +@ thiscall -arch=i386 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z +@ cdecl -arch=win64 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z +@ cdecl -arch=arm ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z +@ thiscall -arch=i386 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z +@ cdecl -arch=win64 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z +@ cdecl -arch=arm ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z +@ thiscall -arch=i386 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z +@ cdecl -arch=win64 ?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z +@ cdecl -arch=arm ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAG@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAG@Z +@ thiscall -arch=i386 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAG@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAG@Z +@ cdecl -arch=win64 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z +@ cdecl -arch=arm ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAI@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAI@Z +@ thiscall -arch=i386 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAI@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAI@Z +@ cdecl -arch=win64 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z +@ cdecl -arch=arm ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z +@ thiscall -arch=i386 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z +@ cdecl -arch=win64 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z +@ cdecl -arch=arm ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAK@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAK@Z +@ thiscall -arch=i386 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAK@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAK@Z +@ cdecl -arch=win64 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z +@ cdecl -arch=arm ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAM@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAM@Z +@ thiscall -arch=i386 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAM@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAM@Z +@ cdecl -arch=win64 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z +@ cdecl -arch=arm ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAN@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAN@Z +@ thiscall -arch=i386 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAN@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAN@Z +@ cdecl -arch=win64 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z +@ cdecl -arch=arm ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAO@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAO@Z +@ thiscall -arch=i386 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAO@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAO@Z +@ cdecl -arch=win64 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z +@ cdecl -arch=arm ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z +@ thiscall -arch=i386 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z +@ cdecl -arch=win64 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z +@ cdecl -arch=arm ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z +@ thiscall -arch=i386 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z +@ cdecl -arch=win64 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z +@ cdecl -arch=arm ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z +@ thiscall -arch=i386 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z +@ cdecl -arch=win64 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z +@ cdecl -arch=arm ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z +@ thiscall -arch=i386 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z +@ cdecl -arch=win64 ?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z +@ cdecl -arch=arm ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAG@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAG@Z +@ thiscall -arch=i386 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAG@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAG@Z +@ cdecl -arch=win64 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z +@ cdecl -arch=arm ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAI@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAI@Z +@ thiscall -arch=i386 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAI@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAI@Z +@ cdecl -arch=win64 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z +@ cdecl -arch=arm ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z +@ thiscall -arch=i386 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z +@ cdecl -arch=win64 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z +@ cdecl -arch=arm ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAK@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAK@Z +@ thiscall -arch=i386 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAK@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAK@Z +@ cdecl -arch=win64 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z +@ cdecl -arch=arm ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAM@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAM@Z +@ thiscall -arch=i386 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAM@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAM@Z +@ cdecl -arch=win64 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z +@ cdecl -arch=arm ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAN@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAN@Z +@ thiscall -arch=i386 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAN@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAN@Z +@ cdecl -arch=win64 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z +@ cdecl -arch=arm ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAO@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAO@Z +@ thiscall -arch=i386 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAO@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAO@Z +@ cdecl -arch=win64 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z +@ cdecl -arch=arm ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z +@ thiscall -arch=i386 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z +@ cdecl -arch=win64 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z +@ cdecl -arch=arm ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z +@ thiscall -arch=i386 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z +@ cdecl -arch=win64 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z +@ cdecl -arch=arm ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z +@ thiscall -arch=i386 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z +@ cdecl -arch=win64 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z +@ cdecl -arch=arm ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z +@ thiscall -arch=i386 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z +@ cdecl -arch=win64 ?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z +@ stub -arch=arm ?do_get@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@DD@Z +@ stub -arch=i386 ?do_get@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@DD@Z +@ stub -arch=win64 ?do_get@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@DD@Z +@ stub -arch=arm ?do_get@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@DD@Z +@ stub -arch=i386 ?do_get@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@DD@Z +@ stub -arch=win64 ?do_get@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@DD@Z +@ stub -arch=arm ?do_get@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@DD@Z +@ stub -arch=i386 ?do_get@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@DD@Z +@ stub -arch=win64 ?do_get@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@DD@Z +@ stub -arch=arm ?do_get_date@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_date@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_date@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?do_get_date@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_date@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_date@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?do_get_date@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_date@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_date@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?do_get_monthname@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_monthname@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_monthname@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?do_get_monthname@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_monthname@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_monthname@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?do_get_monthname@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_monthname@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_monthname@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?do_get_time@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_time@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_time@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?do_get_time@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_time@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_time@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?do_get_time@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_time@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_time@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?do_get_weekday@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_weekday@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_weekday@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?do_get_weekday@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_weekday@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_weekday@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?do_get_weekday@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_weekday@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_weekday@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?do_get_year@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_year@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_year@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?do_get_year@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_year@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_year@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?do_get_year@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?do_get_year@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?do_get_year@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ cdecl -arch=arm ?do_in@?$codecvt@DDH@std@@MBAHAAHPBD1AAPBDPAD3AAPAD@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?do_in@?$codecvt@DDH@std@@MBAHAAHPBD1AAPBDPAD3AAPAD@Z +@ thiscall -arch=i386 ?do_in@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?do_in@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z +@ cdecl -arch=win64 ?do_in@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?do_in@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z +@ cdecl -arch=arm ?do_in@?$codecvt@GDH@std@@MBAHAAHPBD1AAPBDPAG3AAPAG@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?do_in@?$codecvt@GDH@std@@MBAHAAHPBD1AAPBDPAG3AAPAG@Z +@ thiscall -arch=i386 ?do_in@?$codecvt@GDH@std@@MBEHAAHPBD1AAPBDPAG3AAPAG@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?do_in@?$codecvt@GDH@std@@MBEHAAHPBD1AAPBDPAG3AAPAG@Z +@ cdecl -arch=win64 ?do_in@?$codecvt@GDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?do_in@?$codecvt@GDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z +@ cdecl -arch=arm ?do_in@?$codecvt@_WDH@std@@MBAHAAHPBD1AAPBDPA_W3AAPA_W@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?do_in@?$codecvt@_WDH@std@@MBAHAAHPBD1AAPBDPA_W3AAPA_W@Z +@ thiscall -arch=i386 ?do_in@?$codecvt@_WDH@std@@MBEHAAHPBD1AAPBDPA_W3AAPA_W@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?do_in@?$codecvt@_WDH@std@@MBEHAAHPBD1AAPBDPA_W3AAPA_W@Z +@ cdecl -arch=win64 ?do_in@?$codecvt@_WDH@std@@MEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?do_in@?$codecvt@_WDH@std@@MEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z +@ cdecl -arch=arm ?do_is@?$ctype@G@std@@MBAPBGPBG0PAF@Z(ptr ptr ptr ptr) msvcp120.?do_is@?$ctype@G@std@@MBAPBGPBG0PAF@Z +@ thiscall -arch=i386 ?do_is@?$ctype@G@std@@MBEPBGPBG0PAF@Z(ptr ptr ptr ptr) msvcp120.?do_is@?$ctype@G@std@@MBEPBGPBG0PAF@Z +@ cdecl -arch=win64 ?do_is@?$ctype@G@std@@MEBAPEBGPEBG0PEAF@Z(ptr ptr ptr ptr) msvcp120.?do_is@?$ctype@G@std@@MEBAPEBGPEBG0PEAF@Z +@ cdecl -arch=arm ?do_is@?$ctype@G@std@@MBA_NFG@Z(ptr long long) msvcp120.?do_is@?$ctype@G@std@@MBA_NFG@Z +@ thiscall -arch=i386 ?do_is@?$ctype@G@std@@MBE_NFG@Z(ptr long long) msvcp120.?do_is@?$ctype@G@std@@MBE_NFG@Z +@ cdecl -arch=win64 ?do_is@?$ctype@G@std@@MEBA_NFG@Z(ptr long long) msvcp120.?do_is@?$ctype@G@std@@MEBA_NFG@Z +@ cdecl -arch=arm ?do_is@?$ctype@_W@std@@MBAPB_WPB_W0PAF@Z(ptr ptr ptr ptr) msvcp120.?do_is@?$ctype@_W@std@@MBAPB_WPB_W0PAF@Z +@ thiscall -arch=i386 ?do_is@?$ctype@_W@std@@MBEPB_WPB_W0PAF@Z(ptr ptr ptr ptr) msvcp120.?do_is@?$ctype@_W@std@@MBEPB_WPB_W0PAF@Z +@ cdecl -arch=win64 ?do_is@?$ctype@_W@std@@MEBAPEB_WPEB_W0PEAF@Z(ptr ptr ptr ptr) msvcp120.?do_is@?$ctype@_W@std@@MEBAPEB_WPEB_W0PEAF@Z +@ cdecl -arch=arm ?do_is@?$ctype@_W@std@@MBA_NF_W@Z(ptr long long) msvcp120.?do_is@?$ctype@_W@std@@MBA_NF_W@Z +@ thiscall -arch=i386 ?do_is@?$ctype@_W@std@@MBE_NF_W@Z(ptr long long) msvcp120.?do_is@?$ctype@_W@std@@MBE_NF_W@Z +@ cdecl -arch=win64 ?do_is@?$ctype@_W@std@@MEBA_NF_W@Z(ptr long long) msvcp120.?do_is@?$ctype@_W@std@@MEBA_NF_W@Z +@ cdecl -arch=arm ?do_length@?$codecvt@DDH@std@@MBAHAAHPBD1I@Z(ptr ptr str str long) msvcp120.?do_length@?$codecvt@DDH@std@@MBAHAAHPBD1I@Z +@ thiscall -arch=i386 ?do_length@?$codecvt@DDH@std@@MBEHAAHPBD1I@Z(ptr ptr str str long) msvcp120.?do_length@?$codecvt@DDH@std@@MBEHAAHPBD1I@Z +@ cdecl -arch=win64 ?do_length@?$codecvt@DDH@std@@MEBAHAEAHPEBD1_K@Z(ptr ptr str str long) msvcp120.?do_length@?$codecvt@DDH@std@@MEBAHAEAHPEBD1_K@Z +@ cdecl -arch=arm ?do_length@?$codecvt@GDH@std@@MBAHAAHPBD1I@Z(ptr ptr str str long) msvcp120.?do_length@?$codecvt@GDH@std@@MBAHAAHPBD1I@Z +@ thiscall -arch=i386 ?do_length@?$codecvt@GDH@std@@MBEHAAHPBD1I@Z(ptr ptr str str long) msvcp120.?do_length@?$codecvt@GDH@std@@MBEHAAHPBD1I@Z +@ cdecl -arch=win64 ?do_length@?$codecvt@GDH@std@@MEBAHAEAHPEBD1_K@Z(ptr ptr str str long) msvcp120.?do_length@?$codecvt@GDH@std@@MEBAHAEAHPEBD1_K@Z +@ cdecl -arch=arm ?do_length@?$codecvt@_WDH@std@@MBAHAAHPBD1I@Z(ptr ptr str str long) msvcp120.?do_length@?$codecvt@_WDH@std@@MBAHAAHPBD1I@Z +@ thiscall -arch=i386 ?do_length@?$codecvt@_WDH@std@@MBEHAAHPBD1I@Z(ptr ptr str str long) msvcp120.?do_length@?$codecvt@_WDH@std@@MBEHAAHPBD1I@Z +@ cdecl -arch=win64 ?do_length@?$codecvt@_WDH@std@@MEBAHAEAHPEBD1_K@Z(ptr ptr str str long) msvcp120.?do_length@?$codecvt@_WDH@std@@MEBAHAEAHPEBD1_K@Z +@ cdecl -arch=arm ?do_max_length@?$codecvt@GDH@std@@MBAHXZ(ptr) msvcp120.?do_max_length@?$codecvt@GDH@std@@MBAHXZ +@ thiscall -arch=i386 ?do_max_length@?$codecvt@GDH@std@@MBEHXZ(ptr) msvcp120.?do_max_length@?$codecvt@GDH@std@@MBEHXZ +@ cdecl -arch=win64 ?do_max_length@?$codecvt@GDH@std@@MEBAHXZ(ptr) msvcp120.?do_max_length@?$codecvt@GDH@std@@MEBAHXZ +@ cdecl -arch=arm ?do_max_length@?$codecvt@_WDH@std@@MBAHXZ(ptr) msvcp120.?do_max_length@?$codecvt@_WDH@std@@MBAHXZ +@ thiscall -arch=i386 ?do_max_length@?$codecvt@_WDH@std@@MBEHXZ(ptr) msvcp120.?do_max_length@?$codecvt@_WDH@std@@MBEHXZ +@ cdecl -arch=win64 ?do_max_length@?$codecvt@_WDH@std@@MEBAHXZ(ptr) msvcp120.?do_max_length@?$codecvt@_WDH@std@@MEBAHXZ +@ cdecl -arch=arm ?do_max_length@codecvt_base@std@@MBAHXZ(ptr) msvcp120.?do_max_length@codecvt_base@std@@MBAHXZ +@ thiscall -arch=i386 ?do_max_length@codecvt_base@std@@MBEHXZ(ptr) msvcp120.?do_max_length@codecvt_base@std@@MBEHXZ +@ cdecl -arch=win64 ?do_max_length@codecvt_base@std@@MEBAHXZ(ptr) msvcp120.?do_max_length@codecvt_base@std@@MEBAHXZ +@ cdecl -arch=arm ?do_narrow@?$ctype@D@std@@MBADDD@Z(ptr long long) msvcp120.?do_narrow@?$ctype@D@std@@MBADDD@Z +@ thiscall -arch=i386 ?do_narrow@?$ctype@D@std@@MBEDDD@Z(ptr long long) msvcp120.?do_narrow@?$ctype@D@std@@MBEDDD@Z +@ cdecl -arch=win64 ?do_narrow@?$ctype@D@std@@MEBADDD@Z(ptr long long) msvcp120.?do_narrow@?$ctype@D@std@@MEBADDD@Z +@ cdecl -arch=arm ?do_narrow@?$ctype@D@std@@MBAPBDPBD0DPAD@Z(ptr ptr ptr long ptr) msvcp120.?do_narrow@?$ctype@D@std@@MBAPBDPBD0DPAD@Z +@ thiscall -arch=i386 ?do_narrow@?$ctype@D@std@@MBEPBDPBD0DPAD@Z(ptr ptr ptr long ptr) msvcp120.?do_narrow@?$ctype@D@std@@MBEPBDPBD0DPAD@Z +@ cdecl -arch=win64 ?do_narrow@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD@Z(ptr ptr ptr long ptr) msvcp120.?do_narrow@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD@Z +@ cdecl -arch=arm ?do_narrow@?$ctype@G@std@@MBADGD@Z(ptr long long) msvcp120.?do_narrow@?$ctype@G@std@@MBADGD@Z +@ thiscall -arch=i386 ?do_narrow@?$ctype@G@std@@MBEDGD@Z(ptr long long) msvcp120.?do_narrow@?$ctype@G@std@@MBEDGD@Z +@ cdecl -arch=win64 ?do_narrow@?$ctype@G@std@@MEBADGD@Z(ptr long long) msvcp120.?do_narrow@?$ctype@G@std@@MEBADGD@Z +@ cdecl -arch=arm ?do_narrow@?$ctype@G@std@@MBAPBGPBG0DPAD@Z(ptr ptr ptr long ptr) msvcp120.?do_narrow@?$ctype@G@std@@MBAPBGPBG0DPAD@Z +@ thiscall -arch=i386 ?do_narrow@?$ctype@G@std@@MBEPBGPBG0DPAD@Z(ptr ptr ptr long ptr) msvcp120.?do_narrow@?$ctype@G@std@@MBEPBGPBG0DPAD@Z +@ cdecl -arch=win64 ?do_narrow@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD@Z(ptr ptr ptr long ptr) msvcp120.?do_narrow@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD@Z +@ cdecl -arch=arm ?do_narrow@?$ctype@_W@std@@MBAD_WD@Z(ptr long long) msvcp120.?do_narrow@?$ctype@_W@std@@MBAD_WD@Z +@ thiscall -arch=i386 ?do_narrow@?$ctype@_W@std@@MBED_WD@Z(ptr long long) msvcp120.?do_narrow@?$ctype@_W@std@@MBED_WD@Z +@ cdecl -arch=win64 ?do_narrow@?$ctype@_W@std@@MEBAD_WD@Z(ptr long long) msvcp120.?do_narrow@?$ctype@_W@std@@MEBAD_WD@Z +@ cdecl -arch=arm ?do_narrow@?$ctype@_W@std@@MBAPB_WPB_W0DPAD@Z(ptr ptr ptr long ptr) msvcp120.?do_narrow@?$ctype@_W@std@@MBAPB_WPB_W0DPAD@Z +@ thiscall -arch=i386 ?do_narrow@?$ctype@_W@std@@MBEPB_WPB_W0DPAD@Z(ptr ptr ptr long ptr) msvcp120.?do_narrow@?$ctype@_W@std@@MBEPB_WPB_W0DPAD@Z +@ cdecl -arch=win64 ?do_narrow@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD@Z(ptr ptr ptr long ptr) msvcp120.?do_narrow@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD@Z +@ cdecl -arch=arm ?do_out@?$codecvt@DDH@std@@MBAHAAHPBD1AAPBDPAD3AAPAD@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?do_out@?$codecvt@DDH@std@@MBAHAAHPBD1AAPBDPAD3AAPAD@Z +@ thiscall -arch=i386 ?do_out@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?do_out@?$codecvt@DDH@std@@MBEHAAHPBD1AAPBDPAD3AAPAD@Z +@ cdecl -arch=win64 ?do_out@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?do_out@?$codecvt@DDH@std@@MEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z +@ cdecl -arch=arm ?do_out@?$codecvt@GDH@std@@MBAHAAHPBG1AAPBGPAD3AAPAD@Z(ptr ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_out@?$codecvt@GDH@std@@MBAHAAHPBG1AAPBGPAD3AAPAD@Z +@ thiscall -arch=i386 ?do_out@?$codecvt@GDH@std@@MBEHAAHPBG1AAPBGPAD3AAPAD@Z(ptr ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_out@?$codecvt@GDH@std@@MBEHAAHPBG1AAPBGPAD3AAPAD@Z +@ cdecl -arch=win64 ?do_out@?$codecvt@GDH@std@@MEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z(ptr ptr ptr ptr ptr ptr ptr ptr) msvcp120.?do_out@?$codecvt@GDH@std@@MEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z +@ cdecl -arch=arm ?do_out@?$codecvt@_WDH@std@@MBAHAAHPB_W1AAPB_WPAD3AAPAD@Z(ptr ptr wstr wstr ptr ptr ptr ptr) msvcp120.?do_out@?$codecvt@_WDH@std@@MBAHAAHPB_W1AAPB_WPAD3AAPAD@Z +@ thiscall -arch=i386 ?do_out@?$codecvt@_WDH@std@@MBEHAAHPB_W1AAPB_WPAD3AAPAD@Z(ptr ptr wstr wstr ptr ptr ptr ptr) msvcp120.?do_out@?$codecvt@_WDH@std@@MBEHAAHPB_W1AAPB_WPAD3AAPAD@Z +@ cdecl -arch=win64 ?do_out@?$codecvt@_WDH@std@@MEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z(ptr ptr wstr wstr ptr ptr ptr ptr) msvcp120.?do_out@?$codecvt@_WDH@std@@MEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z +@ cdecl -arch=arm ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DJ@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DJ@Z +@ thiscall -arch=i386 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DJ@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DJ@Z +@ cdecl -arch=win64 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DJ@Z(ptr ptr ptr ptr long long) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DJ@Z +@ cdecl -arch=arm ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DK@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DK@Z +@ thiscall -arch=i386 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DK@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DK@Z +@ cdecl -arch=win64 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DK@Z(ptr ptr ptr ptr long long) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DK@Z +@ cdecl -arch=arm ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DN@Z(ptr ptr long ptr ptr long double) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DN@Z +@ thiscall -arch=i386 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DN@Z(ptr ptr long ptr ptr long double) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DN@Z +@ cdecl -arch=win64 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DN@Z(ptr ptr ptr ptr long double) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DN@Z +@ cdecl -arch=arm ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DO@Z(ptr ptr long ptr ptr long double) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DO@Z +@ thiscall -arch=i386 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DO@Z(ptr ptr long ptr ptr long double) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DO@Z +@ cdecl -arch=win64 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DO@Z(ptr ptr ptr ptr long double) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DO@Z +@ cdecl -arch=arm ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBX@Z(ptr ptr long ptr ptr long ptr) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBX@Z +@ thiscall -arch=i386 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBX@Z(ptr ptr long ptr ptr long ptr) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBX@Z +@ cdecl -arch=win64 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBX@Z(ptr ptr ptr ptr long ptr) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBX@Z +@ cdecl -arch=arm ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_J@Z(ptr ptr long ptr ptr long int64) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_J@Z +@ thiscall -arch=i386 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_J@Z(ptr ptr long ptr ptr long int64) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_J@Z +@ cdecl -arch=win64 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_J@Z(ptr ptr ptr ptr long int64) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_J@Z +@ cdecl -arch=arm ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_K@Z(ptr ptr long ptr ptr long int64) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_K@Z +@ thiscall -arch=i386 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_K@Z(ptr ptr long ptr ptr long int64) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_K@Z +@ cdecl -arch=win64 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_K@Z(ptr ptr ptr ptr long int64) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_K@Z +@ cdecl -arch=arm ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_N@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_N@Z +@ thiscall -arch=i386 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_N@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_N@Z +@ cdecl -arch=win64 ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z(ptr ptr ptr ptr long long) msvcp120.?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z +@ cdecl -arch=arm ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GJ@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GJ@Z +@ thiscall -arch=i386 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GJ@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GJ@Z +@ cdecl -arch=win64 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GJ@Z(ptr ptr ptr ptr long long) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GJ@Z +@ cdecl -arch=arm ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GK@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GK@Z +@ thiscall -arch=i386 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GK@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GK@Z +@ cdecl -arch=win64 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GK@Z(ptr ptr ptr ptr long long) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GK@Z +@ cdecl -arch=arm ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GN@Z(ptr ptr long ptr ptr long double) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GN@Z +@ thiscall -arch=i386 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GN@Z(ptr ptr long ptr ptr long double) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GN@Z +@ cdecl -arch=win64 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GN@Z(ptr ptr ptr ptr long double) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GN@Z +@ cdecl -arch=arm ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GO@Z(ptr ptr long ptr ptr long double) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GO@Z +@ thiscall -arch=i386 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GO@Z(ptr ptr long ptr ptr long double) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GO@Z +@ cdecl -arch=win64 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GO@Z(ptr ptr ptr ptr long double) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GO@Z +@ cdecl -arch=arm ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBX@Z(ptr ptr long ptr ptr long ptr) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBX@Z +@ thiscall -arch=i386 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBX@Z(ptr ptr long ptr ptr long ptr) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBX@Z +@ cdecl -arch=win64 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBX@Z(ptr ptr ptr ptr long ptr) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBX@Z +@ cdecl -arch=arm ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_J@Z(ptr ptr long ptr ptr long int64) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_J@Z +@ thiscall -arch=i386 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_J@Z(ptr ptr long ptr ptr long int64) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_J@Z +@ cdecl -arch=win64 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_J@Z(ptr ptr ptr ptr long int64) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_J@Z +@ cdecl -arch=arm ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_K@Z(ptr ptr long ptr ptr long int64) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_K@Z +@ thiscall -arch=i386 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_K@Z(ptr ptr long ptr ptr long int64) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_K@Z +@ cdecl -arch=win64 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_K@Z(ptr ptr ptr ptr long int64) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_K@Z +@ cdecl -arch=arm ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_N@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_N@Z +@ thiscall -arch=i386 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_N@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_N@Z +@ cdecl -arch=win64 ?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_N@Z(ptr ptr ptr ptr long long) msvcp120.?do_put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_N@Z +@ cdecl -arch=arm ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WJ@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WJ@Z +@ thiscall -arch=i386 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WJ@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WJ@Z +@ cdecl -arch=win64 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WJ@Z(ptr ptr ptr ptr long long) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WJ@Z +@ cdecl -arch=arm ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WK@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WK@Z +@ thiscall -arch=i386 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WK@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WK@Z +@ cdecl -arch=win64 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WK@Z(ptr ptr ptr ptr long long) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WK@Z +@ cdecl -arch=arm ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WN@Z(ptr ptr long ptr ptr long double) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WN@Z +@ thiscall -arch=i386 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WN@Z(ptr ptr long ptr ptr long double) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WN@Z +@ cdecl -arch=win64 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WN@Z(ptr ptr ptr ptr long double) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WN@Z +@ cdecl -arch=arm ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WO@Z(ptr ptr long ptr ptr long double) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WO@Z +@ thiscall -arch=i386 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WO@Z(ptr ptr long ptr ptr long double) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WO@Z +@ cdecl -arch=win64 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WO@Z(ptr ptr ptr ptr long double) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WO@Z +@ cdecl -arch=arm ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBX@Z(ptr ptr long ptr ptr long ptr) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBX@Z +@ thiscall -arch=i386 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBX@Z(ptr ptr long ptr ptr long ptr) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBX@Z +@ cdecl -arch=win64 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBX@Z(ptr ptr ptr ptr long ptr) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBX@Z +@ cdecl -arch=arm ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_J@Z(ptr ptr long ptr ptr long int64) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_J@Z +@ thiscall -arch=i386 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_J@Z(ptr ptr long ptr ptr long int64) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_J@Z +@ cdecl -arch=win64 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_J@Z(ptr ptr ptr ptr long int64) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_J@Z +@ cdecl -arch=arm ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_K@Z(ptr ptr long ptr ptr long int64) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_K@Z +@ thiscall -arch=i386 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_K@Z(ptr ptr long ptr ptr long int64) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_K@Z +@ cdecl -arch=win64 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_K@Z(ptr ptr ptr ptr long int64) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_K@Z +@ cdecl -arch=arm ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_N@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_N@Z +@ thiscall -arch=i386 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_N@Z(ptr ptr long ptr ptr long long) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_N@Z +@ cdecl -arch=win64 ?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_N@Z(ptr ptr ptr ptr long long) msvcp120.?do_put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_N@Z +@ cdecl -arch=arm ?do_put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@DD@Z(ptr ptr long ptr ptr long ptr long long) msvcp120.?do_put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@DD@Z +@ thiscall -arch=i386 ?do_put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@DD@Z(ptr ptr long ptr ptr long ptr long long) msvcp120.?do_put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@DD@Z +@ cdecl -arch=win64 ?do_put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBUtm@@DD@Z(ptr ptr ptr ptr long ptr long long) msvcp120.?do_put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBUtm@@DD@Z +@ cdecl -arch=arm ?do_put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@DD@Z(ptr ptr long ptr ptr long ptr long long) msvcp120.?do_put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@DD@Z +@ thiscall -arch=i386 ?do_put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@DD@Z(ptr ptr long ptr ptr long ptr long long) msvcp120.?do_put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@DD@Z +@ cdecl -arch=win64 ?do_put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBUtm@@DD@Z(ptr ptr ptr ptr long ptr long long) msvcp120.?do_put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBUtm@@DD@Z +@ cdecl -arch=arm ?do_put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@DD@Z(ptr ptr long ptr ptr long ptr long long) msvcp120.?do_put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@DD@Z +@ thiscall -arch=i386 ?do_put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@DD@Z(ptr ptr long ptr ptr long ptr long long) msvcp120.?do_put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@DD@Z +@ cdecl -arch=win64 ?do_put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBUtm@@DD@Z(ptr ptr ptr ptr long ptr long long) msvcp120.?do_put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBUtm@@DD@Z +@ cdecl -arch=arm ?do_scan_is@?$ctype@G@std@@MBAPBGFPBG0@Z(ptr long ptr ptr) msvcp120.?do_scan_is@?$ctype@G@std@@MBAPBGFPBG0@Z +@ thiscall -arch=i386 ?do_scan_is@?$ctype@G@std@@MBEPBGFPBG0@Z(ptr long ptr ptr) msvcp120.?do_scan_is@?$ctype@G@std@@MBEPBGFPBG0@Z +@ cdecl -arch=win64 ?do_scan_is@?$ctype@G@std@@MEBAPEBGFPEBG0@Z(ptr long ptr ptr) msvcp120.?do_scan_is@?$ctype@G@std@@MEBAPEBGFPEBG0@Z +@ cdecl -arch=arm ?do_scan_is@?$ctype@_W@std@@MBAPB_WFPB_W0@Z(ptr long ptr ptr) msvcp120.?do_scan_is@?$ctype@_W@std@@MBAPB_WFPB_W0@Z +@ thiscall -arch=i386 ?do_scan_is@?$ctype@_W@std@@MBEPB_WFPB_W0@Z(ptr long ptr ptr) msvcp120.?do_scan_is@?$ctype@_W@std@@MBEPB_WFPB_W0@Z +@ cdecl -arch=win64 ?do_scan_is@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z(ptr long ptr ptr) msvcp120.?do_scan_is@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z +@ cdecl -arch=arm ?do_scan_not@?$ctype@G@std@@MBAPBGFPBG0@Z(ptr long ptr ptr) msvcp120.?do_scan_not@?$ctype@G@std@@MBAPBGFPBG0@Z +@ thiscall -arch=i386 ?do_scan_not@?$ctype@G@std@@MBEPBGFPBG0@Z(ptr long ptr ptr) msvcp120.?do_scan_not@?$ctype@G@std@@MBEPBGFPBG0@Z +@ cdecl -arch=win64 ?do_scan_not@?$ctype@G@std@@MEBAPEBGFPEBG0@Z(ptr long ptr ptr) msvcp120.?do_scan_not@?$ctype@G@std@@MEBAPEBGFPEBG0@Z +@ cdecl -arch=arm ?do_scan_not@?$ctype@_W@std@@MBAPB_WFPB_W0@Z(ptr long ptr ptr) msvcp120.?do_scan_not@?$ctype@_W@std@@MBAPB_WFPB_W0@Z +@ thiscall -arch=i386 ?do_scan_not@?$ctype@_W@std@@MBEPB_WFPB_W0@Z(ptr long ptr ptr) msvcp120.?do_scan_not@?$ctype@_W@std@@MBEPB_WFPB_W0@Z +@ cdecl -arch=win64 ?do_scan_not@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z(ptr long ptr ptr) msvcp120.?do_scan_not@?$ctype@_W@std@@MEBAPEB_WFPEB_W0@Z +@ cdecl -arch=arm ?do_tolower@?$ctype@D@std@@MBADD@Z(ptr long) msvcp120.?do_tolower@?$ctype@D@std@@MBADD@Z +@ thiscall -arch=i386 ?do_tolower@?$ctype@D@std@@MBEDD@Z(ptr long) msvcp120.?do_tolower@?$ctype@D@std@@MBEDD@Z +@ cdecl -arch=win64 ?do_tolower@?$ctype@D@std@@MEBADD@Z(ptr long) msvcp120.?do_tolower@?$ctype@D@std@@MEBADD@Z +@ cdecl -arch=arm ?do_tolower@?$ctype@D@std@@MBAPBDPADPBD@Z(ptr ptr ptr) msvcp120.?do_tolower@?$ctype@D@std@@MBAPBDPADPBD@Z +@ thiscall -arch=i386 ?do_tolower@?$ctype@D@std@@MBEPBDPADPBD@Z(ptr ptr ptr) msvcp120.?do_tolower@?$ctype@D@std@@MBEPBDPADPBD@Z +@ cdecl -arch=win64 ?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z(ptr ptr ptr) msvcp120.?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z +@ cdecl -arch=arm ?do_tolower@?$ctype@G@std@@MBAGG@Z(ptr long) msvcp120.?do_tolower@?$ctype@G@std@@MBAGG@Z +@ thiscall -arch=i386 ?do_tolower@?$ctype@G@std@@MBEGG@Z(ptr long) msvcp120.?do_tolower@?$ctype@G@std@@MBEGG@Z +@ cdecl -arch=win64 ?do_tolower@?$ctype@G@std@@MEBAGG@Z(ptr long) msvcp120.?do_tolower@?$ctype@G@std@@MEBAGG@Z +@ cdecl -arch=arm ?do_tolower@?$ctype@G@std@@MBAPBGPAGPBG@Z(ptr ptr ptr) msvcp120.?do_tolower@?$ctype@G@std@@MBAPBGPAGPBG@Z +@ thiscall -arch=i386 ?do_tolower@?$ctype@G@std@@MBEPBGPAGPBG@Z(ptr ptr ptr) msvcp120.?do_tolower@?$ctype@G@std@@MBEPBGPAGPBG@Z +@ cdecl -arch=win64 ?do_tolower@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z(ptr ptr ptr) msvcp120.?do_tolower@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z +@ cdecl -arch=arm ?do_tolower@?$ctype@_W@std@@MBAPB_WPA_WPB_W@Z(ptr ptr ptr) msvcp120.?do_tolower@?$ctype@_W@std@@MBAPB_WPA_WPB_W@Z +@ thiscall -arch=i386 ?do_tolower@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z(ptr ptr ptr) msvcp120.?do_tolower@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z +@ cdecl -arch=win64 ?do_tolower@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z(ptr ptr ptr) msvcp120.?do_tolower@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z +@ cdecl -arch=arm ?do_tolower@?$ctype@_W@std@@MBA_W_W@Z(ptr long) msvcp120.?do_tolower@?$ctype@_W@std@@MBA_W_W@Z +@ thiscall -arch=i386 ?do_tolower@?$ctype@_W@std@@MBE_W_W@Z(ptr long) msvcp120.?do_tolower@?$ctype@_W@std@@MBE_W_W@Z +@ cdecl -arch=win64 ?do_tolower@?$ctype@_W@std@@MEBA_W_W@Z(ptr long) msvcp120.?do_tolower@?$ctype@_W@std@@MEBA_W_W@Z +@ cdecl -arch=arm ?do_toupper@?$ctype@D@std@@MBADD@Z(ptr long) msvcp120.?do_toupper@?$ctype@D@std@@MBADD@Z +@ thiscall -arch=i386 ?do_toupper@?$ctype@D@std@@MBEDD@Z(ptr long) msvcp120.?do_toupper@?$ctype@D@std@@MBEDD@Z +@ cdecl -arch=win64 ?do_toupper@?$ctype@D@std@@MEBADD@Z(ptr long) msvcp120.?do_toupper@?$ctype@D@std@@MEBADD@Z +@ cdecl -arch=arm ?do_toupper@?$ctype@D@std@@MBAPBDPADPBD@Z(ptr ptr ptr) msvcp120.?do_toupper@?$ctype@D@std@@MBAPBDPADPBD@Z +@ thiscall -arch=i386 ?do_toupper@?$ctype@D@std@@MBEPBDPADPBD@Z(ptr ptr ptr) msvcp120.?do_toupper@?$ctype@D@std@@MBEPBDPADPBD@Z +@ cdecl -arch=win64 ?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z(ptr ptr ptr) msvcp120.?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z +@ cdecl -arch=arm ?do_toupper@?$ctype@G@std@@MBAGG@Z(ptr long) msvcp120.?do_toupper@?$ctype@G@std@@MBAGG@Z +@ thiscall -arch=i386 ?do_toupper@?$ctype@G@std@@MBEGG@Z(ptr long) msvcp120.?do_toupper@?$ctype@G@std@@MBEGG@Z +@ cdecl -arch=win64 ?do_toupper@?$ctype@G@std@@MEBAGG@Z(ptr long) msvcp120.?do_toupper@?$ctype@G@std@@MEBAGG@Z +@ cdecl -arch=arm ?do_toupper@?$ctype@G@std@@MBAPBGPAGPBG@Z(ptr ptr ptr) msvcp120.?do_toupper@?$ctype@G@std@@MBAPBGPAGPBG@Z +@ thiscall -arch=i386 ?do_toupper@?$ctype@G@std@@MBEPBGPAGPBG@Z(ptr ptr ptr) msvcp120.?do_toupper@?$ctype@G@std@@MBEPBGPAGPBG@Z +@ cdecl -arch=win64 ?do_toupper@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z(ptr ptr ptr) msvcp120.?do_toupper@?$ctype@G@std@@MEBAPEBGPEAGPEBG@Z +@ cdecl -arch=arm ?do_toupper@?$ctype@_W@std@@MBAPB_WPA_WPB_W@Z(ptr ptr ptr) msvcp120.?do_toupper@?$ctype@_W@std@@MBAPB_WPA_WPB_W@Z +@ thiscall -arch=i386 ?do_toupper@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z(ptr ptr ptr) msvcp120.?do_toupper@?$ctype@_W@std@@MBEPB_WPA_WPB_W@Z +@ cdecl -arch=win64 ?do_toupper@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z(ptr ptr ptr) msvcp120.?do_toupper@?$ctype@_W@std@@MEBAPEB_WPEA_WPEB_W@Z +@ cdecl -arch=arm ?do_toupper@?$ctype@_W@std@@MBA_W_W@Z(ptr long) msvcp120.?do_toupper@?$ctype@_W@std@@MBA_W_W@Z +@ thiscall -arch=i386 ?do_toupper@?$ctype@_W@std@@MBE_W_W@Z(ptr long) msvcp120.?do_toupper@?$ctype@_W@std@@MBE_W_W@Z +@ cdecl -arch=win64 ?do_toupper@?$ctype@_W@std@@MEBA_W_W@Z(ptr long) msvcp120.?do_toupper@?$ctype@_W@std@@MEBA_W_W@Z +@ cdecl -arch=arm ?do_unshift@?$codecvt@DDH@std@@MBAHAAHPAD1AAPAD@Z(ptr ptr ptr ptr ptr) msvcp120.?do_unshift@?$codecvt@DDH@std@@MBAHAAHPAD1AAPAD@Z +@ thiscall -arch=i386 ?do_unshift@?$codecvt@DDH@std@@MBEHAAHPAD1AAPAD@Z(ptr ptr ptr ptr ptr) msvcp120.?do_unshift@?$codecvt@DDH@std@@MBEHAAHPAD1AAPAD@Z +@ cdecl -arch=win64 ?do_unshift@?$codecvt@DDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z(ptr ptr ptr ptr ptr) msvcp120.?do_unshift@?$codecvt@DDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z +@ cdecl -arch=arm ?do_unshift@?$codecvt@GDH@std@@MBAHAAHPAD1AAPAD@Z(ptr ptr ptr ptr ptr) msvcp120.?do_unshift@?$codecvt@GDH@std@@MBAHAAHPAD1AAPAD@Z +@ thiscall -arch=i386 ?do_unshift@?$codecvt@GDH@std@@MBEHAAHPAD1AAPAD@Z(ptr ptr ptr ptr ptr) msvcp120.?do_unshift@?$codecvt@GDH@std@@MBEHAAHPAD1AAPAD@Z +@ cdecl -arch=win64 ?do_unshift@?$codecvt@GDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z(ptr ptr ptr ptr ptr) msvcp120.?do_unshift@?$codecvt@GDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z +@ cdecl -arch=arm ?do_unshift@?$codecvt@_WDH@std@@MBAHAAHPAD1AAPAD@Z(ptr ptr ptr ptr ptr) msvcp120.?do_unshift@?$codecvt@_WDH@std@@MBAHAAHPAD1AAPAD@Z +@ thiscall -arch=i386 ?do_unshift@?$codecvt@_WDH@std@@MBEHAAHPAD1AAPAD@Z(ptr ptr ptr ptr ptr) msvcp120.?do_unshift@?$codecvt@_WDH@std@@MBEHAAHPAD1AAPAD@Z +@ cdecl -arch=win64 ?do_unshift@?$codecvt@_WDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z(ptr ptr ptr ptr ptr) msvcp120.?do_unshift@?$codecvt@_WDH@std@@MEBAHAEAHPEAD1AEAPEAD@Z +@ cdecl -arch=arm ?do_widen@?$ctype@D@std@@MBADD@Z(ptr long) msvcp120.?do_widen@?$ctype@D@std@@MBADD@Z +@ thiscall -arch=i386 ?do_widen@?$ctype@D@std@@MBEDD@Z(ptr long) msvcp120.?do_widen@?$ctype@D@std@@MBEDD@Z +@ cdecl -arch=win64 ?do_widen@?$ctype@D@std@@MEBADD@Z(ptr long) msvcp120.?do_widen@?$ctype@D@std@@MEBADD@Z +@ cdecl -arch=arm ?do_widen@?$ctype@D@std@@MBAPBDPBD0PAD@Z(ptr ptr ptr ptr) msvcp120.?do_widen@?$ctype@D@std@@MBAPBDPBD0PAD@Z +@ thiscall -arch=i386 ?do_widen@?$ctype@D@std@@MBEPBDPBD0PAD@Z(ptr ptr ptr ptr) msvcp120.?do_widen@?$ctype@D@std@@MBEPBDPBD0PAD@Z +@ cdecl -arch=win64 ?do_widen@?$ctype@D@std@@MEBAPEBDPEBD0PEAD@Z(ptr ptr ptr ptr) msvcp120.?do_widen@?$ctype@D@std@@MEBAPEBDPEBD0PEAD@Z +@ cdecl -arch=arm ?do_widen@?$ctype@G@std@@MBAGD@Z(ptr long) msvcp120.?do_widen@?$ctype@G@std@@MBAGD@Z +@ thiscall -arch=i386 ?do_widen@?$ctype@G@std@@MBEGD@Z(ptr long) msvcp120.?do_widen@?$ctype@G@std@@MBEGD@Z +@ cdecl -arch=win64 ?do_widen@?$ctype@G@std@@MEBAGD@Z(ptr long) msvcp120.?do_widen@?$ctype@G@std@@MEBAGD@Z +@ cdecl -arch=arm ?do_widen@?$ctype@G@std@@MBAPBDPBD0PAG@Z(ptr ptr ptr ptr) msvcp120.?do_widen@?$ctype@G@std@@MBAPBDPBD0PAG@Z +@ thiscall -arch=i386 ?do_widen@?$ctype@G@std@@MBEPBDPBD0PAG@Z(ptr ptr ptr ptr) msvcp120.?do_widen@?$ctype@G@std@@MBEPBDPBD0PAG@Z +@ cdecl -arch=win64 ?do_widen@?$ctype@G@std@@MEBAPEBDPEBD0PEAG@Z(ptr ptr ptr ptr) msvcp120.?do_widen@?$ctype@G@std@@MEBAPEBDPEBD0PEAG@Z +@ cdecl -arch=arm ?do_widen@?$ctype@_W@std@@MBAPBDPBD0PA_W@Z(ptr ptr ptr ptr) msvcp120.?do_widen@?$ctype@_W@std@@MBAPBDPBD0PA_W@Z +@ thiscall -arch=i386 ?do_widen@?$ctype@_W@std@@MBEPBDPBD0PA_W@Z(ptr ptr ptr ptr) msvcp120.?do_widen@?$ctype@_W@std@@MBEPBDPBD0PA_W@Z +@ cdecl -arch=win64 ?do_widen@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W@Z(ptr ptr ptr ptr) msvcp120.?do_widen@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W@Z +@ cdecl -arch=arm ?do_widen@?$ctype@_W@std@@MBA_WD@Z(ptr long) msvcp120.?do_widen@?$ctype@_W@std@@MBA_WD@Z +@ thiscall -arch=i386 ?do_widen@?$ctype@_W@std@@MBE_WD@Z(ptr long) msvcp120.?do_widen@?$ctype@_W@std@@MBE_WD@Z +@ cdecl -arch=win64 ?do_widen@?$ctype@_W@std@@MEBA_WD@Z(ptr long) msvcp120.?do_widen@?$ctype@_W@std@@MEBA_WD@Z +@ stub -arch=arm ?done@agent@Concurrency@@IAA_NXZ +@ stub -arch=i386 ?done@agent@Concurrency@@IAE_NXZ +@ stub -arch=win64 ?done@agent@Concurrency@@IEAA_NXZ +@ cdecl -arch=arm ?eback@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBAPADXZ(ptr) msvcp120.?eback@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBAPADXZ +@ thiscall -arch=i386 ?eback@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ(ptr) msvcp120.?eback@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ +@ cdecl -arch=win64 ?eback@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ(ptr) msvcp120.?eback@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ +@ cdecl -arch=arm ?eback@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBAPAGXZ(ptr) msvcp120.?eback@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBAPAGXZ +@ thiscall -arch=i386 ?eback@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ(ptr) msvcp120.?eback@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ +@ cdecl -arch=win64 ?eback@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ(ptr) msvcp120.?eback@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ +@ cdecl -arch=arm ?eback@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBAPA_WXZ(ptr) msvcp120.?eback@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBAPA_WXZ +@ thiscall -arch=i386 ?eback@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ(ptr) msvcp120.?eback@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ +@ cdecl -arch=win64 ?eback@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ(ptr) msvcp120.?eback@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ +@ cdecl -arch=arm ?egptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBAPADXZ(ptr) msvcp120.?egptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBAPADXZ +@ thiscall -arch=i386 ?egptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ(ptr) msvcp120.?egptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ +@ cdecl -arch=win64 ?egptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ(ptr) msvcp120.?egptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ +@ cdecl -arch=arm ?egptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBAPAGXZ(ptr) msvcp120.?egptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBAPAGXZ +@ thiscall -arch=i386 ?egptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ(ptr) msvcp120.?egptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ +@ cdecl -arch=win64 ?egptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ(ptr) msvcp120.?egptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ +@ cdecl -arch=arm ?egptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBAPA_WXZ(ptr) msvcp120.?egptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBAPA_WXZ +@ thiscall -arch=i386 ?egptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ(ptr) msvcp120.?egptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ +@ cdecl -arch=win64 ?egptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ(ptr) msvcp120.?egptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ +@ cdecl -arch=arm ?empty@?$_Yarn@D@std@@QBA_NXZ(ptr) msvcp120.?empty@?$_Yarn@D@std@@QBA_NXZ +@ thiscall -arch=i386 ?empty@?$_Yarn@D@std@@QBE_NXZ(ptr) msvcp120.?empty@?$_Yarn@D@std@@QBE_NXZ +@ cdecl -arch=win64 ?empty@?$_Yarn@D@std@@QEBA_NXZ(ptr) msvcp120.?empty@?$_Yarn@D@std@@QEBA_NXZ +@ cdecl ?empty@locale@std@@SA?AV12@XZ(ptr) msvcp120.?empty@locale@std@@SA?AV12@XZ +@ cdecl -arch=arm ?encoding@codecvt_base@std@@QBAHXZ(ptr) msvcp120.?encoding@codecvt_base@std@@QBAHXZ +@ thiscall -arch=i386 ?encoding@codecvt_base@std@@QBEHXZ(ptr) msvcp120.?encoding@codecvt_base@std@@QBEHXZ +@ cdecl -arch=win64 ?encoding@codecvt_base@std@@QEBAHXZ(ptr) msvcp120.?encoding@codecvt_base@std@@QEBAHXZ +@ cdecl -arch=arm ?eof@ios_base@std@@QBA_NXZ(ptr) msvcp120.?eof@ios_base@std@@QBA_NXZ +@ thiscall -arch=i386 ?eof@ios_base@std@@QBE_NXZ(ptr) msvcp120.?eof@ios_base@std@@QBE_NXZ +@ cdecl -arch=win64 ?eof@ios_base@std@@QEBA_NXZ(ptr) msvcp120.?eof@ios_base@std@@QEBA_NXZ +@ cdecl -arch=arm ?epptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBAPADXZ(ptr) msvcp120.?epptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBAPADXZ +@ thiscall -arch=i386 ?epptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ(ptr) msvcp120.?epptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ +@ cdecl -arch=win64 ?epptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ(ptr) msvcp120.?epptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ +@ cdecl -arch=arm ?epptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBAPAGXZ(ptr) msvcp120.?epptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBAPAGXZ +@ thiscall -arch=i386 ?epptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ(ptr) msvcp120.?epptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ +@ cdecl -arch=win64 ?epptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ(ptr) msvcp120.?epptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ +@ cdecl -arch=arm ?epptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBAPA_WXZ(ptr) msvcp120.?epptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBAPA_WXZ +@ thiscall -arch=i386 ?epptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ(ptr) msvcp120.?epptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ +@ cdecl -arch=win64 ?epptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ(ptr) msvcp120.?epptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ +@ cdecl -arch=arm ?exceptions@ios_base@std@@QAAXH@Z(ptr long) msvcp120.?exceptions@ios_base@std@@QAAXH@Z +@ thiscall -arch=i386 ?exceptions@ios_base@std@@QAEXH@Z(ptr long) msvcp120.?exceptions@ios_base@std@@QAEXH@Z +@ cdecl -arch=win64 ?exceptions@ios_base@std@@QEAAXH@Z(ptr long) msvcp120.?exceptions@ios_base@std@@QEAAXH@Z +@ cdecl -arch=arm ?exceptions@ios_base@std@@QAAXI@Z(ptr long) msvcp120.?exceptions@ios_base@std@@QAAXI@Z +@ thiscall -arch=i386 ?exceptions@ios_base@std@@QAEXI@Z(ptr long) msvcp120.?exceptions@ios_base@std@@QAEXI@Z +@ cdecl -arch=win64 ?exceptions@ios_base@std@@QEAAXI@Z(ptr long) msvcp120.?exceptions@ios_base@std@@QEAAXI@Z +@ cdecl -arch=arm ?exceptions@ios_base@std@@QBAHXZ(ptr) msvcp120.?exceptions@ios_base@std@@QBAHXZ +@ thiscall -arch=i386 ?exceptions@ios_base@std@@QBEHXZ(ptr) msvcp120.?exceptions@ios_base@std@@QBEHXZ +@ cdecl -arch=win64 ?exceptions@ios_base@std@@QEBAHXZ(ptr) msvcp120.?exceptions@ios_base@std@@QEBAHXZ +@ cdecl -arch=arm ?fail@ios_base@std@@QBA_NXZ(ptr) msvcp120.?fail@ios_base@std@@QBA_NXZ +@ thiscall -arch=i386 ?fail@ios_base@std@@QBE_NXZ(ptr) msvcp120.?fail@ios_base@std@@QBE_NXZ +@ cdecl -arch=win64 ?fail@ios_base@std@@QEBA_NXZ(ptr) msvcp120.?fail@ios_base@std@@QEBA_NXZ +@ cdecl -arch=arm ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QAADD@Z(ptr long) msvcp120.?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QAADD@Z +@ thiscall -arch=i386 ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEDD@Z(ptr long) msvcp120.?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEDD@Z +@ cdecl -arch=win64 ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAADD@Z(ptr long) msvcp120.?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAADD@Z +@ cdecl -arch=arm ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBADXZ(ptr) msvcp120.?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBADXZ +@ thiscall -arch=i386 ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ(ptr) msvcp120.?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ +@ cdecl -arch=win64 ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADXZ(ptr) msvcp120.?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADXZ +@ cdecl -arch=arm ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAGG@Z(ptr long) msvcp120.?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAGG@Z +@ thiscall -arch=i386 ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEGG@Z(ptr long) msvcp120.?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEGG@Z +@ cdecl -arch=win64 ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAGG@Z(ptr long) msvcp120.?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAGG@Z +@ cdecl -arch=arm ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QBAGXZ(ptr) msvcp120.?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QBAGXZ +@ thiscall -arch=i386 ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEGXZ(ptr) msvcp120.?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEGXZ +@ cdecl -arch=win64 ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAGXZ(ptr) msvcp120.?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAGXZ +@ cdecl -arch=arm ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAA_W_W@Z(ptr long) msvcp120.?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAA_W_W@Z +@ thiscall -arch=i386 ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE_W_W@Z(ptr long) msvcp120.?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE_W_W@Z +@ cdecl -arch=win64 ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA_W_W@Z(ptr long) msvcp120.?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA_W_W@Z +@ cdecl -arch=arm ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBA_WXZ(ptr) msvcp120.?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBA_WXZ +@ thiscall -arch=i386 ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBE_WXZ(ptr) msvcp120.?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBE_WXZ +@ cdecl -arch=win64 ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBA_WXZ(ptr) msvcp120.?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBA_WXZ +@ cdecl -arch=arm ?flags@ios_base@std@@QAAHH@Z(ptr long) msvcp120.?flags@ios_base@std@@QAAHH@Z +@ thiscall -arch=i386 ?flags@ios_base@std@@QAEHH@Z(ptr long) msvcp120.?flags@ios_base@std@@QAEHH@Z +@ cdecl -arch=win64 ?flags@ios_base@std@@QEAAHH@Z(ptr long) msvcp120.?flags@ios_base@std@@QEAAHH@Z +@ cdecl -arch=arm ?flags@ios_base@std@@QBAHXZ(ptr) msvcp120.?flags@ios_base@std@@QBAHXZ +@ thiscall -arch=i386 ?flags@ios_base@std@@QBEHXZ(ptr) msvcp120.?flags@ios_base@std@@QBEHXZ +@ cdecl -arch=win64 ?flags@ios_base@std@@QEBAHXZ(ptr) msvcp120.?flags@ios_base@std@@QEBAHXZ +@ cdecl -arch=arm ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV12@XZ(ptr) msvcp120.?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV12@XZ +@ thiscall -arch=i386 ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ(ptr) msvcp120.?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ +@ cdecl -arch=win64 ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ(ptr) msvcp120.?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ +@ cdecl -arch=arm ?flush@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV12@XZ(ptr) msvcp120.?flush@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV12@XZ +@ thiscall -arch=i386 ?flush@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@XZ(ptr) msvcp120.?flush@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@XZ +@ cdecl -arch=win64 ?flush@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@XZ(ptr) msvcp120.?flush@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@XZ +@ cdecl -arch=arm ?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@XZ(ptr) msvcp120.?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@XZ +@ thiscall -arch=i386 ?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@XZ(ptr) msvcp120.?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@XZ +@ cdecl -arch=win64 ?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@XZ(ptr) msvcp120.?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@XZ +@ cdecl -arch=arm ?gbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXH@Z(ptr long) msvcp120.?gbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXH@Z +@ thiscall -arch=i386 ?gbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXH@Z(ptr long) msvcp120.?gbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXH@Z +@ cdecl -arch=win64 ?gbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXH@Z(ptr long) msvcp120.?gbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXH@Z +@ cdecl -arch=arm ?gbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXH@Z(ptr long) msvcp120.?gbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXH@Z +@ thiscall -arch=i386 ?gbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXH@Z(ptr long) msvcp120.?gbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXH@Z +@ cdecl -arch=win64 ?gbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXH@Z(ptr long) msvcp120.?gbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXH@Z +@ cdecl -arch=arm ?gbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXH@Z(ptr long) msvcp120.?gbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXH@Z +@ thiscall -arch=i386 ?gbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXH@Z(ptr long) msvcp120.?gbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXH@Z +@ cdecl -arch=win64 ?gbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXH@Z(ptr long) msvcp120.?gbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXH@Z +@ cdecl -ret64 -arch=arm ?gcount@?$basic_istream@DU?$char_traits@D@std@@@std@@QBA_JXZ(ptr) msvcp120.?gcount@?$basic_istream@DU?$char_traits@D@std@@@std@@QBA_JXZ +@ thiscall -ret64 -arch=i386 ?gcount@?$basic_istream@DU?$char_traits@D@std@@@std@@QBE_JXZ(ptr) msvcp120.?gcount@?$basic_istream@DU?$char_traits@D@std@@@std@@QBE_JXZ +@ cdecl -arch=win64 ?gcount@?$basic_istream@DU?$char_traits@D@std@@@std@@QEBA_JXZ(ptr) msvcp120.?gcount@?$basic_istream@DU?$char_traits@D@std@@@std@@QEBA_JXZ +@ cdecl -ret64 -arch=arm ?gcount@?$basic_istream@GU?$char_traits@G@std@@@std@@QBA_JXZ(ptr) msvcp120.?gcount@?$basic_istream@GU?$char_traits@G@std@@@std@@QBA_JXZ +@ thiscall -ret64 -arch=i386 ?gcount@?$basic_istream@GU?$char_traits@G@std@@@std@@QBE_JXZ(ptr) msvcp120.?gcount@?$basic_istream@GU?$char_traits@G@std@@@std@@QBE_JXZ +@ cdecl -arch=win64 ?gcount@?$basic_istream@GU?$char_traits@G@std@@@std@@QEBA_JXZ(ptr) msvcp120.?gcount@?$basic_istream@GU?$char_traits@G@std@@@std@@QEBA_JXZ +@ cdecl -ret64 -arch=arm ?gcount@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QBA_JXZ(ptr) msvcp120.?gcount@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QBA_JXZ +@ thiscall -ret64 -arch=i386 ?gcount@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QBE_JXZ(ptr) msvcp120.?gcount@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QBE_JXZ +@ cdecl -arch=win64 ?gcount@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEBA_JXZ(ptr) msvcp120.?gcount@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEBA_JXZ +@ cdecl -arch=arm ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@AAD@Z(ptr ptr) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@AAD@Z +@ thiscall -arch=i386 ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAD@Z(ptr ptr) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAD@Z +@ cdecl -arch=win64 ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAD@Z(ptr ptr) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAD@Z +@ cdecl -arch=arm ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@AAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z(ptr ptr) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@AAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z +@ thiscall -arch=i386 ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z(ptr ptr) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z +@ cdecl -arch=win64 ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z(ptr ptr) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z +@ cdecl -arch=arm ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@AAV?$basic_streambuf@DU?$char_traits@D@std@@@2@D@Z(ptr ptr long) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@AAV?$basic_streambuf@DU?$char_traits@D@std@@@2@D@Z +@ thiscall -arch=i386 ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAV?$basic_streambuf@DU?$char_traits@D@std@@@2@D@Z(ptr ptr long) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAV?$basic_streambuf@DU?$char_traits@D@std@@@2@D@Z +@ cdecl -arch=win64 ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@D@Z(ptr ptr long) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@D@Z +@ cdecl -arch=arm ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@PAD_J@Z(ptr ptr int64) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@PAD_J@Z +@ thiscall -arch=i386 ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PAD_J@Z(ptr ptr int64) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PAD_J@Z +@ cdecl -arch=win64 ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z(ptr ptr long) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z +@ cdecl -arch=arm ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@PAD_JD@Z(ptr ptr int64 long) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@PAD_JD@Z +@ thiscall -arch=i386 ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PAD_JD@Z(ptr ptr int64 long) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PAD_JD@Z +@ cdecl -arch=win64 ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_JD@Z(ptr ptr long long) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_JD@Z +@ cdecl -arch=arm ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAHXZ(ptr) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAHXZ +@ thiscall -arch=i386 ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ(ptr) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ +@ cdecl -arch=win64 ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ(ptr) msvcp120.?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ +@ cdecl -arch=arm ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@AAG@Z(ptr ptr) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@AAG@Z +@ thiscall -arch=i386 ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAG@Z(ptr ptr) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAG@Z +@ cdecl -arch=win64 ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAG@Z(ptr ptr) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAG@Z +@ cdecl -arch=arm ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@AAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z(ptr ptr) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@AAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z +@ thiscall -arch=i386 ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z(ptr ptr) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z +@ cdecl -arch=win64 ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z(ptr ptr) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z +@ cdecl -arch=arm ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@AAV?$basic_streambuf@GU?$char_traits@G@std@@@2@G@Z(ptr ptr long) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@AAV?$basic_streambuf@GU?$char_traits@G@std@@@2@G@Z +@ thiscall -arch=i386 ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAV?$basic_streambuf@GU?$char_traits@G@std@@@2@G@Z(ptr ptr long) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAV?$basic_streambuf@GU?$char_traits@G@std@@@2@G@Z +@ cdecl -arch=win64 ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@G@Z(ptr ptr long) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@G@Z +@ cdecl -arch=arm ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@PAG_J@Z(ptr ptr int64) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@PAG_J@Z +@ thiscall -arch=i386 ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAG_J@Z(ptr ptr int64) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAG_J@Z +@ cdecl -arch=win64 ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z(ptr ptr long) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z +@ cdecl -arch=arm ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@PAG_JG@Z(ptr ptr int64 long) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@PAG_JG@Z +@ thiscall -arch=i386 ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAG_JG@Z(ptr ptr int64 long) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAG_JG@Z +@ cdecl -arch=win64 ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_JG@Z(ptr ptr long long) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_JG@Z +@ cdecl -arch=arm ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAGXZ(ptr) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAGXZ +@ thiscall -arch=i386 ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEGXZ(ptr) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEGXZ +@ cdecl -arch=win64 ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAGXZ(ptr) msvcp120.?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAGXZ +@ cdecl -arch=arm ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@AAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z(ptr ptr) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@AAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z +@ thiscall -arch=i386 ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z(ptr ptr) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z +@ cdecl -arch=win64 ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z(ptr ptr) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z +@ cdecl -arch=arm ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@AAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_W@Z(ptr ptr long) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@AAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_W@Z +@ thiscall -arch=i386 ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_W@Z(ptr ptr long) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_W@Z +@ cdecl -arch=win64 ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_W@Z(ptr ptr long) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_W@Z +@ cdecl -arch=arm ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@AA_W@Z(ptr ptr) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@AA_W@Z +@ thiscall -arch=i386 ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AA_W@Z(ptr ptr) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AA_W@Z +@ cdecl -arch=win64 ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEA_W@Z(ptr ptr) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEA_W@Z +@ cdecl -arch=arm ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@PA_W_J@Z(ptr ptr int64) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@PA_W_J@Z +@ thiscall -arch=i386 ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_W_J@Z(ptr ptr int64) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_W_J@Z +@ cdecl -arch=win64 ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z(ptr ptr long) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z +@ cdecl -arch=arm ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@PA_W_J_W@Z(ptr ptr int64 long) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@PA_W_J_W@Z +@ thiscall -arch=i386 ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_W_J_W@Z(ptr ptr int64 long) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_W_J_W@Z +@ cdecl -arch=win64 ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J_W@Z(ptr ptr long long) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J_W@Z +@ cdecl -arch=arm ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAGXZ(ptr) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAGXZ +@ thiscall -arch=i386 ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEGXZ(ptr) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEGXZ +@ cdecl -arch=win64 ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAGXZ(ptr) msvcp120.?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAGXZ +@ cdecl -arch=arm ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAG@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAG@Z +@ thiscall -arch=i386 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAG@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAG@Z +@ cdecl -arch=win64 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z +@ cdecl -arch=arm ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAI@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAI@Z +@ thiscall -arch=i386 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAI@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAI@Z +@ cdecl -arch=win64 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z +@ cdecl -arch=arm ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z +@ thiscall -arch=i386 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z +@ cdecl -arch=win64 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z +@ cdecl -arch=arm ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAK@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAK@Z +@ thiscall -arch=i386 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAK@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAK@Z +@ cdecl -arch=win64 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z +@ cdecl -arch=arm ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAM@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAM@Z +@ thiscall -arch=i386 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAM@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAM@Z +@ cdecl -arch=win64 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z +@ cdecl -arch=arm ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAN@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAN@Z +@ thiscall -arch=i386 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAN@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAN@Z +@ cdecl -arch=win64 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z +@ cdecl -arch=arm ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAO@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAO@Z +@ thiscall -arch=i386 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAO@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAO@Z +@ cdecl -arch=win64 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z +@ cdecl -arch=arm ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z +@ thiscall -arch=i386 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z +@ cdecl -arch=win64 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z +@ cdecl -arch=arm ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z +@ thiscall -arch=i386 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z +@ cdecl -arch=win64 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z +@ cdecl -arch=arm ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z +@ thiscall -arch=i386 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z +@ cdecl -arch=win64 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z +@ cdecl -arch=arm ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z +@ thiscall -arch=i386 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z +@ cdecl -arch=win64 ?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z +@ cdecl -arch=arm ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAG@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAG@Z +@ thiscall -arch=i386 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAG@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAG@Z +@ cdecl -arch=win64 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z +@ cdecl -arch=arm ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAI@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAI@Z +@ thiscall -arch=i386 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAI@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAI@Z +@ cdecl -arch=win64 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z +@ cdecl -arch=arm ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z +@ thiscall -arch=i386 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z +@ cdecl -arch=win64 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z +@ cdecl -arch=arm ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAK@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAK@Z +@ thiscall -arch=i386 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAK@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAK@Z +@ cdecl -arch=win64 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z +@ cdecl -arch=arm ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAM@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAM@Z +@ thiscall -arch=i386 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAM@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAM@Z +@ cdecl -arch=win64 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z +@ cdecl -arch=arm ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAN@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAN@Z +@ thiscall -arch=i386 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAN@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAN@Z +@ cdecl -arch=win64 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z +@ cdecl -arch=arm ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAO@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAO@Z +@ thiscall -arch=i386 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAO@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAO@Z +@ cdecl -arch=win64 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z +@ cdecl -arch=arm ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z +@ thiscall -arch=i386 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z +@ cdecl -arch=win64 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z +@ cdecl -arch=arm ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z +@ thiscall -arch=i386 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z +@ cdecl -arch=win64 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z +@ cdecl -arch=arm ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z +@ thiscall -arch=i386 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z +@ cdecl -arch=win64 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z +@ cdecl -arch=arm ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z +@ thiscall -arch=i386 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z +@ cdecl -arch=win64 ?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z +@ cdecl -arch=arm ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAG@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAG@Z +@ thiscall -arch=i386 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAG@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAG@Z +@ cdecl -arch=win64 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAG@Z +@ cdecl -arch=arm ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAI@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAI@Z +@ thiscall -arch=i386 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAI@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAI@Z +@ cdecl -arch=win64 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAI@Z +@ cdecl -arch=arm ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z +@ thiscall -arch=i386 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAJ@Z +@ cdecl -arch=win64 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAJ@Z +@ cdecl -arch=arm ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAK@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAK@Z +@ thiscall -arch=i386 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAK@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAK@Z +@ cdecl -arch=win64 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAK@Z +@ cdecl -arch=arm ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAM@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAM@Z +@ thiscall -arch=i386 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAM@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAM@Z +@ cdecl -arch=win64 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAM@Z +@ cdecl -arch=arm ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAN@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAN@Z +@ thiscall -arch=i386 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAN@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAN@Z +@ cdecl -arch=win64 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAN@Z +@ cdecl -arch=arm ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAO@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAO@Z +@ thiscall -arch=i386 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAO@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAO@Z +@ cdecl -arch=win64 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAO@Z +@ cdecl -arch=arm ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z +@ thiscall -arch=i386 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAAPAX@Z +@ cdecl -arch=win64 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEAPEAX@Z +@ cdecl -arch=arm ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z +@ thiscall -arch=i386 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_J@Z +@ cdecl -arch=win64 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_J@Z +@ cdecl -arch=arm ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z +@ thiscall -arch=i386 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_K@Z +@ cdecl -arch=win64 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_K@Z +@ cdecl -arch=arm ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z +@ thiscall -arch=i386 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z(ptr ptr ptr long ptr long ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHAA_N@Z +@ cdecl -arch=win64 ?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z(ptr ptr ptr ptr ptr ptr ptr) msvcp120.?get@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHAEA_N@Z +@ stub -arch=arm ?get@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@DD@Z +@ stub -arch=i386 ?get@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@DD@Z +@ stub -arch=win64 ?get@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@DD@Z +@ stub -arch=arm ?get@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@PBD4@Z +@ stub -arch=i386 ?get@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@PBD4@Z +@ stub -arch=win64 ?get@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@PEBD4@Z +@ stub -arch=arm ?get@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@DD@Z +@ stub -arch=i386 ?get@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@DD@Z +@ stub -arch=win64 ?get@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@DD@Z +@ stub -arch=arm ?get@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@PBG4@Z +@ stub -arch=i386 ?get@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@PBG4@Z +@ stub -arch=win64 ?get@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@PEBG4@Z +@ stub -arch=arm ?get@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@DD@Z +@ stub -arch=i386 ?get@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@DD@Z +@ stub -arch=win64 ?get@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@DD@Z +@ stub -arch=arm ?get@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@PB_W4@Z +@ stub -arch=i386 ?get@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@PB_W4@Z +@ stub -arch=win64 ?get@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@PEB_W4@Z +@ stub -arch=arm ?get_date@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_date@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_date@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?get_date@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_date@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_date@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?get_date@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_date@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_date@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?get_monthname@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_monthname@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_monthname@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?get_monthname@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_monthname@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_monthname@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?get_monthname@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_monthname@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_monthname@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub ?get_new_handler@std@@YAP6AXXZXZ +@ stub -arch=arm ?get_time@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_time@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_time@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?get_time@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_time@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_time@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?get_time@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_time@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_time@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?get_weekday@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_weekday@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_weekday@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?get_weekday@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_weekday@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_weekday@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?get_weekday@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_weekday@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_weekday@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?get_year@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_year@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_year@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?get_year@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_year@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_year@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@GU?$char_traits@G@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ stub -arch=arm ?get_year@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=i386 ?get_year@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AAVios_base@2@AAHPAUtm@@@Z +@ stub -arch=win64 ?get_year@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@0AEAVios_base@2@AEAHPEAUtm@@@Z +@ cdecl -arch=arm ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@PAD_J@Z(ptr ptr int64) msvcp120.?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@PAD_J@Z +@ thiscall -arch=i386 ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PAD_J@Z(ptr ptr int64) msvcp120.?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PAD_J@Z +@ cdecl -arch=win64 ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z(ptr ptr long) msvcp120.?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z +@ cdecl -arch=arm ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@PAD_JD@Z(ptr ptr int64 long) msvcp120.?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@PAD_JD@Z +@ thiscall -arch=i386 ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PAD_JD@Z(ptr ptr int64 long) msvcp120.?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PAD_JD@Z +@ cdecl -arch=win64 ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_JD@Z(ptr ptr long long) msvcp120.?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_JD@Z +@ cdecl -arch=arm ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@PAG_J@Z(ptr ptr int64) msvcp120.?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@PAG_J@Z +@ thiscall -arch=i386 ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAG_J@Z(ptr ptr int64) msvcp120.?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAG_J@Z +@ cdecl -arch=win64 ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z(ptr ptr long) msvcp120.?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z +@ cdecl -arch=arm ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@PAG_JG@Z(ptr ptr int64 long) msvcp120.?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@PAG_JG@Z +@ thiscall -arch=i386 ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAG_JG@Z(ptr ptr int64 long) msvcp120.?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAG_JG@Z +@ cdecl -arch=win64 ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_JG@Z(ptr ptr long long) msvcp120.?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_JG@Z +@ cdecl -arch=arm ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@PA_W_J@Z(ptr ptr int64) msvcp120.?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@PA_W_J@Z +@ thiscall -arch=i386 ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_W_J@Z(ptr ptr int64) msvcp120.?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_W_J@Z +@ cdecl -arch=win64 ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z(ptr ptr long) msvcp120.?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z +@ cdecl -arch=arm ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@PA_W_J_W@Z(ptr ptr int64 long) msvcp120.?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@PA_W_J_W@Z +@ thiscall -arch=i386 ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_W_J_W@Z(ptr ptr int64 long) msvcp120.?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_W_J_W@Z +@ cdecl -arch=win64 ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J_W@Z(ptr ptr long long) msvcp120.?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J_W@Z +@ cdecl -arch=arm ?getloc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QBA?AVlocale@2@XZ(ptr ptr) msvcp120.?getloc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QBA?AVlocale@2@XZ +@ thiscall -arch=i386 ?getloc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QBE?AVlocale@2@XZ(ptr ptr) msvcp120.?getloc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QBE?AVlocale@2@XZ +@ cdecl -arch=win64 ?getloc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEBA?AVlocale@2@XZ(ptr ptr) msvcp120.?getloc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEBA?AVlocale@2@XZ +@ cdecl -arch=arm ?getloc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QBA?AVlocale@2@XZ(ptr ptr) msvcp120.?getloc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QBA?AVlocale@2@XZ +@ thiscall -arch=i386 ?getloc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QBE?AVlocale@2@XZ(ptr ptr) msvcp120.?getloc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QBE?AVlocale@2@XZ +@ cdecl -arch=win64 ?getloc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEBA?AVlocale@2@XZ(ptr ptr) msvcp120.?getloc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEBA?AVlocale@2@XZ +@ cdecl -arch=arm ?getloc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QBA?AVlocale@2@XZ(ptr ptr) msvcp120.?getloc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QBA?AVlocale@2@XZ +@ thiscall -arch=i386 ?getloc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QBE?AVlocale@2@XZ(ptr ptr) msvcp120.?getloc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QBE?AVlocale@2@XZ +@ cdecl -arch=win64 ?getloc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEBA?AVlocale@2@XZ(ptr ptr) msvcp120.?getloc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEBA?AVlocale@2@XZ +@ cdecl -arch=arm ?getloc@ios_base@std@@QBA?AVlocale@2@XZ(ptr ptr) msvcp120.?getloc@ios_base@std@@QBA?AVlocale@2@XZ +@ thiscall -arch=i386 ?getloc@ios_base@std@@QBE?AVlocale@2@XZ(ptr ptr) msvcp120.?getloc@ios_base@std@@QBE?AVlocale@2@XZ +@ cdecl -arch=win64 ?getloc@ios_base@std@@QEBA?AVlocale@2@XZ(ptr ptr) msvcp120.?getloc@ios_base@std@@QEBA?AVlocale@2@XZ +@ cdecl -arch=win32 ?global@locale@std@@SA?AV12@ABV12@@Z(ptr ptr) msvcp120.?global@locale@std@@SA?AV12@ABV12@@Z +@ cdecl -arch=win64 ?global@locale@std@@SA?AV12@AEBV12@@Z(ptr ptr) msvcp120.?global@locale@std@@SA?AV12@AEBV12@@Z +@ cdecl -arch=arm ?good@ios_base@std@@QBA_NXZ(ptr) msvcp120.?good@ios_base@std@@QBA_NXZ +@ thiscall -arch=i386 ?good@ios_base@std@@QBE_NXZ(ptr) msvcp120.?good@ios_base@std@@QBE_NXZ +@ cdecl -arch=win64 ?good@ios_base@std@@QEBA_NXZ(ptr) msvcp120.?good@ios_base@std@@QEBA_NXZ +@ cdecl -arch=arm ?gptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBAPADXZ(ptr) msvcp120.?gptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBAPADXZ +@ thiscall -arch=i386 ?gptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ(ptr) msvcp120.?gptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ +@ cdecl -arch=win64 ?gptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ(ptr) msvcp120.?gptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ +@ cdecl -arch=arm ?gptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBAPAGXZ(ptr) msvcp120.?gptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBAPAGXZ +@ thiscall -arch=i386 ?gptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ(ptr) msvcp120.?gptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ +@ cdecl -arch=win64 ?gptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ(ptr) msvcp120.?gptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ +@ cdecl -arch=arm ?gptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBAPA_WXZ(ptr) msvcp120.?gptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBAPA_WXZ +@ thiscall -arch=i386 ?gptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ(ptr) msvcp120.?gptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ +@ cdecl -arch=win64 ?gptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ(ptr) msvcp120.?gptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ +@ extern ?id@?$codecvt@DDH@std@@2V0locale@2@A msvcp120.?id@?$codecvt@DDH@std@@2V0locale@2@A +@ extern ?id@?$codecvt@GDH@std@@2V0locale@2@A msvcp120.?id@?$codecvt@GDH@std@@2V0locale@2@A +@ extern ?id@?$codecvt@_WDH@std@@2V0locale@2@A msvcp120.?id@?$codecvt@_WDH@std@@2V0locale@2@A +@ extern ?id@?$collate@D@std@@2V0locale@2@A msvcp120.?id@?$collate@D@std@@2V0locale@2@A +@ extern ?id@?$collate@G@std@@2V0locale@2@A msvcp120.?id@?$collate@G@std@@2V0locale@2@A +@ extern ?id@?$collate@_W@std@@2V0locale@2@A msvcp120.?id@?$collate@_W@std@@2V0locale@2@A +@ extern ?id@?$ctype@D@std@@2V0locale@2@A msvcp120.?id@?$ctype@D@std@@2V0locale@2@A +@ extern ?id@?$ctype@G@std@@2V0locale@2@A msvcp120.?id@?$ctype@G@std@@2V0locale@2@A +@ extern ?id@?$ctype@_W@std@@2V0locale@2@A msvcp120.?id@?$ctype@_W@std@@2V0locale@2@A +# extern ?id@?$messages@D@std@@2V0locale@2@A +# extern ?id@?$messages@G@std@@2V0locale@2@A +# extern ?id@?$messages@_W@std@@2V0locale@2@A +# extern ?id@?$money_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A +# extern ?id@?$money_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A +# extern ?id@?$money_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A +# extern ?id@?$money_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A +# extern ?id@?$money_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A +# extern ?id@?$money_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A +# extern ?id@?$moneypunct@D$00@std@@2V0locale@2@A +# extern ?id@?$moneypunct@D$0A@@std@@2V0locale@2@A +# extern ?id@?$moneypunct@G$00@std@@2V0locale@2@A +# extern ?id@?$moneypunct@G$0A@@std@@2V0locale@2@A +# extern ?id@?$moneypunct@_W$00@std@@2V0locale@2@A +# extern ?id@?$moneypunct@_W$0A@@std@@2V0locale@2@A +@ extern ?id@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A msvcp120.?id@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A +@ extern ?id@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A msvcp120.?id@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A +@ extern ?id@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A msvcp120.?id@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A +@ extern ?id@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A msvcp120.?id@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A +@ extern ?id@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A msvcp120.?id@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A +@ extern ?id@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A msvcp120.?id@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A +@ extern ?id@?$numpunct@D@std@@2V0locale@2@A msvcp120.?id@?$numpunct@D@std@@2V0locale@2@A +@ extern ?id@?$numpunct@G@std@@2V0locale@2@A msvcp120.?id@?$numpunct@G@std@@2V0locale@2@A +@ extern ?id@?$numpunct@_W@std@@2V0locale@2@A msvcp120.?id@?$numpunct@_W@std@@2V0locale@2@A +# extern ?id@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A +# extern ?id@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A +# extern ?id@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A +@ extern ?id@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A msvcp120.?id@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A +@ extern ?id@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A msvcp120.?id@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A +@ extern ?id@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A msvcp120.?id@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A +@ cdecl -arch=arm ?ignore@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@_JH@Z(ptr int64 long) msvcp120.?ignore@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@_JH@Z +@ thiscall -arch=i386 ?ignore@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@_JH@Z(ptr int64 long) msvcp120.?ignore@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@_JH@Z +@ cdecl -arch=win64 ?ignore@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z(ptr long long) msvcp120.?ignore@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z +@ cdecl -arch=arm ?ignore@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@_JG@Z(ptr int64 long) msvcp120.?ignore@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@_JG@Z +@ thiscall -arch=i386 ?ignore@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@_JG@Z(ptr int64 long) msvcp120.?ignore@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@_JG@Z +@ cdecl -arch=win64 ?ignore@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JG@Z(ptr long long) msvcp120.?ignore@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JG@Z +@ cdecl -arch=arm ?ignore@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@_JG@Z(ptr int64 long) msvcp120.?ignore@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@_JG@Z +@ thiscall -arch=i386 ?ignore@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_JG@Z(ptr int64 long) msvcp120.?ignore@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_JG@Z +@ cdecl -arch=win64 ?ignore@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JG@Z(ptr long long) msvcp120.?ignore@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JG@Z +@ cdecl -arch=arm ?imbue@?$basic_ios@DU?$char_traits@D@std@@@std@@QAA?AVlocale@2@ABV32@@Z(ptr ptr ptr) msvcp120.?imbue@?$basic_ios@DU?$char_traits@D@std@@@std@@QAA?AVlocale@2@ABV32@@Z +@ thiscall -arch=i386 ?imbue@?$basic_ios@DU?$char_traits@D@std@@@std@@QAE?AVlocale@2@ABV32@@Z(ptr ptr ptr) msvcp120.?imbue@?$basic_ios@DU?$char_traits@D@std@@@std@@QAE?AVlocale@2@ABV32@@Z +@ cdecl -arch=win64 ?imbue@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z(ptr ptr ptr) msvcp120.?imbue@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z +@ cdecl -arch=arm ?imbue@?$basic_ios@GU?$char_traits@G@std@@@std@@QAA?AVlocale@2@ABV32@@Z(ptr ptr ptr) msvcp120.?imbue@?$basic_ios@GU?$char_traits@G@std@@@std@@QAA?AVlocale@2@ABV32@@Z +@ thiscall -arch=i386 ?imbue@?$basic_ios@GU?$char_traits@G@std@@@std@@QAE?AVlocale@2@ABV32@@Z(ptr ptr ptr) msvcp120.?imbue@?$basic_ios@GU?$char_traits@G@std@@@std@@QAE?AVlocale@2@ABV32@@Z +@ cdecl -arch=win64 ?imbue@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z(ptr ptr ptr) msvcp120.?imbue@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z +@ cdecl -arch=arm ?imbue@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAA?AVlocale@2@ABV32@@Z(ptr ptr ptr) msvcp120.?imbue@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAA?AVlocale@2@ABV32@@Z +@ thiscall -arch=i386 ?imbue@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE?AVlocale@2@ABV32@@Z(ptr ptr ptr) msvcp120.?imbue@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE?AVlocale@2@ABV32@@Z +@ cdecl -arch=win64 ?imbue@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z(ptr ptr ptr) msvcp120.?imbue@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z +@ cdecl -arch=arm ?imbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAAXABVlocale@2@@Z(ptr ptr) msvcp120.?imbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAAXABVlocale@2@@Z +@ thiscall -arch=i386 ?imbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEXABVlocale@2@@Z(ptr ptr) msvcp120.?imbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEXABVlocale@2@@Z +@ cdecl -arch=win64 ?imbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAXAEBVlocale@2@@Z(ptr ptr) msvcp120.?imbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAXAEBVlocale@2@@Z +@ cdecl -arch=arm ?imbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAAXABVlocale@2@@Z(ptr ptr) msvcp120.?imbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAAXABVlocale@2@@Z +@ thiscall -arch=i386 ?imbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEXABVlocale@2@@Z(ptr ptr) msvcp120.?imbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEXABVlocale@2@@Z +@ cdecl -arch=win64 ?imbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAXAEBVlocale@2@@Z(ptr ptr) msvcp120.?imbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAXAEBVlocale@2@@Z +@ cdecl -arch=arm ?imbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAAXABVlocale@2@@Z(ptr ptr) msvcp120.?imbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAAXABVlocale@2@@Z +@ thiscall -arch=i386 ?imbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEXABVlocale@2@@Z(ptr ptr) msvcp120.?imbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEXABVlocale@2@@Z +@ cdecl -arch=win64 ?imbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAXAEBVlocale@2@@Z(ptr ptr) msvcp120.?imbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAXAEBVlocale@2@@Z +@ cdecl -arch=arm ?imbue@ios_base@std@@QAA?AVlocale@2@ABV32@@Z(ptr ptr ptr) msvcp120.?imbue@ios_base@std@@QAA?AVlocale@2@ABV32@@Z +@ thiscall -arch=i386 ?imbue@ios_base@std@@QAE?AVlocale@2@ABV32@@Z(ptr ptr ptr) msvcp120.?imbue@ios_base@std@@QAE?AVlocale@2@ABV32@@Z +@ cdecl -arch=win64 ?imbue@ios_base@std@@QEAA?AVlocale@2@AEBV32@@Z(ptr ptr ptr) msvcp120.?imbue@ios_base@std@@QEAA?AVlocale@2@AEBV32@@Z +@ cdecl -arch=arm ?in@?$codecvt@DDH@std@@QBAHAAHPBD1AAPBDPAD3AAPAD@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?in@?$codecvt@DDH@std@@QBAHAAHPBD1AAPBDPAD3AAPAD@Z +@ thiscall -arch=i386 ?in@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?in@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z +@ cdecl -arch=win64 ?in@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?in@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z +@ cdecl -arch=arm ?in@?$codecvt@GDH@std@@QBAHAAHPBD1AAPBDPAG3AAPAG@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?in@?$codecvt@GDH@std@@QBAHAAHPBD1AAPBDPAG3AAPAG@Z +@ thiscall -arch=i386 ?in@?$codecvt@GDH@std@@QBEHAAHPBD1AAPBDPAG3AAPAG@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?in@?$codecvt@GDH@std@@QBEHAAHPBD1AAPBDPAG3AAPAG@Z +@ cdecl -arch=win64 ?in@?$codecvt@GDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?in@?$codecvt@GDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAG3AEAPEAG@Z +@ cdecl -arch=arm ?in@?$codecvt@_WDH@std@@QBAHAAHPBD1AAPBDPA_W3AAPA_W@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?in@?$codecvt@_WDH@std@@QBAHAAHPBD1AAPBDPA_W3AAPA_W@Z +@ thiscall -arch=i386 ?in@?$codecvt@_WDH@std@@QBEHAAHPBD1AAPBDPA_W3AAPA_W@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?in@?$codecvt@_WDH@std@@QBEHAAHPBD1AAPBDPA_W3AAPA_W@Z +@ cdecl -arch=win64 ?in@?$codecvt@_WDH@std@@QEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?in@?$codecvt@_WDH@std@@QEBAHAEAHPEBD1AEAPEBDPEA_W3AEAPEA_W@Z +@ cdecl -ret64 -arch=arm ?in_avail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA_JXZ(ptr) msvcp120.?in_avail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA_JXZ +@ thiscall -ret64 -arch=i386 ?in_avail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE_JXZ(ptr) msvcp120.?in_avail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE_JXZ +@ cdecl -arch=win64 ?in_avail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JXZ(ptr) msvcp120.?in_avail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JXZ +@ cdecl -ret64 -arch=arm ?in_avail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA_JXZ(ptr) msvcp120.?in_avail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA_JXZ +@ thiscall -ret64 -arch=i386 ?in_avail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE_JXZ(ptr) msvcp120.?in_avail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE_JXZ +@ cdecl -arch=win64 ?in_avail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA_JXZ(ptr) msvcp120.?in_avail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA_JXZ +@ cdecl -ret64 -arch=arm ?in_avail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA_JXZ(ptr) msvcp120.?in_avail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA_JXZ +@ thiscall -ret64 -arch=i386 ?in_avail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE_JXZ(ptr) msvcp120.?in_avail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE_JXZ +@ cdecl -arch=win64 ?in_avail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JXZ(ptr) msvcp120.?in_avail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JXZ +@ cdecl -arch=arm ?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IAAXPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z(ptr ptr long) msvcp120.?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IAAXPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z +@ thiscall -arch=i386 ?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IAEXPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z(ptr ptr long) msvcp120.?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IAEXPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z +@ cdecl -arch=win64 ?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IEAAXPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z(ptr ptr long) msvcp120.?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IEAAXPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z +@ cdecl -arch=arm ?init@?$basic_ios@GU?$char_traits@G@std@@@std@@IAAXPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@_N@Z(ptr ptr long) msvcp120.?init@?$basic_ios@GU?$char_traits@G@std@@@std@@IAAXPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@_N@Z +@ thiscall -arch=i386 ?init@?$basic_ios@GU?$char_traits@G@std@@@std@@IAEXPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@_N@Z(ptr ptr long) msvcp120.?init@?$basic_ios@GU?$char_traits@G@std@@@std@@IAEXPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@_N@Z +@ cdecl -arch=win64 ?init@?$basic_ios@GU?$char_traits@G@std@@@std@@IEAAXPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@_N@Z(ptr ptr long) msvcp120.?init@?$basic_ios@GU?$char_traits@G@std@@@std@@IEAAXPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@_N@Z +@ cdecl -arch=arm ?init@?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAAXPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_N@Z(ptr ptr long) msvcp120.?init@?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAAXPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_N@Z +@ thiscall -arch=i386 ?init@?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAEXPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_N@Z(ptr ptr long) msvcp120.?init@?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAEXPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_N@Z +@ cdecl -arch=win64 ?init@?$basic_ios@_WU?$char_traits@_W@std@@@std@@IEAAXPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_N@Z(ptr ptr long) msvcp120.?init@?$basic_ios@_WU?$char_traits@_W@std@@@std@@IEAAXPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_N@Z +# extern ?intl@?$moneypunct@D$00@std@@2_NB +# extern ?intl@?$moneypunct@D$0A@@std@@2_NB +# extern ?intl@?$moneypunct@G$00@std@@2_NB +# extern ?intl@?$moneypunct@G$0A@@std@@2_NB +# extern ?intl@?$moneypunct@_W$00@std@@2_NB +# extern ?intl@?$moneypunct@_W$0A@@std@@2_NB +@ cdecl -arch=arm ?ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAA_N_N@Z(ptr long) msvcp120.?ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAA_N_N@Z +@ thiscall -arch=i386 ?ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE_N_N@Z(ptr long) msvcp120.?ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE_N_N@Z +@ cdecl -arch=win64 ?ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_N_N@Z(ptr long) msvcp120.?ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_N_N@Z +@ cdecl -arch=arm ?ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAA_N_N@Z(ptr long) msvcp120.?ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAA_N_N@Z +@ thiscall -arch=i386 ?ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE_N_N@Z(ptr long) msvcp120.?ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE_N_N@Z +@ cdecl -arch=win64 ?ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_N_N@Z(ptr long) msvcp120.?ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_N_N@Z +@ cdecl -arch=arm ?ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAA_N_N@Z(ptr long) msvcp120.?ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAA_N_N@Z +@ thiscall -arch=i386 ?ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE_N_N@Z(ptr long) msvcp120.?ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE_N_N@Z +@ cdecl -arch=win64 ?ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_N_N@Z(ptr long) msvcp120.?ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_N_N@Z +@ cdecl -arch=arm ?is@?$ctype@D@std@@QBAPBDPBD0PAF@Z(ptr ptr ptr ptr) msvcp120.?is@?$ctype@D@std@@QBAPBDPBD0PAF@Z +@ thiscall -arch=i386 ?is@?$ctype@D@std@@QBEPBDPBD0PAF@Z(ptr ptr ptr ptr) msvcp120.?is@?$ctype@D@std@@QBEPBDPBD0PAF@Z +@ cdecl -arch=win64 ?is@?$ctype@D@std@@QEBAPEBDPEBD0PEAF@Z(ptr ptr ptr ptr) msvcp120.?is@?$ctype@D@std@@QEBAPEBDPEBD0PEAF@Z +@ cdecl -arch=arm ?is@?$ctype@D@std@@QBA_NFD@Z(ptr long long) msvcp120.?is@?$ctype@D@std@@QBA_NFD@Z +@ thiscall -arch=i386 ?is@?$ctype@D@std@@QBE_NFD@Z(ptr long long) msvcp120.?is@?$ctype@D@std@@QBE_NFD@Z +@ cdecl -arch=win64 ?is@?$ctype@D@std@@QEBA_NFD@Z(ptr long long) msvcp120.?is@?$ctype@D@std@@QEBA_NFD@Z +@ cdecl -arch=arm ?is@?$ctype@G@std@@QBAPBGPBG0PAF@Z(ptr ptr ptr ptr) msvcp120.?is@?$ctype@G@std@@QBAPBGPBG0PAF@Z +@ thiscall -arch=i386 ?is@?$ctype@G@std@@QBEPBGPBG0PAF@Z(ptr ptr ptr ptr) msvcp120.?is@?$ctype@G@std@@QBEPBGPBG0PAF@Z +@ cdecl -arch=win64 ?is@?$ctype@G@std@@QEBAPEBGPEBG0PEAF@Z(ptr ptr ptr ptr) msvcp120.?is@?$ctype@G@std@@QEBAPEBGPEBG0PEAF@Z +@ cdecl -arch=arm ?is@?$ctype@G@std@@QBA_NFG@Z(ptr long long) msvcp120.?is@?$ctype@G@std@@QBA_NFG@Z +@ thiscall -arch=i386 ?is@?$ctype@G@std@@QBE_NFG@Z(ptr long long) msvcp120.?is@?$ctype@G@std@@QBE_NFG@Z +@ cdecl -arch=win64 ?is@?$ctype@G@std@@QEBA_NFG@Z(ptr long long) msvcp120.?is@?$ctype@G@std@@QEBA_NFG@Z +@ cdecl -arch=arm ?is@?$ctype@_W@std@@QBAPB_WPB_W0PAF@Z(ptr ptr ptr ptr) msvcp120.?is@?$ctype@_W@std@@QBAPB_WPB_W0PAF@Z +@ thiscall -arch=i386 ?is@?$ctype@_W@std@@QBEPB_WPB_W0PAF@Z(ptr ptr ptr ptr) msvcp120.?is@?$ctype@_W@std@@QBEPB_WPB_W0PAF@Z +@ cdecl -arch=win64 ?is@?$ctype@_W@std@@QEBAPEB_WPEB_W0PEAF@Z(ptr ptr ptr ptr) msvcp120.?is@?$ctype@_W@std@@QEBAPEB_WPEB_W0PEAF@Z +@ cdecl -arch=arm ?is@?$ctype@_W@std@@QBA_NF_W@Z(ptr long long) msvcp120.?is@?$ctype@_W@std@@QBA_NF_W@Z +@ thiscall -arch=i386 ?is@?$ctype@_W@std@@QBE_NF_W@Z(ptr long long) msvcp120.?is@?$ctype@_W@std@@QBE_NF_W@Z +@ cdecl -arch=win64 ?is@?$ctype@_W@std@@QEBA_NF_W@Z(ptr long long) msvcp120.?is@?$ctype@_W@std@@QEBA_NF_W@Z +@ stub ?is_current_task_group_canceling@Concurrency@@YA_NXZ +@ cdecl -arch=arm ?isfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAXXZ(ptr) msvcp120.?isfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ?isfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEXXZ(ptr) msvcp120.?isfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ?isfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAXXZ(ptr) msvcp120.?isfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ?isfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAXXZ(ptr) msvcp120.?isfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ?isfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEXXZ(ptr) msvcp120.?isfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ?isfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAXXZ(ptr) msvcp120.?isfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ?isfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAXXZ(ptr) msvcp120.?isfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ?isfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEXXZ(ptr) msvcp120.?isfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ?isfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ(ptr) msvcp120.?isfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ?iword@ios_base@std@@QAAAAJH@Z(ptr long) msvcp120.?iword@ios_base@std@@QAAAAJH@Z +@ thiscall -arch=i386 ?iword@ios_base@std@@QAEAAJH@Z(ptr long) msvcp120.?iword@ios_base@std@@QAEAAJH@Z +@ cdecl -arch=win64 ?iword@ios_base@std@@QEAAAEAJH@Z(ptr long) msvcp120.?iword@ios_base@std@@QEAAAEAJH@Z +@ cdecl -arch=arm ?length@?$codecvt@DDH@std@@QBAHAAHPBD1I@Z(ptr ptr str str long) msvcp120.?length@?$codecvt@DDH@std@@QBAHAAHPBD1I@Z +@ thiscall -arch=i386 ?length@?$codecvt@DDH@std@@QBEHAAHPBD1I@Z(ptr ptr str str long) msvcp120.?length@?$codecvt@DDH@std@@QBEHAAHPBD1I@Z +@ cdecl -arch=win64 ?length@?$codecvt@DDH@std@@QEBAHAEAHPEBD1_K@Z(ptr ptr str str long) msvcp120.?length@?$codecvt@DDH@std@@QEBAHAEAHPEBD1_K@Z +@ cdecl -arch=arm ?length@?$codecvt@GDH@std@@QBAHAAHPBD1I@Z(ptr ptr str str long) msvcp120.?length@?$codecvt@GDH@std@@QBAHAAHPBD1I@Z +@ thiscall -arch=i386 ?length@?$codecvt@GDH@std@@QBEHAAHPBD1I@Z(ptr ptr str str long) msvcp120.?length@?$codecvt@GDH@std@@QBEHAAHPBD1I@Z +@ cdecl -arch=win64 ?length@?$codecvt@GDH@std@@QEBAHAEAHPEBD1_K@Z(ptr ptr str str long) msvcp120.?length@?$codecvt@GDH@std@@QEBAHAEAHPEBD1_K@Z +@ cdecl -arch=arm ?length@?$codecvt@_WDH@std@@QBAHAAHPBD1I@Z(ptr ptr str str long) msvcp120.?length@?$codecvt@_WDH@std@@QBAHAAHPBD1I@Z +@ thiscall -arch=i386 ?length@?$codecvt@_WDH@std@@QBEHAAHPBD1I@Z(ptr ptr str str long) msvcp120.?length@?$codecvt@_WDH@std@@QBEHAAHPBD1I@Z +@ cdecl -arch=win64 ?length@?$codecvt@_WDH@std@@QEBAHAEAHPEBD1_K@Z(ptr ptr str str long) msvcp120.?length@?$codecvt@_WDH@std@@QEBAHAEAHPEBD1_K@Z +@ cdecl -arch=arm ?max_length@codecvt_base@std@@QBAHXZ(ptr) msvcp120.?max_length@codecvt_base@std@@QBAHXZ +@ thiscall -arch=i386 ?max_length@codecvt_base@std@@QBEHXZ(ptr) msvcp120.?max_length@codecvt_base@std@@QBEHXZ +@ cdecl -arch=win64 ?max_length@codecvt_base@std@@QEBAHXZ(ptr) msvcp120.?max_length@codecvt_base@std@@QEBAHXZ +@ stub -arch=arm ?move@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAX$$QAV12@@Z +@ stub -arch=i386 ?move@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEX$$QAV12@@Z +@ stub -arch=win64 ?move@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAX$$QEAV12@@Z +@ stub -arch=arm ?move@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAXAAV12@@Z +@ stub -arch=i386 ?move@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXAAV12@@Z +@ stub -arch=win64 ?move@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXAEAV12@@Z +@ stub -arch=arm ?move@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAX$$QAV12@@Z +@ stub -arch=i386 ?move@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEX$$QAV12@@Z +@ stub -arch=win64 ?move@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAX$$QEAV12@@Z +@ stub -arch=arm ?move@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAXAAV12@@Z +@ stub -arch=i386 ?move@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXAAV12@@Z +@ stub -arch=win64 ?move@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXAEAV12@@Z +@ stub -arch=arm ?move@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAX$$QAV12@@Z +@ stub -arch=i386 ?move@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEX$$QAV12@@Z +@ stub -arch=win64 ?move@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAX$$QEAV12@@Z +@ stub -arch=arm ?move@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAXAAV12@@Z +@ stub -arch=i386 ?move@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXAAV12@@Z +@ stub -arch=win64 ?move@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXAEAV12@@Z +@ cdecl -arch=arm ?narrow@?$basic_ios@DU?$char_traits@D@std@@@std@@QBADDD@Z(ptr long long) msvcp120.?narrow@?$basic_ios@DU?$char_traits@D@std@@@std@@QBADDD@Z +@ thiscall -arch=i386 ?narrow@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDDD@Z(ptr long long) msvcp120.?narrow@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDDD@Z +@ cdecl -arch=win64 ?narrow@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADDD@Z(ptr long long) msvcp120.?narrow@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADDD@Z +@ cdecl -arch=arm ?narrow@?$basic_ios@GU?$char_traits@G@std@@@std@@QBADGD@Z(ptr long long) msvcp120.?narrow@?$basic_ios@GU?$char_traits@G@std@@@std@@QBADGD@Z +@ thiscall -arch=i386 ?narrow@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEDGD@Z(ptr long long) msvcp120.?narrow@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEDGD@Z +@ cdecl -arch=win64 ?narrow@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBADGD@Z(ptr long long) msvcp120.?narrow@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBADGD@Z +@ cdecl -arch=arm ?narrow@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBAD_WD@Z(ptr long long) msvcp120.?narrow@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBAD_WD@Z +@ thiscall -arch=i386 ?narrow@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBED_WD@Z(ptr long long) msvcp120.?narrow@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBED_WD@Z +@ cdecl -arch=win64 ?narrow@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAD_WD@Z(ptr long long) msvcp120.?narrow@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAD_WD@Z +@ cdecl -arch=arm ?narrow@?$ctype@D@std@@QBADDD@Z(ptr long long) msvcp120.?narrow@?$ctype@D@std@@QBADDD@Z +@ thiscall -arch=i386 ?narrow@?$ctype@D@std@@QBEDDD@Z(ptr long long) msvcp120.?narrow@?$ctype@D@std@@QBEDDD@Z +@ cdecl -arch=win64 ?narrow@?$ctype@D@std@@QEBADDD@Z(ptr long long) msvcp120.?narrow@?$ctype@D@std@@QEBADDD@Z +@ cdecl -arch=arm ?narrow@?$ctype@D@std@@QBAPBDPBD0DPAD@Z(ptr ptr ptr long ptr) msvcp120.?narrow@?$ctype@D@std@@QBAPBDPBD0DPAD@Z +@ thiscall -arch=i386 ?narrow@?$ctype@D@std@@QBEPBDPBD0DPAD@Z(ptr ptr ptr long ptr) msvcp120.?narrow@?$ctype@D@std@@QBEPBDPBD0DPAD@Z +@ cdecl -arch=win64 ?narrow@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD@Z(ptr ptr ptr long ptr) msvcp120.?narrow@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD@Z +@ cdecl -arch=arm ?narrow@?$ctype@G@std@@QBADGD@Z(ptr long long) msvcp120.?narrow@?$ctype@G@std@@QBADGD@Z +@ thiscall -arch=i386 ?narrow@?$ctype@G@std@@QBEDGD@Z(ptr long long) msvcp120.?narrow@?$ctype@G@std@@QBEDGD@Z +@ cdecl -arch=win64 ?narrow@?$ctype@G@std@@QEBADGD@Z(ptr long long) msvcp120.?narrow@?$ctype@G@std@@QEBADGD@Z +@ cdecl -arch=arm ?narrow@?$ctype@G@std@@QBAPBGPBG0DPAD@Z(ptr ptr ptr long ptr) msvcp120.?narrow@?$ctype@G@std@@QBAPBGPBG0DPAD@Z +@ thiscall -arch=i386 ?narrow@?$ctype@G@std@@QBEPBGPBG0DPAD@Z(ptr ptr ptr long ptr) msvcp120.?narrow@?$ctype@G@std@@QBEPBGPBG0DPAD@Z +@ cdecl -arch=win64 ?narrow@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD@Z(ptr ptr ptr long ptr) msvcp120.?narrow@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD@Z +@ cdecl -arch=arm ?narrow@?$ctype@_W@std@@QBAD_WD@Z(ptr long long) msvcp120.?narrow@?$ctype@_W@std@@QBAD_WD@Z +@ thiscall -arch=i386 ?narrow@?$ctype@_W@std@@QBED_WD@Z(ptr long long) msvcp120.?narrow@?$ctype@_W@std@@QBED_WD@Z +@ cdecl -arch=win64 ?narrow@?$ctype@_W@std@@QEBAD_WD@Z(ptr long long) msvcp120.?narrow@?$ctype@_W@std@@QEBAD_WD@Z +@ cdecl -arch=arm ?narrow@?$ctype@_W@std@@QBAPB_WPB_W0DPAD@Z(ptr ptr ptr long ptr) msvcp120.?narrow@?$ctype@_W@std@@QBAPB_WPB_W0DPAD@Z +@ thiscall -arch=i386 ?narrow@?$ctype@_W@std@@QBEPB_WPB_W0DPAD@Z(ptr ptr ptr long ptr) msvcp120.?narrow@?$ctype@_W@std@@QBEPB_WPB_W0DPAD@Z +@ cdecl -arch=win64 ?narrow@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD@Z(ptr ptr ptr long ptr) msvcp120.?narrow@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD@Z +@ cdecl -arch=arm ?opfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAA_NXZ(ptr) msvcp120.?opfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAA_NXZ +@ thiscall -arch=i386 ?opfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE_NXZ(ptr) msvcp120.?opfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE_NXZ +@ cdecl -arch=win64 ?opfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA_NXZ(ptr) msvcp120.?opfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA_NXZ +@ cdecl -arch=arm ?opfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAA_NXZ(ptr) msvcp120.?opfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAA_NXZ +@ thiscall -arch=i386 ?opfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE_NXZ(ptr) msvcp120.?opfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE_NXZ +@ cdecl -arch=win64 ?opfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA_NXZ(ptr) msvcp120.?opfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA_NXZ +@ cdecl -arch=arm ?opfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAA_NXZ(ptr) msvcp120.?opfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAA_NXZ +@ thiscall -arch=i386 ?opfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE_NXZ(ptr) msvcp120.?opfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE_NXZ +@ cdecl -arch=win64 ?opfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA_NXZ(ptr) msvcp120.?opfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA_NXZ +@ cdecl -arch=arm ?osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAXXZ(ptr) msvcp120.?osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ?osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ(ptr) msvcp120.?osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ?osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ(ptr) msvcp120.?osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ?osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAXXZ(ptr) msvcp120.?osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ?osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ(ptr) msvcp120.?osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ?osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ(ptr) msvcp120.?osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ?osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAXXZ(ptr) msvcp120.?osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ?osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ(ptr) msvcp120.?osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ?osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ(ptr) msvcp120.?osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ?out@?$codecvt@DDH@std@@QBAHAAHPBD1AAPBDPAD3AAPAD@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?out@?$codecvt@DDH@std@@QBAHAAHPBD1AAPBDPAD3AAPAD@Z +@ thiscall -arch=i386 ?out@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?out@?$codecvt@DDH@std@@QBEHAAHPBD1AAPBDPAD3AAPAD@Z +@ cdecl -arch=win64 ?out@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z(ptr ptr str str ptr ptr ptr ptr) msvcp120.?out@?$codecvt@DDH@std@@QEBAHAEAHPEBD1AEAPEBDPEAD3AEAPEAD@Z +@ cdecl -arch=arm ?out@?$codecvt@GDH@std@@QBAHAAHPBG1AAPBGPAD3AAPAD@Z(ptr ptr ptr ptr ptr ptr ptr ptr) msvcp120.?out@?$codecvt@GDH@std@@QBAHAAHPBG1AAPBGPAD3AAPAD@Z +@ thiscall -arch=i386 ?out@?$codecvt@GDH@std@@QBEHAAHPBG1AAPBGPAD3AAPAD@Z(ptr ptr ptr ptr ptr ptr ptr ptr) msvcp120.?out@?$codecvt@GDH@std@@QBEHAAHPBG1AAPBGPAD3AAPAD@Z +@ cdecl -arch=win64 ?out@?$codecvt@GDH@std@@QEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z(ptr ptr ptr ptr ptr ptr ptr ptr) msvcp120.?out@?$codecvt@GDH@std@@QEBAHAEAHPEBG1AEAPEBGPEAD3AEAPEAD@Z +@ cdecl -arch=arm ?out@?$codecvt@_WDH@std@@QBAHAAHPB_W1AAPB_WPAD3AAPAD@Z(ptr ptr wstr wstr ptr ptr ptr ptr) msvcp120.?out@?$codecvt@_WDH@std@@QBAHAAHPB_W1AAPB_WPAD3AAPAD@Z +@ thiscall -arch=i386 ?out@?$codecvt@_WDH@std@@QBEHAAHPB_W1AAPB_WPAD3AAPAD@Z(ptr ptr wstr wstr ptr ptr ptr ptr) msvcp120.?out@?$codecvt@_WDH@std@@QBEHAAHPB_W1AAPB_WPAD3AAPAD@Z +@ cdecl -arch=win64 ?out@?$codecvt@_WDH@std@@QEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z(ptr ptr wstr wstr ptr ptr ptr ptr) msvcp120.?out@?$codecvt@_WDH@std@@QEBAHAEAHPEB_W1AEAPEB_WPEAD3AEAPEAD@Z +@ cdecl -arch=arm ?overflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAAHH@Z(ptr long) msvcp120.?overflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAAHH@Z +@ thiscall -arch=i386 ?overflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHH@Z(ptr long) msvcp120.?overflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHH@Z +@ cdecl -arch=win64 ?overflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHH@Z(ptr long) msvcp120.?overflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHH@Z +@ cdecl -arch=arm ?overflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAAGG@Z(ptr long) msvcp120.?overflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAAGG@Z +@ thiscall -arch=i386 ?overflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEGG@Z(ptr long) msvcp120.?overflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEGG@Z +@ cdecl -arch=win64 ?overflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGG@Z(ptr long) msvcp120.?overflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGG@Z +@ cdecl -arch=arm ?overflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAAGG@Z(ptr long) msvcp120.?overflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAAGG@Z +@ thiscall -arch=i386 ?overflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEGG@Z(ptr long) msvcp120.?overflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEGG@Z +@ cdecl -arch=win64 ?overflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGG@Z(ptr long) msvcp120.?overflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGG@Z +@ cdecl -arch=arm ?pbackfail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAAHH@Z(ptr long) msvcp120.?pbackfail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAAHH@Z +@ thiscall -arch=i386 ?pbackfail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHH@Z(ptr long) msvcp120.?pbackfail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHH@Z +@ cdecl -arch=win64 ?pbackfail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHH@Z(ptr long) msvcp120.?pbackfail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHH@Z +@ cdecl -arch=arm ?pbackfail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAAGG@Z(ptr long) msvcp120.?pbackfail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAAGG@Z +@ thiscall -arch=i386 ?pbackfail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEGG@Z(ptr long) msvcp120.?pbackfail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEGG@Z +@ cdecl -arch=win64 ?pbackfail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGG@Z(ptr long) msvcp120.?pbackfail@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGG@Z +@ cdecl -arch=arm ?pbackfail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAAGG@Z(ptr long) msvcp120.?pbackfail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAAGG@Z +@ thiscall -arch=i386 ?pbackfail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEGG@Z(ptr long) msvcp120.?pbackfail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEGG@Z +@ cdecl -arch=win64 ?pbackfail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGG@Z(ptr long) msvcp120.?pbackfail@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGG@Z +@ cdecl -arch=arm ?pbase@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBAPADXZ(ptr) msvcp120.?pbase@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBAPADXZ +@ thiscall -arch=i386 ?pbase@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ(ptr) msvcp120.?pbase@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ +@ cdecl -arch=win64 ?pbase@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ(ptr) msvcp120.?pbase@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ +@ cdecl -arch=arm ?pbase@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBAPAGXZ(ptr) msvcp120.?pbase@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBAPAGXZ +@ thiscall -arch=i386 ?pbase@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ(ptr) msvcp120.?pbase@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ +@ cdecl -arch=win64 ?pbase@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ(ptr) msvcp120.?pbase@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ +@ cdecl -arch=arm ?pbase@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBAPA_WXZ(ptr) msvcp120.?pbase@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBAPA_WXZ +@ thiscall -arch=i386 ?pbase@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ(ptr) msvcp120.?pbase@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ +@ cdecl -arch=win64 ?pbase@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ(ptr) msvcp120.?pbase@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ +@ cdecl -arch=arm ?pbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXH@Z(ptr long) msvcp120.?pbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXH@Z +@ thiscall -arch=i386 ?pbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXH@Z(ptr long) msvcp120.?pbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXH@Z +@ cdecl -arch=win64 ?pbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXH@Z(ptr long) msvcp120.?pbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXH@Z +@ cdecl -arch=arm ?pbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXH@Z(ptr long) msvcp120.?pbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXH@Z +@ thiscall -arch=i386 ?pbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXH@Z(ptr long) msvcp120.?pbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXH@Z +@ cdecl -arch=win64 ?pbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXH@Z(ptr long) msvcp120.?pbump@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXH@Z +@ cdecl -arch=arm ?pbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXH@Z(ptr long) msvcp120.?pbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXH@Z +@ thiscall -arch=i386 ?pbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXH@Z(ptr long) msvcp120.?pbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXH@Z +@ cdecl -arch=win64 ?pbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXH@Z(ptr long) msvcp120.?pbump@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXH@Z +@ cdecl -arch=arm ?peek@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAHXZ(ptr) msvcp120.?peek@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAHXZ +@ thiscall -arch=i386 ?peek@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ(ptr) msvcp120.?peek@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ +@ cdecl -arch=win64 ?peek@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ(ptr) msvcp120.?peek@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ +@ cdecl -arch=arm ?peek@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAGXZ(ptr) msvcp120.?peek@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAGXZ +@ thiscall -arch=i386 ?peek@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEGXZ(ptr) msvcp120.?peek@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEGXZ +@ cdecl -arch=win64 ?peek@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAGXZ(ptr) msvcp120.?peek@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAGXZ +@ cdecl -arch=arm ?peek@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAGXZ(ptr) msvcp120.?peek@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAGXZ +@ thiscall -arch=i386 ?peek@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEGXZ(ptr) msvcp120.?peek@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEGXZ +@ cdecl -arch=win64 ?peek@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAGXZ(ptr) msvcp120.?peek@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAGXZ +@ cdecl -arch=arm ?pptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBAPADXZ(ptr) msvcp120.?pptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBAPADXZ +@ thiscall -arch=i386 ?pptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ(ptr) msvcp120.?pptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ +@ cdecl -arch=win64 ?pptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ(ptr) msvcp120.?pptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBAPEADXZ +@ cdecl -arch=arm ?pptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBAPAGXZ(ptr) msvcp120.?pptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBAPAGXZ +@ thiscall -arch=i386 ?pptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ(ptr) msvcp120.?pptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IBEPAGXZ +@ cdecl -arch=win64 ?pptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ(ptr) msvcp120.?pptr@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEBAPEAGXZ +@ cdecl -arch=arm ?pptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBAPA_WXZ(ptr) msvcp120.?pptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBAPA_WXZ +@ thiscall -arch=i386 ?pptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ(ptr) msvcp120.?pptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IBEPA_WXZ +@ cdecl -arch=win64 ?pptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ(ptr) msvcp120.?pptr@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEBAPEA_WXZ +@ cdecl -ret64 -arch=arm ?precision@ios_base@std@@QAA_J_J@Z(ptr int64) msvcp120.?precision@ios_base@std@@QAA_J_J@Z +@ thiscall -ret64 -arch=i386 ?precision@ios_base@std@@QAE_J_J@Z(ptr int64) msvcp120.?precision@ios_base@std@@QAE_J_J@Z +@ cdecl -arch=win64 ?precision@ios_base@std@@QEAA_J_J@Z(ptr long) msvcp120.?precision@ios_base@std@@QEAA_J_J@Z +@ cdecl -ret64 -arch=arm ?precision@ios_base@std@@QBA_JXZ(ptr) msvcp120.?precision@ios_base@std@@QBA_JXZ +@ thiscall -ret64 -arch=i386 ?precision@ios_base@std@@QBE_JXZ(ptr) msvcp120.?precision@ios_base@std@@QBE_JXZ +@ cdecl -arch=win64 ?precision@ios_base@std@@QEBA_JXZ(ptr) msvcp120.?precision@ios_base@std@@QEBA_JXZ +@ cdecl -arch=arm ?pubimbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA?AVlocale@2@ABV32@@Z(ptr ptr ptr) msvcp120.?pubimbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA?AVlocale@2@ABV32@@Z +@ thiscall -arch=i386 ?pubimbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE?AVlocale@2@ABV32@@Z(ptr ptr ptr) msvcp120.?pubimbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE?AVlocale@2@ABV32@@Z +@ cdecl -arch=win64 ?pubimbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z(ptr ptr ptr) msvcp120.?pubimbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z +@ cdecl -arch=arm ?pubimbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA?AVlocale@2@ABV32@@Z(ptr ptr ptr) msvcp120.?pubimbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA?AVlocale@2@ABV32@@Z +@ thiscall -arch=i386 ?pubimbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE?AVlocale@2@ABV32@@Z(ptr ptr ptr) msvcp120.?pubimbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE?AVlocale@2@ABV32@@Z +@ cdecl -arch=win64 ?pubimbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z(ptr ptr ptr) msvcp120.?pubimbue@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z +@ cdecl -arch=arm ?pubimbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA?AVlocale@2@ABV32@@Z(ptr ptr ptr) msvcp120.?pubimbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA?AVlocale@2@ABV32@@Z +@ thiscall -arch=i386 ?pubimbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE?AVlocale@2@ABV32@@Z(ptr ptr ptr) msvcp120.?pubimbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE?AVlocale@2@ABV32@@Z +@ cdecl -arch=win64 ?pubimbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z(ptr ptr ptr) msvcp120.?pubimbue@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z +@ cdecl -arch=arm ?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA?AV?$fpos@H@2@_JHH@Z(ptr ptr int64 long long) msvcp120.?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA?AV?$fpos@H@2@_JHH@Z +@ thiscall -arch=i386 ?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@_JHH@Z(ptr ptr int64 long long) msvcp120.?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@_JHH@Z +@ cdecl -arch=win64 ?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@_JHH@Z(ptr ptr long long long) msvcp120.?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@_JHH@Z +@ cdecl -arch=arm ?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA?AV?$fpos@H@2@_JII@Z(ptr ptr int64 long long) msvcp120.?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA?AV?$fpos@H@2@_JII@Z +@ thiscall -arch=i386 ?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@_JII@Z(ptr ptr int64 long long) msvcp120.?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@_JII@Z +@ cdecl -arch=win64 ?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@_JII@Z(ptr ptr long long long) msvcp120.?pubseekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@_JII@Z +@ cdecl -arch=arm ?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA?AV?$fpos@H@2@_JHH@Z(ptr ptr int64 long long) msvcp120.?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA?AV?$fpos@H@2@_JHH@Z +@ thiscall -arch=i386 ?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@_JHH@Z(ptr ptr int64 long long) msvcp120.?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@_JHH@Z +@ cdecl -arch=win64 ?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@_JHH@Z(ptr ptr long long long) msvcp120.?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@_JHH@Z +@ cdecl -arch=arm ?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA?AV?$fpos@H@2@_JII@Z(ptr ptr int64 long long) msvcp120.?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA?AV?$fpos@H@2@_JII@Z +@ thiscall -arch=i386 ?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@_JII@Z(ptr ptr int64 long long) msvcp120.?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@_JII@Z +@ cdecl -arch=win64 ?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@_JII@Z(ptr ptr long long long) msvcp120.?pubseekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@_JII@Z +@ cdecl -arch=arm ?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA?AV?$fpos@H@2@_JHH@Z(ptr ptr int64 long long) msvcp120.?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA?AV?$fpos@H@2@_JHH@Z +@ thiscall -arch=i386 ?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@_JHH@Z(ptr ptr int64 long long) msvcp120.?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@_JHH@Z +@ cdecl -arch=win64 ?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@_JHH@Z(ptr ptr long long long) msvcp120.?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@_JHH@Z +@ cdecl -arch=arm ?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA?AV?$fpos@H@2@_JII@Z(ptr ptr int64 long long) msvcp120.?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA?AV?$fpos@H@2@_JII@Z +@ thiscall -arch=i386 ?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@_JII@Z(ptr ptr int64 long long) msvcp120.?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@_JII@Z +@ cdecl -arch=win64 ?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@_JII@Z(ptr ptr long long long) msvcp120.?pubseekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@_JII@Z +@ cdecl -arch=arm ?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA?AV?$fpos@H@2@V32@H@Z(ptr ptr long long int64 long long long) msvcp120.?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA?AV?$fpos@H@2@V32@H@Z +@ thiscall -arch=i386 ?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@V32@H@Z(ptr ptr long long int64 long long long) msvcp120.?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@V32@H@Z +@ cdecl -arch=win64 ?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@V32@H@Z(ptr ptr ptr long) msvcp120.?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@V32@H@Z +@ cdecl -arch=arm ?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA?AV?$fpos@H@2@V32@I@Z(ptr ptr long long int64 long long long) msvcp120.?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA?AV?$fpos@H@2@V32@I@Z +@ thiscall -arch=i386 ?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@V32@I@Z(ptr ptr long long int64 long long long) msvcp120.?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@V32@I@Z +@ cdecl -arch=win64 ?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@V32@I@Z(ptr ptr ptr long) msvcp120.?pubseekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@V32@I@Z +@ cdecl -arch=arm ?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA?AV?$fpos@H@2@V32@H@Z(ptr ptr long long int64 long long long) msvcp120.?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA?AV?$fpos@H@2@V32@H@Z +@ thiscall -arch=i386 ?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@V32@H@Z(ptr ptr long long int64 long long long) msvcp120.?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@V32@H@Z +@ cdecl -arch=win64 ?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@V32@H@Z(ptr ptr ptr long) msvcp120.?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@V32@H@Z +@ cdecl -arch=arm ?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA?AV?$fpos@H@2@V32@I@Z(ptr ptr long long int64 long long long) msvcp120.?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA?AV?$fpos@H@2@V32@I@Z +@ thiscall -arch=i386 ?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@V32@I@Z(ptr ptr long long int64 long long long) msvcp120.?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@V32@I@Z +@ cdecl -arch=win64 ?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@V32@I@Z(ptr ptr ptr long) msvcp120.?pubseekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@V32@I@Z +@ cdecl -arch=arm ?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA?AV?$fpos@H@2@V32@H@Z(ptr ptr long long int64 long long long) msvcp120.?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA?AV?$fpos@H@2@V32@H@Z +@ thiscall -arch=i386 ?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@V32@H@Z(ptr ptr long long int64 long long long) msvcp120.?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@V32@H@Z +@ cdecl -arch=win64 ?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@V32@H@Z(ptr ptr ptr long) msvcp120.?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@V32@H@Z +@ cdecl -arch=arm ?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA?AV?$fpos@H@2@V32@I@Z(ptr ptr long long int64 long long long) msvcp120.?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA?AV?$fpos@H@2@V32@I@Z +@ thiscall -arch=i386 ?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@V32@I@Z(ptr ptr long long int64 long long long) msvcp120.?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@V32@I@Z +@ cdecl -arch=win64 ?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@V32@I@Z(ptr ptr ptr long) msvcp120.?pubseekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@V32@I@Z +@ cdecl -arch=arm ?pubsetbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAPAV12@PAD_J@Z(ptr ptr int64) msvcp120.?pubsetbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAPAV12@PAD_J@Z +@ thiscall -arch=i386 ?pubsetbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEPAV12@PAD_J@Z(ptr ptr int64) msvcp120.?pubsetbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEPAV12@PAD_J@Z +@ cdecl -arch=win64 ?pubsetbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEAD_J@Z(ptr ptr long) msvcp120.?pubsetbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEAD_J@Z +@ cdecl -arch=arm ?pubsetbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAPAV12@PAG_J@Z(ptr ptr int64) msvcp120.?pubsetbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAPAV12@PAG_J@Z +@ thiscall -arch=i386 ?pubsetbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEPAV12@PAG_J@Z(ptr ptr int64) msvcp120.?pubsetbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEPAV12@PAG_J@Z +@ cdecl -arch=win64 ?pubsetbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@PEAG_J@Z(ptr ptr long) msvcp120.?pubsetbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@PEAG_J@Z +@ cdecl -arch=arm ?pubsetbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAPAV12@PA_W_J@Z(ptr ptr int64) msvcp120.?pubsetbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAPAV12@PA_W_J@Z +@ thiscall -arch=i386 ?pubsetbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEPAV12@PA_W_J@Z(ptr ptr int64) msvcp120.?pubsetbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEPAV12@PA_W_J@Z +@ cdecl -arch=win64 ?pubsetbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@PEA_W_J@Z(ptr ptr long) msvcp120.?pubsetbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@PEA_W_J@Z +@ cdecl -arch=arm ?pubsync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAHXZ(ptr) msvcp120.?pubsync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAHXZ +@ thiscall -arch=i386 ?pubsync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ(ptr) msvcp120.?pubsync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ +@ cdecl -arch=win64 ?pubsync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ(ptr) msvcp120.?pubsync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ +@ cdecl -arch=arm ?pubsync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAHXZ(ptr) msvcp120.?pubsync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAHXZ +@ thiscall -arch=i386 ?pubsync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEHXZ(ptr) msvcp120.?pubsync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEHXZ +@ cdecl -arch=win64 ?pubsync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAHXZ(ptr) msvcp120.?pubsync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAHXZ +@ cdecl -arch=arm ?pubsync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAHXZ(ptr) msvcp120.?pubsync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAHXZ +@ thiscall -arch=i386 ?pubsync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEHXZ(ptr) msvcp120.?pubsync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEHXZ +@ cdecl -arch=win64 ?pubsync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAHXZ(ptr) msvcp120.?pubsync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAHXZ +@ cdecl -arch=arm ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV12@D@Z(ptr long) msvcp120.?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV12@D@Z +@ thiscall -arch=i386 ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z(ptr long) msvcp120.?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z +@ cdecl -arch=win64 ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@D@Z(ptr long) msvcp120.?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@D@Z +@ cdecl -arch=arm ?put@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV12@G@Z(ptr long) msvcp120.?put@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV12@G@Z +@ thiscall -arch=i386 ?put@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@G@Z(ptr long) msvcp120.?put@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@G@Z +@ cdecl -arch=win64 ?put@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@G@Z(ptr long) msvcp120.?put@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@G@Z +@ cdecl -arch=arm ?put@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@_W@Z(ptr long) msvcp120.?put@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@_W@Z +@ thiscall -arch=i386 ?put@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_W@Z(ptr long) msvcp120.?put@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_W@Z +@ cdecl -arch=win64 ?put@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_W@Z(ptr long) msvcp120.?put@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_W@Z +@ cdecl -arch=arm ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DJ@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DJ@Z +@ thiscall -arch=i386 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DJ@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DJ@Z +@ cdecl -arch=win64 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DJ@Z(ptr ptr ptr ptr long long) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DJ@Z +@ cdecl -arch=arm ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DK@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DK@Z +@ thiscall -arch=i386 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DK@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DK@Z +@ cdecl -arch=win64 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DK@Z(ptr ptr ptr ptr long long) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DK@Z +@ cdecl -arch=arm ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DN@Z(ptr ptr long ptr ptr long double) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DN@Z +@ thiscall -arch=i386 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DN@Z(ptr ptr long ptr ptr long double) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DN@Z +@ cdecl -arch=win64 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DN@Z(ptr ptr ptr ptr long double) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DN@Z +@ cdecl -arch=arm ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DO@Z(ptr ptr long ptr ptr long double) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DO@Z +@ thiscall -arch=i386 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DO@Z(ptr ptr long ptr ptr long double) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DO@Z +@ cdecl -arch=win64 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DO@Z(ptr ptr ptr ptr long double) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DO@Z +@ cdecl -arch=arm ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBX@Z(ptr ptr long ptr ptr long ptr) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBX@Z +@ thiscall -arch=i386 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBX@Z(ptr ptr long ptr ptr long ptr) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBX@Z +@ cdecl -arch=win64 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBX@Z(ptr ptr ptr ptr long ptr) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBX@Z +@ cdecl -arch=arm ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_J@Z(ptr ptr long ptr ptr long int64) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_J@Z +@ thiscall -arch=i386 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_J@Z(ptr ptr long ptr ptr long int64) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_J@Z +@ cdecl -arch=win64 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_J@Z(ptr ptr ptr ptr long int64) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_J@Z +@ cdecl -arch=arm ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_K@Z(ptr ptr long ptr ptr long int64) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_K@Z +@ thiscall -arch=i386 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_K@Z(ptr ptr long ptr ptr long int64) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_K@Z +@ cdecl -arch=win64 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_K@Z(ptr ptr ptr ptr long int64) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_K@Z +@ cdecl -arch=arm ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_N@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_N@Z +@ thiscall -arch=i386 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_N@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@D_N@Z +@ cdecl -arch=win64 ?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z(ptr ptr ptr ptr long long) msvcp120.?put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z +@ cdecl -arch=arm ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GJ@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GJ@Z +@ thiscall -arch=i386 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GJ@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GJ@Z +@ cdecl -arch=win64 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GJ@Z(ptr ptr ptr ptr long long) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GJ@Z +@ cdecl -arch=arm ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GK@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GK@Z +@ thiscall -arch=i386 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GK@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GK@Z +@ cdecl -arch=win64 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GK@Z(ptr ptr ptr ptr long long) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GK@Z +@ cdecl -arch=arm ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GN@Z(ptr ptr long ptr ptr long double) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GN@Z +@ thiscall -arch=i386 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GN@Z(ptr ptr long ptr ptr long double) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GN@Z +@ cdecl -arch=win64 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GN@Z(ptr ptr ptr ptr long double) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GN@Z +@ cdecl -arch=arm ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GO@Z(ptr ptr long ptr ptr long double) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GO@Z +@ thiscall -arch=i386 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GO@Z(ptr ptr long ptr ptr long double) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GO@Z +@ cdecl -arch=win64 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GO@Z(ptr ptr ptr ptr long double) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GO@Z +@ cdecl -arch=arm ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBX@Z(ptr ptr long ptr ptr long ptr) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBX@Z +@ thiscall -arch=i386 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBX@Z(ptr ptr long ptr ptr long ptr) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBX@Z +@ cdecl -arch=win64 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBX@Z(ptr ptr ptr ptr long ptr) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBX@Z +@ cdecl -arch=arm ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_J@Z(ptr ptr long ptr ptr long int64) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_J@Z +@ thiscall -arch=i386 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_J@Z(ptr ptr long ptr ptr long int64) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_J@Z +@ cdecl -arch=win64 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_J@Z(ptr ptr ptr ptr long int64) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_J@Z +@ cdecl -arch=arm ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_K@Z(ptr ptr long ptr ptr long int64) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_K@Z +@ thiscall -arch=i386 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_K@Z(ptr ptr long ptr ptr long int64) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_K@Z +@ cdecl -arch=win64 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_K@Z(ptr ptr ptr ptr long int64) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_K@Z +@ cdecl -arch=arm ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_N@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_N@Z +@ thiscall -arch=i386 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_N@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@G_N@Z +@ cdecl -arch=win64 ?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_N@Z(ptr ptr ptr ptr long long) msvcp120.?put@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@G_N@Z +@ cdecl -arch=arm ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WJ@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WJ@Z +@ thiscall -arch=i386 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WJ@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WJ@Z +@ cdecl -arch=win64 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WJ@Z(ptr ptr ptr ptr long long) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WJ@Z +@ cdecl -arch=arm ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WK@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WK@Z +@ thiscall -arch=i386 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WK@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WK@Z +@ cdecl -arch=win64 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WK@Z(ptr ptr ptr ptr long long) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WK@Z +@ cdecl -arch=arm ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WN@Z(ptr ptr long ptr ptr long double) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WN@Z +@ thiscall -arch=i386 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WN@Z(ptr ptr long ptr ptr long double) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WN@Z +@ cdecl -arch=win64 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WN@Z(ptr ptr ptr ptr long double) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WN@Z +@ cdecl -arch=arm ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WO@Z(ptr ptr long ptr ptr long double) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WO@Z +@ thiscall -arch=i386 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WO@Z(ptr ptr long ptr ptr long double) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WO@Z +@ cdecl -arch=win64 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WO@Z(ptr ptr ptr ptr long double) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WO@Z +@ cdecl -arch=arm ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBX@Z(ptr ptr long ptr ptr long ptr) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBX@Z +@ thiscall -arch=i386 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBX@Z(ptr ptr long ptr ptr long ptr) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBX@Z +@ cdecl -arch=win64 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBX@Z(ptr ptr ptr ptr long ptr) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBX@Z +@ cdecl -arch=arm ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_J@Z(ptr ptr long ptr ptr long int64) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_J@Z +@ thiscall -arch=i386 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_J@Z(ptr ptr long ptr ptr long int64) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_J@Z +@ cdecl -arch=win64 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_J@Z(ptr ptr ptr ptr long int64) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_J@Z +@ cdecl -arch=arm ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_K@Z(ptr ptr long ptr ptr long int64) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_K@Z +@ thiscall -arch=i386 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_K@Z(ptr ptr long ptr ptr long int64) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_K@Z +@ cdecl -arch=win64 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_K@Z(ptr ptr ptr ptr long int64) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_K@Z +@ cdecl -arch=arm ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_N@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_N@Z +@ thiscall -arch=i386 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_N@Z(ptr ptr long ptr ptr long long) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_W_N@Z +@ cdecl -arch=win64 ?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_N@Z(ptr ptr ptr ptr long long) msvcp120.?put@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_W_N@Z +@ cdecl -arch=arm ?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@DD@Z(ptr ptr long ptr ptr long ptr long long) msvcp120.?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@DD@Z +@ thiscall -arch=i386 ?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@DD@Z(ptr ptr long ptr ptr long ptr long long) msvcp120.?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@DD@Z +@ cdecl -arch=win64 ?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBUtm@@DD@Z(ptr ptr ptr ptr long ptr long long) msvcp120.?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBUtm@@DD@Z +@ cdecl -arch=arm ?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@PBD3@Z(ptr ptr long ptr ptr long ptr ptr ptr) msvcp120.?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@PBD3@Z +@ thiscall -arch=i386 ?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@PBD3@Z(ptr ptr long ptr ptr long ptr ptr ptr) msvcp120.?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AAVios_base@2@DPBUtm@@PBD3@Z +@ cdecl -arch=win64 ?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBUtm@@PEBD3@Z(ptr ptr ptr ptr long ptr ptr ptr) msvcp120.?put@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBUtm@@PEBD3@Z +@ cdecl -arch=arm ?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@DD@Z(ptr ptr long ptr ptr long ptr long long) msvcp120.?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@DD@Z +@ thiscall -arch=i386 ?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@DD@Z(ptr ptr long ptr ptr long ptr long long) msvcp120.?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@DD@Z +@ cdecl -arch=win64 ?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBUtm@@DD@Z(ptr ptr ptr ptr long ptr long long) msvcp120.?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBUtm@@DD@Z +@ cdecl -arch=arm ?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@PBG3@Z(ptr ptr long ptr ptr long ptr ptr ptr) msvcp120.?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@PBG3@Z +@ thiscall -arch=i386 ?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@PBG3@Z(ptr ptr long ptr ptr long ptr ptr ptr) msvcp120.?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AAVios_base@2@GPBUtm@@PBG3@Z +@ cdecl -arch=win64 ?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBUtm@@PEBG3@Z(ptr ptr ptr ptr long ptr ptr ptr) msvcp120.?put@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@GU?$char_traits@G@std@@@2@V32@AEAVios_base@2@GPEBUtm@@PEBG3@Z +@ cdecl -arch=arm ?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@DD@Z(ptr ptr long ptr ptr long ptr long long) msvcp120.?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@DD@Z +@ thiscall -arch=i386 ?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@DD@Z(ptr ptr long ptr ptr long ptr long long) msvcp120.?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@DD@Z +@ cdecl -arch=win64 ?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBUtm@@DD@Z(ptr ptr ptr ptr long ptr long long) msvcp120.?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBUtm@@DD@Z +@ cdecl -arch=arm ?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@PB_W4@Z(ptr ptr long ptr ptr long ptr ptr ptr) msvcp120.?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@PB_W4@Z +@ thiscall -arch=i386 ?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@PB_W4@Z(ptr ptr long ptr ptr long ptr ptr ptr) msvcp120.?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AAVios_base@2@_WPBUtm@@PB_W4@Z +@ cdecl -arch=win64 ?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBUtm@@PEB_W4@Z(ptr ptr ptr ptr long ptr ptr ptr) msvcp120.?put@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@2@V32@AEAVios_base@2@_WPEBUtm@@PEB_W4@Z +@ cdecl -arch=arm ?putback@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@D@Z(ptr long) msvcp120.?putback@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@D@Z +@ thiscall -arch=i386 ?putback@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z(ptr long) msvcp120.?putback@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z +@ cdecl -arch=win64 ?putback@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@D@Z(ptr long) msvcp120.?putback@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@D@Z +@ cdecl -arch=arm ?putback@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@G@Z(ptr long) msvcp120.?putback@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@G@Z +@ thiscall -arch=i386 ?putback@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@G@Z(ptr long) msvcp120.?putback@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@G@Z +@ cdecl -arch=win64 ?putback@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@G@Z(ptr long) msvcp120.?putback@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@G@Z +@ cdecl -arch=arm ?putback@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@_W@Z(ptr long) msvcp120.?putback@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@_W@Z +@ thiscall -arch=i386 ?putback@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_W@Z(ptr long) msvcp120.?putback@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_W@Z +@ cdecl -arch=win64 ?putback@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_W@Z(ptr long) msvcp120.?putback@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_W@Z +@ cdecl -arch=arm ?pword@ios_base@std@@QAAAAPAXH@Z(ptr long) msvcp120.?pword@ios_base@std@@QAAAAPAXH@Z +@ thiscall -arch=i386 ?pword@ios_base@std@@QAEAAPAXH@Z(ptr long) msvcp120.?pword@ios_base@std@@QAEAAPAXH@Z +@ cdecl -arch=win64 ?pword@ios_base@std@@QEAAAEAPEAXH@Z(ptr long) msvcp120.?pword@ios_base@std@@QEAAAEAPEAXH@Z +@ cdecl -arch=arm ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PAV32@@Z(ptr ptr) msvcp120.?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PAV32@@Z +@ thiscall -arch=i386 ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PAV32@@Z(ptr ptr) msvcp120.?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PAV32@@Z +@ cdecl -arch=win64 ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PEAV32@@Z(ptr ptr) msvcp120.?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PEAV32@@Z +@ cdecl -arch=arm ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBAPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ(ptr) msvcp120.?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBAPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ +@ thiscall -arch=i386 ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ(ptr) msvcp120.?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ +@ cdecl -arch=win64 ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ(ptr) msvcp120.?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ +@ cdecl -arch=arm ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PAV32@@Z(ptr ptr) msvcp120.?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PAV32@@Z +@ thiscall -arch=i386 ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PAV32@@Z(ptr ptr) msvcp120.?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PAV32@@Z +@ cdecl -arch=win64 ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PEAV32@@Z(ptr ptr) msvcp120.?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PEAV32@@Z +@ cdecl -arch=arm ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QBAPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@XZ(ptr) msvcp120.?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QBAPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@XZ +@ thiscall -arch=i386 ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@XZ(ptr) msvcp120.?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@XZ +@ cdecl -arch=win64 ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@XZ(ptr) msvcp120.?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@XZ +@ cdecl -arch=arm ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PAV32@@Z(ptr ptr) msvcp120.?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PAV32@@Z +@ thiscall -arch=i386 ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PAV32@@Z(ptr ptr) msvcp120.?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PAV32@@Z +@ cdecl -arch=win64 ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PEAV32@@Z(ptr ptr) msvcp120.?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PEAV32@@Z +@ cdecl -arch=arm ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBAPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ(ptr) msvcp120.?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBAPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ +@ thiscall -arch=i386 ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ(ptr) msvcp120.?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ +@ cdecl -arch=win64 ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ(ptr) msvcp120.?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ +@ cdecl -arch=arm ?rdstate@ios_base@std@@QBAHXZ(ptr) msvcp120.?rdstate@ios_base@std@@QBAHXZ +@ thiscall -arch=i386 ?rdstate@ios_base@std@@QBEHXZ(ptr) msvcp120.?rdstate@ios_base@std@@QBEHXZ +@ cdecl -arch=win64 ?rdstate@ios_base@std@@QEBAHXZ(ptr) msvcp120.?rdstate@ios_base@std@@QEBAHXZ +@ cdecl -arch=arm ?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@PAD_J@Z(ptr ptr int64) msvcp120.?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@PAD_J@Z +@ thiscall -arch=i386 ?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PAD_J@Z(ptr ptr int64) msvcp120.?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PAD_J@Z +@ cdecl -arch=win64 ?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z(ptr ptr long) msvcp120.?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z +@ cdecl -arch=arm ?read@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@PAG_J@Z(ptr ptr int64) msvcp120.?read@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@PAG_J@Z +@ thiscall -arch=i386 ?read@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAG_J@Z(ptr ptr int64) msvcp120.?read@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAG_J@Z +@ cdecl -arch=win64 ?read@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z(ptr ptr long) msvcp120.?read@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z +@ cdecl -arch=arm ?read@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@PA_W_J@Z(ptr ptr int64) msvcp120.?read@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@PA_W_J@Z +@ thiscall -arch=i386 ?read@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_W_J@Z(ptr ptr int64) msvcp120.?read@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_W_J@Z +@ cdecl -arch=win64 ?read@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z(ptr ptr long) msvcp120.?read@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z +@ cdecl -ret64 -arch=arm ?readsome@?$basic_istream@DU?$char_traits@D@std@@@std@@QAA_JPAD_J@Z(ptr ptr int64) msvcp120.?readsome@?$basic_istream@DU?$char_traits@D@std@@@std@@QAA_JPAD_J@Z +@ thiscall -ret64 -arch=i386 ?readsome@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE_JPAD_J@Z(ptr ptr int64) msvcp120.?readsome@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE_JPAD_J@Z +@ cdecl -arch=win64 ?readsome@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_J@Z(ptr ptr long) msvcp120.?readsome@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_J@Z +@ cdecl -ret64 -arch=arm ?readsome@?$basic_istream@GU?$char_traits@G@std@@@std@@QAA_JPAG_J@Z(ptr ptr int64) msvcp120.?readsome@?$basic_istream@GU?$char_traits@G@std@@@std@@QAA_JPAG_J@Z +@ thiscall -ret64 -arch=i386 ?readsome@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE_JPAG_J@Z(ptr ptr int64) msvcp120.?readsome@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE_JPAG_J@Z +@ cdecl -arch=win64 ?readsome@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_J@Z(ptr ptr long) msvcp120.?readsome@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_J@Z +@ cdecl -ret64 -arch=arm ?readsome@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAA_JPA_W_J@Z(ptr ptr int64) msvcp120.?readsome@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAA_JPA_W_J@Z +@ thiscall -ret64 -arch=i386 ?readsome@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE_JPA_W_J@Z(ptr ptr int64) msvcp120.?readsome@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE_JPA_W_J@Z +@ cdecl -arch=win64 ?readsome@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_J@Z(ptr ptr long) msvcp120.?readsome@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_J@Z +@ cdecl -arch=arm ?register_callback@ios_base@std@@QAAXP6AXW4event@12@AAV12@H@ZH@Z(ptr ptr long) msvcp120.?register_callback@ios_base@std@@QAAXP6AXW4event@12@AAV12@H@ZH@Z +@ thiscall -arch=i386 ?register_callback@ios_base@std@@QAEXP6AXW4event@12@AAV12@H@ZH@Z(ptr ptr long) msvcp120.?register_callback@ios_base@std@@QAEXP6AXW4event@12@AAV12@H@ZH@Z +@ cdecl -arch=win64 ?register_callback@ios_base@std@@QEAAXP6AXW4event@12@AEAV12@H@ZH@Z(ptr ptr long) msvcp120.?register_callback@ios_base@std@@QEAAXP6AXW4event@12@AEAV12@H@ZH@Z +@ cdecl ?resetiosflags@std@@YA?AU?$_Smanip@H@1@H@Z(ptr long) msvcp120.?resetiosflags@std@@YA?AU?$_Smanip@H@1@H@Z +@ cdecl -arch=arm ?sbumpc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAHXZ(ptr) msvcp120.?sbumpc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAHXZ +@ thiscall -arch=i386 ?sbumpc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ(ptr) msvcp120.?sbumpc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ +@ cdecl -arch=win64 ?sbumpc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ(ptr) msvcp120.?sbumpc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ +@ cdecl -arch=arm ?sbumpc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAGXZ(ptr) msvcp120.?sbumpc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAGXZ +@ thiscall -arch=i386 ?sbumpc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGXZ(ptr) msvcp120.?sbumpc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGXZ +@ cdecl -arch=win64 ?sbumpc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ(ptr) msvcp120.?sbumpc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ +@ cdecl -arch=arm ?sbumpc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAGXZ(ptr) msvcp120.?sbumpc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAGXZ +@ thiscall -arch=i386 ?sbumpc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEGXZ(ptr) msvcp120.?sbumpc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEGXZ +@ cdecl -arch=win64 ?sbumpc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ(ptr) msvcp120.?sbumpc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ +@ cdecl -arch=arm ?scan_is@?$ctype@D@std@@QBAPBDFPBD0@Z(ptr long ptr ptr) msvcp120.?scan_is@?$ctype@D@std@@QBAPBDFPBD0@Z +@ thiscall -arch=i386 ?scan_is@?$ctype@D@std@@QBEPBDFPBD0@Z(ptr long ptr ptr) msvcp120.?scan_is@?$ctype@D@std@@QBEPBDFPBD0@Z +@ cdecl -arch=win64 ?scan_is@?$ctype@D@std@@QEBAPEBDFPEBD0@Z(ptr long ptr ptr) msvcp120.?scan_is@?$ctype@D@std@@QEBAPEBDFPEBD0@Z +@ cdecl -arch=arm ?scan_is@?$ctype@G@std@@QBAPBGFPBG0@Z(ptr long ptr ptr) msvcp120.?scan_is@?$ctype@G@std@@QBAPBGFPBG0@Z +@ thiscall -arch=i386 ?scan_is@?$ctype@G@std@@QBEPBGFPBG0@Z(ptr long ptr ptr) msvcp120.?scan_is@?$ctype@G@std@@QBEPBGFPBG0@Z +@ cdecl -arch=win64 ?scan_is@?$ctype@G@std@@QEBAPEBGFPEBG0@Z(ptr long ptr ptr) msvcp120.?scan_is@?$ctype@G@std@@QEBAPEBGFPEBG0@Z +@ cdecl -arch=arm ?scan_is@?$ctype@_W@std@@QBAPB_WFPB_W0@Z(ptr long ptr ptr) msvcp120.?scan_is@?$ctype@_W@std@@QBAPB_WFPB_W0@Z +@ thiscall -arch=i386 ?scan_is@?$ctype@_W@std@@QBEPB_WFPB_W0@Z(ptr long ptr ptr) msvcp120.?scan_is@?$ctype@_W@std@@QBEPB_WFPB_W0@Z +@ cdecl -arch=win64 ?scan_is@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z(ptr long ptr ptr) msvcp120.?scan_is@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z +@ cdecl -arch=arm ?scan_not@?$ctype@D@std@@QBAPBDFPBD0@Z(ptr long ptr ptr) msvcp120.?scan_not@?$ctype@D@std@@QBAPBDFPBD0@Z +@ thiscall -arch=i386 ?scan_not@?$ctype@D@std@@QBEPBDFPBD0@Z(ptr long ptr ptr) msvcp120.?scan_not@?$ctype@D@std@@QBEPBDFPBD0@Z +@ cdecl -arch=win64 ?scan_not@?$ctype@D@std@@QEBAPEBDFPEBD0@Z(ptr long ptr ptr) msvcp120.?scan_not@?$ctype@D@std@@QEBAPEBDFPEBD0@Z +@ cdecl -arch=arm ?scan_not@?$ctype@G@std@@QBAPBGFPBG0@Z(ptr long ptr ptr) msvcp120.?scan_not@?$ctype@G@std@@QBAPBGFPBG0@Z +@ thiscall -arch=i386 ?scan_not@?$ctype@G@std@@QBEPBGFPBG0@Z(ptr long ptr ptr) msvcp120.?scan_not@?$ctype@G@std@@QBEPBGFPBG0@Z +@ cdecl -arch=win64 ?scan_not@?$ctype@G@std@@QEBAPEBGFPEBG0@Z(ptr long ptr ptr) msvcp120.?scan_not@?$ctype@G@std@@QEBAPEBGFPEBG0@Z +@ cdecl -arch=arm ?scan_not@?$ctype@_W@std@@QBAPB_WFPB_W0@Z(ptr long ptr ptr) msvcp120.?scan_not@?$ctype@_W@std@@QBAPB_WFPB_W0@Z +@ thiscall -arch=i386 ?scan_not@?$ctype@_W@std@@QBEPB_WFPB_W0@Z(ptr long ptr ptr) msvcp120.?scan_not@?$ctype@_W@std@@QBEPB_WFPB_W0@Z +@ cdecl -arch=win64 ?scan_not@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z(ptr long ptr ptr) msvcp120.?scan_not@?$ctype@_W@std@@QEBAPEB_WFPEB_W0@Z +@ cdecl -arch=arm ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@V?$fpos@H@2@@Z(ptr long long int64 long long) msvcp120.?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@V?$fpos@H@2@@Z +@ thiscall -arch=i386 ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z(ptr long long int64 long long) msvcp120.?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z +@ cdecl -arch=win64 ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z(ptr ptr) msvcp120.?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z +@ cdecl -arch=arm ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@_JH@Z(ptr int64 long) msvcp120.?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@_JH@Z +@ thiscall -arch=i386 ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@_JH@Z(ptr int64 long) msvcp120.?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@_JH@Z +@ cdecl -arch=win64 ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z(ptr long long) msvcp120.?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z +@ cdecl -arch=arm ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@V?$fpos@H@2@@Z(ptr long long int64 long long) msvcp120.?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@V?$fpos@H@2@@Z +@ thiscall -arch=i386 ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z(ptr long long int64 long long) msvcp120.?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z +@ cdecl -arch=win64 ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z(ptr ptr) msvcp120.?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z +@ cdecl -arch=arm ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@_JH@Z(ptr int64 long) msvcp120.?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@_JH@Z +@ thiscall -arch=i386 ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@_JH@Z(ptr int64 long) msvcp120.?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@_JH@Z +@ cdecl -arch=win64 ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JH@Z(ptr long long) msvcp120.?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JH@Z +@ cdecl -arch=arm ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@V?$fpos@H@2@@Z(ptr long long int64 long long) msvcp120.?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@V?$fpos@H@2@@Z +@ thiscall -arch=i386 ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z(ptr long long int64 long long) msvcp120.?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z +@ cdecl -arch=win64 ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z(ptr ptr) msvcp120.?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z +@ cdecl -arch=arm ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@_JH@Z(ptr int64 long) msvcp120.?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@_JH@Z +@ thiscall -arch=i386 ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_JH@Z(ptr int64 long) msvcp120.?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_JH@Z +@ cdecl -arch=win64 ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JH@Z(ptr long long) msvcp120.?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JH@Z +@ cdecl -arch=arm ?seekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAA?AV?$fpos@H@2@_JHH@Z(ptr ptr int64 long long) msvcp120.?seekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAA?AV?$fpos@H@2@_JHH@Z +@ thiscall -arch=i386 ?seekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE?AV?$fpos@H@2@_JHH@Z(ptr ptr int64 long long) msvcp120.?seekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE?AV?$fpos@H@2@_JHH@Z +@ cdecl -arch=win64 ?seekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z(ptr ptr long long long) msvcp120.?seekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z +@ cdecl -arch=arm ?seekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAA?AV?$fpos@H@2@_JHH@Z(ptr ptr int64 long long) msvcp120.?seekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAA?AV?$fpos@H@2@_JHH@Z +@ thiscall -arch=i386 ?seekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE?AV?$fpos@H@2@_JHH@Z(ptr ptr int64 long long) msvcp120.?seekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE?AV?$fpos@H@2@_JHH@Z +@ cdecl -arch=win64 ?seekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z(ptr ptr long long long) msvcp120.?seekoff@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z +@ cdecl -arch=arm ?seekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAA?AV?$fpos@H@2@_JHH@Z(ptr ptr int64 long long) msvcp120.?seekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAA?AV?$fpos@H@2@_JHH@Z +@ thiscall -arch=i386 ?seekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE?AV?$fpos@H@2@_JHH@Z(ptr ptr int64 long long) msvcp120.?seekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE?AV?$fpos@H@2@_JHH@Z +@ cdecl -arch=win64 ?seekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z(ptr ptr long long long) msvcp120.?seekoff@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA?AV?$fpos@H@2@_JHH@Z +@ cdecl -arch=arm ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV12@V?$fpos@H@2@@Z(ptr long long int64 long long) msvcp120.?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV12@V?$fpos@H@2@@Z +@ thiscall -arch=i386 ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z(ptr long long int64 long long) msvcp120.?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z +@ cdecl -arch=win64 ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z(ptr ptr) msvcp120.?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z +@ cdecl -arch=arm ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV12@_JH@Z(ptr int64 long) msvcp120.?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV12@_JH@Z +@ thiscall -arch=i386 ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@_JH@Z(ptr int64 long) msvcp120.?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@_JH@Z +@ cdecl -arch=win64 ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z(ptr long long) msvcp120.?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z +@ cdecl -arch=arm ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV12@V?$fpos@H@2@@Z(ptr long long int64 long long) msvcp120.?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV12@V?$fpos@H@2@@Z +@ thiscall -arch=i386 ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z(ptr long long int64 long long) msvcp120.?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z +@ cdecl -arch=win64 ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z(ptr ptr) msvcp120.?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z +@ cdecl -arch=arm ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV12@_JH@Z(ptr int64 long) msvcp120.?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV12@_JH@Z +@ thiscall -arch=i386 ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@_JH@Z(ptr int64 long) msvcp120.?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@_JH@Z +@ cdecl -arch=win64 ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JH@Z(ptr long long) msvcp120.?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JH@Z +@ cdecl -arch=arm ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@V?$fpos@H@2@@Z(ptr long long int64 long long) msvcp120.?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@V?$fpos@H@2@@Z +@ thiscall -arch=i386 ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z(ptr long long int64 long long) msvcp120.?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z +@ cdecl -arch=win64 ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z(ptr ptr) msvcp120.?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z +@ cdecl -arch=arm ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@_JH@Z(ptr int64 long) msvcp120.?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@_JH@Z +@ thiscall -arch=i386 ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_JH@Z(ptr int64 long) msvcp120.?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_JH@Z +@ cdecl -arch=win64 ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JH@Z(ptr long long) msvcp120.?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JH@Z +@ cdecl -arch=arm ?seekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAA?AV?$fpos@H@2@V32@H@Z(ptr ptr long long int64 long long long) msvcp120.?seekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAA?AV?$fpos@H@2@V32@H@Z +@ thiscall -arch=i386 ?seekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z(ptr ptr long long int64 long long long) msvcp120.?seekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z +@ cdecl -arch=win64 ?seekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z(ptr ptr ptr long) msvcp120.?seekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z +@ cdecl -arch=arm ?seekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAA?AV?$fpos@H@2@V32@H@Z(ptr ptr long long int64 long long long) msvcp120.?seekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAA?AV?$fpos@H@2@V32@H@Z +@ thiscall -arch=i386 ?seekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z(ptr ptr long long int64 long long long) msvcp120.?seekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z +@ cdecl -arch=win64 ?seekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z(ptr ptr ptr long) msvcp120.?seekpos@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z +@ cdecl -arch=arm ?seekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAA?AV?$fpos@H@2@V32@H@Z(ptr ptr long long int64 long long long) msvcp120.?seekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAA?AV?$fpos@H@2@V32@H@Z +@ thiscall -arch=i386 ?seekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z(ptr ptr long long int64 long long long) msvcp120.?seekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE?AV?$fpos@H@2@V32@H@Z +@ cdecl -arch=win64 ?seekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z(ptr ptr ptr long) msvcp120.?seekpos@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA?AV?$fpos@H@2@V32@H@Z +@ cdecl ?set_new_handler@std@@YAP6AXXZP6AXXZ@Z(ptr) msvcp120.?set_new_handler@std@@YAP6AXXZP6AXXZ@Z +@ stub -arch=arm ?set_rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAXPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z +@ stub -arch=i386 ?set_rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z +@ stub -arch=win64 ?set_rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z +@ stub -arch=arm ?set_rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAXPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z +@ stub -arch=i386 ?set_rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z +@ stub -arch=win64 ?set_rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z +@ stub -arch=arm ?set_rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAXPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z +@ stub -arch=i386 ?set_rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z +@ stub -arch=win64 ?set_rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z +@ cdecl ?setbase@std@@YA?AU?$_Smanip@H@1@H@Z(ptr long) msvcp120.?setbase@std@@YA?AU?$_Smanip@H@1@H@Z +@ cdecl -arch=arm ?setbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAAPAV12@PAD_J@Z(ptr ptr int64) msvcp120.?setbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAAPAV12@PAD_J@Z +@ thiscall -arch=i386 ?setbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEPAV12@PAD_J@Z(ptr ptr int64) msvcp120.?setbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEPAV12@PAD_J@Z +@ cdecl -arch=win64 ?setbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAPEAV12@PEAD_J@Z(ptr ptr long) msvcp120.?setbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAPEAV12@PEAD_J@Z +@ cdecl -arch=arm ?setbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAAPAV12@PAG_J@Z(ptr ptr int64) msvcp120.?setbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAAPAV12@PAG_J@Z +@ thiscall -arch=i386 ?setbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEPAV12@PAG_J@Z(ptr ptr int64) msvcp120.?setbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEPAV12@PAG_J@Z +@ cdecl -arch=win64 ?setbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAPEAV12@PEAG_J@Z(ptr ptr long) msvcp120.?setbuf@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAPEAV12@PEAG_J@Z +@ cdecl -arch=arm ?setbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAAPAV12@PA_W_J@Z(ptr ptr int64) msvcp120.?setbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAAPAV12@PA_W_J@Z +@ thiscall -arch=i386 ?setbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEPAV12@PA_W_J@Z(ptr ptr int64) msvcp120.?setbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEPAV12@PA_W_J@Z +@ cdecl -arch=win64 ?setbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAPEAV12@PEA_W_J@Z(ptr ptr long) msvcp120.?setbuf@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAPEAV12@PEA_W_J@Z +@ cdecl -arch=arm ?setf@ios_base@std@@QAAHH@Z(ptr long) msvcp120.?setf@ios_base@std@@QAAHH@Z +@ thiscall -arch=i386 ?setf@ios_base@std@@QAEHH@Z(ptr long) msvcp120.?setf@ios_base@std@@QAEHH@Z +@ cdecl -arch=win64 ?setf@ios_base@std@@QEAAHH@Z(ptr long) msvcp120.?setf@ios_base@std@@QEAAHH@Z +@ cdecl -arch=arm ?setf@ios_base@std@@QAAHHH@Z(ptr long long) msvcp120.?setf@ios_base@std@@QAAHHH@Z +@ thiscall -arch=i386 ?setf@ios_base@std@@QAEHHH@Z(ptr long long) msvcp120.?setf@ios_base@std@@QAEHHH@Z +@ cdecl -arch=win64 ?setf@ios_base@std@@QEAAHHH@Z(ptr long long) msvcp120.?setf@ios_base@std@@QEAAHHH@Z +@ cdecl -arch=arm ?setg@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXPAD00@Z(ptr ptr ptr ptr) msvcp120.?setg@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXPAD00@Z +@ thiscall -arch=i386 ?setg@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXPAD00@Z(ptr ptr ptr ptr) msvcp120.?setg@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXPAD00@Z +@ cdecl -arch=win64 ?setg@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAD00@Z(ptr ptr ptr ptr) msvcp120.?setg@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAD00@Z +@ cdecl -arch=arm ?setg@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXPAG00@Z(ptr ptr ptr ptr) msvcp120.?setg@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXPAG00@Z +@ thiscall -arch=i386 ?setg@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXPAG00@Z(ptr ptr ptr ptr) msvcp120.?setg@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXPAG00@Z +@ cdecl -arch=win64 ?setg@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAG00@Z(ptr ptr ptr ptr) msvcp120.?setg@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAG00@Z +@ cdecl -arch=arm ?setg@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXPA_W00@Z(ptr ptr ptr ptr) msvcp120.?setg@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXPA_W00@Z +@ thiscall -arch=i386 ?setg@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPA_W00@Z(ptr ptr ptr ptr) msvcp120.?setg@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPA_W00@Z +@ cdecl -arch=win64 ?setg@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEA_W00@Z(ptr ptr ptr ptr) msvcp120.?setg@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEA_W00@Z +@ cdecl ?setiosflags@std@@YA?AU?$_Smanip@H@1@H@Z(ptr long) msvcp120.?setiosflags@std@@YA?AU?$_Smanip@H@1@H@Z +@ cdecl -arch=arm ?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXPAD00@Z(ptr ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXPAD00@Z +@ thiscall -arch=i386 ?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXPAD00@Z(ptr ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXPAD00@Z +@ cdecl -arch=win64 ?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAD00@Z(ptr ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAD00@Z +@ cdecl -arch=arm ?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXPAD0@Z(ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXPAD0@Z +@ thiscall -arch=i386 ?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXPAD0@Z(ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXPAD0@Z +@ cdecl -arch=win64 ?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAD0@Z(ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXPEAD0@Z +@ cdecl -arch=arm ?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXPAG00@Z(ptr ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXPAG00@Z +@ thiscall -arch=i386 ?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXPAG00@Z(ptr ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXPAG00@Z +@ cdecl -arch=win64 ?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAG00@Z(ptr ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAG00@Z +@ cdecl -arch=arm ?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXPAG0@Z(ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXPAG0@Z +@ thiscall -arch=i386 ?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXPAG0@Z(ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXPAG0@Z +@ cdecl -arch=win64 ?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAG0@Z(ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXPEAG0@Z +@ cdecl -arch=arm ?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXPA_W00@Z(ptr ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXPA_W00@Z +@ thiscall -arch=i386 ?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPA_W00@Z(ptr ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPA_W00@Z +@ cdecl -arch=win64 ?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEA_W00@Z(ptr ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEA_W00@Z +@ cdecl -arch=arm ?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXPA_W0@Z(ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXPA_W0@Z +@ thiscall -arch=i386 ?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPA_W0@Z(ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXPA_W0@Z +@ cdecl -arch=win64 ?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEA_W0@Z(ptr ptr ptr) msvcp120.?setp@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEA_W0@Z +@ cdecl ?setprecision@std@@YA?AU?$_Smanip@_J@1@_J@Z(ptr int64) msvcp120.?setprecision@std@@YA?AU?$_Smanip@_J@1@_J@Z +@ cdecl -arch=arm ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAXH_N@Z(ptr long long) msvcp120.?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAXH_N@Z +@ thiscall -arch=i386 ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z(ptr long long) msvcp120.?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z +@ cdecl -arch=win64 ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z(ptr long long) msvcp120.?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z +@ cdecl -arch=arm ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAXI@Z(ptr long) msvcp120.?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAXI@Z +@ thiscall -arch=i386 ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXI@Z(ptr long) msvcp120.?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXI@Z +@ cdecl -arch=win64 ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXI@Z(ptr long) msvcp120.?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXI@Z +@ cdecl -arch=arm ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAXH_N@Z(ptr long long) msvcp120.?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAXH_N@Z +@ thiscall -arch=i386 ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXH_N@Z(ptr long long) msvcp120.?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXH_N@Z +@ cdecl -arch=win64 ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXH_N@Z(ptr long long) msvcp120.?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXH_N@Z +@ cdecl -arch=arm ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAXI@Z(ptr long) msvcp120.?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAXI@Z +@ thiscall -arch=i386 ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXI@Z(ptr long) msvcp120.?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXI@Z +@ cdecl -arch=win64 ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXI@Z(ptr long) msvcp120.?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXI@Z +@ cdecl -arch=arm ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAXH_N@Z(ptr long long) msvcp120.?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAXH_N@Z +@ thiscall -arch=i386 ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z(ptr long long) msvcp120.?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z +@ cdecl -arch=win64 ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXH_N@Z(ptr long long) msvcp120.?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXH_N@Z +@ cdecl -arch=arm ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAXI@Z(ptr long) msvcp120.?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAXI@Z +@ thiscall -arch=i386 ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXI@Z(ptr long) msvcp120.?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXI@Z +@ cdecl -arch=win64 ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXI@Z(ptr long) msvcp120.?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXI@Z +@ cdecl -arch=arm ?setstate@ios_base@std@@QAAXH@Z(ptr long) msvcp120.?setstate@ios_base@std@@QAAXH@Z +@ thiscall -arch=i386 ?setstate@ios_base@std@@QAEXH@Z(ptr long) msvcp120.?setstate@ios_base@std@@QAEXH@Z +@ cdecl -arch=win64 ?setstate@ios_base@std@@QEAAXH@Z(ptr long) msvcp120.?setstate@ios_base@std@@QEAAXH@Z +@ cdecl -arch=arm ?setstate@ios_base@std@@QAAXH_N@Z(ptr long long) msvcp120.?setstate@ios_base@std@@QAAXH_N@Z +@ thiscall -arch=i386 ?setstate@ios_base@std@@QAEXH_N@Z(ptr long long) msvcp120.?setstate@ios_base@std@@QAEXH_N@Z +@ cdecl -arch=win64 ?setstate@ios_base@std@@QEAAXH_N@Z(ptr long long) msvcp120.?setstate@ios_base@std@@QEAAXH_N@Z +@ cdecl -arch=arm ?setstate@ios_base@std@@QAAXI@Z(ptr long) msvcp120.?setstate@ios_base@std@@QAAXI@Z +@ thiscall -arch=i386 ?setstate@ios_base@std@@QAEXI@Z(ptr long) msvcp120.?setstate@ios_base@std@@QAEXI@Z +@ cdecl -arch=win64 ?setstate@ios_base@std@@QEAAXI@Z(ptr long) msvcp120.?setstate@ios_base@std@@QEAAXI@Z +@ cdecl ?setw@std@@YA?AU?$_Smanip@_J@1@_J@Z(ptr int64) msvcp120.?setw@std@@YA?AU?$_Smanip@_J@1@_J@Z +@ cdecl -arch=arm ?sgetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAHXZ(ptr) msvcp120.?sgetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAHXZ +@ thiscall -arch=i386 ?sgetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ(ptr) msvcp120.?sgetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ +@ cdecl -arch=win64 ?sgetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ(ptr) msvcp120.?sgetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ +@ cdecl -arch=arm ?sgetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAGXZ(ptr) msvcp120.?sgetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAGXZ +@ thiscall -arch=i386 ?sgetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGXZ(ptr) msvcp120.?sgetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGXZ +@ cdecl -arch=win64 ?sgetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ(ptr) msvcp120.?sgetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ +@ cdecl -arch=arm ?sgetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAGXZ(ptr) msvcp120.?sgetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAGXZ +@ thiscall -arch=i386 ?sgetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEGXZ(ptr) msvcp120.?sgetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEGXZ +@ cdecl -arch=win64 ?sgetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ(ptr) msvcp120.?sgetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ +@ cdecl -ret64 -arch=arm ?sgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA_JPAD_J@Z(ptr ptr int64) msvcp120.?sgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA_JPAD_J@Z +@ thiscall -ret64 -arch=i386 ?sgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE_JPAD_J@Z(ptr ptr int64) msvcp120.?sgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE_JPAD_J@Z +@ cdecl -arch=win64 ?sgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_J@Z(ptr ptr long) msvcp120.?sgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_J@Z +@ cdecl -ret64 -arch=arm ?sgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA_JPAG_J@Z(ptr ptr int64) msvcp120.?sgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA_JPAG_J@Z +@ thiscall -ret64 -arch=i386 ?sgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE_JPAG_J@Z(ptr ptr int64) msvcp120.?sgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE_JPAG_J@Z +@ cdecl -arch=win64 ?sgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_J@Z(ptr ptr long) msvcp120.?sgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_J@Z +@ cdecl -ret64 -arch=arm ?sgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA_JPA_W_J@Z(ptr ptr int64) msvcp120.?sgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA_JPA_W_J@Z +@ thiscall -ret64 -arch=i386 ?sgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE_JPA_W_J@Z(ptr ptr int64) msvcp120.?sgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE_JPA_W_J@Z +@ cdecl -arch=win64 ?sgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_J@Z(ptr ptr long) msvcp120.?sgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_J@Z +@ cdecl -ret64 -arch=arm ?showmanyc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAA_JXZ(ptr) msvcp120.?showmanyc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAA_JXZ +@ thiscall -ret64 -arch=i386 ?showmanyc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE_JXZ(ptr) msvcp120.?showmanyc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE_JXZ +@ cdecl -arch=win64 ?showmanyc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JXZ(ptr) msvcp120.?showmanyc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JXZ +@ cdecl -ret64 -arch=arm ?showmanyc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAA_JXZ(ptr) msvcp120.?showmanyc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAA_JXZ +@ thiscall -ret64 -arch=i386 ?showmanyc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE_JXZ(ptr) msvcp120.?showmanyc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE_JXZ +@ cdecl -arch=win64 ?showmanyc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JXZ(ptr) msvcp120.?showmanyc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JXZ +@ cdecl -ret64 -arch=arm ?showmanyc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAA_JXZ(ptr) msvcp120.?showmanyc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAA_JXZ +@ thiscall -ret64 -arch=i386 ?showmanyc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE_JXZ(ptr) msvcp120.?showmanyc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE_JXZ +@ cdecl -arch=win64 ?showmanyc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JXZ(ptr) msvcp120.?showmanyc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JXZ +@ cdecl -arch=arm ?snextc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAHXZ(ptr) msvcp120.?snextc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAHXZ +@ thiscall -arch=i386 ?snextc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ(ptr) msvcp120.?snextc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ +@ cdecl -arch=win64 ?snextc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ(ptr) msvcp120.?snextc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ +@ cdecl -arch=arm ?snextc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAGXZ(ptr) msvcp120.?snextc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAGXZ +@ thiscall -arch=i386 ?snextc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGXZ(ptr) msvcp120.?snextc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGXZ +@ cdecl -arch=win64 ?snextc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ(ptr) msvcp120.?snextc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ +@ cdecl -arch=arm ?snextc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAGXZ(ptr) msvcp120.?snextc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAGXZ +@ thiscall -arch=i386 ?snextc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEGXZ(ptr) msvcp120.?snextc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEGXZ +@ cdecl -arch=win64 ?snextc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ(ptr) msvcp120.?snextc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ +@ cdecl -arch=arm ?sputbackc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAHD@Z(ptr long) msvcp120.?sputbackc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAHD@Z +@ thiscall -arch=i386 ?sputbackc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z(ptr long) msvcp120.?sputbackc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z +@ cdecl -arch=win64 ?sputbackc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHD@Z(ptr long) msvcp120.?sputbackc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHD@Z +@ cdecl -arch=arm ?sputbackc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAGG@Z(ptr long) msvcp120.?sputbackc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAGG@Z +@ thiscall -arch=i386 ?sputbackc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGG@Z(ptr long) msvcp120.?sputbackc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGG@Z +@ cdecl -arch=win64 ?sputbackc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGG@Z(ptr long) msvcp120.?sputbackc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGG@Z +@ cdecl -arch=arm ?sputbackc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAG_W@Z(ptr long) msvcp120.?sputbackc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAG_W@Z +@ thiscall -arch=i386 ?sputbackc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEG_W@Z(ptr long) msvcp120.?sputbackc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEG_W@Z +@ cdecl -arch=win64 ?sputbackc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAG_W@Z(ptr long) msvcp120.?sputbackc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAG_W@Z +@ cdecl -arch=arm ?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAHD@Z(ptr long) msvcp120.?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAHD@Z +@ thiscall -arch=i386 ?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z(ptr long) msvcp120.?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z +@ cdecl -arch=win64 ?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHD@Z(ptr long) msvcp120.?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHD@Z +@ cdecl -arch=arm ?sputc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAGG@Z(ptr long) msvcp120.?sputc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAGG@Z +@ thiscall -arch=i386 ?sputc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGG@Z(ptr long) msvcp120.?sputc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGG@Z +@ cdecl -arch=win64 ?sputc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGG@Z(ptr long) msvcp120.?sputc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGG@Z +@ cdecl -arch=arm ?sputc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAG_W@Z(ptr long) msvcp120.?sputc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAG_W@Z +@ thiscall -arch=i386 ?sputc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEG_W@Z(ptr long) msvcp120.?sputc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEG_W@Z +@ cdecl -arch=win64 ?sputc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAG_W@Z(ptr long) msvcp120.?sputc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAG_W@Z +@ cdecl -ret64 -arch=arm ?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA_JPBD_J@Z(ptr str int64) msvcp120.?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAA_JPBD_J@Z +@ thiscall -ret64 -arch=i386 ?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE_JPBD_J@Z(ptr str int64) msvcp120.?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE_JPBD_J@Z +@ cdecl -arch=win64 ?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JPEBD_J@Z(ptr str long) msvcp120.?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JPEBD_J@Z +@ cdecl -ret64 -arch=arm ?sputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA_JPBG_J@Z(ptr ptr int64) msvcp120.?sputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAA_JPBG_J@Z +@ thiscall -ret64 -arch=i386 ?sputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE_JPBG_J@Z(ptr ptr int64) msvcp120.?sputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAE_JPBG_J@Z +@ cdecl -arch=win64 ?sputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA_JPEBG_J@Z(ptr ptr long) msvcp120.?sputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA_JPEBG_J@Z +@ cdecl -ret64 -arch=arm ?sputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA_JPB_W_J@Z(ptr wstr int64) msvcp120.?sputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAA_JPB_W_J@Z +@ thiscall -ret64 -arch=i386 ?sputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE_JPB_W_J@Z(ptr wstr int64) msvcp120.?sputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAE_JPB_W_J@Z +@ cdecl -arch=win64 ?sputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JPEB_W_J@Z(ptr ptr long) msvcp120.?sputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JPEB_W_J@Z +@ stub -arch=arm ?start@agent@Concurrency@@QAA_NXZ +@ stub -arch=i386 ?start@agent@Concurrency@@QAE_NXZ +@ stub -arch=win64 ?start@agent@Concurrency@@QEAA_NXZ +@ stub -arch=arm ?status@agent@Concurrency@@QAA?AW4agent_status@2@XZ +@ stub -arch=i386 ?status@agent@Concurrency@@QAE?AW4agent_status@2@XZ +@ stub -arch=win64 ?status@agent@Concurrency@@QEAA?AW4agent_status@2@XZ +@ stub -arch=arm ?status_port@agent@Concurrency@@QAAPAV?$ISource@W4agent_status@Concurrency@@@2@XZ +@ stub -arch=i386 ?status_port@agent@Concurrency@@QAEPAV?$ISource@W4agent_status@Concurrency@@@2@XZ +@ stub -arch=win64 ?status_port@agent@Concurrency@@QEAAPEAV?$ISource@W4agent_status@Concurrency@@@2@XZ +@ cdecl -arch=arm ?stossc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAXXZ(ptr) msvcp120.?stossc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ?stossc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ(ptr) msvcp120.?stossc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ?stossc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAXXZ(ptr) msvcp120.?stossc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ?stossc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAXXZ(ptr) msvcp120.?stossc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ?stossc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEXXZ(ptr) msvcp120.?stossc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ?stossc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAXXZ(ptr) msvcp120.?stossc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ?stossc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAXXZ(ptr) msvcp120.?stossc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAXXZ +@ thiscall -arch=i386 ?stossc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEXXZ(ptr) msvcp120.?stossc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEXXZ +@ cdecl -arch=win64 ?stossc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAXXZ(ptr) msvcp120.?stossc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAXXZ +@ cdecl -arch=arm ?sungetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAHXZ(ptr) msvcp120.?sungetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAAHXZ +@ thiscall -arch=i386 ?sungetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ(ptr) msvcp120.?sungetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHXZ +@ cdecl -arch=win64 ?sungetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ(ptr) msvcp120.?sungetc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHXZ +@ cdecl -arch=arm ?sungetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAGXZ(ptr) msvcp120.?sungetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAAGXZ +@ thiscall -arch=i386 ?sungetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGXZ(ptr) msvcp120.?sungetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEGXZ +@ cdecl -arch=win64 ?sungetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ(ptr) msvcp120.?sungetc@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAAGXZ +@ cdecl -arch=arm ?sungetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAGXZ(ptr) msvcp120.?sungetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAAGXZ +@ thiscall -arch=i386 ?sungetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEGXZ(ptr) msvcp120.?sungetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEGXZ +@ cdecl -arch=win64 ?sungetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ(ptr) msvcp120.?sungetc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAAGXZ +@ cdecl -arch=arm ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_iostream@DU?$char_traits@D@std@@@std@@IAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_iostream@DU?$char_traits@D@std@@@std@@IAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_iostream@DU?$char_traits@D@std@@@std@@IAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_iostream@DU?$char_traits@D@std@@@std@@IAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_iostream@DU?$char_traits@D@std@@@std@@IEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_iostream@DU?$char_traits@D@std@@@std@@IEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_iostream@GU?$char_traits@G@std@@@std@@IAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_iostream@GU?$char_traits@G@std@@@std@@IAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_iostream@GU?$char_traits@G@std@@@std@@IAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_iostream@GU?$char_traits@G@std@@@std@@IAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_iostream@GU?$char_traits@G@std@@@std@@IEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_iostream@GU?$char_traits@G@std@@@std@@IEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_iostream@_WU?$char_traits@_W@std@@@std@@IEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_istream@DU?$char_traits@D@std@@@std@@IAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_istream@DU?$char_traits@D@std@@@std@@IAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_istream@DU?$char_traits@D@std@@@std@@IAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_istream@DU?$char_traits@D@std@@@std@@IAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_istream@DU?$char_traits@D@std@@@std@@IEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_istream@DU?$char_traits@D@std@@@std@@IEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_istream@GU?$char_traits@G@std@@@std@@IAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_istream@GU?$char_traits@G@std@@@std@@IAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_istream@GU?$char_traits@G@std@@@std@@IAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_istream@GU?$char_traits@G@std@@@std@@IAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_istream@GU?$char_traits@G@std@@@std@@IEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_istream@GU?$char_traits@G@std@@@std@@IEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_istream@_WU?$char_traits@_W@std@@@std@@IAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_istream@_WU?$char_traits@_W@std@@@std@@IAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_istream@_WU?$char_traits@_W@std@@@std@@IAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_istream@_WU?$char_traits@_W@std@@@std@@IAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_istream@_WU?$char_traits@_W@std@@@std@@IEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_istream@_WU?$char_traits@_W@std@@@std@@IEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_ostream@DU?$char_traits@D@std@@@std@@IAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ostream@DU?$char_traits@D@std@@@std@@IAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_ostream@DU?$char_traits@D@std@@@std@@IAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ostream@DU?$char_traits@D@std@@@std@@IAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_ostream@DU?$char_traits@D@std@@@std@@IEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ostream@DU?$char_traits@D@std@@@std@@IEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_ostream@GU?$char_traits@G@std@@@std@@IAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ostream@GU?$char_traits@G@std@@@std@@IAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_ostream@GU?$char_traits@G@std@@@std@@IAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ostream@GU?$char_traits@G@std@@@std@@IAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_ostream@GU?$char_traits@G@std@@@std@@IEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ostream@GU?$char_traits@G@std@@@std@@IEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@IEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_streambuf@GU?$char_traits@G@std@@@std@@IEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXAAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAAXAEAV12@@Z +@ cdecl -arch=arm ?swap@ios_base@std@@QAAXAAV12@@Z(ptr ptr) msvcp120.?swap@ios_base@std@@QAAXAAV12@@Z +@ thiscall -arch=i386 ?swap@ios_base@std@@QAEXAAV12@@Z(ptr ptr) msvcp120.?swap@ios_base@std@@QAEXAAV12@@Z +@ cdecl -arch=win64 ?swap@ios_base@std@@QEAAXAEAV12@@Z(ptr ptr) msvcp120.?swap@ios_base@std@@QEAAXAEAV12@@Z +@ cdecl -arch=arm ?sync@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAHXZ(ptr) msvcp120.?sync@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAHXZ +@ thiscall -arch=i386 ?sync@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ(ptr) msvcp120.?sync@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ +@ cdecl -arch=win64 ?sync@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ(ptr) msvcp120.?sync@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ +@ cdecl -arch=arm ?sync@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAHXZ(ptr) msvcp120.?sync@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAHXZ +@ thiscall -arch=i386 ?sync@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEHXZ(ptr) msvcp120.?sync@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEHXZ +@ cdecl -arch=win64 ?sync@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAHXZ(ptr) msvcp120.?sync@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAHXZ +@ cdecl -arch=arm ?sync@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAHXZ(ptr) msvcp120.?sync@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAHXZ +@ thiscall -arch=i386 ?sync@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEHXZ(ptr) msvcp120.?sync@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEHXZ +@ cdecl -arch=win64 ?sync@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAHXZ(ptr) msvcp120.?sync@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAHXZ +@ cdecl -arch=arm ?sync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAAHXZ(ptr) msvcp120.?sync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAAHXZ +@ thiscall -arch=i386 ?sync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHXZ(ptr) msvcp120.?sync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHXZ +@ cdecl -arch=win64 ?sync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ(ptr) msvcp120.?sync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ +@ cdecl -arch=arm ?sync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAAHXZ(ptr) msvcp120.?sync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAAHXZ +@ thiscall -arch=i386 ?sync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEHXZ(ptr) msvcp120.?sync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEHXZ +@ cdecl -arch=win64 ?sync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAHXZ(ptr) msvcp120.?sync@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAHXZ +@ cdecl -arch=arm ?sync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAAHXZ(ptr) msvcp120.?sync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAAHXZ +@ thiscall -arch=i386 ?sync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEHXZ(ptr) msvcp120.?sync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEHXZ +@ cdecl -arch=win64 ?sync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAHXZ(ptr) msvcp120.?sync@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAHXZ +@ cdecl ?sync_with_stdio@ios_base@std@@SA_N_N@Z(long) msvcp120.?sync_with_stdio@ios_base@std@@SA_N_N@Z +@ stub -arch=arm ?table@?$ctype@D@std@@QBAPBFXZ +@ stub -arch=i386 ?table@?$ctype@D@std@@QBEPBFXZ +@ stub -arch=win64 ?table@?$ctype@D@std@@QEBAPEBFXZ +@ extern -arch=win32 ?table_size@?$ctype@D@std@@2IB msvcp120.?table_size@?$ctype@D@std@@2IB +@ extern -arch=win64 ?table_size@?$ctype@D@std@@2_KB msvcp120.?table_size@?$ctype@D@std@@2_KB +@ cdecl -arch=arm ?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAA?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAA?AV?$fpos@H@2@XZ +@ thiscall -arch=i386 ?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@XZ +@ cdecl -arch=win64 ?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@XZ +@ cdecl -arch=arm ?tellg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAA?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAA?AV?$fpos@H@2@XZ +@ thiscall -arch=i386 ?tellg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@XZ +@ cdecl -arch=win64 ?tellg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@XZ +@ cdecl -arch=arm ?tellg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAA?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAA?AV?$fpos@H@2@XZ +@ thiscall -arch=i386 ?tellg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@XZ +@ cdecl -arch=win64 ?tellg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@XZ +@ cdecl -arch=arm ?tellp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAA?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAA?AV?$fpos@H@2@XZ +@ thiscall -arch=i386 ?tellp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@XZ +@ cdecl -arch=win64 ?tellp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@XZ +@ cdecl -arch=arm ?tellp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAA?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAA?AV?$fpos@H@2@XZ +@ thiscall -arch=i386 ?tellp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@XZ +@ cdecl -arch=win64 ?tellp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@XZ +@ cdecl -arch=arm ?tellp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAA?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAA?AV?$fpos@H@2@XZ +@ thiscall -arch=i386 ?tellp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@XZ +@ cdecl -arch=win64 ?tellp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@XZ(ptr ptr) msvcp120.?tellp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@XZ +@ cdecl -arch=arm ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAPAV?$basic_ostream@DU?$char_traits@D@std@@@2@PAV32@@Z(ptr ptr) msvcp120.?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QAAPAV?$basic_ostream@DU?$char_traits@D@std@@@2@PAV32@@Z +@ thiscall -arch=i386 ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@PAV32@@Z(ptr ptr) msvcp120.?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@PAV32@@Z +@ cdecl -arch=win64 ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAPEAV?$basic_ostream@DU?$char_traits@D@std@@@2@PEAV32@@Z(ptr ptr) msvcp120.?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAPEAV?$basic_ostream@DU?$char_traits@D@std@@@2@PEAV32@@Z +@ cdecl -arch=arm ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBAPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ(ptr) msvcp120.?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBAPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ +@ thiscall -arch=i386 ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ(ptr) msvcp120.?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ +@ cdecl -arch=win64 ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ(ptr) msvcp120.?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ +@ cdecl -arch=arm ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAPAV?$basic_ostream@GU?$char_traits@G@std@@@2@PAV32@@Z(ptr ptr) msvcp120.?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QAAPAV?$basic_ostream@GU?$char_traits@G@std@@@2@PAV32@@Z +@ thiscall -arch=i386 ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEPAV?$basic_ostream@GU?$char_traits@G@std@@@2@PAV32@@Z(ptr ptr) msvcp120.?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEPAV?$basic_ostream@GU?$char_traits@G@std@@@2@PAV32@@Z +@ cdecl -arch=win64 ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAPEAV?$basic_ostream@GU?$char_traits@G@std@@@2@PEAV32@@Z(ptr ptr) msvcp120.?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAPEAV?$basic_ostream@GU?$char_traits@G@std@@@2@PEAV32@@Z +@ cdecl -arch=arm ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QBAPAV?$basic_ostream@GU?$char_traits@G@std@@@2@XZ(ptr) msvcp120.?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QBAPAV?$basic_ostream@GU?$char_traits@G@std@@@2@XZ +@ thiscall -arch=i386 ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_ostream@GU?$char_traits@G@std@@@2@XZ(ptr) msvcp120.?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_ostream@GU?$char_traits@G@std@@@2@XZ +@ cdecl -arch=win64 ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_ostream@GU?$char_traits@G@std@@@2@XZ(ptr) msvcp120.?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_ostream@GU?$char_traits@G@std@@@2@XZ +@ cdecl -arch=arm ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@PAV32@@Z(ptr ptr) msvcp120.?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAAPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@PAV32@@Z +@ thiscall -arch=i386 ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@PAV32@@Z(ptr ptr) msvcp120.?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@PAV32@@Z +@ cdecl -arch=win64 ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAPEAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@PEAV32@@Z(ptr ptr) msvcp120.?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAPEAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@PEAV32@@Z +@ cdecl -arch=arm ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBAPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ(ptr) msvcp120.?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBAPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ +@ thiscall -arch=i386 ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ(ptr) msvcp120.?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ +@ cdecl -arch=win64 ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ(ptr) msvcp120.?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ +@ cdecl -arch=arm ?tolower@?$ctype@D@std@@QBADD@Z(ptr long) msvcp120.?tolower@?$ctype@D@std@@QBADD@Z +@ thiscall -arch=i386 ?tolower@?$ctype@D@std@@QBEDD@Z(ptr long) msvcp120.?tolower@?$ctype@D@std@@QBEDD@Z +@ cdecl -arch=win64 ?tolower@?$ctype@D@std@@QEBADD@Z(ptr long) msvcp120.?tolower@?$ctype@D@std@@QEBADD@Z +@ cdecl -arch=arm ?tolower@?$ctype@D@std@@QBAPBDPADPBD@Z(ptr ptr ptr) msvcp120.?tolower@?$ctype@D@std@@QBAPBDPADPBD@Z +@ thiscall -arch=i386 ?tolower@?$ctype@D@std@@QBEPBDPADPBD@Z(ptr ptr ptr) msvcp120.?tolower@?$ctype@D@std@@QBEPBDPADPBD@Z +@ cdecl -arch=win64 ?tolower@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z(ptr ptr ptr) msvcp120.?tolower@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z +@ cdecl -arch=arm ?tolower@?$ctype@G@std@@QBAGG@Z(ptr long) msvcp120.?tolower@?$ctype@G@std@@QBAGG@Z +@ thiscall -arch=i386 ?tolower@?$ctype@G@std@@QBEGG@Z(ptr long) msvcp120.?tolower@?$ctype@G@std@@QBEGG@Z +@ cdecl -arch=win64 ?tolower@?$ctype@G@std@@QEBAGG@Z(ptr long) msvcp120.?tolower@?$ctype@G@std@@QEBAGG@Z +@ cdecl -arch=arm ?tolower@?$ctype@G@std@@QBAPBGPAGPBG@Z(ptr ptr ptr) msvcp120.?tolower@?$ctype@G@std@@QBAPBGPAGPBG@Z +@ thiscall -arch=i386 ?tolower@?$ctype@G@std@@QBEPBGPAGPBG@Z(ptr ptr ptr) msvcp120.?tolower@?$ctype@G@std@@QBEPBGPAGPBG@Z +@ cdecl -arch=win64 ?tolower@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z(ptr ptr ptr) msvcp120.?tolower@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z +@ cdecl -arch=arm ?tolower@?$ctype@_W@std@@QBAPB_WPA_WPB_W@Z(ptr ptr ptr) msvcp120.?tolower@?$ctype@_W@std@@QBAPB_WPA_WPB_W@Z +@ thiscall -arch=i386 ?tolower@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z(ptr ptr ptr) msvcp120.?tolower@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z +@ cdecl -arch=win64 ?tolower@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z(ptr ptr ptr) msvcp120.?tolower@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z +@ cdecl -arch=arm ?tolower@?$ctype@_W@std@@QBA_W_W@Z(ptr long) msvcp120.?tolower@?$ctype@_W@std@@QBA_W_W@Z +@ thiscall -arch=i386 ?tolower@?$ctype@_W@std@@QBE_W_W@Z(ptr long) msvcp120.?tolower@?$ctype@_W@std@@QBE_W_W@Z +@ cdecl -arch=win64 ?tolower@?$ctype@_W@std@@QEBA_W_W@Z(ptr long) msvcp120.?tolower@?$ctype@_W@std@@QEBA_W_W@Z +@ cdecl -arch=arm ?toupper@?$ctype@D@std@@QBADD@Z(ptr long) msvcp120.?toupper@?$ctype@D@std@@QBADD@Z +@ thiscall -arch=i386 ?toupper@?$ctype@D@std@@QBEDD@Z(ptr long) msvcp120.?toupper@?$ctype@D@std@@QBEDD@Z +@ cdecl -arch=win64 ?toupper@?$ctype@D@std@@QEBADD@Z(ptr long) msvcp120.?toupper@?$ctype@D@std@@QEBADD@Z +@ cdecl -arch=arm ?toupper@?$ctype@D@std@@QBAPBDPADPBD@Z(ptr ptr ptr) msvcp120.?toupper@?$ctype@D@std@@QBAPBDPADPBD@Z +@ thiscall -arch=i386 ?toupper@?$ctype@D@std@@QBEPBDPADPBD@Z(ptr ptr ptr) msvcp120.?toupper@?$ctype@D@std@@QBEPBDPADPBD@Z +@ cdecl -arch=win64 ?toupper@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z(ptr ptr ptr) msvcp120.?toupper@?$ctype@D@std@@QEBAPEBDPEADPEBD@Z +@ cdecl -arch=arm ?toupper@?$ctype@G@std@@QBAGG@Z(ptr long) msvcp120.?toupper@?$ctype@G@std@@QBAGG@Z +@ thiscall -arch=i386 ?toupper@?$ctype@G@std@@QBEGG@Z(ptr long) msvcp120.?toupper@?$ctype@G@std@@QBEGG@Z +@ cdecl -arch=win64 ?toupper@?$ctype@G@std@@QEBAGG@Z(ptr long) msvcp120.?toupper@?$ctype@G@std@@QEBAGG@Z +@ cdecl -arch=arm ?toupper@?$ctype@G@std@@QBAPBGPAGPBG@Z(ptr ptr ptr) msvcp120.?toupper@?$ctype@G@std@@QBAPBGPAGPBG@Z +@ thiscall -arch=i386 ?toupper@?$ctype@G@std@@QBEPBGPAGPBG@Z(ptr ptr ptr) msvcp120.?toupper@?$ctype@G@std@@QBEPBGPAGPBG@Z +@ cdecl -arch=win64 ?toupper@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z(ptr ptr ptr) msvcp120.?toupper@?$ctype@G@std@@QEBAPEBGPEAGPEBG@Z +@ cdecl -arch=arm ?toupper@?$ctype@_W@std@@QBAPB_WPA_WPB_W@Z(ptr ptr ptr) msvcp120.?toupper@?$ctype@_W@std@@QBAPB_WPA_WPB_W@Z +@ thiscall -arch=i386 ?toupper@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z(ptr ptr ptr) msvcp120.?toupper@?$ctype@_W@std@@QBEPB_WPA_WPB_W@Z +@ cdecl -arch=win64 ?toupper@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z(ptr ptr ptr) msvcp120.?toupper@?$ctype@_W@std@@QEBAPEB_WPEA_WPEB_W@Z +@ cdecl -arch=arm ?toupper@?$ctype@_W@std@@QBA_W_W@Z(ptr long) msvcp120.?toupper@?$ctype@_W@std@@QBA_W_W@Z +@ thiscall -arch=i386 ?toupper@?$ctype@_W@std@@QBE_W_W@Z(ptr long) msvcp120.?toupper@?$ctype@_W@std@@QBE_W_W@Z +@ cdecl -arch=win64 ?toupper@?$ctype@_W@std@@QEBA_W_W@Z(ptr long) msvcp120.?toupper@?$ctype@_W@std@@QEBA_W_W@Z +@ stub ?try_to_lock@std@@3Utry_to_lock_t@1@B +@ cdecl -arch=arm ?uflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAAHXZ(ptr) msvcp120.?uflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAAHXZ +@ thiscall -arch=i386 ?uflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHXZ(ptr) msvcp120.?uflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHXZ +@ cdecl -arch=win64 ?uflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ(ptr) msvcp120.?uflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ +@ cdecl -arch=arm ?uflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAAGXZ(ptr) msvcp120.?uflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAAGXZ +@ thiscall -arch=i386 ?uflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEGXZ(ptr) msvcp120.?uflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEGXZ +@ cdecl -arch=win64 ?uflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGXZ(ptr) msvcp120.?uflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGXZ +@ cdecl -arch=arm ?uflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAAGXZ(ptr) msvcp120.?uflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAAGXZ +@ thiscall -arch=i386 ?uflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEGXZ(ptr) msvcp120.?uflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEGXZ +@ cdecl -arch=win64 ?uflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGXZ(ptr) msvcp120.?uflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGXZ +@ cdecl ?uncaught_exception@std@@YA_NXZ() msvcp120.?uncaught_exception@std@@YA_NXZ +@ cdecl -arch=arm ?underflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAAHXZ(ptr) msvcp120.?underflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAAHXZ +@ thiscall -arch=i386 ?underflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHXZ(ptr) msvcp120.?underflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHXZ +@ cdecl -arch=win64 ?underflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ(ptr) msvcp120.?underflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ +@ cdecl -arch=arm ?underflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAAGXZ(ptr) msvcp120.?underflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAAGXZ +@ thiscall -arch=i386 ?underflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEGXZ(ptr) msvcp120.?underflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEGXZ +@ cdecl -arch=win64 ?underflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGXZ(ptr) msvcp120.?underflow@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAAGXZ +@ cdecl -arch=arm ?underflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAAGXZ(ptr) msvcp120.?underflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAAGXZ +@ thiscall -arch=i386 ?underflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEGXZ(ptr) msvcp120.?underflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAEGXZ +@ cdecl -arch=win64 ?underflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGXZ(ptr) msvcp120.?underflow@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAAGXZ +@ cdecl -arch=arm ?unget@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@XZ(ptr) msvcp120.?unget@?$basic_istream@DU?$char_traits@D@std@@@std@@QAAAAV12@XZ +@ thiscall -arch=i386 ?unget@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ(ptr) msvcp120.?unget@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ +@ cdecl -arch=win64 ?unget@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ(ptr) msvcp120.?unget@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ +@ cdecl -arch=arm ?unget@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@XZ(ptr) msvcp120.?unget@?$basic_istream@GU?$char_traits@G@std@@@std@@QAAAAV12@XZ +@ thiscall -arch=i386 ?unget@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@XZ(ptr) msvcp120.?unget@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@XZ +@ cdecl -arch=win64 ?unget@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@XZ(ptr) msvcp120.?unget@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@XZ +@ cdecl -arch=arm ?unget@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@XZ(ptr) msvcp120.?unget@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@XZ +@ thiscall -arch=i386 ?unget@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@XZ(ptr) msvcp120.?unget@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@XZ +@ cdecl -arch=win64 ?unget@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@XZ(ptr) msvcp120.?unget@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@XZ +@ cdecl -arch=arm ?unsetf@ios_base@std@@QAAXH@Z(ptr long) msvcp120.?unsetf@ios_base@std@@QAAXH@Z +@ thiscall -arch=i386 ?unsetf@ios_base@std@@QAEXH@Z(ptr long) msvcp120.?unsetf@ios_base@std@@QAEXH@Z +@ cdecl -arch=win64 ?unsetf@ios_base@std@@QEAAXH@Z(ptr long) msvcp120.?unsetf@ios_base@std@@QEAAXH@Z +@ cdecl -arch=arm ?unshift@?$codecvt@DDH@std@@QBAHAAHPAD1AAPAD@Z(ptr ptr ptr ptr ptr) msvcp120.?unshift@?$codecvt@DDH@std@@QBAHAAHPAD1AAPAD@Z +@ thiscall -arch=i386 ?unshift@?$codecvt@DDH@std@@QBEHAAHPAD1AAPAD@Z(ptr ptr ptr ptr ptr) msvcp120.?unshift@?$codecvt@DDH@std@@QBEHAAHPAD1AAPAD@Z +@ cdecl -arch=win64 ?unshift@?$codecvt@DDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z(ptr ptr ptr ptr ptr) msvcp120.?unshift@?$codecvt@DDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z +@ cdecl -arch=arm ?unshift@?$codecvt@GDH@std@@QBAHAAHPAD1AAPAD@Z(ptr ptr ptr ptr ptr) msvcp120.?unshift@?$codecvt@GDH@std@@QBAHAAHPAD1AAPAD@Z +@ thiscall -arch=i386 ?unshift@?$codecvt@GDH@std@@QBEHAAHPAD1AAPAD@Z(ptr ptr ptr ptr ptr) msvcp120.?unshift@?$codecvt@GDH@std@@QBEHAAHPAD1AAPAD@Z +@ cdecl -arch=win64 ?unshift@?$codecvt@GDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z(ptr ptr ptr ptr ptr) msvcp120.?unshift@?$codecvt@GDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z +@ cdecl -arch=arm ?unshift@?$codecvt@_WDH@std@@QBAHAAHPAD1AAPAD@Z(ptr ptr ptr ptr ptr) msvcp120.?unshift@?$codecvt@_WDH@std@@QBAHAAHPAD1AAPAD@Z +@ thiscall -arch=i386 ?unshift@?$codecvt@_WDH@std@@QBEHAAHPAD1AAPAD@Z(ptr ptr ptr ptr ptr) msvcp120.?unshift@?$codecvt@_WDH@std@@QBEHAAHPAD1AAPAD@Z +@ cdecl -arch=win64 ?unshift@?$codecvt@_WDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z(ptr ptr ptr ptr ptr) msvcp120.?unshift@?$codecvt@_WDH@std@@QEBAHAEAHPEAD1AEAPEAD@Z +@ stub -arch=win32 ?wait@agent@Concurrency@@SA?AW4agent_status@2@PAV12@I@Z +@ stub -arch=win64 ?wait@agent@Concurrency@@SA?AW4agent_status@2@PEAV12@I@Z +@ stub -arch=win32 ?wait_for_all@agent@Concurrency@@SAXIPAPAV12@PAW4agent_status@2@I@Z +@ stub -arch=win64 ?wait_for_all@agent@Concurrency@@SAX_KPEAPEAV12@PEAW4agent_status@2@I@Z +@ stub -arch=win32 ?wait_for_one@agent@Concurrency@@SAXIPAPAV12@AAW4agent_status@2@AAII@Z +@ stub -arch=win64 ?wait_for_one@agent@Concurrency@@SAX_KPEAPEAV12@AEAW4agent_status@2@AEA_KI@Z +@ extern ?wcerr@std@@3V?$basic_ostream@GU?$char_traits@G@std@@@1@A msvcp120.?wcerr@std@@3V?$basic_ostream@GU?$char_traits@G@std@@@1@A +@ extern ?wcerr@std@@3V?$basic_ostream@_WU?$char_traits@_W@std@@@1@A msvcp120.?wcerr@std@@3V?$basic_ostream@_WU?$char_traits@_W@std@@@1@A +@ extern ?wcin@std@@3V?$basic_istream@GU?$char_traits@G@std@@@1@A msvcp120.?wcin@std@@3V?$basic_istream@GU?$char_traits@G@std@@@1@A +@ extern ?wcin@std@@3V?$basic_istream@_WU?$char_traits@_W@std@@@1@A msvcp120.?wcin@std@@3V?$basic_istream@_WU?$char_traits@_W@std@@@1@A +@ extern ?wclog@std@@3V?$basic_ostream@GU?$char_traits@G@std@@@1@A msvcp120.?wclog@std@@3V?$basic_ostream@GU?$char_traits@G@std@@@1@A +@ extern ?wclog@std@@3V?$basic_ostream@_WU?$char_traits@_W@std@@@1@A msvcp120.?wclog@std@@3V?$basic_ostream@_WU?$char_traits@_W@std@@@1@A +@ extern ?wcout@std@@3V?$basic_ostream@GU?$char_traits@G@std@@@1@A msvcp120.?wcout@std@@3V?$basic_ostream@GU?$char_traits@G@std@@@1@A +@ extern ?wcout@std@@3V?$basic_ostream@_WU?$char_traits@_W@std@@@1@A msvcp120.?wcout@std@@3V?$basic_ostream@_WU?$char_traits@_W@std@@@1@A +@ cdecl -arch=arm ?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QBADD@Z(ptr long) msvcp120.?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QBADD@Z +@ thiscall -arch=i386 ?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDD@Z(ptr long) msvcp120.?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDD@Z +@ cdecl -arch=win64 ?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADD@Z(ptr long) msvcp120.?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADD@Z +@ cdecl -arch=arm ?widen@?$basic_ios@GU?$char_traits@G@std@@@std@@QBAGD@Z(ptr long) msvcp120.?widen@?$basic_ios@GU?$char_traits@G@std@@@std@@QBAGD@Z +@ thiscall -arch=i386 ?widen@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEGD@Z(ptr long) msvcp120.?widen@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEGD@Z +@ cdecl -arch=win64 ?widen@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAGD@Z(ptr long) msvcp120.?widen@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAGD@Z +@ cdecl -arch=arm ?widen@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBA_WD@Z(ptr long) msvcp120.?widen@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBA_WD@Z +@ thiscall -arch=i386 ?widen@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBE_WD@Z(ptr long) msvcp120.?widen@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBE_WD@Z +@ cdecl -arch=win64 ?widen@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBA_WD@Z(ptr long) msvcp120.?widen@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBA_WD@Z +@ cdecl -arch=arm ?widen@?$ctype@D@std@@QBADD@Z(ptr long) msvcp120.?widen@?$ctype@D@std@@QBADD@Z +@ thiscall -arch=i386 ?widen@?$ctype@D@std@@QBEDD@Z(ptr long) msvcp120.?widen@?$ctype@D@std@@QBEDD@Z +@ cdecl -arch=win64 ?widen@?$ctype@D@std@@QEBADD@Z(ptr long) msvcp120.?widen@?$ctype@D@std@@QEBADD@Z +@ cdecl -arch=arm ?widen@?$ctype@D@std@@QBAPBDPBD0PAD@Z(ptr ptr ptr ptr) msvcp120.?widen@?$ctype@D@std@@QBAPBDPBD0PAD@Z +@ thiscall -arch=i386 ?widen@?$ctype@D@std@@QBEPBDPBD0PAD@Z(ptr ptr ptr ptr) msvcp120.?widen@?$ctype@D@std@@QBEPBDPBD0PAD@Z +@ cdecl -arch=win64 ?widen@?$ctype@D@std@@QEBAPEBDPEBD0PEAD@Z(ptr ptr ptr ptr) msvcp120.?widen@?$ctype@D@std@@QEBAPEBDPEBD0PEAD@Z +@ cdecl -arch=arm ?widen@?$ctype@G@std@@QBAGD@Z(ptr long) msvcp120.?widen@?$ctype@G@std@@QBAGD@Z +@ thiscall -arch=i386 ?widen@?$ctype@G@std@@QBEGD@Z(ptr long) msvcp120.?widen@?$ctype@G@std@@QBEGD@Z +@ cdecl -arch=win64 ?widen@?$ctype@G@std@@QEBAGD@Z(ptr long) msvcp120.?widen@?$ctype@G@std@@QEBAGD@Z +@ cdecl -arch=arm ?widen@?$ctype@G@std@@QBAPBDPBD0PAG@Z(ptr ptr ptr ptr) msvcp120.?widen@?$ctype@G@std@@QBAPBDPBD0PAG@Z +@ thiscall -arch=i386 ?widen@?$ctype@G@std@@QBEPBDPBD0PAG@Z(ptr ptr ptr ptr) msvcp120.?widen@?$ctype@G@std@@QBEPBDPBD0PAG@Z +@ cdecl -arch=win64 ?widen@?$ctype@G@std@@QEBAPEBDPEBD0PEAG@Z(ptr ptr ptr ptr) msvcp120.?widen@?$ctype@G@std@@QEBAPEBDPEBD0PEAG@Z +@ cdecl -arch=arm ?widen@?$ctype@_W@std@@QBAPBDPBD0PA_W@Z(ptr ptr ptr ptr) msvcp120.?widen@?$ctype@_W@std@@QBAPBDPBD0PA_W@Z +@ thiscall -arch=i386 ?widen@?$ctype@_W@std@@QBEPBDPBD0PA_W@Z(ptr ptr ptr ptr) msvcp120.?widen@?$ctype@_W@std@@QBEPBDPBD0PA_W@Z +@ cdecl -arch=win64 ?widen@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W@Z(ptr ptr ptr ptr) msvcp120.?widen@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W@Z +@ cdecl -arch=arm ?widen@?$ctype@_W@std@@QBA_WD@Z(ptr long) msvcp120.?widen@?$ctype@_W@std@@QBA_WD@Z +@ thiscall -arch=i386 ?widen@?$ctype@_W@std@@QBE_WD@Z(ptr long) msvcp120.?widen@?$ctype@_W@std@@QBE_WD@Z +@ cdecl -arch=win64 ?widen@?$ctype@_W@std@@QEBA_WD@Z(ptr long) msvcp120.?widen@?$ctype@_W@std@@QEBA_WD@Z +@ cdecl -ret64 -arch=arm ?width@ios_base@std@@QAA_J_J@Z(ptr int64) msvcp120.?width@ios_base@std@@QAA_J_J@Z +@ thiscall -ret64 -arch=i386 ?width@ios_base@std@@QAE_J_J@Z(ptr int64) msvcp120.?width@ios_base@std@@QAE_J_J@Z +@ cdecl -arch=win64 ?width@ios_base@std@@QEAA_J_J@Z(ptr long) msvcp120.?width@ios_base@std@@QEAA_J_J@Z +@ cdecl -ret64 -arch=arm ?width@ios_base@std@@QBA_JXZ(ptr) msvcp120.?width@ios_base@std@@QBA_JXZ +@ thiscall -ret64 -arch=i386 ?width@ios_base@std@@QBE_JXZ(ptr) msvcp120.?width@ios_base@std@@QBE_JXZ +@ cdecl -arch=win64 ?width@ios_base@std@@QEBA_JXZ(ptr) msvcp120.?width@ios_base@std@@QEBA_JXZ +@ cdecl -arch=arm ?write@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV12@PBD_J@Z(ptr str int64) msvcp120.?write@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAAAAV12@PBD_J@Z +@ thiscall -arch=i386 ?write@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@PBD_J@Z(ptr str int64) msvcp120.?write@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@PBD_J@Z +@ cdecl -arch=win64 ?write@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEBD_J@Z(ptr str long) msvcp120.?write@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEBD_J@Z +@ cdecl -arch=arm ?write@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV12@PBG_J@Z(ptr ptr int64) msvcp120.?write@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAAAAV12@PBG_J@Z +@ thiscall -arch=i386 ?write@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@PBG_J@Z(ptr ptr int64) msvcp120.?write@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@PBG_J@Z +@ cdecl -arch=win64 ?write@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEBG_J@Z(ptr wstr long) msvcp120.?write@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEBG_J@Z +@ cdecl -arch=arm ?write@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@PB_W_J@Z(ptr wstr int64) msvcp120.?write@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAAAAV12@PB_W_J@Z +@ thiscall -arch=i386 ?write@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PB_W_J@Z(ptr wstr int64) msvcp120.?write@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PB_W_J@Z +@ cdecl -arch=win64 ?write@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEB_W_J@Z(ptr wstr long) msvcp120.?write@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEB_W_J@Z +@ cdecl -arch=win32 ?ws@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@1@AAV21@@Z(ptr) msvcp120.?ws@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@1@AAV21@@Z +@ cdecl -arch=win64 ?ws@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@1@AEAV21@@Z(ptr) msvcp120.?ws@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@1@AEAV21@@Z +@ cdecl -arch=win32 ?ws@std@@YAAAV?$basic_istream@GU?$char_traits@G@std@@@1@AAV21@@Z(ptr) msvcp120.?ws@std@@YAAAV?$basic_istream@GU?$char_traits@G@std@@@1@AAV21@@Z +@ cdecl -arch=win64 ?ws@std@@YAAEAV?$basic_istream@GU?$char_traits@G@std@@@1@AEAV21@@Z(ptr) msvcp120.?ws@std@@YAAEAV?$basic_istream@GU?$char_traits@G@std@@@1@AEAV21@@Z +@ cdecl -arch=win32 ?ws@std@@YAAAV?$basic_istream@_WU?$char_traits@_W@std@@@1@AAV21@@Z(ptr) msvcp120.?ws@std@@YAAAV?$basic_istream@_WU?$char_traits@_W@std@@@1@AAV21@@Z +@ cdecl -arch=win64 ?ws@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z(ptr) msvcp120.?ws@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z +@ cdecl ?xalloc@ios_base@std@@SAHXZ() msvcp120.?xalloc@ios_base@std@@SAHXZ +@ cdecl -ret64 -arch=arm ?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAA_JPAD_J@Z(ptr ptr int64) msvcp120.?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAA_JPAD_J@Z +@ thiscall -ret64 -arch=i386 ?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE_JPAD_J@Z(ptr ptr int64) msvcp120.?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE_JPAD_J@Z +@ cdecl -arch=win64 ?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z(ptr ptr long) msvcp120.?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z +@ cdecl -ret64 -arch=arm ?xsgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAA_JPAG_J@Z(ptr ptr int64) msvcp120.?xsgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAA_JPAG_J@Z +@ thiscall -ret64 -arch=i386 ?xsgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE_JPAG_J@Z(ptr ptr int64) msvcp120.?xsgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE_JPAG_J@Z +@ cdecl -arch=win64 ?xsgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JPEAG_J@Z(ptr ptr long) msvcp120.?xsgetn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JPEAG_J@Z +@ cdecl -ret64 -arch=arm ?xsgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAA_JPA_W_J@Z(ptr ptr int64) msvcp120.?xsgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAA_JPA_W_J@Z +@ thiscall -ret64 -arch=i386 ?xsgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE_JPA_W_J@Z(ptr ptr int64) msvcp120.?xsgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE_JPA_W_J@Z +@ cdecl -arch=win64 ?xsgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEA_W_J@Z(ptr ptr long) msvcp120.?xsgetn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEA_W_J@Z +@ cdecl -ret64 -arch=arm ?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAA_JPBD_J@Z(ptr str int64) msvcp120.?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAA_JPBD_J@Z +@ thiscall -ret64 -arch=i386 ?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE_JPBD_J@Z(ptr str int64) msvcp120.?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE_JPBD_J@Z +@ cdecl -arch=win64 ?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEBD_J@Z(ptr str long) msvcp120.?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEBD_J@Z +@ cdecl -ret64 -arch=arm ?xsputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAA_JPBG_J@Z(ptr ptr int64) msvcp120.?xsputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAA_JPBG_J@Z +@ thiscall -ret64 -arch=i386 ?xsputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE_JPBG_J@Z(ptr ptr int64) msvcp120.?xsputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAE_JPBG_J@Z +@ cdecl -arch=win64 ?xsputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JPEBG_J@Z(ptr ptr long) msvcp120.?xsputn@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JPEBG_J@Z +@ cdecl -ret64 -arch=arm ?xsputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAA_JPB_W_J@Z(ptr wstr int64) msvcp120.?xsputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAA_JPB_W_J@Z +@ thiscall -ret64 -arch=i386 ?xsputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE_JPB_W_J@Z(ptr wstr int64) msvcp120.?xsputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MAE_JPB_W_J@Z +@ cdecl -arch=win64 ?xsputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEB_W_J@Z(ptr ptr long) msvcp120.?xsputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEB_W_J@Z +@ stub _Call_once +@ stub _Call_onceEx +@ stub _Cnd_broadcast +@ stub _Cnd_destroy +@ stub _Cnd_do_broadcast_at_thread_exit +@ stub _Cnd_init +@ stub _Cnd_register_at_thread_exit +@ stub _Cnd_signal +@ stub _Cnd_timedwait +@ stub _Cnd_unregister_at_thread_exit +@ stub _Cnd_wait +@ stub _Cosh +@ extern _Denorm msvcp120._Denorm +@ stub _Dint +@ stub _Dnorm +@ stub _Do_call +@ stub _Dscale +@ stub _Dtento +@ stub _Dtest +@ stub _Dunscale +@ extern _Eps msvcp120._Eps +@ stub _Exp +@ stub _FCosh +@ extern _FDenorm msvcp120._FDenorm +@ stub _FDint +@ stub _FDnorm +@ stub _FDscale +@ stub _FDtento +@ stub _FDtest +@ stub _FDunscale +@ extern _FEps msvcp120._FEps +@ stub _FExp +@ extern _FInf msvcp120._FInf +@ extern _FNan msvcp120._FNan +@ stub _FPlsw +@ stub _FPmsw +# extern _FRteps +@ stub _FSinh +@ extern _FSnan msvcp120._FSnan +# extern _FXbig +@ stub _FXp_addh +@ stub _FXp_addx +@ stub _FXp_getw +@ stub _FXp_invx +@ stub _FXp_ldexpx +@ stub _FXp_movx +@ stub _FXp_mulh +@ stub _FXp_mulx +@ stub _FXp_setn +@ stub _FXp_setw +@ stub _FXp_sqrtx +@ stub _FXp_subx +# extern _FZero +@ cdecl -ret64 _Getcoll() msvcp120._Getcoll +@ cdecl _Getctype(ptr) msvcp120._Getctype +@ cdecl -ret64 _Getcvt() msvcp120._Getcvt +@ stub _Getdateorder +@ cdecl _Getwctype(long ptr) msvcp120._Getwctype +@ cdecl _Getwctypes(ptr ptr ptr ptr) msvcp120._Getwctypes +@ extern _Hugeval msvcp120._Hugeval +@ extern _Inf msvcp120._Inf +@ stub _LCosh +@ extern _LDenorm msvcp120._LDenorm +@ stub _LDint +@ stub _LDscale +@ stub _LDtento +@ stub _LDtest +@ stub _LDunscale +@ extern _LEps msvcp120._LEps +@ stub _LExp +@ extern _LInf msvcp120._LInf +@ extern _LNan msvcp120._LNan +@ stub _LPlsw +@ stub _LPmsw +@ stub _LPoly +# extern _LRteps +@ stub _LSinh +@ extern _LSnan msvcp120._LSnan +# extern _LXbig +@ stub _LXp_addh +@ stub _LXp_addx +@ stub _LXp_getw +@ stub _LXp_invx +@ stub _LXp_ldexpx +@ stub _LXp_movx +@ stub _LXp_mulh +@ stub _LXp_mulx +@ stub _LXp_setn +@ stub _LXp_setw +@ stub _LXp_sqrtx +@ stub _LXp_subx +@ extern _LZero msvcp120._LZero +@ stub _Lock_shared_ptr_spin_lock +@ cdecl _Mbrtowc(ptr ptr long ptr ptr) msvcp120._Mbrtowc +@ stub _Mtx_clear_owner +@ stub _Mtx_current_owns +@ cdecl _Mtx_destroy(ptr) msvcp120._Mtx_destroy +@ cdecl _Mtx_getconcrtcs(ptr) msvcp120._Mtx_getconcrtcs +@ cdecl _Mtx_init(ptr long) msvcp120._Mtx_init +@ cdecl _Mtx_lock(ptr) msvcp120._Mtx_lock +@ stub _Mtx_reset_owner +@ stub _Mtx_timedlock +@ cdecl _Mtx_trylock(ptr) msvcp120._Mtx_trylock +@ cdecl _Mtx_unlock(ptr) msvcp120._Mtx_unlock +@ stub _Mtxdst +@ stub _Mtxinit +@ stub _Mtxlock +@ stub _Mtxunlock +@ extern _Nan msvcp120._Nan +@ stub _Once +@ stub _Plsw +@ stub _Pmsw +@ stub _Poly +# extern _Rteps +@ stub _Sinh +@ extern _Snan msvcp120._Snan +@ cdecl _Stod(ptr ptr long) msvcp120._Stod +@ cdecl _Stodx(ptr ptr long ptr) msvcp120._Stodx +@ cdecl _Stof(ptr ptr long) msvcp120._Stof +@ stub _Stoflt +@ cdecl _Stofx(ptr ptr long ptr) msvcp120._Stofx +@ cdecl _Stold(ptr ptr long) msvcp120._Stold +@ cdecl _Stoldx(ptr ptr long ptr) msvcp120._Stoldx +@ cdecl -ret64 _Stoll(ptr ptr long) msvcp120._Stoll +@ cdecl -ret64 _Stollx(ptr ptr long ptr) msvcp120._Stollx +@ cdecl _Stolx(ptr ptr long ptr) msvcp120._Stolx +@ stub _Stopfx +@ cdecl _Stoul(ptr ptr long) msvcp120._Stoul +@ cdecl -ret64 _Stoull(ptr ptr long) msvcp120._Stoull +@ cdecl -ret64 _Stoullx(ptr ptr long ptr) msvcp120._Stoullx +@ cdecl _Stoulx(ptr ptr long ptr) msvcp120._Stoulx +@ stub _Stoxflt +@ cdecl _Strcoll(ptr ptr ptr ptr ptr) msvcp120._Strcoll +@ stub _Strxfrm +@ stub _Thrd_abort +@ stub _Thrd_create +@ stub _Thrd_current +@ stub _Thrd_detach +@ stub _Thrd_equal +@ stub _Thrd_exit +@ stub _Thrd_join +@ stub _Thrd_lt +@ stub _Thrd_sleep +@ stub _Thrd_start +@ stub _Thrd_yield +@ cdecl _Tolower(long ptr) msvcp120._Tolower +@ cdecl _Toupper(long ptr) msvcp120._Toupper +@ cdecl _Towlower(long ptr) msvcp120._Towlower +@ cdecl _Towupper(long ptr) msvcp120._Towupper +@ stub _Tss_create +@ stub _Tss_delete +@ stub _Tss_get +@ stub _Tss_set +@ stub _Unlock_shared_ptr_spin_lock +@ cdecl _Wcrtomb(ptr long ptr ptr) msvcp120._Wcrtomb +@ cdecl _Wcscoll(ptr ptr ptr ptr ptr) msvcp120._Wcscoll +@ stub _Wcsxfrm +# extern _Xbig +@ stub _Xp_addh +@ stub _Xp_addx +@ stub _Xp_getw +@ stub _Xp_invx +@ stub _Xp_ldexpx +@ stub _Xp_movx +@ stub _Xp_mulh +@ stub _Xp_mulx +@ stub _Xp_setn +@ stub _Xp_setw +@ stub _Xp_sqrtx +@ stub _Xp_subx +@ stub _Xtime_diff_to_millis +@ stub _Xtime_diff_to_millis2 +@ cdecl _Xtime_get_ticks() msvcp120._Xtime_get_ticks +# extern _Zero +@ stub __Wcrtomb_lk +@ stub xtime_get diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcr120/msvcr120.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcr120/msvcr120.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcr120/msvcr120.spec 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcr120/msvcr120.spec 2014-12-15 00:45:34.000000000 +0000 @@ -1104,7 +1104,7 @@ @ varargs _cwscanf_s(wstr) @ varargs _cwscanf_s_l(wstr ptr) @ extern _daylight MSVCRT___daylight -@ stub _dclass +@ cdecl _dclass(double) MSVCR120__dclass @ cdecl _difftime32(long long) MSVCRT__difftime32 @ cdecl _difftime64(long long) MSVCRT__difftime64 @ stub _dosmaperr @@ -1140,7 +1140,7 @@ @ cdecl _fcloseall() MSVCRT__fcloseall @ cdecl _fcvt(double long ptr ptr) MSVCRT__fcvt @ cdecl _fcvt_s(ptr long double long ptr ptr) MSVCRT__fcvt_s -@ stub _fdclass +@ cdecl _fdclass(float) MSVCR120__fdclass @ cdecl _fdopen(long str) MSVCRT__fdopen @ stub _fdpcomp @ stub _fdsign @@ -1389,7 +1389,7 @@ @ cdecl _j1(double) MSVCRT__j1 @ cdecl _jn(long double) MSVCRT__jn @ cdecl _kbhit() -@ stub _ldclass +@ cdecl _ldclass(double) MSVCR120__ldclass @ stub _ldpcomp @ stub _ldsign @ stub _ldtest @@ -1792,7 +1792,7 @@ @ cdecl _unlock_file(ptr) MSVCRT__unlock_file @ cdecl _utime32(str ptr) @ cdecl _utime64(str ptr) -@ stub _vacopy +@ cdecl _vacopy(ptr ptr) MSVCR120__vacopy @ cdecl _vcprintf(str ptr) @ stub _vcprintf_l @ stub _vcprintf_p @@ -2058,9 +2058,9 @@ @ stub catanhf @ stub catanhl @ stub catanl -@ stub cbrt -@ stub cbrtf -@ stub cbrtl +@ cdecl cbrt(double) MSVCR120_cbrt +@ cdecl cbrtf(float) MSVCR120_cbrtf +@ cdecl cbrtl(double) MSVCR120_cbrtl @ stub ccos @ stub ccosf @ stub ccosh @@ -2127,9 +2127,9 @@ @ stub erfl @ cdecl exit(long) MSVCRT_exit @ cdecl exp(double) MSVCRT_exp -@ stub exp2 -@ stub exp2f -@ stub exp2l +@ cdecl exp2(double) MSVCR120_exp2 +@ cdecl exp2f(float) MSVCR120_exp2f +@ cdecl exp2l(double) MSVCR120_exp2l @ cdecl -arch=arm,x86_64 expf(float) MSVCRT_expf @ stub expm1 @ stub expm1f @@ -2245,12 +2245,12 @@ @ stub lgammal @ cdecl -ret64 llabs(int64) MSVCRT_llabs @ stub lldiv -@ stub llrint -@ stub llrintf -@ stub llrintl -@ stub llround -@ stub llroundf -@ stub llroundl +@ cdecl -ret64 llrint(double) MSVCR120_llrint +@ cdecl -ret64 llrintf(float) MSVCR120_llrintf +@ cdecl -ret64 llrintl(double) MSVCR120_llrintl +@ cdecl -ret64 llround(double) MSVCR120_llround +@ cdecl -ret64 llroundf(float) MSVCR120_llroundf +@ cdecl -ret64 llroundl(double) MSVCR120_llroundl @ cdecl localeconv() MSVCRT_localeconv @ cdecl log(double) MSVCRT_log @ cdecl -arch=arm,x86_64 logf(float) MSVCRT_logf @@ -2259,19 +2259,19 @@ @ stub log1p @ stub log1pf @ stub log1pl -@ stub log2 -@ stub log2f -@ stub log2l +@ cdecl log2(double) MSVCR120_log2 +@ cdecl log2f(float) MSVCR120_log2f +@ cdecl log2l(double) MSVCR120_log2l @ stub logb @ stub logbf @ stub logbl @ cdecl -arch=i386,x86_64,arm longjmp(ptr long) MSVCRT_longjmp -@ stub lrint -@ stub lrintf -@ stub lrintl -@ stub lround -@ stub lroundf -@ stub lroundl +@ cdecl lrint(double) MSVCR120_lrint +@ cdecl lrintf(float) MSVCR120_lrintf +@ cdecl lrintl(double) MSVCR120_lrintl +@ cdecl lround(double) MSVCR120_lround +@ cdecl lroundf(float) MSVCR120_lroundf +@ cdecl lroundl(double) MSVCR120_lroundl @ cdecl malloc(long) MSVCRT_malloc @ cdecl mblen(ptr long) MSVCRT_mblen @ cdecl mbrlen(ptr long ptr) MSVCRT_mbrlen @@ -2330,12 +2330,12 @@ @ stub remquol @ cdecl rename(str str) MSVCRT_rename @ cdecl rewind(ptr) MSVCRT_rewind -@ stub rint -@ stub rintf -@ stub rintl -@ stub round -@ stub roundf -@ stub roundl +@ cdecl rint(double) MSVCR120_rint +@ cdecl rintf(float) MSVCR120_rintf +@ cdecl rintl(double) MSVCR120_rintl +@ cdecl round(double) MSVCR120_round +@ cdecl roundf(float) MSVCR120_roundf +@ cdecl roundl(double) MSVCR120_roundl @ stub scalbln @ stub scalblnf @ stub scalblnl @@ -2414,9 +2414,9 @@ @ stub towctrans @ cdecl towlower(long) MSVCRT_towlower @ cdecl towupper(long) MSVCRT_towupper -@ stub trunc -@ stub truncf -@ stub truncl +@ cdecl trunc(double) MSVCR120_trunc +@ cdecl truncf(float) MSVCR120_truncf +@ cdecl truncl(double) MSVCR120_truncl @ cdecl ungetc(long ptr) MSVCRT_ungetc @ cdecl ungetwc(long ptr) MSVCRT_ungetwc @ cdecl vfprintf(ptr str ptr) MSVCRT_vfprintf diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcr120/tests/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcr120/tests/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcr120/tests/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcr120/tests/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,5 @@ +TESTDLL = msvcr120.dll +APPMODE = -mno-cygwin + +C_SRCS = \ + msvcr120.c diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcr120/tests/msvcr120.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcr120/tests/msvcr120.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcr120/tests/msvcr120.c 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcr120/tests/msvcr120.c 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,155 @@ +/* + * Copyright 2014 Yifu Wang for ESRI + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include +#include + +#include +#include +#include "wine/test.h" + +#include + +struct MSVCRT_lconv +{ + char* decimal_point; + char* thousands_sep; + char* grouping; + char* int_curr_symbol; + char* currency_symbol; + char* mon_decimal_point; + char* mon_thousands_sep; + char* mon_grouping; + char* positive_sign; + char* negative_sign; + char int_frac_digits; + char frac_digits; + char p_cs_precedes; + char p_sep_by_space; + char n_cs_precedes; + char n_sep_by_space; + char p_sign_posn; + char n_sign_posn; + wchar_t* _W_decimal_point; + wchar_t* _W_thousands_sep; + wchar_t* _W_int_curr_symbol; + wchar_t* _W_currency_symbol; + wchar_t* _W_mon_decimal_point; + wchar_t* _W_mon_thousands_sep; + wchar_t* _W_positive_sign; + wchar_t* _W_negative_sign; +}; + +static char* (CDECL *p_setlocale)(int category, const char* locale); +static struct MSVCRT_lconv* (CDECL *p_localeconv)(void); +static size_t (CDECL *p_wcstombs_s)(size_t *ret, char* dest, size_t sz, const wchar_t* src, size_t max); + +static BOOL init(void) +{ + HMODULE module; + + module = LoadLibraryA("msvcr120.dll"); + if (!module) + { + win_skip("msvcr120.dll not installed\n"); + return FALSE; + } + + p_setlocale = (void*)GetProcAddress(module, "setlocale"); + p_localeconv = (void*)GetProcAddress(module, "localeconv"); + p_wcstombs_s = (void*)GetProcAddress(module, "wcstombs_s"); + return TRUE; +} + +static void test_lconv_helper(const char *locstr) +{ + struct MSVCRT_lconv *lconv; + char mbs[256]; + size_t i; + + if(!p_setlocale(LC_ALL, locstr)) + { + win_skip("locale %s not available\n", locstr); + return; + } + + lconv = p_localeconv(); + + /* If multi-byte version available, asserts that wide char version also available. + * If wide char version can be converted to a multi-byte string , asserts that the + * conversion result is the same as the multi-byte version. + */ + if(strlen(lconv->decimal_point) > 0) + ok(wcslen(lconv->_W_decimal_point) > 0, "%s: decimal_point\n", locstr); + if(p_wcstombs_s(&i, mbs, 256, lconv->_W_decimal_point, 256) == 0) + ok(strcmp(mbs, lconv->decimal_point) == 0, "%s: decimal_point\n", locstr); + + if(strlen(lconv->thousands_sep) > 0) + ok(wcslen(lconv->_W_thousands_sep) > 0, "%s: thousands_sep\n", locstr); + if(p_wcstombs_s(&i, mbs, 256, lconv->_W_thousands_sep, 256) == 0) + ok(strcmp(mbs, lconv->thousands_sep) == 0, "%s: thousands_sep\n", locstr); + + if(strlen(lconv->int_curr_symbol) > 0) + ok(wcslen(lconv->_W_int_curr_symbol) > 0, "%s: int_curr_symbol\n", locstr); + if(p_wcstombs_s(&i, mbs, 256, lconv->_W_int_curr_symbol, 256) == 0) + ok(strcmp(mbs, lconv->int_curr_symbol) == 0, "%s: int_curr_symbol\n", locstr); + + if(strlen(lconv->currency_symbol) > 0) + ok(wcslen(lconv->_W_currency_symbol) > 0, "%s: currency_symbol\n", locstr); + if(p_wcstombs_s(&i, mbs, 256, lconv->_W_currency_symbol, 256) == 0) + ok(strcmp(mbs, lconv->currency_symbol) == 0, "%s: currency_symbol\n", locstr); + + if(strlen(lconv->mon_decimal_point) > 0) + ok(wcslen(lconv->_W_mon_decimal_point) > 0, "%s: decimal_point\n", locstr); + if(p_wcstombs_s(&i, mbs, 256, lconv->_W_mon_decimal_point, 256) == 0) + ok(strcmp(mbs, lconv->mon_decimal_point) == 0, "%s: decimal_point\n", locstr); + + if(strlen(lconv->positive_sign) > 0) + ok(wcslen(lconv->_W_positive_sign) > 0, "%s: positive_sign\n", locstr); + if(p_wcstombs_s(&i, mbs, 256, lconv->_W_positive_sign, 256) == 0) + ok(strcmp(mbs, lconv->positive_sign) == 0, "%s: positive_sign\n", locstr); + + if(strlen(lconv->negative_sign) > 0) + ok(wcslen(lconv->_W_negative_sign) > 0, "%s: negative_sign\n", locstr); + if(p_wcstombs_s(&i, mbs, 256, lconv->_W_negative_sign, 256) == 0) + ok(strcmp(mbs, lconv->negative_sign) == 0, "%s: negative_sign\n", locstr); +} + +static void test_lconv(void) +{ + int i; + const char *locstrs[] = + { + "American", "Belgian", "Chinese", + "Dutch", "English", "French", + "German", "Hungarian", "Icelandic", + "Japanese", "Korean", "Spanish" + }; + + for(i = 0; i < sizeof(locstrs) / sizeof(char *); i ++) + test_lconv_helper(locstrs[i]); +} + +START_TEST(msvcr120) +{ + if (!init()) return; + test_lconv(); +} diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcr120_app/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcr120_app/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcr120_app/Makefile.in 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcr120_app/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1 @@ +MODULE = msvcr120_app.dll diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcr120_app/msvcr120_app.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcr120_app/msvcr120_app.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcr120_app/msvcr120_app.spec 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcr120_app/msvcr120_app.spec 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,2158 @@ +@ cdecl -arch=arm ??0?$_SpinWait@$00@details@Concurrency@@QAA@P6AXXZ@Z(ptr ptr) msvcr120.??0?$_SpinWait@$00@details@Concurrency@@QAA@P6AXXZ@Z +@ thiscall -arch=i386 ??0?$_SpinWait@$00@details@Concurrency@@QAE@P6AXXZ@Z(ptr ptr) msvcr120.??0?$_SpinWait@$00@details@Concurrency@@QAE@P6AXXZ@Z +@ cdecl -arch=win64 ??0?$_SpinWait@$00@details@Concurrency@@QEAA@P6AXXZ@Z(ptr ptr) msvcr120.??0?$_SpinWait@$00@details@Concurrency@@QEAA@P6AXXZ@Z +@ cdecl -arch=arm ??0?$_SpinWait@$0A@@details@Concurrency@@QAA@P6AXXZ@Z(ptr ptr) msvcr120.??0?$_SpinWait@$0A@@details@Concurrency@@QAA@P6AXXZ@Z +@ thiscall -arch=i386 ??0?$_SpinWait@$0A@@details@Concurrency@@QAE@P6AXXZ@Z(ptr ptr) msvcr120.??0?$_SpinWait@$0A@@details@Concurrency@@QAE@P6AXXZ@Z +@ cdecl -arch=win64 ??0?$_SpinWait@$0A@@details@Concurrency@@QEAA@P6AXXZ@Z(ptr ptr) msvcr120.??0?$_SpinWait@$0A@@details@Concurrency@@QEAA@P6AXXZ@Z +@ stub -arch=win32 ??0SchedulerPolicy@Concurrency@@QAA@IZZ +@ stub -arch=win64 ??0SchedulerPolicy@Concurrency@@QEAA@_KZZ +@ stub -arch=arm ??0SchedulerPolicy@Concurrency@@QAA@ABV01@@Z +@ stub -arch=i386 ??0SchedulerPolicy@Concurrency@@QAE@ABV01@@Z +@ stub -arch=win64 ??0SchedulerPolicy@Concurrency@@QEAA@AEBV01@@Z +@ stub -arch=arm ??0SchedulerPolicy@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0SchedulerPolicy@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0SchedulerPolicy@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0_Cancellation_beacon@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0_Cancellation_beacon@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0_Cancellation_beacon@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0_Condition_variable@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0_Condition_variable@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0_Condition_variable@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0_Context@details@Concurrency@@QAA@PAVContext@2@@Z +@ stub -arch=i386 ??0_Context@details@Concurrency@@QAE@PAVContext@2@@Z +@ stub -arch=win64 ??0_Context@details@Concurrency@@QEAA@PEAVContext@2@@Z +@ stub -arch=arm ??0_Interruption_exception@details@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0_Interruption_exception@details@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0_Interruption_exception@details@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0_Interruption_exception@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0_Interruption_exception@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0_Interruption_exception@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0_NonReentrantBlockingLock@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0_NonReentrantBlockingLock@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0_NonReentrantBlockingLock@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0_NonReentrantPPLLock@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0_NonReentrantPPLLock@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0_NonReentrantPPLLock@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0_ReaderWriterLock@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0_ReaderWriterLock@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0_ReaderWriterLock@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0_ReentrantBlockingLock@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0_ReentrantBlockingLock@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0_ReentrantBlockingLock@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0_ReentrantLock@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0_ReentrantLock@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0_ReentrantLock@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0_ReentrantPPLLock@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0_ReentrantPPLLock@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0_ReentrantPPLLock@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0_Scheduler@details@Concurrency@@QAA@PAVScheduler@2@@Z +@ stub -arch=i386 ??0_Scheduler@details@Concurrency@@QAE@PAVScheduler@2@@Z +@ stub -arch=win64 ??0_Scheduler@details@Concurrency@@QEAA@PEAVScheduler@2@@Z +@ stub -arch=arm ??0_Scoped_lock@_NonReentrantPPLLock@details@Concurrency@@QAA@AAV123@@Z +@ stub -arch=i386 ??0_Scoped_lock@_NonReentrantPPLLock@details@Concurrency@@QAE@AAV123@@Z +@ stub -arch=win64 ??0_Scoped_lock@_NonReentrantPPLLock@details@Concurrency@@QEAA@AEAV123@@Z +@ stub -arch=arm ??0_Scoped_lock@_ReentrantPPLLock@details@Concurrency@@QAA@AAV123@@Z +@ stub -arch=i386 ??0_Scoped_lock@_ReentrantPPLLock@details@Concurrency@@QAE@AAV123@@Z +@ stub -arch=win64 ??0_Scoped_lock@_ReentrantPPLLock@details@Concurrency@@QEAA@AEAV123@@Z +@ stub -arch=arm ??0_SpinLock@details@Concurrency@@QAA@ACJ@Z +@ stub -arch=i386 ??0_SpinLock@details@Concurrency@@QAE@ACJ@Z +@ stub -arch=win64 ??0_SpinLock@details@Concurrency@@QEAA@AECJ@Z +@ stub -arch=arm ??0_StructuredTaskCollection@details@Concurrency@@QAA@PAV_CancellationTokenState@12@@Z +@ stub -arch=i386 ??0_StructuredTaskCollection@details@Concurrency@@QAE@PAV_CancellationTokenState@12@@Z +@ stub -arch=win64 ??0_StructuredTaskCollection@details@Concurrency@@QEAA@PEAV_CancellationTokenState@12@@Z +@ stub -arch=arm ??0_TaskCollection@details@Concurrency@@QAA@PAV_CancellationTokenState@12@@Z +@ stub -arch=i386 ??0_TaskCollection@details@Concurrency@@QAE@PAV_CancellationTokenState@12@@Z +@ stub -arch=win64 ??0_TaskCollection@details@Concurrency@@QEAA@PEAV_CancellationTokenState@12@@Z +@ stub -arch=arm ??0_TaskCollection@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0_TaskCollection@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0_TaskCollection@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0_Timer@details@Concurrency@@IAA@I_N@Z +@ stub -arch=i386 ??0_Timer@details@Concurrency@@IAE@I_N@Z +@ stub -arch=win64 ??0_Timer@details@Concurrency@@IEAA@I_N@Z +@ cdecl -arch=arm ??0__non_rtti_object@std@@QAA@ABV01@@Z(ptr ptr) msvcr120.??0__non_rtti_object@std@@QAA@ABV01@@Z +@ thiscall -arch=i386 ??0__non_rtti_object@std@@QAE@ABV01@@Z(ptr ptr) msvcr120.??0__non_rtti_object@std@@QAE@ABV01@@Z +@ cdecl -arch=win64 ??0__non_rtti_object@std@@QEAA@AEBV01@@Z(ptr ptr) msvcr120.??0__non_rtti_object@std@@QEAA@AEBV01@@Z +@ cdecl -arch=arm ??0__non_rtti_object@std@@QAA@PBD@Z(ptr ptr) msvcr120.??0__non_rtti_object@std@@QAA@PBD@Z +@ thiscall -arch=i386 ??0__non_rtti_object@std@@QAE@PBD@Z(ptr ptr) msvcr120.??0__non_rtti_object@std@@QAE@PBD@Z +@ cdecl -arch=win64 ??0__non_rtti_object@std@@QEAA@PEBD@Z(ptr ptr) msvcr120.??0__non_rtti_object@std@@QEAA@PEBD@Z +@ cdecl -arch=arm ??0bad_cast@std@@AAA@PBQBD@Z(ptr ptr) msvcr120.??0bad_cast@std@@AAA@PBQBD@Z +@ thiscall -arch=i386 ??0bad_cast@std@@AAE@PBQBD@Z(ptr ptr) msvcr120.??0bad_cast@std@@AAE@PBQBD@Z +@ cdecl -arch=win64 ??0bad_cast@std@@AEAA@PEBQEBD@Z(ptr ptr) msvcr120.??0bad_cast@std@@AEAA@PEBQEBD@Z +@ cdecl -arch=arm ??0bad_cast@std@@QAA@ABV01@@Z(ptr ptr) msvcr120.??0bad_cast@std@@QAA@ABV01@@Z +@ thiscall -arch=i386 ??0bad_cast@std@@QAE@ABV01@@Z(ptr ptr) msvcr120.??0bad_cast@std@@QAE@ABV01@@Z +@ cdecl -arch=win64 ??0bad_cast@std@@QEAA@AEBV01@@Z(ptr ptr) msvcr120.??0bad_cast@std@@QEAA@AEBV01@@Z +@ cdecl -arch=arm ??0bad_cast@std@@QAA@PBD@Z(ptr str) msvcr120.??0bad_cast@std@@QAA@PBD@Z +@ thiscall -arch=i386 ??0bad_cast@std@@QAE@PBD@Z(ptr str) msvcr120.??0bad_cast@std@@QAE@PBD@Z +@ cdecl -arch=win64 ??0bad_cast@std@@QEAA@PEBD@Z(ptr str) msvcr120.??0bad_cast@std@@QEAA@PEBD@Z +@ stub -arch=arm ??0bad_target@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0bad_target@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0bad_target@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0bad_target@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0bad_target@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0bad_target@Concurrency@@QEAA@XZ +@ cdecl -arch=arm ??0bad_typeid@std@@QAA@ABV01@@Z(ptr ptr) msvcr120.??0bad_typeid@std@@QAA@ABV01@@Z +@ thiscall -arch=i386 ??0bad_typeid@std@@QAE@ABV01@@Z(ptr ptr) msvcr120.??0bad_typeid@std@@QAE@ABV01@@Z +@ cdecl -arch=win64 ??0bad_typeid@std@@QEAA@AEBV01@@Z(ptr ptr) msvcr120.??0bad_typeid@std@@QEAA@AEBV01@@Z +@ cdecl -arch=arm ??0bad_typeid@std@@QAA@PBD@Z(ptr str) msvcr120.??0bad_typeid@std@@QAA@PBD@Z +@ thiscall -arch=i386 ??0bad_typeid@std@@QAE@PBD@Z(ptr str) msvcr120.??0bad_typeid@std@@QAE@PBD@Z +@ cdecl -arch=win64 ??0bad_typeid@std@@QEAA@PEBD@Z(ptr str) msvcr120.??0bad_typeid@std@@QEAA@PEBD@Z +@ stub -arch=arm ??0context_self_unblock@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0context_self_unblock@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0context_self_unblock@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0context_self_unblock@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0context_self_unblock@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0context_self_unblock@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0context_unblock_unbalanced@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0context_unblock_unbalanced@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0context_unblock_unbalanced@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0context_unblock_unbalanced@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0context_unblock_unbalanced@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0context_unblock_unbalanced@Concurrency@@QEAA@XZ +@ cdecl -arch=arm ??0critical_section@Concurrency@@QAA@XZ(ptr) msvcr120.??0critical_section@Concurrency@@QAA@XZ +@ thiscall -arch=i386 ??0critical_section@Concurrency@@QAE@XZ(ptr) msvcr120.??0critical_section@Concurrency@@QAE@XZ +@ cdecl -arch=win64 ??0critical_section@Concurrency@@QEAA@XZ(ptr) msvcr120.??0critical_section@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0default_scheduler_exists@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0default_scheduler_exists@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0default_scheduler_exists@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0default_scheduler_exists@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0default_scheduler_exists@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0default_scheduler_exists@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0event@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0event@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0event@Concurrency@@QEAA@XZ +@ cdecl -arch=arm ??0exception@std@@QAA@ABQBD@Z(ptr ptr) msvcr120.??0exception@std@@QAA@ABQBD@Z +@ thiscall -arch=i386 ??0exception@std@@QAE@ABQBD@Z(ptr ptr) msvcr120.??0exception@std@@QAE@ABQBD@Z +@ cdecl -arch=win64 ??0exception@std@@QEAA@AEBQEBD@Z(ptr ptr) msvcr120.??0exception@std@@QEAA@AEBQEBD@Z +@ cdecl -arch=arm ??0exception@std@@QAA@ABQBDH@Z(ptr ptr long) msvcr120.??0exception@std@@QAA@ABQBDH@Z +@ thiscall -arch=i386 ??0exception@std@@QAE@ABQBDH@Z(ptr ptr long) msvcr120.??0exception@std@@QAE@ABQBDH@Z +@ cdecl -arch=win64 ??0exception@std@@QEAA@AEBQEBDH@Z(ptr ptr long) msvcr120.??0exception@std@@QEAA@AEBQEBDH@Z +@ cdecl -arch=arm ??0exception@std@@QAA@ABV01@@Z(ptr ptr) msvcr120.??0exception@std@@QAA@ABV01@@Z +@ thiscall -arch=i386 ??0exception@std@@QAE@ABV01@@Z(ptr ptr) msvcr120.??0exception@std@@QAE@ABV01@@Z +@ cdecl -arch=win64 ??0exception@std@@QEAA@AEBV01@@Z(ptr ptr) msvcr120.??0exception@std@@QEAA@AEBV01@@Z +@ cdecl -arch=arm ??0exception@std@@QAA@XZ(ptr) msvcr120.??0exception@std@@QAA@XZ +@ thiscall -arch=i386 ??0exception@std@@QAE@XZ(ptr) msvcr120.??0exception@std@@QAE@XZ +@ cdecl -arch=win64 ??0exception@std@@QEAA@XZ(ptr) msvcr120.??0exception@std@@QEAA@XZ +@ stub -arch=arm ??0improper_lock@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0improper_lock@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0improper_lock@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0improper_lock@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0improper_lock@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0improper_lock@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0improper_scheduler_attach@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0improper_scheduler_attach@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0improper_scheduler_attach@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0improper_scheduler_attach@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0improper_scheduler_attach@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0improper_scheduler_attach@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0improper_scheduler_detach@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0improper_scheduler_detach@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0improper_scheduler_detach@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0improper_scheduler_detach@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0improper_scheduler_detach@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0improper_scheduler_detach@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0improper_scheduler_reference@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0improper_scheduler_reference@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0improper_scheduler_reference@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0improper_scheduler_reference@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0improper_scheduler_reference@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0improper_scheduler_reference@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0invalid_link_target@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0invalid_link_target@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0invalid_link_target@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0invalid_link_target@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0invalid_link_target@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0invalid_link_target@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0invalid_multiple_scheduling@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0invalid_multiple_scheduling@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0invalid_multiple_scheduling@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0invalid_multiple_scheduling@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0invalid_multiple_scheduling@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0invalid_multiple_scheduling@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0invalid_operation@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0invalid_operation@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0invalid_operation@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0invalid_operation@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0invalid_operation@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0invalid_operation@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0invalid_oversubscribe_operation@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0invalid_oversubscribe_operation@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0invalid_oversubscribe_operation@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0invalid_oversubscribe_operation@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0invalid_oversubscribe_operation@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0invalid_oversubscribe_operation@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0invalid_scheduler_policy_key@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0invalid_scheduler_policy_key@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0invalid_scheduler_policy_key@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0invalid_scheduler_policy_key@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0invalid_scheduler_policy_key@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0invalid_scheduler_policy_key@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0invalid_scheduler_policy_thread_specification@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0invalid_scheduler_policy_thread_specification@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0invalid_scheduler_policy_thread_specification@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0invalid_scheduler_policy_thread_specification@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0invalid_scheduler_policy_thread_specification@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0invalid_scheduler_policy_thread_specification@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0invalid_scheduler_policy_value@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0invalid_scheduler_policy_value@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0invalid_scheduler_policy_value@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0invalid_scheduler_policy_value@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0invalid_scheduler_policy_value@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0invalid_scheduler_policy_value@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0message_not_found@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0message_not_found@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0message_not_found@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0message_not_found@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0message_not_found@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0message_not_found@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0missing_wait@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0missing_wait@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0missing_wait@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0missing_wait@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0missing_wait@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0missing_wait@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0nested_scheduler_missing_detach@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0nested_scheduler_missing_detach@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0nested_scheduler_missing_detach@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0nested_scheduler_missing_detach@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0nested_scheduler_missing_detach@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0nested_scheduler_missing_detach@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0operation_timed_out@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0operation_timed_out@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0operation_timed_out@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0operation_timed_out@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0operation_timed_out@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0operation_timed_out@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0reader_writer_lock@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0reader_writer_lock@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0reader_writer_lock@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0scheduler_not_attached@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0scheduler_not_attached@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0scheduler_not_attached@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0scheduler_not_attached@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0scheduler_not_attached@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0scheduler_not_attached@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0scheduler_resource_allocation_error@Concurrency@@QAA@J@Z +@ stub -arch=i386 ??0scheduler_resource_allocation_error@Concurrency@@QAE@J@Z +@ stub -arch=win64 ??0scheduler_resource_allocation_error@Concurrency@@QEAA@J@Z +@ stub -arch=arm ??0scheduler_resource_allocation_error@Concurrency@@QAA@PBDJ@Z +@ stub -arch=i386 ??0scheduler_resource_allocation_error@Concurrency@@QAE@PBDJ@Z +@ stub -arch=win64 ??0scheduler_resource_allocation_error@Concurrency@@QEAA@PEBDJ@Z +@ stub -arch=arm ??0scheduler_worker_creation_error@Concurrency@@QAA@J@Z +@ stub -arch=i386 ??0scheduler_worker_creation_error@Concurrency@@QAE@J@Z +@ stub -arch=win64 ??0scheduler_worker_creation_error@Concurrency@@QEAA@J@Z +@ stub -arch=arm ??0scheduler_worker_creation_error@Concurrency@@QAA@PBDJ@Z +@ stub -arch=i386 ??0scheduler_worker_creation_error@Concurrency@@QAE@PBDJ@Z +@ stub -arch=win64 ??0scheduler_worker_creation_error@Concurrency@@QEAA@PEBDJ@Z +@ cdecl -arch=arm ??0scoped_lock@critical_section@Concurrency@@QAA@AAV12@@Z(ptr ptr) msvcr120.??0scoped_lock@critical_section@Concurrency@@QAA@AAV12@@Z +@ thiscall -arch=i386 ??0scoped_lock@critical_section@Concurrency@@QAE@AAV12@@Z(ptr ptr) msvcr120.??0scoped_lock@critical_section@Concurrency@@QAE@AAV12@@Z +@ cdecl -arch=win64 ??0scoped_lock@critical_section@Concurrency@@QEAA@AEAV12@@Z(ptr ptr) msvcr120.??0scoped_lock@critical_section@Concurrency@@QEAA@AEAV12@@Z +@ stub -arch=arm ??0scoped_lock@reader_writer_lock@Concurrency@@QAA@AAV12@@Z +@ stub -arch=i386 ??0scoped_lock@reader_writer_lock@Concurrency@@QAE@AAV12@@Z +@ stub -arch=win64 ??0scoped_lock@reader_writer_lock@Concurrency@@QEAA@AEAV12@@Z +@ stub -arch=arm ??0scoped_lock_read@reader_writer_lock@Concurrency@@QAA@AAV12@@Z +@ stub -arch=i386 ??0scoped_lock_read@reader_writer_lock@Concurrency@@QAE@AAV12@@Z +@ stub -arch=win64 ??0scoped_lock_read@reader_writer_lock@Concurrency@@QEAA@AEAV12@@Z +@ stub -arch=arm ??0task_canceled@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0task_canceled@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0task_canceled@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0task_canceled@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0task_canceled@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0task_canceled@Concurrency@@QEAA@XZ +@ stub -arch=arm ??0unsupported_os@Concurrency@@QAA@PBD@Z +@ stub -arch=i386 ??0unsupported_os@Concurrency@@QAE@PBD@Z +@ stub -arch=win64 ??0unsupported_os@Concurrency@@QEAA@PEBD@Z +@ stub -arch=arm ??0unsupported_os@Concurrency@@QAA@XZ +@ stub -arch=i386 ??0unsupported_os@Concurrency@@QAE@XZ +@ stub -arch=win64 ??0unsupported_os@Concurrency@@QEAA@XZ +@ stub -arch=arm ??1SchedulerPolicy@Concurrency@@QAA@XZ +@ stub -arch=i386 ??1SchedulerPolicy@Concurrency@@QAE@XZ +@ stub -arch=win64 ??1SchedulerPolicy@Concurrency@@QEAA@XZ +@ stub -arch=arm ??1_Cancellation_beacon@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??1_Cancellation_beacon@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??1_Cancellation_beacon@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??1_Condition_variable@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??1_Condition_variable@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??1_Condition_variable@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??1_NonReentrantBlockingLock@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??1_NonReentrantBlockingLock@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??1_NonReentrantBlockingLock@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??1_ReentrantBlockingLock@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??1_ReentrantBlockingLock@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??1_ReentrantBlockingLock@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??1_Scoped_lock@_NonReentrantPPLLock@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??1_Scoped_lock@_NonReentrantPPLLock@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??1_Scoped_lock@_NonReentrantPPLLock@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??1_Scoped_lock@_ReentrantPPLLock@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??1_Scoped_lock@_ReentrantPPLLock@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??1_Scoped_lock@_ReentrantPPLLock@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??1_SpinLock@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??1_SpinLock@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??1_SpinLock@details@Concurrency@@QEAA@XZ +@ stub -arch=i386 ??1_StructuredTaskCollection@details@Concurrency@@QAE@XZ +@ stub -arch=arm ??1_TaskCollection@details@Concurrency@@QAA@XZ +@ stub -arch=i386 ??1_TaskCollection@details@Concurrency@@QAE@XZ +@ stub -arch=win64 ??1_TaskCollection@details@Concurrency@@QEAA@XZ +@ stub -arch=arm ??1_Timer@details@Concurrency@@MAA@XZ +@ stub -arch=i386 ??1_Timer@details@Concurrency@@MAE@XZ +@ stub -arch=win64 ??1_Timer@details@Concurrency@@MEAA@XZ +@ cdecl -arch=arm ??1__non_rtti_object@std@@UAA@XZ(ptr) msvcr120.??1__non_rtti_object@std@@UAA@XZ +@ thiscall -arch=i386 ??1__non_rtti_object@std@@UAE@XZ(ptr) msvcr120.??1__non_rtti_object@std@@UAE@XZ +@ cdecl -arch=win64 ??1__non_rtti_object@std@@UEAA@XZ(ptr) msvcr120.??1__non_rtti_object@std@@UEAA@XZ +@ cdecl -arch=arm ??1bad_cast@std@@UAA@XZ(ptr) msvcr120.??1bad_cast@std@@UAA@XZ +@ thiscall -arch=i386 ??1bad_cast@std@@UAE@XZ(ptr) msvcr120.??1bad_cast@std@@UAE@XZ +@ cdecl -arch=win64 ??1bad_cast@std@@UEAA@XZ(ptr) msvcr120.??1bad_cast@std@@UEAA@XZ +@ cdecl -arch=arm ??1bad_typeid@std@@UAA@XZ(ptr) msvcr120.??1bad_typeid@std@@UAA@XZ +@ thiscall -arch=i386 ??1bad_typeid@std@@UAE@XZ(ptr) msvcr120.??1bad_typeid@std@@UAE@XZ +@ cdecl -arch=win64 ??1bad_typeid@std@@UEAA@XZ(ptr) msvcr120.??1bad_typeid@std@@UEAA@XZ +@ cdecl -arch=arm ??1critical_section@Concurrency@@QAA@XZ(ptr) msvcr120.??1critical_section@Concurrency@@QAA@XZ +@ thiscall -arch=i386 ??1critical_section@Concurrency@@QAE@XZ(ptr) msvcr120.??1critical_section@Concurrency@@QAE@XZ +@ cdecl -arch=win64 ??1critical_section@Concurrency@@QEAA@XZ(ptr) msvcr120.??1critical_section@Concurrency@@QEAA@XZ +@ stub -arch=arm ??1event@Concurrency@@QAA@XZ +@ stub -arch=i386 ??1event@Concurrency@@QAE@XZ +@ stub -arch=win64 ??1event@Concurrency@@QEAA@XZ +@ cdecl -arch=arm ??1exception@std@@UAA@XZ(ptr) msvcr120.??1exception@std@@UAA@XZ +@ thiscall -arch=i386 ??1exception@std@@UAE@XZ(ptr) msvcr120.??1exception@std@@UAE@XZ +@ cdecl -arch=win64 ??1exception@std@@UEAA@XZ(ptr) msvcr120.??1exception@std@@UEAA@XZ +@ stub -arch=arm ??1reader_writer_lock@Concurrency@@QAA@XZ +@ stub -arch=i386 ??1reader_writer_lock@Concurrency@@QAE@XZ +@ stub -arch=win64 ??1reader_writer_lock@Concurrency@@QEAA@XZ +@ cdecl -arch=arm ??1scoped_lock@critical_section@Concurrency@@QAA@XZ(ptr) msvcr120.??1scoped_lock@critical_section@Concurrency@@QAA@XZ +@ thiscall -arch=i386 ??1scoped_lock@critical_section@Concurrency@@QAE@XZ(ptr) msvcr120.??1scoped_lock@critical_section@Concurrency@@QAE@XZ +@ cdecl -arch=win64 ??1scoped_lock@critical_section@Concurrency@@QEAA@XZ(ptr) msvcr120.??1scoped_lock@critical_section@Concurrency@@QEAA@XZ +@ stub -arch=arm ??1scoped_lock@reader_writer_lock@Concurrency@@QAA@XZ +@ stub -arch=i386 ??1scoped_lock@reader_writer_lock@Concurrency@@QAE@XZ +@ stub -arch=win64 ??1scoped_lock@reader_writer_lock@Concurrency@@QEAA@XZ +@ stub -arch=arm ??1scoped_lock_read@reader_writer_lock@Concurrency@@QAA@XZ +@ stub -arch=i386 ??1scoped_lock_read@reader_writer_lock@Concurrency@@QAE@XZ +@ stub -arch=win64 ??1scoped_lock_read@reader_writer_lock@Concurrency@@QEAA@XZ +@ cdecl -arch=arm ??1type_info@@UAA@XZ(ptr) msvcr120.??1type_info@@UAA@XZ +@ thiscall -arch=i386 ??1type_info@@UAE@XZ(ptr) msvcr120.??1type_info@@UAE@XZ +@ cdecl -arch=win64 ??1type_info@@UEAA@XZ(ptr) msvcr120.??1type_info@@UEAA@XZ +@ cdecl -arch=win32 ??2@YAPAXI@Z(long) msvcr120.??2@YAPAXI@Z +@ cdecl -arch=win64 ??2@YAPEAX_K@Z(long) msvcr120.??2@YAPEAX_K@Z +@ cdecl -arch=win32 ??2@YAPAXIHPBDH@Z(long long str long) msvcr120.??2@YAPAXIHPBDH@Z +@ cdecl -arch=win64 ??2@YAPEAX_KHPEBDH@Z(long long str long) msvcr120.??2@YAPEAX_KHPEBDH@Z +@ cdecl -arch=win32 ??3@YAXPAX@Z(ptr) msvcr120.??3@YAXPAX@Z +@ cdecl -arch=win64 ??3@YAXPEAX@Z(ptr) msvcr120.??3@YAXPEAX@Z +@ stub -arch=win32 ??3@YAXPAXHPBDH@Z +@ stub -arch=win64 ??3@YAXPEAXHPEBDH@Z +@ stub -arch=arm ??4?$_SpinWait@$00@details@Concurrency@@QAAAAV012@ABV012@@Z +@ stub -arch=i386 ??4?$_SpinWait@$00@details@Concurrency@@QAEAAV012@ABV012@@Z +@ stub -arch=win64 ??4?$_SpinWait@$00@details@Concurrency@@QEAAAEAV012@AEBV012@@Z +@ stub -arch=arm ??4?$_SpinWait@$0A@@details@Concurrency@@QAAAAV012@ABV012@@Z +@ stub -arch=i386 ??4?$_SpinWait@$0A@@details@Concurrency@@QAEAAV012@ABV012@@Z +@ stub -arch=win64 ??4?$_SpinWait@$0A@@details@Concurrency@@QEAAAEAV012@AEBV012@@Z +@ stub -arch=arm ??4SchedulerPolicy@Concurrency@@QAAAAV01@ABV01@@Z +@ stub -arch=i386 ??4SchedulerPolicy@Concurrency@@QAEAAV01@ABV01@@Z +@ stub -arch=win64 ??4SchedulerPolicy@Concurrency@@QEAAAEAV01@AEBV01@@Z +@ cdecl -arch=arm ??4__non_rtti_object@std@@QAAAAV01@ABV01@@Z(ptr ptr) msvcr120.??4__non_rtti_object@std@@QAAAAV01@ABV01@@Z +@ thiscall -arch=i386 ??4__non_rtti_object@std@@QAEAAV01@ABV01@@Z(ptr ptr) msvcr120.??4__non_rtti_object@std@@QAEAAV01@ABV01@@Z +@ cdecl -arch=win64 ??4__non_rtti_object@std@@QEAAAEAV01@AEBV01@@Z(ptr ptr) msvcr120.??4__non_rtti_object@std@@QEAAAEAV01@AEBV01@@Z +@ cdecl -arch=arm ??4bad_cast@std@@QAAAAV01@ABV01@@Z(ptr ptr) msvcr120.??4bad_cast@std@@QAAAAV01@ABV01@@Z +@ thiscall -arch=i386 ??4bad_cast@std@@QAEAAV01@ABV01@@Z(ptr ptr) msvcr120.??4bad_cast@std@@QAEAAV01@ABV01@@Z +@ cdecl -arch=win64 ??4bad_cast@std@@QEAAAEAV01@AEBV01@@Z(ptr ptr) msvcr120.??4bad_cast@std@@QEAAAEAV01@AEBV01@@Z +@ cdecl -arch=arm ??4bad_typeid@std@@QAAAAV01@ABV01@@Z(ptr ptr) msvcr120.??4bad_typeid@std@@QAAAAV01@ABV01@@Z +@ thiscall -arch=i386 ??4bad_typeid@std@@QAEAAV01@ABV01@@Z(ptr ptr) msvcr120.??4bad_typeid@std@@QAEAAV01@ABV01@@Z +@ cdecl -arch=win64 ??4bad_typeid@std@@QEAAAEAV01@AEBV01@@Z(ptr ptr) msvcr120.??4bad_typeid@std@@QEAAAEAV01@AEBV01@@Z +@ cdecl -arch=arm ??4exception@std@@QAAAAV01@ABV01@@Z(ptr ptr) msvcr120.??4exception@std@@QAAAAV01@ABV01@@Z +@ thiscall -arch=i386 ??4exception@std@@QAEAAV01@ABV01@@Z(ptr ptr) msvcr120.??4exception@std@@QAEAAV01@ABV01@@Z +@ cdecl -arch=win64 ??4exception@std@@QEAAAEAV01@AEBV01@@Z(ptr ptr) msvcr120.??4exception@std@@QEAAAEAV01@AEBV01@@Z +@ cdecl -arch=arm ??8type_info@@QBA_NABV0@@Z(ptr ptr) msvcr120.??8type_info@@QBA_NABV0@@Z +@ thiscall -arch=i386 ??8type_info@@QBE_NABV0@@Z(ptr ptr) msvcr120.??8type_info@@QBE_NABV0@@Z +@ cdecl -arch=win64 ??8type_info@@QEBA_NAEBV0@@Z(ptr ptr) msvcr120.??8type_info@@QEBA_NAEBV0@@Z +@ cdecl -arch=arm ??9type_info@@QBA_NABV0@@Z(ptr ptr) msvcr120.??9type_info@@QBA_NABV0@@Z +@ thiscall -arch=i386 ??9type_info@@QBE_NABV0@@Z(ptr ptr) msvcr120.??9type_info@@QBE_NABV0@@Z +@ cdecl -arch=win64 ??9type_info@@QEBA_NAEBV0@@Z(ptr ptr) msvcr120.??9type_info@@QEBA_NAEBV0@@Z +@ extern ??_7__non_rtti_object@std@@6B@ msvcr120.??_7__non_rtti_object@std@@6B@ +@ extern ??_7bad_cast@std@@6B@ msvcr120.??_7bad_cast@std@@6B@ +@ extern ??_7bad_typeid@std@@6B@ msvcr120.??_7bad_typeid@std@@6B@ +@ extern ??_7exception@std@@6B@ msvcr120.??_7exception@std@@6B@ +@ cdecl -arch=arm ??_F?$_SpinWait@$00@details@Concurrency@@QAAXXZ(ptr) msvcr120.??_F?$_SpinWait@$00@details@Concurrency@@QAAXXZ +@ thiscall -arch=i386 ??_F?$_SpinWait@$00@details@Concurrency@@QAEXXZ(ptr) msvcr120.??_F?$_SpinWait@$00@details@Concurrency@@QAEXXZ +@ cdecl -arch=win64 ??_F?$_SpinWait@$00@details@Concurrency@@QEAAXXZ(ptr) msvcr120.??_F?$_SpinWait@$00@details@Concurrency@@QEAAXXZ +@ cdecl -arch=arm ??_F?$_SpinWait@$0A@@details@Concurrency@@QAAXXZ(ptr) msvcr120.??_F?$_SpinWait@$0A@@details@Concurrency@@QAAXXZ +@ thiscall -arch=i386 ??_F?$_SpinWait@$0A@@details@Concurrency@@QAEXXZ(ptr) msvcr120.??_F?$_SpinWait@$0A@@details@Concurrency@@QAEXXZ +@ cdecl -arch=win64 ??_F?$_SpinWait@$0A@@details@Concurrency@@QEAAXXZ(ptr) msvcr120.??_F?$_SpinWait@$0A@@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ??_F_Context@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ??_F_Context@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ??_F_Context@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ??_F_Scheduler@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ??_F_Scheduler@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ??_F_Scheduler@details@Concurrency@@QEAAXXZ +@ cdecl -arch=arm ??_Fbad_cast@std@@QAAXXZ(ptr) msvcr120.??_Fbad_cast@std@@QAAXXZ +@ thiscall -arch=i386 ??_Fbad_cast@std@@QAEXXZ(ptr) msvcr120.??_Fbad_cast@std@@QAEXXZ +@ cdecl -arch=win64 ??_Fbad_cast@std@@QEAAXXZ(ptr) msvcr120.??_Fbad_cast@std@@QEAAXXZ +@ cdecl -arch=arm ??_Fbad_typeid@std@@QAAXXZ(ptr) msvcr120.??_Fbad_typeid@std@@QAAXXZ +@ thiscall -arch=i386 ??_Fbad_typeid@std@@QAEXXZ(ptr) msvcr120.??_Fbad_typeid@std@@QAEXXZ +@ cdecl -arch=win64 ??_Fbad_typeid@std@@QEAAXXZ(ptr) msvcr120.??_Fbad_typeid@std@@QEAAXXZ +@ cdecl -arch=win32 ??_U@YAPAXI@Z(long) msvcr120.??_U@YAPAXI@Z +@ cdecl -arch=win64 ??_U@YAPEAX_K@Z(long) msvcr120.??_U@YAPEAX_K@Z +@ cdecl -arch=win32 ??_U@YAPAXIHPBDH@Z(long long str long) msvcr120.??_U@YAPAXIHPBDH@Z +@ cdecl -arch=win64 ??_U@YAPEAX_KHPEBDH@Z(long long str long) msvcr120.??_U@YAPEAX_KHPEBDH@Z +@ cdecl -arch=win32 ??_V@YAXPAX@Z(ptr) msvcr120.??_V@YAXPAX@Z +@ cdecl -arch=win64 ??_V@YAXPEAX@Z(ptr) msvcr120.??_V@YAXPEAX@Z +@ stub -arch=win32 ??_V@YAXPAXHPBDH@Z +@ stub -arch=win64 ??_V@YAXPEAXHPEBDH@Z +@ stub -arch=win32 ?Alloc@Concurrency@@YAPAXI@Z +@ stub -arch=win64 ?Alloc@Concurrency@@YAPEAX_K@Z +@ stub ?Block@Context@Concurrency@@SAXXZ +@ stub ?CaptureCallstack@platform@details@Concurrency@@YAIPAPAXII@Z +@ stub -arch=win32 ?Create@CurrentScheduler@Concurrency@@SAXABVSchedulerPolicy@2@@Z +@ stub -arch=win64 ?Create@CurrentScheduler@Concurrency@@SAXAEBVSchedulerPolicy@2@@Z +@ stub -arch=win32 ?Create@Scheduler@Concurrency@@SAPAV12@ABVSchedulerPolicy@2@@Z +@ stub -arch=win64 ?Create@Scheduler@Concurrency@@SAPEAV12@AEBVSchedulerPolicy@2@@Z +@ stub -arch=win32 ?CreateResourceManager@Concurrency@@YAPAUIResourceManager@1@XZ +@ stub -arch=win64 ?CreateResourceManager@Concurrency@@YAPEAUIResourceManager@1@XZ +@ stub -arch=win32 ?CreateScheduleGroup@CurrentScheduler@Concurrency@@SAPAVScheduleGroup@2@AAVlocation@2@@Z +@ stub -arch=win64 ?CreateScheduleGroup@CurrentScheduler@Concurrency@@SAPEAVScheduleGroup@2@AEAVlocation@2@@Z +@ stub -arch=win32 ?CreateScheduleGroup@CurrentScheduler@Concurrency@@SAPAVScheduleGroup@2@XZ +@ stub -arch=win64 ?CreateScheduleGroup@CurrentScheduler@Concurrency@@SAPEAVScheduleGroup@2@XZ +@ stub -arch=win32 ?CurrentContext@Context@Concurrency@@SAPAV12@XZ +@ stub -arch=win64 ?CurrentContext@Context@Concurrency@@SAPEAV12@XZ +@ stub ?Detach@CurrentScheduler@Concurrency@@SAXXZ +@ stub ?DisableTracing@Concurrency@@YAJXZ +@ stub ?EnableTracing@Concurrency@@YAJXZ +@ stub -arch=win32 ?Free@Concurrency@@YAXPAX@Z +@ stub -arch=win64 ?Free@Concurrency@@YAXPEAX@Z +@ stub -arch=win32 ?Get@CurrentScheduler@Concurrency@@SAPAVScheduler@2@XZ +@ stub -arch=win64 ?Get@CurrentScheduler@Concurrency@@SAPEAVScheduler@2@XZ +@ stub ?GetCurrentThreadId@platform@details@Concurrency@@YAJXZ +@ stub ?GetExecutionContextId@Concurrency@@YAIXZ +@ stub ?GetNumberOfVirtualProcessors@CurrentScheduler@Concurrency@@SAIXZ +@ stub ?GetOSVersion@Concurrency@@YA?AW4OSVersion@IResourceManager@1@XZ +@ stub ?GetPolicy@CurrentScheduler@Concurrency@@SA?AVSchedulerPolicy@2@XZ +@ stub -arch=arm ?GetPolicyValue@SchedulerPolicy@Concurrency@@QBAIW4PolicyElementKey@2@@Z +@ stub -arch=i386 ?GetPolicyValue@SchedulerPolicy@Concurrency@@QBEIW4PolicyElementKey@2@@Z +@ stub -arch=win64 ?GetPolicyValue@SchedulerPolicy@Concurrency@@QEBAIW4PolicyElementKey@2@@Z +@ stub ?GetProcessorCount@Concurrency@@YAIXZ +@ stub ?GetProcessorNodeCount@Concurrency@@YAIXZ +@ stub ?GetSchedulerId@Concurrency@@YAIXZ +@ stub -arch=win32 ?GetSharedTimerQueue@details@Concurrency@@YAPAXXZ +@ stub -arch=win64 ?GetSharedTimerQueue@details@Concurrency@@YAPEAXXZ +@ stub ?Id@Context@Concurrency@@SAIXZ +@ stub ?Id@CurrentScheduler@Concurrency@@SAIXZ +@ stub -arch=win32 ?IsAvailableLocation@CurrentScheduler@Concurrency@@SA_NABVlocation@2@@Z +@ stub -arch=win64 ?IsAvailableLocation@CurrentScheduler@Concurrency@@SA_NAEBVlocation@2@@Z +@ stub ?IsCurrentTaskCollectionCanceling@Context@Concurrency@@SA_NXZ +@ stub -arch=win32 ?Log2@details@Concurrency@@YAKI@Z +@ stub -arch=win64 ?Log2@details@Concurrency@@YAK_K@Z +@ stub ?Oversubscribe@Context@Concurrency@@SAX_N@Z +@ stub -arch=win32 ?RegisterShutdownEvent@CurrentScheduler@Concurrency@@SAXPAX@Z +@ stub -arch=win64 ?RegisterShutdownEvent@CurrentScheduler@Concurrency@@SAXPEAX@Z +@ stub ?ResetDefaultSchedulerPolicy@Scheduler@Concurrency@@SAXXZ +@ stub ?ScheduleGroupId@Context@Concurrency@@SAIXZ +@ stub -arch=win32 ?ScheduleTask@CurrentScheduler@Concurrency@@SAXP6AXPAX@Z0@Z +@ stub -arch=win64 ?ScheduleTask@CurrentScheduler@Concurrency@@SAXP6AXPEAX@Z0@Z +@ stub -arch=win32 ?ScheduleTask@CurrentScheduler@Concurrency@@SAXP6AXPAX@Z0AAVlocation@2@@Z +@ stub -arch=win64 ?ScheduleTask@CurrentScheduler@Concurrency@@SAXP6AXPEAX@Z0AEAVlocation@2@@Z +@ stub -arch=arm ?SetConcurrencyLimits@SchedulerPolicy@Concurrency@@QAAXII@Z +@ stub -arch=i386 ?SetConcurrencyLimits@SchedulerPolicy@Concurrency@@QAEXII@Z +@ stub -arch=win64 ?SetConcurrencyLimits@SchedulerPolicy@Concurrency@@QEAAXII@Z +@ stub -arch=win32 ?SetDefaultSchedulerPolicy@Scheduler@Concurrency@@SAXABVSchedulerPolicy@2@@Z +@ stub -arch=win64 ?SetDefaultSchedulerPolicy@Scheduler@Concurrency@@SAXAEBVSchedulerPolicy@2@@Z +@ stub -arch=arm ?SetPolicyValue@SchedulerPolicy@Concurrency@@QAAIW4PolicyElementKey@2@I@Z +@ stub -arch=i386 ?SetPolicyValue@SchedulerPolicy@Concurrency@@QAEIW4PolicyElementKey@2@I@Z +@ stub -arch=win64 ?SetPolicyValue@SchedulerPolicy@Concurrency@@QEAAIW4PolicyElementKey@2@I@Z +@ stub ?VirtualProcessorId@Context@Concurrency@@SAIXZ +@ stub ?Yield@Context@Concurrency@@SAXXZ +@ stub -arch=arm ?_Abort@_StructuredTaskCollection@details@Concurrency@@AAAXXZ +@ stub -arch=i386 ?_Abort@_StructuredTaskCollection@details@Concurrency@@AAEXXZ +@ stub -arch=win64 ?_Abort@_StructuredTaskCollection@details@Concurrency@@AEAAXXZ +@ stub -arch=arm ?_Acquire@_NonReentrantBlockingLock@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?_Acquire@_NonReentrantBlockingLock@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?_Acquire@_NonReentrantBlockingLock@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ?_Acquire@_NonReentrantPPLLock@details@Concurrency@@QAAXPAX@Z +@ stub -arch=i386 ?_Acquire@_NonReentrantPPLLock@details@Concurrency@@QAEXPAX@Z +@ stub -arch=win64 ?_Acquire@_NonReentrantPPLLock@details@Concurrency@@QEAAXPEAX@Z +@ stub -arch=arm ?_Acquire@_ReentrantBlockingLock@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?_Acquire@_ReentrantBlockingLock@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?_Acquire@_ReentrantBlockingLock@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ?_Acquire@_ReentrantLock@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?_Acquire@_ReentrantLock@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?_Acquire@_ReentrantLock@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ?_Acquire@_ReentrantPPLLock@details@Concurrency@@QAAXPAX@Z +@ stub -arch=i386 ?_Acquire@_ReentrantPPLLock@details@Concurrency@@QAEXPAX@Z +@ stub -arch=win64 ?_Acquire@_ReentrantPPLLock@details@Concurrency@@QEAAXPEAX@Z +@ stub -arch=arm ?_AcquireRead@_ReaderWriterLock@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?_AcquireRead@_ReaderWriterLock@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?_AcquireRead@_ReaderWriterLock@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ?_AcquireWrite@_ReaderWriterLock@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?_AcquireWrite@_ReaderWriterLock@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?_AcquireWrite@_ReaderWriterLock@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ?_Cancel@_StructuredTaskCollection@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?_Cancel@_StructuredTaskCollection@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?_Cancel@_StructuredTaskCollection@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ?_Cancel@_TaskCollection@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?_Cancel@_TaskCollection@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?_Cancel@_TaskCollection@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ?_CheckTaskCollection@_UnrealizedChore@details@Concurrency@@IAAXXZ +@ stub -arch=i386 ?_CheckTaskCollection@_UnrealizedChore@details@Concurrency@@IAEXXZ +@ stub -arch=win64 ?_CheckTaskCollection@_UnrealizedChore@details@Concurrency@@IEAAXXZ +@ stub -arch=arm ?_CleanupToken@_StructuredTaskCollection@details@Concurrency@@AAAXXZ +@ stub -arch=i386 ?_CleanupToken@_StructuredTaskCollection@details@Concurrency@@AAEXXZ +@ stub -arch=win64 ?_CleanupToken@_StructuredTaskCollection@details@Concurrency@@AEAAXXZ +@ stub -arch=i386 ?_ConcRT_Assert@details@Concurrency@@YAXPBD0H@Z +@ stub -arch=win64 ?_ConcRT_Assert@details@Concurrency@@YAXPEBD0H@Z +@ stub -arch=win32 ?_ConcRT_CoreAssert@details@Concurrency@@YAXPBD0H@Z +@ stub -arch=win64 ?_ConcRT_CoreAssert@details@Concurrency@@YAXPEBD0H@Z +@ stub -arch=i386 ?_ConcRT_DumpMessage@details@Concurrency@@YAXPB_WZZ +@ stub -arch=win64 ?_ConcRT_DumpMessage@details@Concurrency@@YAXPEB_WZZ +@ stub -arch=win32 ?_ConcRT_Trace@details@Concurrency@@YAXHPB_WZZ +@ stub -arch=win64 ?_ConcRT_Trace@details@Concurrency@@YAXHPEB_WZZ +@ stub -arch=arm ?_Confirm_cancel@_Cancellation_beacon@details@Concurrency@@QAA_NXZ +@ stub -arch=i386 ?_Confirm_cancel@_Cancellation_beacon@details@Concurrency@@QAE_NXZ +@ stub -arch=win64 ?_Confirm_cancel@_Cancellation_beacon@details@Concurrency@@QEAA_NXZ +@ stub -arch=arm ?_Copy_str@exception@std@@AAAXPBD@Z +@ stub -arch=i386 ?_Copy_str@exception@std@@AAEXPBD@Z +@ stub -arch=win64 ?_Copy_str@exception@std@@AEAAXPEBD@Z +@ stub ?_CurrentContext@_Context@details@Concurrency@@SA?AV123@XZ +@ stub ?_Current_node@location@Concurrency@@SA?AV12@XZ +@ stub -arch=arm ?_Destroy@_AsyncTaskCollection@details@Concurrency@@EAAXXZ +@ stub -arch=i386 ?_Destroy@_AsyncTaskCollection@details@Concurrency@@EAEXXZ +@ stub -arch=win64 ?_Destroy@_AsyncTaskCollection@details@Concurrency@@EEAAXXZ +@ stub -arch=arm ?_Destroy@_CancellationTokenState@details@Concurrency@@EAAXXZ +@ stub -arch=i386 ?_Destroy@_CancellationTokenState@details@Concurrency@@EAEXXZ +@ stub -arch=win64 ?_Destroy@_CancellationTokenState@details@Concurrency@@EEAAXXZ +@ cdecl -arch=arm ?_DoYield@?$_SpinWait@$00@details@Concurrency@@IAAXXZ(ptr) msvcr120.?_DoYield@?$_SpinWait@$00@details@Concurrency@@IAAXXZ +@ thiscall -arch=i386 ?_DoYield@?$_SpinWait@$00@details@Concurrency@@IAEXXZ(ptr) msvcr120.?_DoYield@?$_SpinWait@$00@details@Concurrency@@IAEXXZ +@ cdecl -arch=win64 ?_DoYield@?$_SpinWait@$00@details@Concurrency@@IEAAXXZ(ptr) msvcr120.?_DoYield@?$_SpinWait@$00@details@Concurrency@@IEAAXXZ +@ cdecl -arch=arm ?_DoYield@?$_SpinWait@$0A@@details@Concurrency@@IAAXXZ(ptr) msvcr120.?_DoYield@?$_SpinWait@$0A@@details@Concurrency@@IAAXXZ +@ thiscall -arch=i386 ?_DoYield@?$_SpinWait@$0A@@details@Concurrency@@IAEXXZ(ptr) msvcr120.?_DoYield@?$_SpinWait@$0A@@details@Concurrency@@IAEXXZ +@ cdecl -arch=win64 ?_DoYield@?$_SpinWait@$0A@@details@Concurrency@@IEAAXXZ(ptr) msvcr120.?_DoYield@?$_SpinWait@$0A@@details@Concurrency@@IEAAXXZ +@ stub ?_Get@_CurrentScheduler@details@Concurrency@@SA?AV_Scheduler@23@XZ +@ stub -arch=win32 ?_GetConcRTTraceInfo@Concurrency@@YAPBU_CONCRT_TRACE_INFO@details@1@XZ +@ stub -arch=win64 ?_GetConcRTTraceInfo@Concurrency@@YAPEBU_CONCRT_TRACE_INFO@details@1@XZ +@ stub ?_GetConcurrency@details@Concurrency@@YAIXZ +@ stub -arch=win32 ?_GetCurrentInlineDepth@_StackGuard@details@Concurrency@@CAAAIXZ +@ stub -arch=win64 ?_GetCurrentInlineDepth@_StackGuard@details@Concurrency@@CAAEA_KXZ +@ stub ?_GetNumberOfVirtualProcessors@_CurrentScheduler@details@Concurrency@@SAIXZ +@ stub -arch=arm ?_GetScheduler@_Scheduler@details@Concurrency@@QAAPAVScheduler@3@XZ +@ stub -arch=i386 ?_GetScheduler@_Scheduler@details@Concurrency@@QAEPAVScheduler@3@XZ +@ stub -arch=win64 ?_GetScheduler@_Scheduler@details@Concurrency@@QEAAPEAVScheduler@3@XZ +@ stub ?_Id@_CurrentScheduler@details@Concurrency@@SAIXZ +@ stub -arch=arm ?_IsCanceling@_StructuredTaskCollection@details@Concurrency@@QAA_NXZ +@ stub -arch=i386 ?_IsCanceling@_StructuredTaskCollection@details@Concurrency@@QAE_NXZ +@ stub -arch=win64 ?_IsCanceling@_StructuredTaskCollection@details@Concurrency@@QEAA_NXZ +@ stub -arch=arm ?_IsCanceling@_TaskCollection@details@Concurrency@@QAA_NXZ +@ stub -arch=i386 ?_IsCanceling@_TaskCollection@details@Concurrency@@QAE_NXZ +@ stub -arch=win64 ?_IsCanceling@_TaskCollection@details@Concurrency@@QEAA_NXZ +@ stub -arch=arm ?_IsSynchronouslyBlocked@_Context@details@Concurrency@@QBA_NXZ +@ stub -arch=i386 ?_IsSynchronouslyBlocked@_Context@details@Concurrency@@QBE_NXZ +@ stub -arch=win64 ?_IsSynchronouslyBlocked@_Context@details@Concurrency@@QEBA_NXZ +@ stub -arch=win32 ?_Name_base@type_info@@CAPBDPBV1@PAU__type_info_node@@@Z +@ stub -arch=win64 ?_Name_base@type_info@@CAPEBDPEBV1@PEAU__type_info_node@@@Z +@ stub -arch=win32 ?_Name_base_internal@type_info@@CAPBDPBV1@PAU__type_info_node@@@Z +@ stub -arch=win64 ?_Name_base_internal@type_info@@CAPEBDPEBV1@PEAU__type_info_node@@@Z +@ stub -arch=win32 ?_NewCollection@_AsyncTaskCollection@details@Concurrency@@SAPAV123@PAV_CancellationTokenState@23@@Z +@ stub -arch=win64 ?_NewCollection@_AsyncTaskCollection@details@Concurrency@@SAPEAV123@PEAV_CancellationTokenState@23@@Z +@ cdecl -arch=arm ?_NumberOfSpins@?$_SpinWait@$00@details@Concurrency@@IAAKXZ(ptr) msvcr120.?_NumberOfSpins@?$_SpinWait@$00@details@Concurrency@@IAAKXZ +@ thiscall -arch=i386 ?_NumberOfSpins@?$_SpinWait@$00@details@Concurrency@@IAEKXZ(ptr) msvcr120.?_NumberOfSpins@?$_SpinWait@$00@details@Concurrency@@IAEKXZ +@ cdecl -arch=win64 ?_NumberOfSpins@?$_SpinWait@$00@details@Concurrency@@IEAAKXZ(ptr) msvcr120.?_NumberOfSpins@?$_SpinWait@$00@details@Concurrency@@IEAAKXZ +@ cdecl -arch=arm ?_NumberOfSpins@?$_SpinWait@$0A@@details@Concurrency@@IAAKXZ(ptr) msvcr120.?_NumberOfSpins@?$_SpinWait@$0A@@details@Concurrency@@IAAKXZ +@ thiscall -arch=i386 ?_NumberOfSpins@?$_SpinWait@$0A@@details@Concurrency@@IAEKXZ(ptr) msvcr120.?_NumberOfSpins@?$_SpinWait@$0A@@details@Concurrency@@IAEKXZ +@ cdecl -arch=win64 ?_NumberOfSpins@?$_SpinWait@$0A@@details@Concurrency@@IEAAKXZ(ptr) msvcr120.?_NumberOfSpins@?$_SpinWait@$0A@@details@Concurrency@@IEAAKXZ +@ stub ?_Oversubscribe@_Context@details@Concurrency@@SAX_N@Z +@ stub -arch=arm ?_Reference@_Scheduler@details@Concurrency@@QAAIXZ +@ stub -arch=i386 ?_Reference@_Scheduler@details@Concurrency@@QAEIXZ +@ stub -arch=win64 ?_Reference@_Scheduler@details@Concurrency@@QEAAIXZ +@ stub -arch=arm ?_Release@_NonReentrantBlockingLock@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?_Release@_NonReentrantBlockingLock@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?_Release@_NonReentrantBlockingLock@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ?_Release@_NonReentrantPPLLock@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?_Release@_NonReentrantPPLLock@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?_Release@_NonReentrantPPLLock@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ?_Release@_ReentrantBlockingLock@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?_Release@_ReentrantBlockingLock@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?_Release@_ReentrantBlockingLock@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ?_Release@_ReentrantLock@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?_Release@_ReentrantLock@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?_Release@_ReentrantLock@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ?_Release@_ReentrantPPLLock@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?_Release@_ReentrantPPLLock@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?_Release@_ReentrantPPLLock@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ?_Release@_Scheduler@details@Concurrency@@QAAIXZ +@ stub -arch=i386 ?_Release@_Scheduler@details@Concurrency@@QAEIXZ +@ stub -arch=win64 ?_Release@_Scheduler@details@Concurrency@@QEAAIXZ +@ stub -arch=arm ?_ReleaseRead@_ReaderWriterLock@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?_ReleaseRead@_ReaderWriterLock@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?_ReleaseRead@_ReaderWriterLock@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ?_ReleaseWrite@_ReaderWriterLock@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?_ReleaseWrite@_ReaderWriterLock@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?_ReleaseWrite@_ReaderWriterLock@details@Concurrency@@QEAAXXZ +@ stub ?_ReportUnobservedException@details@Concurrency@@YAXXZ +@ cdecl -arch=arm ?_Reset@?$_SpinWait@$00@details@Concurrency@@IAAXXZ(ptr) msvcr120.?_Reset@?$_SpinWait@$00@details@Concurrency@@IAAXXZ +@ thiscall -arch=i386 ?_Reset@?$_SpinWait@$00@details@Concurrency@@IAEXXZ(ptr) msvcr120.?_Reset@?$_SpinWait@$00@details@Concurrency@@IAEXXZ +@ cdecl -arch=win64 ?_Reset@?$_SpinWait@$00@details@Concurrency@@IEAAXXZ(ptr) msvcr120.?_Reset@?$_SpinWait@$00@details@Concurrency@@IEAAXXZ +@ cdecl -arch=arm ?_Reset@?$_SpinWait@$0A@@details@Concurrency@@IAAXXZ(ptr) msvcr120.?_Reset@?$_SpinWait@$0A@@details@Concurrency@@IAAXXZ +@ thiscall -arch=i386 ?_Reset@?$_SpinWait@$0A@@details@Concurrency@@IAEXXZ(ptr) msvcr120.?_Reset@?$_SpinWait@$0A@@details@Concurrency@@IAEXXZ +@ cdecl -arch=win64 ?_Reset@?$_SpinWait@$0A@@details@Concurrency@@IEAAXXZ(ptr) msvcr120.?_Reset@?$_SpinWait@$0A@@details@Concurrency@@IEAAXXZ +@ stub -arch=arm ?_RunAndWait@_StructuredTaskCollection@details@Concurrency@@QAA?AW4_TaskCollectionStatus@23@PAV_UnrealizedChore@23@@Z +@ stub -arch=i386 ?_RunAndWait@_StructuredTaskCollection@details@Concurrency@@QAG?AW4_TaskCollectionStatus@23@PAV_UnrealizedChore@23@@Z +@ stub -arch=win64 ?_RunAndWait@_StructuredTaskCollection@details@Concurrency@@QEAA?AW4_TaskCollectionStatus@23@PEAV_UnrealizedChore@23@@Z +@ stub -arch=arm ?_RunAndWait@_TaskCollection@details@Concurrency@@QAA?AW4_TaskCollectionStatus@23@PAV_UnrealizedChore@23@@Z +@ stub -arch=i386 ?_RunAndWait@_TaskCollection@details@Concurrency@@QAG?AW4_TaskCollectionStatus@23@PAV_UnrealizedChore@23@@Z +@ stub -arch=win64 ?_RunAndWait@_TaskCollection@details@Concurrency@@QEAA?AW4_TaskCollectionStatus@23@PEAV_UnrealizedChore@23@@Z +@ stub -arch=arm ?_Schedule@_StructuredTaskCollection@details@Concurrency@@QAAXPAV_UnrealizedChore@23@@Z +@ stub -arch=i386 ?_Schedule@_StructuredTaskCollection@details@Concurrency@@QAEXPAV_UnrealizedChore@23@@Z +@ stub -arch=win64 ?_Schedule@_StructuredTaskCollection@details@Concurrency@@QEAAXPEAV_UnrealizedChore@23@@Z +@ stub -arch=arm ?_Schedule@_StructuredTaskCollection@details@Concurrency@@QAAXPAV_UnrealizedChore@23@PAVlocation@3@@Z +@ stub -arch=i386 ?_Schedule@_StructuredTaskCollection@details@Concurrency@@QAEXPAV_UnrealizedChore@23@PAVlocation@3@@Z +@ stub -arch=win64 ?_Schedule@_StructuredTaskCollection@details@Concurrency@@QEAAXPEAV_UnrealizedChore@23@PEAVlocation@3@@Z +@ stub -arch=arm ?_Schedule@_TaskCollection@details@Concurrency@@QAAXPAV_UnrealizedChore@23@@Z +@ stub -arch=i386 ?_Schedule@_TaskCollection@details@Concurrency@@QAEXPAV_UnrealizedChore@23@@Z +@ stub -arch=win64 ?_Schedule@_TaskCollection@details@Concurrency@@QEAAXPEAV_UnrealizedChore@23@@Z +@ stub -arch=arm ?_Schedule@_TaskCollection@details@Concurrency@@QAAXPAV_UnrealizedChore@23@PAVlocation@3@@Z +@ stub -arch=i386 ?_Schedule@_TaskCollection@details@Concurrency@@QAEXPAV_UnrealizedChore@23@PAVlocation@3@@Z +@ stub -arch=win64 ?_Schedule@_TaskCollection@details@Concurrency@@QEAAXPEAV_UnrealizedChore@23@PEAVlocation@3@@Z +@ stub -arch=win32 ?_ScheduleTask@_CurrentScheduler@details@Concurrency@@SAXP6AXPAX@Z0@Z +@ stub -arch=win64 ?_ScheduleTask@_CurrentScheduler@details@Concurrency@@SAXP6AXPEAX@Z0@Z +@ cdecl -arch=arm ?_SetSpinCount@?$_SpinWait@$00@details@Concurrency@@QAAXI@Z(ptr long) msvcr120.?_SetSpinCount@?$_SpinWait@$00@details@Concurrency@@QAAXI@Z +@ thiscall -arch=i386 ?_SetSpinCount@?$_SpinWait@$00@details@Concurrency@@QAEXI@Z(ptr long) msvcr120.?_SetSpinCount@?$_SpinWait@$00@details@Concurrency@@QAEXI@Z +@ cdecl -arch=win64 ?_SetSpinCount@?$_SpinWait@$00@details@Concurrency@@QEAAXI@Z(ptr long) msvcr120.?_SetSpinCount@?$_SpinWait@$00@details@Concurrency@@QEAAXI@Z +@ cdecl -arch=arm ?_SetSpinCount@?$_SpinWait@$0A@@details@Concurrency@@QAAXI@Z(ptr long) msvcr120.?_SetSpinCount@?$_SpinWait@$0A@@details@Concurrency@@QAAXI@Z +@ thiscall -arch=i386 ?_SetSpinCount@?$_SpinWait@$0A@@details@Concurrency@@QAEXI@Z(ptr long) msvcr120.?_SetSpinCount@?$_SpinWait@$0A@@details@Concurrency@@QAEXI@Z +@ cdecl -arch=win64 ?_SetSpinCount@?$_SpinWait@$0A@@details@Concurrency@@QEAAXI@Z(ptr long) msvcr120.?_SetSpinCount@?$_SpinWait@$0A@@details@Concurrency@@QEAAXI@Z +@ stub ?_SetUnobservedExceptionHandler@details@Concurrency@@YAXP6AXXZ@Z +@ cdecl -arch=arm ?_ShouldSpinAgain@?$_SpinWait@$00@details@Concurrency@@IAA_NXZ(ptr) msvcr120.?_ShouldSpinAgain@?$_SpinWait@$00@details@Concurrency@@IAA_NXZ +@ thiscall -arch=i386 ?_ShouldSpinAgain@?$_SpinWait@$00@details@Concurrency@@IAE_NXZ(ptr) msvcr120.?_ShouldSpinAgain@?$_SpinWait@$00@details@Concurrency@@IAE_NXZ +@ cdecl -arch=win64 ?_ShouldSpinAgain@?$_SpinWait@$00@details@Concurrency@@IEAA_NXZ(ptr) msvcr120.?_ShouldSpinAgain@?$_SpinWait@$00@details@Concurrency@@IEAA_NXZ +@ cdecl -arch=arm ?_ShouldSpinAgain@?$_SpinWait@$0A@@details@Concurrency@@IAA_NXZ(ptr) msvcr120.?_ShouldSpinAgain@?$_SpinWait@$0A@@details@Concurrency@@IAA_NXZ +@ thiscall -arch=i386 ?_ShouldSpinAgain@?$_SpinWait@$0A@@details@Concurrency@@IAE_NXZ(ptr) msvcr120.?_ShouldSpinAgain@?$_SpinWait@$0A@@details@Concurrency@@IAE_NXZ +@ cdecl -arch=win64 ?_ShouldSpinAgain@?$_SpinWait@$0A@@details@Concurrency@@IEAA_NXZ(ptr) msvcr120.?_ShouldSpinAgain@?$_SpinWait@$0A@@details@Concurrency@@IEAA_NXZ +@ cdecl -arch=arm ?_SpinOnce@?$_SpinWait@$00@details@Concurrency@@QAA_NXZ(ptr) msvcr120.?_SpinOnce@?$_SpinWait@$00@details@Concurrency@@QAA_NXZ +@ thiscall -arch=i386 ?_SpinOnce@?$_SpinWait@$00@details@Concurrency@@QAE_NXZ(ptr) msvcr120.?_SpinOnce@?$_SpinWait@$00@details@Concurrency@@QAE_NXZ +@ cdecl -arch=win64 ?_SpinOnce@?$_SpinWait@$00@details@Concurrency@@QEAA_NXZ(ptr) msvcr120.?_SpinOnce@?$_SpinWait@$00@details@Concurrency@@QEAA_NXZ +@ cdecl -arch=arm ?_SpinOnce@?$_SpinWait@$0A@@details@Concurrency@@QAA_NXZ(ptr) msvcr120.?_SpinOnce@?$_SpinWait@$0A@@details@Concurrency@@QAA_NXZ +@ thiscall -arch=i386 ?_SpinOnce@?$_SpinWait@$0A@@details@Concurrency@@QAE_NXZ(ptr) msvcr120.?_SpinOnce@?$_SpinWait@$0A@@details@Concurrency@@QAE_NXZ +@ cdecl -arch=win64 ?_SpinOnce@?$_SpinWait@$0A@@details@Concurrency@@QEAA_NXZ(ptr) msvcr120.?_SpinOnce@?$_SpinWait@$0A@@details@Concurrency@@QEAA_NXZ +@ stub ?_SpinYield@Context@Concurrency@@SAXXZ +@ stub -arch=arm ?_Start@_Timer@details@Concurrency@@IAAXXZ +@ stub -arch=i386 ?_Start@_Timer@details@Concurrency@@IAEXXZ +@ stub -arch=win64 ?_Start@_Timer@details@Concurrency@@IEAAXXZ +@ stub -arch=arm ?_Stop@_Timer@details@Concurrency@@IAAXXZ +@ stub -arch=i386 ?_Stop@_Timer@details@Concurrency@@IAEXXZ +@ stub -arch=win64 ?_Stop@_Timer@details@Concurrency@@IEAAXXZ +@ stub -arch=arm ?_Tidy@exception@std@@AAAXXZ +@ stub -arch=i386 ?_Tidy@exception@std@@AAEXXZ +@ stub -arch=win64 ?_Tidy@exception@std@@AEAAXXZ +@ stub ?_Trace_agents@Concurrency@@YAXW4Agents_EventType@1@_JZZ +@ stub -arch=win32 ?_Trace_ppl_function@Concurrency@@YAXABU_GUID@@EW4ConcRT_EventType@1@@Z +@ stub -arch=win64 ?_Trace_ppl_function@Concurrency@@YAXAEBU_GUID@@EW4ConcRT_EventType@1@@Z +@ stub -arch=arm ?_TryAcquire@_NonReentrantBlockingLock@details@Concurrency@@QAA_NXZ +@ stub -arch=i386 ?_TryAcquire@_NonReentrantBlockingLock@details@Concurrency@@QAE_NXZ +@ stub -arch=win64 ?_TryAcquire@_NonReentrantBlockingLock@details@Concurrency@@QEAA_NXZ +@ stub -arch=arm ?_TryAcquire@_ReentrantBlockingLock@details@Concurrency@@QAA_NXZ +@ stub -arch=i386 ?_TryAcquire@_ReentrantBlockingLock@details@Concurrency@@QAE_NXZ +@ stub -arch=win64 ?_TryAcquire@_ReentrantBlockingLock@details@Concurrency@@QEAA_NXZ +@ stub -arch=arm ?_TryAcquire@_ReentrantLock@details@Concurrency@@QAA_NXZ +@ stub -arch=i386 ?_TryAcquire@_ReentrantLock@details@Concurrency@@QAE_NXZ +@ stub -arch=win64 ?_TryAcquire@_ReentrantLock@details@Concurrency@@QEAA_NXZ +@ stub -arch=arm ?_TryAcquireWrite@_ReaderWriterLock@details@Concurrency@@QAA_NXZ +@ stub -arch=i386 ?_TryAcquireWrite@_ReaderWriterLock@details@Concurrency@@QAE_NXZ +@ stub -arch=win64 ?_TryAcquireWrite@_ReaderWriterLock@details@Concurrency@@QEAA_NXZ +@ stub -arch=win32 ?_Type_info_dtor@type_info@@CAXPAV1@@Z +@ stub -arch=win64 ?_Type_info_dtor@type_info@@CAXPEAV1@@Z +@ stub -arch=win32 ?_Type_info_dtor_internal@type_info@@CAXPAV1@@Z +@ stub -arch=win64 ?_Type_info_dtor_internal@type_info@@CAXPEAV1@@Z +@ stub ?_UnderlyingYield@details@Concurrency@@YAXXZ +@ stub -arch=arm ?_ValidateExecute@@YAHP6AHXZ@Z +@ stub -arch=i386 ?_ValidateExecute@@YAHP6GHXZ@Z +@ stub -arch=win64 ?_ValidateExecute@@YAHP6A_JXZ@Z +@ stub -arch=win32 ?_ValidateRead@@YAHPBXI@Z +@ stub -arch=win64 ?_ValidateRead@@YAHPEBXI@Z +@ stub -arch=win32 ?_ValidateWrite@@YAHPAXI@Z +@ stub -arch=win64 ?_ValidateWrite@@YAHPEAXI@Z +@ cdecl ?_Value@_SpinCount@details@Concurrency@@SAIXZ() msvcr120.?_Value@_SpinCount@details@Concurrency@@SAIXZ +@ stub ?_Yield@_Context@details@Concurrency@@SAXXZ +@ stub -arch=win32 ?__ExceptionPtrAssign@@YAXPAXPBX@Z +@ stub -arch=win64 ?__ExceptionPtrAssign@@YAXPEAXPEBX@Z +@ stub -arch=win32 ?__ExceptionPtrCompare@@YA_NPBX0@Z +@ stub -arch=win64 ?__ExceptionPtrCompare@@YA_NPEBX0@Z +@ cdecl -arch=win32 ?__ExceptionPtrCopy@@YAXPAXPBX@Z(ptr ptr) msvcr120.?__ExceptionPtrCopy@@YAXPAXPBX@Z +@ cdecl -arch=win64 ?__ExceptionPtrCopy@@YAXPEAXPEBX@Z(ptr ptr) msvcr120.?__ExceptionPtrCopy@@YAXPEAXPEBX@Z +@ stub -arch=win32 ?__ExceptionPtrCopyException@@YAXPAXPBX1@Z +@ stub -arch=win64 ?__ExceptionPtrCopyException@@YAXPEAXPEBX1@Z +@ cdecl -arch=win32 ?__ExceptionPtrCreate@@YAXPAX@Z(ptr) msvcr120.?__ExceptionPtrCreate@@YAXPAX@Z +@ cdecl -arch=win64 ?__ExceptionPtrCreate@@YAXPEAX@Z(ptr) msvcr120.?__ExceptionPtrCreate@@YAXPEAX@Z +@ cdecl -arch=win32 ?__ExceptionPtrCurrentException@@YAXPAX@Z(ptr) msvcr120.?__ExceptionPtrCurrentException@@YAXPAX@Z +@ cdecl -arch=win64 ?__ExceptionPtrCurrentException@@YAXPEAX@Z(ptr) msvcr120.?__ExceptionPtrCurrentException@@YAXPEAX@Z +@ cdecl -arch=win32 ?__ExceptionPtrDestroy@@YAXPAX@Z(ptr) msvcr120.?__ExceptionPtrDestroy@@YAXPAX@Z +@ cdecl -arch=win64 ?__ExceptionPtrDestroy@@YAXPEAX@Z(ptr) msvcr120.?__ExceptionPtrDestroy@@YAXPEAX@Z +@ cdecl -arch=win32 ?__ExceptionPtrRethrow@@YAXPBX@Z(ptr) msvcr120.?__ExceptionPtrRethrow@@YAXPBX@Z +@ cdecl -arch=win64 ?__ExceptionPtrRethrow@@YAXPEBX@Z(ptr) msvcr120.?__ExceptionPtrRethrow@@YAXPEBX@Z +@ stub -arch=win32 ?__ExceptionPtrSwap@@YAXPAX0@Z +@ stub -arch=win64 ?__ExceptionPtrSwap@@YAXPEAX0@Z +@ stub -arch=win32 ?__ExceptionPtrToBool@@YA_NPBX@Z +@ stub -arch=win64 ?__ExceptionPtrToBool@@YA_NPEBX@Z +@ cdecl __uncaught_exception() msvcr120.__uncaught_exception +@ stub ?_inconsistency@@YAXXZ +@ cdecl -arch=win32 ?_invalid_parameter@@YAXPBG00II@Z(wstr wstr wstr long long) msvcr120.?_invalid_parameter@@YAXPBG00II@Z +@ cdecl -arch=win64 ?_invalid_parameter@@YAXPEBG00I_K@Z(wstr wstr wstr long long) msvcr120.?_invalid_parameter@@YAXPEBG00I_K@Z +@ cdecl -arch=win32 ?_is_exception_typeof@@YAHABVtype_info@@PAU_EXCEPTION_POINTERS@@@Z(ptr ptr) msvcr120.?_is_exception_typeof@@YAHABVtype_info@@PAU_EXCEPTION_POINTERS@@@Z +@ cdecl -arch=win64 ?_is_exception_typeof@@YAHAEBVtype_info@@PEAU_EXCEPTION_POINTERS@@@Z(ptr ptr) msvcr120.?_is_exception_typeof@@YAHAEBVtype_info@@PEAU_EXCEPTION_POINTERS@@@Z +@ cdecl -arch=arm ?_name_internal_method@type_info@@QBAPBDPAU__type_info_node@@@Z(ptr ptr) msvcr120.?_name_internal_method@type_info@@QBAPBDPAU__type_info_node@@@Z +@ thiscall -arch=i386 ?_name_internal_method@type_info@@QBEPBDPAU__type_info_node@@@Z(ptr ptr) msvcr120.?_name_internal_method@type_info@@QBEPBDPAU__type_info_node@@@Z +@ cdecl -arch=win64 ?_name_internal_method@type_info@@QEBAPEBDPEAU__type_info_node@@@Z(ptr ptr) msvcr120.?_name_internal_method@type_info@@QEBAPEBDPEAU__type_info_node@@@Z +@ varargs -arch=win32 ?_open@@YAHPBDHH@Z(str long) msvcr120.?_open@@YAHPBDHH@Z +@ varargs -arch=win64 ?_open@@YAHPEBDHH@Z(str long) msvcr120.?_open@@YAHPEBDHH@Z +@ cdecl -arch=win32 ?_query_new_handler@@YAP6AHI@ZXZ() msvcr120.?_query_new_handler@@YAP6AHI@ZXZ +@ cdecl -arch=win64 ?_query_new_handler@@YAP6AH_K@ZXZ() msvcr120.?_query_new_handler@@YAP6AH_K@ZXZ +@ cdecl ?_query_new_mode@@YAHXZ() msvcr120.?_query_new_mode@@YAHXZ +@ stub -arch=win32 ?_set_new_handler@@YAP6AHI@ZH@Z # int (__cdecl*__cdecl _set_new_handler(int))(unsigned int) +@ stub -arch=win64 ?_set_new_handler@@YAP6AH_K@ZH@Z # int (__cdecl*__cdecl _set_new_handler(int))(unsigned __int64) +@ cdecl -arch=win32 ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z(ptr) msvcr120.?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z +@ cdecl -arch=win64 ?_set_new_handler@@YAP6AH_K@ZP6AH0@Z@Z(ptr) msvcr120.?_set_new_handler@@YAP6AH_K@ZP6AH0@Z@Z +@ cdecl ?_set_new_mode@@YAHH@Z(long) msvcr120.?_set_new_mode@@YAHH@Z +@ stub -arch=win32 ?_set_se_translator@@YAP6AXIPAU_EXCEPTION_POINTERS@@@ZH@Z # void (__cdecl*__cdecl _set_se_translator(int))(unsigned int,struct _EXCEPTION_POINTERS *) +@ stub -arch=win64 ?_set_se_translator@@YAP6AXIPEAU_EXCEPTION_POINTERS@@@ZH@Z # void (__cdecl*__cdecl _set_se_translator(int))(unsigned int,struct _EXCEPTION_POINTERS * __ptr64) +@ cdecl -arch=win32 ?_set_se_translator@@YAP6AXIPAU_EXCEPTION_POINTERS@@@ZP6AXI0@Z@Z(ptr) msvcr120.?_set_se_translator@@YAP6AXIPAU_EXCEPTION_POINTERS@@@ZP6AXI0@Z@Z +@ cdecl -arch=win64 ?_set_se_translator@@YAP6AXIPEAU_EXCEPTION_POINTERS@@@ZP6AXI0@Z@Z(ptr) msvcr120.?_set_se_translator@@YAP6AXIPEAU_EXCEPTION_POINTERS@@@ZP6AXI0@Z@Z +@ cdecl -arch=win32 ?_sopen@@YAHPBDHHH@Z(str long long long) msvcr120.?_sopen@@YAHPBDHHH@Z +@ cdecl -arch=win64 ?_sopen@@YAHPEBDHHH@Z(str long long long) msvcr120.?_sopen@@YAHPEBDHHH@Z +@ stub -arch=arm ?_type_info_dtor_internal_method@type_info@@QAAXXZ +@ stub -arch=i386 ?_type_info_dtor_internal_method@type_info@@QAEXXZ # public: void __thiscall type_info::_type_info_dtor_internal_method(void) +@ stub -arch=win64 ?_type_info_dtor_internal_method@type_info@@QEAAXXZ # public: void __cdecl type_info::_type_info_dtor_internal_method(void) __ptr64 +@ cdecl -arch=win32 ?_wopen@@YAHPB_WHH@Z(wstr long long) msvcr120.?_wopen@@YAHPB_WHH@Z +@ cdecl -arch=win64 ?_wopen@@YAHPEB_WHH@Z(wstr long long) msvcr120.?_wopen@@YAHPEB_WHH@Z +@ cdecl -arch=win32 ?_wsopen@@YAHPB_WHHH@Z(wstr long long long) msvcr120.?_wsopen@@YAHPB_WHHH@Z +@ cdecl -arch=win64 ?_wsopen@@YAHPEB_WHHH@Z(wstr long long long) msvcr120.?_wsopen@@YAHPEB_WHHH@Z +@ cdecl -arch=arm ?before@type_info@@QBA_NABV1@@Z(ptr ptr) msvcr120.?before@type_info@@QBA_NABV1@@Z +@ thiscall -arch=i386 ?before@type_info@@QBE_NABV1@@Z(ptr ptr) msvcr120.?before@type_info@@QBE_NABV1@@Z +@ cdecl -arch=win64 ?before@type_info@@QEBA_NAEBV1@@Z(ptr ptr) msvcr120.?before@type_info@@QEBA_NAEBV1@@Z +@ stub ?current@location@Concurrency@@SA?AV12@XZ +@ stub ?from_numa_node@location@Concurrency@@SA?AV12@G@Z +@ stub -arch=arm ?get_error_code@scheduler_resource_allocation_error@Concurrency@@QBAJXZ +@ stub -arch=i386 ?get_error_code@scheduler_resource_allocation_error@Concurrency@@QBEJXZ +@ stub -arch=win64 ?get_error_code@scheduler_resource_allocation_error@Concurrency@@QEBAJXZ +@ cdecl -arch=arm ?lock@critical_section@Concurrency@@QAAXXZ(ptr) msvcr120.?lock@critical_section@Concurrency@@QAAXXZ +@ thiscall -arch=i386 ?lock@critical_section@Concurrency@@QAEXXZ(ptr) msvcr120.?lock@critical_section@Concurrency@@QAEXXZ +@ cdecl -arch=win64 ?lock@critical_section@Concurrency@@QEAAXXZ(ptr) msvcr120.?lock@critical_section@Concurrency@@QEAAXXZ +@ stub -arch=arm ?lock@reader_writer_lock@Concurrency@@QAAXXZ +@ stub -arch=i386 ?lock@reader_writer_lock@Concurrency@@QAEXXZ +@ stub -arch=win64 ?lock@reader_writer_lock@Concurrency@@QEAAXXZ +@ stub -arch=arm ?lock_read@reader_writer_lock@Concurrency@@QAAXXZ +@ stub -arch=i386 ?lock_read@reader_writer_lock@Concurrency@@QAEXXZ +@ stub -arch=win64 ?lock_read@reader_writer_lock@Concurrency@@QEAAXXZ +@ cdecl -arch=arm ?name@type_info@@QBAPBDPAU__type_info_node@@@Z(ptr ptr) msvcr120.?name@type_info@@QBAPBDPAU__type_info_node@@@Z +@ thiscall -arch=i386 ?name@type_info@@QBEPBDPAU__type_info_node@@@Z(ptr ptr) msvcr120.?name@type_info@@QBEPBDPAU__type_info_node@@@Z +@ cdecl -arch=win64 ?name@type_info@@QEBAPEBDPEAU__type_info_node@@@Z(ptr ptr) msvcr120.?name@type_info@@QEBAPEBDPEAU__type_info_node@@@Z +@ cdecl -arch=arm ?native_handle@critical_section@Concurrency@@QAAAAV12@XZ(ptr) msvcr120.?native_handle@critical_section@Concurrency@@QAAAAV12@XZ +@ thiscall -arch=i386 ?native_handle@critical_section@Concurrency@@QAEAAV12@XZ(ptr) msvcr120.?native_handle@critical_section@Concurrency@@QAEAAV12@XZ +@ cdecl -arch=win64 ?native_handle@critical_section@Concurrency@@QEAAAEAV12@XZ(ptr) msvcr120.?native_handle@critical_section@Concurrency@@QEAAAEAV12@XZ +@ stub -arch=arm ?notify_all@_Condition_variable@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?notify_all@_Condition_variable@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?notify_all@_Condition_variable@details@Concurrency@@QEAAXXZ +@ stub -arch=arm ?notify_one@_Condition_variable@details@Concurrency@@QAAXXZ +@ stub -arch=i386 ?notify_one@_Condition_variable@details@Concurrency@@QAEXXZ +@ stub -arch=win64 ?notify_one@_Condition_variable@details@Concurrency@@QEAAXXZ +@ cdecl -arch=arm ?raw_name@type_info@@QBAPBDXZ(ptr) msvcr120.?raw_name@type_info@@QBAPBDXZ +@ thiscall -arch=i386 ?raw_name@type_info@@QBEPBDXZ(ptr) msvcr120.?raw_name@type_info@@QBEPBDXZ +@ cdecl -arch=win64 ?raw_name@type_info@@QEBAPEBDXZ(ptr) msvcr120.?raw_name@type_info@@QEBAPEBDXZ +@ stub -arch=arm ?reset@event@Concurrency@@QAAXXZ +@ stub -arch=i386 ?reset@event@Concurrency@@QAEXXZ +@ stub -arch=win64 ?reset@event@Concurrency@@QEAAXXZ +@ stub -arch=arm ?set@event@Concurrency@@QAAXXZ +@ stub -arch=i386 ?set@event@Concurrency@@QAEXXZ +@ stub -arch=win64 ?set@event@Concurrency@@QEAAXXZ +@ cdecl ?set_new_handler@@YAP6AXXZP6AXXZ@Z(ptr) msvcr120.?set_new_handler@@YAP6AXXZP6AXXZ@Z +@ stub -arch=win32 ?set_task_execution_resources@Concurrency@@YAXGPAU_GROUP_AFFINITY@@@Z +@ stub -arch=win64 ?set_task_execution_resources@Concurrency@@YAXGPEAU_GROUP_AFFINITY@@@Z +@ stub -arch=win32 ?set_task_execution_resources@Concurrency@@YAXK@Z +@ stub -arch=win64 ?set_task_execution_resources@Concurrency@@YAX_K@Z +@ stub ?set_terminate@@YAP6AXXZH@Z +@ cdecl ?set_terminate@@YAP6AXXZP6AXXZ@Z(ptr) msvcr120.?set_terminate@@YAP6AXXZP6AXXZ@Z +@ stub ?set_unexpected@@YAP6AXXZH@Z +@ cdecl ?set_unexpected@@YAP6AXXZP6AXXZ@Z(ptr) msvcr120.?set_unexpected@@YAP6AXXZP6AXXZ@Z +@ varargs ?swprintf@@YAHPAGIPBGZZ(ptr long wstr) msvcr120.?swprintf@@YAHPAGIPBGZZ +@ varargs ?swprintf@@YAHPA_WIPB_WZZ(ptr long wstr) msvcr120.?swprintf@@YAHPA_WIPB_WZZ +@ cdecl ?terminate@@YAXXZ() msvcr120.?terminate@@YAXXZ +@ cdecl -arch=arm ?try_lock@critical_section@Concurrency@@QAA_NXZ(ptr) msvcr120.?try_lock@critical_section@Concurrency@@QAA_NXZ +@ thiscall -arch=i386 ?try_lock@critical_section@Concurrency@@QAE_NXZ(ptr) msvcr120.?try_lock@critical_section@Concurrency@@QAE_NXZ +@ cdecl -arch=win64 ?try_lock@critical_section@Concurrency@@QEAA_NXZ(ptr) msvcr120.?try_lock@critical_section@Concurrency@@QEAA_NXZ +@ stub -arch=arm ?try_lock@reader_writer_lock@Concurrency@@QAA_NXZ +@ stub -arch=i386 ?try_lock@reader_writer_lock@Concurrency@@QAE_NXZ +@ stub -arch=win64 ?try_lock@reader_writer_lock@Concurrency@@QEAA_NXZ +@ cdecl -arch=arm ?try_lock_for@critical_section@Concurrency@@QAA_NI@Z(ptr long) msvcr120.?try_lock_for@critical_section@Concurrency@@QAA_NI@Z +@ thiscall -arch=i386 ?try_lock_for@critical_section@Concurrency@@QAE_NI@Z(ptr long) msvcr120.?try_lock_for@critical_section@Concurrency@@QAE_NI@Z +@ cdecl -arch=win64 ?try_lock_for@critical_section@Concurrency@@QEAA_NI@Z(ptr long) msvcr120.?try_lock_for@critical_section@Concurrency@@QEAA_NI@Z +@ stub -arch=arm ?try_lock_read@reader_writer_lock@Concurrency@@QAA_NXZ +@ stub -arch=i386 ?try_lock_read@reader_writer_lock@Concurrency@@QAE_NXZ +@ stub -arch=win64 ?try_lock_read@reader_writer_lock@Concurrency@@QEAA_NXZ +@ cdecl ?unexpected@@YAXXZ() msvcr120.?unexpected@@YAXXZ +@ cdecl -arch=arm ?unlock@critical_section@Concurrency@@QAAXXZ(ptr) msvcr120.?unlock@critical_section@Concurrency@@QAAXXZ +@ thiscall -arch=i386 ?unlock@critical_section@Concurrency@@QAEXXZ(ptr) msvcr120.?unlock@critical_section@Concurrency@@QAEXXZ +@ cdecl -arch=win64 ?unlock@critical_section@Concurrency@@QEAAXXZ(ptr) msvcr120.?unlock@critical_section@Concurrency@@QEAAXXZ +@ stub -arch=arm ?unlock@reader_writer_lock@Concurrency@@QAAXXZ +@ stub -arch=i386 ?unlock@reader_writer_lock@Concurrency@@QAEXXZ +@ stub -arch=win64 ?unlock@reader_writer_lock@Concurrency@@QEAAXXZ +@ cdecl ?vswprintf@@YAHPA_WIPB_WPAD@Z(ptr long wstr ptr) msvcr120.?vswprintf@@YAHPA_WIPB_WPAD@Z +@ stub ?wait@Concurrency@@YAXI@Z +@ stub -arch=arm ?wait@_Condition_variable@details@Concurrency@@QAAXAAVcritical_section@3@@Z +@ stub -arch=i386 ?wait@_Condition_variable@details@Concurrency@@QAEXAAVcritical_section@3@@Z +@ stub -arch=win64 ?wait@_Condition_variable@details@Concurrency@@QEAAXAEAVcritical_section@3@@Z +@ stub -arch=arm ?wait@event@Concurrency@@QAAII@Z +@ stub -arch=i386 ?wait@event@Concurrency@@QAEII@Z +@ stub -arch=win64 ?wait@event@Concurrency@@QEAA_KI@Z +@ stub -arch=arm ?wait_for@_Condition_variable@details@Concurrency@@QAA_NAAVcritical_section@3@I@Z +@ stub -arch=i386 ?wait_for@_Condition_variable@details@Concurrency@@QAE_NAAVcritical_section@3@I@Z +@ stub -arch=win64 ?wait_for@_Condition_variable@details@Concurrency@@QEAA_NAEAVcritical_section@3@I@Z +@ stub -arch=win32 ?wait_for_multiple@event@Concurrency@@SAIPAPAV12@I_NI@Z +@ stub -arch=win64 ?wait_for_multiple@event@Concurrency@@SA_KPEAPEAV12@_K_NI@Z +@ cdecl -arch=arm ?what@exception@std@@UBAPBDXZ(ptr) msvcr120.?what@exception@std@@UBAPBDXZ +@ thiscall -arch=i386 ?what@exception@std@@UBEPBDXZ(ptr) msvcr120.?what@exception@std@@UBEPBDXZ +@ cdecl -arch=win64 ?what@exception@std@@UEBAPEBDXZ(ptr) msvcr120.?what@exception@std@@UEBAPEBDXZ +@ cdecl -norelay $I10_OUTPUT(double long long long ptr) msvcr120.$I10_OUTPUT +@ cdecl -arch=i386 _CIacos() msvcr120._CIacos +@ cdecl -arch=i386 _CIasin() msvcr120._CIasin +@ cdecl -arch=i386 _CIatan() msvcr120._CIatan +@ cdecl -arch=i386 _CIatan2() msvcr120._CIatan2 +@ cdecl -arch=i386 _CIcos() msvcr120._CIcos +@ cdecl -arch=i386 _CIcosh() msvcr120._CIcosh +@ cdecl -arch=i386 _CIexp() msvcr120._CIexp +@ cdecl -arch=i386 _CIfmod() msvcr120._CIfmod +@ cdecl -arch=i386 _CIlog() msvcr120._CIlog +@ cdecl -arch=i386 _CIlog10() msvcr120._CIlog10 +@ cdecl -arch=i386 _CIpow() msvcr120._CIpow +@ cdecl -arch=i386 _CIsin() msvcr120._CIsin +@ cdecl -arch=i386 _CIsinh() msvcr120._CIsinh +@ cdecl -arch=i386 _CIsqrt() msvcr120._CIsqrt +@ cdecl -arch=i386 _CItan() msvcr120._CItan +@ cdecl -arch=i386 _CItanh() msvcr120._CItanh +@ stub _Cbuild +@ stub _CreateFrameInfo +@ stdcall _CxxThrowException(long long) msvcr120._CxxThrowException +@ cdecl -arch=i386 -norelay _EH_prolog() msvcr120._EH_prolog +@ stub -arch=arm _FPE_Raise +@ stub _FCbuild +@ stub _FindAndUnlinkFrame +@ stub -arch=win64 _GetImageBase +@ stub -arch=win64 _GetThrowImageBase +@ cdecl _Getdays() msvcr120._Getdays +@ cdecl _Getmonths() msvcr120._Getmonths +@ cdecl _Gettnames() msvcr120._Gettnames +@ extern _HUGE msvcr120._HUGE +@ stub _IsExceptionObjectToBeDestroyed +@ stub _LCbuild +@ stub -arch=i386 _NLG_Dispatch2 +@ stub -arch=arm,win64 __NLG_Dispatch2 +@ stub -arch=i386 _NLG_Return +@ stub -arch=i386 _NLG_Return2 +@ stub -arch=arm,win64 __NLG_Return2 +@ stub _SetWinRTOutOfMemoryExceptionCallback +@ stub -arch=win64 _SetImageBase +@ stub -arch=win64 _SetThrowImageBase +@ cdecl _Strftime(str long str ptr ptr) msvcr120._Strftime +@ stub _W_Getdays +@ stub _W_Getmonths +@ stub _W_Gettnames +@ stub _Wcsftime +@ cdecl _XcptFilter(long ptr) msvcr120._XcptFilter +@ cdecl __AdjustPointer(ptr ptr) msvcr120.__AdjustPointer +@ stub __BuildCatchObject +@ stub __BuildCatchObjectHelper +@ stdcall -arch=x86_64 __C_specific_handler(ptr long ptr ptr) msvcr120.__C_specific_handler +@ cdecl -arch=i386,x86_64,arm __CppXcptFilter(long ptr) msvcr120.__CppXcptFilter +@ cdecl -arch=i386,x86_64,arm __CxxDetectRethrow(ptr) msvcr120.__CxxDetectRethrow +@ stub __CxxExceptionFilter +@ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler(ptr ptr ptr ptr) msvcr120.__CxxFrameHandler +@ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler2(ptr ptr ptr ptr) msvcr120.__CxxFrameHandler2 +@ cdecl -arch=i386,x86_64,arm -norelay __CxxFrameHandler3(ptr ptr ptr ptr) msvcr120.__CxxFrameHandler3 +@ stdcall -arch=i386 __CxxLongjmpUnwind(ptr) msvcr120.__CxxLongjmpUnwind +@ cdecl -arch=i386,x86_64,arm __CxxQueryExceptionSize() msvcr120.__CxxQueryExceptionSize +@ stub __CxxRegisterExceptionObject +@ stub __CxxUnregisterExceptionObject +@ stub __DestructExceptionObject +@ stub __FrameUnwindFilter +@ stub __GetPlatformExceptionInfo +@ cdecl __RTCastToVoid(ptr) msvcr120.__RTCastToVoid +@ cdecl __RTDynamicCast(ptr long ptr ptr long) msvcr120.__RTDynamicCast +@ cdecl __RTtypeid(ptr) msvcr120.__RTtypeid +@ cdecl __STRINGTOLD(ptr ptr str long) msvcr120.__STRINGTOLD +@ stub __STRINGTOLD_L +@ stub __TypeMatch +@ cdecl ___lc_codepage_func() msvcr120.___lc_codepage_func +@ cdecl ___lc_collate_cp_func() msvcr120.___lc_collate_cp_func +@ stub ___lc_locale_name_func +@ cdecl ___mb_cur_max_func() msvcr120.___mb_cur_max_func +@ cdecl ___mb_cur_max_l_func(ptr) msvcr120.___mb_cur_max_l_func +@ cdecl ___setlc_active_func() msvcr120.___setlc_active_func +@ cdecl ___unguarded_readlc_active_add_func() msvcr120.___unguarded_readlc_active_add_func +@ extern __argc msvcr120.__argc +@ extern __argv msvcr120.__argv +@ extern __badioinfo msvcr120.__badioinfo +@ cdecl __clean_type_info_names_internal(ptr) msvcr120.__clean_type_info_names_internal +@ cdecl -arch=i386 __control87_2(long long ptr ptr) msvcr120.__control87_2 +@ stub __create_locale +@ stub -arch=win64 __crtCaptureCurrentContext +@ stub -arch=win64 __crtCapturePreviousContext +@ stub __crtCloseWinRTThreadHandle +@ cdecl __crtCompareStringA(long long str long str long) msvcr120.__crtCompareStringA +@ cdecl __crtCompareStringW(long long wstr long wstr long) msvcr120.__crtCompareStringW +@ stub __crtCreateWinRTThread +@ stub __crtGetCurrentWinRTThread +@ stub __crtGetCurrentWinRTThreadId +@ stub __crtGetExitCodeWinRTThread +@ stub __crtIsPackagedApp +@ cdecl __crtLCMapStringA(long long str long ptr long long long) msvcr120.__crtLCMapStringA +@ cdecl __crtLCMapStringW(long long wstr long ptr long long long) msvcr120.__crtLCMapStringW +@ stub __crtSleep +@ stub __crtWaitForWinRTThreadExit +@ cdecl __daylight() msvcr120.__daylight +@ cdecl __dllonexit(ptr ptr ptr) msvcr120.__dllonexit +@ cdecl __doserrno() msvcr120.__doserrno +@ cdecl __dstbias() msvcr120.__dstbias +@ cdecl __fpecode() msvcr120.__fpecode +@ stub __free_locale +@ stub __get_current_locale +@ stub __get_flsindex +@ stub __get_tlsindex +@ cdecl __getmainargs(ptr ptr ptr long ptr) msvcr120.__getmainargs +@ extern __initenv msvcr120.__initenv +@ cdecl __iob_func() msvcr120.__iob_func +@ cdecl __isascii(long) msvcr120.__isascii +@ cdecl __iscsym(long) msvcr120.__iscsym +@ cdecl __iscsymf(long) msvcr120.__iscsymf +@ stub __iswcsym +@ stub __iswcsymf +@ stub -arch=arm __jump_unwind +# extern __lconv +@ cdecl __lconv_init() msvcr120.__lconv_init +@ cdecl -arch=i386 __libm_sse2_acos() msvcr120.__libm_sse2_acos +@ cdecl -arch=i386 __libm_sse2_acosf() msvcr120.__libm_sse2_acosf +@ cdecl -arch=i386 __libm_sse2_asin() msvcr120.__libm_sse2_asin +@ cdecl -arch=i386 __libm_sse2_asinf() msvcr120.__libm_sse2_asinf +@ cdecl -arch=i386 __libm_sse2_atan() msvcr120.__libm_sse2_atan +@ cdecl -arch=i386 __libm_sse2_atan2() msvcr120.__libm_sse2_atan2 +@ cdecl -arch=i386 __libm_sse2_atanf() msvcr120.__libm_sse2_atanf +@ cdecl -arch=i386 __libm_sse2_cos() msvcr120.__libm_sse2_cos +@ cdecl -arch=i386 __libm_sse2_cosf() msvcr120.__libm_sse2_cosf +@ cdecl -arch=i386 __libm_sse2_exp() msvcr120.__libm_sse2_exp +@ cdecl -arch=i386 __libm_sse2_expf() msvcr120.__libm_sse2_expf +@ cdecl -arch=i386 __libm_sse2_log() msvcr120.__libm_sse2_log +@ cdecl -arch=i386 __libm_sse2_log10() msvcr120.__libm_sse2_log10 +@ cdecl -arch=i386 __libm_sse2_log10f() msvcr120.__libm_sse2_log10f +@ cdecl -arch=i386 __libm_sse2_logf() msvcr120.__libm_sse2_logf +@ cdecl -arch=i386 __libm_sse2_pow() msvcr120.__libm_sse2_pow +@ cdecl -arch=i386 __libm_sse2_powf() msvcr120.__libm_sse2_powf +@ cdecl -arch=i386 __libm_sse2_sin() msvcr120.__libm_sse2_sin +@ cdecl -arch=i386 __libm_sse2_sinf() msvcr120.__libm_sse2_sinf +@ cdecl -arch=i386 __libm_sse2_tan() msvcr120.__libm_sse2_tan +@ cdecl -arch=i386 __libm_sse2_tanf() msvcr120.__libm_sse2_tanf +@ extern __mb_cur_max msvcr120.__mb_cur_max +@ cdecl __p___argc() msvcr120.__p___argc +@ cdecl __p___argv() msvcr120.__p___argv +@ cdecl __p___mb_cur_max() msvcr120.__p___mb_cur_max +@ cdecl __p___wargv() msvcr120.__p___wargv +@ cdecl __p__acmdln() msvcr120.__p__acmdln +@ cdecl __p__commode() msvcr120.__p__commode +@ cdecl __p__daylight() msvcr120.__p__daylight +@ cdecl __p__dstbias() msvcr120.__p__dstbias +@ cdecl __p__fmode() msvcr120.__p__fmode +@ cdecl __p__iob() msvcr120.__p__iob +@ cdecl __p__mbcasemap() msvcr120.__p__mbcasemap +@ cdecl __p__mbctype() msvcr120.__p__mbctype +@ cdecl __p__pctype() msvcr120.__p__pctype +@ cdecl __p__pgmptr() msvcr120.__p__pgmptr +@ cdecl __p__pwctype() msvcr120.__p__pwctype +@ cdecl __p__timezone() msvcr120.__p__timezone +@ cdecl __p__tzname() msvcr120.__p__tzname +@ cdecl __p__wcmdln() msvcr120.__p__wcmdln +@ cdecl __p__wpgmptr() msvcr120.__p__wpgmptr +@ cdecl __pctype_func() msvcr120.__pctype_func +@ extern __pioinfo msvcr120.__pioinfo +@ stub __pwctype_func +@ cdecl __pxcptinfoptrs() msvcr120.__pxcptinfoptrs +@ stub __report_gsfailure +@ extern __setlc_active msvcr120.__setlc_active +@ cdecl __setusermatherr(ptr) msvcr120.__setusermatherr +@ stub __strncnt +@ stub __swprintf_l +@ cdecl __sys_errlist() msvcr120.__sys_errlist +@ cdecl __sys_nerr() msvcr120.__sys_nerr +@ cdecl __threadhandle() msvcr120.__threadhandle +@ cdecl __threadid() msvcr120.__threadid +@ cdecl __timezone() msvcr120.__timezone +@ cdecl __toascii(long) msvcr120.__toascii +@ cdecl __tzname() msvcr120.__tzname +@ cdecl __unDName(ptr str long ptr ptr long) msvcr120.__unDName +@ cdecl __unDNameEx(ptr str long ptr ptr ptr long) msvcr120.__unDNameEx +@ stub __unDNameHelper +@ extern __unguarded_readlc_active msvcr120.__unguarded_readlc_active +@ cdecl __vswprintf_l(ptr wstr ptr ptr) msvcr120.__vswprintf_l +@ extern __wargv msvcr120.__wargv +@ cdecl __wcserror(wstr) msvcr120.__wcserror +@ cdecl __wcserror_s(ptr long wstr) msvcr120.__wcserror_s +@ stub __wcsncnt +@ cdecl __wgetmainargs(ptr ptr ptr long ptr) msvcr120.__wgetmainargs +@ extern __winitenv msvcr120.__winitenv +@ cdecl _abnormal_termination() msvcr120._abnormal_termination +@ cdecl -ret64 _abs64(int64) msvcr120._abs64 +@ cdecl _access(str long) msvcr120._access +@ cdecl _access_s(str long) msvcr120._access_s +@ extern _acmdln msvcr120._acmdln +@ cdecl _aligned_free(ptr) msvcr120._aligned_free +@ cdecl _aligned_malloc(long long) msvcr120._aligned_malloc +@ cdecl _aligned_msize(ptr long long) msvcr120._aligned_msize +@ cdecl _aligned_offset_malloc(long long long) msvcr120._aligned_offset_malloc +@ cdecl _aligned_offset_realloc(ptr long long long) msvcr120._aligned_offset_realloc +@ stub _aligned_offset_recalloc +@ cdecl _aligned_realloc(ptr long long) msvcr120._aligned_realloc +@ stub _aligned_recalloc +@ cdecl _amsg_exit(long) msvcr120._amsg_exit +@ cdecl _assert(str str long) msvcr120._assert +@ cdecl _atodbl(ptr str) msvcr120._atodbl +@ cdecl _atodbl_l(ptr str ptr) msvcr120._atodbl_l +@ cdecl _atof_l(str ptr) msvcr120._atof_l +@ cdecl _atoflt(ptr str) msvcr120._atoflt +@ cdecl _atoflt_l(ptr str ptr) msvcr120._atoflt_l +@ cdecl -ret64 _atoi64(str) msvcr120._atoi64 +@ stub _atoi64_l +@ cdecl _atoi_l(str ptr) msvcr120._atoi_l +@ stub _atol_l +@ cdecl _atoldbl(ptr str) msvcr120._atoldbl +@ stub _atoldbl_l +@ stub _atoll_l +@ cdecl _byteswap_uint64(int64) msvcr120._byteswap_uint64 +@ cdecl _byteswap_ulong(long) msvcr120._byteswap_ulong +@ cdecl _byteswap_ushort(long) msvcr120._byteswap_ushort +@ cdecl _c_exit() msvcr120._c_exit +@ cdecl _cabs(long) msvcr120._cabs +@ cdecl _callnewh(long) msvcr120._callnewh +@ cdecl _calloc_crt(long long) msvcr120._calloc_crt +@ cdecl _cexit() msvcr120._cexit +@ cdecl _chgsign(double) msvcr120._chgsign +@ cdecl -arch=arm,x86_64 _chgsignf(float) msvcr120._chgsignf +@ cdecl -arch=i386 -norelay _chkesp() msvcr120._chkesp +@ cdecl _chmod(str long) msvcr120._chmod +@ cdecl _chsize(long long) msvcr120._chsize +@ cdecl _chsize_s(long int64) msvcr120._chsize_s +@ cdecl _clearfp() msvcr120._clearfp +@ cdecl _close(long) msvcr120._close +@ cdecl _commit(long) msvcr120._commit +@ extern _commode msvcr120._commode +@ cdecl _configthreadlocale(long) msvcr120._configthreadlocale +@ cdecl _control87(long long) msvcr120._control87 +@ cdecl _controlfp(long long) msvcr120._controlfp +@ cdecl _controlfp_s(ptr long long) msvcr120._controlfp_s +@ cdecl _copysign(double double) msvcr120._copysign +@ cdecl -arch=arm,x86_64 _copysignf(float float) msvcr120._copysignf +@ cdecl _creat(str long) msvcr120._creat +@ cdecl _create_locale(long str) msvcr120._create_locale +@ stub -arch=i386 _crt_debugger_hook +@ stub -arch=arm,win64 __crt_debugger_hook +@ cdecl _ctime32(ptr) msvcr120._ctime32 +@ cdecl _ctime32_s(str long ptr) msvcr120._ctime32_s +@ cdecl _ctime64(ptr) msvcr120._ctime64 +@ cdecl _ctime64_s(str long ptr) msvcr120._ctime64_s +@ extern _daylight msvcr120._daylight +@ cdecl _dclass(double) msvcr120._dclass +@ cdecl _difftime32(long long) msvcr120._difftime32 +@ cdecl _difftime64(long long) msvcr120._difftime64 +@ stub _dosmaperr +@ stub _dpcomp +@ stub _dsign +@ extern _dstbias msvcr120._dstbias +@ stub _dtest +@ cdecl _dup(long) msvcr120._dup +@ cdecl _dup2(long long) msvcr120._dup2 +@ cdecl _ecvt(double long ptr ptr) msvcr120._ecvt +@ cdecl _ecvt_s(str long double long ptr ptr) msvcr120._ecvt_s +@ extern _environ msvcr120._environ +@ cdecl _eof(long) msvcr120._eof +@ cdecl _errno() msvcr120._errno +@ stub _except1 +@ cdecl -arch=i386 _except_handler2(ptr ptr ptr ptr) msvcr120._except_handler2 +@ cdecl -arch=i386 _except_handler3(ptr ptr ptr ptr) msvcr120._except_handler3 +@ cdecl -arch=i386 _except_handler4_common(ptr ptr ptr ptr ptr ptr) msvcr120._except_handler4_common +@ stub _exit_app +@ cdecl _expand(ptr long) msvcr120._expand +@ cdecl _fclose_nolock(ptr) msvcr120._fclose_nolock +@ cdecl _fcloseall() msvcr120._fcloseall +@ cdecl _fcvt(double long ptr ptr) msvcr120._fcvt +@ cdecl _fcvt_s(ptr long double long ptr ptr) msvcr120._fcvt_s +@ cdecl _fdclass(float) msvcr120._fdclass +@ cdecl _fdopen(long str) msvcr120._fdopen +@ stub _fdpcomp +@ stub _fdsign +@ stub _fdtest +@ cdecl _fflush_nolock(ptr) msvcr120._fflush_nolock +@ cdecl _fgetc_nolock(ptr) msvcr120._fgetc_nolock +@ cdecl _fgetchar() msvcr120._fgetchar +@ cdecl _fgetwc_nolock(ptr) msvcr120._fgetwc_nolock +@ cdecl _fgetwchar() msvcr120._fgetwchar +@ cdecl _filbuf(ptr) msvcr120._filbuf +@ cdecl _filelength(long) msvcr120._filelength +@ cdecl -ret64 _filelengthi64(long) msvcr120._filelengthi64 +@ cdecl _fileno(ptr) msvcr120._fileno +@ cdecl _findclose(long) msvcr120._findclose +@ cdecl _findfirst32(str ptr) msvcr120._findfirst32 +@ stub _findfirst32i64 +@ cdecl _findfirst64(str ptr) msvcr120._findfirst64 +@ cdecl _findfirst64i32(str ptr) msvcr120._findfirst64i32 +@ cdecl _findnext32(long ptr) msvcr120._findnext32 +@ stub _findnext32i64 +@ cdecl _findnext64(long ptr) msvcr120._findnext64 +@ cdecl _findnext64i32(long ptr) msvcr120._findnext64i32 +@ cdecl _finite(double) msvcr120._finite +@ cdecl -arch=arm,x86_64 _finitef(float) msvcr120._finitef +@ cdecl _flsbuf(long ptr) msvcr120._flsbuf +@ cdecl _flushall() msvcr120._flushall +@ extern _fmode msvcr120._fmode +@ cdecl _fpclass(double) msvcr120._fpclass +# stub -arch=x86_64 _fpclassf +@ cdecl _fpieee_flt(long ptr ptr) msvcr120._fpieee_flt +@ cdecl _fpreset() msvcr120._fpreset +@ stub _fprintf_l +@ stub _fprintf_p +@ stub _fprintf_p_l +@ stub _fprintf_s_l +@ cdecl _fputc_nolock(long ptr) msvcr120._fputc_nolock +@ cdecl _fputchar(long) msvcr120._fputchar +@ cdecl _fputwc_nolock(long ptr) msvcr120._fputwc_nolock +@ cdecl _fputwchar(long) msvcr120._fputwchar +@ cdecl _fread_nolock(ptr long long ptr) msvcr120._fread_nolock +@ cdecl _fread_nolock_s(ptr long long long ptr) msvcr120._fread_nolock_s +@ cdecl _free_locale(ptr) msvcr120._free_locale +@ stub _freea +@ stub _freea_s +@ stub _freefls +@ varargs _fscanf_l(ptr str ptr) msvcr120._fscanf_l +@ varargs _fscanf_s_l(ptr str ptr) msvcr120._fscanf_s_l +@ cdecl _fseek_nolock(ptr long long) msvcr120._fseek_nolock +@ cdecl _fseeki64(ptr int64 long) msvcr120._fseeki64 +@ cdecl _fseeki64_nolock(ptr int64 long) msvcr120._fseeki64_nolock +@ cdecl _fsopen(str str long) msvcr120._fsopen +@ cdecl _fstat32(long ptr) msvcr120._fstat32 +@ stub _fstat32i64 +@ cdecl _fstat64(long ptr) msvcr120._fstat64 +@ cdecl _fstat64i32(long ptr) msvcr120._fstat64i32 +@ cdecl _ftell_nolock(ptr) msvcr120._ftell_nolock +@ cdecl -ret64 _ftelli64(ptr) msvcr120._ftelli64 +@ cdecl -ret64 _ftelli64_nolock(ptr) msvcr120._ftelli64_nolock +@ cdecl _ftime32(ptr) msvcr120._ftime32 +@ cdecl _ftime32_s(ptr) msvcr120._ftime32_s +@ cdecl _ftime64(ptr) msvcr120._ftime64 +@ cdecl _ftime64_s(ptr) msvcr120._ftime64_s +@ cdecl -arch=i386 -ret64 _ftol() msvcr120._ftol +@ cdecl _fullpath(ptr str long) msvcr120._fullpath +@ cdecl _futime32(long ptr) msvcr120._futime32 +@ cdecl _futime64(long ptr) msvcr120._futime64 +@ varargs _fwprintf_l(ptr wstr ptr) msvcr120._fwprintf_l +@ stub _fwprintf_p +@ stub _fwprintf_p_l +@ stub _fwprintf_s_l +@ cdecl _fwrite_nolock(ptr long long ptr) msvcr120._fwrite_nolock +@ varargs _fwscanf_l(ptr wstr ptr) msvcr120._fwscanf_l +@ varargs _fwscanf_s_l(ptr wstr ptr) msvcr120._fwscanf_s_l +@ cdecl _gcvt(double long str) msvcr120._gcvt +@ cdecl _gcvt_s(ptr long double long) msvcr120._gcvt_s +@ cdecl _get_current_locale() msvcr120._get_current_locale +@ cdecl _get_daylight(ptr) msvcr120._get_daylight +@ cdecl _get_doserrno(ptr) msvcr120._get_doserrno +@ stub _get_dstbias +@ cdecl _get_errno(ptr) msvcr120._get_errno +@ cdecl _get_fmode(ptr) msvcr120._get_fmode +@ cdecl _get_heap_handle() msvcr120._get_heap_handle +@ cdecl _get_invalid_parameter_handler() msvcr120._get_invalid_parameter_handler +@ cdecl _get_osfhandle(long) msvcr120._get_osfhandle +@ cdecl _get_output_format() msvcr120._get_output_format +@ cdecl _get_pgmptr(ptr) msvcr120._get_pgmptr +@ cdecl _get_printf_count_output() msvcr120._get_printf_count_output +@ stub _get_purecall_handler +@ cdecl _get_terminate() msvcr120._get_terminate +@ cdecl _get_timezone(ptr) msvcr120._get_timezone +@ cdecl _get_tzname(ptr str long long) msvcr120._get_tzname +@ cdecl _get_unexpected() msvcr120._get_unexpected +@ cdecl _get_wpgmptr(ptr) msvcr120._get_wpgmptr +@ cdecl _getc_nolock(ptr) msvcr120._getc_nolock +@ cdecl _getmaxstdio() msvcr120._getmaxstdio +@ cdecl _getmbcp() msvcr120._getmbcp +@ cdecl _getptd() msvcr120._getptd +@ cdecl _getw(ptr) msvcr120._getw +@ cdecl _getwc_nolock(ptr) msvcr120._getwc_nolock +@ cdecl _getws(ptr) msvcr120._getws +@ stub _getws_s +@ cdecl -arch=i386 _global_unwind2(ptr) msvcr120._global_unwind2 +@ cdecl _gmtime32(ptr) msvcr120._gmtime32 +@ cdecl _gmtime32_s(ptr ptr) msvcr120._gmtime32_s +@ cdecl _gmtime64(ptr) msvcr120._gmtime64 +@ cdecl _gmtime64_s(ptr ptr) msvcr120._gmtime64_s +@ cdecl _hypot(double double) msvcr120._hypot +@ cdecl _hypotf(float float) msvcr120._hypotf +@ cdecl _i64toa(int64 ptr long) msvcr120._i64toa +@ cdecl _i64toa_s(int64 ptr long long) msvcr120._i64toa_s +@ cdecl _i64tow(int64 ptr long) msvcr120._i64tow +@ cdecl _i64tow_s(int64 ptr long long) msvcr120._i64tow_s +@ stub _initptd +@ cdecl _initterm(ptr ptr) msvcr120._initterm +@ cdecl _initterm_e(ptr ptr) msvcr120._initterm_e +@ cdecl _invalid_parameter(wstr wstr wstr long long) msvcr120._invalid_parameter +@ cdecl _invalid_parameter_noinfo() msvcr120._invalid_parameter_noinfo +@ stub _invalid_parameter_noinfo_noreturn +@ stub _invoke_watson +@ extern _iob msvcr120._iob +@ cdecl _isalnum_l(long ptr) msvcr120._isalnum_l +@ cdecl _isalpha_l(long ptr) msvcr120._isalpha_l +@ cdecl _isatty(long) msvcr120._isatty +@ stub _isblank_l +@ cdecl _iscntrl_l(long ptr) msvcr120._iscntrl_l +@ cdecl _isctype(long long) msvcr120._isctype +@ cdecl _isctype_l(long long ptr) msvcr120._isctype_l +@ cdecl _isdigit_l(long ptr) msvcr120._isdigit_l +@ cdecl _isgraph_l(long ptr) msvcr120._isgraph_l +@ cdecl _isleadbyte_l(long ptr) msvcr120._isleadbyte_l +@ cdecl _islower_l(long ptr) msvcr120._islower_l +@ cdecl _ismbbalnum(long) msvcr120._ismbbalnum +@ stub _ismbbalnum_l +@ cdecl _ismbbalpha(long) msvcr120._ismbbalpha +@ stub _ismbbalpha_l +@ stub _ismbbblank +@ stub _ismbbblank_l +@ cdecl _ismbbgraph(long) msvcr120._ismbbgraph +@ stub _ismbbgraph_l +@ cdecl _ismbbkalnum(long) msvcr120._ismbbkalnum +@ stub _ismbbkalnum_l +@ cdecl _ismbbkana(long) msvcr120._ismbbkana +@ stub _ismbbkana_l +@ cdecl _ismbbkprint(long) msvcr120._ismbbkprint +@ stub _ismbbkprint_l +@ cdecl _ismbbkpunct(long) msvcr120._ismbbkpunct +@ stub _ismbbkpunct_l +@ cdecl _ismbblead(long) msvcr120._ismbblead +@ stub _ismbblead_l +@ cdecl _ismbbprint(long) msvcr120._ismbbprint +@ stub _ismbbprint_l +@ cdecl _ismbbpunct(long) msvcr120._ismbbpunct +@ stub _ismbbpunct_l +@ cdecl _ismbbtrail(long) msvcr120._ismbbtrail +@ stub _ismbbtrail_l +@ cdecl _isnan(double) msvcr120._isnan +@ cdecl -arch=arm,x86_64 _isnanf(float) msvcr120._isnanf +@ cdecl _isprint_l(long ptr) msvcr120._isprint_l +@ stub _ispunct_l +@ cdecl _isspace_l(long ptr) msvcr120._isspace_l +@ cdecl _isupper_l(long ptr) msvcr120._isupper_l +@ stub _iswalnum_l +@ cdecl _iswalpha_l(long ptr) msvcr120._iswalpha_l +@ stub _iswblank_l +@ stub _iswcntrl_l +@ stub _iswcsym_l +@ stub _iswcsymf_l +@ stub _iswctype_l +@ cdecl _iswdigit_l(long ptr) msvcr120._iswdigit_l +@ stub _iswgraph_l +@ stub _iswlower_l +@ stub _iswprint_l +@ stub _iswpunct_l +@ stub _iswspace_l +@ stub _iswupper_l +@ stub _iswxdigit_l +@ cdecl _isxdigit_l(long ptr) msvcr120._isxdigit_l +@ cdecl _itoa(long ptr long) msvcr120._itoa +@ cdecl _itoa_s(long ptr long long) msvcr120._itoa_s +@ cdecl _itow(long ptr long) msvcr120._itow +@ cdecl _itow_s(long ptr long long) msvcr120._itow_s +@ cdecl _j0(double) msvcr120._j0 +@ cdecl _j1(double) msvcr120._j1 +@ cdecl _jn(long double) msvcr120._jn +@ cdecl _ldclass(double) msvcr120._ldclass +@ stub _ldpcomp +@ stub _ldsign +@ stub _ldtest +@ cdecl _lfind(ptr ptr ptr long ptr) msvcr120._lfind +@ stub _lfind_s +@ cdecl -arch=i386 _libm_sse2_acos_precise() msvcr120._libm_sse2_acos_precise +@ cdecl -arch=i386 _libm_sse2_asin_precise() msvcr120._libm_sse2_asin_precise +@ cdecl -arch=i386 _libm_sse2_atan_precise() msvcr120._libm_sse2_atan_precise +@ cdecl -arch=i386 _libm_sse2_cos_precise() msvcr120._libm_sse2_cos_precise +@ cdecl -arch=i386 _libm_sse2_exp_precise() msvcr120._libm_sse2_exp_precise +@ cdecl -arch=i386 _libm_sse2_log10_precise() msvcr120._libm_sse2_log10_precise +@ cdecl -arch=i386 _libm_sse2_log_precise() msvcr120._libm_sse2_log_precise +@ cdecl -arch=i386 _libm_sse2_pow_precise() msvcr120._libm_sse2_pow_precise +@ cdecl -arch=i386 _libm_sse2_sin_precise() msvcr120._libm_sse2_sin_precise +@ cdecl -arch=i386 _libm_sse2_sqrt_precise() msvcr120._libm_sse2_sqrt_precise +@ cdecl -arch=i386 _libm_sse2_tan_precise() msvcr120._libm_sse2_tan_precise +@ cdecl -arch=x86_64 _local_unwind(ptr ptr) msvcr120._local_unwind +@ cdecl -arch=i386 _local_unwind2(ptr long) msvcr120._local_unwind2 +@ cdecl -arch=i386 _local_unwind4(ptr ptr long) msvcr120._local_unwind4 +@ cdecl _localtime32(ptr) msvcr120._localtime32 +@ cdecl _localtime32_s(ptr ptr) msvcr120._localtime32_s +@ cdecl _localtime64(ptr) msvcr120._localtime64 +@ cdecl _localtime64_s(ptr ptr) msvcr120._localtime64_s +@ cdecl _lock(long) msvcr120._lock +@ cdecl _lock_file(ptr) msvcr120._lock_file +@ cdecl _locking(long long long) msvcr120._locking +@ cdecl _logb(double) msvcr120._logb +@ cdecl -arch=arm,x86_64 _logbf(float) msvcr120._logbf +@ cdecl -arch=i386 _longjmpex(ptr long) msvcr120._longjmpex +@ cdecl _lrotl(long long) msvcr120._lrotl +@ cdecl _lrotr(long long) msvcr120._lrotr +@ cdecl _lsearch(ptr ptr ptr long ptr) msvcr120._lsearch +@ stub _lsearch_s +@ cdecl _lseek(long long long) msvcr120._lseek +@ cdecl -ret64 _lseeki64(long int64 long) msvcr120._lseeki64 +@ cdecl _ltoa(long ptr long) msvcr120._ltoa +@ cdecl _ltoa_s(long ptr long long) msvcr120._ltoa_s +@ cdecl _ltow(long ptr long) msvcr120._ltow +@ cdecl _ltow_s(long ptr long long) msvcr120._ltow_s +@ cdecl _makepath(ptr str str str str) msvcr120._makepath +@ cdecl _makepath_s(ptr long str str str str) msvcr120._makepath_s +@ cdecl _malloc_crt(long) msvcr120._malloc_crt +# extern _mbcasemap +@ extern _mbctype msvcr120._mbctype +@ stub _mblen_l +@ cdecl _mbstowcs_l(ptr str long ptr) msvcr120._mbstowcs_l +@ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) msvcr120._mbstowcs_s_l +@ cdecl _mbstrlen(str) msvcr120._mbstrlen +@ cdecl _mbstrlen_l(str ptr) msvcr120._mbstrlen_l +@ stub _mbstrnlen +@ stub _mbstrnlen_l +@ cdecl _mbtowc_l(ptr str long ptr) msvcr120._mbtowc_l +@ cdecl _memccpy(ptr ptr long long) msvcr120._memccpy +@ cdecl _memicmp(str str long) msvcr120._memicmp +@ stub _memicmp_l +@ cdecl _mkdir(str) msvcr120._mkdir +@ cdecl _mkgmtime32(ptr) msvcr120._mkgmtime32 +@ cdecl _mkgmtime64(ptr) msvcr120._mkgmtime64 +@ cdecl _mktemp(str) msvcr120._mktemp +@ cdecl _mktemp_s(str long) msvcr120._mktemp_s +@ cdecl _mktime32(ptr) msvcr120._mktime32 +@ cdecl _mktime64(ptr) msvcr120._mktime64 +@ cdecl _msize(ptr) msvcr120._msize +@ cdecl _nextafter(double double) msvcr120._nextafter +@ cdecl -arch=arm,x86_64 _nextafterf(float float) msvcr120._nextafterf +@ cdecl _onexit(ptr) msvcr120._onexit +@ varargs _open(str long) msvcr120._open +@ cdecl _open_osfhandle(long long) msvcr120._open_osfhandle +@ cdecl _pclose(ptr) msvcr120._pclose +@ extern _pctype msvcr120._pctype +@ extern _pgmptr msvcr120._pgmptr +@ stub _printf_l +@ stub _printf_p +@ stub _printf_p_l +@ stub _printf_s_l +@ cdecl _purecall() msvcr120._purecall +@ cdecl _putc_nolock(long ptr) msvcr120._putc_nolock +@ cdecl _putw(long ptr) msvcr120._putw +@ cdecl _putwc_nolock(long ptr) msvcr120._putwc_nolock +@ cdecl _putws(wstr) msvcr120._putws +# extern _pwctype +@ cdecl _read(long ptr long) msvcr120._read +@ cdecl _realloc_crt(ptr long) msvcr120._realloc_crt +@ cdecl _recalloc(ptr long long) msvcr120._recalloc +@ stub _recalloc_crt +@ cdecl _rmdir(str) msvcr120._rmdir +@ cdecl _rmtmp() msvcr120._rmtmp +@ cdecl _rotl(long long) msvcr120._rotl +@ cdecl -ret64 _rotl64(int64 long) msvcr120._rotl64 +@ cdecl _rotr(long long) msvcr120._rotr +@ cdecl -ret64 _rotr64(int64 long) msvcr120._rotr64 +@ cdecl _scalb(double long) msvcr120._scalb +@ cdecl -arch=arm,x86_64 _scalbf(float long) msvcr120._scalbf +@ varargs _scanf_l(str ptr) msvcr120._scanf_l +@ varargs _scanf_s_l(str ptr) msvcr120._scanf_s_l +@ varargs _scprintf(str) msvcr120._scprintf +@ stub _scprintf_l +@ stub _scprintf_p +@ stub _scprintf_p_l +@ varargs _scwprintf(wstr) msvcr120._scwprintf +@ stub _scwprintf_l +@ stub _scwprintf_p +@ stub _scwprintf_p_l +@ stdcall -arch=i386 _seh_longjmp_unwind4(ptr) msvcr120._seh_longjmp_unwind4 +@ stdcall -arch=i386 _seh_longjmp_unwind(ptr) msvcr120._seh_longjmp_unwind +@ cdecl -arch=i386 _set_SSE2_enable(long) msvcr120._set_SSE2_enable +@ cdecl _set_abort_behavior(long long) msvcr120._set_abort_behavior +@ cdecl _set_controlfp(long long) msvcr120._set_controlfp +@ cdecl _set_doserrno(long) msvcr120._set_doserrno +@ cdecl _set_errno(long) msvcr120._set_errno +@ cdecl _set_error_mode(long) msvcr120._set_error_mode +@ cdecl _set_fmode(long) msvcr120._set_fmode +@ cdecl _set_invalid_parameter_handler(ptr) msvcr120._set_invalid_parameter_handler +@ stub _set_malloc_crt_max_wait +@ cdecl _set_output_format(long) msvcr120._set_output_format +@ cdecl _set_printf_count_output(long) msvcr120._set_printf_count_output +@ cdecl _set_purecall_handler(ptr) msvcr120._set_purecall_handler +@ cdecl -arch=i386,x86_64,arm -norelay _setjmp(ptr) msvcr120._setjmp +@ cdecl -arch=i386 -norelay _setjmp3(ptr long) msvcr120._setjmp3 +@ cdecl -arch=x86_64,arm -norelay _setjmpex(ptr ptr) msvcr120._setjmpex +@ cdecl _setmaxstdio(long) msvcr120._setmaxstdio +@ cdecl _setmbcp(long) msvcr120._setmbcp +@ cdecl _setmode(long long) msvcr120._setmode +@ varargs _snprintf(ptr long str) msvcr120._snprintf +@ stub _snprintf_c +@ stub _snprintf_c_l +@ varargs _snprintf_l(ptr long str ptr) msvcr120._snprintf_l +@ varargs _snprintf_s(ptr long long str) msvcr120._snprintf_s +@ stub _snprintf_s_l +@ varargs _snscanf(str long str) msvcr120._snscanf +@ varargs _snscanf_l(str long str ptr) msvcr120._snscanf_l +@ varargs _snscanf_s(str long str) msvcr120._snscanf_s +@ varargs _snscanf_s_l(str long str ptr) msvcr120._snscanf_s_l +@ varargs _snwprintf(ptr long wstr) msvcr120._snwprintf +@ varargs _snwprintf_l(ptr long wstr ptr) msvcr120._snwprintf_l +@ varargs _snwprintf_s(ptr long long wstr) msvcr120._snwprintf_s +@ varargs _snwprintf_s_l(ptr long long wstr ptr) msvcr120._snwprintf_s_l +@ varargs _snwscanf(wstr long wstr) msvcr120._snwscanf +@ varargs _snwscanf_l(wstr long wstr ptr) msvcr120._snwscanf_l +@ varargs _snwscanf_s(wstr long wstr) msvcr120._snwscanf_s +@ varargs _snwscanf_s_l(wstr long wstr ptr) msvcr120._snwscanf_s_l +@ varargs _sopen(str long long) msvcr120._sopen +@ cdecl _sopen_s(ptr str long long long) msvcr120._sopen_s +@ cdecl _splitpath(str ptr ptr ptr ptr) msvcr120._splitpath +@ cdecl _splitpath_s(str ptr long ptr long ptr long ptr long) msvcr120._splitpath_s +@ varargs _sprintf_l(ptr str ptr) msvcr120._sprintf_l +@ varargs _sprintf_p(ptr long str) msvcr120._sprintf_p +@ varargs _sprintf_p_l(ptr long str ptr) msvcr120._sprintf_p_l +@ varargs _sprintf_s_l(ptr long str ptr) msvcr120._sprintf_s_l +@ varargs _sscanf_l(str str ptr) msvcr120._sscanf_l +@ varargs _sscanf_s_l(str str ptr) msvcr120._sscanf_s_l +@ cdecl _stat32(str ptr) msvcr120._stat32 +@ cdecl _stat32i64(str ptr) msvcr120._stat32i64 +@ cdecl _stat64(str ptr) msvcr120._stat64 +@ cdecl _stat64i32(str ptr) msvcr120._stat64i32 +@ cdecl _statusfp() msvcr120._statusfp +@ cdecl -arch=i386 _statusfp2(ptr ptr) msvcr120._statusfp2 +@ cdecl _strcoll_l(str str ptr) msvcr120._strcoll_l +@ cdecl _strdate(ptr) msvcr120._strdate +@ cdecl _strdate_s(ptr long) msvcr120._strdate_s +@ cdecl _strdup(str) msvcr120._strdup +@ cdecl _strerror(long) msvcr120._strerror +@ stub _strerror_s +@ stub _strftime_l +@ cdecl _stricmp(str str) msvcr120._stricmp +@ cdecl _stricmp_l(str str ptr) msvcr120._stricmp_l +@ cdecl _stricoll(str str) msvcr120._stricoll +@ cdecl _stricoll_l(str str ptr) msvcr120._stricoll_l +@ cdecl _strlwr(str) msvcr120._strlwr +@ cdecl _strlwr_l(str ptr) msvcr120._strlwr_l +@ cdecl _strlwr_s(ptr long) msvcr120._strlwr_s +@ cdecl _strlwr_s_l(ptr long ptr) msvcr120._strlwr_s_l +@ cdecl _strncoll(str str long) msvcr120._strncoll +@ cdecl _strncoll_l(str str long ptr) msvcr120._strncoll_l +@ cdecl _strnicmp(str str long) msvcr120._strnicmp +@ cdecl _strnicmp_l(str str long ptr) msvcr120._strnicmp_l +@ cdecl _strnicoll(str str long) msvcr120._strnicoll +@ cdecl _strnicoll_l(str str long ptr) msvcr120._strnicoll_l +@ cdecl _strnset(str long long) msvcr120._strnset +@ cdecl _strnset_s(str long long long) msvcr120._strnset_s +@ cdecl _strrev(str) msvcr120._strrev +@ cdecl _strset(str long) msvcr120._strset +@ stub _strset_s +@ cdecl _strtime(ptr) msvcr120._strtime +@ cdecl _strtime_s(ptr long) msvcr120._strtime_s +@ cdecl _strtod_l(str ptr ptr) msvcr120._strtod_l +@ stub _strtof_l +@ cdecl -ret64 _strtoi64(str ptr long) msvcr120._strtoi64 +@ cdecl -ret64 _strtoi64_l(str ptr long ptr) msvcr120._strtoi64_l +@ stub _strtoimax_l +@ stub _strtol_l +@ stub _strtold_l +@ stub _strtoll_l +@ cdecl -ret64 _strtoui64(str ptr long) msvcr120._strtoui64 +@ cdecl -ret64 _strtoui64_l(str ptr long ptr) msvcr120._strtoui64_l +@ cdecl _strtoul_l(str ptr long ptr) msvcr120._strtoul_l +@ stub _strtoull_l +@ stub _strtoumax_l +@ cdecl _strupr(str) msvcr120._strupr +@ cdecl _strupr_l(str ptr) msvcr120._strupr_l +@ cdecl _strupr_s(str long) msvcr120._strupr_s +@ cdecl _strupr_s_l(str long ptr) msvcr120._strupr_s_l +@ cdecl _strxfrm_l(ptr str long ptr) msvcr120._strxfrm_l +@ cdecl _swab(str str long) msvcr120._swab +@ varargs _swprintf(ptr wstr) msvcr120._swprintf +@ stub _swprintf_c +@ stub _swprintf_c_l +@ stub _swprintf_p +@ varargs _swprintf_p_l(ptr long wstr ptr) msvcr120._swprintf_p_l +@ varargs _swprintf_s_l(ptr long wstr ptr) msvcr120._swprintf_s_l +@ varargs _swscanf_l(wstr wstr ptr) msvcr120._swscanf_l +@ varargs _swscanf_s_l(wstr wstr ptr) msvcr120._swscanf_s_l +@ extern _sys_errlist msvcr120._sys_errlist +@ extern _sys_nerr msvcr120._sys_nerr +@ cdecl _tell(long) msvcr120._tell +@ cdecl -ret64 _telli64(long) msvcr120._telli64 +@ cdecl _tempnam(str str) msvcr120._tempnam +@ cdecl _time32(ptr) msvcr120._time32 +@ cdecl _time64(ptr) msvcr120._time64 +@ extern _timezone msvcr120._timezone +@ cdecl _tolower(long) msvcr120._tolower +@ cdecl _tolower_l(long ptr) msvcr120._tolower_l +@ cdecl _toupper(long) msvcr120._toupper +@ cdecl _toupper_l(long ptr) msvcr120._toupper_l +@ cdecl _towlower_l(long ptr) msvcr120._towlower_l +@ cdecl _towupper_l(long ptr) msvcr120._towupper_l +@ extern _tzname msvcr120._tzname +@ cdecl _tzset() msvcr120._tzset +@ cdecl _ui64toa(int64 ptr long) msvcr120._ui64toa +@ cdecl _ui64toa_s(int64 ptr long long) msvcr120._ui64toa_s +@ cdecl _ui64tow(int64 ptr long) msvcr120._ui64tow +@ cdecl _ui64tow_s(int64 ptr long long) msvcr120._ui64tow_s +@ cdecl _ultoa(long ptr long) msvcr120._ultoa +@ cdecl _ultoa_s(long ptr long long) msvcr120._ultoa_s +@ cdecl _ultow(long ptr long) msvcr120._ultow +@ cdecl _ultow_s(long ptr long long) msvcr120._ultow_s +@ cdecl _umask(long) msvcr120._umask +@ stub _umask_s +@ cdecl _ungetc_nolock(long ptr) msvcr120._ungetc_nolock +@ cdecl _ungetwc_nolock(long ptr) msvcr120._ungetwc_nolock +@ cdecl _unlink(str) msvcr120._unlink +@ cdecl _unlock(long) msvcr120._unlock +@ cdecl _unlock_file(ptr) msvcr120._unlock_file +@ cdecl _utime32(str ptr) msvcr120._utime32 +@ cdecl _utime64(str ptr) msvcr120._utime64 +@ cdecl _vacopy(ptr ptr) msvcr120._vacopy +@ stub _vfprintf_l +@ stub _vfprintf_p +@ stub _vfprintf_p_l +@ stub _vfprintf_s_l +@ cdecl _vfwprintf_l(ptr wstr ptr ptr) msvcr120._vfwprintf_l +@ stub _vfwprintf_p +@ stub _vfwprintf_p_l +@ stub _vfwprintf_s_l +@ stub _vprintf_l +@ stub _vprintf_p +@ stub _vprintf_p_l +@ stub _vprintf_s_l +@ cdecl _vscprintf(str ptr) msvcr120._vscprintf +@ stub _vscprintf_l +@ stub _vscprintf_p +@ stub _vscprintf_p_l +@ cdecl _vscwprintf(wstr ptr) msvcr120._vscwprintf +@ cdecl _vscwprintf_l(wstr ptr ptr) msvcr120._vscwprintf_l +@ cdecl _vscwprintf_p(wstr ptr) msvcr120._vscwprintf_p +@ cdecl _vscwprintf_p_l(wstr ptr ptr) msvcr120._vscwprintf_p_l +@ cdecl _vsnprintf(ptr long str ptr) msvcr120._vsnprintf +@ cdecl _vsnprintf_c(ptr long str ptr) msvcr120._vsnprintf_c +@ cdecl _vsnprintf_c_l(ptr long str ptr ptr) msvcr120._vsnprintf_c_l +@ cdecl _vsnprintf_l(ptr long str ptr ptr) msvcr120._vsnprintf_l +@ cdecl _vsnprintf_s(ptr long long str ptr) msvcr120._vsnprintf_s +@ cdecl _vsnprintf_s_l(ptr long long str ptr ptr) msvcr120._vsnprintf_s_l +@ cdecl _vsnwprintf(ptr long wstr ptr) msvcr120._vsnwprintf +@ cdecl _vsnwprintf_l(ptr long wstr ptr ptr) msvcr120._vsnwprintf_l +@ cdecl _vsnwprintf_s(ptr long long wstr ptr) msvcr120._vsnwprintf_s +@ cdecl _vsnwprintf_s_l(ptr long long wstr ptr ptr) msvcr120._vsnwprintf_s_l +@ cdecl _vsprintf_l(ptr str ptr ptr) msvcr120._vsprintf_l +@ cdecl _vsprintf_p(ptr long str ptr) msvcr120._vsprintf_p +@ cdecl _vsprintf_p_l(ptr long str ptr ptr) msvcr120._vsprintf_p_l +@ cdecl _vsprintf_s_l(ptr long str ptr ptr) msvcr120._vsprintf_s_l +@ cdecl _vswprintf(ptr wstr ptr) msvcr120._vswprintf +@ cdecl _vswprintf_c(ptr long wstr ptr) msvcr120._vswprintf_c +@ cdecl _vswprintf_c_l(ptr long wstr ptr ptr) msvcr120._vswprintf_c_l +@ cdecl _vswprintf_l(ptr wstr ptr ptr) msvcr120._vswprintf_l +@ cdecl _vswprintf_p(ptr long wstr ptr) msvcr120._vswprintf_p +@ cdecl _vswprintf_p_l(ptr long wstr ptr ptr) msvcr120._vswprintf_p_l +@ cdecl _vswprintf_s_l(ptr long wstr ptr ptr) msvcr120._vswprintf_s_l +@ stub _vwprintf_l +@ stub _vwprintf_p +@ stub _vwprintf_p_l +@ stub _vwprintf_s_l +@ cdecl _waccess(wstr long) msvcr120._waccess +@ cdecl _waccess_s(wstr long) msvcr120._waccess_s +@ cdecl _wasctime(ptr) msvcr120._wasctime +@ cdecl _wasctime_s(ptr long ptr) msvcr120._wasctime_s +@ cdecl _wassert(wstr wstr long) msvcr120._wassert +@ cdecl _wchmod(wstr long) msvcr120._wchmod +@ extern _wcmdln msvcr120._wcmdln +@ cdecl _wcreat(wstr long) msvcr120._wcreat +@ stub _wcreate_locale +@ cdecl _wcscoll_l(wstr wstr ptr) msvcr120._wcscoll_l +@ cdecl _wcsdup(wstr) msvcr120._wcsdup +@ cdecl _wcserror(long) msvcr120._wcserror +@ cdecl _wcserror_s(ptr long long) msvcr120._wcserror_s +@ stub _wcsftime_l +@ cdecl _wcsicmp(wstr wstr) msvcr120._wcsicmp +@ cdecl _wcsicmp_l(wstr wstr ptr) msvcr120._wcsicmp_l +@ cdecl _wcsicoll(wstr wstr) msvcr120._wcsicoll +@ cdecl _wcsicoll_l(wstr wstr ptr) msvcr120._wcsicoll_l +@ cdecl _wcslwr(wstr) msvcr120._wcslwr +@ cdecl _wcslwr_l(wstr ptr) msvcr120._wcslwr_l +@ cdecl _wcslwr_s(wstr long) msvcr120._wcslwr_s +@ cdecl _wcslwr_s_l(wstr long ptr) msvcr120._wcslwr_s_l +@ cdecl _wcsncoll(wstr wstr long) msvcr120._wcsncoll +@ cdecl _wcsncoll_l(wstr wstr long ptr) msvcr120._wcsncoll_l +@ cdecl _wcsnicmp(wstr wstr long) msvcr120._wcsnicmp +@ cdecl _wcsnicmp_l(wstr wstr long ptr) msvcr120._wcsnicmp_l +@ cdecl _wcsnicoll(wstr wstr long) msvcr120._wcsnicoll +@ cdecl _wcsnicoll_l(wstr wstr long ptr) msvcr120._wcsnicoll_l +@ cdecl _wcsnset(wstr long long) msvcr120._wcsnset +@ stub _wcsnset_s +@ cdecl _wcsrev(wstr) msvcr120._wcsrev +@ cdecl _wcsset(wstr long) msvcr120._wcsset +@ stub _wcsset_s +@ cdecl _wcstod_l(wstr ptr) msvcr120._wcstod_l +@ stub _wcstof_l +@ cdecl -ret64 _wcstoi64(wstr ptr long) msvcr120._wcstoi64 +@ cdecl -ret64 _wcstoi64_l(wstr ptr long ptr) msvcr120._wcstoi64_l +@ stub _wcstoimax_l +@ cdecl _wcstol_l(wstr ptr long ptr) msvcr120._wcstol_l +@ stub _wcstold_l +@ stub _wcstoll_l +@ cdecl _wcstombs_l(ptr ptr long ptr) msvcr120._wcstombs_l +@ cdecl _wcstombs_s_l(ptr ptr long wstr long ptr) msvcr120._wcstombs_s_l +@ cdecl -ret64 _wcstoui64(wstr ptr long) msvcr120._wcstoui64 +@ cdecl -ret64 _wcstoui64_l(wstr ptr long ptr) msvcr120._wcstoui64_l +@ cdecl _wcstoul_l(wstr ptr long ptr) msvcr120._wcstoul_l +@ stub _wcstoull_l +@ stub _wcstoumax_l +@ cdecl _wcsupr(wstr) msvcr120._wcsupr +@ cdecl _wcsupr_l(wstr ptr) msvcr120._wcsupr_l +@ cdecl _wcsupr_s(wstr long) msvcr120._wcsupr_s +@ cdecl _wcsupr_s_l(wstr long ptr) msvcr120._wcsupr_s_l +@ cdecl _wcsxfrm_l(ptr wstr long ptr) msvcr120._wcsxfrm_l +@ cdecl _wctime32(ptr) msvcr120._wctime32 +@ stub _wctime32_s +@ cdecl _wctime64(ptr) msvcr120._wctime64 +@ stub _wctime64_s +@ cdecl _wctomb_l(ptr long ptr) msvcr120._wctomb_l +@ cdecl _wctomb_s_l(ptr ptr long long ptr) msvcr120._wctomb_s_l +# extern _wctype +@ extern _wenviron msvcr120._wenviron +@ cdecl _wfdopen(long wstr) msvcr120._wfdopen +@ cdecl _wfindfirst32(wstr ptr) msvcr120._wfindfirst32 +@ stub _wfindfirst32i64 +@ cdecl _wfindfirst64(wstr ptr) msvcr120._wfindfirst64 +@ cdecl _wfindfirst64i32(wstr ptr) msvcr120._wfindfirst64i32 +@ stub _wfindnext32 +@ stub _wfindnext32i64 +@ cdecl _wfindnext64(long ptr) msvcr120._wfindnext64 +@ cdecl _wfindnext64i32(long ptr) msvcr120._wfindnext64i32 +@ cdecl _wfopen(wstr wstr) msvcr120._wfopen +@ cdecl _wfopen_s(ptr wstr wstr) msvcr120._wfopen_s +@ cdecl _wfreopen(wstr wstr ptr) msvcr120._wfreopen +@ cdecl _wfreopen_s(ptr wstr wstr ptr) msvcr120._wfreopen_s +@ cdecl _wfsopen(wstr wstr long) msvcr120._wfsopen +@ cdecl _wfullpath(ptr wstr long) msvcr120._wfullpath +@ cdecl _wmakepath(ptr wstr wstr wstr wstr) msvcr120._wmakepath +@ cdecl _wmakepath_s(ptr long wstr wstr wstr wstr) msvcr120._wmakepath_s +@ cdecl _wmkdir(wstr) msvcr120._wmkdir +@ cdecl _wmktemp(wstr) msvcr120._wmktemp +@ cdecl _wmktemp_s(wstr long) msvcr120._wmktemp_s +@ varargs _wopen(wstr long) msvcr120._wopen +@ cdecl _wperror(wstr) msvcr120._wperror +@ extern _wpgmptr msvcr120._wpgmptr +@ stub _wprintf_l +@ stub _wprintf_p +@ stub _wprintf_p_l +@ stub _wprintf_s_l +@ cdecl _wremove(wstr) msvcr120._wremove +@ cdecl _wrename(wstr wstr) msvcr120._wrename +@ cdecl _write(long ptr long) msvcr120._write +@ cdecl _wrmdir(wstr) msvcr120._wrmdir +@ varargs _wscanf_l(wstr ptr) msvcr120._wscanf_l +@ varargs _wscanf_s_l(wstr ptr) msvcr120._wscanf_s_l +@ cdecl _wsetlocale(long wstr) msvcr120._wsetlocale +@ varargs _wsopen(wstr long long) msvcr120._wsopen +@ cdecl _wsopen_s(ptr wstr long long long) msvcr120._wsopen_s +@ cdecl _wsplitpath(wstr ptr ptr ptr ptr) msvcr120._wsplitpath +@ cdecl _wsplitpath_s(wstr ptr long ptr long ptr long ptr long) msvcr120._wsplitpath_s +@ cdecl _wstat32(wstr ptr) msvcr120._wstat32 +@ cdecl _wstat32i64(wstr ptr) msvcr120._wstat32i64 +@ cdecl _wstat64(wstr ptr) msvcr120._wstat64 +@ cdecl _wstat64i32(wstr ptr) msvcr120._wstat64i32 +@ cdecl _wstrdate(ptr) msvcr120._wstrdate +@ cdecl _wstrdate_s(ptr long) msvcr120._wstrdate_s +@ cdecl _wstrtime(ptr) msvcr120._wstrtime +@ cdecl _wstrtime_s(ptr long) msvcr120._wstrtime_s +@ cdecl _wtempnam(wstr wstr) msvcr120._wtempnam +@ cdecl _wtmpnam(ptr) msvcr120._wtmpnam +@ stub _wtmpnam_s +@ cdecl _wtof(wstr) msvcr120._wtof +@ cdecl _wtof_l(wstr ptr) msvcr120._wtof_l +@ cdecl _wtoi(wstr) msvcr120._wtoi +@ cdecl -ret64 _wtoi64(wstr) msvcr120._wtoi64 +@ cdecl -ret64 _wtoi64_l(wstr ptr) msvcr120._wtoi64_l +@ cdecl _wtoi_l(wstr ptr) msvcr120._wtoi_l +@ cdecl _wtol(wstr) msvcr120._wtol +@ cdecl _wtol_l(wstr ptr) msvcr120._wtol_l +@ stub _wtoll +@ stub _wtoll_l +@ cdecl _wunlink(wstr) msvcr120._wunlink +@ cdecl _wutime32(wstr ptr) msvcr120._wutime32 +@ cdecl _wutime64(wstr ptr) msvcr120._wutime64 +@ cdecl _y0(double) msvcr120._y0 +@ cdecl _y1(double) msvcr120._y1 +@ cdecl _yn(long double) msvcr120._yn +@ cdecl abort() msvcr120.abort +@ cdecl abs(long) msvcr120.abs +@ cdecl acos(double) msvcr120.acos +@ cdecl -arch=arm,x86_64 acosf(float) msvcr120.acosf +@ stub acosh +@ stub acoshf +@ stub acoshl +@ cdecl asctime(ptr) msvcr120.asctime +@ cdecl asctime_s(ptr long ptr) msvcr120.asctime_s +@ cdecl asin(double) msvcr120.asin +@ cdecl -arch=arm,x86_64 asinf(float) msvcr120.asinf +@ stub asinh +@ stub asinhf +@ stub asinhl +@ cdecl atan(double) msvcr120.atan +@ cdecl -arch=arm,x86_64 atanf(float) msvcr120.atanf +@ cdecl atan2(double double) msvcr120.atan2 +@ cdecl -arch=arm,x86_64 atan2f(float float) msvcr120.atan2f +@ stub atanh +@ stub atanhf +@ stub atanhl +@ cdecl atexit(ptr) msvcr120.atexit +@ cdecl atof(str) msvcr120.atof +@ cdecl atoi(str) msvcr120.atoi +@ cdecl atol(str) msvcr120.atol +@ stub atoll +@ cdecl bsearch(ptr ptr long long ptr) msvcr120.bsearch +@ cdecl bsearch_s(ptr ptr long long ptr ptr) msvcr120.bsearch_s +@ cdecl btowc(long) msvcr120.btowc +@ stub cabs +@ stub cabsf +@ stub cabsl +@ stub cacos +@ stub cacosf +@ stub cacosh +@ stub cacoshf +@ stub cacoshl +@ stub cacosl +@ cdecl calloc(long long) msvcr120.calloc +@ stub carg +@ stub cargf +@ stub cargl +@ stub casin +@ stub casinf +@ stub casinh +@ stub casinhf +@ stub casinhl +@ stub casinl +@ stub catan +@ stub catanf +@ stub catanh +@ stub catanhf +@ stub catanhl +@ stub catanl +@ cdecl cbrt(double) msvcr120.cbrt +@ cdecl cbrtf(float) msvcr120.cbrtf +@ cdecl cbrtl(double) msvcr120.cbrtl +@ stub ccos +@ stub ccosf +@ stub ccosh +@ stub ccoshf +@ stub ccoshl +@ stub ccosl +@ cdecl ceil(double) msvcr120.ceil +@ cdecl -arch=arm,x86_64 ceilf(float) msvcr120.ceilf +@ stub cexp +@ stub cexpf +@ stub cexpl +@ stub cimag +@ stub cimagf +@ stub cimagl +@ cdecl clearerr(ptr) msvcr120.clearerr +@ stub clearerr_s +@ cdecl clock() msvcr120.clock +@ stub clog +@ stub clog10 +@ stub clog10f +@ stub clog10l +@ stub clogf +@ stub clogl +@ stub conj +@ stub conjf +@ stub conjl +@ stub copysign +@ stub copysignf +@ stub copysignl +@ cdecl cos(double) msvcr120.cos +@ cdecl -arch=arm,x86_64 cosf(float) msvcr120.cosf +@ cdecl cosh(double) msvcr120.cosh +@ cdecl -arch=arm,x86_64 coshf(float) msvcr120.coshf +@ stub cpow +@ stub cpowf +@ stub cpowl +@ stub cproj +@ stub cprojf +@ stub cprojl +@ stub creal +@ stub crealf +@ stub creall +@ stub csin +@ stub csinf +@ stub csinh +@ stub csinhf +@ stub csinhl +@ stub csinl +@ stub csqrt +@ stub csqrtf +@ stub csqrtl +@ stub ctan +@ stub ctanf +@ stub ctanh +@ stub ctanhf +@ stub ctanhl +@ stub ctanl +@ cdecl -ret64 div(long long) msvcr120.div +@ stub erf +@ stub erfc +@ stub erfcf +@ stub erfcl +@ stub erff +@ stub erfl +@ cdecl exit(long) msvcr120.exit +@ cdecl exp(double) msvcr120.exp +@ cdecl exp2(double) msvcr120.exp2 +@ cdecl exp2f(float) msvcr120.exp2f +@ cdecl exp2l(double) msvcr120.exp2l +@ cdecl -arch=arm,x86_64 expf(float) msvcr120.expf +@ stub expm1 +@ stub expm1f +@ stub expm1l +@ cdecl fabs(double) msvcr120.fabs +@ cdecl -arch=arm,x86_64 fabsf(float) msvcr120.fabsf +@ cdecl fclose(ptr) msvcr120.fclose +@ stub fdim +@ stub fdimf +@ stub fdiml +@ stub feclearexcept +@ stub fegetenv +@ stub fegetexceptflag +@ stub fegetround +@ stub feholdexcept +@ cdecl feof(ptr) msvcr120.feof +@ stub feraiseexcept +@ cdecl ferror(ptr) msvcr120.ferror +@ stub fesetenv +@ stub fesetexceptflag +@ stub fesetround +@ stub fetestexcept +@ stub feupdateenv +@ cdecl fflush(ptr) msvcr120.fflush +@ cdecl fgetc(ptr) msvcr120.fgetc +@ cdecl fgetpos(ptr ptr) msvcr120.fgetpos +@ cdecl fgets(ptr long ptr) msvcr120.fgets +@ cdecl fgetwc(ptr) msvcr120.fgetwc +@ cdecl fgetws(ptr long ptr) msvcr120.fgetws +@ cdecl floor(double) msvcr120.floor +@ cdecl -arch=arm,x86_64 floorf(float) msvcr120.floorf +@ stub fma +@ stub fmaf +@ stub fmal +@ stub fmax +@ stub fmaxf +@ stub fmaxl +@ stub fmin +@ stub fminf +@ stub fminl +@ cdecl fmod(double double) msvcr120.fmod +@ cdecl -arch=arm,x86_64 fmodf(float float) msvcr120.fmodf +@ cdecl fopen(str str) msvcr120.fopen +@ cdecl fopen_s(ptr str str) msvcr120.fopen_s +@ varargs fprintf(ptr str) msvcr120.fprintf +@ varargs fprintf_s(ptr str) msvcr120.fprintf_s +@ cdecl fputc(long ptr) msvcr120.fputc +@ cdecl fputs(str ptr) msvcr120.fputs +@ cdecl fputwc(long ptr) msvcr120.fputwc +@ cdecl fputws(wstr ptr) msvcr120.fputws +@ cdecl fread(ptr long long ptr) msvcr120.fread +@ cdecl fread_s(ptr long long long ptr) msvcr120.fread_s +@ cdecl free(ptr) msvcr120.free +@ cdecl freopen(str str ptr) msvcr120.freopen +@ cdecl freopen_s(ptr str str ptr) msvcr120.freopen_s +@ cdecl frexp(double ptr) msvcr120.frexp +@ varargs fscanf(ptr str) msvcr120.fscanf +@ varargs fscanf_s(ptr str) msvcr120.fscanf_s +@ cdecl fseek(ptr long long) msvcr120.fseek +@ cdecl fsetpos(ptr ptr) msvcr120.fsetpos +@ cdecl ftell(ptr) msvcr120.ftell +@ varargs fwprintf(ptr wstr) msvcr120.fwprintf +@ varargs fwprintf_s(ptr wstr) msvcr120.fwprintf_s +@ cdecl fwrite(ptr long long ptr) msvcr120.fwrite +@ varargs fwscanf(ptr wstr) msvcr120.fwscanf +@ varargs fwscanf_s(ptr wstr) msvcr120.fwscanf_s +@ cdecl getc(ptr) msvcr120.getc +@ cdecl getchar() msvcr120.getchar +@ cdecl gets(str) msvcr120.gets +@ stub gets_s +@ cdecl getwc(ptr) msvcr120.getwc +@ cdecl getwchar() msvcr120.getwchar +@ stub ilogb +@ stub ilogbf +@ stub ilogbl +@ stub imaxabs +@ stub imaxdiv +@ cdecl isalnum(long) msvcr120.isalnum +@ cdecl isalpha(long) msvcr120.isalpha +@ stub isblank +@ cdecl iscntrl(long) msvcr120.iscntrl +@ cdecl isdigit(long) msvcr120.isdigit +@ cdecl isgraph(long) msvcr120.isgraph +@ cdecl isleadbyte(long) msvcr120.isleadbyte +@ cdecl islower(long) msvcr120.islower +@ cdecl isprint(long) msvcr120.isprint +@ cdecl ispunct(long) msvcr120.ispunct +@ cdecl isspace(long) msvcr120.isspace +@ cdecl isupper(long) msvcr120.isupper +@ cdecl iswalnum(long) msvcr120.iswalnum +@ cdecl iswalpha(long) msvcr120.iswalpha +@ cdecl iswascii(long) msvcr120.iswascii +@ stub iswblank +@ cdecl iswcntrl(long) msvcr120.iswcntrl +@ cdecl iswctype(long long) msvcr120.iswctype +@ cdecl iswdigit(long) msvcr120.iswdigit +@ cdecl iswgraph(long) msvcr120.iswgraph +@ cdecl iswlower(long) msvcr120.iswlower +@ cdecl iswprint(long) msvcr120.iswprint +@ cdecl iswpunct(long) msvcr120.iswpunct +@ cdecl iswspace(long) msvcr120.iswspace +@ cdecl iswupper(long) msvcr120.iswupper +@ cdecl iswxdigit(long) msvcr120.iswxdigit +@ cdecl isxdigit(long) msvcr120.isxdigit +@ cdecl labs(long) msvcr120.labs +@ cdecl ldexp(double long) msvcr120.ldexp +@ cdecl ldiv(long long) msvcr120.ldiv +@ stub lgamma +@ stub lgammaf +@ stub lgammal +@ cdecl -ret64 llabs(int64) msvcr120.llabs +@ stub lldiv +@ cdecl -ret64 llrint(double) msvcr120.llrint +@ cdecl -ret64 llrintf(float) msvcr120.llrintf +@ cdecl -ret64 llrintl(double) msvcr120.llrintl +@ cdecl -ret64 llround(double) msvcr120.llround +@ cdecl -ret64 llroundf(float) msvcr120.llroundf +@ cdecl -ret64 llroundl(double) msvcr120.llroundl +@ cdecl localeconv() msvcr120.localeconv +@ cdecl log(double) msvcr120.log +@ cdecl -arch=arm,x86_64 logf(float) msvcr120.logf +@ cdecl log10(double) msvcr120.log10 +@ cdecl -arch=arm,x86_64 log10f(float) msvcr120.log10f +@ stub log1p +@ stub log1pf +@ stub log1pl +@ cdecl log2(double) msvcr120.log2 +@ cdecl log2f(float) msvcr120.log2f +@ cdecl log2l(double) msvcr120.log2l +@ stub logb +@ stub logbf +@ stub logbl +@ cdecl -arch=i386,x86_64,arm longjmp(ptr long) msvcr120.longjmp +@ cdecl lrint(double) msvcr120.lrint +@ cdecl lrintf(float) msvcr120.lrintf +@ cdecl lrintl(double) msvcr120.lrintl +@ cdecl lround(double) msvcr120.lround +@ cdecl lroundf(float) msvcr120.lroundf +@ cdecl lroundl(double) msvcr120.lroundl +@ cdecl malloc(long) msvcr120.malloc +@ cdecl mblen(ptr long) msvcr120.mblen +@ cdecl mbrlen(ptr long ptr) msvcr120.mbrlen +@ cdecl mbrtowc(ptr str long ptr) msvcr120.mbrtowc +@ cdecl mbsrtowcs(ptr ptr long ptr) msvcr120.mbsrtowcs +@ stub mbsrtowcs_s +@ cdecl mbstowcs(ptr str long) msvcr120.mbstowcs +@ cdecl mbstowcs_s(ptr ptr long str long) msvcr120.mbstowcs_s +@ cdecl mbtowc(ptr str long) msvcr120.mbtowc +@ cdecl memchr(ptr long long) msvcr120.memchr +@ cdecl memcmp(ptr ptr long) msvcr120.memcmp +@ cdecl memcpy(ptr ptr long) msvcr120.memcpy +@ cdecl memcpy_s(ptr long ptr long) msvcr120.memcpy_s +@ cdecl memmove(ptr ptr long) msvcr120.memmove +@ cdecl memmove_s(ptr long ptr long) msvcr120.memmove_s +@ cdecl memset(ptr long long) msvcr120.memset +@ cdecl modf(double ptr) msvcr120.modf +@ cdecl -arch=arm,x86_64 modff(float ptr) msvcr120.modff +@ stub nan +@ stub nanf +@ stub nanl +@ stub nearbyint +@ stub nearbyintf +@ stub nearbyintl +@ stub nextafter +@ stub nextafterf +@ stub nextafterl +@ stub nexttoward +@ stub nexttowardf +@ stub nexttowardl +@ stub norm +@ stub normf +@ stub norml +@ cdecl perror(str) msvcr120.perror +@ cdecl pow(double double) msvcr120.pow +@ cdecl -arch=arm,x86_64 powf(float float) msvcr120.powf +@ varargs printf(str) msvcr120.printf +@ varargs printf_s(str) msvcr120.printf_s +@ cdecl putc(long ptr) msvcr120.putc +@ cdecl putchar(long) msvcr120.putchar +@ cdecl puts(str) msvcr120.puts +@ cdecl putwc(long ptr) msvcr120.putwc +@ cdecl putwchar(long) msvcr120.putwchar +@ cdecl qsort(ptr long long ptr) msvcr120.qsort +@ cdecl qsort_s(ptr long long ptr ptr) msvcr120.qsort_s +@ cdecl raise(long) msvcr120.raise +@ cdecl rand() msvcr120.rand +@ cdecl rand_s(ptr) msvcr120.rand_s +@ cdecl realloc(ptr long) msvcr120.realloc +@ stub remainder +@ stub remainderf +@ stub remainderl +@ cdecl remove(str) msvcr120.remove +@ stub remquo +@ stub remquof +@ stub remquol +@ cdecl rename(str str) msvcr120.rename +@ cdecl rewind(ptr) msvcr120.rewind +@ cdecl rint(double) msvcr120.rint +@ cdecl rintf(float) msvcr120.rintf +@ cdecl rintl(double) msvcr120.rintl +@ cdecl round(double) msvcr120.round +@ cdecl roundf(float) msvcr120.roundf +@ cdecl roundl(double) msvcr120.roundl +@ stub scalbln +@ stub scalblnf +@ stub scalblnl +@ stub scalbn +@ stub scalbnf +@ stub scalbnl +@ varargs scanf(str) msvcr120.scanf +@ varargs scanf_s(str) msvcr120.scanf_s +@ cdecl setbuf(ptr ptr) msvcr120.setbuf +@ cdecl -arch=arm,x86_64 -norelay -private setjmp(ptr) msvcr120.setjmp +@ cdecl setlocale(long str) msvcr120.setlocale +@ cdecl setvbuf(ptr str long long) msvcr120.setvbuf +@ cdecl signal(long long) msvcr120.signal +@ cdecl sin(double) msvcr120.sin +@ cdecl -arch=arm,x86_64 sinf(float) msvcr120.sinf +@ cdecl sinh(double) msvcr120.sinh +@ cdecl -arch=arm,x86_64 sinhf(float) msvcr120.sinhf +@ varargs sprintf(ptr str) msvcr120.sprintf +@ varargs sprintf_s(ptr long str) msvcr120.sprintf_s +@ cdecl sqrt(double) msvcr120.sqrt +@ cdecl -arch=arm,x86_64 sqrtf(float) msvcr120.sqrtf +@ cdecl srand(long) msvcr120.srand +@ varargs sscanf(str str) msvcr120.sscanf +@ varargs sscanf_s(str str) msvcr120.sscanf_s +@ cdecl strcat(str str) msvcr120.strcat +@ cdecl strcat_s(str long str) msvcr120.strcat_s +@ cdecl strchr(str long) msvcr120.strchr +@ cdecl strcmp(str str) msvcr120.strcmp +@ cdecl strcoll(str str) msvcr120.strcoll +@ cdecl strcpy(ptr str) msvcr120.strcpy +@ cdecl strcpy_s(ptr long str) msvcr120.strcpy_s +@ cdecl strcspn(str str) msvcr120.strcspn +@ cdecl strerror(long) msvcr120.strerror +@ cdecl strerror_s(ptr long long) msvcr120.strerror_s +@ cdecl strftime(str long str ptr) msvcr120.strftime +@ cdecl strlen(str) msvcr120.strlen +@ cdecl strncat(str str long) msvcr120.strncat +@ cdecl strncat_s(str long str long) msvcr120.strncat_s +@ cdecl strncmp(str str long) msvcr120.strncmp +@ cdecl strncpy(ptr str long) msvcr120.strncpy +@ cdecl strncpy_s(ptr long str long) msvcr120.strncpy_s +@ cdecl strnlen(str long) msvcr120.strnlen +@ cdecl strpbrk(str str) msvcr120.strpbrk +@ cdecl strrchr(str long) msvcr120.strrchr +@ cdecl strspn(str str) msvcr120.strspn +@ cdecl strstr(str str) msvcr120.strstr +@ cdecl strtod(str ptr) msvcr120.strtod +@ stub strtof +@ stub strtoimax +@ cdecl strtok(str str) msvcr120.strtok +@ cdecl strtok_s(ptr str ptr) msvcr120.strtok_s +@ cdecl strtol(str ptr long) msvcr120.strtol +@ stub strtold +@ stub strtoll +@ cdecl strtoul(str ptr long) msvcr120.strtoul +@ stub strtoull +@ stub strtoumax +@ cdecl strxfrm(ptr str long) msvcr120.strxfrm +@ varargs swprintf_s(ptr long wstr) msvcr120.swprintf_s +@ varargs swscanf(wstr wstr) msvcr120.swscanf +@ varargs swscanf_s(wstr wstr) msvcr120.swscanf_s +@ cdecl tan(double) msvcr120.tan +@ cdecl -arch=arm,x86_64 tanf(float) msvcr120.tanf +@ cdecl tanh(double) msvcr120.tanh +@ cdecl -arch=arm,x86_64 tanhf(float) msvcr120.tanhf +@ stub tgamma +@ stub tgammaf +@ stub tgammal +@ cdecl tmpfile() msvcr120.tmpfile +@ cdecl tmpfile_s(ptr) msvcr120.tmpfile_s +@ cdecl tmpnam(ptr) msvcr120.tmpnam +@ stub tmpnam_s +@ cdecl tolower(long) msvcr120.tolower +@ cdecl toupper(long) msvcr120.toupper +@ stub towctrans +@ cdecl towlower(long) msvcr120.towlower +@ cdecl towupper(long) msvcr120.towupper +@ cdecl trunc(double) msvcr120.trunc +@ cdecl truncf(float) msvcr120.truncf +@ cdecl truncl(double) msvcr120.truncl +@ cdecl ungetc(long ptr) msvcr120.ungetc +@ cdecl ungetwc(long ptr) msvcr120.ungetwc +@ cdecl vfprintf(ptr str ptr) msvcr120.vfprintf +@ cdecl vfprintf_s(ptr str ptr) msvcr120.vfprintf_s +@ stub vfscanf +@ stub vfscanf_s +@ cdecl vfwprintf(ptr wstr ptr) msvcr120.vfwprintf +@ cdecl vfwprintf_s(ptr wstr ptr) msvcr120.vfwprintf_s +@ stub vfwscanf +@ stub vfwscanf_s +@ cdecl vprintf(str ptr) msvcr120.vprintf +@ cdecl vprintf_s(str ptr) msvcr120.vprintf_s +@ stub vscanf +@ stub vscanf_s +@ cdecl vsprintf(ptr str ptr) msvcr120.vsprintf +@ cdecl vsprintf_s(ptr long str ptr) msvcr120.vsprintf_s +@ stub vsscanf +@ stub vsscanf_s +@ cdecl vswprintf_s(ptr long wstr ptr) msvcr120.vswprintf_s +@ stub vswscanf +@ stub vswscanf_s +@ cdecl vwprintf(wstr ptr) msvcr120.vwprintf +@ cdecl vwprintf_s(wstr ptr) msvcr120.vwprintf_s +@ stub vwscanf +@ stub vwscanf_s +@ cdecl wcrtomb(ptr long ptr) msvcr120.wcrtomb +@ stub wcrtomb_s +@ cdecl wcscat(wstr wstr) msvcr120.wcscat +@ cdecl wcscat_s(wstr long wstr) msvcr120.wcscat_s +@ cdecl wcschr(wstr long) msvcr120.wcschr +@ cdecl wcscmp(wstr wstr) msvcr120.wcscmp +@ cdecl wcscoll(wstr wstr) msvcr120.wcscoll +@ cdecl wcscpy(ptr wstr) msvcr120.wcscpy +@ cdecl wcscpy_s(ptr long wstr) msvcr120.wcscpy_s +@ cdecl wcscspn(wstr wstr) msvcr120.wcscspn +@ cdecl wcsftime(ptr long wstr ptr) msvcr120.wcsftime +@ cdecl wcslen(wstr) msvcr120.wcslen +@ cdecl wcsncat(wstr wstr long) msvcr120.wcsncat +@ cdecl wcsncat_s(wstr long wstr long) msvcr120.wcsncat_s +@ cdecl wcsncmp(wstr wstr long) msvcr120.wcsncmp +@ cdecl wcsncpy(ptr wstr long) msvcr120.wcsncpy +@ cdecl wcsncpy_s(ptr long wstr long) msvcr120.wcsncpy_s +@ cdecl wcsnlen(wstr long) msvcr120.wcsnlen +@ cdecl wcspbrk(wstr wstr) msvcr120.wcspbrk +@ cdecl wcsrchr(wstr long) msvcr120.wcsrchr +@ cdecl wcsrtombs(ptr ptr long ptr) msvcr120.wcsrtombs +@ cdecl wcsrtombs_s(ptr ptr long ptr long ptr) msvcr120.wcsrtombs_s +@ cdecl wcsspn(wstr wstr) msvcr120.wcsspn +@ cdecl wcsstr(wstr wstr) msvcr120.wcsstr +@ cdecl wcstod(wstr ptr) msvcr120.wcstod +@ stub wcstof +@ stub wcstoimax +@ cdecl wcstok(wstr wstr) msvcr120.wcstok +@ cdecl wcstok_s(ptr wstr ptr) msvcr120.wcstok_s +@ cdecl wcstol(wstr ptr long) msvcr120.wcstol +@ stub wcstold +@ stub wcstoll +@ cdecl wcstombs(ptr ptr long) msvcr120.wcstombs +@ cdecl wcstombs_s(ptr ptr long wstr long) msvcr120.wcstombs_s +@ cdecl wcstoul(wstr ptr long) msvcr120.wcstoul +@ stub wcstoull +@ stub wcstoumax +@ cdecl wcsxfrm(ptr wstr long) msvcr120.wcsxfrm +@ cdecl wctob(long) msvcr120.wctob +@ cdecl wctomb(ptr long) msvcr120.wctomb +@ cdecl wctomb_s(ptr ptr long long) msvcr120.wctomb_s +@ stub wctrans +@ stub wctype +@ cdecl wmemcpy_s(ptr long ptr long) msvcr120.wmemcpy_s +@ cdecl wmemmove_s(ptr long ptr long) msvcr120.wmemmove_s +@ varargs wprintf(wstr) msvcr120.wprintf +@ varargs wprintf_s(wstr) msvcr120.wprintf_s +@ varargs wscanf(wstr) msvcr120.wscanf +@ varargs wscanf_s(wstr) msvcr120.wscanf_s diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcrt/file.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcrt/file.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcrt/file.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcrt/file.c 2014-12-15 00:45:34.000000000 +0000 @@ -1081,29 +1081,38 @@ */ int CDECL MSVCRT__eof(int fd) { + ioinfo *info = get_ioinfo(fd); DWORD curpos,endpos; LONG hcurpos,hendpos; - HANDLE hand = msvcrt_fdtoh(fd); - TRACE(":fd (%d) handle (%p)\n",fd,hand); + TRACE(":fd (%d) handle (%p)\n", fd, info->handle); - if (hand == INVALID_HANDLE_VALUE) + if (info->handle == INVALID_HANDLE_VALUE) + { + release_ioinfo(info); return -1; + } - if (get_ioinfo_nolock(fd)->wxflag & WX_ATEOF) return TRUE; + if (info->wxflag & WX_ATEOF) + { + release_ioinfo(info); + return TRUE; + } /* Otherwise we do it the hard way */ hcurpos = hendpos = 0; - curpos = SetFilePointer(hand, 0, &hcurpos, FILE_CURRENT); - endpos = SetFilePointer(hand, 0, &hendpos, FILE_END); + curpos = SetFilePointer(info->handle, 0, &hcurpos, FILE_CURRENT); + endpos = SetFilePointer(info->handle, 0, &hendpos, FILE_END); if (curpos == endpos && hcurpos == hendpos) { /* FIXME: shouldn't WX_ATEOF be set here? */ + release_ioinfo(info); return TRUE; } - SetFilePointer(hand, curpos, &hcurpos, FILE_BEGIN); + SetFilePointer(info->handle, curpos, &hcurpos, FILE_BEGIN); + release_ioinfo(info); return FALSE; } @@ -1171,15 +1180,20 @@ */ __int64 CDECL MSVCRT__lseeki64(int fd, __int64 offset, int whence) { - HANDLE hand = msvcrt_fdtoh(fd); + ioinfo *info = get_ioinfo(fd); LARGE_INTEGER ofs; - TRACE(":fd (%d) handle (%p)\n",fd,hand); - if (hand == INVALID_HANDLE_VALUE) + TRACE(":fd (%d) handle (%p)\n", fd, info->handle); + + if (info->handle == INVALID_HANDLE_VALUE) + { + release_ioinfo(info); return -1; + } if (whence < 0 || whence > 2) { + release_ioinfo(info); *MSVCRT__errno() = MSVCRT_EINVAL; return -1; } @@ -1193,14 +1207,16 @@ /* The MoleBox protection scheme expects msvcrt to use SetFilePointer only, * so a LARGE_INTEGER offset cannot be passed directly via SetFilePointerEx. */ ofs.QuadPart = offset; - if ((ofs.u.LowPart = SetFilePointer(hand, ofs.u.LowPart, &ofs.u.HighPart, whence)) != INVALID_SET_FILE_POINTER || + if ((ofs.u.LowPart = SetFilePointer(info->handle, ofs.u.LowPart, &ofs.u.HighPart, whence)) != INVALID_SET_FILE_POINTER || GetLastError() == ERROR_SUCCESS) { - get_ioinfo_nolock(fd)->wxflag &= ~WX_ATEOF; + info->wxflag &= ~WX_ATEOF; /* FIXME: What if we seek _to_ EOF - is EOF set? */ + release_ioinfo(info); return ofs.QuadPart; } + release_ioinfo(info); TRACE(":error-last error (%d)\n",GetLastError()); msvcrt_set_errno(GetLastError()); return -1; @@ -1243,16 +1259,20 @@ */ int CDECL MSVCRT__locking(int fd, int mode, LONG nbytes) { + ioinfo *info = get_ioinfo(fd); BOOL ret; DWORD cur_locn; - HANDLE hand = msvcrt_fdtoh(fd); - TRACE(":fd (%d) handle (%p)\n",fd,hand); - if (hand == INVALID_HANDLE_VALUE) + TRACE(":fd (%d) handle (%p)\n", fd, info->handle); + if (info->handle == INVALID_HANDLE_VALUE) + { + release_ioinfo(info); return -1; + } if (mode < 0 || mode > 4) { + release_ioinfo(info); *MSVCRT__errno() = MSVCRT_EINVAL; return -1; } @@ -1265,8 +1285,9 @@ (mode==MSVCRT__LK_NBRLCK)?"_LK_NBRLCK": "UNKNOWN"); - if ((cur_locn = SetFilePointer(hand, 0L, NULL, SEEK_CUR)) == INVALID_SET_FILE_POINTER) + if ((cur_locn = SetFilePointer(info->handle, 0L, NULL, SEEK_CUR)) == INVALID_SET_FILE_POINTER) { + release_ioinfo(info); FIXME ("Seek failed\n"); *MSVCRT__errno() = MSVCRT_EINVAL; /* FIXME */ return -1; @@ -1277,16 +1298,17 @@ ret = 1; /* just to satisfy gcc */ while (nretry--) { - ret = LockFile(hand, cur_locn, 0L, nbytes, 0L); + ret = LockFile(info->handle, cur_locn, 0L, nbytes, 0L); if (ret) break; Sleep(1); } } else if (mode == MSVCRT__LK_UNLCK) - ret = UnlockFile(hand, cur_locn, 0L, nbytes, 0L); + ret = UnlockFile(info->handle, cur_locn, 0L, nbytes, 0L); else - ret = LockFile(hand, cur_locn, 0L, nbytes, 0L); + ret = LockFile(info->handle, cur_locn, 0L, nbytes, 0L); /* FIXME - what about error settings? */ + release_ioinfo(info); return ret ? 0 : -1; } @@ -1355,18 +1377,17 @@ */ int CDECL MSVCRT__chsize_s(int fd, __int64 size) { + ioinfo *info; __int64 cur, pos; - HANDLE handle; BOOL ret = FALSE; TRACE("(fd=%d, size=%s)\n", fd, wine_dbgstr_longlong(size)); if (!MSVCRT_CHECK_PMT(size >= 0)) return MSVCRT_EINVAL; - LOCK_FILES(); - handle = msvcrt_fdtoh(fd); - if (handle != INVALID_HANDLE_VALUE) + info = get_ioinfo(fd); + if (info->handle != INVALID_HANDLE_VALUE) { /* save the current file pointer */ cur = MSVCRT__lseeki64(fd, 0, SEEK_CUR); @@ -1375,7 +1396,7 @@ pos = MSVCRT__lseeki64(fd, size, SEEK_SET); if (pos >= 0) { - ret = SetEndOfFile(handle); + ret = SetEndOfFile(info->handle); if (!ret) msvcrt_set_errno(GetLastError()); } @@ -1384,7 +1405,7 @@ } } - UNLOCK_FILES(); + release_ioinfo(info); return ret ? 0 : *MSVCRT__errno(); } @@ -1417,7 +1438,7 @@ TRACE(":file (%p) fd (%d)\n",file,file->_file); MSVCRT__lock_file(file); - MSVCRT_fseek(file, 0L, SEEK_SET); + MSVCRT__fseek_nolock(file, 0L, SEEK_SET); MSVCRT_clearerr(file); MSVCRT__unlock_file(file); } @@ -1630,25 +1651,29 @@ */ int CDECL MSVCRT__fstat64(int fd, struct MSVCRT__stat64* buf) { + ioinfo *info = get_ioinfo(fd); DWORD dw; DWORD type; BY_HANDLE_FILE_INFORMATION hfi; - HANDLE hand = msvcrt_fdtoh(fd); - TRACE(":fd (%d) stat (%p)\n",fd,buf); - if (hand == INVALID_HANDLE_VALUE) + TRACE(":fd (%d) stat (%p)\n", fd, buf); + if (info->handle == INVALID_HANDLE_VALUE) + { + release_ioinfo(info); return -1; + } if (!buf) { WARN(":failed-NULL buf\n"); msvcrt_set_errno(ERROR_INVALID_PARAMETER); + release_ioinfo(info); return -1; } memset(&hfi, 0, sizeof(hfi)); memset(buf, 0, sizeof(struct MSVCRT__stat64)); - type = GetFileType(hand); + type = GetFileType(info->handle); if (type == FILE_TYPE_PIPE) { buf->st_dev = buf->st_rdev = fd; @@ -1663,10 +1688,11 @@ } else /* FILE_TYPE_DISK etc. */ { - if (!GetFileInformationByHandle(hand, &hfi)) + if (!GetFileInformationByHandle(info->handle, &hfi)) { WARN(":failed-last error (%d)\n",GetLastError()); msvcrt_set_errno(ERROR_INVALID_PARAMETER); + release_ioinfo(info); return -1; } buf->st_mode = S_IFREG | 0444; @@ -1681,6 +1707,7 @@ } TRACE(":dwFileAttributes = 0x%x, mode set to 0x%x\n",hfi.dwFileAttributes, buf->st_mode); + release_ioinfo(info); return 0; } @@ -3586,7 +3613,7 @@ MSVCRT__lock_file(file); - while ((size >1) && (cc = MSVCRT_fgetc(file)) != MSVCRT_EOF && cc != '\n') + while ((size >1) && (cc = MSVCRT__fgetc_nolock(file)) != MSVCRT_EOF && cc != '\n') { *s++ = (char)cc; size --; @@ -3676,7 +3703,7 @@ MSVCRT__lock_file(file); for (j=0; j_flag |= MSVCRT__IOEOF; MSVCRT__unlock_file(file); @@ -3726,7 +3753,7 @@ MSVCRT__lock_file(file); - while ((size >1) && (cc = MSVCRT_fgetwc(file)) != MSVCRT_WEOF && cc != '\n') + while ((size >1) && (cc = MSVCRT__fgetwc_nolock(file)) != MSVCRT_WEOF && cc != '\n') { *s++ = cc; size --; @@ -4452,7 +4479,7 @@ int ret; MSVCRT__lock_file(file); - ret = MSVCRT_fwrite(s, sizeof(*s), len, file) == len ? 0 : MSVCRT_EOF; + ret = MSVCRT__fwrite_nolock(s, sizeof(*s), len, file) == len ? 0 : MSVCRT_EOF; MSVCRT__unlock_file(file); return ret; } @@ -4468,14 +4495,14 @@ MSVCRT__lock_file(file); if (!(get_ioinfo_nolock(file->_file)->wxflag & WX_TEXT)) { - ret = MSVCRT_fwrite(s,sizeof(*s),len,file) == len ? 0 : MSVCRT_EOF; + ret = MSVCRT__fwrite_nolock(s,sizeof(*s),len,file) == len ? 0 : MSVCRT_EOF; MSVCRT__unlock_file(file); return ret; } tmp_buf = add_std_buffer(file); for (i=0; i_flag & MSVCRT__IOMYBUF) MSVCRT_free(file->_base); file->_flag &= ~(MSVCRT__IONBF | MSVCRT__IOMYBUF | MSVCRT__USERBUF); @@ -4823,13 +4850,13 @@ MSVCRT__lock_file(file); if(!(get_ioinfo_nolock(((MSVCRT_FILE*)file)->_file)->wxflag & WX_TEXT)) { - ret = MSVCRT_fwrite(str, sizeof(MSVCRT_wchar_t), len, file); + ret = MSVCRT__fwrite_nolock(str, sizeof(MSVCRT_wchar_t), len, file); MSVCRT__unlock_file(file); return ret; } for(i=0; ilconv->mon_grouping); MSVCRT_free(locinfo->lconv->positive_sign); MSVCRT_free(locinfo->lconv->negative_sign); +#if _MSVCR_VER >= 120 + MSVCRT_free(locinfo->lconv->_W_decimal_point); + MSVCRT_free(locinfo->lconv->_W_thousands_sep); + MSVCRT_free(locinfo->lconv->_W_int_curr_symbol); + MSVCRT_free(locinfo->lconv->_W_currency_symbol); + MSVCRT_free(locinfo->lconv->_W_mon_decimal_point); + MSVCRT_free(locinfo->lconv->_W_mon_thousands_sep); + MSVCRT_free(locinfo->lconv->_W_positive_sign); + MSVCRT_free(locinfo->lconv->_W_negative_sign); +#endif } MSVCRT_free(locinfo->lconv_intl_refcount); MSVCRT_free(locinfo->lconv_num_refcount); @@ -755,6 +765,9 @@ LCID lcid[6] = { 0 }, lcid_tmp; unsigned short cp[6] = { 0 }; char buf[256]; +#if _MSVCR_VER >= 120 + MSVCRT_wchar_t wbuf[256]; +#endif int i, ret, size; TRACE("(%d %s)\n", category, locale); @@ -1092,6 +1105,63 @@ MSVCRT__free_locale(loc); return NULL; } + +#if _MSVCR_VER >= 120 + i = GetLocaleInfoW(lcid[MSVCRT_LC_MONETARY], LOCALE_SINTLSYMBOL + |LOCALE_NOUSEROVERRIDE, wbuf, 256); + if(i && (loc->locinfo->lconv->_W_int_curr_symbol = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) + memcpy(loc->locinfo->lconv->_W_int_curr_symbol, wbuf, i * sizeof(MSVCRT_wchar_t)); + else { + MSVCRT__free_locale(loc); + return NULL; + } + + i = GetLocaleInfoW(lcid[MSVCRT_LC_MONETARY], LOCALE_SCURRENCY + |LOCALE_NOUSEROVERRIDE, wbuf, 256); + if(i && (loc->locinfo->lconv->_W_currency_symbol = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) + memcpy(loc->locinfo->lconv->_W_currency_symbol, wbuf, i * sizeof(MSVCRT_wchar_t)); + else { + MSVCRT__free_locale(loc); + return NULL; + } + + i = GetLocaleInfoW(lcid[MSVCRT_LC_MONETARY], LOCALE_SMONDECIMALSEP + |LOCALE_NOUSEROVERRIDE, wbuf, 256); + if(i && (loc->locinfo->lconv->_W_mon_decimal_point = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) + memcpy(loc->locinfo->lconv->_W_mon_decimal_point, wbuf, i * sizeof(MSVCRT_wchar_t)); + else { + MSVCRT__free_locale(loc); + return NULL; + } + + i = GetLocaleInfoW(lcid[MSVCRT_LC_MONETARY], LOCALE_SMONTHOUSANDSEP + |LOCALE_NOUSEROVERRIDE, wbuf, 256); + if(i && (loc->locinfo->lconv->_W_mon_thousands_sep = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) + memcpy(loc->locinfo->lconv->_W_mon_thousands_sep, wbuf, i * sizeof(MSVCRT_wchar_t)); + else { + MSVCRT__free_locale(loc); + return NULL; + } + + i = GetLocaleInfoW(lcid[MSVCRT_LC_MONETARY], LOCALE_SPOSITIVESIGN + |LOCALE_NOUSEROVERRIDE, wbuf, 256); + if(i && (loc->locinfo->lconv->_W_positive_sign = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) + memcpy(loc->locinfo->lconv->_W_positive_sign, wbuf, i * sizeof(MSVCRT_wchar_t)); + else { + MSVCRT__free_locale(loc); + return NULL; + } + + i = GetLocaleInfoW(lcid[MSVCRT_LC_MONETARY], LOCALE_SNEGATIVESIGN + |LOCALE_NOUSEROVERRIDE, wbuf, 256); + if(i && (loc->locinfo->lconv->_W_negative_sign = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) + memcpy(loc->locinfo->lconv->_W_negative_sign, wbuf, i * sizeof(MSVCRT_wchar_t)); + else { + MSVCRT__free_locale(loc); + return NULL; + } +#endif + } else { loc->locinfo->lconv->int_curr_symbol = MSVCRT_malloc(sizeof(char)); loc->locinfo->lconv->currency_symbol = MSVCRT_malloc(sizeof(char)); @@ -1125,6 +1195,29 @@ loc->locinfo->lconv->p_sign_posn = 127; loc->locinfo->lconv->n_sign_posn = 127; +#if _MSVCR_VER >= 120 + loc->locinfo->lconv->_W_int_curr_symbol = MSVCRT_malloc(sizeof(MSVCRT_wchar_t)); + loc->locinfo->lconv->_W_currency_symbol = MSVCRT_malloc(sizeof(MSVCRT_wchar_t)); + loc->locinfo->lconv->_W_mon_decimal_point = MSVCRT_malloc(sizeof(MSVCRT_wchar_t)); + loc->locinfo->lconv->_W_mon_thousands_sep = MSVCRT_malloc(sizeof(MSVCRT_wchar_t)); + loc->locinfo->lconv->_W_positive_sign = MSVCRT_malloc(sizeof(MSVCRT_wchar_t)); + loc->locinfo->lconv->_W_negative_sign = MSVCRT_malloc(sizeof(MSVCRT_wchar_t)); + + if(!loc->locinfo->lconv->_W_int_curr_symbol || !loc->locinfo->lconv->_W_currency_symbol + || !loc->locinfo->lconv->_W_mon_decimal_point || !loc->locinfo->lconv->_W_mon_thousands_sep + || !loc->locinfo->lconv->positive_sign || !loc->locinfo->lconv->negative_sign) { + MSVCRT__free_locale(loc); + return NULL; + } + + loc->locinfo->lconv->_W_int_curr_symbol[0] = '\0'; + loc->locinfo->lconv->_W_currency_symbol[0] = '\0'; + loc->locinfo->lconv->_W_mon_decimal_point[0] = '\0'; + loc->locinfo->lconv->_W_mon_thousands_sep[0] = '\0'; + loc->locinfo->lconv->_W_positive_sign[0] = '\0'; + loc->locinfo->lconv->_W_negative_sign[0] = '\0'; +#endif + loc->locinfo->lc_category[MSVCRT_LC_MONETARY].locale = MSVCRT__strdup("C"); } @@ -1177,6 +1270,27 @@ MSVCRT__free_locale(loc); return NULL; } + +#if _MSVCR_VER >= 120 + i = GetLocaleInfoW(lcid[MSVCRT_LC_NUMERIC], LOCALE_SDECIMAL + |LOCALE_NOUSEROVERRIDE, wbuf, 256); + if(i && (loc->locinfo->lconv->_W_decimal_point = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) + memcpy(loc->locinfo->lconv->_W_decimal_point, wbuf, i * sizeof(MSVCRT_wchar_t)); + else { + MSVCRT__free_locale(loc); + return NULL; + } + + i = GetLocaleInfoW(lcid[MSVCRT_LC_NUMERIC], LOCALE_STHOUSAND + |LOCALE_NOUSEROVERRIDE, wbuf, 256); + if(i && (loc->locinfo->lconv->_W_thousands_sep = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) + memcpy(loc->locinfo->lconv->_W_thousands_sep, wbuf, i * sizeof(MSVCRT_wchar_t)); + else { + MSVCRT__free_locale(loc); + return NULL; + } +#endif + } else { loc->locinfo->lconv->decimal_point = MSVCRT_malloc(sizeof(char[2])); loc->locinfo->lconv->thousands_sep = MSVCRT_malloc(sizeof(char)); @@ -1192,6 +1306,20 @@ loc->locinfo->lconv->thousands_sep[0] = '\0'; loc->locinfo->lconv->grouping[0] = '\0'; +#if _MSVCR_VER >= 120 + loc->locinfo->lconv->_W_decimal_point = MSVCRT_malloc(sizeof(MSVCRT_wchar_t[2])); + loc->locinfo->lconv->_W_thousands_sep = MSVCRT_malloc(sizeof(MSVCRT_wchar_t)); + + if(!loc->locinfo->lconv->_W_decimal_point || !loc->locinfo->lconv->_W_thousands_sep) { + MSVCRT__free_locale(loc); + return NULL; + } + + loc->locinfo->lconv->_W_decimal_point[0] = '.'; + loc->locinfo->lconv->_W_decimal_point[1] = '\0'; + loc->locinfo->lconv->_W_thousands_sep[0] = '\0'; +#endif + loc->locinfo->lc_category[MSVCRT_LC_NUMERIC].locale = MSVCRT__strdup("C"); } @@ -1357,6 +1485,22 @@ (void**)&loc->locinfo->lconv->positive_sign); swap_pointers((void**)&locinfo->lconv->negative_sign, (void**)&loc->locinfo->lconv->negative_sign); + +#if _MSVCR_VER >= 120 + swap_pointers((void**)&locinfo->lconv->_W_int_curr_symbol, + (void**)&loc->locinfo->lconv->_W_int_curr_symbol); + swap_pointers((void**)&locinfo->lconv->_W_currency_symbol, + (void**)&loc->locinfo->lconv->_W_currency_symbol); + swap_pointers((void**)&locinfo->lconv->_W_mon_decimal_point, + (void**)&loc->locinfo->lconv->_W_mon_decimal_point); + swap_pointers((void**)&locinfo->lconv->_W_mon_thousands_sep, + (void**)&loc->locinfo->lconv->_W_mon_thousands_sep); + swap_pointers((void**)&locinfo->lconv->_W_positive_sign, + (void**)&loc->locinfo->lconv->_W_positive_sign); + swap_pointers((void**)&locinfo->lconv->_W_negative_sign, + (void**)&loc->locinfo->lconv->_W_negative_sign); +#endif + locinfo->lconv->int_frac_digits = loc->locinfo->lconv->int_frac_digits; locinfo->lconv->frac_digits = loc->locinfo->lconv->frac_digits; locinfo->lconv->p_cs_precedes = loc->locinfo->lconv->p_cs_precedes; @@ -1384,6 +1528,13 @@ swap_pointers((void**)&locinfo->lconv->grouping, (void**)&loc->locinfo->lconv->grouping); +#if _MSVCR_VER >= 120 + swap_pointers((void**)&locinfo->lconv->_W_decimal_point, + (void**)&loc->locinfo->lconv->_W_decimal_point); + swap_pointers((void**)&locinfo->lconv->_W_thousands_sep, + (void**)&loc->locinfo->lconv->_W_thousands_sep); +#endif + if(category != MSVCRT_LC_ALL) break; /* fall through */ diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcrt/math.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcrt/math.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcrt/math.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcrt/math.c 2014-12-15 00:45:34.000000000 +0000 @@ -39,6 +39,7 @@ #endif typedef int (CDECL *MSVCRT_matherr_func)(struct MSVCRT__exception *); +typedef double LDOUBLE; /* long double is just a double */ static MSVCRT_matherr_func MSVCRT_default_matherr_func = NULL; @@ -2205,3 +2206,364 @@ } #endif /* __i386__ */ + +/********************************************************************* + * cbrt (MSVCR120.@) + */ +double CDECL MSVCR120_cbrt(double x) +{ +#ifdef HAVE_CBRT + return cbrt(x); +#else + return x < 0 ? -pow(-x, 1.0 / 3.0) : pow(x, 1.0 / 3.0); +#endif +} + +/********************************************************************* + * cbrtf (MSVCR120.@) + */ +float CDECL MSVCR120_cbrtf(float x) +{ +#ifdef HAVE_CBRTF + return cbrtf(x); +#else + return MSVCR120_cbrt(x); +#endif +} + +/********************************************************************* + * cbrtl (MSVCR120.@) + */ +LDOUBLE CDECL MSVCR120_cbrtl(LDOUBLE x) +{ + return MSVCR120_cbrt(x); +} + +/********************************************************************* + * exp2 (MSVCR120.@) + */ +double CDECL MSVCR120_exp2(double x) +{ +#ifdef HAVE_EXP2 + return exp2(x); +#else + return pow(2, x); +#endif +} + +/********************************************************************* + * exp2f (MSVCR120.@) + */ +float CDECL MSVCR120_exp2f(float x) +{ +#ifdef HAVE_EXP2F + return exp2f(x); +#else + return MSVCR120_exp2(x); +#endif +} + +/********************************************************************* + * exp2l (MSVCR120.@) + */ +LDOUBLE CDECL MSVCR120_exp2l(LDOUBLE x) +{ + return MSVCR120_exp2(x); +} + +/********************************************************************* + * log2 (MSVCR120.@) + */ +double CDECL MSVCR120_log2(double x) +{ +#ifdef HAVE_LOG2 + return log2(x); +#else + return log(x) / log(2); +#endif +} + +/********************************************************************* + * log2f (MSVCR120.@) + */ +float CDECL MSVCR120_log2f(float x) +{ +#ifdef HAVE_LOG2F + return log2f(x); +#else + return MSVCR120_log2(x); +#endif +} + +/********************************************************************* + * log2l (MSVCR120.@) + */ +LDOUBLE CDECL MSVCR120_log2l(LDOUBLE x) +{ + return MSVCR120_log2(x); +} + +/********************************************************************* + * rint (MSVCR120.@) + */ +double CDECL MSVCR120_rint(double x) +{ +#ifdef HAVE_RINT + return rint(x); +#else + return x >= 0 ? floor(x + 0.5) : ceil(x - 0.5); +#endif +} + +/********************************************************************* + * rintf (MSVCR120.@) + */ +float CDECL MSVCR120_rintf(float x) +{ +#ifdef HAVE_RINTF + return rintf(x); +#else + return MSVCR120_rint(x); +#endif +} + +/********************************************************************* + * rintl (MSVCR120.@) + */ +LDOUBLE CDECL MSVCR120_rintl(LDOUBLE x) +{ + return MSVCR120_rint(x); +} + +/********************************************************************* + * lrint (MSVCR120.@) + */ +MSVCRT_long CDECL MSVCR120_lrint(double x) +{ +#ifdef HAVE_LRINT + return lrint(x); +#else + return MSVCR120_rint(x); +#endif +} + +/********************************************************************* + * lrintf (MSVCR120.@) + */ +MSVCRT_long CDECL MSVCR120_lrintf(float x) +{ +#ifdef HAVE_LRINTF + return lrintf(x); +#else + return MSVCR120_lrint(x); +#endif +} + +/********************************************************************* + * lrintl (MSVCR120.@) + */ +MSVCRT_long CDECL MSVCR120_lrintl(LDOUBLE x) +{ + return MSVCR120_lrint(x); +} + +/********************************************************************* + * llrint (MSVCR120.@) + */ +MSVCRT_longlong CDECL MSVCR120_llrint(double x) +{ +#ifdef HAVE_LLRINT + return llrint(x); +#else + return MSVCR120_rint(x); +#endif +} + +/********************************************************************* + * llrintf (MSVCR120.@) + */ +MSVCRT_longlong CDECL MSVCR120_llrintf(float x) +{ +#ifdef HAVE_LLRINTF + return llrintf(x); +#else + return MSVCR120_llrint(x); +#endif +} + +/********************************************************************* + * rintl (MSVCR120.@) + */ +MSVCRT_longlong CDECL MSVCR120_llrintl(LDOUBLE x) +{ + return MSVCR120_llrint(x); +} + +/********************************************************************* + * round (MSVCR120.@) + */ +double CDECL MSVCR120_round(double x) +{ +#ifdef HAVE_ROUND + return round(x); +#else + return MSVCR120_rint(x); +#endif +} + +/********************************************************************* + * roundf (MSVCR120.@) + */ +float CDECL MSVCR120_roundf(float x) +{ +#ifdef HAVE_ROUNDF + return roundf(x); +#else + return MSVCR120_round(x); +#endif +} + +/********************************************************************* + * roundl (MSVCR120.@) + */ +LDOUBLE CDECL MSVCR120_roundl(LDOUBLE x) +{ + return MSVCR120_round(x); +} + +/********************************************************************* + * lround (MSVCR120.@) + */ +MSVCRT_long CDECL MSVCR120_lround(double x) +{ +#ifdef HAVE_LROUND + return lround(x); +#else + return MSVCR120_round(x); +#endif +} + +/********************************************************************* + * lroundf (MSVCR120.@) + */ +MSVCRT_long CDECL MSVCR120_lroundf(float x) +{ +#ifdef HAVE_LROUNDF + return lroundf(x); +#else + return MSVCR120_lround(x); +#endif +} + +/********************************************************************* + * lroundl (MSVCR120.@) + */ +MSVCRT_long CDECL MSVCR120_lroundl(LDOUBLE x) +{ + return MSVCR120_lround(x); +} + +/********************************************************************* + * llround (MSVCR120.@) + */ +MSVCRT_longlong CDECL MSVCR120_llround(double x) +{ +#ifdef HAVE_LLROUND + return llround(x); +#else + return MSVCR120_round(x); +#endif +} + +/********************************************************************* + * llroundf (MSVCR120.@) + */ +MSVCRT_longlong CDECL MSVCR120_llroundf(float x) +{ +#ifdef HAVE_LLROUNDF + return llroundf(x); +#else + return MSVCR120_llround(x); +#endif +} + +/********************************************************************* + * roundl (MSVCR120.@) + */ +MSVCRT_longlong CDECL MSVCR120_llroundl(LDOUBLE x) +{ + return MSVCR120_llround(x); +} + +/********************************************************************* + * trunc (MSVCR120.@) + */ +double CDECL MSVCR120_trunc(double x) +{ +#ifdef HAVE_TRUNC + return trunc(x); +#else + return (x > 0) ? floor(x) : ceil(x); +#endif +} + +/********************************************************************* + * truncf (MSVCR120.@) + */ +float CDECL MSVCR120_truncf(float x) +{ +#ifdef HAVE_TRUNCF + return truncf(x); +#else + return MSVCR120_trunc(x); +#endif +} + +/********************************************************************* + * truncl (MSVCR120.@) + */ +LDOUBLE CDECL MSVCR120_truncl(LDOUBLE x) +{ + return MSVCR120_trunc(x); +} + +/********************************************************************* + * _dclass (MSVCR120.@) + */ +short CDECL MSVCR120__dclass(double x) +{ + switch (MSVCRT__fpclass(x)) { + case MSVCRT__FPCLASS_QNAN: + case MSVCRT__FPCLASS_SNAN: + return MSVCRT_FP_NAN; + case MSVCRT__FPCLASS_NINF: + case MSVCRT__FPCLASS_PINF: + return MSVCRT_FP_INFINITE; + case MSVCRT__FPCLASS_ND: + case MSVCRT__FPCLASS_PD: + return MSVCRT_FP_SUBNORMAL; + case MSVCRT__FPCLASS_NN: + case MSVCRT__FPCLASS_PN: + default: + return MSVCRT_FP_NORMAL; + case MSVCRT__FPCLASS_NZ: + case MSVCRT__FPCLASS_PZ: + return MSVCRT_FP_ZERO; + } +} + +/********************************************************************* + * _fdclass (MSVCR120.@) + */ +short CDECL MSVCR120__fdclass(float x) +{ + return MSVCR120__dclass(x); +} + +/********************************************************************* + * _ldclass (MSVCR120.@) + */ +short CDECL MSVCR120__ldclass(LDOUBLE x) +{ + return MSVCR120__dclass(x); +} diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcrt/misc.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcrt/misc.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcrt/misc.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcrt/misc.c 2014-12-15 00:45:34.000000000 +0000 @@ -490,3 +490,11 @@ TRACE("(%p %x %x)\n", cs, spin_count, flags); return InitializeCriticalSectionEx(cs, spin_count, flags); } + +/********************************************************************* + * _vacopy (MSVCR120.@) + */ +void CDECL MSVCR120__vacopy(__ms_va_list *dest, __ms_va_list src) +{ + __ms_va_copy(*dest, src); +} diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcrt/msvcrt.h wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcrt/msvcrt.h --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcrt/msvcrt.h 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcrt/msvcrt.h 2014-12-15 00:45:34.000000000 +0000 @@ -366,6 +366,16 @@ char n_sep_by_space; char p_sign_posn; char n_sign_posn; +#if _MSVCR_VER >= 120 + MSVCRT_wchar_t* _W_decimal_point; + MSVCRT_wchar_t* _W_thousands_sep; + MSVCRT_wchar_t* _W_int_curr_symbol; + MSVCRT_wchar_t* _W_currency_symbol; + MSVCRT_wchar_t* _W_mon_decimal_point; + MSVCRT_wchar_t* _W_mon_thousands_sep; + MSVCRT_wchar_t* _W_positive_sign; + MSVCRT_wchar_t* _W_negative_sign; +#endif }; struct MSVCRT__exception { @@ -814,6 +824,13 @@ #define MSVCRT__FPCLASS_PN 0x0100 /* Positive Normal */ #define MSVCRT__FPCLASS_PINF 0x0200 /* Positive Infinity */ +/* fpclassify constants */ +#define MSVCRT_FP_INFINITE 1 +#define MSVCRT_FP_NAN 2 +#define MSVCRT_FP_NORMAL -1 +#define MSVCRT_FP_SUBNORMAL -2 +#define MSVCRT_FP_ZERO 0 + #define MSVCRT__MCW_EM 0x0008001f #define MSVCRT__MCW_IC 0x00040000 #define MSVCRT__MCW_RC 0x00000300 diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcrt/process.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcrt/process.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msvcrt/process.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msvcrt/process.c 2014-12-15 00:45:34.000000000 +0000 @@ -134,6 +134,7 @@ STARTUPINFOW si; PROCESS_INFORMATION pi; MSVCRT_wchar_t fullname[MAX_PATH]; + DWORD create_flags = CREATE_UNICODE_ENVIRONMENT; TRACE("%x %s %s %s %d\n", flags, debugstr_w(exe), debugstr_w(cmdline), debugstr_w(env), use_path); @@ -148,9 +149,9 @@ memset(&si, 0, sizeof(si)); si.cb = sizeof(si); msvcrt_create_io_inherit_block(&si.cbReserved2, &si.lpReserved2); + if (flags == MSVCRT__P_DETACH) create_flags |= DETACHED_PROCESS; if (!CreateProcessW(fullname, cmdline, NULL, NULL, TRUE, - flags == MSVCRT__P_DETACH ? DETACHED_PROCESS : 0, - env, NULL, &si, &pi)) + create_flags, env, NULL, &si, &pi)) { msvcrt_set_errno(GetLastError()); MSVCRT_free(si.lpReserved2); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msxml3/tests/domdoc.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/msxml3/tests/domdoc.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msxml3/tests/domdoc.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msxml3/tests/domdoc.c 2014-12-15 00:45:34.000000000 +0000 @@ -410,11 +410,6 @@ static const WCHAR szComplete2[] = { '<','?','x','m','l',' ', 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n', - '<','o','>','<','/','o','>','\n',0 -}; -static const WCHAR szComplete3[] = { - '<','?','x','m','l',' ', - 'v','e','r','s','i','o','n','=','\'','1','.','0','\'','?','>','\n', '<','a','>','<','/','a','>','\n',0 }; static const char complete4A[] = @@ -1368,7 +1363,7 @@ /* try to load something else simple and valid */ b = VARIANT_FALSE; - str = SysAllocString( szComplete3 ); + str = SysAllocString( szComplete2 ); r = IXMLDOMDocument_loadXML( doc, str, &b ); ok( r == S_OK, "loadXML failed\n"); ok( b == VARIANT_TRUE, "failed to load XML string\n"); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/msxml3/tests/saxreader.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/msxml3/tests/saxreader.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/msxml3/tests/saxreader.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/msxml3/tests/saxreader.c 2014-12-15 00:45:34.000000000 +0000 @@ -310,13 +310,6 @@ call_seq->count = call_seq->size = 0; } -static inline void flush_sequences(struct call_sequence **seq, int n) -{ - int i; - for (i = 0; i < n; i++) - flush_sequence(seq, i); -} - static const char *get_event_name(CH event) { return event_names[event]; @@ -2895,7 +2888,7 @@ HRESULT hr; int i; - static const REFIID riids[] = + static REFIID riids[] = { &IID_ISAXContentHandler, &IID_ISAXLexicalHandler, diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ntdll/signal_i386.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ntdll/signal_i386.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ntdll/signal_i386.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ntdll/signal_i386.c 2014-12-15 00:45:34.000000000 +0000 @@ -177,7 +177,6 @@ #define FPU_sig(context) ((FLOATING_SAVE_AREA*)((context)->uc_mcontext.fpregs)) #define FPUX_sig(context) (FPU_sig(context) && !((context)->uc_mcontext.fpregs->status >> 16) ? (XMM_SAVE_AREA32 *)(FPU_sig(context) + 1) : NULL) -#define VM86_EAX 0 /* the %eax value while vm86_enter is executing */ #define VIF_FLAG 0x00080000 #define VIP_FLAG 0x00100000 diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ntdll/time.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ntdll/time.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ntdll/time.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ntdll/time.c 2014-12-15 00:45:34.000000000 +0000 @@ -74,12 +74,8 @@ #define HOURSPERDAY 24 #define EPOCHWEEKDAY 1 /* Jan 1, 1601 was Monday */ #define DAYSPERWEEK 7 -#define EPOCHYEAR 1601 -#define DAYSPERNORMALYEAR 365 -#define DAYSPERLEAPYEAR 366 #define MONSPERYEAR 12 #define DAYSPERQUADRICENTENNIUM (365 * 400 + 97) -#define DAYSPERNORMALCENTURY (365 * 100 + 24) #define DAYSPERNORMALQUADRENNIUM (365 * 4 + 1) /* 1601 to 1970 is 369 years plus 89 leap days */ diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ntoskrnl.exe/ntoskrnl.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ntoskrnl.exe/ntoskrnl.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ntoskrnl.exe/ntoskrnl.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ntoskrnl.exe/ntoskrnl.c 2014-12-15 00:45:34.000000000 +0000 @@ -532,6 +532,43 @@ } +/********************************************************** + * IoBuildSynchronousFsdRequest (NTOSKRNL.EXE.@) + */ +PIRP WINAPI IoBuildSynchronousFsdRequest(ULONG majorfunc, PDEVICE_OBJECT device, + PVOID buffer, ULONG length, PLARGE_INTEGER startoffset, + PKEVENT event, PIO_STATUS_BLOCK iosb) +{ + PIRP irp; + struct IrpInstance *instance; + PIO_STACK_LOCATION irpsp; + + FIXME("(%d %p %p %d %p %p %p) stub\n", majorfunc, device, buffer, length, startoffset, event, iosb); + + irp = IoAllocateIrp( device->StackSize, FALSE ); + if (irp == NULL) + return NULL; + + instance = HeapAlloc( GetProcessHeap(), 0, sizeof(struct IrpInstance) ); + if (instance == NULL) + { + IoFreeIrp( irp ); + return NULL; + } + instance->irp = irp; + list_add_tail( &Irps, &instance->entry ); + + irpsp = IoGetNextIrpStackLocation( irp ); + irpsp->MajorFunction = majorfunc; + /*irpsp->Parameters.DeviceIoControl.IoControlCode = IoControlCode;*/ + + irp->UserIosb = iosb; + irp->UserEvent = event; + irp->UserBuffer = buffer; + return irp; +} + + /*********************************************************************** * IoCreateDriver (NTOSKRNL.EXE.@) */ @@ -731,9 +768,21 @@ { FIXME( "stub: %s %x %p %p\n", debugstr_us(name), access, file, device ); - return STATUS_NOT_IMPLEMENTED; + *file = NULL; + *device = NULL; + + return STATUS_SUCCESS; } +/*********************************************************************** + * IoGetAttachedDevice (NTOSKRNL.EXE.@) + */ +PDEVICE_OBJECT WINAPI IoGetAttachedDevice( PDEVICE_OBJECT device ) +{ + FIXME( "stub: %p\n", device ); + + return device; +} /*********************************************************************** * IoGetDeviceProperty (NTOSKRNL.EXE.@) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ntoskrnl.exe/ntoskrnl.exe.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/ntoskrnl.exe/ntoskrnl.exe.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ntoskrnl.exe/ntoskrnl.exe.spec 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ntoskrnl.exe/ntoskrnl.exe.spec 2014-12-15 00:45:34.000000000 +0000 @@ -322,7 +322,7 @@ @ stub IoBuildAsynchronousFsdRequest @ stdcall IoBuildDeviceIoControlRequest(long ptr ptr long ptr long long ptr ptr) @ stub IoBuildPartialMdl -@ stub IoBuildSynchronousFsdRequest +@ stdcall IoBuildSynchronousFsdRequest(long ptr ptr long ptr ptr ptr) @ stdcall IoCallDriver(ptr ptr) @ stub IoCancelFileOpen @ stub IoCancelIrp @@ -373,7 +373,7 @@ @ stdcall IoFreeIrp(ptr) @ stdcall IoFreeMdl(ptr) @ stub IoFreeWorkItem -@ stub IoGetAttachedDevice +@ stdcall IoGetAttachedDevice(ptr) @ stub IoGetAttachedDeviceReference @ stub IoGetBaseFileSystemDeviceObject @ stub IoGetBootDiskInformation diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ole2disp.dll16/ole2disp.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ole2disp.dll16/ole2disp.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ole2disp.dll16/ole2disp.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ole2disp.dll16/ole2disp.c 2014-12-15 00:45:34.000000000 +0000 @@ -260,6 +260,15 @@ } /****************************************************************************** + * VariantChangeTypeEx [OLE2DISP.108] + */ +HRESULT WINAPI VariantChangeTypeEx16(VARIANTARG *dest, const VARIANTARG *src, LCID lcid, USHORT flags, VARTYPE vt) +{ + FIXME("stub: %p %p %d %d %d\n", dest, src, lcid, flags, vt); + return E_INVALIDARG; +} + +/****************************************************************************** * SetErrorInfo [OLE2DISP.110] */ HRESULT WINAPI SetErrorInfo16(ULONG dwReserved, IErrorInfo *perrinfo) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ole2disp.dll16/ole2disp.dll16.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/ole2disp.dll16/ole2disp.dll16.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ole2disp.dll16/ole2disp.dll16.spec 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ole2disp.dll16/ole2disp.dll16.spec 2014-12-15 00:45:34.000000000 +0000 @@ -9,7 +9,7 @@ 9 stub VARIANTCLEAR 10 stub VARIANTCOPY 11 stub VARIANTCOPYIND -12 pascal VARIANTCHANGETYPE(ptr ptr long long) VariantChangeType16 +12 pascal VariantChangeType(ptr ptr word word) VariantChangeType16 13 stub VARIANTTIMETODOSDATETIME 14 stub DOSDATETIMETOVARIANTTIME 15 stub SAFEARRAYCREATE @@ -105,7 +105,7 @@ 105 stub VARBOOLFROMSTR 106 stub VARBOOLFROMDISP 107 stub DOINVOKEMETHOD -108 stub VARIANTCHANGETYPEEX +108 pascal VariantChangeTypeEx(ptr ptr long word word) VariantChangeTypeEx16 109 stub SAFEARRAYPTROFINDEX 110 pascal SetErrorInfo(long ptr) SetErrorInfo16 111 stub GETERRORINFO diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ole2.dll16/ole2.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ole2.dll16/ole2.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ole2.dll16/ole2.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ole2.dll16/ole2.c 2014-12-15 00:45:34.000000000 +0000 @@ -346,3 +346,12 @@ { FIXME("%p: unimplemented stub!\n", medium); } + +/*********************************************************************** + * WriteClassStg16 (OLE2.19) + */ +HRESULT WINAPI WriteClassStg16(IStorage *stg, REFCLSID clsid) +{ + FIXME("stub:%p %s\n", stg, debugstr_guid(clsid)); + return STG_E_MEDIUMFULL; +} diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ole2.dll16/ole2.dll16.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/ole2.dll16/ole2.dll16.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ole2.dll16/ole2.dll16.spec 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ole2.dll16/ole2.dll16.spec 2014-12-15 00:45:34.000000000 +0000 @@ -16,7 +16,7 @@ 16 stub OLEISRUNNING 17 stub OLELOCKRUNNING 18 pascal ReadClassStg(segptr ptr) ReadClassStg16 -19 stub WRITECLASSSTG +19 pascal WriteClassStg(segptr ptr) WriteClassStg16 20 stub READCLASSSTM 21 stub WRITECLASSSTM 22 stub BINDMONIKER diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ole32/clipboard.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ole32/clipboard.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ole32/clipboard.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ole32/clipboard.c 2014-12-15 00:45:34.000000000 +0000 @@ -194,8 +194,6 @@ */ static const WCHAR clipbrd_wndclass[] = {'C','L','I','P','B','R','D','W','N','D','C','L','A','S','S',0}; -static const WCHAR wine_marshal_dataobject[] = {'W','i','n','e',' ','m','a','r','s','h','a','l',' ','d','a','t','a','o','b','j','e','c','t',0}; - UINT ownerlink_clipboard_format = 0; UINT filename_clipboard_format = 0; UINT filenameW_clipboard_format = 0; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ole32/tests/moniker.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ole32/tests/moniker.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ole32/tests/moniker.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ole32/tests/moniker.c 2014-12-15 00:45:34.000000000 +0000 @@ -56,14 +56,6 @@ static const WCHAR wszFileName1[] = {'c',':','\\','w','i','n','d','o','w','s','\\','t','e','s','t','1','.','d','o','c',0}; static const WCHAR wszFileName2[] = {'c',':','\\','w','i','n','d','o','w','s','\\','t','e','s','t','2','.','d','o','c',0}; -static const CLSID CLSID_WineTest = -{ /* 9474ba1a-258b-490b-bc13-516e9239ace0 */ - 0x9474ba1a, - 0x258b, - 0x490b, - {0xbc, 0x13, 0x51, 0x6e, 0x92, 0x39, 0xac, 0xe0} -}; - static const CLSID CLSID_TestMoniker = { /* b306bfbc-496e-4f53-b93e-2ff9c83223d7 */ 0xb306bfbc, diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/oleacc/main.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/oleacc/main.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/oleacc/main.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/oleacc/main.c 2014-12-15 00:45:34.000000000 +0000 @@ -219,8 +219,10 @@ return E_FAIL; data = GlobalAlloc(GMEM_FIXED, size); - if(!data) + if(!data) { + UnmapViewOfFile(view); return E_OUTOFMEMORY; + } memcpy(data, view, size); UnmapViewOfFile(view); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/oleaut32/tests/vartest.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/oleaut32/tests/vartest.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/oleaut32/tests/vartest.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/oleaut32/tests/vartest.c 2014-12-15 00:45:34.000000000 +0000 @@ -331,12 +331,6 @@ S1(U1(*dec)).Lo32 = lo32; } -static inline int strcmpW( const WCHAR *str1, const WCHAR *str2 ) -{ - while (*str1 && (*str1 == *str2)) { str1++; str2++; } - return *str1 - *str2; -} - /* return the string text of a given variant type */ static char vtstr_buffer[16][256]; static int vtstr_current=0; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/oleaut32/typelib.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/oleaut32/typelib.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/oleaut32/typelib.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/oleaut32/typelib.c 2014-12-15 00:45:34.000000000 +0000 @@ -1726,18 +1726,6 @@ return NULL; } -static inline TLBFuncDesc *TLB_get_funcdesc_by_name(TLBFuncDesc *funcdescs, - UINT n, const OLECHAR *name) -{ - while(n){ - if(!lstrcmpiW(TLB_get_bstr(funcdescs->Name), name)) - return funcdescs; - ++funcdescs; - --n; - } - return NULL; -} - static inline TLBVarDesc *TLB_get_vardesc_by_memberid(TLBVarDesc *vardescs, UINT n, MEMBERID memid) { @@ -2063,10 +2051,6 @@ * * Functions for reading MSFT typelibs (those created by CreateTypeLib2) */ -static inline unsigned int MSFT_Tell(const TLBContext *pcx) -{ - return pcx->pos; -} static inline void MSFT_Seek(TLBContext *pcx, LONG where) { diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/oleaut32/variant.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/oleaut32/variant.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/oleaut32/variant.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/oleaut32/variant.c 2014-12-15 00:45:34.000000000 +0000 @@ -44,39 +44,6 @@ #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(variant); -static const char * const variant_types[] = -{ - "VT_EMPTY","VT_NULL","VT_I2","VT_I4","VT_R4","VT_R8","VT_CY","VT_DATE", - "VT_BSTR","VT_DISPATCH","VT_ERROR","VT_BOOL","VT_VARIANT","VT_UNKNOWN", - "VT_DECIMAL","15","VT_I1","VT_UI1","VT_UI2","VT_UI4","VT_I8","VT_UI8", - "VT_INT","VT_UINT","VT_VOID","VT_HRESULT","VT_PTR","VT_SAFEARRAY", - "VT_CARRAY","VT_USERDEFINED","VT_LPSTR","VT_LPWSTR","32","33","34","35", - "VT_RECORD","VT_INT_PTR","VT_UINT_PTR","39","40","41","42","43","44","45", - "46","47","48","49","50","51","52","53","54","55","56","57","58","59","60", - "61","62","63","VT_FILETIME","VT_BLOB","VT_STREAM","VT_STORAGE", - "VT_STREAMED_OBJECT","VT_STORED_OBJECT","VT_BLOB_OBJECT","VT_CF","VT_CLSID", - "VT_VERSIONED_STREAM" -}; - -static const char * const variant_flags[16] = -{ - "", - "|VT_VECTOR", - "|VT_ARRAY", - "|VT_VECTOR|VT_ARRAY", - "|VT_BYREF", - "|VT_VECTOR|VT_ARRAY", - "|VT_ARRAY|VT_BYREF", - "|VT_VECTOR|VT_ARRAY|VT_BYREF", - "|VT_RESERVED", - "|VT_VECTOR|VT_RESERVED", - "|VT_ARRAY|VT_RESERVED", - "|VT_VECTOR|VT_ARRAY|VT_RESERVED", - "|VT_BYREF|VT_RESERVED", - "|VT_VECTOR|VT_ARRAY|VT_RESERVED", - "|VT_ARRAY|VT_BYREF|VT_RESERVED", - "|VT_VECTOR|VT_ARRAY|VT_BYREF|VT_RESERVED", -}; /* Convert a variant from one type to another */ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags, diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/qmgr/tests/file.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/qmgr/tests/file.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/qmgr/tests/file.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/qmgr/tests/file.c 2014-12-15 00:45:34.000000000 +0000 @@ -28,12 +28,10 @@ #include "bits.h" /* Globals used by many tests */ -#define NUM_FILES 1 static const WCHAR test_remoteName[] = {'r','e','m','o','t','e', 0}; static const WCHAR test_localName[] = {'l','o','c','a','l', 0}; static WCHAR test_localFile[MAX_PATH]; static WCHAR test_remoteUrl[MAX_PATH]; -static const ULONG test_fileCount = NUM_FILES; static const WCHAR test_displayName[] = {'T','e','s','t', 0}; static IBackgroundCopyJob *test_job; static IBackgroundCopyManager *test_manager; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/quartz/acmwrapper.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/quartz/acmwrapper.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/quartz/acmwrapper.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/quartz/acmwrapper.c 2014-12-15 00:45:34.000000000 +0000 @@ -58,11 +58,6 @@ return CONTAINING_RECORD(iface, ACMWrapperImpl, tf.filter); } -static inline ACMWrapperImpl *impl_from_IBaseFilter( IBaseFilter *iface ) -{ - return CONTAINING_RECORD(iface, ACMWrapperImpl, tf.filter.IBaseFilter_iface); -} - static HRESULT WINAPI ACMWrapper_Receive(TransformFilter *tf, IMediaSample *pSample) { ACMWrapperImpl* This = impl_from_TransformFilter(tf); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/quartz/avidec.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/quartz/avidec.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/quartz/avidec.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/quartz/avidec.c 2014-12-15 00:45:34.000000000 +0000 @@ -52,11 +52,6 @@ static const IBaseFilterVtbl AVIDec_Vtbl; -static inline AVIDecImpl *impl_from_IBaseFilter( IBaseFilter *iface ) -{ - return CONTAINING_RECORD(iface, AVIDecImpl, tf.filter.IBaseFilter_iface); -} - static inline AVIDecImpl *impl_from_TransformFilter( TransformFilter *iface ) { return CONTAINING_RECORD(iface, AVIDecImpl, tf.filter); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/quartz/dsoundrender.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/quartz/dsoundrender.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/quartz/dsoundrender.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/quartz/dsoundrender.c 2014-12-15 00:45:34.000000000 +0000 @@ -46,7 +46,6 @@ static const IBaseFilterVtbl DSoundRender_Vtbl; static const IBasicAudioVtbl IBasicAudio_Vtbl; static const IReferenceClockVtbl IReferenceClock_Vtbl; -static const IMediaSeekingVtbl IMediaSeeking_Vtbl; static const IAMDirectSoundVtbl IAMDirectSound_Vtbl; static const IAMFilterMiscFlagsVtbl IAMFilterMiscFlags_Vtbl; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/quartz/mpegsplit.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/quartz/mpegsplit.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/quartz/mpegsplit.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/quartz/mpegsplit.c 2014-12-15 00:45:34.000000000 +0000 @@ -96,7 +96,6 @@ } static const WCHAR wszAudioStream[] = {'A','u','d','i','o',0}; -static const WCHAR wszVideoStream[] = {'V','i','d','e','o',0}; static const DWORD freqs[10] = { 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000, 0 }; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/riched20/tests/editor.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/riched20/tests/editor.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/riched20/tests/editor.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/riched20/tests/editor.c 2014-12-15 00:45:34.000000000 +0000 @@ -7379,7 +7379,7 @@ char buf[2]; buf[0] = delimiter_tests[i].c; buf[1] = 0; - SendMessageW(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)buf); + SendMessageA(hwndRichEdit, WM_SETTEXT, 0, (LPARAM)buf); result = SendMessageA(hwndRichEdit, EM_FINDWORDBREAK, WB_ISDELIMITER, 0); if (buf[0] == 0x20) todo_wine diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/secur32/schannel_gnutls.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/secur32/schannel_gnutls.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/secur32/schannel_gnutls.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/secur32/schannel_gnutls.c 2014-12-15 00:45:34.000000000 +0000 @@ -36,10 +36,10 @@ #include "wine/debug.h" #include "wine/library.h" -WINE_DEFAULT_DEBUG_CHANNEL(secur32); - #if defined(SONAME_LIBGNUTLS) && !defined(HAVE_SECURITY_SECURITY_H) +WINE_DEFAULT_DEBUG_CHANNEL(secur32); + static void *libgnutls_handle; #define MAKE_FUNCPTR(f) static typeof(f) * p##f MAKE_FUNCPTR(gnutls_alert_get); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/secur32/schannel_macosx.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/secur32/schannel_macosx.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/secur32/schannel_macosx.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/secur32/schannel_macosx.c 2014-12-15 00:45:34.000000000 +0000 @@ -41,10 +41,10 @@ #include "wine/debug.h" #include "wine/library.h" -WINE_DEFAULT_DEBUG_CHANNEL(secur32); - #ifdef HAVE_SECURITY_SECURITY_H +WINE_DEFAULT_DEBUG_CHANNEL(secur32); + #if MAC_OS_X_VERSION_MAX_ALLOWED < 1060 /* Defined in in the 10.6 SDK or later. */ enum { diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/shell32/assoc.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/shell32/assoc.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/shell32/assoc.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/shell32/assoc.c 2014-12-15 00:45:34.000000000 +0000 @@ -77,6 +77,17 @@ return CONTAINING_RECORD(iface, IQueryAssociationsImpl, IQueryAssociations_iface); } +struct enumassochandlers +{ + IEnumAssocHandlers IEnumAssocHandlers_iface; + LONG ref; +}; + +static inline struct enumassochandlers *impl_from_IEnumAssocHandlers(IEnumAssocHandlers *iface) +{ + return CONTAINING_RECORD(iface, struct enumassochandlers, IEnumAssocHandlers_iface); +} + /************************************************************************** * IQueryAssociations_QueryInterface * @@ -965,3 +976,82 @@ TRACE("returning 0x%x with %p\n", hr, *ppv); return hr; } + +static HRESULT WINAPI enumassochandlers_QueryInterface(IEnumAssocHandlers *iface, REFIID riid, void **obj) +{ + struct enumassochandlers *This = impl_from_IEnumAssocHandlers(iface); + + TRACE("(%p %s %p)\n", This, debugstr_guid(riid), obj); + + if (IsEqualIID(riid, &IID_IEnumAssocHandlers) || + IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + IEnumAssocHandlers_AddRef(iface); + return S_OK; + } + + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI enumassochandlers_AddRef(IEnumAssocHandlers *iface) +{ + struct enumassochandlers *This = impl_from_IEnumAssocHandlers(iface); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(%u)\n", This, ref); + return ref; +} + +static ULONG WINAPI enumassochandlers_Release(IEnumAssocHandlers *iface) +{ + struct enumassochandlers *This = impl_from_IEnumAssocHandlers(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(%u)\n", This, ref); + + if (!ref) + SHFree(This); + + return ref; +} + +static HRESULT WINAPI enumassochandlers_Next(IEnumAssocHandlers *iface, ULONG count, IAssocHandler **handlers, + ULONG *fetched) +{ + struct enumassochandlers *This = impl_from_IEnumAssocHandlers(iface); + + FIXME("(%p)->(%u %p %p): stub\n", This, count, handlers, fetched); + + return E_NOTIMPL; +} + +static const IEnumAssocHandlersVtbl enumassochandlersvtbl = { + enumassochandlers_QueryInterface, + enumassochandlers_AddRef, + enumassochandlers_Release, + enumassochandlers_Next +}; + +/************************************************************************** + * SHAssocEnumHandlers [SHELL32.@] + */ +HRESULT WINAPI SHAssocEnumHandlers(const WCHAR *extra, ASSOC_FILTER filter, IEnumAssocHandlers **enumhandlers) +{ + struct enumassochandlers *enumassoc; + + FIXME("(%s %d %p\n): stub", debugstr_w(extra), filter, enumhandlers); + + *enumhandlers = NULL; + + enumassoc = SHAlloc(sizeof(*enumassoc)); + if (!enumassoc) + return E_OUTOFMEMORY; + + enumassoc->IEnumAssocHandlers_iface.lpVtbl = &enumassochandlersvtbl; + enumassoc->ref = 1; + + *enumhandlers = &enumassoc->IEnumAssocHandlers_iface; + return S_OK; +} diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/shell32/shell32.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/shell32/shell32.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/shell32/shell32.spec 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/shell32/shell32.spec 2014-12-15 00:45:34.000000000 +0000 @@ -328,6 +328,7 @@ @ stdcall SetCurrentProcessExplicitAppUserModelID(wstr) @ stdcall SHAddToRecentDocs (long ptr) @ stdcall SHAppBarMessage(long ptr) +@ stdcall SHAssocEnumHandlers(wstr long ptr) @ stdcall SHBindToParent(ptr ptr ptr ptr) @ stdcall SHBrowseForFolder(ptr) SHBrowseForFolderA @ stdcall SHBrowseForFolderA(ptr) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/shell32/shellpath.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/shell32/shellpath.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/shell32/shellpath.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/shell32/shellpath.c 2014-12-15 00:45:34.000000000 +0000 @@ -810,7 +810,6 @@ static const WCHAR Music_PlaylistsW[] = {'M','u','s','i','c','\\','P','l','a','y','l','i','s','t','s','\0'}; static const WCHAR Music_Sample_MusicW[] = {'M','u','s','i','c','\\','S','a','m','p','l','e',' ','M','u','s','i','c','\0'}; static const WCHAR Music_Sample_PlaylistsW[] = {'M','u','s','i','c','\\','S','a','m','p','l','e',' ','P','l','a','y','l','i','s','t','s','\0'}; -static const WCHAR My_DocumentsW[] = {'M','y',' ','D','o','c','u','m','e','n','t','s','\0'}; static const WCHAR My_MusicW[] = {'M','y',' ','M','u','s','i','c','\0'}; static const WCHAR My_PicturesW[] = {'M','y',' ','P','i','c','t','u','r','e','s','\0'}; static const WCHAR My_VideosW[] = {'M','y',' ','V','i','d','e','o','s','\0'}; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/shell32/tests/assoc.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/shell32/tests/assoc.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/shell32/tests/assoc.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/shell32/tests/assoc.c 2014-12-15 00:45:34.000000000 +0000 @@ -103,7 +103,6 @@ }; static const WCHAR httpW[] = {'h','t','t','p',0}; -static const WCHAR httpsW[] = {'h','t','t','p','s',0}; static const WCHAR badW[] = {'b','a','d','b','a','d',0}; static struct assoc_getstring_test getstring_tests[] = diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/shell32/tests/shelllink.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/shell32/tests/shelllink.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/shell32/tests/shelllink.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/shell32/tests/shelllink.c 2014-12-15 00:45:34.000000000 +0000 @@ -49,8 +49,6 @@ { 0xb9, 0x2f, 0x00, 0xa0, 0xc9, 0x03, 0x12, 0xe1 } }; -static const WCHAR notafile[]= { 'C',':','\\','n','o','n','e','x','i','s','t','e','n','t','\\','f','i','l','e',0 }; - /* For some reason SHILCreateFromPath does not work on Win98 and * SHSimpleIDListFromPathA does not work on NT4. But if we call both we diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/shell32/tests/shlview.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/shell32/tests/shlview.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/shell32/tests/shlview.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/shell32/tests/shlview.c 2014-12-15 00:45:34.000000000 +0000 @@ -485,11 +485,6 @@ { 0 } }; -static const struct message folderview_itemcount_seq[] = { - { LVM_GETITEMCOUNT, sent }, - { 0 } -}; - static void test_IShellView_CreateViewWindow(void) { IShellFolder *desktop; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/sxs/tests/name.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/sxs/tests/name.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/sxs/tests/name.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/sxs/tests/name.c 2014-12-15 00:45:34.000000000 +0000 @@ -29,28 +29,22 @@ static const WCHAR wine1W[] = {'w','i','n','e',0}; static const WCHAR wine2W[] = - {'w','i','n','e',',','v','e','r','s','i','o','n','=','\"','0','1','.','2','.','3','.','4','\"',',', - 't','y','p','e','=','\"','w','i','n','3','2','\"',',', - 'p','r','o','c','e','s','s','o','r','A','r','c','h','i','t','e','c','t','u','r','e','=', - '\"','x','8','6','\"',',','p','u','b','l','i','c','K','e','y','T','o','k','e','n','=', - '\"','1','2','3','4','5','6','7','8','9','0','A','B','C','D','E','F','\"',0}; -static const WCHAR wine3W[] = {'w','i','n','e',',','v','e','r','s','i','o','n','=','\"','1','.','2','.','3','.','4','\"',0}; -static const WCHAR wine4W[] = +static const WCHAR wine3W[] = {'w','i','n','e',',','v','e','r','s','i','o','n','=','1','.','2','.','3','.','4',0}; -static const WCHAR wine5W[] = +static const WCHAR wine4W[] = {'w','i','n','e',',',' ','v','e','r','s','i','o','n','=','\"','1','.','2','.','3','.','4','\"',0}; -static const WCHAR wine6W[] = +static const WCHAR wine5W[] = {'w','i','n','e',',','v','e','r','s','i','o','n',' ','=','\"','1','.','2','.','3','.','4','\"',0}; -static const WCHAR wine7W[] = +static const WCHAR wine6W[] = {'w','i','n','e',',','v','e','r','s','i','o','n','=',' ','\"','1','.','2','.','3','.','4','\"',0}; -static const WCHAR wine8W[] = +static const WCHAR wine7W[] = {'w','i','n','e',' ',',','v','e','r','s','i','o','n','=','\"','1','.','2','.','3','.','4','\"',0}; -static const WCHAR wine9W[] = +static const WCHAR wine8W[] = {'w','i','n','e',',','v','e','r','s','i','o','n',0}; -static const WCHAR wine10W[] = +static const WCHAR wine9W[] = {'w','i','n','e',',','t','y','p','e','=','\"','\"',0}; -static const WCHAR wine11W[] = +static const WCHAR wine10W[] = {'w','i','n','e',',','t','y','p','e','=','\"','w','i','n','3','2',0}; static void test_CreateAssemblyNameObject( void ) @@ -172,52 +166,52 @@ ok( !name, "expected NULL got %p\n", name ); name = NULL; - hr = CreateAssemblyNameObject( &name, wine3W, CANOF_PARSE_DISPLAY_NAME, NULL ); + hr = CreateAssemblyNameObject( &name, wine2W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == S_OK, "expected S_OK got %08x\n", hr ); ok( name != NULL, "expected non-NULL name\n" ); IAssemblyName_Release( name ); name = (IAssemblyName *)0xdeadbeef; - hr = CreateAssemblyNameObject( &name, wine4W, CANOF_PARSE_DISPLAY_NAME, NULL ); + hr = CreateAssemblyNameObject( &name, wine3W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; - hr = CreateAssemblyNameObject( &name, wine5W, CANOF_PARSE_DISPLAY_NAME, NULL ); + hr = CreateAssemblyNameObject( &name, wine4W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == HRESULT_FROM_WIN32( ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME ), "expected ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; - hr = CreateAssemblyNameObject( &name, wine6W, CANOF_PARSE_DISPLAY_NAME, NULL ); + hr = CreateAssemblyNameObject( &name, wine5W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == HRESULT_FROM_WIN32( ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME ), "expected ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = (IAssemblyName *)0xdeadbeef; - hr = CreateAssemblyNameObject( &name, wine7W, CANOF_PARSE_DISPLAY_NAME, NULL ); + hr = CreateAssemblyNameObject( &name, wine6W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = NULL; - hr = CreateAssemblyNameObject( &name, wine8W, CANOF_PARSE_DISPLAY_NAME, NULL ); + hr = CreateAssemblyNameObject( &name, wine7W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == S_OK, "expected S_OK got %08x\n", hr ); ok( name != NULL, "expected non-NULL name\n" ); IAssemblyName_Release( name ); name = (IAssemblyName *)0xdeadbeef; - hr = CreateAssemblyNameObject( &name, wine9W, CANOF_PARSE_DISPLAY_NAME, NULL ); + hr = CreateAssemblyNameObject( &name, wine8W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); name = NULL; - hr = CreateAssemblyNameObject( &name, wine10W, CANOF_PARSE_DISPLAY_NAME, NULL ); + hr = CreateAssemblyNameObject( &name, wine9W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == S_OK, "expected S_OK got %08x\n", hr ); ok( name != NULL, "expected non-NULL name\n" ); IAssemblyName_Release( name ); name = (IAssemblyName *)0xdeadbeef; - hr = CreateAssemblyNameObject( &name, wine11W, CANOF_PARSE_DISPLAY_NAME, NULL ); + hr = CreateAssemblyNameObject( &name, wine10W, CANOF_PARSE_DISPLAY_NAME, NULL ); ok( hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr ); ok( !name, "expected NULL got %p\n", name ); } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/taskschd/tests/scheduler.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/taskschd/tests/scheduler.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/taskschd/tests/scheduler.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/taskschd/tests/scheduler.c 2014-12-15 00:45:34.000000000 +0000 @@ -421,6 +421,7 @@ IUnknown *unknown; IEnumVARIANT *enumvar; ULONG count, i; + BOOL is_first; VARIANT idx; static const int vt[] = { VT_I1, VT_I2, VT_I4, VT_I8, VT_UI1, VT_UI2, VT_UI4, VT_UI8, VT_INT, VT_UINT }; @@ -507,7 +508,8 @@ hr = ITaskFolder_get_Path(subfolder, &bstr); ok(hr == S_OK, "get_Path error %#x\n", hr); - if (i == 1) + is_first = !lstrcmpW(bstr, Wine_Folder1); + if (is_first) ok(!lstrcmpW(bstr, Wine_Folder1), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr)); else ok(!lstrcmpW(bstr, Wine_Folder2), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr)); @@ -515,7 +517,7 @@ hr = ITaskFolder_get_Name(subfolder, &bstr); ok(hr == S_OK, "get_Name error %#x\n", hr); - if (i == 1) + if (is_first) ok(!lstrcmpW(bstr, Folder1), "expected Folder1, got %s\n", wine_dbgstr_w(bstr)); else ok(!lstrcmpW(bstr, Folder2), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); @@ -530,7 +532,7 @@ hr = ITaskFolder_get_Path(subfolder, &bstr); ok(hr == S_OK, "get_Path error %#x\n", hr); - if (i == 1) + if (is_first) ok(!lstrcmpW(bstr, Wine_Folder1), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr)); else ok(!lstrcmpW(bstr, Wine_Folder2), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr)); @@ -538,7 +540,7 @@ hr = ITaskFolder_get_Name(subfolder, &bstr); ok(hr == S_OK, "get_Name error %#x\n", hr); - if (i == 1) + if (is_first) ok(!lstrcmpW(bstr, Folder1), "expected Folder1, got %s\n", wine_dbgstr_w(bstr)); else ok(!lstrcmpW(bstr, Folder2), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); @@ -591,11 +593,18 @@ ok(count == 1, "expected 1, got %d\n", count); hr = ITaskFolder_get_Path((ITaskFolder *)V_DISPATCH(&var[0]), &bstr); ok(hr == S_OK, "get_Path error %#x\n", hr); - ok(!lstrcmpW(bstr, Wine_Folder2), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr)); + is_first = !lstrcmpW(bstr, Wine_Folder1); + if (is_first) + ok(!lstrcmpW(bstr, Wine_Folder1), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr)); + else + ok(!lstrcmpW(bstr, Wine_Folder2), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr); hr = ITaskFolder_get_Name((ITaskFolder *)V_DISPATCH(&var[0]), &bstr); ok(hr == S_OK, "get_Name error %#x\n", hr); - ok(!lstrcmpW(bstr, Folder2), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); + if (is_first) + ok(!lstrcmpW(bstr, Folder1), "expected Folder1, got %s\n", wine_dbgstr_w(bstr)); + else + ok(!lstrcmpW(bstr, Folder2), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); IDispatch_Release(V_DISPATCH(&var[0])); memset(var, 0, sizeof(var)); @@ -628,7 +637,8 @@ hr = ITaskFolder_get_Path(subfolder, &bstr); ok(hr == S_OK, "get_Path error %#x\n", hr); - if (i == 0) + is_first = !lstrcmpW(bstr, Wine_Folder1); + if (is_first) ok(!lstrcmpW(bstr, Wine_Folder1), "expected \\Wine\\Folder1, got %s\n", wine_dbgstr_w(bstr)); else ok(!lstrcmpW(bstr, Wine_Folder2), "expected \\Wine\\Folder2, got %s\n", wine_dbgstr_w(bstr)); @@ -636,7 +646,7 @@ hr = ITaskFolder_get_Name(subfolder, &bstr); ok(hr == S_OK, "get_Name error %#x\n", hr); - if (i == 0) + if (is_first) ok(!lstrcmpW(bstr, Folder1), "expected Folder1, got %s\n", wine_dbgstr_w(bstr)); else ok(!lstrcmpW(bstr, Folder2), "expected Folder2, got %s\n", wine_dbgstr_w(bstr)); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/urlmon/tests/misc.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/urlmon/tests/misc.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/urlmon/tests/misc.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/urlmon/tests/misc.c 2014-12-15 00:45:34.000000000 +0000 @@ -300,9 +300,7 @@ static const WCHAR url9[] = {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g', '/','s','i','t','e','/','a','b','o','u','t',0}; -static const WCHAR url10[] = {'f','i','l','e',':','/','/','s','o','m','e','%','2','0','f','i','l','e', - '.','j','p','g',0}; -static const WCHAR url11[] = {'h','t','t','p',':','/','/','g','o','o','g','l','e','.','*','.', +static const WCHAR url10[] = {'h','t','t','p',':','/','/','g','o','o','g','l','e','.','*','.', 'c','o','m',0}; static const WCHAR url4e[] = {'f','i','l','e',':','s','o','m','e',' ','f','i','l','e', '.','j','p','g',0}; @@ -343,7 +341,7 @@ {url4, E_FAIL, url4e, S_OK, path4, wszFile, wszEmpty, S_OK, NULL, E_FAIL}, {url5, E_FAIL, url5, E_INVALIDARG, NULL, wszHttp, wszWineHQ, S_OK, wszHttpWineHQ, S_OK}, {url6, S_OK, url6, E_INVALIDARG, NULL, wszAbout, NULL, E_FAIL, NULL, E_FAIL}, - {url11, E_FAIL, url11, E_INVALIDARG, NULL, wszHttp, wszGoogle, S_OK, wszHttpGoogle, S_OK} + {url10, E_FAIL, url10, E_INVALIDARG,NULL, wszHttp, wszGoogle, S_OK, wszHttpGoogle, S_OK} }; static void test_CoInternetParseUrl(void) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/urlmon/tests/sec_mgr.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/urlmon/tests/sec_mgr.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/urlmon/tests/sec_mgr.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/urlmon/tests/sec_mgr.c 2014-12-15 00:45:34.000000000 +0000 @@ -112,9 +112,6 @@ static const WCHAR url17[] = {'f','i','l','e',':','/','/','/','c',':','c','\\',0}; static const WCHAR url18[] = {'c',':','\\','t','e','s','t','.','h','t','m',0}; -static const WCHAR url4e[] = {'f','i','l','e',':','s','o','m','e',' ','f','i','l','e', - '.','j','p','g',0}; - static const WCHAR winetestW[] = {'w','i','n','e','t','e','s','t',0}; static const WCHAR security_urlW[] = {'w','i','n','e','t','e','s','t',':','t','e','s','t','i','n','g',0}; static const WCHAR security_url2W[] = {'w','i','n','e','t','e','s','t',':','t','e','s','t','i','n','g','2',0}; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/urlmon/tests/stream.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/urlmon/tests/stream.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/urlmon/tests/stream.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/urlmon/tests/stream.c 2014-12-15 00:45:34.000000000 +0000 @@ -77,7 +77,6 @@ DEFINE_EXPECT(GetBindInfo); static const CHAR wszIndexHtmlA[] = "index.html"; -static const WCHAR wszIndexHtml[] = {'i','n','d','e','x','.','h','t','m','l',0}; static WCHAR INDEX_HTML[MAX_PATH]; static const char szHtmlDoc[] = ""; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/urlmon/tests/url.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/urlmon/tests/url.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/urlmon/tests/url.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/urlmon/tests/url.c 2014-12-15 00:45:34.000000000 +0000 @@ -162,7 +162,6 @@ static const WCHAR wszWineHQIP[] = {'2','0','9','.','3','2','.','1','4','1','.','3',0}; static const CHAR wszIndexHtmlA[] = "index.html"; -static const WCHAR wszIndexHtml[] = {'i','n','d','e','x','.','h','t','m','l',0}; static const WCHAR cache_fileW[] = {'c',':','\\','c','a','c','h','e','.','h','t','m',0}; static const CHAR dwl_htmlA[] = "dwl.html"; static const WCHAR dwl_htmlW[] = {'d','w','l','.','h','t','m','l',0}; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/user32/tests/input.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/user32/tests/input.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/user32/tests/input.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/user32/tests/input.c 2014-12-15 00:45:34.000000000 +0000 @@ -1863,8 +1863,8 @@ ok(!got_button_down, "unexpected WM_RBUTTONDOWN message\n"); ok(!got_button_up, "unexpected WM_RBUTTONUP message\n"); - /* click on HTTRANSPARENT top-level window that belongs to ther thread, - * threads input queues are attached */ + /* click on HTTRANSPARENT top-level window that belongs to other thread, + * thread input queues are attached */ thread = CreateThread(NULL, 0, create_static_win, &thread_data, 0, &thread_id); ok(thread != NULL, "CreateThread failed\n"); hittest_no = 0; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/user32/tests/msg.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/user32/tests/msg.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/user32/tests/msg.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/user32/tests/msg.c 2014-12-15 00:45:34.000000000 +0000 @@ -1172,51 +1172,6 @@ { WM_NCDESTROY, sent }, { 0 } }; -/* Moving the mouse in nonclient area */ -static const struct message WmMouseMoveInNonClientAreaSeq[] = { /* FIXME: add */ - { WM_NCHITTEST, sent }, - { WM_SETCURSOR, sent }, - { WM_NCMOUSEMOVE, posted }, - { 0 } -}; -/* Moving the mouse in client area */ -static const struct message WmMouseMoveInClientAreaSeq[] = { /* FIXME: add */ - { WM_NCHITTEST, sent }, - { WM_SETCURSOR, sent }, - { WM_MOUSEMOVE, posted }, - { 0 } -}; -/* Moving by dragging the title bar (after WM_NCHITTEST and WM_SETCURSOR) (outline move) */ -static const struct message WmDragTitleBarSeq[] = { /* FIXME: add */ - { WM_NCLBUTTONDOWN, sent|wparam, HTCAPTION }, - { WM_SYSCOMMAND, sent|defwinproc|wparam, SC_MOVE+2 }, - { WM_GETMINMAXINFO, sent|defwinproc }, - { WM_ENTERSIZEMOVE, sent|defwinproc }, - { WM_WINDOWPOSCHANGING, sent|wparam|defwinproc, 0 }, - { WM_WINDOWPOSCHANGED, sent|wparam|defwinproc, 0 }, - { WM_MOVE, sent|defwinproc }, - { WM_EXITSIZEMOVE, sent|defwinproc }, - { 0 } -}; -/* Sizing by dragging the thick borders (after WM_NCHITTEST and WM_SETCURSOR) (outline move) */ -static const struct message WmDragThickBordersBarSeq[] = { /* FIXME: add */ - { WM_NCLBUTTONDOWN, sent|wparam, 0xd }, - { WM_SYSCOMMAND, sent|defwinproc|wparam, 0xf004 }, - { WM_GETMINMAXINFO, sent|defwinproc }, - { WM_ENTERSIZEMOVE, sent|defwinproc }, - { WM_SIZING, sent|defwinproc|wparam, 4}, /* one for each mouse movement */ - { WM_WINDOWPOSCHANGING, sent|wparam|defwinproc, 0 }, - { WM_GETMINMAXINFO, sent|defwinproc }, - { WM_NCCALCSIZE, sent|defwinproc|wparam, 1 }, - { WM_NCPAINT, sent|defwinproc|wparam, 1 }, - { WM_GETTEXT, sent|defwinproc }, - { WM_ERASEBKGND, sent|defwinproc }, - { WM_WINDOWPOSCHANGED, sent|wparam|defwinproc, 0 }, - { WM_MOVE, sent|defwinproc }, - { WM_SIZE, sent|defwinproc|wparam, SIZE_RESTORED }, - { WM_EXITSIZEMOVE, sent|defwinproc }, - { 0 } -}; /* Resizing child window with MoveWindow (32) */ static const struct message WmResizingChildWithMoveWindowSeq[] = { { WM_WINDOWPOSCHANGING, sent|wparam, SWP_NOACTIVATE }, @@ -1229,41 +1184,6 @@ { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 }, { 0 } }; -/* Clicking on inactive button */ -static const struct message WmClickInactiveButtonSeq[] = { /* FIXME: add */ - { WM_NCHITTEST, sent }, - { WM_PARENTNOTIFY, sent|parent|wparam, WM_LBUTTONDOWN }, - { WM_MOUSEACTIVATE, sent }, - { WM_MOUSEACTIVATE, sent|parent|defwinproc }, - { WM_SETCURSOR, sent }, - { WM_SETCURSOR, sent|parent|defwinproc }, - { WM_LBUTTONDOWN, posted }, - { WM_KILLFOCUS, posted|parent }, - { WM_SETFOCUS, posted }, - { WM_CTLCOLORBTN, posted|parent }, - { BM_SETSTATE, posted }, - { WM_CTLCOLORBTN, posted|parent }, - { WM_LBUTTONUP, posted }, - { BM_SETSTATE, posted }, - { WM_CTLCOLORBTN, posted|parent }, - { WM_COMMAND, posted|parent }, - { 0 } -}; -/* Reparenting a button (16/32) */ -/* The last child (button) reparented gets topmost for its new parent. */ -static const struct message WmReparentButtonSeq[] = { /* FIXME: add */ - { WM_SHOWWINDOW, sent|wparam, 0 }, - { WM_WINDOWPOSCHANGING, sent|wparam, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE }, - { EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 }, - { WM_ERASEBKGND, sent|parent }, - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE }, - { WM_WINDOWPOSCHANGING, sent|wparam, SWP_NOSIZE }, - { WM_CHILDACTIVATE, sent }, - { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOSIZE|SWP_NOREDRAW }, - { WM_MOVE, sent|defwinproc }, - { WM_SHOWWINDOW, sent|wparam, 1 }, - { 0 } -}; /* Creation of a custom dialog (32) */ static const struct message WmCreateCustomDialogSeq[] = { { HCBT_CREATEWND, hook }, @@ -1464,35 +1384,6 @@ { WM_NCDESTROY, sent }, { 0 } }; -/* Creation of a modal dialog that is resized inside WM_INITDIALOG (32) */ -static const struct message WmCreateModalDialogResizeSeq[] = { /* FIXME: add */ - /* (inside dialog proc, handling WM_INITDIALOG) */ - { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, - { WM_NCCALCSIZE, sent }, - { WM_NCACTIVATE, sent|parent|wparam, 0 }, - { WM_GETTEXT, sent|defwinproc }, - { WM_ACTIVATE, sent|parent|wparam, 0 }, - { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, - { WM_WINDOWPOSCHANGING, sent|parent }, - { WM_NCACTIVATE, sent|wparam, 1 }, - { WM_ACTIVATE, sent|wparam, 1 }, - { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, - { WM_SIZE, sent|defwinproc|wparam, SIZE_RESTORED }, - /* (setting focus) */ - { WM_SHOWWINDOW, sent|wparam, 1 }, - { WM_WINDOWPOSCHANGING, sent|wparam, 0 }, - { WM_NCPAINT, sent }, - { WM_GETTEXT, sent|defwinproc }, - { WM_ERASEBKGND, sent }, - { WM_CTLCOLORDLG, sent|defwinproc }, - { WM_WINDOWPOSCHANGED, sent|wparam, 0 }, - { WM_PAINT, sent }, - /* (bunch of WM_CTLCOLOR* for each control) */ - { WM_PAINT, sent|parent }, - { WM_ENTERIDLE, sent|parent|wparam, 0 }, - { WM_SETCURSOR, sent|parent }, - { 0 } -}; /* SetMenu for NonVisible windows with size change*/ static const struct message WmSetMenuNonVisibleSizeChangeSeq[] = { { WM_WINDOWPOSCHANGING, sent|wparam, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, @@ -14107,9 +13998,6 @@ { HCBT_SETFOCUS, hook }, /* child */ { 0 } }; -static const struct message WmSetFocus_4[] = { - { 0 } -}; static void test_SetFocus(void) { diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/usp10/bidi.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/usp10/bidi.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/usp10/bidi.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/usp10/bidi.c 2014-12-15 00:45:34.000000000 +0000 @@ -505,12 +505,6 @@ return index; } -static inline int iso_previousChar(IsolatedRun *iso_run, int index) -{ - if (index <= 0) return -1; - return index --; -} - static inline void iso_dump_types(const char* header, IsolatedRun *iso_run) { int i, len = 0; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/usp10/usp10.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/usp10/usp10.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/usp10/usp10.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/usp10/usp10.c 2014-12-15 00:45:34.000000000 +0000 @@ -500,23 +500,23 @@ {{Script_Tai_Le, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0, 0, 1, 0, 1, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('t','a','l','e'), - {'M','i','c','r','o','s','o','f','t',' ','T','a','i',' ','L','e'}}, + {'M','i','c','r','o','s','o','f','t',' ','T','a','i',' ','L','e',0}}, {{Script_New_Tai_Lue, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0, 0, 1, 0, 1, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('t','a','l','u'), - {'M','i','c','r','o','s','o','f','t',' ','N','e','w',' ','T','a','i',' ','L','u','e'}}, + {'M','i','c','r','o','s','o','f','t',' ','N','e','w',' ','T','a','i',' ','L','u','e',0}}, {{Script_New_Tai_Lue_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0, 0, 1, 0, 1, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('t','a','l','u'), - {'M','i','c','r','o','s','o','f','t',' ','N','e','w',' ','T','a','i',' ','L','u','e'}}, + {'M','i','c','r','o','s','o','f','t',' ','N','e','w',' ','T','a','i',' ','L','u','e',0}}, {{Script_Khmer, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0x53, 0, 1, 1, 1, DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 0, 0}, MS_MAKE_TAG('k','h','m','r'), - {'D','a','u','n','P','e','n','h'}}, + {'D','a','u','n','P','e','n','h',0}}, {{Script_Khmer_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0x53, 1, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('k','h','m','r'), - {'D','a','u','n','P','e','n','h'}}, + {'D','a','u','n','P','e','n','h',0}}, {{Script_CJK_Han, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_ENGLISH, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}, MS_MAKE_TAG('h','a','n','i'), @@ -540,59 +540,59 @@ {{Script_Yi, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_ENGLISH, 0, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}, MS_MAKE_TAG('y','i',' ',' '), - {'M','i','c','r','o','s','o','f','t',' ','Y','i',' ','B','a','i','t','i'}}, + {'M','i','c','r','o','s','o','f','t',' ','Y','i',' ','B','a','i','t','i',0}}, {{Script_Ethiopic, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0x5e, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('e','t','h','i'), - {'N','y','a','l','a'}}, + {'N','y','a','l','a',0}}, {{Script_Ethiopic_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0x5e, 1, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('e','t','h','i'), - {'N','y','a','l','a'}}, + {'N','y','a','l','a',0}}, {{Script_Mongolian, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_MONGOLIAN, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('m','o','n','g'), - {'M','o','n','g','o','l','i','a','n',' ','B','a','i','t','i'}}, + {'M','o','n','g','o','l','i','a','n',' ','B','a','i','t','i',0}}, {{Script_Mongolian_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_MONGOLIAN, 1, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('m','o','n','g'), - {'M','o','n','g','o','l','i','a','n',' ','B','a','i','t','i'}}, + {'M','o','n','g','o','l','i','a','n',' ','B','a','i','t','i',0}}, {{Script_Tifinagh, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('t','f','n','g'), - {'E','b','r','i','m','a'}}, + {'E','b','r','i','m','a',0}}, {{Script_NKo, 1, 1, 0, 0, 0, 0, { 1,0,0,0,0,0,0,0,0,0,0}}, {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('n','k','o',' '), - {'E','b','r','i','m','a'}}, + {'E','b','r','i','m','a',0}}, {{Script_Vai, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('v','a','i',' '), - {'E','b','r','i','m','a'}}, + {'E','b','r','i','m','a',0}}, {{Script_Vai_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0, 1, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('v','a','i',' '), - {'E','b','r','i','m','a'}}, + {'E','b','r','i','m','a',0}}, {{Script_Cherokee, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0x5c, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('c','h','e','r'), - {'P','l','a','n','t','a','g','e','n','e','t',' ','C','h','e','r','o','k','e','e'}}, + {'P','l','a','n','t','a','g','e','n','e','t',' ','C','h','e','r','o','k','e','e',0}}, {{Script_Canadian, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0x5d, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('c','a','n','s'), - {'E','u','p','h','e','m','i','a'}}, + {'E','u','p','h','e','m','i','a',0}}, {{Script_Ogham, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('o','g','a','m'), - {'S','e','g','o','e',' ','U','I',' ','S','y','m','b','o','l'}}, + {'S','e','g','o','e',' ','U','I',' ','S','y','m','b','o','l',0}}, {{Script_Runic, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('r','u','n','r'), - {'S','e','g','o','e',' ','U','I',' ','S','y','m','b','o','l'}}, + {'S','e','g','o','e',' ','U','I',' ','S','y','m','b','o','l',0}}, {{Script_Braille, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_ENGLISH, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('b','r','a','i'), - {'S','e','g','o','e',' ','U','I',' ','S','y','m','b','o','l'}}, + {'S','e','g','o','e',' ','U','I',' ','S','y','m','b','o','l',0}}, {{Script_Surrogates, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_ENGLISH, 0, 1, 0, 1, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}, 0x00000000, @@ -604,19 +604,19 @@ {{Script_Deseret, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('d','s','r','t'), - {'S','e','g','o','e',' ','U','I',' ','S','y','m','b','o','l'}}, + {'S','e','g','o','e',' ','U','I',' ','S','y','m','b','o','l',0}}, {{Script_Osmanya, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('o','s','m','a'), - {'E','b','r','i','m','a'}}, + {'E','b','r','i','m','a',0}}, {{Script_Osmanya_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0, 1, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('o','s','m','a'), - {'E','b','r','i','m','a'}}, + {'E','b','r','i','m','a',0}}, {{Script_MathAlpha, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('m','a','t','h'), - {'C','a','m','b','r','i','a',' ','M','a','t','h'}}, + {'C','a','m','b','r','i','a',' ','M','a','t','h',0}}, {{Script_Hebrew_Currency, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_HEBREW, 0, 1, 0, 0, HEBREW_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('h','e','b','r'), diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wbemprox/builtin.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wbemprox/builtin.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wbemprox/builtin.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wbemprox/builtin.c 2014-12-15 00:45:34.000000000 +0000 @@ -271,6 +271,8 @@ {'T','h','r','e','a','d','C','o','u','n','t',0}; static const WCHAR prop_totalphysicalmemoryW[] = {'T','o','t','a','l','P','h','y','s','i','c','a','l','M','e','m','o','r','y',0}; +static const WCHAR prop_totalvisiblememorysizeW[] = + {'T','o','t','a','l','V','i','s','i','b','l','e','M','e','m','o','r','y','S','i','z','e',0}; static const WCHAR prop_typeW[] = {'T','y','p','e',0}; static const WCHAR prop_uniqueidW[] = @@ -387,26 +389,27 @@ }; static const struct column col_os[] = { - { prop_buildnumberW, CIM_STRING }, - { prop_captionW, CIM_STRING }, - { prop_codesetW, CIM_STRING|COL_FLAG_DYNAMIC }, - { prop_countrycodeW, CIM_STRING|COL_FLAG_DYNAMIC }, - { prop_csdversionW, CIM_STRING }, - { prop_installdateW, CIM_DATETIME }, - { prop_lastbootuptimeW, CIM_DATETIME|COL_FLAG_DYNAMIC }, - { prop_localdatetimeW, CIM_DATETIME|COL_FLAG_DYNAMIC }, - { prop_localeW, CIM_STRING|COL_FLAG_DYNAMIC }, - { prop_nameW, CIM_STRING }, - { prop_osarchitectureW, CIM_STRING }, - { prop_oslanguageW, CIM_UINT32, VT_I4 }, - { prop_osproductsuiteW, CIM_UINT32, VT_I4 }, - { prop_ostypeW, CIM_UINT16, VT_I4 }, - { prop_serialnumberW, CIM_STRING }, - { prop_servicepackmajorW, CIM_UINT16, VT_I4 }, - { prop_servicepackminorW, CIM_UINT16, VT_I4 }, - { prop_suitemaskW, CIM_UINT32, VT_I4 }, - { prop_systemdirectoryW, CIM_STRING|COL_FLAG_DYNAMIC }, - { prop_versionW, CIM_STRING } + { prop_buildnumberW, CIM_STRING }, + { prop_captionW, CIM_STRING }, + { prop_codesetW, CIM_STRING|COL_FLAG_DYNAMIC }, + { prop_countrycodeW, CIM_STRING|COL_FLAG_DYNAMIC }, + { prop_csdversionW, CIM_STRING }, + { prop_installdateW, CIM_DATETIME }, + { prop_lastbootuptimeW, CIM_DATETIME|COL_FLAG_DYNAMIC }, + { prop_localdatetimeW, CIM_DATETIME|COL_FLAG_DYNAMIC }, + { prop_localeW, CIM_STRING|COL_FLAG_DYNAMIC }, + { prop_nameW, CIM_STRING }, + { prop_osarchitectureW, CIM_STRING }, + { prop_oslanguageW, CIM_UINT32, VT_I4 }, + { prop_osproductsuiteW, CIM_UINT32, VT_I4 }, + { prop_ostypeW, CIM_UINT16, VT_I4 }, + { prop_serialnumberW, CIM_STRING }, + { prop_servicepackmajorW, CIM_UINT16, VT_I4 }, + { prop_servicepackminorW, CIM_UINT16, VT_I4 }, + { prop_suitemaskW, CIM_UINT32, VT_I4 }, + { prop_systemdirectoryW, CIM_STRING|COL_FLAG_DYNAMIC }, + { prop_totalvisiblememorysizeW, CIM_UINT64 }, + { prop_versionW, CIM_STRING } }; static const struct column col_param[] = { @@ -718,6 +721,7 @@ UINT16 servicepackminor; UINT32 suitemask; const WCHAR *systemdirectory; + UINT64 totalvisiblememorysize; const WCHAR *version; }; struct record_param @@ -2147,26 +2151,27 @@ if (!resize_table( table, 1, sizeof(*rec) )) return FILL_STATUS_FAILED; rec = (struct record_operatingsystem *)table->data; - rec->buildnumber = os_buildnumberW; - rec->caption = os_captionW; - rec->codeset = get_codeset(); - rec->countrycode = get_countrycode(); - rec->csdversion = os_csdversionW; - rec->installdate = os_installdateW; - rec->lastbootuptime = get_lastbootuptime(); - rec->localdatetime = get_localdatetime(); - rec->locale = get_locale(); - rec->name = os_nameW; - rec->osarchitecture = get_osarchitecture(); - rec->oslanguage = GetSystemDefaultLangID(); - rec->osproductsuite = 2461140; /* Windows XP Professional */ - rec->ostype = 18; /* WINNT */ - rec->serialnumber = os_serialnumberW; - rec->servicepackmajor = 3; - rec->servicepackminor = 0; - rec->suitemask = 272; /* Single User + Terminal */ - rec->systemdirectory = get_systemdirectory(); - rec->version = os_versionW; + rec->buildnumber = os_buildnumberW; + rec->caption = os_captionW; + rec->codeset = get_codeset(); + rec->countrycode = get_countrycode(); + rec->csdversion = os_csdversionW; + rec->installdate = os_installdateW; + rec->lastbootuptime = get_lastbootuptime(); + rec->localdatetime = get_localdatetime(); + rec->locale = get_locale(); + rec->name = os_nameW; + rec->osarchitecture = get_osarchitecture(); + rec->oslanguage = GetSystemDefaultLangID(); + rec->osproductsuite = 2461140; /* Windows XP Professional */ + rec->ostype = 18; /* WINNT */ + rec->serialnumber = os_serialnumberW; + rec->servicepackmajor = 3; + rec->servicepackminor = 0; + rec->suitemask = 272; /* Single User + Terminal */ + rec->systemdirectory = get_systemdirectory(); + rec->totalvisiblememorysize = get_total_physical_memory() / 1024; + rec->version = os_versionW; if (!match_row( table, row, cond, &status )) free_row_values( table, row ); else row++; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/windowscodecs/regsvr.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/windowscodecs/regsvr.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/windowscodecs/regsvr.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/windowscodecs/regsvr.c 2014-12-15 00:45:34.000000000 +0000 @@ -154,21 +154,6 @@ */ static const WCHAR clsid_keyname[] = { 'C', 'L', 'S', 'I', 'D', 0 }; -static const WCHAR curver_keyname[] = { - 'C', 'u', 'r', 'V', 'e', 'r', 0 }; -static const WCHAR ips_keyname[] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - 0 }; -static const WCHAR ips32_keyname[] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - '3', '2', 0 }; -static const WCHAR progid_keyname[] = { - 'P', 'r', 'o', 'g', 'I', 'D', 0 }; -static const WCHAR viprogid_keyname[] = { - 'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p', - 'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D', - 0 }; -static const char tmodel_valuename[] = "ThreadingModel"; static const char author_valuename[] = "Author"; static const char friendlyname_valuename[] = "FriendlyName"; static const WCHAR vendor_valuename[] = {'V','e','n','d','o','r',0}; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/winealsa.drv/mmdevdrv.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/winealsa.drv/mmdevdrv.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/winealsa.drv/mmdevdrv.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/winealsa.drv/mmdevdrv.c 2014-12-15 00:45:34.000000000 +0000 @@ -3823,3 +3823,111 @@ return S_OK; } + +enum AudioDeviceConnectionType { + AudioDeviceConnectionType_Unknown = 0, + AudioDeviceConnectionType_PCI, + AudioDeviceConnectionType_USB +}; + +HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out) +{ + static const PROPERTYKEY devicepath_key = { /* undocumented? - {b3f8fa53-0004-438e-9003-51a46e139bfc},2 */ + {0xb3f8fa53, 0x0004, 0x438e, {0x90, 0x03, 0x51, 0xa4, 0x6e, 0x13, 0x9b, 0xfc}}, 2 + }; + + TRACE("%s, (%s,%u), %p\n", wine_dbgstr_guid(guid), wine_dbgstr_guid(&prop->fmtid), prop->pid, out); + + if(IsEqualPropertyKey(*prop, devicepath_key)) + { + char name[256], uevent[MAX_PATH]; + EDataFlow flow; + FILE *fuevent; + int card, device; + + if(!get_alsa_name_by_guid(guid, name, sizeof(name), &flow)) + { + WARN("Unknown interface %s\n", debugstr_guid(guid)); + return E_NOINTERFACE; + } + + /* only implemented for identifiable devices, i.e. not "default" */ + if(!sscanf(name, "plughw:%u,%u", &card, &device)) + return E_NOTIMPL; + + sprintf(uevent, "/sys/class/sound/card%u/device/uevent", card); + fuevent = fopen(uevent, "r"); + + if(fuevent){ + enum AudioDeviceConnectionType connection = AudioDeviceConnectionType_Unknown; + USHORT vendor_id = 0, product_id = 0; + char line[256]; + + while (fgets(line, sizeof(line), fuevent)) { + char *val; + size_t val_len; + + if((val = strchr(line, '='))) { + val[0] = 0; + val++; + + val_len = strlen(val); + if(val_len > 0 && val[val_len - 1] == '\n') { val[val_len - 1] = 0; } + + if(!strcmp(line, "PCI_ID")){ + connection = AudioDeviceConnectionType_PCI; + if(sscanf(val, "%hX:%hX", &vendor_id, &product_id)<2){ + WARN("Unexpected input when reading PCI_ID in uevent file.\n"); + connection = AudioDeviceConnectionType_Unknown; + break; + } + }else if(!strcmp(line, "DEVTYPE") && !strcmp(val,"usb_interface")) + connection = AudioDeviceConnectionType_USB; + else if(!strcmp(line, "PRODUCT")) + if(sscanf(val, "%hx/%hx/", &vendor_id, &product_id)<2){ + WARN("Unexpected input when reading PRODUCT in uevent file.\n"); + connection = AudioDeviceConnectionType_Unknown; + break; + } + } + } + + fclose(fuevent); + + if(connection == AudioDeviceConnectionType_USB || connection == AudioDeviceConnectionType_PCI){ + static const WCHAR usbformatW[] = { '{','1','}','.','U','S','B','\\','V','I','D','_', + '%','0','4','X','&','P','I','D','_','%','0','4','X','\\', + '%','u','&','%','0','8','X',0 }; /* "{1}.USB\VID_%04X&PID_%04X\%u&%08X" */ + static const WCHAR pciformatW[] = { '{','1','}','.','H','D','A','U','D','I','O','\\','F','U','N','C','_','0','1','&', + 'V','E','N','_','%','0','4','X','&','D','E','V','_', + '%','0','4','X','\\','%','u','&','%','0','8','X',0 }; /* "{1}.HDAUDIO\FUNC_01&VEN_%04X&DEV_%04X\%u&%08X" */ + UINT serial_number; + + /* As hardly any audio devices have serial numbers, Windows instead + appears to use a persistent random number. We emulate this here + by instead using the last 8 hex digits of the GUID. */ + serial_number = (guid->Data4[4] << 24) | (guid->Data4[5] << 16) | (guid->Data4[6] << 8) | guid->Data4[7]; + + out->vt = VT_LPWSTR; + out->u.pwszVal = CoTaskMemAlloc(128 * sizeof(WCHAR)); + + if(!out->u.pwszVal) + return E_OUTOFMEMORY; + + if(connection == AudioDeviceConnectionType_USB) + sprintfW( out->u.pwszVal, usbformatW, vendor_id, product_id, device, serial_number); + else if(connection == AudioDeviceConnectionType_PCI) + sprintfW( out->u.pwszVal, pciformatW, vendor_id, product_id, device, serial_number); + + return S_OK; + } + }else{ + WARN("Could not open %s for reading\n", uevent); + return E_NOTIMPL; + } + } + + TRACE("Unimplemented property %s,%u\n", wine_dbgstr_guid(&prop->fmtid), prop->pid); + + return E_NOTIMPL; +} diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/winealsa.drv/winealsa.drv.spec wine-compholio-1.7.33~ubuntu15.04.1/dlls/winealsa.drv/winealsa.drv.spec --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/winealsa.drv/winealsa.drv.spec 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/winealsa.drv/winealsa.drv.spec 2014-12-15 00:45:34.000000000 +0000 @@ -8,3 +8,4 @@ @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs @ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint @ stdcall -private GetAudioSessionManager(ptr ptr) AUDDRV_GetAudioSessionManager +@ stdcall -private GetPropValue(ptr ptr ptr) AUDDRV_GetPropValue diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/arb_program_shader.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/arb_program_shader.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/arb_program_shader.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/arb_program_shader.c 2014-12-15 00:45:34.000000000 +0000 @@ -1390,8 +1390,8 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD sampler_idx, const char *dst_str, const char *coord_reg, WORD flags, const char *dsx, const char *dsy) { + enum wined3d_shader_resource_type resource_type = ins->ctx->reg_maps->resource_info[sampler_idx].type; struct wined3d_shader_buffer *buffer = ins->ctx->buffer; - DWORD sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx]; const char *tex_type; BOOL np2_fixup = FALSE; struct shader_arb_ctx_priv *priv = ins->ctx->backend_data; @@ -1404,12 +1404,13 @@ /* D3D vertex shader sampler IDs are vertex samplers(0-3), not global d3d samplers */ if(!pshader) sampler_idx += MAX_FRAGMENT_SAMPLERS; - switch(sampler_type) { - case WINED3DSTT_1D: + switch (resource_type) + { + case WINED3D_SHADER_RESOURCE_TEXTURE_1D: tex_type = "1D"; break; - case WINED3DSTT_2D: + case WINED3D_SHADER_RESOURCE_TEXTURE_2D: shader = ins->ctx->shader; device = shader->device; gl_info = &device->adapter->gl_info; @@ -1429,16 +1430,16 @@ } break; - case WINED3DSTT_VOLUME: + case WINED3D_SHADER_RESOURCE_TEXTURE_3D: tex_type = "3D"; break; - case WINED3DSTT_CUBE: + case WINED3D_SHADER_RESOURCE_TEXTURE_CUBE: tex_type = "CUBE"; break; default: - ERR("Unexpected texture type %d\n", sampler_type); + ERR("Unexpected resource type %#x.\n", resource_type); tex_type = ""; } @@ -4376,7 +4377,7 @@ shader_data->gl_shaders[shader_data->num_gl_shaders].args = *args; - pixelshader_update_samplers(shader, args->super.tex_types); + pixelshader_update_resource_types(shader, args->super.tex_types); if (!shader_buffer_init(&buffer)) { diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/context.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/context.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/context.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/context.c 2014-12-15 00:45:34.000000000 +0000 @@ -2585,14 +2585,14 @@ static void context_map_psamplers(struct wined3d_context *context, const struct wined3d_state *state) { - const enum wined3d_sampler_texture_type *sampler_type = - state->shader[WINED3D_SHADER_TYPE_PIXEL]->reg_maps.sampler_type; + const struct wined3d_shader_resource_info *resource_info = + state->shader[WINED3D_SHADER_TYPE_PIXEL]->reg_maps.resource_info; unsigned int i; const struct wined3d_d3d_info *d3d_info = context->d3d_info; for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i) { - if (sampler_type[i] && context->tex_unit_map[i] != i) + if (resource_info[i].type && context->tex_unit_map[i] != i) { context_map_stage(context, i, i); context_invalidate_state(context, STATE_SAMPLER(i)); @@ -2603,8 +2603,8 @@ } static BOOL context_unit_free_for_vs(const struct wined3d_context *context, - const enum wined3d_sampler_texture_type *pshader_sampler_tokens, - const enum wined3d_sampler_texture_type *vshader_sampler_tokens, DWORD unit) + const struct wined3d_shader_resource_info *ps_resource_info, + const struct wined3d_shader_resource_info *vs_resource_info, DWORD unit) { DWORD current_mapping = context->rev_tex_unit_map[unit]; @@ -2616,39 +2616,39 @@ { /* Used by a fragment sampler */ - if (!pshader_sampler_tokens) + if (!ps_resource_info) { /* No pixel shader, check fixed function */ return current_mapping >= MAX_TEXTURES || !(context->fixed_function_usage_map & (1 << current_mapping)); } /* Pixel shader, check the shader's sampler map */ - return !pshader_sampler_tokens[current_mapping]; + return !ps_resource_info[current_mapping].type; } /* Used by a vertex sampler */ - return !vshader_sampler_tokens[current_mapping - MAX_FRAGMENT_SAMPLERS]; + return !vs_resource_info[current_mapping - MAX_FRAGMENT_SAMPLERS].type; } static void context_map_vsamplers(struct wined3d_context *context, BOOL ps, const struct wined3d_state *state) { - const enum wined3d_sampler_texture_type *vshader_sampler_type = - state->shader[WINED3D_SHADER_TYPE_VERTEX]->reg_maps.sampler_type; - const enum wined3d_sampler_texture_type *pshader_sampler_type = NULL; + const struct wined3d_shader_resource_info *vs_resource_info = + state->shader[WINED3D_SHADER_TYPE_VERTEX]->reg_maps.resource_info; + const struct wined3d_shader_resource_info *ps_resource_info = NULL; const struct wined3d_gl_info *gl_info = context->gl_info; int start = min(MAX_COMBINED_SAMPLERS, gl_info->limits.combined_samplers) - 1; int i; + /* Note that we only care if a resource is used or not, not the + * resource's specific type. Otherwise we'd need to call + * shader_update_samplers() here for 1.x pixelshaders. */ if (ps) - { - /* Note that we only care if a sampler is sampled or not, not the sampler's specific type. - * Otherwise we'd need to call shader_update_samplers() here for 1.x pixelshaders. */ - pshader_sampler_type = state->shader[WINED3D_SHADER_TYPE_PIXEL]->reg_maps.sampler_type; - } + ps_resource_info = state->shader[WINED3D_SHADER_TYPE_PIXEL]->reg_maps.resource_info; - for (i = 0; i < MAX_VERTEX_SAMPLERS; ++i) { + for (i = 0; i < MAX_VERTEX_SAMPLERS; ++i) + { DWORD vsampler_idx = i + MAX_FRAGMENT_SAMPLERS; - if (vshader_sampler_type[i]) + if (vs_resource_info[i].type) { if (context->tex_unit_map[vsampler_idx] != WINED3D_UNMAPPED_STAGE) { @@ -2658,7 +2658,7 @@ while (start >= 0) { - if (context_unit_free_for_vs(context, pshader_sampler_type, vshader_sampler_type, start)) + if (context_unit_free_for_vs(context, ps_resource_info, vs_resource_info, start)) { context_map_stage(context, vsampler_idx, start); context_invalidate_state(context, STATE_SAMPLER(vsampler_idx)); @@ -2930,7 +2930,7 @@ { for (i = 0; i < MAX_VERTEX_SAMPLERS; ++i) { - if (state->shader[WINED3D_SHADER_TYPE_VERTEX]->reg_maps.sampler_type[i]) + if (state->shader[WINED3D_SHADER_TYPE_VERTEX]->reg_maps.resource_info[i].type) context_preload_texture(context, state, MAX_FRAGMENT_SAMPLERS + i); } } @@ -2939,7 +2939,7 @@ { for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i) { - if (state->shader[WINED3D_SHADER_TYPE_PIXEL]->reg_maps.sampler_type[i]) + if (state->shader[WINED3D_SHADER_TYPE_PIXEL]->reg_maps.resource_info[i].type) context_preload_texture(context, state, i); } } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/device.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/device.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/device.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/device.c 2014-12-15 00:45:34.000000000 +0000 @@ -4961,7 +4961,7 @@ LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL unicode, UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc) { - if (device->filter_messages) + if (device->filter_messages && message != WM_DISPLAYCHANGE) { TRACE("Filtering message: window %p, message %#x, wparam %#lx, lparam %#lx.\n", window, message, wparam, lparam); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/glsl_shader.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/glsl_shader.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/glsl_shader.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/glsl_shader.c 2014-12-15 00:45:34.000000000 +0000 @@ -65,6 +65,7 @@ { const char *name; DWORD coord_mask; + enum wined3d_data_type data_type; }; enum heap_node_op @@ -1064,52 +1065,56 @@ /* Declare texture samplers */ for (i = 0; i < shader->limits->sampler; ++i) { - if (reg_maps->sampler_type[i]) + BOOL shadow_sampler, tex_rect; + + if (!reg_maps->resource_info[i].type) + continue; + + shadow_sampler = version->type == WINED3D_SHADER_TYPE_PIXEL && (ps_args->shadow & (1 << i)); + switch (reg_maps->resource_info[i].type) { - BOOL shadow_sampler = version->type == WINED3D_SHADER_TYPE_PIXEL && (ps_args->shadow & (1 << i)); - BOOL tex_rect; + case WINED3D_SHADER_RESOURCE_TEXTURE_1D: + if (shadow_sampler) + shader_addline(buffer, "uniform sampler1DShadow %s_sampler%u;\n", prefix, i); + else + shader_addline(buffer, "uniform sampler1D %s_sampler%u;\n", prefix, i); + break; - switch (reg_maps->sampler_type[i]) - { - case WINED3DSTT_1D: - if (shadow_sampler) - shader_addline(buffer, "uniform sampler1DShadow %s_sampler%u;\n", prefix, i); + case WINED3D_SHADER_RESOURCE_TEXTURE_2D: + tex_rect = version->type == WINED3D_SHADER_TYPE_PIXEL && (ps_args->np2_fixup & (1 << i)); + tex_rect = tex_rect && gl_info->supported[ARB_TEXTURE_RECTANGLE]; + if (shadow_sampler) + { + if (tex_rect) + shader_addline(buffer, "uniform sampler2DRectShadow %s_sampler%u;\n", prefix, i); else - shader_addline(buffer, "uniform sampler1D %s_sampler%u;\n", prefix, i); - break; - case WINED3DSTT_2D: - tex_rect = version->type == WINED3D_SHADER_TYPE_PIXEL && (ps_args->np2_fixup & (1 << i)); - tex_rect = tex_rect && gl_info->supported[ARB_TEXTURE_RECTANGLE]; - if (shadow_sampler) - { - if (tex_rect) - shader_addline(buffer, "uniform sampler2DRectShadow %s_sampler%u;\n", prefix, i); - else - shader_addline(buffer, "uniform sampler2DShadow %s_sampler%u;\n", prefix, i); - } + shader_addline(buffer, "uniform sampler2DShadow %s_sampler%u;\n", prefix, i); + } + else + { + if (tex_rect) + shader_addline(buffer, "uniform sampler2DRect %s_sampler%u;\n", prefix, i); else - { - if (tex_rect) - shader_addline(buffer, "uniform sampler2DRect %s_sampler%u;\n", prefix, i); - else - shader_addline(buffer, "uniform sampler2D %s_sampler%u;\n", prefix, i); - } - break; - case WINED3DSTT_CUBE: - if (shadow_sampler) - FIXME("Unsupported Cube shadow sampler.\n"); - shader_addline(buffer, "uniform samplerCube %s_sampler%u;\n", prefix, i); - break; - case WINED3DSTT_VOLUME: - if (shadow_sampler) - FIXME("Unsupported 3D shadow sampler.\n"); - shader_addline(buffer, "uniform sampler3D %s_sampler%u;\n", prefix, i); - break; - default: - shader_addline(buffer, "uniform unsupported_sampler %s_sampler%u;\n", prefix, i); - FIXME("Unrecognized sampler type: %#x\n", reg_maps->sampler_type[i]); - break; - } + shader_addline(buffer, "uniform sampler2D %s_sampler%u;\n", prefix, i); + } + break; + + case WINED3D_SHADER_RESOURCE_TEXTURE_3D: + if (shadow_sampler) + FIXME("Unsupported 3D shadow sampler.\n"); + shader_addline(buffer, "uniform sampler3D %s_sampler%u;\n", prefix, i); + break; + + case WINED3D_SHADER_RESOURCE_TEXTURE_CUBE: + if (shadow_sampler) + FIXME("Unsupported Cube shadow sampler.\n"); + shader_addline(buffer, "uniform samplerCube %s_sampler%u;\n", prefix, i); + break; + + default: + shader_addline(buffer, "uniform unsupported_sampler %s_sampler%u;\n", prefix, i); + FIXME("Unhandled resource type %#x.\n", reg_maps->resource_info[i].type); + break; } } @@ -1130,17 +1135,16 @@ for (i = 0; i < shader->limits->sampler; ++i) { - if (reg_maps->sampler_type[i]) - { - if (!(ps_args->np2_fixup & (1 << i))) continue; - - if (WINED3DSTT_2D != reg_maps->sampler_type[i]) { - FIXME("Non-2D texture is flagged for NP2 texcoord fixup.\n"); - continue; - } + if (!reg_maps->resource_info[i].type || !(ps_args->np2_fixup & (1 << i))) + continue; - fixup->idx[i] = cur++; + if (reg_maps->resource_info[i].type != WINED3D_SHADER_RESOURCE_TEXTURE_2D) + { + FIXME("Non-2D texture is flagged for NP2 texcoord fixup.\n"); + continue; } + + fixup->idx[i] = cur++; } fixup->num_consts = (cur + 1) >> 1; @@ -1797,14 +1801,15 @@ /* Append the destination part of the instruction to the buffer, return the effective write mask */ static DWORD shader_glsl_append_dst_ext(struct wined3d_shader_buffer *buffer, - const struct wined3d_shader_instruction *ins, const struct wined3d_shader_dst_param *dst) + const struct wined3d_shader_instruction *ins, const struct wined3d_shader_dst_param *dst, + enum wined3d_data_type data_type) { struct glsl_dst_param glsl_dst; DWORD mask; if ((mask = shader_glsl_add_dst_param(ins, dst, &glsl_dst))) { - switch (dst->reg.data_type) + switch (data_type) { case WINED3D_DATA_FLOAT: shader_addline(buffer, "%s%s = %s(", @@ -1821,7 +1826,7 @@ glsl_dst.reg_name, glsl_dst.mask_str, shift_glsl_tab[dst->shift]); break; default: - FIXME("Unhandled data type %#x.\n", dst->reg.data_type); + FIXME("Unhandled data type %#x.\n", data_type); shader_addline(buffer, "%s%s = %s(", glsl_dst.reg_name, glsl_dst.mask_str, shift_glsl_tab[dst->shift]); break; @@ -1834,7 +1839,7 @@ /* Append the destination part of the instruction to the buffer, return the effective write mask */ static DWORD shader_glsl_append_dst(struct wined3d_shader_buffer *buffer, const struct wined3d_shader_instruction *ins) { - return shader_glsl_append_dst_ext(buffer, ins, &ins->dst[0]); + return shader_glsl_append_dst_ext(buffer, ins, &ins->dst[0], ins->dst[0].reg.data_type); } /** Process GLSL instruction modifiers */ @@ -1885,20 +1890,23 @@ } static void shader_glsl_get_sample_function(const struct wined3d_shader_context *ctx, - DWORD sampler_idx, DWORD flags, struct glsl_sample_function *sample_function) + DWORD resource_idx, DWORD flags, struct glsl_sample_function *sample_function) { - enum wined3d_sampler_texture_type sampler_type = ctx->reg_maps->sampler_type[sampler_idx]; + enum wined3d_shader_resource_type resource_type = ctx->reg_maps->resource_info[resource_idx].type; const struct wined3d_gl_info *gl_info = ctx->gl_info; BOOL shadow = ctx->reg_maps->shader_version.type == WINED3D_SHADER_TYPE_PIXEL - && (((const struct shader_glsl_ctx_priv *)ctx->backend_data)->cur_ps_args->shadow & (1 << sampler_idx)); + && (((const struct shader_glsl_ctx_priv *)ctx->backend_data)->cur_ps_args->shadow & (1 << resource_idx)); BOOL projected = flags & WINED3D_GLSL_SAMPLE_PROJECTED; BOOL texrect = flags & WINED3D_GLSL_SAMPLE_NPOT && gl_info->supported[ARB_TEXTURE_RECTANGLE]; BOOL lod = flags & WINED3D_GLSL_SAMPLE_LOD; BOOL grad = flags & WINED3D_GLSL_SAMPLE_GRAD; + sample_function->data_type = ctx->reg_maps->resource_info[resource_idx].data_type; + /* Note that there's no such thing as a projected cube texture. */ - switch(sampler_type) { - case WINED3DSTT_1D: + switch (resource_type) + { + case WINED3D_SHADER_RESOURCE_TEXTURE_1D: if (shadow) { if (lod) @@ -1949,7 +1957,7 @@ } break; - case WINED3DSTT_2D: + case WINED3D_SHADER_RESOURCE_TEXTURE_2D: if (shadow) { if (texrect) @@ -2052,67 +2060,67 @@ } break; - case WINED3DSTT_CUBE: + case WINED3D_SHADER_RESOURCE_TEXTURE_3D: if (shadow) { - FIXME("Unsupported Cube shadow function.\n"); - sample_function->name = "unsupportedCubeShadow"; + FIXME("Unsupported 3D shadow function.\n"); + sample_function->name = "unsupported3DShadow"; sample_function->coord_mask = 0; } else { if (lod) { - sample_function->name = "textureCubeLod"; + sample_function->name = projected ? "texture3DProjLod" : "texture3DLod"; } - else if (grad) + else if (grad) { if (gl_info->supported[EXT_GPU_SHADER4]) - sample_function->name = "textureCubeGrad"; + sample_function->name = projected ? "texture3DProjGrad" : "texture3DGrad"; else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD]) - sample_function->name = "textureCubeGradARB"; + sample_function->name = projected ? "texture3DProjGradARB" : "texture3DGradARB"; else { - FIXME("Unsupported Cube grad function.\n"); - sample_function->name = "unsupportedCubeGrad"; + FIXME("Unsupported 3D grad function.\n"); + sample_function->name = "unsupported3DGrad"; } } else { - sample_function->name = "textureCube"; + sample_function->name = projected ? "texture3DProj" : "texture3D"; } sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2; } break; - case WINED3DSTT_VOLUME: + case WINED3D_SHADER_RESOURCE_TEXTURE_CUBE: if (shadow) { - FIXME("Unsupported 3D shadow function.\n"); - sample_function->name = "unsupported3DShadow"; + FIXME("Unsupported Cube shadow function.\n"); + sample_function->name = "unsupportedCubeShadow"; sample_function->coord_mask = 0; } else { if (lod) { - sample_function->name = projected ? "texture3DProjLod" : "texture3DLod"; + sample_function->name = "textureCubeLod"; } - else if (grad) + else if (grad) { if (gl_info->supported[EXT_GPU_SHADER4]) - sample_function->name = projected ? "texture3DProjGrad" : "texture3DGrad"; + sample_function->name = "textureCubeGrad"; else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD]) - sample_function->name = projected ? "texture3DProjGradARB" : "texture3DGradARB"; + sample_function->name = "textureCubeGradARB"; else { - FIXME("Unsupported 3D grad function.\n"); - sample_function->name = "unsupported3DGrad"; + FIXME("Unsupported Cube grad function.\n"); + sample_function->name = "unsupportedCubeGrad"; } } else { - sample_function->name = projected ? "texture3DProj" : "texture3D"; + sample_function->name = "textureCube"; } sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2; } @@ -2121,7 +2129,7 @@ default: sample_function->name = ""; sample_function->coord_mask = 0; - FIXME("Unrecognized sampler type: %#x;\n", sampler_type); + FIXME("Unhandled resource type %#x.\n", resource_type); break; } } @@ -2261,7 +2269,7 @@ fixup = COLOR_FIXUP_IDENTITY; /* FIXME: Vshader color fixup */ } - shader_glsl_append_dst(ins->ctx->buffer, ins); + shader_glsl_append_dst_ext(ins->ctx->buffer, ins, &ins->dst[0], sample_function->data_type); shader_addline(ins->ctx->buffer, "%s(%s_sampler%u, ", sample_function->name, shader_glsl_get_prefix(version->type), sampler); @@ -2393,7 +2401,7 @@ if (ins->dst[1].reg.type != WINED3DSPR_NULL) { - write_mask = shader_glsl_append_dst_ext(buffer, ins, &ins->dst[1]); + write_mask = shader_glsl_append_dst_ext(buffer, ins, &ins->dst[1], ins->dst[1].reg.data_type); shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src0_param); shader_glsl_add_src_param(ins, &ins->src[1], write_mask, &src1_param); @@ -2421,17 +2429,17 @@ shader_addline(buffer, "tmp0%s = %s / %s;\n", dst_mask, src0_param.param_str, src1_param.param_str); - write_mask = shader_glsl_append_dst_ext(buffer, ins, &ins->dst[1]); + write_mask = shader_glsl_append_dst_ext(buffer, ins, &ins->dst[1], ins->dst[1].reg.data_type); shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src0_param); shader_glsl_add_src_param(ins, &ins->src[1], write_mask, &src1_param); shader_addline(buffer, "%s %% %s));\n", src0_param.param_str, src1_param.param_str); - shader_glsl_append_dst_ext(buffer, ins, &ins->dst[0]); + shader_glsl_append_dst_ext(buffer, ins, &ins->dst[0], ins->dst[0].reg.data_type); shader_addline(buffer, "tmp0%s);\n", dst_mask); } else { - write_mask = shader_glsl_append_dst_ext(buffer, ins, &ins->dst[0]); + write_mask = shader_glsl_append_dst_ext(buffer, ins, &ins->dst[0], ins->dst[0].reg.data_type); shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src0_param); shader_glsl_add_src_param(ins, &ins->src[1], write_mask, &src1_param); shader_addline(buffer, "%s / %s);\n", src0_param.param_str, src1_param.param_str); @@ -2439,7 +2447,7 @@ } else if (ins->dst[1].reg.type != WINED3DSPR_NULL) { - write_mask = shader_glsl_append_dst_ext(buffer, ins, &ins->dst[1]); + write_mask = shader_glsl_append_dst_ext(buffer, ins, &ins->dst[1], ins->dst[1].reg.data_type); shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src0_param); shader_glsl_add_src_param(ins, &ins->src[1], write_mask, &src1_param); shader_addline(buffer, "%s %% %s);\n", src0_param.param_str, src1_param.param_str); @@ -2903,7 +2911,7 @@ continue; shader_addline(ins->ctx->buffer, "tmp0%s = (", mask_char); } - else if (!(write_mask = shader_glsl_append_dst_ext(ins->ctx->buffer, ins, &dst))) + else if (!(write_mask = shader_glsl_append_dst_ext(ins->ctx->buffer, ins, &dst, dst.reg.data_type))) continue; shader_glsl_add_src_param(ins, &ins->src[0], cmp_channel, &src0_param); @@ -3181,23 +3189,23 @@ shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src0_param); shader_addline(buffer, "tmp0%s = sin(%s);\n", dst_mask, src0_param.param_str); - write_mask = shader_glsl_append_dst_ext(buffer, ins, &ins->dst[1]); + write_mask = shader_glsl_append_dst_ext(buffer, ins, &ins->dst[1], ins->dst[1].reg.data_type); shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src0_param); shader_addline(buffer, "cos(%s));\n", src0_param.param_str); - shader_glsl_append_dst_ext(buffer, ins, &ins->dst[0]); + shader_glsl_append_dst_ext(buffer, ins, &ins->dst[0], ins->dst[0].reg.data_type); shader_addline(buffer, "tmp0%s);\n", dst_mask); } else { - write_mask = shader_glsl_append_dst_ext(buffer, ins, &ins->dst[0]); + write_mask = shader_glsl_append_dst_ext(buffer, ins, &ins->dst[0], ins->dst[0].reg.data_type); shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src0_param); shader_addline(buffer, "sin(%s));\n", src0_param.param_str); } } else if (ins->dst[1].reg.type != WINED3DSPR_NULL) { - write_mask = shader_glsl_append_dst_ext(buffer, ins, &ins->dst[1]); + write_mask = shader_glsl_append_dst_ext(buffer, ins, &ins->dst[1], ins->dst[1].reg.data_type); shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src0_param); shader_addline(buffer, "cos(%s));\n", src0_param.param_str); } @@ -3449,25 +3457,25 @@ ins->ctx->reg_maps->shader_version.minor); struct glsl_sample_function sample_function; DWORD sample_flags = 0; - DWORD sampler_idx; + DWORD resource_idx; DWORD mask = 0, swizzle; const struct shader_glsl_ctx_priv *priv = ins->ctx->backend_data; /* 1.0-1.4: Use destination register as sampler source. * 2.0+: Use provided sampler source. */ if (shader_version < WINED3D_SHADER_VERSION(2,0)) - sampler_idx = ins->dst[0].reg.idx[0].offset; + resource_idx = ins->dst[0].reg.idx[0].offset; else - sampler_idx = ins->src[1].reg.idx[0].offset; + resource_idx = ins->src[1].reg.idx[0].offset; if (shader_version < WINED3D_SHADER_VERSION(1,4)) { - DWORD flags = (priv->cur_ps_args->tex_transform >> sampler_idx * WINED3D_PSARGS_TEXTRANSFORM_SHIFT) + DWORD flags = (priv->cur_ps_args->tex_transform >> resource_idx * WINED3D_PSARGS_TEXTRANSFORM_SHIFT) & WINED3D_PSARGS_TEXTRANSFORM_MASK; - enum wined3d_sampler_texture_type sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx]; + enum wined3d_shader_resource_type resource_type = ins->ctx->reg_maps->resource_info[resource_idx].type; /* Projected cube textures don't make a lot of sense, the resulting coordinates stay the same. */ - if (flags & WINED3D_PSARGS_PROJECTED && sampler_type != WINED3DSTT_CUBE) + if (flags & WINED3D_PSARGS_PROJECTED && resource_type != WINED3D_SHADER_RESOURCE_TEXTURE_CUBE) { sample_flags |= WINED3D_GLSL_SAMPLE_PROJECTED; switch (flags & ~WINED3D_PSARGS_PROJECTED) @@ -3503,7 +3511,7 @@ else { if ((ins->flags & WINED3DSI_TEXLD_PROJECT) - && ins->ctx->reg_maps->sampler_type[sampler_idx] != WINED3DSTT_CUBE) + && ins->ctx->reg_maps->resource_info[resource_idx].type != WINED3D_SHADER_RESOURCE_TEXTURE_CUBE) { /* ps 2.0 texldp instruction always divides by the fourth component. */ sample_flags |= WINED3D_GLSL_SAMPLE_PROJECTED; @@ -3511,10 +3519,10 @@ } } - if (priv->cur_ps_args->np2_fixup & (1 << sampler_idx)) + if (priv->cur_ps_args->np2_fixup & (1 << resource_idx)) sample_flags |= WINED3D_GLSL_SAMPLE_NPOT; - shader_glsl_get_sample_function(ins->ctx, sampler_idx, sample_flags, &sample_function); + shader_glsl_get_sample_function(ins->ctx, resource_idx, sample_flags, &sample_function); mask |= sample_function.coord_mask; if (shader_version < WINED3D_SHADER_VERSION(2,0)) swizzle = WINED3DSP_NOSWIZZLE; @@ -3526,8 +3534,8 @@ { char coord_mask[6]; shader_glsl_write_mask_to_str(mask, coord_mask); - shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, swizzle, NULL, NULL, NULL, - "T%u%s", sampler_idx, coord_mask); + shader_glsl_gen_sample_code(ins, resource_idx, &sample_function, swizzle, NULL, NULL, NULL, + "T%u%s", resource_idx, coord_mask); } else { @@ -3537,10 +3545,10 @@ { struct glsl_src_param bias; shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &bias); - shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, swizzle, NULL, NULL, bias.param_str, + shader_glsl_gen_sample_code(ins, resource_idx, &sample_function, swizzle, NULL, NULL, bias.param_str, "%s", coord_param.param_str); } else { - shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, swizzle, NULL, NULL, NULL, + shader_glsl_gen_sample_code(ins, resource_idx, &sample_function, swizzle, NULL, NULL, NULL, "%s", coord_param.param_str); } } @@ -4677,7 +4685,7 @@ memset(np2fixup, 0, sizeof(*np2fixup)); *np2fixup_info = args->np2_fixup ? np2fixup : NULL; - pixelshader_update_samplers(shader, args->tex_types); + pixelshader_update_resource_types(shader, args->tex_types); shader_buffer_clear(buffer); ret = shader_glsl_generate_pshader(context, buffer, shader, args, np2fixup); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/shader.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/shader.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/shader.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/shader.c 2014-12-15 00:45:34.000000000 +0000 @@ -634,26 +634,43 @@ if (ins.handler_idx == WINED3DSIH_DCL) { struct wined3d_shader_semantic *semantic = &ins.declaration.semantic; + unsigned int reg_idx = semantic->reg.reg.idx[0].offset; switch (semantic->reg.reg.type) { /* Mark input registers used. */ case WINED3DSPR_INPUT: - reg_maps->input_registers |= 1 << semantic->reg.reg.idx[0].offset; - shader_signature_from_semantic(&input_signature[semantic->reg.reg.idx[0].offset], semantic); + if (reg_idx >= MAX_REG_INPUT) + { + ERR("Invalid input register index %u.\n", reg_idx); + break; + } + reg_maps->input_registers |= 1 << reg_idx; + shader_signature_from_semantic(&input_signature[reg_idx], semantic); break; /* Vertex shader: mark 3.0 output registers used, save token. */ case WINED3DSPR_OUTPUT: - reg_maps->output_registers |= 1 << semantic->reg.reg.idx[0].offset; - shader_signature_from_semantic(&output_signature[semantic->reg.reg.idx[0].offset], semantic); + if (reg_idx >= MAX_REG_OUTPUT) + { + ERR("Invalid output register index %u.\n", reg_idx); + break; + } + reg_maps->output_registers |= 1 << reg_idx; + shader_signature_from_semantic(&output_signature[reg_idx], semantic); if (semantic->usage == WINED3D_DECL_USAGE_FOG) reg_maps->fog = 1; break; - /* Save sampler usage token. */ case WINED3DSPR_SAMPLER: - reg_maps->sampler_type[semantic->reg.reg.idx[0].offset] = semantic->sampler_type; + case WINED3DSPR_RESOURCE: + if (reg_idx >= ARRAY_SIZE(reg_maps->resource_info)) + { + ERR("Invalid resource index %u.\n", reg_idx); + break; + } + reg_maps->resource_info[reg_idx].type = semantic->resource_type; + reg_maps->resource_info[reg_idx].data_type = semantic->resource_data_type; break; default: @@ -881,20 +898,20 @@ || ins.handler_idx == WINED3DSIH_TEXREG2GB || ins.handler_idx == WINED3DSIH_TEXREG2RGB)) { - /* Fake sampler usage, only set reserved bit and type. */ - DWORD sampler_code = ins.dst[i].reg.idx[0].offset; + unsigned int reg_idx = ins.dst[i].reg.idx[0].offset; - TRACE("Setting fake 2D sampler for 1.x pixelshader.\n"); - reg_maps->sampler_type[sampler_code] = WINED3DSTT_2D; + TRACE("Setting fake 2D resource for 1.x pixelshader.\n"); + reg_maps->resource_info[reg_idx].type = WINED3D_SHADER_RESOURCE_TEXTURE_2D; + reg_maps->resource_info[reg_idx].data_type = WINED3D_DATA_FLOAT; /* texbem is only valid with < 1.4 pixel shaders */ if (ins.handler_idx == WINED3DSIH_TEXBEM || ins.handler_idx == WINED3DSIH_TEXBEML) { - reg_maps->bumpmat |= 1 << ins.dst[i].reg.idx[0].offset; + reg_maps->bumpmat |= 1 << reg_idx; if (ins.handler_idx == WINED3DSIH_TEXBEML) { - reg_maps->luminanceparams |= 1 << ins.dst[i].reg.idx[0].offset; + reg_maps->luminanceparams |= 1 << reg_idx; } } } @@ -986,12 +1003,95 @@ if (semantic->reg.reg.type == WINED3DSPR_SAMPLER) { - switch (semantic->sampler_type) + switch (semantic->resource_type) { - case WINED3DSTT_2D: TRACE("_2d"); break; - case WINED3DSTT_CUBE: TRACE("_cube"); break; - case WINED3DSTT_VOLUME: TRACE("_volume"); break; - default: TRACE("_unknown_ttype(0x%08x)", semantic->sampler_type); + case WINED3D_SHADER_RESOURCE_TEXTURE_2D: + TRACE("_2d"); + break; + + case WINED3D_SHADER_RESOURCE_TEXTURE_3D: + TRACE("_volume"); + break; + + case WINED3D_SHADER_RESOURCE_TEXTURE_CUBE: + TRACE("_cube"); + break; + + default: + TRACE("_unknown_ttype(0x%08x)", semantic->resource_type); + break; + } + } + else if (semantic->reg.reg.type == WINED3DSPR_RESOURCE) + { + TRACE("_resource_"); + switch (semantic->resource_type) + { + case WINED3D_SHADER_RESOURCE_BUFFER: + TRACE("buffer"); + break; + + case WINED3D_SHADER_RESOURCE_TEXTURE_1D: + TRACE("texture1d"); + break; + + case WINED3D_SHADER_RESOURCE_TEXTURE_2D: + TRACE("texture2d"); + break; + + case WINED3D_SHADER_RESOURCE_TEXTURE_2DMS: + TRACE("texture2dms"); + break; + + case WINED3D_SHADER_RESOURCE_TEXTURE_3D: + TRACE("texture3d"); + break; + + case WINED3D_SHADER_RESOURCE_TEXTURE_CUBE: + TRACE("texturecube"); + break; + + case WINED3D_SHADER_RESOURCE_TEXTURE_1DARRAY: + TRACE("texture1darray"); + break; + + case WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY: + TRACE("texture2darray"); + break; + + case WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY: + TRACE("texture2dmsarray"); + break; + + default: + TRACE("unknown"); + break; + } + switch (semantic->resource_data_type) + { + case WINED3D_DATA_FLOAT: + TRACE(" (float)"); + break; + + case WINED3D_DATA_INT: + TRACE(" (int)"); + break; + + case WINED3D_DATA_UINT: + TRACE(" (uint)"); + break; + + case WINED3D_DATA_UNORM: + TRACE(" (unorm)"); + break; + + case WINED3D_DATA_SNORM: + TRACE(" (snorm)"); + break; + + default: + TRACE(" (unknown)"); + break; } } else @@ -2109,10 +2209,10 @@ if (!state->shader[WINED3D_SHADER_TYPE_VERTEX]) { + enum wined3d_shader_resource_type resource_type = shader->reg_maps.resource_info[i].type; unsigned int j; unsigned int index = state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX]; DWORD max_valid = WINED3D_TTFF_COUNT4; - enum wined3d_sampler_texture_type sampler_type = shader->reg_maps.sampler_type[i]; for (j = 0; j < state->vertex_declaration->element_count; ++j) { @@ -2132,15 +2232,17 @@ tex_transform, max_valid); tex_transform = max_valid; } - if ((sampler_type == WINED3DSTT_1D && tex_transform > WINED3D_TTFF_COUNT1) - || (sampler_type == WINED3DSTT_2D && tex_transform > WINED3D_TTFF_COUNT2) - || (sampler_type == WINED3DSTT_VOLUME && tex_transform > WINED3D_TTFF_COUNT3)) + if ((resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_1D && tex_transform > WINED3D_TTFF_COUNT1) + || (resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_2D + && tex_transform > WINED3D_TTFF_COUNT2) + || (resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_3D + && tex_transform > WINED3D_TTFF_COUNT3)) tex_transform |= WINED3D_PSARGS_PROJECTED; else { WARN("Application requested projected texture with unsuitable texture coordinates.\n"); WARN("(texture unit %u, transform flags %#x, sampler type %u).\n", - i, tex_transform, sampler_type); + i, tex_transform, resource_type); } } else @@ -2157,7 +2259,7 @@ { const struct wined3d_texture *texture = state->textures[i]; - if (!shader->reg_maps.sampler_type[i]) + if (!shader->reg_maps.resource_info[i].type) continue; /* Treat unbound textures as 2D. The dummy texture will provide @@ -2186,7 +2288,7 @@ for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i) { - if (!shader->reg_maps.sampler_type[i]) + if (!shader->reg_maps.resource_info[i].type) continue; texture = state->textures[i]; @@ -2346,7 +2448,7 @@ len = strlen(e->semantic_name); memcpy(ptr, e->semantic_name, len + 1); - shader->output_signature[e->register_idx].semantic_name = ptr; + shader->input_signature[e->register_idx].semantic_name = ptr; ptr += len + 1; } } @@ -2354,10 +2456,10 @@ return WINED3D_OK; } -void pixelshader_update_samplers(struct wined3d_shader *shader, WORD tex_types) +void pixelshader_update_resource_types(struct wined3d_shader *shader, WORD tex_types) { struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps; - enum wined3d_sampler_texture_type *sampler_type = reg_maps->sampler_type; + struct wined3d_shader_resource_info *resource_info = reg_maps->resource_info; unsigned int i; if (reg_maps->shader_version.major != 1) return; @@ -2365,20 +2467,21 @@ for (i = 0; i < shader->limits->sampler; ++i) { /* We don't sample from this sampler. */ - if (!sampler_type[i]) continue; + if (!resource_info[i].type) + continue; switch ((tex_types >> i * WINED3D_PSARGS_TEXTYPE_SHIFT) & WINED3D_PSARGS_TEXTYPE_MASK) { case WINED3D_SHADER_TEX_2D: - sampler_type[i] = WINED3DSTT_2D; + resource_info[i].type = WINED3D_SHADER_RESOURCE_TEXTURE_2D; break; case WINED3D_SHADER_TEX_3D: - sampler_type[i] = WINED3DSTT_VOLUME; + resource_info[i].type = WINED3D_SHADER_RESOURCE_TEXTURE_3D; break; case WINED3D_SHADER_TEX_CUBE: - sampler_type[i] = WINED3DSTT_CUBE; + resource_info[i].type = WINED3D_SHADER_RESOURCE_TEXTURE_CUBE; break; } } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/shader_sm1.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/shader_sm1.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/shader_sm1.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/shader_sm1.c 2014-12-15 00:45:34.000000000 +0000 @@ -36,8 +36,8 @@ #define WINED3DSP_DCL_USAGEINDEX_MASK (0xf << WINED3DSP_DCL_USAGEINDEX_SHIFT) /* DCL sampler type */ -#define WINED3DSP_TEXTURETYPE_SHIFT 27 -#define WINED3DSP_TEXTURETYPE_MASK (0xf << WINED3DSP_TEXTURETYPE_SHIFT) +#define WINED3D_SM1_RESOURCE_TYPE_SHIFT 27 +#define WINED3D_SM1_RESOURCE_TYPE_MASK (0xf << WINED3D_SM1_RESOURCE_TYPE_SHIFT) /* Opcode-related masks */ #define WINED3DSI_OPCODE_MASK 0x0000ffff @@ -99,6 +99,15 @@ WINED3DSHADER_ADDRMODE_RELATIVE = 1 << WINED3DSHADER_ADDRESSMODE_SHIFT, }; +enum wined3d_sm1_resource_type +{ + WINED3D_SM1_RESOURCE_UNKNOWN = 0x0, + WINED3D_SM1_RESOURCE_TEXTURE_1D = 0x1, + WINED3D_SM1_RESOURCE_TEXTURE_2D = 0x2, + WINED3D_SM1_RESOURCE_TEXTURE_CUBE = 0x3, + WINED3D_SM1_RESOURCE_TEXTURE_3D = 0x4, +}; + enum wined3d_sm1_opcode { WINED3D_SM1_OP_NOP = 0x00, @@ -377,6 +386,15 @@ {0, 0, 0, WINED3DSIH_TABLE_SIZE, 0, 0 }, }; +static const enum wined3d_shader_resource_type resource_type_table[] = +{ + /* WINED3D_SM1_RESOURCE_UNKNOWN */ WINED3D_SHADER_RESOURCE_NONE, + /* WINED3D_SM1_RESOURCE_TEXTURE_1D */ WINED3D_SHADER_RESOURCE_TEXTURE_1D, + /* WINED3D_SM1_RESOURCE_TEXTURE_2D */ WINED3D_SHADER_RESOURCE_TEXTURE_2D, + /* WINED3D_SM1_RESOURCE_TEXTURE_CUBE */ WINED3D_SHADER_RESOURCE_TEXTURE_CUBE, + /* WINED3D_SM1_RESOURCE_TEXTURE_3D */ WINED3D_SHADER_RESOURCE_TEXTURE_3D, +}; + /* Read a parameter opcode from the input stream, * and possibly a relative addressing token. * Return the number of tokens read */ @@ -612,12 +630,23 @@ static void shader_sm1_read_semantic(const DWORD **ptr, struct wined3d_shader_semantic *semantic) { + enum wined3d_sm1_resource_type resource_type; DWORD usage_token = *(*ptr)++; DWORD dst_token = *(*ptr)++; semantic->usage = (usage_token & WINED3DSP_DCL_USAGE_MASK) >> WINED3DSP_DCL_USAGE_SHIFT; semantic->usage_idx = (usage_token & WINED3DSP_DCL_USAGEINDEX_MASK) >> WINED3DSP_DCL_USAGEINDEX_SHIFT; - semantic->sampler_type = (usage_token & WINED3DSP_TEXTURETYPE_MASK) >> WINED3DSP_TEXTURETYPE_SHIFT; + resource_type = (usage_token & WINED3D_SM1_RESOURCE_TYPE_MASK) >> WINED3D_SM1_RESOURCE_TYPE_SHIFT; + if (resource_type >= ARRAY_SIZE(resource_type_table)) + { + FIXME("Unhandled resource type %#x.\n", resource_type); + semantic->resource_type = WINED3D_SHADER_RESOURCE_NONE; + } + else + { + semantic->resource_type = resource_type_table[resource_type]; + } + semantic->resource_data_type = WINED3D_DATA_FLOAT; shader_parse_dst_param(dst_token, NULL, &semantic->reg); } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/shader_sm4.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/shader_sm4.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/shader_sm4.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/shader_sm4.c 2014-12-15 00:45:34.000000000 +0000 @@ -29,6 +29,9 @@ #define WINED3D_SM4_INSTRUCTION_LENGTH_SHIFT 24 #define WINED3D_SM4_INSTRUCTION_LENGTH_MASK (0x1f << WINED3D_SM4_INSTRUCTION_LENGTH_SHIFT) +#define WINED3D_SM4_RESOURCE_TYPE_SHIFT 11 +#define WINED3D_SM4_RESOURCE_TYPE_MASK (0xf << WINED3D_SM4_RESOURCE_TYPE_SHIFT) + #define WINED3D_SM4_PRIMITIVE_TYPE_SHIFT 11 #define WINED3D_SM4_PRIMITIVE_TYPE_MASK (0x7 << WINED3D_SM4_PRIMITIVE_TYPE_SHIFT) @@ -121,6 +124,7 @@ WINED3D_SM4_OP_USHR = 0x55, WINED3D_SM4_OP_UTOF = 0x56, WINED3D_SM4_OP_XOR = 0x57, + WINED3D_SM4_OP_DCL_RESOURCE = 0x58, WINED3D_SM4_OP_DCL_CONSTANT_BUFFER = 0x59, WINED3D_SM4_OP_DCL_OUTPUT_TOPOLOGY = 0x5c, WINED3D_SM4_OP_DCL_INPUT_PRIMITIVE = 0x5d, @@ -134,6 +138,7 @@ WINED3D_SM4_RT_OUTPUT = 0x2, WINED3D_SM4_RT_IMMCONST = 0x4, WINED3D_SM4_RT_SAMPLER = 0x6, + WINED3D_SM4_RT_RESOURCE = 0x7, WINED3D_SM4_RT_CONSTBUFFER = 0x8, WINED3D_SM4_RT_PRIMID = 0xb, WINED3D_SM4_RT_NULL = 0xd, @@ -167,6 +172,28 @@ WINED3D_SM4_IMMCONST_VEC4 = 0x2, }; +enum wined3d_sm4_resource_type +{ + WINED3D_SM4_RESOURCE_BUFFER = 0x1, + WINED3D_SM4_RESOURCE_TEXTURE_1D = 0x2, + WINED3D_SM4_RESOURCE_TEXTURE_2D = 0x3, + WINED3D_SM4_RESOURCE_TEXTURE_2DMS = 0x4, + WINED3D_SM4_RESOURCE_TEXTURE_3D = 0x5, + WINED3D_SM4_RESOURCE_TEXTURE_CUBE = 0x6, + WINED3D_SM4_RESOURCE_TEXTURE_1DARRAY = 0x7, + WINED3D_SM4_RESOURCE_TEXTURE_2DARRAY = 0x8, + WINED3D_SM4_RESOURCE_TEXTURE_2DMSARRAY = 0x9, +}; + +enum wined3d_sm4_data_type +{ + WINED3D_SM4_DATA_UNORM = 0x1, + WINED3D_SM4_DATA_SNORM = 0x2, + WINED3D_SM4_DATA_INT = 0x3, + WINED3D_SM4_DATA_UINT = 0x4, + WINED3D_SM4_DATA_FLOAT = 0x5, +}; + struct wined3d_shader_src_param_entry { struct list entry; @@ -264,6 +291,7 @@ {WINED3D_SM4_OP_USHR, WINED3DSIH_USHR, "U", "UU"}, {WINED3D_SM4_OP_UTOF, WINED3DSIH_UTOF, "F", "U"}, {WINED3D_SM4_OP_XOR, WINED3DSIH_XOR, "U", "UU"}, + {WINED3D_SM4_OP_DCL_RESOURCE, WINED3DSIH_DCL, "R", ""}, {WINED3D_SM4_OP_DCL_CONSTANT_BUFFER, WINED3DSIH_DCL_CONSTANT_BUFFER, "", ""}, {WINED3D_SM4_OP_DCL_OUTPUT_TOPOLOGY, WINED3DSIH_DCL_OUTPUT_TOPOLOGY, "", ""}, {WINED3D_SM4_OP_DCL_INPUT_PRIMITIVE, WINED3DSIH_DCL_INPUT_PRIMITIVE, "", ""}, @@ -323,6 +351,30 @@ {WINED3D_SV_TARGET7, WINED3DSPR_COLOROUT, 7}, }; +static const enum wined3d_shader_resource_type resource_type_table[] = +{ + /* 0 */ WINED3D_SHADER_RESOURCE_NONE, + /* WINED3D_SM4_RESOURCE_BUFFER */ WINED3D_SHADER_RESOURCE_BUFFER, + /* WINED3D_SM4_RESOURCE_TEXTURE_1D */ WINED3D_SHADER_RESOURCE_TEXTURE_1D, + /* WINED3D_SM4_RESOURCE_TEXTURE_2D */ WINED3D_SHADER_RESOURCE_TEXTURE_2D, + /* WINED3D_SM4_RESOURCE_TEXTURE_2DMS */ WINED3D_SHADER_RESOURCE_TEXTURE_2DMS, + /* WINED3D_SM4_RESOURCE_TEXTURE_3D */ WINED3D_SHADER_RESOURCE_TEXTURE_3D, + /* WINED3D_SM4_RESOURCE_TEXTURE_CUBE */ WINED3D_SHADER_RESOURCE_TEXTURE_CUBE, + /* WINED3D_SM4_RESOURCE_TEXTURE_1DARRAY */ WINED3D_SHADER_RESOURCE_TEXTURE_1DARRAY, + /* WINED3D_SM4_RESOURCE_TEXTURE_2DARRAY */ WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY, + /* WINED3D_SM4_RESOURCE_TEXTURE_2DMSARRAY */ WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY, +}; + +static const enum wined3d_data_type data_type_table[] = +{ + /* 0 */ WINED3D_DATA_FLOAT, + /* WINED3D_SM4_DATA_UNORM */ WINED3D_DATA_UNORM, + /* WINED3D_SM4_DATA_SNORM */ WINED3D_DATA_SNORM, + /* WINED3D_SM4_DATA_INT */ WINED3D_DATA_INT, + /* WINED3D_SM4_DATA_UINT */ WINED3D_DATA_UINT, + /* WINED3D_SM4_DATA_FLOAT */ WINED3D_DATA_FLOAT, +}; + static BOOL shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD **ptr, enum wined3d_data_type data_type, struct wined3d_shader_src_param *src_param); @@ -743,7 +795,40 @@ FIXME("Skipping modifier 0x%08x.\n", modifier); } - if (opcode == WINED3D_SM4_OP_DCL_CONSTANT_BUFFER) + if (opcode == WINED3D_SM4_OP_DCL_RESOURCE) + { + enum wined3d_sm4_resource_type resource_type; + enum wined3d_sm4_data_type data_type; + DWORD components; + + resource_type = (opcode_token & WINED3D_SM4_RESOURCE_TYPE_MASK) >> WINED3D_SM4_RESOURCE_TYPE_SHIFT; + if (!resource_type || (resource_type >= ARRAY_SIZE(resource_type_table))) + { + FIXME("Unhandled resource type %#x.\n", resource_type); + ins->declaration.semantic.resource_type = WINED3D_SHADER_RESOURCE_NONE; + } + else + { + ins->declaration.semantic.resource_type = resource_type_table[resource_type]; + } + shader_sm4_read_dst_param(priv, &p, WINED3D_DATA_RESOURCE, &ins->declaration.semantic.reg); + + components = *p++; + if ((components & 0xfff0) != (components & 0xf) * 0x1110) + FIXME("Components (%#x) have different data types.\n", components); + data_type = components & 0xf; + + if (!data_type || (data_type >= ARRAY_SIZE(data_type_table))) + { + FIXME("Unhandled data type %#x.\n", data_type); + ins->declaration.semantic.resource_data_type = WINED3D_DATA_FLOAT; + } + else + { + ins->declaration.semantic.resource_data_type = data_type_table[data_type]; + } + } + else if (opcode == WINED3D_SM4_OP_DCL_CONSTANT_BUFFER) { shader_sm4_read_src_param(priv, &p, WINED3D_DATA_FLOAT, &ins->declaration.src); if (opcode_token & WINED3D_SM4_INDEX_TYPE_MASK) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/stateblock.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/stateblock.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/stateblock.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/stateblock.c 2014-12-15 00:45:34.000000000 +0000 @@ -458,6 +458,7 @@ void state_unbind_resources(struct wined3d_state *state) { + struct wined3d_shader_resource_view *srv; struct wined3d_vertex_declaration *decl; struct wined3d_sampler *sampler; struct wined3d_texture *texture; @@ -529,6 +530,15 @@ wined3d_sampler_decref(sampler); } } + + for (j = 0; j < MAX_SHADER_RESOURCE_VIEWS; ++j) + { + if ((srv = state->shader_resource_view[i][j])) + { + state->shader_resource_view[i][j] = NULL; + wined3d_shader_resource_view_decref(srv); + } + } } } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/swapchain.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/swapchain.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/swapchain.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/swapchain.c 2014-12-15 00:45:34.000000000 +0000 @@ -1176,9 +1176,19 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activate) { + struct wined3d_device *device = swapchain->device; + BOOL filter_messages = device->filter_messages; + + /* This code is not protected by the wined3d mutex, so it may run while + * wined3d_device_reset is active. Testing on Windows shows that changing + * focus during resets and resetting during focus change events causes + * the application to crash with an invalid memory access. */ + + device->filter_messages = !(device->wined3d->flags & WINED3D_FOCUS_MESSAGES); + if (activate) { - if (!(swapchain->device->create_parms.flags & WINED3DCREATE_NOWINDOWCHANGES)) + if (!(device->create_parms.flags & WINED3DCREATE_NOWINDOWCHANGES)) { /* The d3d versions do not agree on the exact messages here. D3d8 restores * the window but leaves the size untouched, d3d9 sets the size on an @@ -1192,23 +1202,25 @@ SWP_NOACTIVATE | SWP_NOZORDER); } - if (swapchain->device->wined3d->flags & WINED3D_RESTORE_MODE_ON_ACTIVATE) + if (device->wined3d->flags & WINED3D_RESTORE_MODE_ON_ACTIVATE) { - if (FAILED(wined3d_set_adapter_display_mode(swapchain->device->wined3d, - swapchain->device->adapter->ordinal, &swapchain->d3d_mode))) + if (FAILED(wined3d_set_adapter_display_mode(device->wined3d, + device->adapter->ordinal, &swapchain->d3d_mode))) ERR("Failed to set display mode.\n"); } } else { - if (FAILED(wined3d_set_adapter_display_mode(swapchain->device->wined3d, - swapchain->device->adapter->ordinal, NULL))) + if (FAILED(wined3d_set_adapter_display_mode(device->wined3d, + device->adapter->ordinal, NULL))) ERR("Failed to set display mode.\n"); swapchain->reapply_mode = TRUE; - if (!(swapchain->device->create_parms.flags & WINED3DCREATE_NOWINDOWCHANGES) + if (!(device->create_parms.flags & WINED3DCREATE_NOWINDOWCHANGES) && IsWindowVisible(swapchain->device_window)) ShowWindow(swapchain->device_window, SW_MINIMIZE); } + + device->filter_messages = filter_messages; } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/utils.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/utils.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/utils.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/utils.c 2014-12-15 00:45:34.000000000 +0000 @@ -3929,32 +3929,6 @@ wined3d_ffp_vertex_program_key_compare, }; -UINT wined3d_log2i(UINT32 x) -{ - static const UINT l[] = - { - ~0U, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - }; - UINT32 i; - - return (i = x >> 16) ? (x = i >> 8) ? l[x] + 24 : l[i] + 16 : (i = x >> 8) ? l[i] + 8 : l[x]; -} - const struct blit_shader *wined3d_select_blitter(const struct wined3d_gl_info *gl_info, enum wined3d_blit_op blit_op, const RECT *src_rect, DWORD src_usage, enum wined3d_pool src_pool, const struct wined3d_format *src_format, const RECT *dst_rect, DWORD dst_usage, enum wined3d_pool dst_pool, const struct wined3d_format *dst_format) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/view.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/view.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/view.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/view.c 2014-12-15 00:45:34.000000000 +0000 @@ -176,7 +176,10 @@ if (!refcount) { + /* Call wined3d_object_destroyed() before releasing the resource, + * since releasing the resource may end up destroying the parent. */ view->parent_ops->wined3d_object_destroyed(view->parent); + wined3d_resource_decref(view->resource); HeapFree(GetProcessHeap(), 0, view); } @@ -190,8 +193,8 @@ return view->parent; } -HRESULT CDECL wined3d_shader_resource_view_create(void *parent, const struct wined3d_parent_ops *parent_ops, - struct wined3d_shader_resource_view **view) +HRESULT CDECL wined3d_shader_resource_view_create(struct wined3d_resource *resource, void *parent, + const struct wined3d_parent_ops *parent_ops, struct wined3d_shader_resource_view **view) { struct wined3d_shader_resource_view *object; @@ -201,6 +204,8 @@ return E_OUTOFMEMORY; object->refcount = 1; + object->resource = resource; + wined3d_resource_incref(resource); object->parent = parent; object->parent_ops = parent_ops; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/wined3d_private.h wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/wined3d_private.h --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wined3d/wined3d_private.h 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wined3d/wined3d_private.h 2014-12-15 00:45:34.000000000 +0000 @@ -283,13 +283,18 @@ extern struct wined3d_settings wined3d_settings DECLSPEC_HIDDEN; -enum wined3d_sampler_texture_type +enum wined3d_shader_resource_type { - WINED3DSTT_UNKNOWN = 0, - WINED3DSTT_1D = 1, - WINED3DSTT_2D = 2, - WINED3DSTT_CUBE = 3, - WINED3DSTT_VOLUME = 4, + WINED3D_SHADER_RESOURCE_NONE, + WINED3D_SHADER_RESOURCE_BUFFER, + WINED3D_SHADER_RESOURCE_TEXTURE_1D, + WINED3D_SHADER_RESOURCE_TEXTURE_2D, + WINED3D_SHADER_RESOURCE_TEXTURE_2DMS, + WINED3D_SHADER_RESOURCE_TEXTURE_3D, + WINED3D_SHADER_RESOURCE_TEXTURE_CUBE, + WINED3D_SHADER_RESOURCE_TEXTURE_1DARRAY, + WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY, + WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY, }; #define WINED3D_SHADER_CONST_VS_F 0x00000001 @@ -342,6 +347,8 @@ WINED3D_DATA_RESOURCE, WINED3D_DATA_SAMPLER, WINED3D_DATA_UINT, + WINED3D_DATA_UNORM, + WINED3D_DATA_SNORM, }; enum wined3d_immconst_type @@ -569,6 +576,12 @@ BYTE minor; }; +struct wined3d_shader_resource_info +{ + enum wined3d_shader_resource_type type; + enum wined3d_data_type data_type; +}; + #define WINED3D_SHADER_VERSION(major, minor) (((major) << 8) | (minor)) struct wined3d_shader_reg_maps @@ -588,7 +601,7 @@ WORD local_bool_consts; /* MAX_CONST_B, 16 */ UINT cb_sizes[WINED3D_MAX_CBS]; - enum wined3d_sampler_texture_type sampler_type[max(MAX_FRAGMENT_SAMPLERS, MAX_VERTEX_SAMPLERS)]; + struct wined3d_shader_resource_info resource_info[max(MAX_FRAGMENT_SAMPLERS, MAX_VERTEX_SAMPLERS)]; BYTE bumpmat; /* MAX_TEXTURES, 8 */ BYTE luminanceparams; /* MAX_TEXTURES, 8 */ @@ -673,7 +686,8 @@ { enum wined3d_decl_usage usage; UINT usage_idx; - enum wined3d_sampler_texture_type sampler_type; + enum wined3d_shader_resource_type resource_type; + enum wined3d_data_type resource_data_type; struct wined3d_shader_dst_param reg; }; @@ -2663,6 +2677,7 @@ { LONG refcount; + struct wined3d_resource *resource; void *parent; const struct wined3d_parent_ops *parent_ops; }; @@ -2809,7 +2824,6 @@ /* Math utils */ void multiply_matrix(struct wined3d_matrix *dest, const struct wined3d_matrix *src1, const struct wined3d_matrix *src2) DECLSPEC_HIDDEN; -UINT wined3d_log2i(UINT32 x) DECLSPEC_HIDDEN; unsigned int count_bits(unsigned int mask) DECLSPEC_HIDDEN; void wined3d_release_dc(HWND window, HDC dc) DECLSPEC_HIDDEN; @@ -2909,7 +2923,7 @@ } u; }; -void pixelshader_update_samplers(struct wined3d_shader *shader, WORD tex_types) DECLSPEC_HIDDEN; +void pixelshader_update_resource_types(struct wined3d_shader *shader, WORD tex_types) DECLSPEC_HIDDEN; void find_ps_compile_args(const struct wined3d_state *state, const struct wined3d_shader *shader, BOOL position_transformed, struct ps_compile_args *args, const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wineoss.drv/mmdevdrv.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wineoss.drv/mmdevdrv.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wineoss.drv/mmdevdrv.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wineoss.drv/mmdevdrv.c 2014-12-15 00:45:34.000000000 +0000 @@ -150,9 +150,6 @@ static struct list g_devices = LIST_INIT(g_devices); -static const WCHAR drv_keyW[] = {'S','o','f','t','w','a','r','e','\\', - 'W','i','n','e','\\','D','r','i','v','e','r','s','\\', - 'w','i','n','e','o','s','s','.','d','r','v',0}; static const WCHAR drv_key_devicesW[] = {'S','o','f','t','w','a','r','e','\\', 'W','i','n','e','\\','D','r','i','v','e','r','s','\\', 'w','i','n','e','o','s','s','.','d','r','v','\\','d','e','v','i','c','e','s',0}; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/winex11.drv/opengl.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/winex11.drv/opengl.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/winex11.drv/opengl.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/winex11.drv/opengl.c 2014-12-15 00:45:34.000000000 +0000 @@ -272,13 +272,6 @@ /* X context to associate a struct gl_drawable to a pbuffer hdc */ static XContext gl_pbuffer_context; -static const struct gdi_dc_funcs glxdrv_funcs; - -static inline struct glx_physdev *get_glxdrv_dev( PHYSDEV dev ) -{ - return (struct glx_physdev *)dev; -} - static struct list context_list = LIST_INIT( context_list ); static struct WineGLInfo WineGLInfo = { 0 }; static struct wgl_pixel_format *pixel_formats; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/winhttp/net.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/winhttp/net.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/winhttp/net.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/winhttp/net.c 2014-12-15 00:45:34.000000000 +0000 @@ -740,16 +740,8 @@ if(!netconn_connected(conn)) return 0; - if(conn->secure) { + if(conn->secure) return conn->peek_len; - }else { -#ifdef FIONREAD - ULONG unread; - - if(!ioctlsocket(conn->socket, FIONREAD, &unread)) - return unread; -#endif - } return 0; } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/winhttp/request.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/winhttp/request.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/winhttp/request.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/winhttp/request.c 2014-12-15 00:45:34.000000000 +0000 @@ -1802,14 +1802,15 @@ } /* set the request content length based on the headers */ -static DWORD set_content_length( request_t *request ) +static DWORD set_content_length( request_t *request, DWORD status ) { WCHAR encoding[20]; - DWORD buflen; + DWORD buflen = sizeof(request->content_length); - buflen = sizeof(request->content_length); - if (!query_headers( request, WINHTTP_QUERY_CONTENT_LENGTH|WINHTTP_QUERY_FLAG_NUMBER, - NULL, &request->content_length, &buflen, NULL )) + if (status == HTTP_STATUS_NO_CONTENT || status == HTTP_STATUS_NOT_MODIFIED) + request->content_length = 0; + else if (!query_headers( request, WINHTTP_QUERY_CONTENT_LENGTH|WINHTTP_QUERY_FLAG_NUMBER, + NULL, &request->content_length, &buflen, NULL )) request->content_length = ~0u; buflen = sizeof(encoding); @@ -2148,6 +2149,7 @@ DWORD bytes_read; char buffer[2048]; + refill_buffer( request, FALSE ); for (;;) { if (!read_data( request, buffer, sizeof(buffer), &bytes_read, FALSE ) || !bytes_read) return; @@ -2301,7 +2303,7 @@ query = WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER; if (!(ret = query_headers( request, query, NULL, &status, &size, NULL ))) break; - set_content_length( request ); + set_content_length( request, status ); if (!(request->hdr.disable_flags & WINHTTP_DISABLE_COOKIES)) record_cookies( request ); @@ -2313,27 +2315,22 @@ if (!(ret = handle_redirect( request, status ))) break; /* recurse synchronously */ - send_request( request, NULL, 0, request->optional, request->optional_len, 0, 0, FALSE ); - continue; + if ((ret = send_request( request, NULL, 0, request->optional, request->optional_len, 0, 0, FALSE ))) continue; } else if (status == HTTP_STATUS_DENIED || status == HTTP_STATUS_PROXY_AUTH_REQ) { if (request->hdr.disable_flags & WINHTTP_DISABLE_AUTHENTICATION) break; drain_content( request ); - if (!handle_authorization( request, status )) - { - ret = TRUE; - break; - } + if (!handle_authorization( request, status )) break; + /* recurse synchronously */ - send_request( request, NULL, 0, request->optional, request->optional_len, 0, 0, FALSE ); - continue; + if ((ret = send_request( request, NULL, 0, request->optional, request->optional_len, 0, 0, FALSE ))) continue; } break; } - if (ret) refill_buffer( request, FALSE ); + if (request->content_length) refill_buffer( request, FALSE ); if (async) { @@ -2932,7 +2929,7 @@ request->bytes_read = 0; request->error = ERROR_SUCCESS; request->logon_policy = WINHTTP_AUTOLOGON_SECURITY_LEVEL_MEDIUM; - request->disable_feature = WINHTTP_DISABLE_AUTHENTICATION; + request->disable_feature = 0; request->proxy.dwAccessType = WINHTTP_ACCESS_TYPE_DEFAULT_PROXY; request->proxy.lpszProxy = NULL; request->proxy.lpszProxyBypass = NULL; @@ -2992,7 +2989,7 @@ path[uc.dwUrlPathLength + uc.dwExtraInfoLength] = 0; if (!(verb = strdupW( method ))) goto error; - if (V_VT( &async ) == VT_BOOL && V_BOOL( &async )) flags |= WINHTTP_FLAG_ASYNC; + if (SUCCEEDED( VariantChangeType( &async, &async, 0, VT_BOOL )) && V_BOOL( &async )) flags |= WINHTTP_FLAG_ASYNC; if (!(hsession = WinHttpOpen( user_agentW, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, NULL, NULL, flags ))) { err = get_last_error(); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/winhttp/tests/notification.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/winhttp/tests/notification.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/winhttp/tests/notification.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/winhttp/tests/notification.c 2014-12-15 00:45:34.000000000 +0000 @@ -186,6 +186,11 @@ setup_test( &info, winhttp_send_request, __LINE__ ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); + if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + { + skip("connection failed, skipping\n"); + goto done; + } ok(ret, "failed to send request %u\n", GetLastError()); setup_test( &info, winhttp_receive_response, __LINE__ ); @@ -209,6 +214,11 @@ setup_test( &info, winhttp_send_request, __LINE__ ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); + if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + { + skip("connection failed, skipping\n"); + goto done; + } ok(ret, "failed to send request %u\n", GetLastError()); setup_test( &info, winhttp_receive_response, __LINE__ ); @@ -253,6 +263,11 @@ setup_test( &info, winhttp_send_request, __LINE__ ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); + if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + { + skip("connection failed, skipping\n"); + goto done; + } ok(ret, "failed to send request %u\n", GetLastError()); setup_test( &info, winhttp_receive_response, __LINE__ ); @@ -276,6 +291,11 @@ setup_test( &info, winhttp_send_request, __LINE__ ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); + if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + { + skip("connection failed, skipping\n"); + goto done; + } ok(ret, "failed to send request %u\n", GetLastError()); setup_test( &info, winhttp_receive_response, __LINE__ ); @@ -288,6 +308,7 @@ ok(status == 200, "request failed unexpectedly %u\n", status); setup_test( &info, winhttp_close_handle, __LINE__ ); +done: WinHttpCloseHandle( req ); WinHttpCloseHandle( con ); WinHttpCloseHandle( ses ); @@ -353,6 +374,11 @@ setup_test( &info, winhttp_send_request, __LINE__ ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); + if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + { + skip("connection failed, skipping\n"); + goto done; + } ok(ret, "failed to send request %u\n", GetLastError()); setup_test( &info, winhttp_receive_response, __LINE__ ); @@ -365,6 +391,7 @@ ok(status == 200, "request failed unexpectedly %u\n", status); setup_test( &info, winhttp_close_handle, __LINE__ ); +done: WinHttpCloseHandle( req ); WinHttpCloseHandle( con ); WinHttpCloseHandle( ses ); @@ -435,6 +462,15 @@ setup_test( &info, winhttp_send_request, __LINE__ ); ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); + if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + { + skip("connection failed, skipping\n"); + WinHttpCloseHandle( req ); + WinHttpCloseHandle( con ); + WinHttpCloseHandle( ses ); + CloseHandle( info.wait ); + return; + } ok(ret, "failed to send request %u\n", GetLastError()); WaitForSingleObject( info.wait, INFINITE ); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/winhttp/tests/url.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/winhttp/tests/url.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/winhttp/tests/url.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/winhttp/tests/url.c 2014-12-15 00:45:34.000000000 +0000 @@ -38,40 +38,37 @@ static const WCHAR url1[] = {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; -static const WCHAR url2[] = - {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e', - '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; -static const WCHAR url3[] = {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':',0}; -static const WCHAR url4[] = +static const WCHAR url2[] = {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':',0}; +static const WCHAR url3[] = {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; -static const WCHAR url5[] = {'h','t','t','p',':','/','/',0}; -static const WCHAR url6[] = +static const WCHAR url4[] = {'h','t','t','p',':','/','/',0}; +static const WCHAR url5[] = {'f','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g',':','8','0','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; -static const WCHAR url7[] = +static const WCHAR url6[] = {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g',':','4','2','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; -static const WCHAR url8[] = +static const WCHAR url7[] = {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','s','i','t','e','/','a','b','o','u','t', '%','2','0','!','%','2','2','%','2','3','$','%','2','5','&','\'','(',')','*','+',',','-','.','/',':',';','%','3','C','=','%','3','E','?','@','%', '5','B','%','5','C','%','5','D','%','5','E','_','%','6','0','%','7','B','%','7','C','%','7','D','%','7','E',0}; -static const WCHAR url9[] = +static const WCHAR url8[] = {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g',':','0','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; -static const WCHAR url10[] = +static const WCHAR url9[] = {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g',':','8','0','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; -static const WCHAR url11[] = +static const WCHAR url10[] = {'h','t','t','p','s',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', '@','w','w','w','.','w','i','n','e','h','q','.','o','r','g',':','4','4','3','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0}; -static const WCHAR url12[] = +static const WCHAR url11[] = {'h','t','t','p',':','/','/','e','x','a','m','p','l','e','.','n','e','t','/','p','a','t','h','?','v','a','r','1','=','e','x','a','m','p','l','e','@','e','x','a','m','p','l','e','.','c','o','m','&','v','a','r','2','=','x','&','v','a','r','3','=','y', 0}; -static const WCHAR url13[] = +static const WCHAR url12[] = {'h','t','t','p','s',':','/','/','t','o','o','l','s','.','g','o','o','g','l','e','.','c','o','m','/','s','e','r','v','i','c','e','/','u','p','d','a','t','e','2','?','w','=','3',':','B','x','D','H','o','W','y','8','e','z','M',0}; -static const WCHAR url14[] = +static const WCHAR url13[] = {'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o',' ','g','/','p','a','t','h',' ','w','i','t','h',' ','s','p','a','c','e','s',0}; -static const WCHAR url15[] = {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','t','e','s','t',0}; +static const WCHAR url14[] = {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g','/','t','e','s','t',0}; static const WCHAR url_k1[] = {'h','t','t','p',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d', @@ -214,7 +211,7 @@ ret = WinHttpCreateUrl( &uc, 0, url, &len ); ok( ret, "expected success\n" ); ok( len == 56, "expected len 56 got %u\n", len ); - ok( !lstrcmpW( url, url3 ), "url doesn't match\n" ); + ok( !lstrcmpW( url, url2 ), "url doesn't match\n" ); /* valid password, NULL username */ fill_url_components( &uc ); @@ -243,7 +240,7 @@ ret = WinHttpCreateUrl( &uc, 0, url, &len ); ok( ret, "expected success\n" ); ok( len == 38, "expected len 38 got %u\n", len ); - ok( !lstrcmpW( url, url4 ), "url doesn't match\n" ); + ok( !lstrcmpW( url, url3 ), "url doesn't match\n" ); /* empty username, empty password */ fill_url_components( &uc ); @@ -254,7 +251,7 @@ ret = WinHttpCreateUrl( &uc, 0, url, &len ); ok( ret, "expected success\n" ); ok( len == 56, "expected len 56 got %u\n", len ); - ok( !lstrcmpW( url, url5 ), "url doesn't match\n" ); + ok( !lstrcmpW( url, url4 ), "url doesn't match\n" ); /* nScheme has lower precedence than lpszScheme */ fill_url_components( &uc ); @@ -264,8 +261,8 @@ len = 256; ret = WinHttpCreateUrl( &uc, 0, url, &len ); ok( ret, "expected success\n" ); - ok( len == lstrlenW( url6 ), "expected len %d got %u\n", lstrlenW( url6 ) + 1, len ); - ok( !lstrcmpW( url, url6 ), "url doesn't match\n" ); + ok( len == lstrlenW( url5 ), "expected len %d got %u\n", lstrlenW( url5 ) + 1, len ); + ok( !lstrcmpW( url, url5 ), "url doesn't match\n" ); /* non-standard port */ uc.lpszScheme = http; @@ -276,7 +273,7 @@ ret = WinHttpCreateUrl( &uc, 0, url, &len ); ok( ret, "expected success\n" ); ok( len == 59, "expected len 59 got %u\n", len ); - ok( !lstrcmpW( url, url7 ), "url doesn't match\n" ); + ok( !lstrcmpW( url, url6 ), "url doesn't match\n" ); /* escape extra info */ fill_url_components( &uc ); @@ -287,7 +284,7 @@ ret = WinHttpCreateUrl( &uc, ICU_ESCAPE, url, &len ); ok( ret, "expected success\n" ); ok( len == 113, "expected len 113 got %u\n", len ); - ok( !lstrcmpW( url, url8 ), "url doesn't match\n" ); + ok( !lstrcmpW( url, url7 ), "url doesn't match\n" ); /* NULL lpszScheme, 0 nScheme and nPort */ fill_url_components( &uc ); @@ -300,7 +297,7 @@ ret = WinHttpCreateUrl( &uc, 0, url, &len ); ok( ret, "expected success\n" ); ok( len == 58, "expected len 58 got %u\n", len ); - ok( !lstrcmpW( url, url9 ), "url doesn't match\n" ); + ok( !lstrcmpW( url, url8 ), "url doesn't match\n" ); HeapFree( GetProcessHeap(), 0, url ); } @@ -480,7 +477,7 @@ ok( uc.dwExtraInfoLength == 0, "unexpected extra info length: %u\n", uc.dwExtraInfoLength ); reset_url_components( &uc ); - ret = WinHttpCrackUrl( url5, 0, 0, &uc ); + ret = WinHttpCrackUrl( url4, 0, 0, &uc ); ok( !ret, "WinHttpCrackUrl succeeded\n" ); reset_url_components( &uc ); @@ -496,7 +493,7 @@ /* decoding without buffers */ reset_url_components( &uc ); SetLastError(0xdeadbeef); - ret = WinHttpCrackUrl( url8, 0, ICU_DECODE, &uc ); + ret = WinHttpCrackUrl( url7, 0, ICU_DECODE, &uc ); error = GetLastError(); ok( !ret, "WinHttpCrackUrl succeeded\n" ); ok( error == ERROR_INVALID_PARAMETER, "got %u, expected ERROR_INVALID_PARAMETER\n", error ); @@ -517,7 +514,7 @@ uc.dwExtraInfoLength = 40; path[0] = 0; - ret = WinHttpCrackUrl( url8, 0, ICU_DECODE, &uc ); + ret = WinHttpCrackUrl( url7, 0, ICU_DECODE, &uc ); ok( ret, "WinHttpCrackUrl failed %u\n", GetLastError() ); ok( !memcmp( uc.lpszUrlPath + 11, escape, 21 * sizeof(WCHAR) ), "unexpected path\n" ); ok( uc.dwUrlPathLength == 32, "unexpected path length %u\n", uc.dwUrlPathLength ); @@ -541,7 +538,7 @@ uc.dwExtraInfoLength = 20; path[0] = 0; - ret = WinHttpCrackUrl( url7, 0, 0, &uc ); + ret = WinHttpCrackUrl( url6, 0, 0, &uc ); ok( ret, "WinHttpCrackUrl failed le=%u\n", GetLastError() ); ok( !memcmp( uc.lpszHostName, winehq, sizeof(winehq) ), "unexpected host name: %s\n", wine_dbgstr_w(uc.lpszHostName) ); ok( uc.dwHostNameLength == 14, "unexpected host name length: %d\n", uc.dwHostNameLength ); @@ -549,17 +546,17 @@ /* decoding without buffers */ reset_url_components( &uc ); - ret = WinHttpCrackUrl( url9, 0, 0, &uc ); + ret = WinHttpCrackUrl( url8, 0, 0, &uc ); ok( ret, "WinHttpCrackUrl failed le=%u\n", GetLastError() ); ok( uc.nPort == 0, "unexpected port: %u\n", uc.nPort ); reset_url_components( &uc ); - ret = WinHttpCrackUrl( url10, 0, 0, &uc ); + ret = WinHttpCrackUrl( url9, 0, 0, &uc ); ok( ret, "WinHttpCrackUrl failed le=%u\n", GetLastError() ); ok( uc.nPort == 80, "unexpected port: %u\n", uc.nPort ); reset_url_components( &uc ); - ret = WinHttpCrackUrl( url11, 0, 0, &uc ); + ret = WinHttpCrackUrl( url10, 0, 0, &uc ); ok( ret, "WinHttpCrackUrl failed le=%u\n", GetLastError() ); ok( uc.nPort == 443, "unexpected port: %u\n", uc.nPort ); @@ -578,19 +575,19 @@ ok( error == ERROR_WINHTTP_UNRECOGNIZED_SCHEME, "got %u, expected ERROR_WINHTTP_UNRECOGNIZED_SCHEME\n", error ); reset_url_components( &uc ); - ret = WinHttpCrackUrl( url12, 0, 0, &uc); + ret = WinHttpCrackUrl( url11, 0, 0, &uc); ok( ret, "WinHttpCrackUrl failed le=%u\n", GetLastError() ); ok( uc.nScheme == INTERNET_SCHEME_HTTP, "unexpected scheme\n" ); - ok( uc.lpszScheme == url12,"unexpected scheme\n" ); + ok( uc.lpszScheme == url11,"unexpected scheme\n" ); ok( uc.dwSchemeLength == 4, "unexpected scheme length\n" ); ok( uc.lpszUserName == NULL, "unexpected username\n" ); ok( uc.lpszPassword == NULL, "unexpected password\n" ); - ok( uc.lpszHostName == url12 + 7, "unexpected hostname\n" ); + ok( uc.lpszHostName == url11 + 7, "unexpected hostname\n" ); ok( uc.dwHostNameLength == 11, "unexpected hostname length\n" ); ok( uc.nPort == 80, "unexpected port: %u\n", uc.nPort ); - ok( uc.lpszUrlPath == url12 + 18, "unexpected path\n" ); + ok( uc.lpszUrlPath == url11 + 18, "unexpected path\n" ); ok( uc.dwUrlPathLength == 5, "unexpected path length\n" ); - ok( uc.lpszExtraInfo == url12 + 23, "unexpected extra info\n" ); + ok( uc.lpszExtraInfo == url11 + 23, "unexpected extra info\n" ); ok( uc.dwExtraInfoLength == 39, "unexpected extra info length\n" ); uc.lpszScheme = scheme; @@ -606,7 +603,7 @@ uc.lpszExtraInfo = NULL; uc.dwExtraInfoLength = 0; uc.nPort = 0; - ret = WinHttpCrackUrl( url13, 0, ICU_DECODE, &uc ); + ret = WinHttpCrackUrl( url12, 0, ICU_DECODE, &uc ); ok( ret, "WinHttpCrackUrl failed le=%u\n", GetLastError() ); uc.lpszScheme = scheme; @@ -622,7 +619,7 @@ uc.lpszExtraInfo = NULL; uc.dwExtraInfoLength = 0; uc.nPort = 0; - ret = WinHttpCrackUrl( url14, 0, ICU_ESCAPE|ICU_DECODE, &uc ); + ret = WinHttpCrackUrl( url13, 0, ICU_ESCAPE|ICU_DECODE, &uc ); ok( ret, "WinHttpCrackUrl failed le=%u\n", GetLastError() ); ok( !lstrcmpW( uc.lpszHostName, hostnameW ), "unexpected host name\n" ); ok( !lstrcmpW( uc.lpszUrlPath, pathW ), "unexpected path\n" ); @@ -642,19 +639,19 @@ uc.dwUrlPathLength = ~0u; uc.lpszExtraInfo = NULL; uc.dwExtraInfoLength = ~0u; - ret = WinHttpCrackUrl( url15, 0, 0, &uc ); + ret = WinHttpCrackUrl( url14, 0, 0, &uc ); ok( ret, "WinHttpCrackUrl failed le=%u\n", GetLastError() ); ok( !uc.lpszScheme, "unexpected scheme %s\n", wine_dbgstr_w(uc.lpszScheme) ); ok( !uc.dwSchemeLength, "unexpected length %u\n", uc.dwSchemeLength ); ok( uc.nScheme == INTERNET_SCHEME_HTTP, "unexpected scheme %u\n", uc.nScheme ); - ok( !lstrcmpW( uc.lpszHostName, url15 + 7 ), "unexpected hostname %s\n", wine_dbgstr_w(uc.lpszHostName) ); + ok( !lstrcmpW( uc.lpszHostName, url14 + 7 ), "unexpected hostname %s\n", wine_dbgstr_w(uc.lpszHostName) ); ok( uc.dwHostNameLength == 14, "unexpected length %u\n", uc.dwHostNameLength ); ok( uc.nPort == 80, "unexpected port %u\n", uc.nPort ); ok( !uc.lpszUserName, "unexpected username\n" ); ok( !uc.dwUserNameLength, "unexpected length %u\n", uc.dwUserNameLength ); ok( !uc.lpszPassword, "unexpected password\n" ); ok( !uc.dwPasswordLength, "unexpected length %u\n", uc.dwPasswordLength ); - ok( !lstrcmpW( uc.lpszUrlPath, url15 + 21 ), "unexpected path %s\n", wine_dbgstr_w(uc.lpszUrlPath) ); + ok( !lstrcmpW( uc.lpszUrlPath, url14 + 21 ), "unexpected path %s\n", wine_dbgstr_w(uc.lpszUrlPath) ); ok( uc.dwUrlPathLength == 5, "unexpected length %u\n", uc.dwUrlPathLength ); ok( !uc.lpszExtraInfo[0], "unexpected extra info %s\n", wine_dbgstr_w(uc.lpszExtraInfo) ); ok( uc.dwExtraInfoLength == 0, "unexpected length %u\n", uc.dwExtraInfoLength ); @@ -675,7 +672,7 @@ uc.lpszExtraInfo = NULL; uc.dwExtraInfoLength = 0; SetLastError( 0xdeadbeef ); - ret = WinHttpCrackUrl( url15, 0, 0, &uc ); + ret = WinHttpCrackUrl( url14, 0, 0, &uc ); error = GetLastError(); ok( !ret, "WinHttpCrackUrl succeeded\n" ); ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error ); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/winhttp/tests/winhttp.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/winhttp/tests/winhttp.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/winhttp/tests/winhttp.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/winhttp/tests/winhttp.c 2014-12-15 00:45:34.000000000 +0000 @@ -954,7 +954,7 @@ ok(req != NULL, "failed to open a request %u\n", GetLastError()); ret = WinHttpSendRequest(req, NULL, 0, NULL, 0, 0, 0); - if (!ret && GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT) + if (!ret && (GetLastError() == ERROR_WINHTTP_CANNOT_CONNECT || GetLastError() == ERROR_WINHTTP_TIMEOUT)) { skip("connection failed, skipping\n"); goto done; @@ -1801,6 +1801,10 @@ "Server: winetest\r\n" "\r\n"; +static const char notmodified[] = +"HTTP/1.1 304 Not Modified\r\n" +"\r\n"; + static const char noauthmsg[] = "HTTP/1.1 401 Unauthorized\r\n" "Server: winetest\r\n" @@ -1808,6 +1812,12 @@ "WWW-Authenticate: Basic realm=\"placebo\"\r\n" "\r\n"; +static const char okauthmsg[] = +"HTTP/1.1 200 OK\r\n" +"Server: winetest\r\n" +"Connection: close\r\n" +"\r\n"; + struct server_info { HANDLE event; @@ -1869,7 +1879,7 @@ if (strstr(buffer, "/auth")) { if (strstr(buffer, "Authorization: Basic dXNlcjpwd2Q=")) - send(c, okmsg, sizeof okmsg - 1, 0); + send(c, okauthmsg, sizeof okauthmsg - 1, 0); else send(c, noauthmsg, sizeof noauthmsg - 1, 0); } @@ -1888,6 +1898,11 @@ { send(c, nocontentmsg, sizeof nocontentmsg - 1, 0); } + if (strstr(buffer, "GET /not_modified")) + { + send(c, notmodified, sizeof notmodified - 1, 0); + Sleep(6000); + } if (strstr(buffer, "GET /quit")) { send(c, okmsg, sizeof okmsg - 1, 0); @@ -2129,7 +2144,7 @@ { static const WCHAR no_contentW[] = {'/','n','o','_','c','o','n','t','e','n','t',0}; HINTERNET ses, con, req; - WCHAR buf[128]; + char buf[128]; DWORD size, len = sizeof(buf), bytes_read, status; BOOL ret; @@ -2181,6 +2196,7 @@ ok(size == 0, "expected 0, got %d\n", size); ret = WinHttpReadData(req, buf, len, &bytes_read); + ok(ret, "expected success\n"); ok( bytes_read == 0, "expected 0, got %u available\n", bytes_read ); size = 12345; @@ -2202,6 +2218,55 @@ WinHttpCloseHandle(ses); } +static void test_not_modified(int port) +{ + static const WCHAR pathW[] = {'/','n','o','t','_','m','o','d','i','f','i','e','d',0}; + static const WCHAR ifmodifiedW[] = {'I','f','-','M','o','d','i','f','i','e','d','-','S','i','n','c','e',':',' '}; + BOOL ret; + HINTERNET session, request, connection; + DWORD status, size, start = GetTickCount(); + SYSTEMTIME st; + WCHAR today[(sizeof(ifmodifiedW) + WINHTTP_TIME_FORMAT_BUFSIZE)/sizeof(WCHAR) + 3]; + + memcpy(today, ifmodifiedW, sizeof(ifmodifiedW)); + GetSystemTime(&st); + WinHttpTimeFromSystemTime(&st, &today[sizeof(ifmodifiedW)/sizeof(WCHAR)]); + + session = WinHttpOpen(test_useragent, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, + WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); + ok(session != NULL, "WinHttpOpen failed: %u\n", GetLastError()); + + connection = WinHttpConnect(session, localhostW, port, 0); + ok(connection != NULL, "WinHttpConnect failed: %u\n", GetLastError()); + + request = WinHttpOpenRequest(connection, NULL, pathW, NULL, WINHTTP_NO_REFERER, + WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_BYPASS_PROXY_CACHE); + ok(request != NULL, "WinHttpOpenrequest failed: %u\n", GetLastError()); + + ret = WinHttpSendRequest(request, today, ~0u, NULL, 0, 0, 0); + ok(ret, "WinHttpSendRequest failed: %u\n", GetLastError()); + + ret = WinHttpReceiveResponse(request, NULL); + ok(ret, "WinHttpReceiveResponse failed: %u\n", GetLastError()); + + size = sizeof(status); + ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_STATUS_CODE|WINHTTP_QUERY_FLAG_NUMBER, + NULL, &status, &size, NULL); + ok(ret, "WinHttpQueryHeaders failed: %u\n", GetLastError()); + ok(status == HTTP_STATUS_NOT_MODIFIED, "got %u\n", status); + + size = 0xdeadbeef; + ret = WinHttpQueryDataAvailable(request, &size); + ok(ret, "WinHttpQueryDataAvailable failed: %u\n", GetLastError()); + ok(!size, "got %u\n", size); + + WinHttpCloseHandle(request); + WinHttpCloseHandle(connection); + WinHttpCloseHandle(session); + start = GetTickCount() - start; + ok(start <= 2000, "Expected less than 2 seconds for the test, got %u ms\n", start); +} + static void test_bad_header( int port ) { static const WCHAR bad_headerW[] = @@ -2870,6 +2935,23 @@ hr = IWinHttpRequest_Release( req ); ok( hr == S_OK, "got %08x\n", hr ); + hr = CoCreateInstance( &CLSID_WinHttpRequest, NULL, CLSCTX_INPROC_SERVER, &IID_IWinHttpRequest, (void **)&req ); + ok( hr == S_OK, "got %08x\n", hr ); + + V_VT( &async ) = VT_I4; + V_I4( &async ) = 1; + hr = IWinHttpRequest_Open( req, method, url, async ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = IWinHttpRequest_Send( req, empty ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = IWinHttpRequest_WaitForResponse( req, timeout, &succeeded ); + ok( hr == S_OK, "got %08x\n", hr ); + + hr = IWinHttpRequest_Release( req ); + ok( hr == S_OK, "got %08x\n", hr ); + SysFreeString( method ); SysFreeString( url ); SysFreeString( username ); @@ -3044,12 +3126,8 @@ options.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DNS_A; memset( &info, 0, sizeof(info) ); - SetLastError(0xdeadbeef); ret = WinHttpGetProxyForUrl( session, urlW, &options, &info ); - error = GetLastError(); - if (!ret) ok( error == ERROR_WINHTTP_AUTODETECTION_FAILED || - error == ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT, "got %u\n", error ); - else + if (ret) { trace("Proxy.AccessType=%u\n", info.dwAccessType); trace("Proxy.Proxy=%s\n", wine_dbgstr_w(info.lpszProxy)); @@ -3063,11 +3141,8 @@ options.lpszAutoConfigUrl = wpadW; memset( &info, 0, sizeof(info) ); - SetLastError(0xdeadbeef); ret = WinHttpGetProxyForUrl( session, urlW, &options, &info ); - error = GetLastError(); - if (!ret) ok( error == ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT, "got %u\n", error ); - else + if (ret) { trace("Proxy.AccessType=%u\n", info.dwAccessType); trace("Proxy.Proxy=%s\n", wine_dbgstr_w(info.lpszProxy)); @@ -3201,6 +3276,7 @@ test_basic_request(si.port, NULL, basicW); test_no_headers(si.port); test_no_content(si.port); + test_not_modified(si.port); test_basic_authentication(si.port); test_bad_header(si.port); test_multiple_reads(si.port); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/winhttp/winhttp_private.h wine-compholio-1.7.33~ubuntu15.04.1/dlls/winhttp/winhttp_private.h --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/winhttp/winhttp_private.h 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/winhttp/winhttp_private.h 2014-12-15 00:45:34.000000000 +0000 @@ -194,7 +194,7 @@ BOOL read_chunked_size; /* chunk size remaining */ DWORD read_pos; /* current read position in read_buf */ DWORD read_size; /* valid data size in read_buf */ - char read_buf[4096]; /* buffer for already read but not returned data */ + char read_buf[8192]; /* buffer for already read but not returned data */ header_t *headers; DWORD num_headers; WCHAR **accept_types; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wininet/http.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wininet/http.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wininet/http.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wininet/http.c 2014-12-15 00:45:34.000000000 +0000 @@ -77,7 +77,6 @@ static const WCHAR g_szHttp1_0[] = {'H','T','T','P','/','1','.','0',0}; static const WCHAR g_szHttp1_1[] = {'H','T','T','P','/','1','.','1',0}; static const WCHAR szOK[] = {'O','K',0}; -static const WCHAR szDefaultHeader[] = {'H','T','T','P','/','1','.','0',' ','2','0','0',' ','O','K',0}; static const WCHAR hostW[] = { 'H','o','s','t',0 }; static const WCHAR szAuthorization[] = { 'A','u','t','h','o','r','i','z','a','t','i','o','n',0 }; static const WCHAR szProxy_Authorization[] = { 'P','r','o','x','y','-','A','u','t','h','o','r','i','z','a','t','i','o','n',0 }; @@ -85,7 +84,6 @@ static const WCHAR szKeepAlive[] = {'K','e','e','p','-','A','l','i','v','e',0}; static const WCHAR szGET[] = { 'G','E','T', 0 }; static const WCHAR szHEAD[] = { 'H','E','A','D', 0 }; -static const WCHAR szCrLf[] = {'\r','\n', 0}; static const WCHAR szAccept[] = { 'A','c','c','e','p','t',0 }; static const WCHAR szAccept_Charset[] = { 'A','c','c','e','p','t','-','C','h','a','r','s','e','t', 0 }; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/winmm/joystick.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/winmm/joystick.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/winmm/joystick.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/winmm/joystick.c 2014-12-15 00:45:34.000000000 +0000 @@ -219,7 +219,8 @@ { TRACE("(%d, %p);\n", wID, lpInfo); - if (wID >= MAXJOYSTICK) return JOYERR_PARMS; + if (!lpInfo) return MMSYSERR_INVALPARAM; + if (wID >= MAXJOYSTICK || lpInfo->dwSize < sizeof(JOYINFOEX)) return JOYERR_PARMS; if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER; lpInfo->dwXpos = 0; @@ -244,6 +245,7 @@ { TRACE("(%d, %p);\n", wID, lpInfo); + if (!lpInfo) return MMSYSERR_INVALPARAM; if (wID >= MAXJOYSTICK) return JOYERR_PARMS; if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER; @@ -277,11 +279,14 @@ if (wID >= MAXJOYSTICK) return JOYERR_PARMS; if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER; - if (!JOY_Sticks[wID].hCapture) return JOYERR_NOCANDO; - - KillTimer(JOY_Sticks[wID].hCapture, JOY_Sticks[wID].wTimer); - JOY_Sticks[wID].hCapture = 0; - JOY_Sticks[wID].wTimer = 0; + if (JOY_Sticks[wID].hCapture) + { + KillTimer(JOY_Sticks[wID].hCapture, JOY_Sticks[wID].wTimer); + JOY_Sticks[wID].hCapture = 0; + JOY_Sticks[wID].wTimer = 0; + } + else + TRACE("Joystick is not captured, ignoring request.\n"); return JOYERR_NOERROR; } @@ -294,7 +299,8 @@ TRACE("(%p, %04X, %d, %d);\n", hWnd, wID, wPeriod, bChanged); if (wID >= MAXJOYSTICK || hWnd == 0) return JOYERR_PARMS; - if (wPeriodJOY_PERIOD_MAX) return JOYERR_PARMS; + if (wPeriodJOY_PERIOD_MAX) wPeriod = JOY_PERIOD_MAX; if (!JOY_LoadDriver(wID)) return MMSYSERR_NODRIVER; if (JOY_Sticks[wID].hCapture || !IsWindow(hWnd)) @@ -319,7 +325,7 @@ { TRACE("(%04X, %d);\n", wID, wThreshold); - if (wID >= MAXJOYSTICK) return MMSYSERR_INVALPARAM; + if (wID >= MAXJOYSTICK || wThreshold > 65535) return MMSYSERR_INVALPARAM; JOY_Sticks[wID].threshold = wThreshold; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/winmm/tests/joystick.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/winmm/tests/joystick.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/winmm/tests/joystick.c 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/winmm/tests/joystick.c 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,205 @@ +/* + * Unit tests for joystick APIs + * + * Copyright 2014 Bruno Jesus + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "mmsystem.h" +#include "wine/test.h" + +static HWND window; + +static LRESULT CALLBACK proc_window(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + return DefWindowProcA(hwnd, msg, wparam, lparam); +} + +static void create_window(void) +{ + const char name[] = "Joystick Test"; + WNDCLASSA wc; + + memset(&wc, 0, sizeof(wc)); + wc.lpfnWndProc = proc_window; + wc.hInstance = 0; + wc.lpszClassName = name; + RegisterClassA(&wc); + window = CreateWindowExA(0, name, name, WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + NULL, NULL, NULL, NULL); + ok(window != NULL, "Expected CreateWindowEx to work, error %d\n", GetLastError()); +} + +static void destroy_window(void) +{ + DestroyWindow(window); + window = NULL; +} + +static void test_api(void) +{ + MMRESULT ret; + JOYCAPSA jc; + JOYCAPSW jcw; + JOYINFO info; + union _infoex + { + JOYINFOEX ex; + char buffer[sizeof(JOYINFOEX) * 2]; + } infoex; + UINT i, par, devices, joyid, win98 = 0, win8 = 0; + UINT period[] = {0, 1, 9, 10, 100, 1000, 1001, 10000, 65535, 65536, 0xFFFFFFFF}; + UINT threshold_error = 0x600, period_win8_error = 0x7CE; + UINT flags[] = { JOY_RETURNALL, JOY_RETURNBUTTONS, JOY_RETURNCENTERED, JOY_RETURNPOV, + JOY_RETURNPOVCTS, JOY_RETURNR, JOY_RETURNRAWDATA, JOY_RETURNU, + JOY_RETURNV, JOY_RETURNX, JOY_RETURNY, JOY_RETURNZ }; + + devices = joyGetNumDevs(); + joyid = -1; + /* joyGetNumDevs does NOT return the number of joysticks connected, only slots in the OS */ + for (i = 0; i < devices; i++) + { + memset(&jc, 0, sizeof(jc)); + ret = joyGetDevCapsA(JOYSTICKID1 + i, &jc, sizeof(jc)); + if (ret == JOYERR_NOERROR) + { + joyid = JOYSTICKID1 + i; + trace("Joystick[%d] - name: '%s', axes: %d, buttons: %d, period range: %d - %d\n", + JOYSTICKID1 + i, jc.szPname, jc.wNumAxes, jc.wNumButtons, jc.wPeriodMin, jc.wPeriodMax); + ret = joyGetDevCapsW(JOYSTICKID1 + i, &jcw, sizeof(jcw)); + if (ret != MMSYSERR_NOTSUPPORTED) /* Win 98 */ + { + ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret); + ok(jc.wNumAxes == jcw.wNumAxes, "Expected %d == %d\n", jc.wNumAxes, jcw.wNumAxes); + ok(jc.wNumButtons == jcw.wNumButtons, "Expected %d == %d\n", jc.wNumButtons, jcw.wNumButtons); + } + else win98++; + break; + } + else + { + ok(ret == JOYERR_PARMS, "Expected %d, got %d\n", JOYERR_PARMS, ret); + ret = joyGetDevCapsW(JOYSTICKID1 + i, &jcw, sizeof(jcw)); + ok(ret == JOYERR_PARMS || (ret == MMSYSERR_NOTSUPPORTED) /* Win 98 */, + "Expected %d, got %d\n", JOYERR_PARMS, ret); + } + } + /* Test invalid joystick - If no joystick is present the driver is not initialized, + * so a NODRIVER error is returned, if at least one joystick is present the error is + * about invalid parameters. */ + ret = joyGetDevCapsA(joyid + devices, &jc, sizeof(jc)); + ok(ret == MMSYSERR_NODRIVER || ret == JOYERR_PARMS, + "Expected %d or %d, got %d\n", MMSYSERR_NODRIVER, JOYERR_PARMS, ret); + + if (joyid == -1) + { + skip("This test requires a real joystick.\n"); + return; + } + + /* Capture tests */ + ret = joySetCapture(NULL, joyid, 100, FALSE); + ok(ret == JOYERR_PARMS || broken(win98 && ret == MMSYSERR_INVALPARAM) /* Win 98 */, + "Expected %d, got %d\n", JOYERR_PARMS, ret); + ret = joySetCapture(window, joyid, 100, FALSE); + ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret); + ret = joySetCapture(window, joyid, 100, FALSE); /* double capture */ + if (ret == JOYERR_NOCANDO) + { + todo_wine + ok(broken(1), "Expected double capture using joySetCapture to work\n"); + if (!win98 && broken(1)) win8++; /* Windows 98 or 8 cannot cope with that */ + } + else ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret); + ret = joyReleaseCapture(joyid); + ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret); + ret = joyReleaseCapture(joyid); + ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret); /* double release */ + + /* Try some unusual period values for joySetCapture and unusual threshold values for joySetThreshold. + * Windows XP allows almost all test values, Windows 8 will return error on most test values, Windows + * 98 allows anything but cuts the values to their maximum supported values internally. */ + for (i = 0; i < sizeof(period) / sizeof(period[0]); i++) + { + ret = joySetCapture(window, joyid, period[i], FALSE); + if (win8 && ((1 << i) & period_win8_error)) + ok(ret == JOYERR_NOCANDO, "Test [%d]: Expected %d, got %d\n", i, JOYERR_NOCANDO, ret); + else + ok(ret == JOYERR_NOERROR, "Test [%d]: Expected %d, got %d\n", i, JOYERR_NOERROR, ret); + ret = joyReleaseCapture(joyid); + ok(ret == JOYERR_NOERROR, "Test [%d]: Expected %d, got %d\n", i, JOYERR_NOERROR, ret); + /* Reuse the periods to test the threshold */ + ret = joySetThreshold(joyid, period[i]); + if (!win98 && (1 << i) & threshold_error) + ok(ret == MMSYSERR_INVALPARAM, "Test [%d]: Expected %d, got %d\n", i, MMSYSERR_INVALPARAM, ret); + else + ok(ret == JOYERR_NOERROR, "Test [%d]: Expected %d, got %d\n", i, JOYERR_NOERROR, ret); + par = 0xdead; + ret = joyGetThreshold(joyid, &par); + ok(ret == JOYERR_NOERROR, "Test [%d]: Expected %d, got %d\n", i, JOYERR_NOERROR, ret); + if (!win98 || (win98 && i < 8)) + { + if ((1 << i) & threshold_error) + ok(par == period[8], "Test [%d]: Expected %d, got %d\n", i, period[8], par); + else + ok(par == period[i], "Test [%d]: Expected %d, got %d\n", i, period[i], par); + } + } + + /* Position tests */ + ret = joyGetPos(joyid, NULL); + ok(ret == MMSYSERR_INVALPARAM, "Expected %d, got %d\n", MMSYSERR_INVALPARAM, ret); + ret = joyGetPos(joyid, &info); + ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret); + ret = joyGetPosEx(joyid, NULL); + ok(ret == MMSYSERR_INVALPARAM || broken(win8 && ret == JOYERR_PARMS) /* Win 8 */, + "Expected %d, got %d\n", MMSYSERR_INVALPARAM, ret); + memset(&infoex, 0, sizeof(infoex)); + ret = joyGetPosEx(joyid, &infoex.ex); + ok(ret == JOYERR_PARMS || broken(win98 && ret == MMSYSERR_INVALPARAM), + "Expected %d, got %d\n", JOYERR_PARMS, ret); + infoex.ex.dwSize = sizeof(infoex.ex); + ret = joyGetPosEx(joyid, &infoex.ex); + ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret); + infoex.ex.dwSize = sizeof(infoex.ex) - 1; + ret = joyGetPosEx(joyid, &infoex.ex); + ok(ret == JOYERR_PARMS || broken(win98 && ret == MMSYSERR_INVALPARAM), + "Expected %d, got %d\n", JOYERR_PARMS, ret); + infoex.ex.dwSize = sizeof(infoex); + ret = joyGetPosEx(joyid, &infoex.ex); + ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret); + + infoex.ex.dwSize = sizeof(infoex.ex); + for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) + { + infoex.ex.dwFlags = flags[i]; + ret = joyGetPosEx(joyid, &infoex.ex); + ok(ret == JOYERR_NOERROR, "Expected %d, got %d\n", JOYERR_NOERROR, ret); + } +} + +START_TEST(joystick) +{ + create_window(); + test_api(); + destroy_window(); +} diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/winmm/tests/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/dlls/winmm/tests/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/winmm/tests/Makefile.in 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/winmm/tests/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -4,6 +4,7 @@ C_SRCS = \ capture.c \ generated.c \ + joystick.c \ mci.c \ mcicda.c \ midi.c \ diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/winmm/waveform.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/winmm/waveform.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/winmm/waveform.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/winmm/waveform.c 2014-12-15 00:45:34.000000000 +0000 @@ -68,8 +68,8 @@ * - We must be able to identify bad devices without crashing. */ -/* buffer size = 100 * 100000 (100 ns) = 1 second */ -#define AC_BUFLEN (100 * 100000) +/* buffer size = 10 * 100000 (100 ns) = 0.1 seconds */ +#define AC_BUFLEN (10 * 100000) #define MAX_DEVICES 256 #define MAPPER_INDEX 0x3F diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/winspool.drv/info.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/winspool.drv/info.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/winspool.drv/info.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/winspool.drv/info.c 2014-12-15 00:45:34.000000000 +0000 @@ -202,8 +202,6 @@ 'P','r','i','n','t','\\', 'P','r','i','n','t','e','r','s',0}; -static const WCHAR LocalPortW[] = {'L','o','c','a','l',' ','P','o','r','t',0}; - static const WCHAR user_default_reg_key[] = { 'S','o','f','t','w','a','r','e','\\', 'M','i','c','r','o','s','o','f','t','\\', 'W','i','n','d','o','w','s',' ','N','T','\\', @@ -216,19 +214,12 @@ 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', 'D','e','v','i','c','e','s',0}; -static const WCHAR WinNT_CV_PortsW[] = {'S','o','f','t','w','a','r','e','\\', - 'M','i','c','r','o','s','o','f','t','\\', - 'W','i','n','d','o','w','s',' ','N','T','\\', - 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', - 'P','o','r','t','s',0}; - static const WCHAR WinNT_CV_PrinterPortsW[] = { 'S','o','f','t','w','a','r','e','\\', 'M','i','c','r','o','s','o','f','t','\\', 'W','i','n','d','o','w','s',' ','N','T','\\', 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', 'P','r','i','n','t','e','r','P','o','r','t','s',0}; -static const WCHAR DefaultEnvironmentW[] = {'W','i','n','e',0}; static WCHAR envname_win40W[] = {'W','i','n','d','o','w','s',' ','4','.','0',0}; static const WCHAR envname_x64W[] = {'W','i','n','d','o','w','s',' ','x','6','4',0}; static WCHAR envname_x86W[] = {'W','i','n','d','o','w','s',' ','N','T',' ','x','8','6',0}; @@ -240,8 +231,6 @@ static const WCHAR Version3_RegPathW[] = {'\\','V','e','r','s','i','o','n','-','3',0}; static const WCHAR Version3_SubdirW[] = {'\\','3',0}; -static const WCHAR spooldriversW[] = {'\\','s','p','o','o','l','\\','d','r','i','v','e','r','s','\\',0}; - static const WCHAR AttributesW[] = {'A','t','t','r','i','b','u','t','e','s',0}; static const WCHAR backslashW[] = {'\\',0}; static const WCHAR Configuration_FileW[] = {'C','o','n','f','i','g','u','r','a','t', @@ -264,7 +253,6 @@ static const WCHAR OEM_UrlW[] = {'O','E','M',' ','U','r','l',0}; static const WCHAR ParametersW[] = {'P','a','r','a','m','e','t','e','r','s',0}; static const WCHAR PortW[] = {'P','o','r','t',0}; -static const WCHAR bs_Ports_bsW[] = {'\\','P','o','r','t','s','\\',0}; static const WCHAR Previous_NamesW[] = {'P','r','e','v','i','o','u','s',' ','N','a','m','e','s',0}; static const WCHAR Print_ProcessorW[] = {'P','r','i','n','t',' ','P','r','o','c','e','s','s','o','r',0}; static const WCHAR Printer_DriverW[] = {'P','r','i','n','t','e','r',' ','D','r','i','v','e','r',0}; @@ -278,7 +266,6 @@ static const WCHAR StatusW[] = {'S','t','a','t','u','s',0}; static const WCHAR txTimeoutW[] = {'t','x','T','i','m','e','o','u','t',0}; static const WCHAR UntilTimeW[] = {'U','n','t','i','l','T','i','m','e',0}; -static const WCHAR VersionW[] = {'V','e','r','s','i','o','n',0}; static WCHAR WinPrintW[] = {'W','i','n','P','r','i','n','t',0}; static const WCHAR deviceW[] = {'d','e','v','i','c','e',0}; static const WCHAR devicesW[] = {'d','e','v','i','c','e','s',0}; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wintrust/softpub.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wintrust/softpub.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wintrust/softpub.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wintrust/softpub.c 2014-12-15 00:45:34.000000000 +0000 @@ -1209,7 +1209,11 @@ if (data->fOpenedFile && data->pWintrustData->dwUnionChoice == WTD_CHOICE_FILE && data->pWintrustData->u.pFile) + { CloseHandle(data->pWintrustData->u.pFile->hFile); + data->pWintrustData->u.pFile->hFile = INVALID_HANDLE_VALUE; + data->fOpenedFile = FALSE; + } return S_OK; } diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/wintrust/tests/asn.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/wintrust/tests/asn.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/wintrust/tests/asn.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/wintrust/tests/asn.c 2014-12-15 00:45:34.000000000 +0000 @@ -305,8 +305,6 @@ static const BYTE emptySequence[] = { 0x30,0x00 }; static BYTE flags[] = { 1 }; static const BYTE onlyFlagsPEImage[] = { 0x30,0x04,0x03,0x02,0x00,0x01 }; -static const BYTE moreFlagsPEImage[] = { -0x30,0x06,0x03,0x04,0x04,0xff,0x80,0x10 }; static const BYTE onlyEmptyFilePEImage[] = { 0x30,0x06,0xa0,0x04,0xa2,0x02,0x80,0x00 }; static const BYTE flagsAndEmptyFilePEImage[] = { diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ws2_32/socket.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ws2_32/socket.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ws2_32/socket.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ws2_32/socket.c 2014-12-15 00:45:34.000000000 +0000 @@ -3095,6 +3095,79 @@ } release_sock_fd( s, fd ); return ret; + case WS_SO_BSP_STATE: + { + int req_size, addr_size; + WSAPROTOCOL_INFOW infow; + CSADDR_INFO *csinfo; + + ret = ws_protocol_info(s, TRUE, &infow, &addr_size); + if (ret) + { + if (infow.iAddressFamily == WS_AF_INET) + addr_size = sizeof(struct sockaddr_in); + else if (infow.iAddressFamily == WS_AF_INET6) + addr_size = sizeof(struct sockaddr_in6); + else + { + FIXME("Family %d is unsupported for SO_BSP_STATE", infow.iAddressFamily); + SetLastError(WSAEAFNOSUPPORT); + return SOCKET_ERROR; + } + + req_size = sizeof(CSADDR_INFO) + addr_size * 2; + if (*optlen < req_size) + { + ret = 0; + SetLastError(WSAEFAULT); + } + else + { + union generic_unix_sockaddr uaddr; + socklen_t uaddrlen = sizeof(uaddr); + + if ( (fd = get_sock_fd( s, 0, NULL )) == -1) + return SOCKET_ERROR; + + csinfo = (CSADDR_INFO*) optval; + + /* Check if the sock is bound */ + if (!getsockname(fd, &uaddr.addr, &uaddrlen) && + is_sockaddr_bound(&uaddr.addr, uaddrlen)) + { + csinfo->LocalAddr.lpSockaddr = + (LPSOCKADDR) (optval + sizeof(CSADDR_INFO)); + ws_sockaddr_u2ws(&uaddr.addr, csinfo->LocalAddr.lpSockaddr, &addr_size); + csinfo->LocalAddr.iSockaddrLength = addr_size; + } + else + { + csinfo->LocalAddr.lpSockaddr = NULL; + csinfo->LocalAddr.iSockaddrLength = 0; + } + + /* Check if the sock is connected */ + if (!getpeername(fd, &uaddr.addr, &uaddrlen) && + is_sockaddr_bound(&uaddr.addr, uaddrlen)) + { + csinfo->RemoteAddr.lpSockaddr = + (LPSOCKADDR) (optval + sizeof(CSADDR_INFO) + addr_size); + ws_sockaddr_u2ws(&uaddr.addr, csinfo->RemoteAddr.lpSockaddr, &addr_size); + csinfo->RemoteAddr.iSockaddrLength = addr_size; + } + else + { + csinfo->RemoteAddr.lpSockaddr = NULL; + csinfo->RemoteAddr.iSockaddrLength = 0; + } + + csinfo->iSocketType = infow.iSocketType; + csinfo->iProtocol = infow.iProtocol; + release_sock_fd( s, fd ); + } + } + return ret ? 0 : SOCKET_ERROR; + } case WS_SO_DONTLINGER: { struct linger lingval; @@ -4386,36 +4459,37 @@ static int get_poll_results( WS_fd_set *readfds, WS_fd_set *writefds, WS_fd_set *exceptfds, const struct pollfd *fds ) { - unsigned int exceptfds_off = (readfds ? readfds->fd_count : 0) + (writefds ? writefds->fd_count : 0); - unsigned int i, j = 0, k, total = 0; + const struct pollfd *poll_writefds = fds + (readfds ? readfds->fd_count : 0); + const struct pollfd *poll_exceptfds = poll_writefds + (writefds ? writefds->fd_count : 0); + unsigned int i, k, total = 0; if (readfds) { - for (i = k = 0; i < readfds->fd_count; i++, j++) + for (i = k = 0; i < readfds->fd_count; i++) { - - if (fds[j].revents || - (readfds==writefds && (fds[readfds->fd_count+i].revents & POLLOUT) && - !(fds[readfds->fd_count+i].revents & POLLHUP)) || - (readfds==exceptfds && fds[exceptfds_off+i].revents)) + if (fds[i].revents || + (readfds == writefds && (poll_writefds[i].revents & POLLOUT) && !(poll_writefds[i].revents & POLLHUP)) || + (readfds == exceptfds && poll_exceptfds[i].revents)) readfds->fd_array[k++] = readfds->fd_array[i]; } readfds->fd_count = k; total += k; } - if (writefds && writefds!=readfds) + if (writefds && writefds != readfds) { - for (i = k = 0; i < writefds->fd_count; i++, j++) - if (((fds[j].revents & POLLOUT) && !(fds[j].revents & POLLHUP)) || - (writefds==exceptfds && fds[exceptfds_off+i].revents)) + for (i = k = 0; i < writefds->fd_count; i++) + { + if (((poll_writefds[i].revents & POLLOUT) && !(poll_writefds[i].revents & POLLHUP)) || + (writefds == exceptfds && poll_exceptfds[i].revents)) writefds->fd_array[k++] = writefds->fd_array[i]; + } writefds->fd_count = k; total += k; } - if (exceptfds && exceptfds!=readfds && exceptfds!=writefds) + if (exceptfds && exceptfds != readfds && exceptfds != writefds) { for (i = k = 0; i < exceptfds->fd_count; i++) - if (fds[exceptfds_off+i].revents) exceptfds->fd_array[k++] = exceptfds->fd_array[i]; + if (poll_exceptfds[i].revents) exceptfds->fd_array[k++] = exceptfds->fd_array[i]; exceptfds->fd_count = k; total += k; } @@ -5012,6 +5086,7 @@ { woptval= *((const INT16 *) optval); optval= (char*) &woptval; + woptval&= (1 << optlen * 8) - 1; optlen=sizeof(int); } fd = get_sock_fd( s, 0, NULL ); @@ -5167,6 +5242,17 @@ } /*********************************************************************** + * WS_compare_routes_by_metric_asc (INTERNAL) + * + * Comparison function for qsort(), for sorting two routes (struct route) + * by metric in ascending order. + */ +static int WS_compare_routes_by_metric_asc(const void *left, const void *right) +{ + return ((const struct route*)left)->metric - ((const struct route*)right)->metric; +} + +/*********************************************************************** * WS_get_local_ips (INTERNAL) * * Returns the list of local IP addresses by going through the network @@ -5180,7 +5266,7 @@ */ static struct WS_hostent* WS_get_local_ips( char *hostname ) { - int last_metric, numroutes = 0, i, j; + int numroutes = 0, i, j; DWORD n; PIP_ADAPTER_INFO adapters = NULL, k; struct WS_hostent *hostlist = NULL; @@ -5260,30 +5346,15 @@ hostlist->h_aliases[0] = NULL; /* NULL-terminate the alias list */ hostlist->h_addrtype = AF_INET; hostlist->h_length = sizeof(struct in_addr); /* = 4 */ - /* Reorder the entries when placing them in the host list, Windows expects + /* Reorder the entries before placing them in the host list. Windows expects * the IP list in order from highest priority to lowest (the critical thing * is that most applications expect the first IP to be the default route). */ - last_metric = -1; - for (i = 0; i < numroutes; i++) - { - struct in_addr addr; - int metric = 0xFFFF; - - memcpy(&addr, magic_loopback_addr, 4); - for (j = 0; j < numroutes; j++) - { - int this_metric = route_addrs[j].metric; + if (numroutes > 1) + qsort(route_addrs, numroutes, sizeof(struct route), WS_compare_routes_by_metric_asc); - if (this_metric > last_metric && this_metric < metric) - { - addr = route_addrs[j].addr; - metric = this_metric; - } - } - last_metric = metric; - (*(struct in_addr *) hostlist->h_addr_list[i]) = addr; - } + for (i = 0; i < numroutes; i++) + (*(struct in_addr *) hostlist->h_addr_list[i]) = route_addrs[i].addr; /* Cleanup all allocated memory except the address list, * the address list is used by the calling app. diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/dlls/ws2_32/tests/sock.c wine-compholio-1.7.33~ubuntu15.04.1/dlls/ws2_32/tests/sock.c --- wine-compholio-1.7.32~ubuntu15.04.1/dlls/ws2_32/tests/sock.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/dlls/ws2_32/tests/sock.c 2014-12-15 00:45:34.000000000 +0000 @@ -1235,7 +1235,7 @@ static void test_set_getsockopt(void) { - SOCKET s; + SOCKET s, s2; int i, err, lasterr; int timeout; LINGER lingval; @@ -1252,6 +1252,11 @@ {AF_INET6, SOCK_STREAM, IPPROTO_TCP}, {AF_INET6, SOCK_DGRAM, IPPROTO_UDP} }; + union _csspace + { + CSADDR_INFO cs; + char space[128]; + } csinfoA, csinfoB; s = socket(AF_INET, SOCK_STREAM, 0); ok(s!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError()); @@ -1369,6 +1374,23 @@ closesocket(s); + /* Test WS_IP_MULTICAST_TTL with 8, 16, 24 and 32 bits values */ + s = socket(AF_INET, SOCK_DGRAM, 0); + ok(s != INVALID_SOCKET, "Failed to create socket\n"); + size = sizeof(i); + for (i = 0; i < 4; i++) + { + int k, j; + const int tests[] = {0xffffff0a, 0xffff000b, 0xff00000c, 0x0000000d}; + err = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &tests[i], i + 1); + ok(!err, "Test [%d] Expected 0, got %d\n", i, err); + err = getsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *) &k, &size); + ok(!err, "Test [%d] Expected 0, got %d\n", i, err); + j = i != 3 ? tests[i] & ((1 << (i + 1) * 8) - 1) : tests[i]; + ok(k == j, "Test [%d] Expected 0x%x, got 0x%x\n", i, j, k); + } + closesocket(s); + /* test SO_PROTOCOL_INFOA invalid parameters */ ok(getsockopt(INVALID_SOCKET, SOL_SOCKET, SO_PROTOCOL_INFOA, NULL, NULL), "getsockopt should have failed\n"); @@ -1462,6 +1484,116 @@ closesocket(s); } + + /* Test SO_BSP_STATE - Present only in >= Win 2008 */ + s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + ok(s != INVALID_SOCKET, "Failed to create socket\n"); + s2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + ok(s2 != INVALID_SOCKET, "Failed to create socket\n"); + + SetLastError(0xdeadbeef); + size = sizeof(csinfoA); + err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size); + if (!err) + { + struct sockaddr_in saddr; + memset(&saddr, 0, sizeof(saddr)); + saddr.sin_family = AF_INET; + saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); + + /* Socket is not bound, no information provided */ + ok(!csinfoA.cs.LocalAddr.iSockaddrLength, "Expected 0, got %d\n", csinfoA.cs.LocalAddr.iSockaddrLength); + ok(csinfoA.cs.LocalAddr.lpSockaddr == NULL, "Expected NULL, got %p\n", csinfoA.cs.LocalAddr.lpSockaddr); + /* Socket is not connected, no information provided */ + ok(!csinfoA.cs.RemoteAddr.iSockaddrLength, "Expected 0, got %d\n", csinfoA.cs.LocalAddr.iSockaddrLength); + ok(csinfoA.cs.RemoteAddr.lpSockaddr == NULL, "Expected NULL, got %p\n", csinfoA.cs.LocalAddr.lpSockaddr); + + err = bind(s, (struct sockaddr*)&saddr, sizeof(saddr)); + ok(!err, "Expected 0, got %d\n", err); + size = sizeof(csinfoA); + err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size); + ok(!err, "Expected 0, got %d\n", err); + + /* Socket is bound */ + ok(csinfoA.cs.LocalAddr.iSockaddrLength, "Expected non-zero\n"); + ok(csinfoA.cs.LocalAddr.lpSockaddr != NULL, "Expected non-null\n"); + /* Socket is not connected, no information provided */ + ok(!csinfoA.cs.RemoteAddr.iSockaddrLength, "Expected 0, got %d\n", csinfoA.cs.LocalAddr.iSockaddrLength); + ok(csinfoA.cs.RemoteAddr.lpSockaddr == NULL, "Expected NULL, got %p\n", csinfoA.cs.LocalAddr.lpSockaddr); + + err = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr)); + ok(!err, "Expected 0, got %d\n", err); + err = getsockname(s2, (struct sockaddr *)&saddr, &size); + ok(!err, "Expected 0, got %d\n", err); + err = listen(s2, 1); + ok(!err, "Expected 0, got %d\n", err); + err = connect(s, (struct sockaddr*)&saddr, sizeof(saddr)); + ok(!err, "Expected 0, got %d\n", err); + size = sizeof(saddr); + err = accept(s2, (struct sockaddr*)&saddr, &size); + ok(err != INVALID_SOCKET, "Failed to accept socket\n"); + closesocket(s2); + s2 = err; + + size = sizeof(csinfoA); + err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size); + ok(!err, "Expected 0, got %d\n", err); + err = getsockopt(s2, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoB, &size); + ok(!err, "Expected 0, got %d\n", err); + ok(size == sizeof(csinfoA), "Got %d\n", size); + size = sizeof(saddr); + ok(size == csinfoA.cs.LocalAddr.iSockaddrLength, "Expected %d, got %d\n", size, + csinfoA.cs.LocalAddr.iSockaddrLength); + ok(size == csinfoA.cs.RemoteAddr.iSockaddrLength, "Expected %d, got %d\n", size, + csinfoA.cs.RemoteAddr.iSockaddrLength); + ok(!memcmp(csinfoA.cs.LocalAddr.lpSockaddr, csinfoB.cs.RemoteAddr.lpSockaddr, size), + "Expected matching addresses\n"); + ok(!memcmp(csinfoB.cs.LocalAddr.lpSockaddr, csinfoA.cs.RemoteAddr.lpSockaddr, size), + "Expected matching addresses\n"); + ok(csinfoA.cs.iSocketType == SOCK_STREAM, "Wrong socket type\n"); + ok(csinfoB.cs.iSocketType == SOCK_STREAM, "Wrong socket type\n"); + ok(csinfoA.cs.iProtocol == IPPROTO_TCP, "Wrong socket protocol\n"); + ok(csinfoB.cs.iProtocol == IPPROTO_TCP, "Wrong socket protocol\n"); + + err = getpeername(s, (struct sockaddr *)&saddr, &size); + ok(!err, "Expected 0, got %d\n", err); + ok(!memcmp(&saddr, csinfoA.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n"); + ok(!memcmp(&saddr, csinfoB.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n"); + err = getpeername(s2, (struct sockaddr *)&saddr, &size); + ok(!err, "Expected 0, got %d\n", err); + ok(!memcmp(&saddr, csinfoB.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n"); + ok(!memcmp(&saddr, csinfoA.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n"); + err = getsockname(s, (struct sockaddr *)&saddr, &size); + ok(!err, "Expected 0, got %d\n", err); + ok(!memcmp(&saddr, csinfoA.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n"); + ok(!memcmp(&saddr, csinfoB.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n"); + err = getsockname(s2, (struct sockaddr *)&saddr, &size); + ok(!err, "Expected 0, got %d\n", err); + ok(!memcmp(&saddr, csinfoB.cs.LocalAddr.lpSockaddr, size), "Expected matching addresses\n"); + ok(!memcmp(&saddr, csinfoA.cs.RemoteAddr.lpSockaddr, size), "Expected matching addresses\n"); + + SetLastError(0xdeadbeef); + size = sizeof(CSADDR_INFO); + err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size); + ok(err, "Expected non-zero\n"); + ok(size == sizeof(CSADDR_INFO), "Got %d\n", size); + ok(GetLastError() == WSAEFAULT, "Expected 10014, got %d\n", GetLastError()); + + /* At least for IPv4 the size is exactly 56 bytes */ + size = sizeof(*csinfoA.cs.LocalAddr.lpSockaddr) * 2 + sizeof(csinfoA.cs); + err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size); + ok(!err, "Expected 0, got %d\n", err); + size--; + SetLastError(0xdeadbeef); + err = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, (char *) &csinfoA, &size); + ok(err, "Expected non-zero\n"); + ok(GetLastError() == WSAEFAULT, "Expected 10014, got %d\n", GetLastError()); + } + else + ok(GetLastError() == WSAENOPROTOOPT, "Expected 10042, got %d\n", GetLastError()); + + closesocket(s); + closesocket(s2); } static void test_so_reuseaddr(void) @@ -3358,14 +3490,14 @@ ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout); ok(ret == 2, "select returned %d\n", ret); ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n"); - ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n"); + ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); ok(send(fdWrite, "test", 4, 0) == 4, "failed to send data\n"); FD_ZERO(&readfds); FD_SET(fdRead, &readfds); ret = select(fdRead+1, &readfds, NULL, NULL, &select_timeout); ok(ret == 1, "select returned %d\n", ret); - ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n"); + ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); FD_ZERO(&readfds); FD_SET(fdWrite, &readfds); @@ -3373,7 +3505,7 @@ ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout); ok(ret == 2, "select returned %d\n", ret); ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n"); - ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n"); + ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); while(1) { FD_ZERO(&writefds); @@ -3388,7 +3520,7 @@ ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout); ok(ret == 1, "select returned %d\n", ret); ok(!FD_ISSET(fdWrite, &readfds), "fdWrite socket is in the set\n"); - ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n"); + ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); ok(send(fdRead, "test", 4, 0) == 4, "failed to send data\n"); Sleep(100); @@ -3398,7 +3530,7 @@ ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout); ok(ret == 2, "select returned %d\n", ret); ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n"); - ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n"); + ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); closesocket(fdRead); closesocket(fdWrite); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/include/config.h.in wine-compholio-1.7.33~ubuntu15.04.1/include/config.h.in --- wine-compholio-1.7.32~ubuntu15.04.1/include/config.h.in 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/include/config.h.in 2014-12-15 00:45:34.000000000 +0000 @@ -56,6 +56,12 @@ /* Define to 1 if you have the header file. */ #undef HAVE_CARBON_CARBON_H +/* Define to 1 if you have the `cbrt' function. */ +#undef HAVE_CBRT + +/* Define to 1 if you have the `cbrtf' function. */ +#undef HAVE_CBRTF + /* Define to 1 if you have the `chsize' function. */ #undef HAVE_CHSIZE @@ -105,6 +111,12 @@ /* Define to 1 if you have the `epoll_create' function. */ #undef HAVE_EPOLL_CREATE +/* Define to 1 if you have the `exp2' function. */ +#undef HAVE_EXP2 + +/* Define to 1 if you have the `exp2f' function. */ +#undef HAVE_EXP2F + /* Define to 1 if you have the `fallocate' function. */ #undef HAVE_FALLOCATE @@ -426,9 +438,39 @@ /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_VIDEODEV_H +/* Define to 1 if you have the `llrint' function. */ +#undef HAVE_LLRINT + +/* Define to 1 if you have the `llrintf' function. */ +#undef HAVE_LLRINTF + +/* Define to 1 if you have the `llround' function. */ +#undef HAVE_LLROUND + +/* Define to 1 if you have the `llroundf' function. */ +#undef HAVE_LLROUNDF + +/* Define to 1 if you have the `log2' function. */ +#undef HAVE_LOG2 + +/* Define to 1 if you have the `log2f' function. */ +#undef HAVE_LOG2F + /* Define to 1 if the system has the type `long long'. */ #undef HAVE_LONG_LONG +/* Define to 1 if you have the `lrint' function. */ +#undef HAVE_LRINT + +/* Define to 1 if you have the `lrintf' function. */ +#undef HAVE_LRINTF + +/* Define to 1 if you have the `lround' function. */ +#undef HAVE_LROUND + +/* Define to 1 if you have the `lroundf' function. */ +#undef HAVE_LROUNDF + /* Define to 1 if you have the `lstat' function. */ #undef HAVE_LSTAT @@ -663,6 +705,18 @@ /* Define to 1 if you have the header file. */ #undef HAVE_RESOLV_H +/* Define to 1 if you have the `rint' function. */ +#undef HAVE_RINT + +/* Define to 1 if you have the `rintf' function. */ +#undef HAVE_RINTF + +/* Define to 1 if you have the `round' function. */ +#undef HAVE_ROUND + +/* Define to 1 if you have the `roundf' function. */ +#undef HAVE_ROUNDF + /* Define to 1 if you have the header file. */ #undef HAVE_SCHED_H @@ -1083,6 +1137,12 @@ /* Define if you have the timezone variable */ #undef HAVE_TIMEZONE +/* Define to 1 if you have the `trunc' function. */ +#undef HAVE_TRUNC + +/* Define to 1 if you have the `truncf' function. */ +#undef HAVE_TRUNCF + /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H @@ -1221,6 +1281,9 @@ /* Define to 1 if you have the `_vsnprintf' function. */ #undef HAVE__VSNPRINTF +/* Define to 1 if you have the `__builtin_clz' built-in function. */ +#undef HAVE___BUILTIN_CLZ + /* Define to 1 if you have the `__res_getservers' function. */ #undef HAVE___RES_GETSERVERS diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/include/dwrite_2.idl wine-compholio-1.7.33~ubuntu15.04.1/include/dwrite_2.idl --- wine-compholio-1.7.32~ubuntu15.04.1/include/dwrite_2.idl 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/include/dwrite_2.idl 2014-12-15 00:45:34.000000000 +0000 @@ -47,6 +47,7 @@ FLOAT heightIncludingTrailingWhitespace; } DWRITE_TEXT_METRICS1; +cpp_quote("#ifndef D3DCOLORVALUE_DEFINED") typedef struct _D3DCOLORVALUE { union { @@ -66,6 +67,8 @@ FLOAT dvA; }; } D3DCOLORVALUE; +cpp_quote("#define D3DCOLORVALUE_DEFINED") +cpp_quote("#endif") typedef D3DCOLORVALUE DWRITE_COLOR_F; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/include/dxgi1_2.idl wine-compholio-1.7.33~ubuntu15.04.1/include/dxgi1_2.idl --- wine-compholio-1.7.32~ubuntu15.04.1/include/dxgi1_2.idl 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/include/dxgi1_2.idl 2014-12-15 00:45:34.000000000 +0000 @@ -24,6 +24,14 @@ DXGI_OFFER_RESOURCE_PRIORITY_HIGH } DXGI_OFFER_RESOURCE_PRIORITY; +typedef enum DXGI_ALPHA_MODE { + DXGI_ALPHA_MODE_UNSPECIFIED = 0, + DXGI_ALPHA_MODE_PREMULTIPLIED = 1, + DXGI_ALPHA_MODE_STRAIGHT = 2, + DXGI_ALPHA_MODE_IGNORE = 3, + DXGI_ALPHA_MODE_FORCE_DWORD = 0xffffffff +} DXGI_ALPHA_MODE; + [ object, uuid(05008617-fbfd-4051-a790-144884b4f6a9), @@ -45,3 +53,80 @@ HRESULT EnqueueSetEvent( [in] HANDLE hEvent); } + +typedef enum DXGI_SCALING { + DXGI_SCALING_STRETCH = 0, + DXGI_SCALING_NONE = 1 +} DXGI_SCALING; + +typedef struct DXGI_SWAP_CHAIN_DESC1 { + UINT Width; + UINT Height; + DXGI_FORMAT Format; + BOOL Stereo; + DXGI_SAMPLE_DESC SampleDesc; + DXGI_USAGE BufferUsage; + UINT BufferCount; + DXGI_SCALING Scaling; + DXGI_SWAP_EFFECT SwapEffect; + DXGI_ALPHA_MODE AlphaMode; + UINT Flags; +} DXGI_SWAP_CHAIN_DESC1; + +typedef struct DXGI_SWAP_CHAIN_FULLSCREEN_DESC { + DXGI_RATIONAL RefreshRate; + DXGI_MODE_SCANLINE_ORDER ScanlineOrdering; + DXGI_MODE_SCALING Scaling; + BOOL Windowed; +} DXGI_SWAP_CHAIN_FULLSCREEN_DESC; + +typedef struct DXGI_PRESENT_PARAMETERS { + UINT DirtyRectsCount; + RECT *pDirtyRects; + RECT *pScrollRect; + POINT *pScrollOffset; +} DXGI_PRESENT_PARAMETERS; + +[ + object, + uuid(790a45f7-0d42-4876-983a-0a55cfe6f4aa), + local, + pointer_default(unique) +] +interface IDXGISwapChain1 : IDXGISwapChain +{ + HRESULT GetDesc1( + [out] DXGI_SWAP_CHAIN_DESC1 *pDesc); + + HRESULT GetFullscreenDesc( + [out] DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pDesc); + + HRESULT GetHwnd( + [out] HWND *pHwnd); + + HRESULT GetCoreWindow( + [in] REFIID refiid, + [out] void **ppUnk); + + HRESULT Present1( + [in] UINT SyncInterval, + [in] UINT PresentFlags, + [in] const DXGI_PRESENT_PARAMETERS *pPresentParameters); + + BOOL IsTemporaryMonoSupported(); + + HRESULT GetRestrictToOutput( + [out] IDXGIOutput **ppRestrictToOutput); + + HRESULT SetBackgroundColor( + [in] const DXGI_RGBA *pColor); + + HRESULT GetBackgroundColor( + [out] DXGI_RGBA *pColor); + + HRESULT SetRotation( + [in] DXGI_MODE_ROTATION Rotation); + + HRESULT GetRotation( + [out] DXGI_MODE_ROTATION *pRotation); +} diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/include/dxgitype.h wine-compholio-1.7.33~ubuntu15.04.1/include/dxgitype.h --- wine-compholio-1.7.32~ubuntu15.04.1/include/dxgitype.h 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/include/dxgitype.h 2014-12-15 00:45:34.000000000 +0000 @@ -21,6 +21,18 @@ #include "dxgiformat.h" +#ifndef D3DCOLORVALUE_DEFINED +typedef struct _D3DCOLORVALUE { + float r; + float g; + float b; + float a; +} D3DCOLORVALUE; +#define D3DCOLORVALUE_DEFINED +#endif + +typedef D3DCOLORVALUE DXGI_RGBA; + typedef struct DXGI_SAMPLE_DESC { UINT Count; UINT Quality; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/include/hstring.idl wine-compholio-1.7.33~ubuntu15.04.1/include/hstring.idl --- wine-compholio-1.7.32~ubuntu15.04.1/include/hstring.idl 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/include/hstring.idl 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2014 Martin Storsjo + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +import "wtypes.idl"; + +typedef struct HSTRING__ +{ + int unused; +} HSTRING__; + +typedef [wire_marshal(wireBSTR), unique] HSTRING__* HSTRING; + +cpp_quote("DECLARE_HANDLE(HSTRING_BUFFER);") + +cpp_quote("typedef struct HSTRING_HEADER") +cpp_quote("{") +cpp_quote(" union") +cpp_quote(" {") +cpp_quote(" PVOID Reserved1;") +cpp_quote("#ifdef _WIN64") +cpp_quote(" char Reserved2[24];") +cpp_quote("#else") +cpp_quote(" char Reserved2[20];") +cpp_quote("#endif") +cpp_quote(" } Reserved;") +cpp_quote("} HSTRING_HEADER;") diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/include/Makefile.in wine-compholio-1.7.33~ubuntu15.04.1/include/Makefile.in --- wine-compholio-1.7.32~ubuntu15.04.1/include/Makefile.in 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/include/Makefile.in 2014-12-15 00:45:34.000000000 +0000 @@ -47,6 +47,7 @@ fusion.idl \ gameux.idl \ hlink.idl \ + hstring.idl \ htiface.idl \ htiframe.idl \ httprequest.idl \ @@ -506,6 +507,7 @@ restartmanager.h \ richedit.h \ rmxfguid.h \ + roapi.h \ row.idl \ rowchg.idl \ rowpos.idl \ @@ -617,6 +619,7 @@ winsock.h \ winsock2.h \ winspool.h \ + winstring.h \ winsvc.h \ wintab.h \ wintabx.h \ diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/include/msvcrt/crtdefs.h wine-compholio-1.7.33~ubuntu15.04.1/include/msvcrt/crtdefs.h --- wine-compholio-1.7.32~ubuntu15.04.1/include/msvcrt/crtdefs.h 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/include/msvcrt/crtdefs.h 2014-12-15 00:45:34.000000000 +0000 @@ -80,10 +80,16 @@ # define __ms_va_list __builtin_ms_va_list # define __ms_va_start(list,arg) __builtin_ms_va_start(list,arg) # define __ms_va_end(list) __builtin_ms_va_end(list) +# define __ms_va_copy(dest,src) __builtin_ms_va_copy(dest,src) # else # define __ms_va_list va_list # define __ms_va_start(list,arg) va_start(list,arg) # define __ms_va_end(list) va_end(list) +# ifdef va_copy +# define __ms_va_copy(dest,src) va_copy(dest,src) +# else +# define __ms_va_copy(dest,src) ((dest) = (src)) +# endif # endif #endif diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/include/roapi.h wine-compholio-1.7.33~ubuntu15.04.1/include/roapi.h --- wine-compholio-1.7.32~ubuntu15.04.1/include/roapi.h 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/include/roapi.h 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2014 Martin Storsjo + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_ROAPI_H +#define __WINE_ROAPI_H + +#include + +typedef enum +{ + RO_INIT_SINGLETHREADED = 0, + RO_INIT_MULTITHREADED = 1, +} RO_INIT_TYPE; + +#ifdef __cplusplus +extern "C" { +#endif + +HRESULT WINAPI RoInitialize(RO_INIT_TYPE type); +void WINAPI RoUninitialize(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __WINE_ROAPI_H */ diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/include/winbase.h wine-compholio-1.7.33~ubuntu15.04.1/include/winbase.h --- wine-compholio-1.7.32~ubuntu15.04.1/include/winbase.h 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/include/winbase.h 2014-12-15 00:45:34.000000000 +0000 @@ -1684,6 +1684,9 @@ WINBASEAPI HANDLE WINAPI CreateSemaphoreExA(SECURITY_ATTRIBUTES*,LONG,LONG,LPCSTR,DWORD,DWORD); WINBASEAPI HANDLE WINAPI CreateSemaphoreExW(SECURITY_ATTRIBUTES*,LONG,LONG,LPCWSTR,DWORD,DWORD); #define CreateSemaphoreEx WINELIB_NAME_AW(CreateSemaphoreEx) +WINBASEAPI BOOL WINAPI CreateSymbolicLinkA(LPCSTR,LPCSTR,DWORD); +WINBASEAPI BOOL WINAPI CreateSymbolicLinkW(LPCWSTR,LPCWSTR,DWORD); +#define CreateSymbolicLink WINELIB_NAME_AW(CreateSymbolicLink) WINBASEAPI DWORD WINAPI CreateTapePartition(HANDLE,DWORD,DWORD,DWORD); WINBASEAPI HANDLE WINAPI CreateThread(LPSECURITY_ATTRIBUTES,SIZE_T,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD); WINBASEAPI HANDLE WINAPI CreateTimerQueue(void); diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/include/windef.h wine-compholio-1.7.33~ubuntu15.04.1/include/windef.h --- wine-compholio-1.7.32~ubuntu15.04.1/include/windef.h 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/include/windef.h 2014-12-15 00:45:34.000000000 +0000 @@ -89,10 +89,16 @@ # define __ms_va_list __builtin_ms_va_list # define __ms_va_start(list,arg) __builtin_ms_va_start(list,arg) # define __ms_va_end(list) __builtin_ms_va_end(list) +# define __ms_va_copy(dest,src) __builtin_ms_va_copy(dest,src) # else # define __ms_va_list va_list # define __ms_va_start(list,arg) va_start(list,arg) # define __ms_va_end(list) va_end(list) +# ifdef va_copy +# define __ms_va_copy(dest,src) va_copy(dest,src) +# else +# define __ms_va_copy(dest,src) ((dest) = (src)) +# endif # endif #endif diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/include/wine/wined3d.h wine-compholio-1.7.33~ubuntu15.04.1/include/wine/wined3d.h --- wine-compholio-1.7.32~ubuntu15.04.1/include/wine/wined3d.h 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/include/wine/wined3d.h 2014-12-15 00:45:34.000000000 +0000 @@ -26,6 +26,10 @@ #ifndef __WINE_WINED3D_H #define __WINE_WINED3D_H +#ifndef __WINE_CONFIG_H +# error You must include config.h to use this header +#endif + #include "wine/list.h" #define WINED3D_OK S_OK @@ -1238,6 +1242,7 @@ #define WINED3D_VIDMEM_ACCOUNTING 0x00000004 #define WINED3D_PRESENT_CONVERSION 0x00000008 #define WINED3D_RESTORE_MODE_ON_ACTIVATE 0x00000010 +#define WINED3D_FOCUS_MESSAGES 0x00000020 #define WINED3D_RESZ_CODE 0x7fa05000 @@ -2441,8 +2446,8 @@ HRESULT __cdecl wined3d_shader_set_local_constants_float(struct wined3d_shader *shader, UINT start_idx, const float *src_data, UINT vector4f_count); -HRESULT __cdecl wined3d_shader_resource_view_create(void *parent, const struct wined3d_parent_ops *parent_ops, - struct wined3d_shader_resource_view **view); +HRESULT __cdecl wined3d_shader_resource_view_create(struct wined3d_resource *resource, void *parent, + const struct wined3d_parent_ops *parent_ops, struct wined3d_shader_resource_view **view); ULONG __cdecl wined3d_shader_resource_view_decref(struct wined3d_shader_resource_view *view); void * __cdecl wined3d_shader_resource_view_get_parent(const struct wined3d_shader_resource_view *view); ULONG __cdecl wined3d_shader_resource_view_incref(struct wined3d_shader_resource_view *view); @@ -2554,4 +2559,35 @@ void __cdecl wined3d_volume_preload(struct wined3d_volume *volume); HRESULT __cdecl wined3d_volume_unmap(struct wined3d_volume *volume); +/* Return the integer base-2 logarithm of x. Undefined for x == 0. */ +static inline unsigned int wined3d_log2i(unsigned int x) +{ +#ifdef HAVE___BUILTIN_CLZ + return __builtin_clz(x) ^ 0x1f; +#else + static const unsigned int l[] = + { + ~0u, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + }; + unsigned int i; + + return (i = x >> 16) ? (x = i >> 8) ? l[x] + 24 : l[i] + 16 : (i = x >> 8) ? l[i] + 8 : l[x]; +#endif +} + #endif /* __WINE_WINED3D_H */ diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/include/winsock.h wine-compholio-1.7.33~ubuntu15.04.1/include/winsock.h --- wine-compholio-1.7.32~ubuntu15.04.1/include/winsock.h 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/include/winsock.h 2014-12-15 00:45:34.000000000 +0000 @@ -697,6 +697,7 @@ #define WS_SO_RCVTIMEO 0x1006 #define WS_SO_ERROR 0x1007 #define WS_SO_TYPE 0x1008 +#define WS_SO_BSP_STATE 0x1009 #define WS_IOCPARM_MASK 0x7f #define WS_IOC_VOID 0x20000000 diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/include/winstring.h wine-compholio-1.7.33~ubuntu15.04.1/include/winstring.h --- wine-compholio-1.7.32~ubuntu15.04.1/include/winstring.h 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/include/winstring.h 2014-12-15 00:45:34.000000000 +0000 @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2014 Martin Storsjo + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_WINSTRING_H +#define __WINE_WINSTRING_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +HRESULT WINAPI WindowsCompareStringOrdinal(HSTRING str1, HSTRING str2, INT32 *order); +HRESULT WINAPI WindowsConcatString(HSTRING str1, HSTRING str2, HSTRING *out); +HRESULT WINAPI WindowsCreateString(LPCWSTR ptr, UINT32 len, HSTRING *out); +HRESULT WINAPI WindowsCreateStringReference(LPCWSTR ptr, UINT32 len, + HSTRING_HEADER *header, HSTRING *out); +HRESULT WINAPI WindowsDeleteString(HSTRING str); +HRESULT WINAPI WindowsDeleteStringBuffer(HSTRING_BUFFER buf); +HRESULT WINAPI WindowsDuplicateString(HSTRING str, HSTRING *out); +UINT32 WINAPI WindowsGetStringLen(HSTRING str); +LPCWSTR WINAPI WindowsGetStringRawBuffer(HSTRING str, UINT32 *len); +BOOL WINAPI WindowsIsStringEmpty(HSTRING str); +HRESULT WINAPI WindowsPreallocateStringBuffer(UINT32 len, WCHAR **outptr, HSTRING_BUFFER *out); +HRESULT WINAPI WindowsPromoteStringBuffer(HSTRING_BUFFER buf, HSTRING *out); +HRESULT WINAPI WindowsReplaceString(HSTRING haystack, HSTRING needle, HSTRING replacement, + HSTRING *out); +HRESULT WINAPI WindowsStringHasEmbeddedNull(HSTRING str, BOOL *out); +HRESULT WINAPI WindowsSubstring(HSTRING str, UINT32 pos, HSTRING *out); +HRESULT WINAPI WindowsSubstringWithSpecifiedLength(HSTRING str, UINT32 pos, + UINT32 len, HSTRING *out); +HRESULT WINAPI WindowsTrimStringEnd(HSTRING str, HSTRING charstr, HSTRING *out); +HRESULT WINAPI WindowsTrimStringStart(HSTRING str, HSTRING charstr, HSTRING *out); + +#ifdef __cplusplus +} +#endif + +#endif /* __WINE_WINSTRING_H */ diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0001-api-ms-win-core-fibers-l1-1-0-Add-dll.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0001-api-ms-win-core-fibers-l1-1-0-Add-dll.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0001-api-ms-win-core-fibers-l1-1-0-Add-dll.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0001-api-ms-win-core-fibers-l1-1-0-Add-dll.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -From f15052fa02af7b2cfa23131b713ba95a2bc1cfd5 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Wed, 26 Nov 2014 21:31:43 +0100 -Subject: api-ms-win-core-fibers-l1-1-0: Add dll. - ---- - configure.ac | 1 + - dlls/api-ms-win-core-fibers-l1-1-0/Makefile.in | 1 + - dlls/api-ms-win-core-fibers-l1-1-0/api-ms-win-core-fibers-l1-1-0.spec | 4 ++++ - tools/make_specfiles | 1 + - 4 files changed, 7 insertions(+) - create mode 100644 dlls/api-ms-win-core-fibers-l1-1-0/Makefile.in - create mode 100644 dlls/api-ms-win-core-fibers-l1-1-0/api-ms-win-core-fibers-l1-1-0.spec - -diff --git a/configure.ac b/configure.ac -index 04bcbd8..08baf3d 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -2649,6 +2649,7 @@ WINE_CONFIG_DLL(api-ms-win-core-com-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-console-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-debug-l1-1-1) - WINE_CONFIG_DLL(api-ms-win-core-errorhandling-l1-1-1) -+WINE_CONFIG_DLL(api-ms-win-core-fibers-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-file-l1-2-0) - WINE_CONFIG_DLL(api-ms-win-core-handle-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-heap-l1-2-0) -diff --git a/dlls/api-ms-win-core-fibers-l1-1-0/Makefile.in b/dlls/api-ms-win-core-fibers-l1-1-0/Makefile.in -new file mode 100644 -index 0000000..f4cc782 ---- /dev/null -+++ b/dlls/api-ms-win-core-fibers-l1-1-0/Makefile.in -@@ -0,0 +1 @@ -+MODULE = api-ms-win-core-fibers-l1-1-0.dll -diff --git a/dlls/api-ms-win-core-fibers-l1-1-0/api-ms-win-core-fibers-l1-1-0.spec b/dlls/api-ms-win-core-fibers-l1-1-0/api-ms-win-core-fibers-l1-1-0.spec -new file mode 100644 -index 0000000..26afab1 ---- /dev/null -+++ b/dlls/api-ms-win-core-fibers-l1-1-0/api-ms-win-core-fibers-l1-1-0.spec -@@ -0,0 +1,4 @@ -+@ stdcall FlsAlloc(ptr) kernel32.FlsAlloc -+@ stdcall FlsFree(long) kernel32.FlsFree -+@ stdcall FlsGetValue(long) kernel32.FlsGetValue -+@ stdcall FlsSetValue(long ptr) kernel32.FlsSetValue -diff --git a/tools/make_specfiles b/tools/make_specfiles -index 9eae0ac..7f232f3 100755 ---- a/tools/make_specfiles -+++ b/tools/make_specfiles -@@ -134,6 +134,7 @@ my @dll_groups = - "api-ms-win-core-processthreads-l1-1-1", - "api-ms-win-core-debug-l1-1-1", - "api-ms-win-core-errorhandling-l1-1-1", -+ "api-ms-win-core-fibers-l1-1-0", - "api-ms-win-core-interlocked-l1-2-0", - "api-ms-win-core-profile-l1-1-0", - "api-ms-win-core-string-l1-1-0", --- -1.9.1 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0002-api-ms-win-core-fibers-l1-1-1-Add-dll.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0002-api-ms-win-core-fibers-l1-1-1-Add-dll.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0002-api-ms-win-core-fibers-l1-1-1-Add-dll.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0002-api-ms-win-core-fibers-l1-1-1-Add-dll.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -From db337923b88b8c4ee1d3ff1dfdf2f23342d6e050 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Wed, 26 Nov 2014 18:09:04 +0100 -Subject: api-ms-win-core-fibers-l1-1-1: Add dll. - ---- - configure.ac | 1 + - dlls/api-ms-win-core-fibers-l1-1-1/Makefile.in | 1 + - .../api-ms-win-core-fibers-l1-1-1/api-ms-win-core-fibers-l1-1-1.spec | 5 +++++ - tools/make_specfiles | 1 + - 4 files changed, 8 insertions(+) - create mode 100644 dlls/api-ms-win-core-fibers-l1-1-1/Makefile.in - create mode 100644 dlls/api-ms-win-core-fibers-l1-1-1/api-ms-win-core-fibers-l1-1-1.spec - -diff --git a/configure.ac b/configure.ac -index 08baf3d..2e520b7 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -2650,6 +2650,7 @@ WINE_CONFIG_DLL(api-ms-win-core-console-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-debug-l1-1-1) - WINE_CONFIG_DLL(api-ms-win-core-errorhandling-l1-1-1) - WINE_CONFIG_DLL(api-ms-win-core-fibers-l1-1-0) -+WINE_CONFIG_DLL(api-ms-win-core-fibers-l1-1-1) - WINE_CONFIG_DLL(api-ms-win-core-file-l1-2-0) - WINE_CONFIG_DLL(api-ms-win-core-handle-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-heap-l1-2-0) -diff --git a/dlls/api-ms-win-core-fibers-l1-1-1/Makefile.in b/dlls/api-ms-win-core-fibers-l1-1-1/Makefile.in -new file mode 100644 -index 0000000..98b7880 ---- /dev/null -+++ b/dlls/api-ms-win-core-fibers-l1-1-1/Makefile.in -@@ -0,0 +1 @@ -+MODULE = api-ms-win-core-fibers-l1-1-1.dll -diff --git a/dlls/api-ms-win-core-fibers-l1-1-1/api-ms-win-core-fibers-l1-1-1.spec b/dlls/api-ms-win-core-fibers-l1-1-1/api-ms-win-core-fibers-l1-1-1.spec -new file mode 100644 -index 0000000..4947543 ---- /dev/null -+++ b/dlls/api-ms-win-core-fibers-l1-1-1/api-ms-win-core-fibers-l1-1-1.spec -@@ -0,0 +1,5 @@ -+@ stdcall FlsAlloc(ptr) kernel32.FlsAlloc -+@ stdcall FlsFree(long) kernel32.FlsFree -+@ stdcall FlsGetValue(long) kernel32.FlsGetValue -+@ stdcall FlsSetValue(long ptr) kernel32.FlsSetValue -+@ stdcall IsThreadAFiber() kernel32.IsThreadAFiber -diff --git a/tools/make_specfiles b/tools/make_specfiles -index 7f232f3..e9fe690 100755 ---- a/tools/make_specfiles -+++ b/tools/make_specfiles -@@ -135,6 +135,7 @@ my @dll_groups = - "api-ms-win-core-debug-l1-1-1", - "api-ms-win-core-errorhandling-l1-1-1", - "api-ms-win-core-fibers-l1-1-0", -+ "api-ms-win-core-fibers-l1-1-1", - "api-ms-win-core-interlocked-l1-2-0", - "api-ms-win-core-profile-l1-1-0", - "api-ms-win-core-string-l1-1-0", --- -1.9.1 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0003-api-ms-win-core-file-l2-1-0-Add-dll.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0003-api-ms-win-core-file-l2-1-0-Add-dll.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0003-api-ms-win-core-file-l2-1-0-Add-dll.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0003-api-ms-win-core-file-l2-1-0-Add-dll.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -From 3b0b1a819646462793dc613c5c26b0bb5cb99359 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Wed, 26 Nov 2014 18:33:41 +0100 -Subject: api-ms-win-core-file-l2-1-0: Add dll. - ---- - configure.ac | 1 + - dlls/api-ms-win-core-file-l2-1-0/Makefile.in | 1 + - .../api-ms-win-core-file-l2-1-0.spec | 11 +++++++++++ - tools/make_specfiles | 1 + - 4 files changed, 14 insertions(+) - create mode 100644 dlls/api-ms-win-core-file-l2-1-0/Makefile.in - create mode 100644 dlls/api-ms-win-core-file-l2-1-0/api-ms-win-core-file-l2-1-0.spec - -diff --git a/configure.ac b/configure.ac -index 2e520b7..66ff875 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -2652,6 +2652,7 @@ WINE_CONFIG_DLL(api-ms-win-core-errorhandling-l1-1-1) - WINE_CONFIG_DLL(api-ms-win-core-fibers-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-fibers-l1-1-1) - WINE_CONFIG_DLL(api-ms-win-core-file-l1-2-0) -+WINE_CONFIG_DLL(api-ms-win-core-file-l2-1-0) - WINE_CONFIG_DLL(api-ms-win-core-handle-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-heap-l1-2-0) - WINE_CONFIG_DLL(api-ms-win-core-heap-obsolete-l1-1-0) -diff --git a/dlls/api-ms-win-core-file-l2-1-0/Makefile.in b/dlls/api-ms-win-core-file-l2-1-0/Makefile.in -new file mode 100644 -index 0000000..8edf54e ---- /dev/null -+++ b/dlls/api-ms-win-core-file-l2-1-0/Makefile.in -@@ -0,0 +1 @@ -+MODULE = api-ms-win-core-file-l2-1-0.dll -diff --git a/dlls/api-ms-win-core-file-l2-1-0/api-ms-win-core-file-l2-1-0.spec b/dlls/api-ms-win-core-file-l2-1-0/api-ms-win-core-file-l2-1-0.spec -new file mode 100644 -index 0000000..914e0c0 ---- /dev/null -+++ b/dlls/api-ms-win-core-file-l2-1-0/api-ms-win-core-file-l2-1-0.spec -@@ -0,0 +1,11 @@ -+@ stub CopyFile2 -+@ stdcall CopyFileExW(wstr wstr ptr ptr ptr long) kernel32.CopyFileExW -+@ stdcall CreateDirectoryExW(wstr wstr ptr) kernel32.CreateDirectoryExW -+@ stdcall CreateHardLinkW(wstr wstr ptr) kernel32.CreateHardLinkW -+@ stub CreateSymbolicLinkW -+@ stdcall GetFileInformationByHandleEx(long long ptr long) kernel32.GetFileInformationByHandleEx -+@ stdcall MoveFileExW(wstr wstr long) kernel32.MoveFileExW -+@ stdcall MoveFileWithProgressW(wstr wstr ptr ptr long) kernel32.MoveFileWithProgressW -+@ stub ReOpenFile -+@ stdcall ReadDirectoryChangesW(long ptr long long long ptr ptr ptr) kernel32.ReadDirectoryChangesW -+@ stdcall ReplaceFileW(wstr wstr wstr long ptr ptr) kernel32.ReplaceFileW -diff --git a/tools/make_specfiles b/tools/make_specfiles -index e9fe690..0526dad 100755 ---- a/tools/make_specfiles -+++ b/tools/make_specfiles -@@ -144,6 +144,7 @@ my @dll_groups = - "api-ms-win-core-synch-l1-2-0", - "api-ms-win-core-console-l1-1-0", - "api-ms-win-core-file-l1-2-0", -+ "api-ms-win-core-file-l2-1-0", - "api-ms-win-core-handle-l1-1-0", - "api-ms-win-core-heap-l1-2-0", - "api-ms-win-core-heap-obsolete-l1-1-0", --- -1.9.1 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0004-api-ms-win-core-localization-l1-2-1-Add-dll.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0004-api-ms-win-core-localization-l1-2-1-Add-dll.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0004-api-ms-win-core-localization-l1-2-1-Add-dll.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0004-api-ms-win-core-localization-l1-2-1-Add-dll.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,114 +0,0 @@ -From 632b42d0b87dbfae613321374723d02ac6ddd3b1 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Wed, 26 Nov 2014 18:46:49 +0100 -Subject: api-ms-win-core-localization-l1-2-1: Add dll. - ---- - configure.ac | 1 + - .../Makefile.in | 1 + - .../api-ms-win-core-localization-l1-2-1.spec | 60 ++++++++++++++++++++++ - tools/make_specfiles | 1 + - 4 files changed, 63 insertions(+) - create mode 100644 dlls/api-ms-win-core-localization-l1-2-1/Makefile.in - create mode 100644 dlls/api-ms-win-core-localization-l1-2-1/api-ms-win-core-localization-l1-2-1.spec - -diff --git a/configure.ac b/configure.ac -index 66ff875..de6f5f3 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -2661,6 +2661,7 @@ WINE_CONFIG_DLL(api-ms-win-core-io-l1-1-1) - WINE_CONFIG_DLL(api-ms-win-core-kernel32-legacy-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-libraryloader-l1-1-1) - WINE_CONFIG_DLL(api-ms-win-core-localization-l1-2-0) -+WINE_CONFIG_DLL(api-ms-win-core-localization-l1-2-1) - WINE_CONFIG_DLL(api-ms-win-core-localization-obsolete-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-localregistry-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-memory-l1-1-1) -diff --git a/dlls/api-ms-win-core-localization-l1-2-1/Makefile.in b/dlls/api-ms-win-core-localization-l1-2-1/Makefile.in -new file mode 100644 -index 0000000..e5208a8 ---- /dev/null -+++ b/dlls/api-ms-win-core-localization-l1-2-1/Makefile.in -@@ -0,0 +1 @@ -+MODULE = api-ms-win-core-localization-l1-2-1.dll -diff --git a/dlls/api-ms-win-core-localization-l1-2-1/api-ms-win-core-localization-l1-2-1.spec b/dlls/api-ms-win-core-localization-l1-2-1/api-ms-win-core-localization-l1-2-1.spec -new file mode 100644 -index 0000000..ccba739 ---- /dev/null -+++ b/dlls/api-ms-win-core-localization-l1-2-1/api-ms-win-core-localization-l1-2-1.spec -@@ -0,0 +1,60 @@ -+@ stdcall ConvertDefaultLocale(long) kernel32.ConvertDefaultLocale -+@ stdcall EnumSystemGeoID(long long ptr) kernel32.EnumSystemGeoID -+@ stdcall EnumSystemLocalesA(ptr long) kernel32.EnumSystemLocalesA -+@ stdcall EnumSystemLocalesEx(ptr long long ptr) kernel32.EnumSystemLocalesEx -+@ stdcall EnumSystemLocalesW(ptr long) kernel32.EnumSystemLocalesW -+@ stub FindNLSString -+@ stub FindNLSStringEx -+@ stdcall FormatMessageA(long ptr long long ptr long ptr) kernel32.FormatMessageA -+@ stdcall FormatMessageW(long ptr long long ptr long ptr) kernel32.FormatMessageW -+@ stdcall GetACP() kernel32.GetACP -+@ stdcall GetCPInfo(long ptr) kernel32.GetCPInfo -+@ stdcall GetCPInfoExW(long long ptr) kernel32.GetCPInfoExW -+@ stdcall GetCalendarInfoEx(wstr long ptr long ptr long ptr) kernel32.GetCalendarInfoEx -+@ stdcall GetCalendarInfoW(long long long ptr long ptr) kernel32.GetCalendarInfoW -+@ stub GetFileMUIInfo -+@ stub GetFileMUIPath -+@ stdcall GetGeoInfoW(long long ptr long long) kernel32.GetGeoInfoW -+@ stdcall GetLocaleInfoA(long long ptr long) kernel32.GetLocaleInfoA -+@ stdcall GetLocaleInfoEx(wstr long ptr long) kernel32.GetLocaleInfoEx -+@ stdcall GetLocaleInfoW(long long ptr long) kernel32.GetLocaleInfoW -+@ stub GetNLSVersion -+@ stub GetNLSVersionEx -+@ stdcall GetOEMCP() kernel32.GetOEMCP -+@ stub GetProcessPreferredUILanguages -+@ stdcall GetSystemDefaultLCID() kernel32.GetSystemDefaultLCID -+@ stdcall GetSystemDefaultLangID() kernel32.GetSystemDefaultLangID -+@ stub GetSystemPreferredUILanguages -+@ stdcall GetThreadLocale() kernel32.GetThreadLocale -+@ stdcall GetThreadPreferredUILanguages(long ptr ptr ptr) kernel32.GetThreadPreferredUILanguages -+@ stdcall GetThreadUILanguage() kernel32.GetThreadUILanguage -+@ stub GetUILanguageInfo -+@ stdcall GetUserDefaultLCID() kernel32.GetUserDefaultLCID -+@ stdcall GetUserDefaultLangID() kernel32.GetUserDefaultLangID -+@ stdcall GetUserDefaultLocaleName(ptr long) kernel32.GetUserDefaultLocaleName -+@ stdcall GetUserGeoID(long) kernel32.GetUserGeoID -+@ stub GetUserPreferredUILanguages -+@ stdcall IdnToAscii(long wstr long ptr long) kernel32.IdnToAscii -+@ stdcall IdnToUnicode(long wstr long ptr long) kernel32.IdnToUnicode -+@ stdcall IsDBCSLeadByte(long) kernel32.IsDBCSLeadByte -+@ stdcall IsDBCSLeadByteEx(long long) kernel32.IsDBCSLeadByteEx -+@ stub IsNLSDefinedString -+@ stdcall IsValidCodePage(long) kernel32.IsValidCodePage -+@ stdcall IsValidLanguageGroup(long long) kernel32.IsValidLanguageGroup -+@ stdcall IsValidLocale(long long) kernel32.IsValidLocale -+@ stdcall IsValidLocaleName(wstr) kernel32.IsValidLocaleName -+@ stub IsValidNLSVersion -+@ stdcall LCMapStringA(long long str long ptr long) kernel32.LCMapStringA -+@ stdcall LCMapStringEx(wstr long wstr long ptr long ptr ptr long) kernel32.LCMapStringEx -+@ stdcall LCMapStringW(long long wstr long ptr long) kernel32.LCMapStringW -+@ stdcall LocaleNameToLCID(wstr long) kernel32.LocaleNameToLCID -+@ stub ResolveLocaleName -+@ stdcall SetCalendarInfoW(long long long wstr) kernel32.SetCalendarInfoW -+@ stdcall SetLocaleInfoW(long long wstr) kernel32.SetLocaleInfoW -+@ stub SetProcessPreferredUILanguages -+@ stdcall SetThreadLocale(long) kernel32.SetThreadLocale -+@ stdcall SetThreadPreferredUILanguages(long ptr ptr) kernel32.SetThreadPreferredUILanguages -+@ stdcall SetThreadUILanguage(long) kernel32.SetThreadUILanguage -+@ stdcall SetUserGeoID(long) kernel32.SetUserGeoID -+@ stdcall VerLanguageNameA(long str long) kernel32.VerLanguageNameA -+@ stdcall VerLanguageNameW(long wstr long) kernel32.VerLanguageNameW -diff --git a/tools/make_specfiles b/tools/make_specfiles -index 0526dad..1896b86 100755 ---- a/tools/make_specfiles -+++ b/tools/make_specfiles -@@ -152,6 +152,7 @@ my @dll_groups = - "api-ms-win-core-kernel32-legacy-l1-1-0", - "api-ms-win-core-libraryloader-l1-1-1", - "api-ms-win-core-localization-l1-2-0", -+ "api-ms-win-core-localization-l1-2-1", - "api-ms-win-core-localization-obsolete-l1-1-0", - "api-ms-win-core-memory-l1-1-1", - "api-ms-win-core-namedpipe-l1-2-0", --- -1.9.1 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0005-api-ms-win-core-datetime-l1-1-0-Add-dll.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0005-api-ms-win-core-datetime-l1-1-0-Add-dll.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0005-api-ms-win-core-datetime-l1-1-0-Add-dll.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0005-api-ms-win-core-datetime-l1-1-0-Add-dll.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -From 68f5f730c4ae543796680c701a145f70f76ebb1f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Wed, 26 Nov 2014 21:50:28 +0100 -Subject: api-ms-win-core-datetime-l1-1-0: Add dll. - ---- - configure.ac | 1 + - dlls/api-ms-win-core-datetime-l1-1-0/Makefile.in | 1 + - .../api-ms-win-core-datetime-l1-1-0.spec | 4 ++++ - tools/make_specfiles | 1 + - 4 files changed, 7 insertions(+) - create mode 100644 dlls/api-ms-win-core-datetime-l1-1-0/Makefile.in - create mode 100644 dlls/api-ms-win-core-datetime-l1-1-0/api-ms-win-core-datetime-l1-1-0.spec - -diff --git a/configure.ac b/configure.ac -index de6f5f3..ba780cb 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -2647,6 +2647,7 @@ WINE_CONFIG_DLL(amstream,,[clean]) - WINE_CONFIG_TEST(dlls/amstream/tests) - WINE_CONFIG_DLL(api-ms-win-core-com-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-console-l1-1-0) -+WINE_CONFIG_DLL(api-ms-win-core-datetime-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-debug-l1-1-1) - WINE_CONFIG_DLL(api-ms-win-core-errorhandling-l1-1-1) - WINE_CONFIG_DLL(api-ms-win-core-fibers-l1-1-0) -diff --git a/dlls/api-ms-win-core-datetime-l1-1-0/Makefile.in b/dlls/api-ms-win-core-datetime-l1-1-0/Makefile.in -new file mode 100644 -index 0000000..f722f65 ---- /dev/null -+++ b/dlls/api-ms-win-core-datetime-l1-1-0/Makefile.in -@@ -0,0 +1 @@ -+MODULE = api-ms-win-core-datetime-l1-1-0.dll -diff --git a/dlls/api-ms-win-core-datetime-l1-1-0/api-ms-win-core-datetime-l1-1-0.spec b/dlls/api-ms-win-core-datetime-l1-1-0/api-ms-win-core-datetime-l1-1-0.spec -new file mode 100644 -index 0000000..c49cf5e ---- /dev/null -+++ b/dlls/api-ms-win-core-datetime-l1-1-0/api-ms-win-core-datetime-l1-1-0.spec -@@ -0,0 +1,4 @@ -+@ stdcall GetDateFormatA(long long ptr str ptr long) kernel32.GetDateFormatA -+@ stdcall GetDateFormatW(long long ptr wstr ptr long) kernel32.GetDateFormatW -+@ stdcall GetTimeFormatA(long long ptr str ptr long) kernel32.GetTimeFormatA -+@ stdcall GetTimeFormatW(long long ptr wstr ptr long) kernel32.GetTimeFormatW -diff --git a/tools/make_specfiles b/tools/make_specfiles -index 1896b86..abb6598 100755 ---- a/tools/make_specfiles -+++ b/tools/make_specfiles -@@ -132,6 +132,7 @@ my @dll_groups = - "api-ms-win-downlevel-normaliz-l1-1-0", - "api-ms-win-core-processthreads-l1-1-0", - "api-ms-win-core-processthreads-l1-1-1", -+ "api-ms-win-core-datetime-l1-1-0", - "api-ms-win-core-debug-l1-1-1", - "api-ms-win-core-errorhandling-l1-1-1", - "api-ms-win-core-fibers-l1-1-0", --- -1.9.1 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0006-api-ms-win-core-datetime-l1-1-1-Add-stub-dll.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0006-api-ms-win-core-datetime-l1-1-1-Add-stub-dll.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0006-api-ms-win-core-datetime-l1-1-1-Add-stub-dll.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0006-api-ms-win-core-datetime-l1-1-1-Add-stub-dll.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -From a76edebdf974e92b8901605379dd29410bc5906d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Wed, 26 Nov 2014 18:53:12 +0100 -Subject: api-ms-win-core-datetime-l1-1-1: Add stub dll. - ---- - configure.ac | 1 + - dlls/api-ms-win-core-datetime-l1-1-1/Makefile.in | 1 + - .../api-ms-win-core-datetime-l1-1-1.spec | 6 ++++++ - tools/make_specfiles | 1 + - 4 files changed, 9 insertions(+) - create mode 100644 dlls/api-ms-win-core-datetime-l1-1-1/Makefile.in - create mode 100644 dlls/api-ms-win-core-datetime-l1-1-1/api-ms-win-core-datetime-l1-1-1.spec - -diff --git a/configure.ac b/configure.ac -index ba780cb..acf34f8 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -2648,6 +2648,7 @@ WINE_CONFIG_TEST(dlls/amstream/tests) - WINE_CONFIG_DLL(api-ms-win-core-com-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-console-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-datetime-l1-1-0) -+WINE_CONFIG_DLL(api-ms-win-core-datetime-l1-1-1) - WINE_CONFIG_DLL(api-ms-win-core-debug-l1-1-1) - WINE_CONFIG_DLL(api-ms-win-core-errorhandling-l1-1-1) - WINE_CONFIG_DLL(api-ms-win-core-fibers-l1-1-0) -diff --git a/dlls/api-ms-win-core-datetime-l1-1-1/Makefile.in b/dlls/api-ms-win-core-datetime-l1-1-1/Makefile.in -new file mode 100644 -index 0000000..2bf9501 ---- /dev/null -+++ b/dlls/api-ms-win-core-datetime-l1-1-1/Makefile.in -@@ -0,0 +1 @@ -+MODULE = api-ms-win-core-datetime-l1-1-1.dll -diff --git a/dlls/api-ms-win-core-datetime-l1-1-1/api-ms-win-core-datetime-l1-1-1.spec b/dlls/api-ms-win-core-datetime-l1-1-1/api-ms-win-core-datetime-l1-1-1.spec -new file mode 100644 -index 0000000..5630929 ---- /dev/null -+++ b/dlls/api-ms-win-core-datetime-l1-1-1/api-ms-win-core-datetime-l1-1-1.spec -@@ -0,0 +1,6 @@ -+@ stdcall GetDateFormatA(long long ptr str ptr long) kernel32.GetDateFormatA -+@ stub GetDateFormatEx -+@ stdcall GetDateFormatW(long long ptr wstr ptr long) kernel32.GetDateFormatW -+@ stdcall GetTimeFormatA(long long ptr str ptr long) kernel32.GetTimeFormatA -+@ stub GetTimeFormatEx -+@ stdcall GetTimeFormatW(long long ptr wstr ptr long) kernel32.GetTimeFormatW -diff --git a/tools/make_specfiles b/tools/make_specfiles -index abb6598..71757a2 100755 ---- a/tools/make_specfiles -+++ b/tools/make_specfiles -@@ -133,6 +133,7 @@ my @dll_groups = - "api-ms-win-core-processthreads-l1-1-0", - "api-ms-win-core-processthreads-l1-1-1", - "api-ms-win-core-datetime-l1-1-0", -+ "api-ms-win-core-datetime-l1-1-1", - "api-ms-win-core-debug-l1-1-1", - "api-ms-win-core-errorhandling-l1-1-1", - "api-ms-win-core-fibers-l1-1-0", --- -1.9.1 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0007-api-ms-win-core-xstate-l2-1-0-Add-stub-dll.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0007-api-ms-win-core-xstate-l2-1-0-Add-stub-dll.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0007-api-ms-win-core-xstate-l2-1-0-Add-stub-dll.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0007-api-ms-win-core-xstate-l2-1-0-Add-stub-dll.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -From 26fdfe057afab41055eb1042f99f7aa603b399e7 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Wed, 26 Nov 2014 19:07:20 +0100 -Subject: api-ms-win-core-xstate-l2-1-0: Add stub dll. - ---- - configure.ac | 1 + - dlls/api-ms-win-core-xstate-l2-1-0/Makefile.in | 1 + - .../api-ms-win-core-xstate-l2-1-0.spec | 6 ++++++ - tools/make_specfiles | 1 + - 4 files changed, 9 insertions(+) - create mode 100644 dlls/api-ms-win-core-xstate-l2-1-0/Makefile.in - create mode 100644 dlls/api-ms-win-core-xstate-l2-1-0/api-ms-win-core-xstate-l2-1-0.spec - -diff --git a/configure.ac b/configure.ac -index acf34f8..dbf1695 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -2685,6 +2685,7 @@ WINE_CONFIG_DLL(api-ms-win-core-url-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-util-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-winrt-error-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-winrt-string-l1-1-0) -+WINE_CONFIG_DLL(api-ms-win-core-xstate-l2-1-0) - WINE_CONFIG_DLL(api-ms-win-downlevel-advapi32-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-downlevel-advapi32-l2-1-0) - WINE_CONFIG_DLL(api-ms-win-downlevel-normaliz-l1-1-0) -diff --git a/dlls/api-ms-win-core-xstate-l2-1-0/Makefile.in b/dlls/api-ms-win-core-xstate-l2-1-0/Makefile.in -new file mode 100644 -index 0000000..9fafff3 ---- /dev/null -+++ b/dlls/api-ms-win-core-xstate-l2-1-0/Makefile.in -@@ -0,0 +1 @@ -+MODULE = api-ms-win-core-xstate-l2-1-0.dll -diff --git a/dlls/api-ms-win-core-xstate-l2-1-0/api-ms-win-core-xstate-l2-1-0.spec b/dlls/api-ms-win-core-xstate-l2-1-0/api-ms-win-core-xstate-l2-1-0.spec -new file mode 100644 -index 0000000..0f9438d ---- /dev/null -+++ b/dlls/api-ms-win-core-xstate-l2-1-0/api-ms-win-core-xstate-l2-1-0.spec -@@ -0,0 +1,6 @@ -+@ stub CopyContext -+@ stub GetEnabledXStateFeatures -+@ stub GetXStateFeaturesMask -+@ stub InitializeContext -+@ stub LocateXStateFeature -+@ stub SetXStateFeaturesMask -diff --git a/tools/make_specfiles b/tools/make_specfiles -index 71757a2..90fc838 100755 ---- a/tools/make_specfiles -+++ b/tools/make_specfiles -@@ -162,6 +162,7 @@ my @dll_groups = - "api-ms-win-core-psapi-l1-1-0", - "api-ms-win-core-threadpool-legacy-l1-1-0", - "api-ms-win-core-timezone-l1-1-0", -+ "api-ms-win-core-xstate-l2-1-0", - ], - [ - "ole32", --- -1.9.1 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0008-api-ms-win-core-winrt-l1-1-0-Add-stub-dll.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0008-api-ms-win-core-winrt-l1-1-0-Add-stub-dll.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0008-api-ms-win-core-winrt-l1-1-0-Add-stub-dll.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0008-api-ms-win-core-winrt-l1-1-0-Add-stub-dll.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -From e2bf5c71085b978c4b885e30f95a0c1d9ed08eeb Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Wed, 26 Nov 2014 19:56:40 +0100 -Subject: api-ms-win-core-winrt-l1-1-0: Add stub dll. - ---- - configure.ac | 1 + - dlls/api-ms-win-core-winrt-l1-1-0/Makefile.in | 1 + - .../api-ms-win-core-winrt-l1-1-0.spec | 9 +++++++++ - 3 files changed, 11 insertions(+) - create mode 100644 dlls/api-ms-win-core-winrt-l1-1-0/Makefile.in - create mode 100644 dlls/api-ms-win-core-winrt-l1-1-0/api-ms-win-core-winrt-l1-1-0.spec - -diff --git a/configure.ac b/configure.ac -index dbf1695..f527861 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -2684,6 +2684,7 @@ WINE_CONFIG_DLL(api-ms-win-core-timezone-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-url-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-util-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-winrt-error-l1-1-0) -+WINE_CONFIG_DLL(api-ms-win-core-winrt-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-winrt-string-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-xstate-l2-1-0) - WINE_CONFIG_DLL(api-ms-win-downlevel-advapi32-l1-1-0) -diff --git a/dlls/api-ms-win-core-winrt-l1-1-0/Makefile.in b/dlls/api-ms-win-core-winrt-l1-1-0/Makefile.in -new file mode 100644 -index 0000000..1660441 ---- /dev/null -+++ b/dlls/api-ms-win-core-winrt-l1-1-0/Makefile.in -@@ -0,0 +1 @@ -+MODULE = api-ms-win-core-winrt-l1-1-0.dll -diff --git a/dlls/api-ms-win-core-winrt-l1-1-0/api-ms-win-core-winrt-l1-1-0.spec b/dlls/api-ms-win-core-winrt-l1-1-0/api-ms-win-core-winrt-l1-1-0.spec -new file mode 100644 -index 0000000..08409ee ---- /dev/null -+++ b/dlls/api-ms-win-core-winrt-l1-1-0/api-ms-win-core-winrt-l1-1-0.spec -@@ -0,0 +1,9 @@ -+@ stub RoActivateInstance -+@ stub RoGetActivationFactory -+@ stub RoGetApartmentIdentifier -+@ stub RoInitialize -+@ stub RoRegisterActivationFactories -+@ stub RoRegisterForApartmentShutdown -+@ stub RoRevokeActivationFactories -+@ stub RoUninitialize -+@ stub RoUnregisterForApartmentShutdown --- -1.9.1 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0009-api-ms-win-core-winrt-error-l1-1-1-Add-stub-dll.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0009-api-ms-win-core-winrt-error-l1-1-1-Add-stub-dll.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0009-api-ms-win-core-winrt-error-l1-1-1-Add-stub-dll.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/api-ms-win-core-Stubs/0009-api-ms-win-core-winrt-error-l1-1-1-Add-stub-dll.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -From 5ba78d48fe540ae4d5ae8b1c434983498fa8d2ca Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Wed, 26 Nov 2014 20:13:34 +0100 -Subject: api-ms-win-core-winrt-error-l1-1-1: Add stub dll. - ---- - configure.ac | 1 + - dlls/api-ms-win-core-winrt-error-l1-1-1/Makefile.in | 1 + - .../api-ms-win-core-winrt-error-l1-1-1.spec | 19 +++++++++++++++++++ - 3 files changed, 21 insertions(+) - create mode 100644 dlls/api-ms-win-core-winrt-error-l1-1-1/Makefile.in - create mode 100644 dlls/api-ms-win-core-winrt-error-l1-1-1/api-ms-win-core-winrt-error-l1-1-1.spec - -diff --git a/configure.ac b/configure.ac -index f527861..b9b0e54 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -2684,6 +2684,7 @@ WINE_CONFIG_DLL(api-ms-win-core-timezone-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-url-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-util-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-winrt-error-l1-1-0) -+WINE_CONFIG_DLL(api-ms-win-core-winrt-error-l1-1-1) - WINE_CONFIG_DLL(api-ms-win-core-winrt-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-winrt-string-l1-1-0) - WINE_CONFIG_DLL(api-ms-win-core-xstate-l2-1-0) -diff --git a/dlls/api-ms-win-core-winrt-error-l1-1-1/Makefile.in b/dlls/api-ms-win-core-winrt-error-l1-1-1/Makefile.in -new file mode 100644 -index 0000000..fe36f7b ---- /dev/null -+++ b/dlls/api-ms-win-core-winrt-error-l1-1-1/Makefile.in -@@ -0,0 +1 @@ -+MODULE = api-ms-win-core-winrt-error-l1-1-1.dll -diff --git a/dlls/api-ms-win-core-winrt-error-l1-1-1/api-ms-win-core-winrt-error-l1-1-1.spec b/dlls/api-ms-win-core-winrt-error-l1-1-1/api-ms-win-core-winrt-error-l1-1-1.spec -new file mode 100644 -index 0000000..b1ad813 ---- /dev/null -+++ b/dlls/api-ms-win-core-winrt-error-l1-1-1/api-ms-win-core-winrt-error-l1-1-1.spec -@@ -0,0 +1,19 @@ -+@ stub GetRestrictedErrorInfo -+@ stub IsErrorPropagationEnabled -+@ stub RoCaptureErrorContext -+@ stub RoClearError -+@ stub RoFailFastWithErrorContext -+@ stub RoGetErrorReportingFlags -+@ stub RoGetMatchingRestrictedErrorInfo -+@ stub RoInspectCapturedStackBackTrace -+@ stub RoInspectThreadErrorInfo -+@ stub RoOriginateError -+@ stub RoOriginateErrorW -+@ stub RoOriginateLanguageException -+@ stub RoReportFailedDelegate -+@ stub RoReportUnhandledError -+@ stub RoResolveRestrictedErrorInfoReference -+@ stub RoSetErrorReportingFlags -+@ stub RoTransformError -+@ stub RoTransformErrorW -+@ stub SetRestrictedErrorInfo --- -1.9.1 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/avifil32-Realloc_Records/0001-avifil32-Reallocate-buffer-when-adding-records.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/avifil32-Realloc_Records/0001-avifil32-Reallocate-buffer-when-adding-records.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/avifil32-Realloc_Records/0001-avifil32-Reallocate-buffer-when-adding-records.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/avifil32-Realloc_Records/0001-avifil32-Reallocate-buffer-when-adding-records.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,43 @@ +From a7766bfbb41580091192539432c9372ceaf41c18 Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +Date: Fri, 12 Dec 2014 05:48:59 +0100 +Subject: avifil32: Reallocate buffer when adding records. + +Based on a patch by Bruno Jesus. +--- + dlls/avifil32/avifile.c | 19 ++++++++++++++----- + 1 file changed, 14 insertions(+), 5 deletions(-) + +diff --git a/dlls/avifil32/avifile.c b/dlls/avifil32/avifile.c +index af0315d..c7779c5 100644 +--- a/dlls/avifil32/avifile.c ++++ b/dlls/avifil32/avifile.c +@@ -1424,11 +1424,20 @@ static HRESULT AVIFILE_AddRecord(IAVIFileImpl *This) + /* pre-conditions */ + assert(This != NULL && This->ppStreams[0] != NULL); + +- if (This->idxRecords == NULL || This->cbIdxRecords == 0) { +- This->cbIdxRecords += 1024 * sizeof(AVIINDEXENTRY); +- This->idxRecords = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->cbIdxRecords); +- if (This->idxRecords == NULL) +- return AVIERR_MEMORY; ++ if (This->idxRecords == NULL || This->cbIdxRecords / sizeof(AVIINDEXENTRY) <= This->nIdxRecords) { ++ DWORD new_count = This->cbIdxRecords + 1024 * sizeof(AVIINDEXENTRY); ++ if (!This->idxRecords) ++ { ++ This->idxRecords = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, new_count); ++ if (!This->idxRecords) return AVIERR_MEMORY; ++ } ++ else ++ { ++ void *new_buffer = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->idxRecords, new_count); ++ if (!new_buffer) return AVIERR_MEMORY; ++ This->idxRecords = new_buffer; ++ } ++ This->cbIdxRecords = new_count; + } + + assert(This->nIdxRecords < This->cbIdxRecords/sizeof(AVIINDEXENTRY)); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/avifil32-Realloc_Records/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/avifil32-Realloc_Records/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/avifil32-Realloc_Records/definition 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/avifil32-Realloc_Records/definition 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1 @@ +Fixes: [5137] Reallocate buffer when adding records to AVI files diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/combase-HSTRING/0001-combase-Implement-creation-and-deletion-of-HSTRING-o.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/combase-HSTRING/0001-combase-Implement-creation-and-deletion-of-HSTRING-o.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/combase-HSTRING/0001-combase-Implement-creation-and-deletion-of-HSTRING-o.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/combase-HSTRING/0001-combase-Implement-creation-and-deletion-of-HSTRING-o.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,390 @@ +From 0eaebb31a43736c90862d24f979c5a4dbe976d7d Mon Sep 17 00:00:00 2001 +From: Martin Storsjo +Date: Tue, 9 Dec 2014 10:36:48 +0200 +Subject: combase: Implement creation and deletion of HSTRING objects. + +--- + configure.ac | 1 + + .../api-ms-win-core-winrt-string-l1-1-0.spec | 8 +- + dlls/combase/Makefile.in | 3 +- + dlls/combase/combase.spec | 8 +- + dlls/combase/string.c | 143 +++++++++++++++++++++ + dlls/combase/tests/Makefile.in | 4 + + dlls/combase/tests/string.c | 128 ++++++++++++++++++ + tools/make_specfiles | 1 + + 8 files changed, 287 insertions(+), 9 deletions(-) + create mode 100644 dlls/combase/string.c + create mode 100644 dlls/combase/tests/Makefile.in + create mode 100644 dlls/combase/tests/string.c + +diff --git a/configure.ac b/configure.ac +index 400ee61..e214189 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -2758,6 +2758,7 @@ WINE_CONFIG_DLL(cards,,[implib]) + WINE_CONFIG_DLL(cfgmgr32,,[implib]) + WINE_CONFIG_DLL(clusapi,,[implib]) + WINE_CONFIG_DLL(combase) ++WINE_CONFIG_TEST(dlls/combase/tests) + WINE_CONFIG_DLL(comcat) + WINE_CONFIG_TEST(dlls/comcat/tests) + WINE_CONFIG_DLL(comctl32,,[implib,po]) +diff --git a/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec b/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec +index bc9035c..7658867 100644 +--- a/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec ++++ b/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec +@@ -8,11 +8,11 @@ + @ stub HSTRING_UserUnmarshal64 + @ stub WindowsCompareStringOrdinal + @ stub WindowsConcatString +-@ stub WindowsCreateString +-@ stub WindowsCreateStringReference +-@ stub WindowsDeleteString ++@ stdcall WindowsCreateString(ptr long ptr) combase.WindowsCreateString ++@ stdcall WindowsCreateStringReference(wstr long ptr ptr) combase.WindowsCreateStringReference ++@ stdcall WindowsDeleteString(ptr) combase.WindowsDeleteString + @ stub WindowsDeleteStringBuffer +-@ stub WindowsDuplicateString ++@ stdcall WindowsDuplicateString(ptr ptr) combase.WindowsDuplicateString + @ stub WindowsGetStringLen + @ stub WindowsGetStringRawBuffer + @ stub WindowsInspectString +diff --git a/dlls/combase/Makefile.in b/dlls/combase/Makefile.in +index 79d22a1..c5ab8d2 100644 +--- a/dlls/combase/Makefile.in ++++ b/dlls/combase/Makefile.in +@@ -2,4 +2,5 @@ MODULE = combase.dll + IMPORTS = ole32 + + C_SRCS = \ +- roapi.c ++ roapi.c \ ++ string.c +diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec +index 652eff6..f399d25 100644 +--- a/dlls/combase/combase.spec ++++ b/dlls/combase/combase.spec +@@ -289,11 +289,11 @@ + @ stub WdtpInterfacePointer_UserUnmarshal64 + @ stub WindowsCompareStringOrdinal + @ stub WindowsConcatString +-@ stub WindowsCreateString +-@ stub WindowsCreateStringReference +-@ stub WindowsDeleteString ++@ stdcall WindowsCreateString(ptr long ptr) ++@ stdcall WindowsCreateStringReference(wstr long ptr ptr) ++@ stdcall WindowsDeleteString(ptr) + @ stub WindowsDeleteStringBuffer +-@ stub WindowsDuplicateString ++@ stdcall WindowsDuplicateString(ptr ptr) + @ stub WindowsGetStringLen + @ stub WindowsGetStringRawBuffer + @ stub WindowsInspectString +diff --git a/dlls/combase/string.c b/dlls/combase/string.c +new file mode 100644 +index 0000000..ee2f5c0 +--- /dev/null ++++ b/dlls/combase/string.c +@@ -0,0 +1,143 @@ ++/* ++ * Copyright 2014 Martin Storsjo ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ++ */ ++ ++#include "winerror.h" ++#include "hstring.h" ++#include "windows.h" ++#include "wine/debug.h" ++#include ++ ++WINE_DEFAULT_DEBUG_CHANNEL(combase); ++ ++struct hstring_private ++{ ++ LPWSTR buffer; ++ UINT32 length; ++ BOOL reference; ++ LONG refcount; ++}; ++ ++C_ASSERT(sizeof(struct hstring_private) <= sizeof(HSTRING_HEADER)); ++ ++static inline struct hstring_private *impl_from_HSTRING(HSTRING string) ++{ ++ return (struct hstring_private *)string; ++} ++ ++static inline struct hstring_private *impl_from_HSTRING_HEADER(HSTRING_HEADER *header) ++{ ++ return (struct hstring_private *)header; ++} ++ ++static BOOL alloc_string(UINT32 len, HSTRING *out) ++{ ++ struct hstring_private *priv; ++ priv = HeapAlloc(GetProcessHeap(), 0, sizeof(*priv) + (len + 1) * sizeof(*priv->buffer)); ++ if (!priv) ++ return FALSE; ++ priv->buffer = (LPWSTR)(priv + 1); ++ priv->length = len; ++ priv->reference = FALSE; ++ priv->refcount = 1; ++ priv->buffer[len] = '\0'; ++ *out = (HSTRING)priv; ++ return TRUE; ++} ++ ++/*********************************************************************** ++ * WindowsCreateString (combase.@) ++ */ ++HRESULT WINAPI WindowsCreateString(LPCWSTR ptr, UINT32 len, ++ HSTRING *out) ++{ ++ struct hstring_private *priv; ++ if (out == NULL) ++ return E_INVALIDARG; ++ if (ptr == NULL && len > 0) ++ return E_POINTER; ++ if (len == 0) ++ { ++ *out = NULL; ++ return S_OK; ++ } ++ if (!alloc_string(len, out)) ++ return E_OUTOFMEMORY; ++ priv = impl_from_HSTRING(*out); ++ memcpy(priv->buffer, ptr, len * sizeof(*priv->buffer)); ++ return S_OK; ++} ++ ++/*********************************************************************** ++ * WindowsCreateStringReference (combase.@) ++ */ ++HRESULT WINAPI WindowsCreateStringReference(LPCWSTR ptr, UINT32 len, ++ HSTRING_HEADER *header, HSTRING *out) ++{ ++ struct hstring_private *priv = impl_from_HSTRING_HEADER(header); ++ if (out == NULL || header == NULL) ++ return E_INVALIDARG; ++ if (ptr == NULL && len > 0) ++ return E_POINTER; ++ if (ptr[len] != '\0') ++ return E_INVALIDARG; ++ if (len == 0) ++ { ++ *out = NULL; ++ return S_OK; ++ } ++ priv->buffer = (LPWSTR)ptr; ++ priv->length = len; ++ priv->reference = TRUE; ++ *out = (HSTRING)header; ++ return S_OK; ++} ++ ++/*********************************************************************** ++ * WindowsDeleteString (combase.@) ++ */ ++HRESULT WINAPI WindowsDeleteString(HSTRING str) ++{ ++ struct hstring_private *priv = impl_from_HSTRING(str); ++ if (str == NULL) ++ return S_OK; ++ if (priv->reference) ++ return S_OK; ++ if (InterlockedDecrement(&priv->refcount) == 0) ++ HeapFree(GetProcessHeap(), 0, priv); ++ return S_OK; ++} ++ ++/*********************************************************************** ++ * WindowsDuplicateString (combase.@) ++ */ ++HRESULT WINAPI WindowsDuplicateString(HSTRING str, HSTRING *out) ++{ ++ struct hstring_private *priv = impl_from_HSTRING(str); ++ if (out == NULL) ++ return E_INVALIDARG; ++ if (str == NULL) ++ { ++ *out = NULL; ++ return S_OK; ++ } ++ if (priv->reference) ++ return WindowsCreateString(priv->buffer, priv->length, out); ++ InterlockedIncrement(&priv->refcount); ++ *out = str; ++ return S_OK; ++} +diff --git a/dlls/combase/tests/Makefile.in b/dlls/combase/tests/Makefile.in +new file mode 100644 +index 0000000..3e7ecab +--- /dev/null ++++ b/dlls/combase/tests/Makefile.in +@@ -0,0 +1,4 @@ ++TESTDLL = combase.dll ++ ++C_SRCS = \ ++ string.c +diff --git a/dlls/combase/tests/string.c b/dlls/combase/tests/string.c +new file mode 100644 +index 0000000..01a63f7 +--- /dev/null ++++ b/dlls/combase/tests/string.c +@@ -0,0 +1,128 @@ ++/* ++ * Unit tests for Windows String functions ++ * ++ * Copyright (c) 2014 Martin Storsjo ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ++ */ ++ ++#include ++ ++#include "windef.h" ++#include "winbase.h" ++#include "winerror.h" ++#include "winstring.h" ++ ++#include "wine/test.h" ++ ++static HRESULT (WINAPI *pWindowsCreateString)(LPCWSTR, UINT32, HSTRING *); ++static HRESULT (WINAPI *pWindowsCreateStringReference)(LPCWSTR, UINT32, HSTRING_HEADER *, HSTRING *); ++static HRESULT (WINAPI *pWindowsDeleteString)(HSTRING); ++static HRESULT (WINAPI *pWindowsDuplicateString)(HSTRING, HSTRING *); ++ ++#define SET(x) p##x = (void*)GetProcAddress(hmod, #x) ++ ++static BOOL init_functions(void) ++{ ++ HMODULE hmod = LoadLibraryA("combase.dll"); ++ if (!hmod) ++ { ++ win_skip("Failed to load combase.dll, skipping tests\n"); ++ return FALSE; ++ } ++ SET(WindowsCreateString); ++ SET(WindowsCreateStringReference); ++ SET(WindowsDeleteString); ++ SET(WindowsDuplicateString); ++ return TRUE; ++} ++ ++#undef SET ++ ++ ++static const WCHAR input_string[] = { 'a', 'b', 'c', 'd', 'e', 'f', '\0' }; ++static const WCHAR input_empty_string[] = { '\0' }; ++ ++static void test_create_delete(void) ++{ ++ HSTRING str; ++ HSTRING_HEADER header; ++ ++ /* Test normal creation of a string */ ++ ok(pWindowsCreateString(input_string, 6, &str) == S_OK, "Failed to create string\n"); ++ ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n"); ++ /* Test error handling in WindowsCreateString */ ++ ok(pWindowsCreateString(input_string, 6, NULL) == E_INVALIDARG, "Incorrect error handling\n"); ++ ok(pWindowsCreateString(NULL, 6, &str) == E_POINTER, "Incorrect error handling\n"); ++ ++ /* Test handling of a NULL string */ ++ ok(pWindowsDeleteString(NULL) == S_OK, "Failed to delete null string\n"); ++ ++ /* Test creation of a string reference */ ++ ok(pWindowsCreateStringReference(input_string, 6, &header, &str) == S_OK, "Failed to create string ref\n"); ++ ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string ref\n"); ++ ++ /* Test error handling in WindowsCreateStringReference */ ++ /* Strings to CreateStringReference must be null terminated with the correct ++ * length. According to MSDN this should be E_INVALIDARG, but it returns ++ * 0x80000017 in practice. */ ++ ok(FAILED(pWindowsCreateStringReference(input_string, 5, &header, &str)), "Incorrect error handling\n"); ++ ok(pWindowsCreateStringReference(input_string, 6, NULL, &str) == E_INVALIDARG, "Incorrect error handling\n"); ++ ok(pWindowsCreateStringReference(input_string, 6, &header, NULL) == E_INVALIDARG, "Incorrect error handling\n"); ++ ok(pWindowsCreateStringReference(NULL, 6, &header, &str) == E_POINTER, "Incorrect error handling\n"); ++ ++ /* Test creating a string without a null-termination at the specified length */ ++ ok(pWindowsCreateString(input_string, 3, &str) == S_OK, "Failed to create string\n"); ++ ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n"); ++ ++ /* Test an empty string */ ++ ok(pWindowsCreateString(input_empty_string, 0, &str) == S_OK, "Failed to create string\n"); ++ ok(str == NULL, "Empty string not a null string\n"); ++ ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n"); ++ ++ ok(pWindowsCreateStringReference(input_empty_string, 0, &header, &str) == S_OK, "Failed to create string\n"); ++ ok(str == NULL, "Empty string not a null string\n"); ++ ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n"); ++} ++ ++static void test_duplicate(void) ++{ ++ HSTRING str, str2; ++ HSTRING_HEADER header; ++ ok(pWindowsCreateString(input_string, 6, &str) == S_OK, "Failed to create string\n"); ++ ok(pWindowsDuplicateString(str, NULL) == E_INVALIDARG, "Incorrect error handling\n"); ++ ok(pWindowsDuplicateString(str, &str2) == S_OK, "Failed to duplicate string\n"); ++ ok(str == str2, "Duplicated string created new string\n"); ++ ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n"); ++ ok(pWindowsDeleteString(str2) == S_OK, "Failed to delete string\n"); ++ ++ ok(pWindowsCreateStringReference(input_string, 6, &header, &str) == S_OK, "Failed to create string ref\n"); ++ ok(pWindowsDuplicateString(str, &str2) == S_OK, "Failed to duplicate string\n"); ++ ok(str != str2, "Duplicated string ref didn't create new string\n"); ++ ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n"); ++ ok(pWindowsDeleteString(str2) == S_OK, "Failed to delete string ref\n"); ++ ++ ok(pWindowsDuplicateString(NULL, &str2) == S_OK, "Failed to duplicate NULL string\n"); ++ ok(str2 == NULL, "Duplicated string created new string\n"); ++ ok(pWindowsDeleteString(str2) == S_OK, "Failed to delete string\n"); ++} ++ ++START_TEST(string) ++{ ++ if (!init_functions()) ++ return; ++ test_create_delete(); ++ test_duplicate(); ++} +diff --git a/tools/make_specfiles b/tools/make_specfiles +index 6e2f3d7..794d00c 100755 +--- a/tools/make_specfiles ++++ b/tools/make_specfiles +@@ -207,6 +207,7 @@ my @dll_groups = + [ + "combase", + "api-ms-win-core-winrt-l1-1-0", ++ "api-ms-win-core-winrt-string-l1-1-0", + ], + ); + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/combase-HSTRING/0002-combase-Implement-functions-for-accessing-HSTRING-ob.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/combase-HSTRING/0002-combase-Implement-functions-for-accessing-HSTRING-ob.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/combase-HSTRING/0002-combase-Implement-functions-for-accessing-HSTRING-ob.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/combase-HSTRING/0002-combase-Implement-functions-for-accessing-HSTRING-ob.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,257 @@ +From 64e2fd6cfd71aa4e1358086e8ee961a7c44e32e0 Mon Sep 17 00:00:00 2001 +From: Martin Storsjo +Date: Tue, 9 Dec 2014 10:36:49 +0200 +Subject: combase: Implement functions for accessing HSTRING objects. + +--- + .../api-ms-win-core-winrt-string-l1-1-0.spec | 8 +-- + dlls/combase/combase.spec | 8 +-- + dlls/combase/string.c | 66 ++++++++++++++++++++++ + dlls/combase/tests/string.c | 65 ++++++++++++++++++++- + 4 files changed, 138 insertions(+), 9 deletions(-) + +diff --git a/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec b/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec +index 7658867..cb6bb5e 100644 +--- a/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec ++++ b/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec +@@ -13,14 +13,14 @@ + @ stdcall WindowsDeleteString(ptr) combase.WindowsDeleteString + @ stub WindowsDeleteStringBuffer + @ stdcall WindowsDuplicateString(ptr ptr) combase.WindowsDuplicateString +-@ stub WindowsGetStringLen +-@ stub WindowsGetStringRawBuffer ++@ stdcall WindowsGetStringLen(ptr) combase.WindowsGetStringLen ++@ stdcall WindowsGetStringRawBuffer(ptr ptr) combase.WindowsGetStringRawBuffer + @ stub WindowsInspectString +-@ stub WindowsIsStringEmpty ++@ stdcall WindowsIsStringEmpty(ptr) combase.WindowsIsStringEmpty + @ stub WindowsPreallocateStringBuffer + @ stub WindowsPromoteStringBuffer + @ stub WindowsReplaceString +-@ stub WindowsStringHasEmbeddedNull ++@ stdcall WindowsStringHasEmbeddedNull(ptr ptr) combase.WindowsStringHasEmbeddedNull + @ stub WindowsSubstring + @ stub WindowsSubstringWithSpecifiedLength + @ stub WindowsTrimStringEnd +diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec +index f399d25..e0136f0 100644 +--- a/dlls/combase/combase.spec ++++ b/dlls/combase/combase.spec +@@ -294,14 +294,14 @@ + @ stdcall WindowsDeleteString(ptr) + @ stub WindowsDeleteStringBuffer + @ stdcall WindowsDuplicateString(ptr ptr) +-@ stub WindowsGetStringLen +-@ stub WindowsGetStringRawBuffer ++@ stdcall WindowsGetStringLen(ptr) ++@ stdcall WindowsGetStringRawBuffer(ptr ptr) + @ stub WindowsInspectString +-@ stub WindowsIsStringEmpty ++@ stdcall WindowsIsStringEmpty(ptr) + @ stub WindowsPreallocateStringBuffer + @ stub WindowsPromoteStringBuffer + @ stub WindowsReplaceString +-@ stub WindowsStringHasEmbeddedNull ++@ stdcall WindowsStringHasEmbeddedNull(ptr ptr) + @ stub WindowsSubstring + @ stub WindowsSubstringWithSpecifiedLength + @ stub WindowsTrimStringEnd +diff --git a/dlls/combase/string.c b/dlls/combase/string.c +index ee2f5c0..a451ed8 100644 +--- a/dlls/combase/string.c ++++ b/dlls/combase/string.c +@@ -141,3 +141,69 @@ HRESULT WINAPI WindowsDuplicateString(HSTRING str, HSTRING *out) + *out = str; + return S_OK; + } ++ ++/*********************************************************************** ++ * WindowsGetStringLen (combase.@) ++ */ ++UINT32 WINAPI WindowsGetStringLen(HSTRING str) ++{ ++ struct hstring_private *priv = impl_from_HSTRING(str); ++ if (str == NULL) ++ return 0; ++ return priv->length; ++} ++ ++/*********************************************************************** ++ * WindowsGetStringRawBuffer (combase.@) ++ */ ++LPCWSTR WINAPI WindowsGetStringRawBuffer(HSTRING str, UINT32 *len) ++{ ++ static const WCHAR empty[] = { 0 }; ++ struct hstring_private *priv = impl_from_HSTRING(str); ++ if (str == NULL) ++ { ++ if (len) ++ *len = 0; ++ return empty; ++ } ++ if (len) ++ *len = priv->length; ++ return priv->buffer; ++} ++ ++/*********************************************************************** ++ * WindowsStringHasEmbeddedNull (combase.@) ++ */ ++HRESULT WINAPI WindowsStringHasEmbeddedNull(HSTRING str, BOOL *out) ++{ ++ UINT32 i; ++ struct hstring_private *priv = impl_from_HSTRING(str); ++ if (out == NULL) ++ return E_INVALIDARG; ++ if (str == NULL) ++ { ++ *out = FALSE; ++ return S_OK; ++ } ++ for (i = 0; i < priv->length; i++) ++ { ++ if (priv->buffer[i] == '\0') ++ { ++ *out = TRUE; ++ return S_OK; ++ } ++ } ++ *out = FALSE; ++ return S_OK; ++} ++ ++/*********************************************************************** ++ * WindowsIsStringEmpty (combase.@) ++ */ ++BOOL WINAPI WindowsIsStringEmpty(HSTRING str) ++{ ++ struct hstring_private *priv = impl_from_HSTRING(str); ++ if (str == NULL) ++ return TRUE; ++ return priv->length == 0; ++} +diff --git a/dlls/combase/tests/string.c b/dlls/combase/tests/string.c +index 01a63f7..ec5e517 100644 +--- a/dlls/combase/tests/string.c ++++ b/dlls/combase/tests/string.c +@@ -31,6 +31,10 @@ static HRESULT (WINAPI *pWindowsCreateString)(LPCWSTR, UINT32, HSTRING *); + static HRESULT (WINAPI *pWindowsCreateStringReference)(LPCWSTR, UINT32, HSTRING_HEADER *, HSTRING *); + static HRESULT (WINAPI *pWindowsDeleteString)(HSTRING); + static HRESULT (WINAPI *pWindowsDuplicateString)(HSTRING, HSTRING *); ++static UINT32 (WINAPI *pWindowsGetStringLen)(HSTRING); ++static LPCWSTR (WINAPI *pWindowsGetStringRawBuffer)(HSTRING, UINT32 *); ++static BOOL (WINAPI *pWindowsIsStringEmpty)(HSTRING); ++static HRESULT (WINAPI *pWindowsStringHasEmbeddedNull)(HSTRING, BOOL *); + + #define SET(x) p##x = (void*)GetProcAddress(hmod, #x) + +@@ -46,14 +50,42 @@ static BOOL init_functions(void) + SET(WindowsCreateStringReference); + SET(WindowsDeleteString); + SET(WindowsDuplicateString); ++ SET(WindowsGetStringLen); ++ SET(WindowsGetStringRawBuffer); ++ SET(WindowsIsStringEmpty); ++ SET(WindowsStringHasEmbeddedNull); + return TRUE; + } + + #undef SET + + +-static const WCHAR input_string[] = { 'a', 'b', 'c', 'd', 'e', 'f', '\0' }; ++#define check_string(str, content, length, has_null) _check_string(__LINE__, str, content, length, has_null) ++static void _check_string(int line, HSTRING str, LPCWSTR content, UINT32 length, BOOL has_null) ++{ ++ BOOL out_null; ++ BOOL empty = length == 0; ++ UINT32 out_length; ++ LPCWSTR ptr; ++ ++ ok_(__FILE__, line)(pWindowsIsStringEmpty(str) == empty, "WindowsIsStringEmpty failed\n"); ++ ok_(__FILE__, line)(pWindowsStringHasEmbeddedNull(str, &out_null) == S_OK, "pWindowsStringHasEmbeddedNull failed\n"); ++ ok_(__FILE__, line)(out_null == has_null, "WindowsStringHasEmbeddedNull failed\n"); ++ ok_(__FILE__, line)(pWindowsGetStringLen(str) == length, "WindowsGetStringLen failed\n"); ++ ptr = pWindowsGetStringRawBuffer(str, &out_length); ++ /* WindowsGetStringRawBuffer should return a non-null, null terminated empty string ++ * even if str is NULL. */ ++ ok_(__FILE__, line)(ptr != NULL, "WindowsGetStringRawBuffer returned null\n"); ++ ok_(__FILE__, line)(out_length == length, "WindowsGetStringRawBuffer returned incorrect length\n"); ++ ptr = pWindowsGetStringRawBuffer(str, NULL); ++ ok_(__FILE__, line)(ptr != NULL, "WindowsGetStringRawBuffer returned null\n"); ++ ok_(__FILE__, line)(ptr[length] == '\0', "WindowsGetStringRawBuffer doesn't return a null terminated buffer\n"); ++ ok_(__FILE__, line)(memcmp(ptr, content, sizeof(*content) * length) == 0, "Incorrect string content\n"); ++} ++ ++static const WCHAR input_string[] = { 'a', 'b', 'c', 'd', 'e', 'f', '\0', '\0' }; + static const WCHAR input_empty_string[] = { '\0' }; ++static const WCHAR input_embed_null[] = { 'a', '\0', 'c', '\0', 'e', 'f', '\0' }; + + static void test_create_delete(void) + { +@@ -62,6 +94,7 @@ static void test_create_delete(void) + + /* Test normal creation of a string */ + ok(pWindowsCreateString(input_string, 6, &str) == S_OK, "Failed to create string\n"); ++ check_string(str, input_string, 6, FALSE); + ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n"); + /* Test error handling in WindowsCreateString */ + ok(pWindowsCreateString(input_string, 6, NULL) == E_INVALIDARG, "Incorrect error handling\n"); +@@ -72,6 +105,7 @@ static void test_create_delete(void) + + /* Test creation of a string reference */ + ok(pWindowsCreateStringReference(input_string, 6, &header, &str) == S_OK, "Failed to create string ref\n"); ++ check_string(str, input_string, 6, FALSE); + ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string ref\n"); + + /* Test error handling in WindowsCreateStringReference */ +@@ -85,6 +119,7 @@ static void test_create_delete(void) + + /* Test creating a string without a null-termination at the specified length */ + ok(pWindowsCreateString(input_string, 3, &str) == S_OK, "Failed to create string\n"); ++ check_string(str, input_string, 3, FALSE); + ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n"); + + /* Test an empty string */ +@@ -119,10 +154,38 @@ static void test_duplicate(void) + ok(pWindowsDeleteString(str2) == S_OK, "Failed to delete string\n"); + } + ++static void test_access(void) ++{ ++ HSTRING str; ++ HSTRING_HEADER header; ++ ++ /* Test handling of a NULL string */ ++ check_string(NULL, NULL, 0, FALSE); ++ ++ /* Test strings with embedded null chars */ ++ ok(pWindowsCreateString(input_embed_null, 6, &str) == S_OK, "Failed to create string\n"); ++ check_string(str, input_embed_null, 6, TRUE); ++ ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n"); ++ ++ ok(pWindowsCreateStringReference(input_embed_null, 6, &header, &str) == S_OK, "Failed to create string ref\n"); ++ check_string(str, input_embed_null, 6, TRUE); ++ ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string ref\n"); ++ ++ /* Test normal creation of a string with trailing null */ ++ ok(pWindowsCreateString(input_string, 7, &str) == S_OK, "Failed to create string\n"); ++ check_string(str, input_string, 7, TRUE); ++ ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n"); ++ ++ ok(pWindowsCreateStringReference(input_string, 7, &header, &str) == S_OK, "Failed to create string ref\n"); ++ check_string(str, input_string, 7, TRUE); ++ ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string ref\n"); ++} ++ + START_TEST(string) + { + if (!init_functions()) + return; + test_create_delete(); + test_duplicate(); ++ test_access(); + } +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/combase-HSTRING/0003-combase-Implement-functions-for-HSTRING_BUFFER.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/combase-HSTRING/0003-combase-Implement-functions-for-HSTRING_BUFFER.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/combase-HSTRING/0003-combase-Implement-functions-for-HSTRING_BUFFER.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/combase-HSTRING/0003-combase-Implement-functions-for-HSTRING_BUFFER.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,245 @@ +From 012a71baa669e6ead66a1d5f94c8ee81d8cfce58 Mon Sep 17 00:00:00 2001 +From: Martin Storsjo +Date: Tue, 9 Dec 2014 10:36:50 +0200 +Subject: combase: Implement functions for HSTRING_BUFFER. + +--- + .../api-ms-win-core-winrt-string-l1-1-0.spec | 6 +-- + dlls/combase/combase.spec | 6 +-- + dlls/combase/string.c | 60 +++++++++++++++++++++- + dlls/combase/tests/string.c | 56 ++++++++++++++++++++ + 4 files changed, 121 insertions(+), 7 deletions(-) + +diff --git a/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec b/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec +index cb6bb5e..2361a1d 100644 +--- a/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec ++++ b/dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec +@@ -11,14 +11,14 @@ + @ stdcall WindowsCreateString(ptr long ptr) combase.WindowsCreateString + @ stdcall WindowsCreateStringReference(wstr long ptr ptr) combase.WindowsCreateStringReference + @ stdcall WindowsDeleteString(ptr) combase.WindowsDeleteString +-@ stub WindowsDeleteStringBuffer ++@ stdcall WindowsDeleteStringBuffer(ptr) combase.WindowsDeleteStringBuffer + @ stdcall WindowsDuplicateString(ptr ptr) combase.WindowsDuplicateString + @ stdcall WindowsGetStringLen(ptr) combase.WindowsGetStringLen + @ stdcall WindowsGetStringRawBuffer(ptr ptr) combase.WindowsGetStringRawBuffer + @ stub WindowsInspectString + @ stdcall WindowsIsStringEmpty(ptr) combase.WindowsIsStringEmpty +-@ stub WindowsPreallocateStringBuffer +-@ stub WindowsPromoteStringBuffer ++@ stdcall WindowsPreallocateStringBuffer(long ptr ptr) combase.WindowsPreallocateStringBuffer ++@ stdcall WindowsPromoteStringBuffer(ptr ptr) combase.WindowsPromoteStringBuffer + @ stub WindowsReplaceString + @ stdcall WindowsStringHasEmbeddedNull(ptr ptr) combase.WindowsStringHasEmbeddedNull + @ stub WindowsSubstring +diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec +index e0136f0..ac095ce 100644 +--- a/dlls/combase/combase.spec ++++ b/dlls/combase/combase.spec +@@ -292,14 +292,14 @@ + @ stdcall WindowsCreateString(ptr long ptr) + @ stdcall WindowsCreateStringReference(wstr long ptr ptr) + @ stdcall WindowsDeleteString(ptr) +-@ stub WindowsDeleteStringBuffer ++@ stdcall WindowsDeleteStringBuffer(ptr) + @ stdcall WindowsDuplicateString(ptr ptr) + @ stdcall WindowsGetStringLen(ptr) + @ stdcall WindowsGetStringRawBuffer(ptr ptr) + @ stub WindowsInspectString + @ stdcall WindowsIsStringEmpty(ptr) +-@ stub WindowsPreallocateStringBuffer +-@ stub WindowsPromoteStringBuffer ++@ stdcall WindowsPreallocateStringBuffer(long ptr ptr) ++@ stdcall WindowsPromoteStringBuffer(ptr ptr) + @ stub WindowsReplaceString + @ stdcall WindowsStringHasEmbeddedNull(ptr ptr) + @ stub WindowsSubstring +diff --git a/dlls/combase/string.c b/dlls/combase/string.c +index a451ed8..693d40a 100644 +--- a/dlls/combase/string.c ++++ b/dlls/combase/string.c +@@ -32,6 +32,8 @@ struct hstring_private + LONG refcount; + }; + ++static const WCHAR empty[] = { 0 }; ++ + C_ASSERT(sizeof(struct hstring_private) <= sizeof(HSTRING_HEADER)); + + static inline struct hstring_private *impl_from_HSTRING(HSTRING string) +@@ -44,6 +46,11 @@ static inline struct hstring_private *impl_from_HSTRING_HEADER(HSTRING_HEADER *h + return (struct hstring_private *)header; + } + ++static inline struct hstring_private *impl_from_HSTRING_BUFFER(HSTRING_BUFFER buffer) ++{ ++ return (struct hstring_private *)buffer; ++} ++ + static BOOL alloc_string(UINT32 len, HSTRING *out) + { + struct hstring_private *priv; +@@ -143,6 +150,58 @@ HRESULT WINAPI WindowsDuplicateString(HSTRING str, HSTRING *out) + } + + /*********************************************************************** ++ * WindowsPreallocateStringBuffer (combase.@) ++ */ ++HRESULT WINAPI WindowsPreallocateStringBuffer(UINT32 len, WCHAR **outptr, ++ HSTRING_BUFFER *out) ++{ ++ struct hstring_private *priv; ++ HSTRING str; ++ if (outptr == NULL || out == NULL) ++ return E_POINTER; ++ if (len == 0) ++ { ++ *outptr = (LPWSTR)empty; ++ *out = NULL; ++ return S_OK; ++ } ++ ++ if (!alloc_string(len, &str)) ++ return E_OUTOFMEMORY; ++ priv = impl_from_HSTRING(str); ++ *outptr = priv->buffer; ++ *out = (HSTRING_BUFFER)str; ++ return S_OK; ++} ++ ++/*********************************************************************** ++ * WindowsDeleteStringBuffer (combase.@) ++ */ ++HRESULT WINAPI WindowsDeleteStringBuffer(HSTRING_BUFFER buf) ++{ ++ return WindowsDeleteString((HSTRING)buf); ++} ++ ++/*********************************************************************** ++ * WindowsPromoteStringBuffer (combase.@) ++ */ ++HRESULT WINAPI WindowsPromoteStringBuffer(HSTRING_BUFFER buf, HSTRING *out) ++{ ++ struct hstring_private *priv = impl_from_HSTRING_BUFFER(buf); ++ if (out == NULL) ++ return E_POINTER; ++ if (buf == NULL) ++ { ++ *out = NULL; ++ return S_OK; ++ } ++ if (priv->buffer[priv->length] != 0 || priv->reference || priv->refcount != 1) ++ return E_INVALIDARG; ++ *out = (HSTRING)buf; ++ return S_OK; ++} ++ ++/*********************************************************************** + * WindowsGetStringLen (combase.@) + */ + UINT32 WINAPI WindowsGetStringLen(HSTRING str) +@@ -158,7 +217,6 @@ UINT32 WINAPI WindowsGetStringLen(HSTRING str) + */ + LPCWSTR WINAPI WindowsGetStringRawBuffer(HSTRING str, UINT32 *len) + { +- static const WCHAR empty[] = { 0 }; + struct hstring_private *priv = impl_from_HSTRING(str); + if (str == NULL) + { +diff --git a/dlls/combase/tests/string.c b/dlls/combase/tests/string.c +index ec5e517..72eaa84 100644 +--- a/dlls/combase/tests/string.c ++++ b/dlls/combase/tests/string.c +@@ -30,10 +30,13 @@ + static HRESULT (WINAPI *pWindowsCreateString)(LPCWSTR, UINT32, HSTRING *); + static HRESULT (WINAPI *pWindowsCreateStringReference)(LPCWSTR, UINT32, HSTRING_HEADER *, HSTRING *); + static HRESULT (WINAPI *pWindowsDeleteString)(HSTRING); ++static HRESULT (WINAPI *pWindowsDeleteStringBuffer)(HSTRING_BUFFER); + static HRESULT (WINAPI *pWindowsDuplicateString)(HSTRING, HSTRING *); + static UINT32 (WINAPI *pWindowsGetStringLen)(HSTRING); + static LPCWSTR (WINAPI *pWindowsGetStringRawBuffer)(HSTRING, UINT32 *); + static BOOL (WINAPI *pWindowsIsStringEmpty)(HSTRING); ++static HRESULT (WINAPI *pWindowsPreallocateStringBuffer)(UINT32, WCHAR **, HSTRING_BUFFER *); ++static HRESULT (WINAPI *pWindowsPromoteStringBuffer)(HSTRING_BUFFER, HSTRING *); + static HRESULT (WINAPI *pWindowsStringHasEmbeddedNull)(HSTRING, BOOL *); + + #define SET(x) p##x = (void*)GetProcAddress(hmod, #x) +@@ -49,10 +52,13 @@ static BOOL init_functions(void) + SET(WindowsCreateString); + SET(WindowsCreateStringReference); + SET(WindowsDeleteString); ++ SET(WindowsDeleteStringBuffer); + SET(WindowsDuplicateString); + SET(WindowsGetStringLen); + SET(WindowsGetStringRawBuffer); + SET(WindowsIsStringEmpty); ++ SET(WindowsPreallocateStringBuffer); ++ SET(WindowsPromoteStringBuffer); + SET(WindowsStringHasEmbeddedNull); + return TRUE; + } +@@ -181,6 +187,55 @@ static void test_access(void) + ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string ref\n"); + } + ++static void test_string_buffer(void) ++{ ++ /* Initialize ptr to NULL to make sure it actually is set in the first ++ * test below. */ ++ HSTRING_BUFFER buf = NULL; ++ WCHAR *ptr = NULL; ++ HSTRING str; ++ ++ /* Test creation of an empty buffer */ ++ ok(pWindowsPreallocateStringBuffer(0, &ptr, &buf) == S_OK, "Failed to preallocate string buffer\n"); ++ ok(buf == NULL, "Empty string buffer isn't a null string\n"); ++ ok(ptr != NULL, "Empty string didn't return a buffer pointer\n"); ++ ok(pWindowsPromoteStringBuffer(buf, &str) == S_OK, "Failed to promote string buffer\n"); ++ ok(str == NULL, "Empty string isn't a null string\n"); ++ check_string(str, input_empty_string, 0, FALSE); ++ ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n"); ++ ++ ok(pWindowsDeleteStringBuffer(NULL) == S_OK, "Failed to delete null string buffer\n"); ++ ++ /* Test creation and deletion of string buffers */ ++ ok(pWindowsPreallocateStringBuffer(6, &ptr, &buf) == S_OK, "Failed to preallocate string buffer\n"); ++ ok(pWindowsDeleteStringBuffer(buf) == S_OK, "Failed to delete string buffer\n"); ++ ++ /* Test creation and promotion of string buffers */ ++ ok(pWindowsPreallocateStringBuffer(6, &ptr, &buf) == S_OK, "Failed to preallocate string buffer\n"); ++ ok(ptr[6] == '\0', "Preallocated string buffer didn't have null termination\n"); ++ memcpy(ptr, input_string, 6 * sizeof(*input_string)); ++ ok(pWindowsPromoteStringBuffer(buf, NULL) == E_POINTER, "Incorrect error handling\n"); ++ ok(pWindowsPromoteStringBuffer(buf, &str) == S_OK, "Failed to promote string buffer\n"); ++ check_string(str, input_string, 6, FALSE); ++ ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n"); ++ ++ /* Test error handling in preallocation */ ++ ok(pWindowsPreallocateStringBuffer(6, NULL, &buf) == E_POINTER, "Incorrect error handling\n"); ++ ok(pWindowsPreallocateStringBuffer(6, &ptr, NULL) == E_POINTER, "Incorrect error handling\n"); ++ ++ ok(pWindowsPreallocateStringBuffer(6, &ptr, &buf) == S_OK, "Failed to preallocate string buffer\n"); ++ ptr[6] = 'a'; /* Overwrite the buffer's null termination, promotion should fail */ ++ ok(pWindowsPromoteStringBuffer(buf, &str) == E_INVALIDARG, "Incorrect error handling\n"); ++ ok(pWindowsDeleteStringBuffer(buf) == S_OK, "Failed to delete string buffer\n"); ++ ++ /* Test strings with trailing null chars */ ++ ok(pWindowsPreallocateStringBuffer(7, &ptr, &buf) == S_OK, "Failed to preallocate string buffer\n"); ++ memcpy(ptr, input_string, 7 * sizeof(*input_string)); ++ ok(pWindowsPromoteStringBuffer(buf, &str) == S_OK, "Failed to promote string buffer\n"); ++ check_string(str, input_string, 7, TRUE); ++ ok(pWindowsDeleteString(str) == S_OK, "Failed to delete string\n"); ++} ++ + START_TEST(string) + { + if (!init_functions()) +@@ -188,4 +243,5 @@ START_TEST(string) + test_create_delete(); + test_duplicate(); + test_access(); ++ test_string_buffer(); + } +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/combase-HSTRING/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/combase-HSTRING/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/combase-HSTRING/definition 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/combase-HSTRING/definition 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1 @@ +Fixes: Support for combase HSTRING objects diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/d3dx9_36-DXTn/0001-d3dx9_36-Add-dxtn-support.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/d3dx9_36-DXTn/0001-d3dx9_36-Add-dxtn-support.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/d3dx9_36-DXTn/0001-d3dx9_36-Add-dxtn-support.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/d3dx9_36-DXTn/0001-d3dx9_36-Add-dxtn-support.patch 2014-12-15 01:08:14.000000000 +0000 @@ -1,12 +1,12 @@ -From d49f4a13145f3dd88f2be8d67baf8546ddff4bfd Mon Sep 17 00:00:00 2001 +From 0808d72ca1d94c68fcf07379195e086d24383d43 Mon Sep 17 00:00:00 2001 From: Christian Costa Date: Sat, 1 Nov 2014 13:08:05 +0100 Subject: d3dx9_36: Add dxtn support. --- dlls/d3dx9_36/Makefile.in | 2 +- - dlls/d3dx9_36/surface.c | 100 ++++++++++++++++++++++++++++++++++++++++++---- - 2 files changed, 94 insertions(+), 8 deletions(-) + dlls/d3dx9_36/surface.c | 101 ++++++++++++++++++++++++++++++++++++++++++---- + 2 files changed, 95 insertions(+), 8 deletions(-) diff --git a/dlls/d3dx9_36/Makefile.in b/dlls/d3dx9_36/Makefile.in index 5958c57..aa387b5 100644 @@ -21,10 +21,18 @@ C_SRCS = \ core.c \ diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c -index c91048b..9813ce1 100644 +index f187031..9a1e1cb 100644 --- a/dlls/d3dx9_36/surface.c +++ b/dlls/d3dx9_36/surface.c -@@ -26,6 +26,8 @@ +@@ -18,6 +18,7 @@ + * + */ + ++#include "config.h" + #include "wine/debug.h" + #include "wine/unicode.h" + #include "d3dx9_36_private.h" +@@ -26,6 +27,8 @@ #include "ole2.h" #include "wincodec.h" @@ -33,7 +41,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3dx); -@@ -1715,6 +1717,24 @@ void point_filter_argb_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slic +@@ -1716,6 +1719,24 @@ void point_filter_argb_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slic } } @@ -58,7 +66,7 @@ /************************************************************ * D3DXLoadSurfaceFromMemory * -@@ -1756,6 +1776,7 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface, +@@ -1757,6 +1778,7 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface, D3DSURFACE_DESC surfdesc; D3DLOCKED_RECT lockrect; struct volume src_size, dst_size; @@ -66,7 +74,7 @@ TRACE("(%p, %p, %s, %p, %#x, %u, %p, %s %#x, 0x%08x)\n", dst_surface, dst_palette, wine_dbgstr_rect(dst_rect), src_memory, src_format, -@@ -1837,8 +1858,15 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface, +@@ -1838,8 +1860,15 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface, } else /* Stretching or format conversion. */ { @@ -84,7 +92,7 @@ { FIXME("Format conversion missing %#x -> %#x\n", src_format, surfdesc.Format); return E_NOTIMPL; -@@ -1847,10 +1875,52 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface, +@@ -1848,10 +1877,52 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface, if (FAILED(IDirect3DSurface9_LockRect(dst_surface, &lockrect, dst_rect, 0))) return D3DXERR_INVALIDDATA; @@ -139,7 +147,7 @@ } else /* if ((filter & 0xf) == D3DX_FILTER_POINT) */ { -@@ -1859,14 +1929,30 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface, +@@ -1860,14 +1931,30 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface, /* Always apply a point filter until D3DX_FILTER_LINEAR, * D3DX_FILTER_TRIANGLE and D3DX_FILTER_BOX are implemented. */ diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/kernel32-GetFinalPathNameByHandle/0002-kernel32-tests-Add-tests-for-GetFinalPathNameByHandl.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/kernel32-GetFinalPathNameByHandle/0002-kernel32-tests-Add-tests-for-GetFinalPathNameByHandl.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/kernel32-GetFinalPathNameByHandle/0002-kernel32-tests-Add-tests-for-GetFinalPathNameByHandl.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/kernel32-GetFinalPathNameByHandle/0002-kernel32-tests-Add-tests-for-GetFinalPathNameByHandl.patch 2014-12-15 01:08:14.000000000 +0000 @@ -1,4 +1,4 @@ -From 10a86e0d87850cc77ee13b9e814dc8a9a558721b Mon Sep 17 00:00:00 2001 +From 071454e8a76f0b26cc097434d780c12e472d5c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Tue, 12 Aug 2014 20:25:18 +0200 Subject: kernel32/tests: Add tests for GetFinalPathNameByHandle @@ -8,7 +8,7 @@ 1 file changed, 204 insertions(+) diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c -index ddfa019..55e9045 100644 +index 8849eb3..bd92162 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -34,6 +34,7 @@ @@ -26,9 +26,9 @@ +static DWORD (WINAPI* pGetFinalPathNameByHandleA)(HANDLE, LPSTR, DWORD, DWORD); +static DWORD (WINAPI* pGetFinalPathNameByHandleW)(HANDLE, LPWSTR, DWORD, DWORD); - /* keep filename and filenameW the same */ static const char filename[] = "testfile.xxx"; -@@ -85,6 +88,8 @@ static void InitFunctionPointers(void) + static const char sillytext[] = +@@ -83,6 +86,8 @@ static void InitFunctionPointers(void) pSetFileValidData = (void *) GetProcAddress(hkernel32, "SetFileValidData"); pCopyFile2 = (void *) GetProcAddress(hkernel32, "CopyFile2"); pCreateFile2 = (void *) GetProcAddress(hkernel32, "CreateFile2"); @@ -37,7 +37,7 @@ } static void test__hread( void ) -@@ -4145,6 +4150,203 @@ todo_wine +@@ -4182,6 +4187,203 @@ todo_wine } } @@ -241,7 +241,7 @@ START_TEST(file) { InitFunctionPointers(); -@@ -4191,4 +4393,6 @@ START_TEST(file) +@@ -4234,4 +4436,6 @@ START_TEST(file) test_SetFileValidData(); test_WriteFileGather(); test_file_access(); @@ -249,5 +249,5 @@ + test_GetFinalPathNameByHandleW(); } -- -2.1.0 +2.1.3 diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/kernel32-VerifyVersionInfo/0001-kernel32-tests-Add-additional-tests-for-condition-ma.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/kernel32-VerifyVersionInfo/0001-kernel32-tests-Add-additional-tests-for-condition-ma.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/kernel32-VerifyVersionInfo/0001-kernel32-tests-Add-additional-tests-for-condition-ma.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/kernel32-VerifyVersionInfo/0001-kernel32-tests-Add-additional-tests-for-condition-ma.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,362 @@ +From 8ad1946fb6af9ee34ea4a85adde57c9b6f9cc523 Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +Date: Mon, 1 Dec 2014 11:28:26 +0100 +Subject: kernel32/tests: Add additional tests for condition mask of + VerifyVersionInfoA. + +--- + dlls/kernel32/tests/version.c | 338 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 338 insertions(+) + +diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c +index a47e52c..248f01c 100644 +--- a/dlls/kernel32/tests/version.c ++++ b/dlls/kernel32/tests/version.c +@@ -353,6 +353,344 @@ static void test_VerifyVersionInfo(void) + pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL)); + ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + ++ /* systematically test behaviour of condition mask (tests sorted by condition mask value) */ ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.dwMinorVersion++; ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_MINORVERSION, VER_LESS)); ++ todo_wine ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.dwMinorVersion++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_LESS)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_LESS)); ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_AND)); ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.dwMinorVersion++; ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_LESS_EQUAL), VER_MINORVERSION, VER_LESS)); ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.dwMinorVersion++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_AND), VER_MINORVERSION, VER_LESS)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.dwMinorVersion++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_OR), VER_MINORVERSION, VER_LESS)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMinor++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMinor++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_EQUAL)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ if (servicepack) ++ { ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.dwMajorVersion++; ++ info.wServicePackMajor--; ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_LESS), VER_SERVICEPACKMAJOR, VER_EQUAL)); ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ } ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMinor++; ++ ret = pVerifyVersionInfoA(&info, VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS)); ++ todo_wine ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMinor++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMinor++; ++ ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL), ++ VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS)); ++ todo_wine ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMinor++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL), ++ VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMinor++; ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), ++ VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS)); ++ todo_wine ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMinor++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), ++ VER_MINORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ if (servicepack) ++ { ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor--; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor--; ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), ++ VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER)); ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor--; ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), ++ VER_MINORVERSION, VER_LESS_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER)); ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor--; ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), ++ VER_MINORVERSION, VER_AND), VER_SERVICEPACKMAJOR, VER_GREATER)); ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ } ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor++; ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_LESS_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER)); ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ if (servicepack) ++ { ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor--; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_SERVICEPACKMAJOR, VER_GREATER), VER_SERVICEPACKMINOR, VER_EQUAL)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ } ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor++; ++ ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS)); ++ todo_wine ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor++; ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS)); ++ todo_wine ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor++; ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), ++ VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS)); ++ todo_wine ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.dwMajorVersion--; ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS)); ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS)); ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), ++ VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ info.wServicePackMajor++; ++ SetLastError(0xdeadbeef); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), ++ VER_MINORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS_EQUAL)); ++ error = GetLastError(); ++ ok(!ret, "VerifyVersionInfoA succeeded\n"); ++ ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */, ++ "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error); ++ ++ info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ++ GetVersionExA((OSVERSIONINFOA *)&info); ++ ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, ++ pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_AND)); ++ ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); ++ + /* test bad dwOSVersionInfoSize */ + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); + GetVersionExA((OSVERSIONINFOA *)&info); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/kernel32-VerifyVersionInfo/0002-ntdll-Fix-condition-mask-handling-in-RtlVerifyVersio.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/kernel32-VerifyVersionInfo/0002-ntdll-Fix-condition-mask-handling-in-RtlVerifyVersio.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/kernel32-VerifyVersionInfo/0002-ntdll-Fix-condition-mask-handling-in-RtlVerifyVersio.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/kernel32-VerifyVersionInfo/0002-ntdll-Fix-condition-mask-handling-in-RtlVerifyVersio.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,160 @@ +From ca7be85de4f395713f3b388d6eb1ce7399b5e2d8 Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +Date: Mon, 1 Dec 2014 11:30:58 +0100 +Subject: ntdll: Fix condition mask handling in RtlVerifyVersionInfo. + +--- + dlls/kernel32/tests/version.c | 7 ------ + dlls/ntdll/version.c | 50 ++++++++++++++++++++++++++++++++----------- + 2 files changed, 37 insertions(+), 20 deletions(-) + +diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c +index 248f01c..4d07176 100644 +--- a/dlls/kernel32/tests/version.c ++++ b/dlls/kernel32/tests/version.c +@@ -360,7 +360,6 @@ static void test_VerifyVersionInfo(void) + info.dwMinorVersion++; + ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_MINORVERSION, VER_LESS)); +- todo_wine + ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); +@@ -464,7 +463,6 @@ static void test_VerifyVersionInfo(void) + info.wServicePackMinor++; + ret = pVerifyVersionInfoA(&info, VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + pVerSetConditionMask(pVerSetConditionMask(0, VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS)); +- todo_wine + ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); +@@ -484,7 +482,6 @@ static void test_VerifyVersionInfo(void) + ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL), + VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS)); +- todo_wine + ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); +@@ -505,7 +502,6 @@ static void test_VerifyVersionInfo(void) + ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), + VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_EQUAL), VER_SERVICEPACKMINOR, VER_LESS)); +- todo_wine + ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); +@@ -584,7 +580,6 @@ static void test_VerifyVersionInfo(void) + info.wServicePackMajor++; + ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS)); +- todo_wine + ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); +@@ -603,7 +598,6 @@ static void test_VerifyVersionInfo(void) + info.wServicePackMajor++; + ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS)); +- todo_wine + ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); +@@ -623,7 +617,6 @@ static void test_VerifyVersionInfo(void) + ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + pVerSetConditionMask(pVerSetConditionMask(pVerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), + VER_MINORVERSION, VER_EQUAL), VER_SERVICEPACKMAJOR, VER_LESS)); +- todo_wine + ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); + + info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); +diff --git a/dlls/ntdll/version.c b/dlls/ntdll/version.c +index a6340eb..5d1b445 100644 +--- a/dlls/ntdll/version.c ++++ b/dlls/ntdll/version.c +@@ -657,6 +657,35 @@ BOOLEAN WINAPI RtlGetNtProductType( LPDWORD type ) + } + + ++static inline UCHAR version_update_condition(PUCHAR last_condition, UCHAR condition) ++{ ++ switch (*last_condition) ++ { ++ case 0: ++ *last_condition = condition; ++ break; ++ case VER_EQUAL: ++ if (condition >= VER_EQUAL && condition <= VER_LESS_EQUAL) ++ { ++ *last_condition = condition; ++ return condition; ++ } ++ break; ++ case VER_GREATER: ++ case VER_GREATER_EQUAL: ++ if (condition >= VER_EQUAL && condition <= VER_GREATER_EQUAL) ++ return condition; ++ break; ++ case VER_LESS: ++ case VER_LESS_EQUAL: ++ if (condition == VER_EQUAL || (condition >= VER_LESS && condition <= VER_LESS_EQUAL)) ++ return condition; ++ break; ++ } ++ if (!condition) *last_condition |= 0x10; ++ return *last_condition & 0xf; ++} ++ + static inline NTSTATUS version_compare_values(ULONG left, ULONG right, UCHAR condition) + { + switch (condition) { +@@ -732,38 +761,33 @@ NTSTATUS WINAPI RtlVerifyVersionInfo( const RTL_OSVERSIONINFOEXW *info, + + if(dwTypeMask & (VER_MAJORVERSION|VER_MINORVERSION|VER_SERVICEPACKMAJOR|VER_SERVICEPACKMINOR)) + { +- unsigned char condition = 0; ++ unsigned char condition, last_condition = 0; + BOOLEAN do_next_check = TRUE; + + if(dwTypeMask & VER_MAJORVERSION) +- condition = dwlConditionMask >> 1*3 & 0x07; +- else if(dwTypeMask & VER_MINORVERSION) +- condition = dwlConditionMask >> 0*3 & 0x07; +- else if(dwTypeMask & VER_SERVICEPACKMAJOR) +- condition = dwlConditionMask >> 5*3 & 0x07; +- else if(dwTypeMask & VER_SERVICEPACKMINOR) +- condition = dwlConditionMask >> 4*3 & 0x07; +- +- if(dwTypeMask & VER_MAJORVERSION) + { ++ condition = version_update_condition(&last_condition, dwlConditionMask >> 1*3 & 0x07); + status = version_compare_values(ver.dwMajorVersion, info->dwMajorVersion, condition); + do_next_check = (ver.dwMajorVersion == info->dwMajorVersion) && +- ((condition != VER_EQUAL) || (status == STATUS_SUCCESS)); ++ ((condition >= VER_EQUAL) && (condition <= VER_LESS_EQUAL)); + } + if((dwTypeMask & VER_MINORVERSION) && do_next_check) + { ++ condition = version_update_condition(&last_condition, dwlConditionMask >> 0*3 & 0x07); + status = version_compare_values(ver.dwMinorVersion, info->dwMinorVersion, condition); + do_next_check = (ver.dwMinorVersion == info->dwMinorVersion) && +- ((condition != VER_EQUAL) || (status == STATUS_SUCCESS)); ++ ((condition >= VER_EQUAL) && (condition <= VER_LESS_EQUAL)); + } + if((dwTypeMask & VER_SERVICEPACKMAJOR) && do_next_check) + { ++ condition = version_update_condition(&last_condition, dwlConditionMask >> 5*3 & 0x07); + status = version_compare_values(ver.wServicePackMajor, info->wServicePackMajor, condition); + do_next_check = (ver.wServicePackMajor == info->wServicePackMajor) && +- ((condition != VER_EQUAL) || (status == STATUS_SUCCESS)); ++ ((condition >= VER_EQUAL) && (condition <= VER_LESS_EQUAL)); + } + if((dwTypeMask & VER_SERVICEPACKMINOR) && do_next_check) + { ++ condition = version_update_condition(&last_condition, dwlConditionMask >> 4*3 & 0x07); + status = version_compare_values(ver.wServicePackMinor, info->wServicePackMinor, condition); + } + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/kernel32-VerifyVersionInfo/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/kernel32-VerifyVersionInfo/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/kernel32-VerifyVersionInfo/definition 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/kernel32-VerifyVersionInfo/definition 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1 @@ +Fixes: [36143] Fix condition mask handling in RtlVerifyVersionInfo diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/Makefile wine-compholio-1.7.33~ubuntu15.04.1/patches/Makefile --- wine-compholio-1.7.32~ubuntu15.04.1/patches/Makefile 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/Makefile 2014-12-15 01:08:14.000000000 +0000 @@ -23,8 +23,9 @@ Miscellaneous.ok \ Pipelight.ok \ Staging.ok \ - api-ms-win-core-Stubs.ok \ atl-IOCS_Property.ok \ + avifil32-Realloc_Records.ok \ + combase-HSTRING.ok \ comctl32-LoadIconMetric.ok \ configure-Absolute_RPATH.ok \ d3d9-Surface_Refcount.ok \ @@ -52,12 +53,14 @@ kernel32-Named_Pipe.ok \ kernel32-Profile.ok \ kernel32-UTF7_Support.ok \ + kernel32-VerifyVersionInfo.ok \ libs-Unicode_Collation.ok \ libwine-BSD_mmap_fixed.ok \ + mfplat-Stubs.ok \ msvcp90-basic_string_wchar_dtor.ok \ - msvcrt-Spawn_Process.ok \ msvcrt-atof_strtod.ok \ ntdll-DOS_Attributes.ok \ + ntdll-DllRedirects.ok \ ntdll-Dynamic_DST.ok \ ntdll-Exception.ok \ ntdll-FD_Cache.ok \ @@ -79,6 +82,7 @@ ntoskrnl-KeSetSystemAffinityThread.ok \ ntoskrnl-Stub_FileObject.ok \ ntoskrnl-Write_CR4.ok \ + ole32-CoWaitForMultipleHandles.ok \ psapi-K32EnumProcessModulesEx.ok \ quartz-MediaSeeking_Positions.ok \ riched20-IText_Interface.ok \ @@ -99,17 +103,25 @@ shell32-RunDLL_CallEntry16.ok \ shell32-SHCreateSessionKey.ok \ shell32-SHFileOperation.ok \ + shell32-SHILCreateFromPath.ok \ shlwapi-PathIsDirectoryEmptyW.ok \ + shlwapi-StrCatChainW.ok \ shlwapi-UrlCombine.ok \ + urlmon-CoInternetSetFeatureEnabled.ok \ user32-Dialog_Paint_Event.ok \ user32-DrawTextExW.ok \ + user32-GetRawInputDeviceList.ok \ user32-GetSystemMetrics.ok \ user32-GetTipText.ok \ user32-Mouse_Message_Hwnd.ok \ + user32-ScrollWindowEx.ok \ user32-WndProc.ok \ wine.inf-ProductId.ok \ wineboot-HKEY_DYN_DATA.ok \ winebuild-LinkerVersion.ok \ + winecfg-Staging.ok \ + wined3d-CSMT_Helper.ok \ + wined3d-CSMT_Main.ok \ wined3d-DXTn.ok \ wined3d-Revert_PixelFormat.ok \ winedevice-Fix_Relocation.ok \ @@ -121,11 +133,9 @@ winex11-Window_Groups.ok \ winex11-XEMBED.ok \ winex11-wglShareLists.ok \ - wintrust-Reset_hFile.ok \ + wininet-encoding.ok \ wpcap-Dynamic_Linking.ok \ ws2_32-Connect_Time.ok \ - ws2_32-IP_Ordering.ok \ - ws2_32-Overlapping_FDS.ok \ ws2_32-TransmitFile.ok \ ws2_32-WriteWatches.ok \ wtsapi32-EnumerateProcesses.ok @@ -197,8 +207,7 @@ # | # | Modified files: # | * dlls/d3d9/tests/visual.c, dlls/kernel32/locale.c, dlls/netapi32/netapi32.c, dlls/winealsa.drv/mmdevdrv.c, -# | dlls/wined3d/glsl_shader.c, dlls/wined3d/resource.c, dlls/wined3d/swapchain.c, programs/wordpad/registry.c, -# | tools/makedep.c +# | dlls/wined3d/glsl_shader.c, dlls/wined3d/resource.c, dlls/wined3d/swapchain.c, tools/makedep.c # | .INTERMEDIATE: Miscellaneous.ok Miscellaneous.ok: @@ -206,13 +215,11 @@ $(call APPLY_FILE,Miscellaneous/0002-kernel32-Silence-repeated-CompareStringEx-FIXME.patch) $(call APPLY_FILE,Miscellaneous/0003-wined3d-Silence-repeated-wined3d_swapchain_present-F.patch) $(call APPLY_FILE,Miscellaneous/0004-Appease-the-blessed-version-of-gcc-4.5-when-Werror-i.patch) - $(call APPLY_FILE,Miscellaneous/0005-wordpad-Check-for-array-index-before-using-it-in-reg.patch) @( \ echo '+ { "Erich E. Hoover", "wined3d: Silence repeated resource_check_usage FIXME.", 2 },'; \ echo '+ { "Sebastian Lackner", "kernel32: Silence repeated CompareStringEx FIXME.", 1 },'; \ echo '+ { "Sebastian Lackner", "wined3d: Silence repeated wined3d_swapchain_present FIXME.", 1 },'; \ echo '+ { "Erich E. Hoover", "Appease the blessed version of gcc (4.5) when -Werror is enabled.", 1 },'; \ - echo '+ { "Gerald Pfeifer", "wordpad: Check for array index before using it in registry_set_filelist.", 1 },'; \ ) > Miscellaneous.ok # Patchset Pipelight @@ -260,43 +267,6 @@ echo '+ { "Michael Müller", "loader: Add commandline option --check-libs.", 1 },'; \ ) > Staging.ok -# Patchset api-ms-win-core-Stubs -# | -# | Modified files: -# | * configure.ac, dlls/api-ms-win-core-datetime-l1-1-0/Makefile.in, dlls/api-ms-win-core-datetime-l1-1-0/api-ms-win-core- -# | datetime-l1-1-0.spec, dlls/api-ms-win-core-datetime-l1-1-1/Makefile.in, dlls/api-ms-win-core-datetime-l1-1-1/api-ms-win- -# | core-datetime-l1-1-1.spec, dlls/api-ms-win-core-fibers-l1-1-0/Makefile.in, dlls/api-ms-win-core-fibers-l1-1-0/api-ms- -# | win-core-fibers-l1-1-0.spec, dlls/api-ms-win-core-fibers-l1-1-1/Makefile.in, dlls/api-ms-win-core-fibers-l1-1-1/api-ms- -# | win-core-fibers-l1-1-1.spec, dlls/api-ms-win-core-file-l2-1-0/Makefile.in, dlls/api-ms-win-core-file-l2-1-0/api-ms-win- -# | core-file-l2-1-0.spec, dlls/api-ms-win-core-localization-l1-2-1/Makefile.in, dlls/api-ms-win-core-localization-l1-2-1 -# | /api-ms-win-core-localization-l1-2-1.spec, dlls/api-ms-win-core-winrt-error-l1-1-1/Makefile.in, dlls/api-ms-win-core- -# | winrt-error-l1-1-1/api-ms-win-core-winrt-error-l1-1-1.spec, dlls/api-ms-win-core-winrt-l1-1-0/Makefile.in, dlls/api-ms- -# | win-core-winrt-l1-1-0/api-ms-win-core-winrt-l1-1-0.spec, dlls/api-ms-win-core-xstate-l2-1-0/Makefile.in, dlls/api-ms- -# | win-core-xstate-l2-1-0/api-ms-win-core-xstate-l2-1-0.spec, tools/make_specfiles -# | -.INTERMEDIATE: api-ms-win-core-Stubs.ok -api-ms-win-core-Stubs.ok: - $(call APPLY_FILE,api-ms-win-core-Stubs/0001-api-ms-win-core-fibers-l1-1-0-Add-dll.patch) - $(call APPLY_FILE,api-ms-win-core-Stubs/0002-api-ms-win-core-fibers-l1-1-1-Add-dll.patch) - $(call APPLY_FILE,api-ms-win-core-Stubs/0003-api-ms-win-core-file-l2-1-0-Add-dll.patch) - $(call APPLY_FILE,api-ms-win-core-Stubs/0004-api-ms-win-core-localization-l1-2-1-Add-dll.patch) - $(call APPLY_FILE,api-ms-win-core-Stubs/0005-api-ms-win-core-datetime-l1-1-0-Add-dll.patch) - $(call APPLY_FILE,api-ms-win-core-Stubs/0006-api-ms-win-core-datetime-l1-1-1-Add-stub-dll.patch) - $(call APPLY_FILE,api-ms-win-core-Stubs/0007-api-ms-win-core-xstate-l2-1-0-Add-stub-dll.patch) - $(call APPLY_FILE,api-ms-win-core-Stubs/0008-api-ms-win-core-winrt-l1-1-0-Add-stub-dll.patch) - $(call APPLY_FILE,api-ms-win-core-Stubs/0009-api-ms-win-core-winrt-error-l1-1-1-Add-stub-dll.patch) - @( \ - echo '+ { "Michael Müller", "api-ms-win-core-fibers-l1-1-0: Add dll.", 1 },'; \ - echo '+ { "Michael Müller", "api-ms-win-core-fibers-l1-1-1: Add dll.", 1 },'; \ - echo '+ { "Michael Müller", "api-ms-win-core-file-l2-1-0: Add dll.", 1 },'; \ - echo '+ { "Michael Müller", "api-ms-win-core-localization-l1-2-1: Add dll.", 1 },'; \ - echo '+ { "Michael Müller", "api-ms-win-core-datetime-l1-1-0: Add dll.", 1 },'; \ - echo '+ { "Michael Müller", "api-ms-win-core-datetime-l1-1-1: Add stub dll.", 1 },'; \ - echo '+ { "Michael Müller", "api-ms-win-core-xstate-l2-1-0: Add stub dll.", 1 },'; \ - echo '+ { "Michael Müller", "api-ms-win-core-winrt-l1-1-0: Add stub dll.", 1 },'; \ - echo '+ { "Michael Müller", "api-ms-win-core-winrt-error-l1-1-1: Add stub dll.", 1 },'; \ - ) > api-ms-win-core-Stubs.ok - # Patchset atl-IOCS_Property # | # | This patchset fixes the following Wine bugs: @@ -312,6 +282,39 @@ echo '+ { "Qian Hong", "atl: Don'\''t use GWLP_USERDATA to store IOCS to avoid conflict with Apps.", 1 },'; \ ) > atl-IOCS_Property.ok +# Patchset avifil32-Realloc_Records +# | +# | This patchset fixes the following Wine bugs: +# | * [#5137] Reallocate buffer when adding records to AVI files +# | +# | Modified files: +# | * dlls/avifil32/avifile.c +# | +.INTERMEDIATE: avifil32-Realloc_Records.ok +avifil32-Realloc_Records.ok: + $(call APPLY_FILE,avifil32-Realloc_Records/0001-avifil32-Reallocate-buffer-when-adding-records.patch) + @( \ + echo '+ { "Sebastian Lackner", "avifil32: Reallocate buffer when adding records.", 1 },'; \ + ) > avifil32-Realloc_Records.ok + +# Patchset combase-HSTRING +# | +# | Modified files: +# | * configure.ac, dlls/api-ms-win-core-winrt-string-l1-1-0/api-ms-win-core-winrt-string-l1-1-0.spec, +# | dlls/combase/Makefile.in, dlls/combase/combase.spec, dlls/combase/string.c, dlls/combase/tests/Makefile.in, +# | dlls/combase/tests/string.c, tools/make_specfiles +# | +.INTERMEDIATE: combase-HSTRING.ok +combase-HSTRING.ok: + $(call APPLY_FILE,combase-HSTRING/0001-combase-Implement-creation-and-deletion-of-HSTRING-o.patch) + $(call APPLY_FILE,combase-HSTRING/0002-combase-Implement-functions-for-accessing-HSTRING-ob.patch) + $(call APPLY_FILE,combase-HSTRING/0003-combase-Implement-functions-for-HSTRING_BUFFER.patch) + @( \ + echo '+ { "Martin Storsjo", "combase: Implement creation and deletion of HSTRING objects.", 1 },'; \ + echo '+ { "Martin Storsjo", "combase: Implement functions for accessing HSTRING objects.", 1 },'; \ + echo '+ { "Martin Storsjo", "combase: Implement functions for HSTRING_BUFFER.", 1 },'; \ + ) > combase-HSTRING.ok + # Patchset comctl32-LoadIconMetric # | # | This patchset fixes the following Wine bugs: @@ -739,6 +742,23 @@ echo '+ { "Alex Henrie", "kernel32/tests: Add tests for UTF-7 conversion.", 1 },'; \ ) > kernel32-UTF7_Support.ok +# Patchset kernel32-VerifyVersionInfo +# | +# | This patchset fixes the following Wine bugs: +# | * [#36143] Fix condition mask handling in RtlVerifyVersionInfo +# | +# | Modified files: +# | * dlls/kernel32/tests/version.c, dlls/ntdll/version.c +# | +.INTERMEDIATE: kernel32-VerifyVersionInfo.ok +kernel32-VerifyVersionInfo.ok: + $(call APPLY_FILE,kernel32-VerifyVersionInfo/0001-kernel32-tests-Add-additional-tests-for-condition-ma.patch) + $(call APPLY_FILE,kernel32-VerifyVersionInfo/0002-ntdll-Fix-condition-mask-handling-in-RtlVerifyVersio.patch) + @( \ + echo '+ { "Sebastian Lackner", "kernel32/tests: Add additional tests for condition mask of VerifyVersionInfoA.", 1 },'; \ + echo '+ { "Sebastian Lackner", "ntdll: Fix condition mask handling in RtlVerifyVersionInfo.", 1 },'; \ + ) > kernel32-VerifyVersionInfo.ok + # Patchset libs-Unicode_Collation # | # | This patchset fixes the following Wine bugs: @@ -769,6 +789,23 @@ echo '+ { "André Hentschel", "libwine: Use try_mmap_fixed for wine64 on FreeBSD.", 1 },'; \ ) > libwine-BSD_mmap_fixed.ok +# Patchset mfplat-Stubs +# | +# | This patchset fixes the following Wine bugs: +# | * [#37701] Implement stubs for mfplat.MFStartup and MFShutdown +# | +# | Modified files: +# | * dlls/mfplat/main.c, dlls/mfplat/mfplat.spec, include/Makefile.in, include/mferror.h +# | +.INTERMEDIATE: mfplat-Stubs.ok +mfplat-Stubs.ok: + $(call APPLY_FILE,mfplat-Stubs/0001-include-Add-mferror.h-header.patch) + $(call APPLY_FILE,mfplat-Stubs/0002-mfplat-Implement-stubs-for-MFStartup-and-MFShutdown.patch) + @( \ + echo '+ { "Sebastian Lackner", "include: Add mferror.h header.", 1 },'; \ + echo '+ { "Sebastian Lackner", "mfplat: Implement stubs for MFStartup and MFShutdown.", 1 },'; \ + ) > mfplat-Stubs.ok + # Patchset mshtml-sessionStorage # | # | Modified files: @@ -803,21 +840,6 @@ echo '+ { "Michael Müller", "msvcp90/tests: Add tests to check that basic_string_wchar_dtor returns NULL.", 1 },'; \ ) > msvcp90-basic_string_wchar_dtor.ok -# Patchset msvcrt-Spawn_Process -# | -# | This patchset fixes the following Wine bugs: -# | * [#37635] Fix passing of unicode environment from msvcrt to CreateProcessW. -# | -# | Modified files: -# | * dlls/msvcrt/process.c -# | -.INTERMEDIATE: msvcrt-Spawn_Process.ok -msvcrt-Spawn_Process.ok: - $(call APPLY_FILE,msvcrt-Spawn_Process/0001-msvcrt-Fix-passing-of-explicit-environment-to-spawn-.patch) - @( \ - echo '+ { "Ron Yorston", "msvcrt: Fix passing of explicit environment to spawn/exec calls.", 1 },'; \ - ) > msvcrt-Spawn_Process.ok - # Patchset msvcrt-atof_strtod # | # | This patchset fixes the following Wine bugs: @@ -863,6 +885,26 @@ echo '+ { "Erich E. Hoover", "ntdll: Perform the Unix-style hidden file check within the unified file info grabbing routine.", 1 },'; \ ) > ntdll-DOS_Attributes.ok +# Patchset ntdll-DllRedirects +# | +# | Modified files: +# | * dlls/ntdll/loader.c, dlls/ntdll/loadorder.c, dlls/ntdll/ntdll_misc.h +# | +.INTERMEDIATE: ntdll-DllRedirects.ok +ntdll-DllRedirects.ok: + $(call APPLY_FILE,ntdll-DllRedirects/0001-ntdll-Move-logic-to-determine-loadorder-HKCU-app-key.patch) + $(call APPLY_FILE,ntdll-DllRedirects/0002-ntdll-Move-logic-to-read-loadorder-registry-values-i.patch) + $(call APPLY_FILE,ntdll-DllRedirects/0003-ntdll-Move-code-to-determine-module-basename-into-se.patch) + $(call APPLY_FILE,ntdll-DllRedirects/0004-ntdll-Implement-get_redirect-function.patch) + $(call APPLY_FILE,ntdll-DllRedirects/0005-ntdll-Implement-loader-redirection-scheme.patch) + @( \ + echo '+ { "Michael Müller", "ntdll: Move logic to determine loadorder HKCU/app key into separate functions.", 1 },'; \ + echo '+ { "Michael Müller", "ntdll: Move logic to read loadorder registry values into separate function.", 1 },'; \ + echo '+ { "Michael Müller", "ntdll: Move code to determine module basename into separate function.", 1 },'; \ + echo '+ { "Michael Müller", "ntdll: Implement get_redirect function.", 1 },'; \ + echo '+ { "Michael Müller", "ntdll: Implement loader redirection scheme.", 1 },'; \ + ) > ntdll-DllRedirects.ok + # Patchset ntdll-Dynamic_DST # | # | This patchset fixes the following Wine bugs: @@ -974,7 +1016,7 @@ # | include/ntifs.h # | .INTERMEDIATE: ntdll-Junction_Points.ok -ntdll-Junction_Points.ok: ntdll-Fix_Free.ok +ntdll-Junction_Points.ok: ntdll-DOS_Attributes.ok ntdll-Fix_Free.ok $(call APPLY_FILE,ntdll-Junction_Points/0001-ntdll-Add-support-for-junction-point-creation.patch) $(call APPLY_FILE,ntdll-Junction_Points/0002-ntdll-Add-support-for-reading-junction-points.patch) $(call APPLY_FILE,ntdll-Junction_Points/0003-ntdll-Add-support-for-deleting-junction-points.patch) @@ -1209,6 +1251,18 @@ echo '+ { "Stefan Leichter", "ntoskrnl.exe: Emulate write to CR4 register.", 1 },'; \ ) > ntoskrnl-Write_CR4.ok +# Patchset ole32-CoWaitForMultipleHandles +# | +# | Modified files: +# | * dlls/ole32/tests/compobj.c +# | +.INTERMEDIATE: ole32-CoWaitForMultipleHandles.ok +ole32-CoWaitForMultipleHandles.ok: + $(call APPLY_FILE,ole32-CoWaitForMultipleHandles/0001-ole32-tests-Add-additional-tests-for-CoWaitForMultip.patch) + @( \ + echo '+ { "Sebastian Lackner", "ole32/tests: Add additional tests for CoWaitForMultipleHandles and WM_QUIT.", 1 },'; \ + ) > ole32-CoWaitForMultipleHandles.ok + # Patchset psapi-K32EnumProcessModulesEx # | # | This patchset fixes the following Wine bugs: @@ -1551,6 +1605,21 @@ echo '+ { "Michael Müller", "shell32: Choose return value for SHFileOperationW depending on windows version.", 1 },'; \ ) > shell32-SHFileOperation.ok +# Patchset shell32-SHILCreateFromPath +# | +# | This patchset fixes the following Wine bugs: +# | * [#37265] Provide named entry point shell32.SHILCreateFromPath for vista apps +# | +# | Modified files: +# | * dlls/shell32/shell32.spec +# | +.INTERMEDIATE: shell32-SHILCreateFromPath.ok +shell32-SHILCreateFromPath.ok: + $(call APPLY_FILE,shell32-SHILCreateFromPath/0001-shell32-export-SHILCreateFromPath-by-name-too.patch) + @( \ + echo '+ { "Stefan Leichter", "shell32: export SHILCreateFromPath by name too.", 1 },'; \ + ) > shell32-SHILCreateFromPath.ok + # Patchset shlwapi-PathIsDirectoryEmptyW # | # | This patchset fixes the following Wine bugs: @@ -1566,6 +1635,18 @@ echo '+ { "Michael Müller", "shlwapi: Correctly treat '\''.'\'' when enumerating files in PathIsDirectoryEmptyW.", 1 },'; \ ) > shlwapi-PathIsDirectoryEmptyW.ok +# Patchset shlwapi-StrCatChainW +# | +# | Modified files: +# | * dlls/shlwapi/shlwapi.spec, dlls/shlwapi/string.c, dlls/shlwapi/tests/string.c +# | +.INTERMEDIATE: shlwapi-StrCatChainW.ok +shlwapi-StrCatChainW.ok: + $(call APPLY_FILE,shlwapi-StrCatChainW/0001-shlwapi-Add-implementation-for-StrCatChainW.patch) + @( \ + echo '+ { "Sebastian Lackner", "shlwapi: Add implementation for StrCatChainW.", 1 },'; \ + ) > shlwapi-StrCatChainW.ok + # Patchset shlwapi-UrlCombine # | # | Modified files: @@ -1580,6 +1661,21 @@ echo '+ { "Sebastian Lackner", "shlwapi: UrlCombineW workaround for relative paths.", 1 },'; \ ) > shlwapi-UrlCombine.ok +# Patchset urlmon-CoInternetSetFeatureEnabled +# | +# | This patchset fixes the following Wine bugs: +# | * [#35197] Ignore unsupported flags for CoInternetSetFeatureEnabled +# | +# | Modified files: +# | * dlls/urlmon/internet.c +# | +.INTERMEDIATE: urlmon-CoInternetSetFeatureEnabled.ok +urlmon-CoInternetSetFeatureEnabled.ok: + $(call APPLY_FILE,urlmon-CoInternetSetFeatureEnabled/0001-urlmon-Ignore-unsupported-flags-for-CoInternetSetFea.patch) + @( \ + echo '+ { "Bruno Jesus", "urlmon: Ignore unsupported flags for CoInternetSetFeatureEnabled.", 1 },'; \ + ) > urlmon-CoInternetSetFeatureEnabled.ok + # Patchset user32-Dialog_Paint_Event # | # | This patchset fixes the following Wine bugs: @@ -1610,6 +1706,21 @@ echo '+ { "Sebastian Lackner", "user32: Fix handling of invert_y in DrawTextExW.", 1 },'; \ ) > user32-DrawTextExW.ok +# Patchset user32-GetRawInputDeviceList +# | +# | This patchset fixes the following Wine bugs: +# | * [#37667] Set last error when GetRawInputDeviceList fails +# | +# | Modified files: +# | * dlls/user32/input.c +# | +.INTERMEDIATE: user32-GetRawInputDeviceList.ok +user32-GetRawInputDeviceList.ok: + $(call APPLY_FILE,user32-GetRawInputDeviceList/0001-user32-Set-last-error-when-GetRawInputDeviceList-fai.patch) + @( \ + echo '+ { "Andrew Church", "user32: Set last error when GetRawInputDeviceList fails.", 1 },'; \ + ) > user32-GetRawInputDeviceList.ok + # Patchset user32-GetSystemMetrics # | # | This patchset fixes the following Wine bugs: @@ -1657,6 +1768,21 @@ echo '+ { "Dmitry Timoshkov", "user32: Try harder to find a target for mouse messages.", 1 },'; \ ) > user32-Mouse_Message_Hwnd.ok +# Patchset user32-ScrollWindowEx +# | +# | This patchset fixes the following Wine bugs: +# | * [#37706] Fix return value of ScrollWindowEx for invisible windows +# | +# | Modified files: +# | * dlls/user32/painting.c +# | +.INTERMEDIATE: user32-ScrollWindowEx.ok +user32-ScrollWindowEx.ok: + $(call APPLY_FILE,user32-ScrollWindowEx/0001-user32-Fix-return-value-of-ScrollWindowEx-for-invisi.patch) + @( \ + echo '+ { "Dmitry Timoshkov", "user32: Fix return value of ScrollWindowEx for invisible windows.", 1 },'; \ + ) > user32-ScrollWindowEx.ok + # Patchset user32-WndProc # | # | This patchset fixes the following Wine bugs: @@ -1717,6 +1843,405 @@ echo '+ { "Michael Müller", "winebuild: Set a valid major and minor linker version.", 1 },'; \ ) > winebuild-LinkerVersion.ok +# Patchset winecfg-Staging +# | +# | Modified files: +# | * programs/winecfg/Makefile.in, programs/winecfg/main.c, programs/winecfg/resource.h, programs/winecfg/staging.c, +# | programs/winecfg/winecfg.h, programs/winecfg/winecfg.rc +# | +.INTERMEDIATE: winecfg-Staging.ok +winecfg-Staging.ok: ntdll-DllRedirects.ok wined3d-CSMT_Main.ok + $(call APPLY_FILE,winecfg-Staging/0001-winecfg-Add-staging-tab-for-CSMT.patch) + @( \ + echo '+ { "Michael Müller", "winecfg: Add staging tab for CSMT.", 1 },'; \ + ) > winecfg-Staging.ok + +# Patchset wined3d-CSMT_Helper +# | +# | Modified files: +# | * configure.ac, dlls/ddraw/surface.c, dlls/wined3d-csmt/Makefile.in, dlls/wined3d-csmt/version.rc, dlls/wined3d-csmt +# | /wined3d-csmt.spec, dlls/wined3d/resource.c, dlls/wined3d/surface.c, dlls/wined3d/volume.c, dlls/wined3d/wined3d.spec, +# | dlls/wined3d/wined3d_private.h, include/wine/wined3d.h +# | +.INTERMEDIATE: wined3d-CSMT_Helper.ok +wined3d-CSMT_Helper.ok: wined3d-DXTn.ok + $(call APPLY_FILE,wined3d-CSMT_Helper/0001-wined3d-Merge-get_pitch-functions.patch) + $(call APPLY_FILE,wined3d-CSMT_Helper/0002-wined3d-Add-second-dll-with-STAGING_CSMT-definition-.patch) + @( \ + echo '+ { "Stefan Dösinger", "wined3d: Merge get_pitch functions.", 1 },'; \ + echo '+ { "Sebastian Lackner", "wined3d: Add second dll with STAGING_CSMT definition set.", 1 },'; \ + ) > wined3d-CSMT_Helper.ok + +# Patchset wined3d-CSMT_Main +# | +# | This patchset fixes the following Wine bugs: +# | * [#11674] Support for CSMT (command stream) to increase graphic performance +# | +# | Modified files: +# | * dlls/d3d8/tests/visual.c, dlls/d3d9/tests/visual.c, dlls/wined3d/arb_program_shader.c, dlls/wined3d/buffer.c, +# | dlls/wined3d/context.c, dlls/wined3d/cs.c, dlls/wined3d/device.c, dlls/wined3d/directx.c, dlls/wined3d/drawprim.c, +# | dlls/wined3d/glsl_shader.c, dlls/wined3d/query.c, dlls/wined3d/resource.c, dlls/wined3d/shader.c, dlls/wined3d/state.c, +# | dlls/wined3d/stateblock.c, dlls/wined3d/surface.c, dlls/wined3d/swapchain.c, dlls/wined3d/texture.c, +# | dlls/wined3d/utils.c, dlls/wined3d/vertexdeclaration.c, dlls/wined3d/view.c, dlls/wined3d/volume.c, +# | dlls/wined3d/wined3d_main.c, dlls/wined3d/wined3d_private.h, dlls/winex11.drv/opengl.c +# | +.INTERMEDIATE: wined3d-CSMT_Main.ok +wined3d-CSMT_Main.ok: wined3d-CSMT_Helper.ok + $(call APPLY_FILE,wined3d-CSMT_Main/0001-wined3d-Pass-a-context-to-surface_load_sysmem.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0002-wined3d-Pass-a-context-to-read_from_framebuffer.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0003-wined3d-Pass-a-context-to-surface_load_drawable-and-.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0004-wined3d-Pass-a-context-to-surface_blt_fbo.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0005-wined3d-Pass-a-context-to-surface_multisample_resolv.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0006-wined3d-Pass-a-context-to-surface_load_texture.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0007-wined3d-Pass-a-context-to-surface_load_location.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0008-wined3d-Make-surface_load_location-return-nothing.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0009-wined3d-Store-volume-locations-in-the-resource.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0010-wined3d-Move-validate_location-to-resource.c.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0011-wined3d-Move-surface-locations-into-the-resource.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0012-wined3d-Remove-surface_validate_location.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0013-wined3d-Move-invalidate_location-to-resource.c.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0014-wined3d-Invalidate-containers-via-callback.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0015-wined3d-Remove-surface_invalidate_location.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0016-wined3d-Move-bitmap_data-and-user_memory-into-the-re.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0017-wined3d-Move-load_location-into-the-resource.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0018-wined3d-Replace-surface_load_location-with-resource_.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0019-wined3d-Introduce-helper-functions-for-mapping-volum.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0020-wined3d-Move-volume-PBO-infrastructure-into-the-reso.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0021-wined3d-Remove-surface-pbo.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0022-wined3d-Use-resource-buffer-mapping-facilities-in-su.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0023-wined3d-Move-buffer-creation-into-the-resource.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0024-wined3d-Handle-WINED3D_LOCATION_DISCARDED-in-surface.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0025-wined3d-Handle-LOCATION_DISCARDED-in-surface_load_dr.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0026-wined3d-Handle-WINED3D_LOCATION_DISCARDED-for-sysmem.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0027-wined3d-Discard-implicit-surfaces-on-unload.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0028-wined3d-Don-t-try-to-flip-sysmem-copies-in-swapchain.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0029-wined3d-Discard-the-backbuffer-in-discard-presents.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0030-wined3d-Allocate-sysmem-for-client-storage-if-it-doe.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0031-wined3d-Introduce-a-function-to-retrieve-resource-me.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0032-wined3d-Make-surface_ops-unmap-specific-for-front-bu.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0033-wined3d-Move-check_block_align-to-resource.c.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0034-wined3d-Replace-surface-alloc-functions-with-resourc.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0035-wined3d-Don-t-delete-the-buffer-in-surface_cleanup.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0036-wined3d-Use-resource-facilities-to-destroy-PBOs.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0037-wined3d-Move-simple-location-copying-to-the-resource.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0038-wined3d-Move-most-of-volume_map-to-resource.c.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0039-wined3d-Use-resource_map-for-surface_map.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0040-wined3d-Use-client-storage-with-DIB-sections.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0041-wined3d-Don-t-call-the-public-map-function-in-surfac.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0042-wined3d-Don-t-call-the-public-map-function-in-surfac.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0043-wined3d-Move-the-framebuffer-into-wined3d_state.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0044-wined3d-Get-rid-of-state-access-in-shader_generate_g.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0045-wined3d-Preload-buffers-if-streamsrc-is-not-dirty.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0046-wined3d-Hackily-introduce-a-multithreaded-command-st.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0047-wined3d-Wait-for-resource-updates-to-finish-when-usi.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0048-wined3d-Don-t-store-pointers-in-struct-wined3d_cs_pr.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0049-wined3d-Don-t-put-rectangle-pointers-into-wined3d_cs.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0050-wined3d-Store-the-color-in-clear-ops-instead-of-a-po.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0051-wined3d-Pass-the-state-to-draw_primitive.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0052-wined3d-Wait-for-the-cs-before-destroying-objects.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0053-wined3d-Give-the-cs-its-own-state.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0054-wined3d-Send-float-constant-updates-through-the-comm.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0055-wined3d-Request-a-glFinish-before-modifying-resource.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0056-wined3d-Finish-the-cs-before-changing-the-texture-lo.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0057-wined3d-Don-t-call-glFinish-after-clears.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0058-wined3d-Don-t-call-glFinish-after-draws.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0059-wined3d-Shadow-device-offscreenBuffer-in-the-context.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0060-wined3d-Don-t-access-the-stateblock-in-find_draw_buf.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0061-wined3d-Pass-the-depth-stencil-to-swapchain-present.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0062-wined3d-Don-t-store-viewport-pointers-in-the-command.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0063-wined3d-Keep-track-of-the-onscreen-depth-stencil-in-.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0064-wined3d-Send-base-vertex-index-updates-through-the-c.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0065-wined3d-Send-primitive-type-updates-through-the-comm.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0066-wined3d-Send-bool-constant-updates-through-the-comma.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0067-wined3d-Send-int-constant-updates-through-the-comman.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0068-wined3d-Send-light-updates-through-the-command-strea.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0069-wined3d-Prevent-the-command-stream-from-running-ahea.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0070-wined3d-Wait-for-the-cs-to-finish-before-destroying-.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0071-wined3d-Run-the-cs-asynchronously.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0072-wined3d-Send-blits-through-the-command-stream.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0073-wined3d-Put-update_surface-checks-back-in-place.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0074-wined3d-Get-rid-of-WINED3D_BUFFER_FLUSH.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0075-wined3d-Add-cs-waiting-debug-code.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0076-wined3d-Don-t-force-strict-draw-ordering-for-multith.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0077-wined3d-Send-render-target-view-clears-through-the-c.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0078-wined3d-Wait-for-the-CS-in-GetDC.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0079-wined3d-send-resource-maps-through-the-command-strea.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0080-wined3d-Get-rid-of-the-end_scene-flush-and-finish.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0081-wined3d-Replace-the-linked-lists-with-a-ringbuffer.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0082-wined3d-Don-t-preload-buffers-on-unmap.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0083-wined3d-Don-t-call-glFinish-before-swapping.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0084-wined3d-wined3d_-_query_issue-never-fails.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0085-wined3d-Add-query-support-to-the-command-stream.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0086-wined3d-Check-our-CS-state-to-find-out-if-a-query-is.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0087-wined3d-Poll-queries-automatically-in-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0088-wined3d-Introduce-a-separate-queue-for-priority-comm.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0089-wined3d-Destroy-queries-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0090-wined3d-Separate-main-and-worker-thread-query-state.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0091-wined3d-Don-t-poll-queries-that-failed-to-start.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0092-wined3d-Remove-restated-queries-from-the-poll-list.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0093-wined3d-Don-t-reset-the-query-state-if-it-doesn-t-ha.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0094-wined3d-Put-this-into-the-query-poll-patch.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0095-wined3d-Send-update_surface-commands-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0096-wined3d-Send-texture-preloads-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0097-wined3d-Send-surface-preloads-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0098-wined3d-Send-update_texture-calls-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0099-wined3d-Get-rid-of-the-surface_upload_data-glFinish.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0100-wined3d-Don-t-lock-the-src-volume-in-device_update_v.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0101-wined3d-Handle-evit_managed_resources-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0102-wined3d-Send-flips-through-the-command-stream.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0103-wined3d-Introduce-resource-fencing.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0104-wined3d-Fence-update_texture-and-update_surface-call.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0105-wined3d-Dirtify-resources-on-unmap.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0106-wined3d-Fence-texture-reads-in-draws.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0107-wined3d-Fence-render-targets-and-depth-stencils.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0108-wined3d-Fence-blit-operations.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0109-wined3d-Fence-color_fill-operations.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0110-wined3d-Fence-clear-calls.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0111-wined3d-Fence-present-calls.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0112-wined3d-Make-resource-maps-and-unmaps-a-priority-com.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0113-wined3d-Dirtify-changed-textures-through-the-command.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0114-wined3d-Wrap-GL-BOs-in-a-structure.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0115-wined3d-Separate-resource-map-and-draw-buffers.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0116-wined3d-Implement-DISCARD-resource-maps-with-buffers.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0117-wined3d-Implement-DISCARD-resource-maps-with-heap-me.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0118-wined3d-Unset-some-objects-in-state_init_default.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0119-wined3d-Don-t-request-the-frontbuffer-to-create-dumm.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0120-wined3d-Use-double-buffered-buffers-for-multithreade.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0121-wined3d-Don-t-synchronize-NOOVERWRITE-buffer-maps.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0122-wined3d-Separate-buffer-map-write-and-draw-read-memo.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0123-wined3d-Accelerate-DISCARD-buffer-maps.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0124-wined3d-Accelerate-READONLY-buffer-maps.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0125-wined3d-Access-the-buffer-dirty-areas-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0126-wined3d-Ignore-buffer-resource.map_count-in-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0127-wined3d-Send-buffer-preloads-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0128-wined3d-Use-glBufferSubData-instead-of-glMapBufferRa.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0129-wined3d-Separate-GL-buffer-discard-control-from-igno.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0130-wined3d-Create-buffers-before-mapping-them.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0131-wined3d-Destroy-views-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0132-wined3d-Remove-another-glFinish.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0133-wined3d-Destroy-vertex-declarations-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0134-wined3d-Destroy-shaders-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0135-wined3d-Create-VBOs-through-the-command-stream.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0136-wined3d-Clean-up-resource-data-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0137-wined3d-Clean-up-buffer-resource-data-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0138-wined3d-Clean-up-volume-resource-data-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0139-wined3d-Clean-up-surfaces-through-the-cs.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0140-wined3d-Clean-up-texture-resources-through-the-cs.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0141-wined3d-Unload-resources-through-the-CS-in-uninit_3d.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0142-wined3d-Unload-resources-through-the-CS-in-device_re.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0143-wined3d-Don-t-glFinish-after-a-depth-buffer-blit.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0144-wined3d-Remove-software-cursor-support.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0145-wined3d-Create-dummy-textures-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0146-wined3d-Create-the-initial-context-through-the-CS.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0147-wined3d-Recreate-ctx-and-dummy-textures-through-the-.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0148-wined3d-Ignore-WINED3D_MAP_NO_DIRTY_UPDATE-in-resour.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0149-wined3d-Delete-GL-contexts-through-the-CS-in-reset.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0150-wined3d-Delete-GL-contexts-through-the-CS-in-uninit_.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0151-wined3d-Invoke-surface_unload-through-the-CS-in-wine.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0152-wined3d-Use-an-event-to-block-the-worker-thread-when.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0153-wined3d-Fence-preload-operations.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0154-d3d8-tests-D3DLOCK_NO_DIRTY_UPDATE-on-managed-textur.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0155-d3d9-tests-D3DLOCK_NO_DIRTY_UPDATE-on-managed-textur.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0156-wined3d-Completely-reset-the-state-on-reset.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0157-wined3d-Send-getdc-and-releasedc-through-the-command.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0158-wined3d-Set-map_heap_memory-NULL-when-allocating-a-P.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0159-wined3d-Wait-only-for-the-buffer-to-be-idle.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0160-wined3d-Add-a-comment-about-worker-thread-lag.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0161-wined3d-Remove-the-texture-destroy-glFinish.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0162-wined3d-Move-FBO-destruction-into-the-worker-thread.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0163-wined3d-Don-t-incref-decref-textures-in-color-depth-.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0164-Winex11-complain-about-glfinish.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0165-wined3d-Make-sure-the-new-window-is-set-up-before-se.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0166-wined3d-Remove-the-device_reset-CS-sync-fixme.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0167-wined3d-Put-GL_APPLE_flush_buffer_range-syncing-back.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0168-wined3d-Wait-for-the-resource-to-be-idle-when-destro.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0169-wined3d-Don-t-sync-on-redundant-discard-calls.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0170-wined3d-Don-t-discard-new-buffers.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0171-wined3d-Don-t-try-to-sync-VBOs-manually-on-OSX-with-.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0172-wined3d-Render-target-lock-hack.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0173-wined3d-Avoid-calling-wined3d_surface_blt-from-surfa.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0174-wined3d-Fix-some-uninitialized-memory-accesses.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/0175-wined3d-Enable-CSMT-by-default-print-a-winediag-mess.patch) + $(call APPLY_FILE,wined3d-CSMT_Main/9999-IfDefined.patch) + @( \ + echo '+ { "Stefan Dösinger", "wined3d: Pass a context to surface_load_sysmem.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Pass a context to read_from_framebuffer.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Pass a context to surface_load_drawable and surface_blt_to_drawable.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Pass a context to surface_blt_fbo.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Pass a context to surface_multisample_resolve.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Pass a context to surface_load_texture.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Pass a context to surface_load_location.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Make surface_load_location return nothing.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Store volume locations in the resource.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Move validate_location to resource.c.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Move surface locations into the resource.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Remove surface_validate_location.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Move invalidate_location to resource.c.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Invalidate containers via callback.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Remove surface_invalidate_location.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Move bitmap_data and user_memory into the resource.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Move load_location into the resource.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Replace surface_load_location with resource_load_location.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Introduce helper functions for mapping volumes.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Move volume PBO infrastructure into the resource.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Remove surface->pbo.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Use resource buffer mapping facilities in surfaces.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Move buffer creation into the resource.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Handle WINED3D_LOCATION_DISCARDED in surface_load_texture.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Handle LOCATION_DISCARDED in surface_load_drawable.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Handle WINED3D_LOCATION_DISCARDED for sysmem loads.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Discard implicit surfaces on unload.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t try to flip sysmem copies in swapchain_present.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Discard the backbuffer in discard presents.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Allocate sysmem for client storage if it doesn'\''t exist already.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Introduce a function to retrieve resource memory.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Make surface_ops->unmap specific for front buffers.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Move check_block_align to resource.c.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Replace surface alloc functions with resource ones.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t delete the buffer in surface_cleanup.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Use resource facilities to destroy PBOs.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Move simple location copying to the resource.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Move most of volume_map to resource.c.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Use resource_map for surface_map.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Use client storage with DIB sections.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t call the public map function in surface_convert_format.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t call the public map function in surface_cpu_blt.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Move the framebuffer into wined3d_state.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Get rid of state access in shader_generate_glsl_declarations.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Preload buffers if streamsrc is not dirty.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Hackily introduce a multithreaded command stream.", 1 },'; \ + echo '+ { "Henri Verbeet", "wined3d: Wait for resource updates to finish when using the multithreaded command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t store pointers in struct wined3d_cs_present.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t put rectangle pointers into wined3d_cs_clear.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Store the color in clear ops instead of a pointer.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Pass the state to draw_primitive.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Wait for the cs before destroying objects.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Give the cs its own state.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send float constant updates through the command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Request a glFinish before modifying resources outside the cs.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Finish the cs before changing the texture lod.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t call glFinish after clears.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t call glFinish after draws.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Shadow device->offscreenBuffer in the context.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t access the stateblock in find_draw_buffers_mask.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Pass the depth stencil to swapchain->present.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t store viewport pointers in the command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Keep track of the onscreen depth stencil in the command stream instead of the device.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send base vertex index updates through the cs.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send primitive type updates through the command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send bool constant updates through the command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send int constant updates through the command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send light updates through the command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Prevent the command stream from running ahead too far.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Wait for the cs to finish before destroying the device.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Run the cs asynchronously.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send blits through the command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Put update_surface checks back in place.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Get rid of WINED3D_BUFFER_FLUSH.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Add cs waiting debug code.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t force strict draw ordering for multithreaded CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send render target view clears through the command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Wait for the CS in GetDC.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: send resource maps through the command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Get rid of the end_scene flush and finish.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Replace the linked lists with a ringbuffer.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t preload buffers on unmap.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t call glFinish before swapping.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: wined3d_*_query_issue never fails.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Add query support to the command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Check our CS state to find out if a query is done.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Poll queries automatically in the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Introduce a separate queue for priority commands.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Destroy queries through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Separate main and worker thread query state.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t poll queries that failed to start.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Remove restated queries from the poll list.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t reset the query state if it doesn'\''t have a ctx.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Put this into the query poll patch.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send update_surface commands through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send texture preloads through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send surface preloads through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send update_texture calls through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Get rid of the surface_upload_data glFinish.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t lock the src volume in device_update_volume.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Handle evit_managed_resources through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send flips through the command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Introduce resource fencing.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Fence update_texture and update_surface calls.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Dirtify resources on unmap.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Fence texture reads in draws.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Fence render targets and depth stencils.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Fence blit operations.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Fence color_fill operations.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Fence clear calls.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Fence present calls.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Make resource maps and unmaps a priority command.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Dirtify changed textures through the command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Wrap GL BOs in a structure.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Separate resource map and draw buffers.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Implement DISCARD resource maps with buffers.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Implement DISCARD resource maps with heap memory.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Unset some objects in state_init_default.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t request the frontbuffer to create dummy textures.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Use double-buffered buffers for multithreaded CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t synchronize NOOVERWRITE buffer maps.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Separate buffer map write and draw read memory pointers.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Accelerate DISCARD buffer maps.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Accelerate READONLY buffer maps.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Access the buffer dirty areas through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Ignore buffer->resource.map_count in the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send buffer preloads through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Use glBufferSubData instead of glMapBufferRange.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Separate GL buffer discard control from ignoring MAP_DISCARD.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Create buffers before mapping them.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Destroy views through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Remove another glFinish.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Destroy vertex declarations through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Destroy shaders through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Create VBOs through the command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Clean up resource data through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Clean up buffer resource data through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Clean up volume resource data through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Clean up surfaces through the cs.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Clean up texture resources through the cs.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Unload resources through the CS in uninit_3d.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Unload resources through the CS in device_reset.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t glFinish after a depth buffer blit.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Remove software cursor support.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Create dummy textures through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Create the initial context through the CS.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Recreate ctx and dummy textures through the CS after resets.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Ignore WINED3D_MAP_NO_DIRTY_UPDATE in resource_map.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Delete GL contexts through the CS in reset.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Delete GL contexts through the CS in uninit_3d.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Invoke surface_unload through the CS in wined3d_surface_update_desc.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Use an event to block the worker thread when it is idle.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Fence preload operations.", 1 },'; \ + echo '+ { "Stefan Dösinger", "d3d8/tests: D3DLOCK_NO_DIRTY_UPDATE on managed textures is temporarily broken.", 1 },'; \ + echo '+ { "Stefan Dösinger", "d3d9/tests: D3DLOCK_NO_DIRTY_UPDATE on managed textures is temporarily broken.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Completely reset the state on reset.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Send getdc and releasedc through the command stream.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Set map_heap_memory = NULL when allocating a PBO.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Wait only for the buffer to be idle.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Add a comment about worker thread lag.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Remove the texture destroy glFinish.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Move FBO destruction into the worker thread.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t incref / decref textures in color / depth fill blits.", 1 },'; \ + echo '+ { "Stefan Dösinger", "Winex11: complain about glfinish.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Make sure the new window is set up before setting up a context.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Remove the device_reset CS sync fixme.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Put GL_APPLE_flush_buffer_range syncing back in place.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Wait for the resource to be idle when destroying user memory surfaces.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t sync on redundant discard calls.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t discard new buffers.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Don'\''t try to sync VBOs manually on OSX with CSMT.", 1 },'; \ + echo '+ { "Stefan Dösinger", "wined3d: Render target lock hack.", 1 },'; \ + echo '+ { "Matteo Bruni", "wined3d: Avoid calling wined3d_surface_blt() from surface_upload_from_surface().", 1 },'; \ + echo '+ { "Sebastian Lackner", "wined3d: Fix some uninitialized memory accesses.", 1 },'; \ + echo '+ { "Sebastian Lackner", "wined3d: Enable CSMT by default, print a winediag message informing about this patchset.", 1 },'; \ + echo '+ { "Wine Staging Team", "Autogenerated #ifdef patch for wined3d-CSMT_Main.", 1 },'; \ + ) > wined3d-CSMT_Main.ok + # Patchset wined3d-DXTn # | # | This patchset fixes the following Wine bugs: @@ -1841,6 +2366,9 @@ $(call APPLY_FILE,winepulse-PulseAudio_Support/0027-winepulse-handle-stream-create-failing-correctly.patch) $(call APPLY_FILE,winepulse-PulseAudio_Support/0028-winepulse-expose-audio-devices-directly-to-programs.patch) $(call APPLY_FILE,winepulse-PulseAudio_Support/0029-winepulse-implement-exclusive-mode.patch) + $(call APPLY_FILE,winepulse-PulseAudio_Support/0030-winepulse-fix-segfault-in-pulse_rd_loop.patch) + $(call APPLY_FILE,winepulse-PulseAudio_Support/0031-winepulse-implement-GetPropValue.patch) + $(call APPLY_FILE,winepulse-PulseAudio_Support/0032-winepulse-Replace-busyloop-with-condition-variable-a.patch) @( \ echo '+ { "Maarten Lankhorst", "winmm: Load winealsa if winepulse is found.", 1 },'; \ echo '+ { "Maarten Lankhorst", "winepulse: Add initial stub for pulseaudio support.", 1 },'; \ @@ -1871,6 +2399,9 @@ echo '+ { "Mark Harmstone", "winepulse: handle stream create failing correctly.", 1 },'; \ echo '+ { "Mark Harmstone", "winepulse: expose audio devices directly to programs.", 1 },'; \ echo '+ { "Mark Harmstone", "winepulse: implement exclusive mode.", 1 },'; \ + echo '+ { "Mark Harmstone", "winepulse: fix segfault in pulse_rd_loop.", 1 },'; \ + echo '+ { "Mark Harmstone", "winepulse: implement GetPropValue.", 1 },'; \ + echo '+ { "Sebastian Lackner", "winepulse: Replace busyloop with condition variable and minor style fixes.", 1 },'; \ ) > winepulse-PulseAudio_Support.ok # Patchset winex11-CandidateWindowPos @@ -1958,20 +2489,20 @@ echo '+ { "Michael Müller", "winex11.drv: Only warn about used contexts in wglShareLists.", 1 },'; \ ) > winex11-wglShareLists.ok -# Patchset wintrust-Reset_hFile +# Patchset wininet-encoding # | # | This patchset fixes the following Wine bugs: -# | * [#36257] Wintrust doesn't reset data->pWintrustData->u.pFile->hFile after closing handle +# | * [#37046] wininet should allow Accept-Encoding header for HTTP/1.0 # | # | Modified files: -# | * dlls/wintrust/softpub.c +# | * dlls/wininet/http.c, dlls/wininet/tests/http.c # | -.INTERMEDIATE: wintrust-Reset_hFile.ok -wintrust-Reset_hFile.ok: - $(call APPLY_FILE,wintrust-Reset_hFile/0001-wintrust-Reset-data-pWintrustData-u.pFile-hFile-afte.patch) +.INTERMEDIATE: wininet-encoding.ok +wininet-encoding.ok: + $(call APPLY_FILE,wininet-encoding/0001-wininet-Allow-Accept-Encoding-for-HTTP-1.0-requests.patch) @( \ - echo '+ { "Sebastian Lackner", "wintrust: Reset data->pWintrustData->u.pFile->hFile after closing handle.", 1 },'; \ - ) > wintrust-Reset_hFile.ok + echo '+ { "Michael Müller", "wininet: Allow Accept-Encoding for HTTP/1.0 requests.", 1 },'; \ + ) > wininet-encoding.ok # Patchset wpcap-Dynamic_Linking # | @@ -1997,32 +2528,6 @@ echo '+ { "Sebastian Lackner", "ws2_32: Implement returning the proper time with SO_CONNECT_TIME.", 1 },'; \ ) > ws2_32-Connect_Time.ok -# Patchset ws2_32-IP_Ordering -# | -# | Modified files: -# | * dlls/ws2_32/socket.c -# | -.INTERMEDIATE: ws2_32-IP_Ordering.ok -ws2_32-IP_Ordering.ok: - $(call APPLY_FILE,ws2_32-IP_Ordering/0001-ws2_32-WS_get_local_ips-Fix-ordering-of-IP-addresses.patch) - @( \ - echo '+ { "Joachim Priesner", "ws2_32: WS_get_local_ips: Fix ordering of IP addresses by metric if two addresses have the same metric.", 2 },'; \ - ) > ws2_32-IP_Ordering.ok - -# Patchset ws2_32-Overlapping_FDS -# | -# | Modified files: -# | * dlls/ws2_32/socket.c, dlls/ws2_32/tests/sock.c -# | -.INTERMEDIATE: ws2_32-Overlapping_FDS.ok -ws2_32-Overlapping_FDS.ok: - $(call APPLY_FILE,ws2_32-Overlapping_FDS/0001-ws2_32-tests-Fix-several-copy-and-paste-errors.patch) - $(call APPLY_FILE,ws2_32-Overlapping_FDS/0002-ws2_32-Improve-implementation-of-get_poll_results.patch) - @( \ - echo '+ { "Sebastian Lackner", "ws2_32/tests: Fix several copy and paste errors.", 1 },'; \ - echo '+ { "Sebastian Lackner", "ws2_32: Improve implementation of get_poll_results.", 1 },'; \ - ) > ws2_32-Overlapping_FDS.ok - # Patchset ws2_32-TransmitFile # | # | This patchset fixes the following Wine bugs: diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/mfplat-Stubs/0001-include-Add-mferror.h-header.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/mfplat-Stubs/0001-include-Add-mferror.h-header.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/mfplat-Stubs/0001-include-Add-mferror.h-header.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/mfplat-Stubs/0001-include-Add-mferror.h-header.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,115 @@ +From 76e1bf51109fcade8d12a828c501f86d42ba1c5f Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +Date: Fri, 12 Dec 2014 00:56:28 +0100 +Subject: include: Add mferror.h header. + +--- + include/Makefile.in | 1 + + include/mferror.h | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 83 insertions(+) + create mode 100644 include/mferror.h + +diff --git a/include/Makefile.in b/include/Makefile.in +index 3cf9ba6..ef65df5 100644 +--- a/include/Makefile.in ++++ b/include/Makefile.in +@@ -397,6 +397,7 @@ SRCDIR_INCLUDES = \ + mciavi.h \ + mcx.h \ + mediaerr.h \ ++ mferror.h \ + midles.h \ + minmax.h \ + mmddk.h \ +diff --git a/include/mferror.h b/include/mferror.h +new file mode 100644 +index 0000000..42c472f +--- /dev/null ++++ b/include/mferror.h +@@ -0,0 +1,82 @@ ++/* ++ * Copyright (C) 2014 Sebastian Lackner ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ++ */ ++ ++#ifndef __WINE_MFERROR_H ++#define __WINE_MFERROR_H ++ ++#define MF_E_PLATFORM_NOT_INITIALIZED _HRESULT_TYPEDEF_(0xc00d36b0) ++#define MF_E_BUFFERTOOSMALL _HRESULT_TYPEDEF_(0xc00d36b1) ++#define MF_E_INVALIDREQUEST _HRESULT_TYPEDEF_(0xc00d36b2) ++#define MF_E_INVALIDSTREAMNUMBER _HRESULT_TYPEDEF_(0xc00d36b3) ++#define MF_E_INVALIDMEDIATYPE _HRESULT_TYPEDEF_(0xc00d36b4) ++#define MF_E_NOTACCEPTING _HRESULT_TYPEDEF_(0xc00d36b5) ++#define MF_E_NOT_INITIALIZED _HRESULT_TYPEDEF_(0xc00d36b6) ++#define MF_E_UNSUPPORTED_REPRESENTATION _HRESULT_TYPEDEF_(0xc00d36b7) ++#define MF_E_NO_MORE_TYPES _HRESULT_TYPEDEF_(0xc00d36b9) ++#define MF_E_UNSUPPORTED_SERVICE _HRESULT_TYPEDEF_(0xc00d36ba) ++#define MF_E_UNEXPECTED _HRESULT_TYPEDEF_(0xc00d36bb) ++#define MF_E_INVALIDNAME _HRESULT_TYPEDEF_(0xc00d36bc) ++#define MF_E_INVALIDTYPE _HRESULT_TYPEDEF_(0xc00d36bd) ++#define MF_E_INVALID_FILE_FORMAT _HRESULT_TYPEDEF_(0xc00d36be) ++#define MF_E_INVALIDINDEX _HRESULT_TYPEDEF_(0xc00d36bf) ++#define MF_E_INVALID_TIMESTAMP _HRESULT_TYPEDEF_(0xc00d36c0) ++#define MF_E_UNSUPPORTED_SCHEME _HRESULT_TYPEDEF_(0xc00d36c3) ++#define MF_E_UNSUPPORTED_BYTESTREAM_TYPE _HRESULT_TYPEDEF_(0xc00d36c4) ++#define MF_E_UNSUPPORTED_TIME_FORMAT _HRESULT_TYPEDEF_(0xc00d36c5) ++#define MF_E_NO_SAMPLE_TIMESTAMP _HRESULT_TYPEDEF_(0xc00d36c8) ++#define MF_E_NO_SAMPLE_DURATION _HRESULT_TYPEDEF_(0xc00d36c9) ++#define MF_E_INVALID_STREAM_DATA _HRESULT_TYPEDEF_(0xc00d36cb) ++#define MF_E_RT_UNAVAILABLE _HRESULT_TYPEDEF_(0xc00d36cf) ++#define MF_E_UNSUPPORTED_RATE _HRESULT_TYPEDEF_(0xc00d36d0) ++#define MF_E_THINNING_UNSUPPORTED _HRESULT_TYPEDEF_(0xc00d36d1) ++#define MF_E_REVERSE_UNSUPPORTED _HRESULT_TYPEDEF_(0xc00d36d2) ++#define MF_E_UNSUPPORTED_RATE_TRANSITION _HRESULT_TYPEDEF_(0xc00d36d3) ++#define MF_E_RATE_CHANGE_PREEMPTED _HRESULT_TYPEDEF_(0xc00d36d4) ++#define MF_E_NOT_FOUND _HRESULT_TYPEDEF_(0xc00d36d5) ++#define MF_E_NOT_AVAILABLE _HRESULT_TYPEDEF_(0xc00d36d6) ++#define MF_E_NO_CLOCK _HRESULT_TYPEDEF_(0xc00d36d7) ++#define MF_S_MULTIPLE_BEGIN _HRESULT_TYPEDEF_(0x000d36d8) ++#define MF_E_MULTIPLE_BEGIN _HRESULT_TYPEDEF_(0xc00d36d9) ++#define MF_E_MULTIPLE_SUBSCRIBERS _HRESULT_TYPEDEF_(0xc00d36da) ++#define MF_E_TIMER_ORPHANED _HRESULT_TYPEDEF_(0xc00d36db) ++#define MF_E_STATE_TRANSITION_PENDING _HRESULT_TYPEDEF_(0xc00d36dc) ++#define MF_E_UNSUPPORTED_STATE_TRANSITION _HRESULT_TYPEDEF_(0xc00d36dd) ++#define MF_E_UNRECOVERABLE_ERROR_OCCURRED _HRESULT_TYPEDEF_(0xc00d36de) ++#define MF_E_SAMPLE_HAS_TOO_MANY_BUFFERS _HRESULT_TYPEDEF_(0xc00d36df) ++#define MF_E_SAMPLE_NOT_WRITABLE _HRESULT_TYPEDEF_(0xc00d36e0) ++#define MF_E_INVALID_KEY _HRESULT_TYPEDEF_(0xc00d36e2) ++#define MF_E_BAD_STARTUP_VERSION _HRESULT_TYPEDEF_(0xc00d36e3) ++#define MF_E_UNSUPPORTED_CAPTION _HRESULT_TYPEDEF_(0xc00d36e4) ++#define MF_E_INVALID_POSITION _HRESULT_TYPEDEF_(0xc00d36e5) ++#define MF_E_ATTRIBUTENOTFOUND _HRESULT_TYPEDEF_(0xc00d36e6) ++#define MF_E_PROPERTY_TYPE_NOT_ALLOWED _HRESULT_TYPEDEF_(0xc00d36e7) ++ ++#define MF_E_TOPO_INVALID_OPTIONAL_NODE _HRESULT_TYPEDEF_(0xc00d520e) ++#define MF_E_TOPO_CANNOT_FIND_DECRYPTOR _HRESULT_TYPEDEF_(0xc00d5211) ++#define MF_E_TOPO_CODEC_NOT_FOUND _HRESULT_TYPEDEF_(0xc00d5212) ++#define MF_E_TOPO_CANNOT_CONNECT _HRESULT_TYPEDEF_(0xc00d5213) ++#define MF_E_TOPO_UNSUPPORTED _HRESULT_TYPEDEF_(0xc00d5214) ++#define MF_E_TOPO_INVALID_TIME_ATTRIBUTES _HRESULT_TYPEDEF_(0xc00d5215) ++#define MF_E_TOPO_LOOPS_IN_TOPOLOGY _HRESULT_TYPEDEF_(0xC00d5216) ++#define MF_E_TOPO_MISSING_PRESENTATION_DESCRIPTOR _HRESULT_TYPEDEF_(0xc00d5217) ++#define MF_E_TOPO_MISSING_STREAM_DESCRIPTOR _HRESULT_TYPEDEF_(0xc00d5218) ++#define MF_E_TOPO_STREAM_DESCRIPTOR_NOT_SELECTED _HRESULT_TYPEDEF_(0xc00d5219) ++#define MF_E_TOPO_MISSING_SOURCE _HRESULT_TYPEDEF_(0xc00d521a) ++#define MF_E_TOPO_SINK_ACTIVATES_UNSUPPORTED _HRESULT_TYPEDEF_(0xc00d521b) ++ ++#endif /* __WINE_MFERROR_H */ +\ No newline at end of file +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/mfplat-Stubs/0002-mfplat-Implement-stubs-for-MFStartup-and-MFShutdown.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/mfplat-Stubs/0002-mfplat-Implement-stubs-for-MFStartup-and-MFShutdown.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/mfplat-Stubs/0002-mfplat-Implement-stubs-for-MFStartup-and-MFShutdown.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/mfplat-Stubs/0002-mfplat-Implement-stubs-for-MFStartup-and-MFShutdown.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,67 @@ +From 1070c32921c59adc3c410f8e5bfaea49d7426630 Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +Date: Fri, 12 Dec 2014 00:56:54 +0100 +Subject: mfplat: Implement stubs for MFStartup and MFShutdown. + +--- + dlls/mfplat/main.c | 23 +++++++++++++++++++++++ + dlls/mfplat/mfplat.spec | 4 ++-- + 2 files changed, 25 insertions(+), 2 deletions(-) + +diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c +index a72f634..d86df7d 100644 +--- a/dlls/mfplat/main.c ++++ b/dlls/mfplat/main.c +@@ -22,6 +22,11 @@ + + #include "windef.h" + #include "winbase.h" ++#include "mferror.h" ++ ++#include "wine/debug.h" ++ ++WINE_DEFAULT_DEBUG_CHANNEL(mfplat); + + BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) + { +@@ -36,3 +41,21 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) + + return TRUE; + } ++ ++/*********************************************************************** ++ * MFStartup (mfplat.@) ++ */ ++HRESULT WINAPI MFStartup(ULONG version, DWORD flags) ++{ ++ FIXME("(%u, %u): stub\n", version, flags); ++ return MF_E_BAD_STARTUP_VERSION; ++} ++ ++/*********************************************************************** ++ * MFShutdown (mfplat.@) ++ */ ++HRESULT WINAPI MFShutdown(void) ++{ ++ FIXME("(): stub\n"); ++ return S_OK; ++} +\ No newline at end of file +diff --git a/dlls/mfplat/mfplat.spec b/dlls/mfplat/mfplat.spec +index 98a7147..7100dfd 100644 +--- a/dlls/mfplat/mfplat.spec ++++ b/dlls/mfplat/mfplat.spec +@@ -131,8 +131,8 @@ + @ stub MFSerializeMediaTypeToStream + @ stub MFSerializePresentationDescriptor + @ stub MFSetSockaddrAny +-@ stub MFShutdown +-@ stub MFStartup ++@ stdcall MFShutdown() ++@ stdcall MFStartup(long long) + @ stub MFStreamDescriptorProtectMediaType + @ stub MFTEnum + @ stub MFTEnumEx +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/mfplat-Stubs/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/mfplat-Stubs/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/mfplat-Stubs/definition 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/mfplat-Stubs/definition 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1 @@ +Fixes: [37701] Implement stubs for mfplat.MFStartup and MFShutdown diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/Miscellaneous/0005-wordpad-Check-for-array-index-before-using-it-in-reg.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/Miscellaneous/0005-wordpad-Check-for-array-index-before-using-it-in-reg.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/Miscellaneous/0005-wordpad-Check-for-array-index-before-using-it-in-reg.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/Miscellaneous/0005-wordpad-Check-for-array-index-before-using-it-in-reg.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -From 47bc6db7c7dcb5c396b505dbb3c18263858122d9 Mon Sep 17 00:00:00 2001 -From: Gerald Pfeifer -Date: Sat, 29 Nov 2014 12:59:26 +0100 -Subject: wordpad: Check for array index before using it in - registry_set_filelist. - ---- - programs/wordpad/registry.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/programs/wordpad/registry.c b/programs/wordpad/registry.c -index 472ed4d..5b570e7 100644 ---- a/programs/wordpad/registry.c -+++ b/programs/wordpad/registry.c -@@ -293,7 +293,7 @@ void registry_set_filelist(LPCWSTR newFile, HWND hMainWnd) - - if(lstrcmpiW(newFile, pFiles[0])) - { -- for(i = 0; pFiles[i] && i < FILELIST_ENTRIES; i++) -+ for(i = 0; i < FILELIST_ENTRIES && pFiles[i]; i++) - { - if(!lstrcmpiW(pFiles[i], newFile)) - { --- -2.1.3 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/msvcrt-Spawn_Process/0001-msvcrt-Fix-passing-of-explicit-environment-to-spawn-.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/msvcrt-Spawn_Process/0001-msvcrt-Fix-passing-of-explicit-environment-to-spawn-.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/msvcrt-Spawn_Process/0001-msvcrt-Fix-passing-of-explicit-environment-to-spawn-.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/msvcrt-Spawn_Process/0001-msvcrt-Fix-passing-of-explicit-environment-to-spawn-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -From 0e2b29c185f7ce92ac81cbc94d9da9604e5fbc08 Mon Sep 17 00:00:00 2001 -From: Ron Yorston -Date: Wed, 26 Nov 2014 17:29:08 +0000 -Subject: msvcrt: Fix passing of explicit environment to spawn/exec calls - -Explicit sets of environment variables passed to spawn/exec are -consistently converted to wide character environment blocks. Because -CREATE_UNICODE_ENVIRONMENT isn't included in the process creation flags -the environment block is incorrectly passed through another conversion -to wide characters in create_process_impl. ---- - dlls/msvcrt/process.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/dlls/msvcrt/process.c b/dlls/msvcrt/process.c -index b782727..549c64a 100644 ---- a/dlls/msvcrt/process.c -+++ b/dlls/msvcrt/process.c -@@ -149,8 +149,8 @@ static MSVCRT_intptr_t msvcrt_spawn(int flags, const MSVCRT_wchar_t* exe, MSVCRT - si.cb = sizeof(si); - msvcrt_create_io_inherit_block(&si.cbReserved2, &si.lpReserved2); - if (!CreateProcessW(fullname, cmdline, NULL, NULL, TRUE, -- flags == MSVCRT__P_DETACH ? DETACHED_PROCESS : 0, -- env, NULL, &si, &pi)) -+ (flags == MSVCRT__P_DETACH ? DETACHED_PROCESS : 0) | -+ CREATE_UNICODE_ENVIRONMENT, env, NULL, &si, &pi)) - { - msvcrt_set_errno(GetLastError()); - MSVCRT_free(si.lpReserved2); --- -2.1.3 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/msvcrt-Spawn_Process/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/msvcrt-Spawn_Process/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/msvcrt-Spawn_Process/definition 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/msvcrt-Spawn_Process/definition 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -Fixes: [37635] Fix passing of unicode environment from msvcrt to CreateProcessW. diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-DllRedirects/0001-ntdll-Move-logic-to-determine-loadorder-HKCU-app-key.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-DllRedirects/0001-ntdll-Move-logic-to-determine-loadorder-HKCU-app-key.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-DllRedirects/0001-ntdll-Move-logic-to-determine-loadorder-HKCU-app-key.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-DllRedirects/0001-ntdll-Move-logic-to-determine-loadorder-HKCU-app-key.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,146 @@ +From 13b6ccee7fb76c5eb81b7e02afe25b58553cfebf Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michael=20M=C3=BCller?= +Date: Sat, 13 Dec 2014 02:14:30 +0100 +Subject: ntdll: Move logic to determine loadorder HKCU/app key into separate + functions. + +--- + dlls/ntdll/loadorder.c | 104 +++++++++++++++++++++++++++---------------------- + 1 file changed, 58 insertions(+), 46 deletions(-) + +diff --git a/dlls/ntdll/loadorder.c b/dlls/ntdll/loadorder.c +index 401d256..d45a85f 100644 +--- a/dlls/ntdll/loadorder.c ++++ b/dlls/ntdll/loadorder.c +@@ -290,6 +290,60 @@ static inline enum loadorder get_env_load_order( const WCHAR *module ) + + + /*************************************************************************** ++ * open_user_reg_key ++ * ++ * Return a handle to a registry key under HKCU. ++ */ ++static HANDLE open_user_reg_key(const WCHAR *key_name) ++{ ++ HANDLE hkey, root; ++ OBJECT_ATTRIBUTES attr; ++ UNICODE_STRING nameW; ++ ++ RtlOpenCurrentUser( KEY_ALL_ACCESS, &root ); ++ attr.Length = sizeof(attr); ++ attr.RootDirectory = root; ++ attr.ObjectName = &nameW; ++ attr.Attributes = 0; ++ attr.SecurityDescriptor = NULL; ++ attr.SecurityQualityOfService = NULL; ++ RtlInitUnicodeString( &nameW, key_name ); ++ ++ if (NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr )) hkey = 0; ++ NtClose( root ); ++ ++ return hkey; ++} ++ ++ ++/*************************************************************************** ++ * open_app_reg_key ++ * ++ * Return a handle to an app-specific registry key. ++ */ ++static HANDLE open_app_reg_key( const WCHAR *sub_key, const WCHAR *app_name ) ++{ ++ static const WCHAR AppDefaultsW[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\', ++ 'A','p','p','D','e','f','a','u','l','t','s','\\',0}; ++ WCHAR *str; ++ HANDLE hkey; ++ ++ str = RtlAllocateHeap( GetProcessHeap(), 0, ++ sizeof(AppDefaultsW) + ++ strlenW(sub_key) * sizeof(WCHAR) + ++ strlenW(app_name) * sizeof(WCHAR) ); ++ if (!str) return 0; ++ strcpyW( str, AppDefaultsW ); ++ strcatW( str, app_name ); ++ strcatW( str, sub_key ); ++ ++ hkey = open_user_reg_key( str ); ++ RtlFreeHeap( GetProcessHeap(), 0, str ); ++ return hkey; ++} ++ ++ ++/*************************************************************************** + * get_standard_key + * + * Return a handle to the standard DllOverrides registry section. +@@ -301,24 +355,8 @@ static HANDLE get_standard_key(void) + static HANDLE std_key = (HANDLE)-1; + + if (std_key == (HANDLE)-1) +- { +- OBJECT_ATTRIBUTES attr; +- UNICODE_STRING nameW; +- HANDLE root; +- +- RtlOpenCurrentUser( KEY_ALL_ACCESS, &root ); +- attr.Length = sizeof(attr); +- attr.RootDirectory = root; +- attr.ObjectName = &nameW; +- attr.Attributes = 0; +- attr.SecurityDescriptor = NULL; +- attr.SecurityQualityOfService = NULL; +- RtlInitUnicodeString( &nameW, DllOverridesW ); +- +- /* @@ Wine registry key: HKCU\Software\Wine\DllOverrides */ +- if (NtOpenKey( &std_key, KEY_ALL_ACCESS, &attr )) std_key = 0; +- NtClose( root ); +- } ++ std_key = open_user_reg_key( DllOverridesW ); ++ + return std_key; + } + +@@ -330,38 +368,12 @@ static HANDLE get_standard_key(void) + */ + static HANDLE get_app_key( const WCHAR *app_name ) + { +- OBJECT_ATTRIBUTES attr; +- UNICODE_STRING nameW; +- HANDLE root; +- WCHAR *str; +- static const WCHAR AppDefaultsW[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\', +- 'A','p','p','D','e','f','a','u','l','t','s','\\',0}; + static const WCHAR DllOverridesW[] = {'\\','D','l','l','O','v','e','r','r','i','d','e','s',0}; + static HANDLE app_key = (HANDLE)-1; + +- if (app_key != (HANDLE)-1) return app_key; ++ if (app_key == (HANDLE)-1) ++ app_key = open_app_reg_key( DllOverridesW, app_name ); + +- str = RtlAllocateHeap( GetProcessHeap(), 0, +- sizeof(AppDefaultsW) + sizeof(DllOverridesW) + +- strlenW(app_name) * sizeof(WCHAR) ); +- if (!str) return 0; +- strcpyW( str, AppDefaultsW ); +- strcatW( str, app_name ); +- strcatW( str, DllOverridesW ); +- +- RtlOpenCurrentUser( KEY_ALL_ACCESS, &root ); +- attr.Length = sizeof(attr); +- attr.RootDirectory = root; +- attr.ObjectName = &nameW; +- attr.Attributes = 0; +- attr.SecurityDescriptor = NULL; +- attr.SecurityQualityOfService = NULL; +- RtlInitUnicodeString( &nameW, str ); +- +- /* @@ Wine registry key: HKCU\Software\Wine\AppDefaults\app.exe\DllOverrides */ +- if (NtOpenKey( &app_key, KEY_ALL_ACCESS, &attr )) app_key = 0; +- NtClose( root ); +- RtlFreeHeap( GetProcessHeap(), 0, str ); + return app_key; + } + +-- +1.9.1 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-DllRedirects/0002-ntdll-Move-logic-to-read-loadorder-registry-values-i.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-DllRedirects/0002-ntdll-Move-logic-to-read-loadorder-registry-values-i.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-DllRedirects/0002-ntdll-Move-logic-to-read-loadorder-registry-values-i.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-DllRedirects/0002-ntdll-Move-logic-to-read-loadorder-registry-values-i.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,85 @@ +From 659b7d1dce76b50a488472fd8fc53b1f4e9b48ce Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michael=20M=C3=BCller?= +Date: Sat, 13 Dec 2014 02:32:51 +0100 +Subject: ntdll: Move logic to read loadorder registry values into separate + function. + +--- + dlls/ntdll/loadorder.c | 40 ++++++++++++++++++++++++++++------------ + 1 file changed, 28 insertions(+), 12 deletions(-) + +diff --git a/dlls/ntdll/loadorder.c b/dlls/ntdll/loadorder.c +index d45a85f..8250692 100644 +--- a/dlls/ntdll/loadorder.c ++++ b/dlls/ntdll/loadorder.c +@@ -379,25 +379,41 @@ static HANDLE get_app_key( const WCHAR *app_name ) + + + /*************************************************************************** +- * get_registry_value ++ * get_registry_string + * +- * Load the registry loadorder value for a given module. ++ * Load a registry string for a given module. + */ +-static enum loadorder get_registry_value( HANDLE hkey, const WCHAR *module ) ++static WCHAR* get_registry_string( HANDLE hkey, const WCHAR *module, BYTE *buffer, ++ ULONG size ) + { + UNICODE_STRING valueW; +- char buffer[80]; + DWORD count; ++ WCHAR *ret = NULL; + + RtlInitUnicodeString( &valueW, module ); +- +- if (!NtQueryValueKey( hkey, &valueW, KeyValuePartialInformation, +- buffer, sizeof(buffer), &count )) ++ if (size >= sizeof(WCHAR) && ++ !NtQueryValueKey( hkey, &valueW, KeyValuePartialInformation, ++ buffer, size - sizeof(WCHAR), &count )) + { +- WCHAR *str = (WCHAR *)((KEY_VALUE_PARTIAL_INFORMATION *)buffer)->Data; +- return parse_load_order( str ); ++ KEY_VALUE_PARTIAL_INFORMATION *info = (void *)buffer; ++ ret = (WCHAR *)info->Data; ++ ret[info->DataLength / sizeof(WCHAR)] = 0; + } +- return LO_INVALID; ++ ++ return ret; ++} ++ ++ ++/*************************************************************************** ++ * get_registry_load_order ++ * ++ * Load the registry loadorder value for a given module. ++ */ ++static enum loadorder get_registry_load_order( HANDLE hkey, const WCHAR *module ) ++{ ++ BYTE buffer[81]; ++ WCHAR *str = get_registry_string( hkey, module, buffer, sizeof(buffer) ); ++ return str ? parse_load_order( str ) : LO_INVALID; + } + + +@@ -419,13 +435,13 @@ static enum loadorder get_load_order_value( HANDLE std_key, HANDLE app_key, cons + return ret; + } + +- if (app_key && ((ret = get_registry_value( app_key, module )) != LO_INVALID)) ++ if (app_key && ((ret = get_registry_load_order( app_key, module )) != LO_INVALID)) + { + TRACE( "got app defaults %s for %s\n", debugstr_loadorder(ret), debugstr_w(module) ); + return ret; + } + +- if (std_key && ((ret = get_registry_value( std_key, module )) != LO_INVALID)) ++ if (std_key && ((ret = get_registry_load_order( std_key, module )) != LO_INVALID)) + { + TRACE( "got standard key %s for %s\n", debugstr_loadorder(ret), debugstr_w(module) ); + return ret; +-- +1.9.1 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-DllRedirects/0003-ntdll-Move-code-to-determine-module-basename-into-se.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-DllRedirects/0003-ntdll-Move-code-to-determine-module-basename-into-se.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-DllRedirects/0003-ntdll-Move-code-to-determine-module-basename-into-se.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-DllRedirects/0003-ntdll-Move-code-to-determine-module-basename-into-se.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,87 @@ +From 219c4257ae314f8e2abe1e1567232336cdbbbdb4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michael=20M=C3=BCller?= +Date: Sat, 13 Dec 2014 02:57:41 +0100 +Subject: ntdll: Move code to determine module basename into separate function. + +--- + dlls/ntdll/loadorder.c | 48 ++++++++++++++++++++++++++++++++---------------- + 1 file changed, 32 insertions(+), 16 deletions(-) + +diff --git a/dlls/ntdll/loadorder.c b/dlls/ntdll/loadorder.c +index 8250692..fbaa2d6 100644 +--- a/dlls/ntdll/loadorder.c ++++ b/dlls/ntdll/loadorder.c +@@ -452,25 +452,17 @@ static enum loadorder get_load_order_value( HANDLE std_key, HANDLE app_key, cons + + + /*************************************************************************** +- * get_load_order (internal) ++ * get_module_basename + * +- * Return the loadorder of a module. +- * The system directory and '.dll' extension is stripped from the path. ++ * Determine the module basename. The caller is responsible for releasing ++ * the memory. + */ +-enum loadorder get_load_order( const WCHAR *app_name, const WCHAR *path ) ++static WCHAR* get_module_basename( const WCHAR *path, WCHAR **basename ) + { +- enum loadorder ret = LO_INVALID; +- HANDLE std_key, app_key = 0; +- WCHAR *module, *basename; + UNICODE_STRING path_str; ++ WCHAR *module; + int len; + +- if (!init_done) init_load_order(); +- std_key = get_standard_key(); +- if (app_name) app_key = get_app_key( app_name ); +- +- TRACE("looking for %s\n", debugstr_w(path)); +- + /* Strip path information if the module resides in the system directory + */ + RtlInitUnicodeString( &path_str, path ); +@@ -481,12 +473,36 @@ enum loadorder get_load_order( const WCHAR *app_name, const WCHAR *path ) + if (!strchrW( p, '\\' ) && !strchrW( p, '/' )) path = p; + } + +- if (!(len = strlenW(path))) return ret; +- if (!(module = RtlAllocateHeap( GetProcessHeap(), 0, (len + 2) * sizeof(WCHAR) ))) return ret; ++ if (!(len = strlenW(path))) return NULL; ++ if (!(module = RtlAllocateHeap( GetProcessHeap(), 0, (len + 2) * sizeof(WCHAR) ))) return NULL; + strcpyW( module+1, path ); /* reserve module[0] for the wildcard char */ +- basename = (WCHAR *)get_basename( module+1 ); ++ *basename = (WCHAR *)get_basename( module+1 ); + + if (len >= 4) remove_dll_ext( module + 1 + len - 4 ); ++ return module; ++} ++ ++ ++/*************************************************************************** ++ * get_load_order (internal) ++ * ++ * Return the loadorder of a module. ++ * The system directory and '.dll' extension is stripped from the path. ++ */ ++enum loadorder get_load_order( const WCHAR *app_name, const WCHAR *path ) ++{ ++ enum loadorder ret = LO_INVALID; ++ HANDLE std_key, app_key = 0; ++ WCHAR *module, *basename; ++ ++ if (!init_done) init_load_order(); ++ std_key = get_standard_key(); ++ if (app_name) app_key = get_app_key( app_name ); ++ ++ TRACE("looking for %s\n", debugstr_w(path)); ++ ++ if (!(module = get_module_basename(path, &basename))) ++ return ret; + + /* first explicit module name */ + if ((ret = get_load_order_value( std_key, app_key, module+1 )) != LO_INVALID) +-- +1.9.1 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-DllRedirects/0004-ntdll-Implement-get_redirect-function.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-DllRedirects/0004-ntdll-Implement-get_redirect-function.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-DllRedirects/0004-ntdll-Implement-get_redirect-function.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-DllRedirects/0004-ntdll-Implement-get_redirect-function.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,195 @@ +From 61fb04be5f07b22582095cbf7ed0f16408eeac53 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michael=20M=C3=BCller?= +Date: Sat, 13 Dec 2014 03:18:35 +0100 +Subject: ntdll: Implement get_redirect function. + +--- + dlls/ntdll/loadorder.c | 120 +++++++++++++++++++++++++++++++++++++++++++++--- + dlls/ntdll/ntdll_misc.h | 1 + + 2 files changed, 114 insertions(+), 7 deletions(-) + +diff --git a/dlls/ntdll/loadorder.c b/dlls/ntdll/loadorder.c +index fbaa2d6..c7c4592 100644 +--- a/dlls/ntdll/loadorder.c ++++ b/dlls/ntdll/loadorder.c +@@ -344,11 +344,11 @@ static HANDLE open_app_reg_key( const WCHAR *sub_key, const WCHAR *app_name ) + + + /*************************************************************************** +- * get_standard_key ++ * get_override_standard_key + * + * Return a handle to the standard DllOverrides registry section. + */ +-static HANDLE get_standard_key(void) ++static HANDLE get_override_standard_key(void) + { + static const WCHAR DllOverridesW[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\', + 'D','l','l','O','v','e','r','r','i','d','e','s',0}; +@@ -362,11 +362,11 @@ static HANDLE get_standard_key(void) + + + /*************************************************************************** +- * get_app_key ++ * get_override_app_key + * + * Get the registry key for the app-specific DllOverrides list. + */ +-static HANDLE get_app_key( const WCHAR *app_name ) ++static HANDLE get_override_app_key( const WCHAR *app_name ) + { + static const WCHAR DllOverridesW[] = {'\\','D','l','l','O','v','e','r','r','i','d','e','s',0}; + static HANDLE app_key = (HANDLE)-1; +@@ -379,6 +379,41 @@ static HANDLE get_app_key( const WCHAR *app_name ) + + + /*************************************************************************** ++ * get_redirect_standard_key ++ * ++ * Return a handle to the standard DllRedirects registry section. ++ */ ++static HANDLE get_redirect_standard_key(void) ++{ ++ static const WCHAR DllRedirectsW[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\', ++ 'D','l','l','R','e','d','i','r','e','c','t','s',0}; ++ static HANDLE std_key = (HANDLE)-1; ++ ++ if (std_key == (HANDLE)-1) ++ std_key = open_user_reg_key( DllRedirectsW ); ++ ++ return std_key; ++} ++ ++ ++/*************************************************************************** ++ * get_redirect_app_key ++ * ++ * Get the registry key for the app-specific DllRedirects list. ++ */ ++static HANDLE get_redirect_app_key( const WCHAR *app_name ) ++{ ++ static const WCHAR DllRedirectsW[] = {'\\','D','l','l','R','e','d','i','r','e','c','t','s',0}; ++ static HANDLE app_key = (HANDLE)-1; ++ ++ if (app_key == (HANDLE)-1) ++ app_key = open_app_reg_key( DllRedirectsW, app_name ); ++ ++ return app_key; ++} ++ ++ ++/*************************************************************************** + * get_registry_string + * + * Load a registry string for a given module. +@@ -452,6 +487,34 @@ static enum loadorder get_load_order_value( HANDLE std_key, HANDLE app_key, cons + + + /*************************************************************************** ++ * get_redirect_value ++ * ++ * Get the redirect value for the exact specified module string, looking in: ++ * 1. The per-application DllRedirects key ++ * 2. The standard DllRedirects key ++ */ ++static WCHAR* get_redirect_value( HANDLE std_key, HANDLE app_key, const WCHAR *module, ++ BYTE *buffer, ULONG size ) ++{ ++ WCHAR *ret = NULL; ++ ++ if (app_key && (ret = get_registry_string( app_key, module, buffer, size ))) ++ { ++ TRACE( "got app defaults %s for %s\n", debugstr_w(ret), debugstr_w(module) ); ++ return ret; ++ } ++ ++ if (std_key && (ret = get_registry_string( std_key, module, buffer, size ))) ++ { ++ TRACE( "got standard key %s for %s\n", debugstr_w(ret), debugstr_w(module) ); ++ return ret; ++ } ++ ++ return ret; ++} ++ ++ ++/*************************************************************************** + * get_module_basename + * + * Determine the module basename. The caller is responsible for releasing +@@ -496,10 +559,10 @@ enum loadorder get_load_order( const WCHAR *app_name, const WCHAR *path ) + WCHAR *module, *basename; + + if (!init_done) init_load_order(); +- std_key = get_standard_key(); +- if (app_name) app_key = get_app_key( app_name ); ++ std_key = get_override_standard_key(); ++ if (app_name) app_key = get_override_app_key( app_name ); + +- TRACE("looking for %s\n", debugstr_w(path)); ++ TRACE("looking up loadorder for %s\n", debugstr_w(path)); + + if (!(module = get_module_basename(path, &basename))) + return ret; +@@ -533,3 +596,46 @@ enum loadorder get_load_order( const WCHAR *app_name, const WCHAR *path ) + RtlFreeHeap( GetProcessHeap(), 0, module ); + return ret; + } ++ ++ ++/*************************************************************************** ++ * get_redirect (internal) ++ * ++ * Return the redirect value of a module. ++ * The system directory and '.dll' extension is stripped from the path. ++ */ ++WCHAR* get_redirect( const WCHAR *app_name, const WCHAR *path, BYTE *buffer, ULONG size ) ++{ ++ WCHAR *ret = NULL; ++ HANDLE std_key, app_key = 0; ++ WCHAR *module, *basename; ++ ++ std_key = get_redirect_standard_key(); ++ if (app_name) app_key = get_redirect_app_key( app_name ); ++ ++ TRACE("looking up redirection for %s\n", debugstr_w(path)); ++ ++ if (!(module = get_module_basename(path, &basename))) ++ return ret; ++ ++ /* first explicit module name */ ++ if ((ret = get_redirect_value( std_key, app_key, module+1, buffer, size ))) ++ goto done; ++ ++ /* then module basename preceded by '*' */ ++ basename[-1] = '*'; ++ if ((ret = get_redirect_value( std_key, app_key, basename-1, buffer, size ))) ++ goto done; ++ ++ /* then module basename without '*' (only if explicit path) */ ++ if (basename != module+1 && (ret = get_redirect_value( std_key, app_key, basename, buffer, size ))) ++ goto done; ++ ++ /* and last the hard-coded default */ ++ ret = NULL; ++ TRACE( "no redirection found for %s\n", debugstr_w(path) ); ++ ++ done: ++ RtlFreeHeap( GetProcessHeap(), 0, module ); ++ return ret; ++} +diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h +index aac9320..aa2e660 100644 +--- a/dlls/ntdll/ntdll_misc.h ++++ b/dlls/ntdll/ntdll_misc.h +@@ -202,6 +202,7 @@ enum loadorder + }; + + extern enum loadorder get_load_order( const WCHAR *app_name, const WCHAR *path ) DECLSPEC_HIDDEN; ++extern WCHAR* get_redirect( const WCHAR *app_name, const WCHAR *path, BYTE *buffer, ULONG size ) DECLSPEC_HIDDEN; + + struct debug_info + { +-- +1.9.1 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-DllRedirects/0005-ntdll-Implement-loader-redirection-scheme.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-DllRedirects/0005-ntdll-Implement-loader-redirection-scheme.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-DllRedirects/0005-ntdll-Implement-loader-redirection-scheme.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-DllRedirects/0005-ntdll-Implement-loader-redirection-scheme.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,225 @@ +From ea4f613ec5b7e4cdc5cb9d850f66c194af9eb5e6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michael=20M=C3=BCller?= +Date: Sat, 13 Dec 2014 05:34:48 +0100 +Subject: ntdll: Implement loader redirection scheme. + +--- + dlls/ntdll/loader.c | 66 +++++++++++++++++++++++++++++++++++------------------ + 1 file changed, 44 insertions(+), 22 deletions(-) + +diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c +index e1444d2..c392f72 100644 +--- a/dlls/ntdll/loader.c ++++ b/dlls/ntdll/loader.c +@@ -87,6 +87,7 @@ struct builtin_load_info + { + const WCHAR *load_path; + const WCHAR *filename; ++ const WCHAR *fakemodule; + NTSTATUS status; + WINE_MODREF *wm; + }; +@@ -112,7 +113,8 @@ static WINE_MODREF *cached_modref; + static WINE_MODREF *current_modref; + static WINE_MODREF *last_failed_modref; + +-static NTSTATUS load_dll( LPCWSTR load_path, LPCWSTR libname, DWORD flags, WINE_MODREF** pwm ); ++static NTSTATUS load_dll( LPCWSTR load_path, LPCWSTR libname, LPCWSTR fakemodule, ++ DWORD flags, WINE_MODREF** pwm ); + static NTSTATUS process_attach( WINE_MODREF *wm, LPVOID lpReserved ); + static FARPROC find_ordinal_export( HMODULE module, const IMAGE_EXPORT_DIRECTORY *exports, + DWORD exp_size, DWORD ordinal, LPCWSTR load_path ); +@@ -438,7 +440,7 @@ static FARPROC find_forwarded_export( HMODULE module, const char *forward, LPCWS + if (!(wm = find_basename_module( mod_name ))) + { + TRACE( "delay loading %s for '%s'\n", debugstr_w(mod_name), forward ); +- if (load_dll( load_path, mod_name, 0, &wm ) == STATUS_SUCCESS && ++ if (load_dll( load_path, mod_name, NULL, 0, &wm ) == STATUS_SUCCESS && + !(wm->ldr.Flags & LDR_DONT_RESOLVE_REFS)) + { + if (process_attach( wm, NULL ) != STATUS_SUCCESS) +@@ -587,7 +589,7 @@ static WINE_MODREF *import_dll( HMODULE module, const IMAGE_IMPORT_DESCRIPTOR *d + { + ascii_to_unicode( buffer, name, len ); + buffer[len] = 0; +- status = load_dll( load_path, buffer, 0, &wmImp ); ++ status = load_dll( load_path, buffer, NULL, 0, &wmImp ); + } + else /* need to allocate a larger buffer */ + { +@@ -595,7 +597,7 @@ static WINE_MODREF *import_dll( HMODULE module, const IMAGE_IMPORT_DESCRIPTOR *d + if (!ptr) return NULL; + ascii_to_unicode( ptr, name, len ); + ptr[len] = 0; +- status = load_dll( load_path, ptr, 0, &wmImp ); ++ status = load_dll( load_path, ptr, NULL, 0, &wmImp ); + RtlFreeHeap( GetProcessHeap(), 0, ptr ); + } + +@@ -906,7 +908,7 @@ static NTSTATUS fixup_imports( WINE_MODREF *wm, LPCWSTR load_path ) + * Allocate a WINE_MODREF structure and add it to the process list + * The loader_section must be locked while calling this function. + */ +-static WINE_MODREF *alloc_module( HMODULE hModule, LPCWSTR filename ) ++static WINE_MODREF *alloc_module( HMODULE hModule, LPCWSTR filename, LPCWSTR fakemodule ) + { + WINE_MODREF *wm; + const WCHAR *p; +@@ -929,7 +931,7 @@ static WINE_MODREF *alloc_module( HMODULE hModule, LPCWSTR filename ) + wm->ldr.TimeDateStamp = 0; + wm->ldr.ActivationContext = 0; + +- RtlCreateUnicodeString( &wm->ldr.FullDllName, filename ); ++ RtlCreateUnicodeString( &wm->ldr.FullDllName, fakemodule ? fakemodule : filename ); + if ((p = strrchrW( wm->ldr.FullDllName.Buffer, '\\' ))) p++; + else p = wm->ldr.FullDllName.Buffer; + RtlInitUnicodeString( &wm->ldr.BaseDllName, p ); +@@ -1546,7 +1548,7 @@ static void load_builtin_callback( void *module, const char *filename ) + return; + } + +- wm = alloc_module( module, fullname ); ++ wm = alloc_module( module, fullname, builtin_load_info->fakemodule ); + RtlFreeHeap( GetProcessHeap(), 0, fullname ); + if (!wm) + { +@@ -1602,8 +1604,8 @@ static void load_builtin_callback( void *module, const char *filename ) + /****************************************************************************** + * load_native_dll (internal) + */ +-static NTSTATUS load_native_dll( LPCWSTR load_path, LPCWSTR name, HANDLE file, +- DWORD flags, WINE_MODREF** pwm ) ++static NTSTATUS load_native_dll( LPCWSTR load_path, LPCWSTR name, LPCWSTR fakemodule, ++ HANDLE file, DWORD flags, WINE_MODREF** pwm ) + { + void *module; + HANDLE mapping; +@@ -1627,7 +1629,7 @@ static NTSTATUS load_native_dll( LPCWSTR load_path, LPCWSTR name, HANDLE file, + + /* create the MODREF */ + +- if (!(wm = alloc_module( module, name ))) ++ if (!(wm = alloc_module( module, name, fakemodule ))) + { + status = STATUS_NO_MEMORY; + goto done; +@@ -1689,8 +1691,8 @@ done: + /*********************************************************************** + * load_builtin_dll + */ +-static NTSTATUS load_builtin_dll( LPCWSTR load_path, LPCWSTR path, HANDLE file, +- DWORD flags, WINE_MODREF** pwm ) ++static NTSTATUS load_builtin_dll( LPCWSTR load_path, LPCWSTR path, LPCWSTR fakemodule, ++ HANDLE file, DWORD flags, WINE_MODREF** pwm ) + { + char error[256], dllname[MAX_PATH]; + const WCHAR *name, *p; +@@ -1710,6 +1712,7 @@ static NTSTATUS load_builtin_dll( LPCWSTR load_path, LPCWSTR path, HANDLE file, + */ + info.load_path = load_path; + info.filename = NULL; ++ info.fakemodule = fakemodule; + info.status = STATUS_SUCCESS; + info.wm = NULL; + +@@ -2028,14 +2031,14 @@ overflow: + return STATUS_BUFFER_TOO_SMALL; + } + +- + /*********************************************************************** + * load_dll (internal) + * + * Load a PE style module according to the load order. + * The loader_section must be locked while calling this function. + */ +-static NTSTATUS load_dll( LPCWSTR load_path, LPCWSTR libname, DWORD flags, WINE_MODREF** pwm ) ++static NTSTATUS load_dll( LPCWSTR load_path, LPCWSTR libname, LPCWSTR fakemodule, ++ DWORD flags, WINE_MODREF** pwm ) + { + enum loadorder loadorder; + WCHAR buffer[32]; +@@ -2072,6 +2075,25 @@ static NTSTATUS load_dll( LPCWSTR load_path, LPCWSTR libname, DWORD flags, WINE_ + } + + main_exe = get_modref( NtCurrentTeb()->Peb->ImageBaseAddress ); ++ ++ /* handle dll redirection */ ++ if (!fakemodule) ++ { ++ BYTE buffer2[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + MAX_PATH * sizeof(WCHAR)]; ++ WCHAR *redirect = get_redirect( main_exe ? main_exe->ldr.BaseDllName.Buffer : NULL, ++ filename, buffer2, sizeof(buffer2) ); ++ if (redirect) ++ { ++ FIXME("Loader redirect from %s to %s\n", debugstr_w(libname), debugstr_w(redirect)); ++ ++ nts = load_dll( load_path, redirect, filename, flags, pwm ); ++ ++ if (handle) NtClose( handle ); ++ if (filename != buffer) RtlFreeHeap( GetProcessHeap(), 0, filename ); ++ return nts; ++ } ++ } ++ + loadorder = get_load_order( main_exe ? main_exe->ldr.BaseDllName.Buffer : NULL, filename ); + + if (handle && is_fake_dll( handle )) +@@ -2094,22 +2116,22 @@ static NTSTATUS load_dll( LPCWSTR load_path, LPCWSTR libname, DWORD flags, WINE_ + if (!handle) nts = STATUS_DLL_NOT_FOUND; + else + { +- nts = load_native_dll( load_path, filename, handle, flags, pwm ); ++ nts = load_native_dll( load_path, filename, fakemodule, handle, flags, pwm ); + if (nts == STATUS_INVALID_IMAGE_NOT_MZ) + /* not in PE format, maybe it's a builtin */ +- nts = load_builtin_dll( load_path, filename, handle, flags, pwm ); ++ nts = load_builtin_dll( load_path, filename, fakemodule, handle, flags, pwm ); + } + if (nts == STATUS_DLL_NOT_FOUND && loadorder == LO_NATIVE_BUILTIN) +- nts = load_builtin_dll( load_path, filename, 0, flags, pwm ); ++ nts = load_builtin_dll( load_path, filename, fakemodule, 0, flags, pwm ); + break; + case LO_BUILTIN: + case LO_BUILTIN_NATIVE: + case LO_DEFAULT: /* default is builtin,native */ +- nts = load_builtin_dll( load_path, filename, handle, flags, pwm ); ++ nts = load_builtin_dll( load_path, filename, fakemodule, handle, flags, pwm ); + if (!handle) break; /* nothing else we can try */ + /* file is not a builtin library, try without using the specified file */ + if (nts != STATUS_SUCCESS) +- nts = load_builtin_dll( load_path, filename, 0, flags, pwm ); ++ nts = load_builtin_dll( load_path, filename, fakemodule, 0, flags, pwm ); + if (nts == STATUS_SUCCESS && loadorder == LO_DEFAULT && + (MODULE_InitDLL( *pwm, DLL_WINE_PREATTACH, NULL ) != STATUS_SUCCESS)) + { +@@ -2119,7 +2141,7 @@ static NTSTATUS load_dll( LPCWSTR load_path, LPCWSTR libname, DWORD flags, WINE_ + nts = STATUS_DLL_NOT_FOUND; + } + if (nts == STATUS_DLL_NOT_FOUND && loadorder != LO_BUILTIN) +- nts = load_native_dll( load_path, filename, handle, flags, pwm ); ++ nts = load_native_dll( load_path, filename, fakemodule, handle, flags, pwm ); + break; + } + +@@ -2152,7 +2174,7 @@ NTSTATUS WINAPI DECLSPEC_HOTPATCH LdrLoadDll(LPCWSTR path_name, DWORD flags, + RtlEnterCriticalSection( &loader_section ); + + if (!path_name) path_name = NtCurrentTeb()->Peb->ProcessParameters->DllPath.Buffer; +- nts = load_dll( path_name, libname->Buffer, flags, &wm ); ++ nts = load_dll( path_name, libname->Buffer, NULL, flags, &wm ); + + if (nts == STATUS_SUCCESS && !(wm->ldr.Flags & LDR_DONT_RESOLVE_REFS)) + { +@@ -3115,7 +3137,7 @@ void __wine_process_init(void) + /* setup the load callback and create ntdll modref */ + wine_dll_set_callback( load_builtin_callback ); + +- if ((status = load_builtin_dll( NULL, kernel32W, 0, 0, &wm )) != STATUS_SUCCESS) ++ if ((status = load_builtin_dll( NULL, kernel32W, NULL, 0, 0, &wm )) != STATUS_SUCCESS) + { + MESSAGE( "wine: could not load kernel32.dll, status %x\n", status ); + exit(1); +-- +1.9.1 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-DllRedirects/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-DllRedirects/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-DllRedirects/definition 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-DllRedirects/definition 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1 @@ +Fixes: Support for loader dll redirections diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-Junction_Points/0005-kernel32-ntdll-Add-support-for-deleting-junction-poi.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-Junction_Points/0005-kernel32-ntdll-Add-support-for-deleting-junction-poi.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-Junction_Points/0005-kernel32-ntdll-Add-support-for-deleting-junction-poi.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-Junction_Points/0005-kernel32-ntdll-Add-support-for-deleting-junction-poi.patch 2014-12-15 01:08:14.000000000 +0000 @@ -1,19 +1,19 @@ -From efdf5b9546b3c56a8f02c667755ebda2fd944bc8 Mon Sep 17 00:00:00 2001 +From b36e62b1765283f503c2ef42b10a139955949c86 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 16 Jan 2014 21:02:11 -0700 Subject: kernel32,ntdll: Add support for deleting junction points with RemoveDirectory. --- - dlls/kernel32/path.c | 18 +++++++++++++----- - dlls/ntdll/tests/file.c | 34 +++++++++++++++++++++++++++++++++- - 2 files changed, 46 insertions(+), 6 deletions(-) + dlls/kernel32/path.c | 21 ++++++++++++++------- + dlls/ntdll/tests/file.c | 34 +++++++++++++++++++++++++++++++++- + 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c -index 7e20dc3..9f083f8 100644 +index 22d21c5..63901d2 100644 --- a/dlls/kernel32/path.c +++ b/dlls/kernel32/path.c -@@ -1587,6 +1587,7 @@ BOOL WINAPI CreateDirectoryExW( LPCWSTR template, LPCWSTR path, LPSECURITY_ATTRI +@@ -1583,6 +1583,7 @@ BOOL WINAPI CreateDirectoryExW( LPCWSTR template, LPCWSTR path, LPSECURITY_ATTRI */ BOOL WINAPI RemoveDirectoryW( LPCWSTR path ) { @@ -21,10 +21,12 @@ OBJECT_ATTRIBUTES attr; UNICODE_STRING nt_name; ANSI_STRING unix_name; -@@ -1622,13 +1623,20 @@ BOOL WINAPI RemoveDirectoryW( LPCWSTR path ) - status = wine_nt_to_unix_file_name( &nt_name, &unix_name, FILE_OPEN, FALSE ); - RtlFreeUnicodeString( &nt_name ); +@@ -1616,15 +1617,21 @@ BOOL WINAPI RemoveDirectoryW( LPCWSTR path ) + } + status = wine_nt_to_unix_file_name( &nt_name, &unix_name, FILE_OPEN, FALSE ); +- RtlFreeUnicodeString( &nt_name ); +- - if (status != STATUS_SUCCESS) - SetLastError( RtlNtStatusToDosError(status) ); - else if (!(ret = (rmdir( unix_name.Buffer ) != -1))) @@ -43,6 +45,7 @@ + } + else + SetLastError( RtlNtStatusToDosError(status) ); ++ RtlFreeUnicodeString( &nt_name ); + NtClose( handle ); return ret; @@ -100,5 +103,5 @@ /* Cleanup */ pRtlFreeUnicodeString( &nameW ); -- -1.7.9.5 +1.9.1 diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-Junction_Points/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-Junction_Points/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/ntdll-Junction_Points/definition 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/ntdll-Junction_Points/definition 2014-12-15 01:08:14.000000000 +0000 @@ -1,2 +1,3 @@ Depends: ntdll-Fix_Free +Depends: ntdll-DOS_Attributes Fixes: [12401] Support for Junction Points diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/ole32-CoWaitForMultipleHandles/0001-ole32-tests-Add-additional-tests-for-CoWaitForMultip.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/ole32-CoWaitForMultipleHandles/0001-ole32-tests-Add-additional-tests-for-CoWaitForMultip.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/ole32-CoWaitForMultipleHandles/0001-ole32-tests-Add-additional-tests-for-CoWaitForMultip.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/ole32-CoWaitForMultipleHandles/0001-ole32-tests-Add-additional-tests-for-CoWaitForMultip.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,198 @@ +From d8669776edc7806f4d70adff79b86c1125e23086 Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +Date: Fri, 12 Dec 2014 01:23:06 +0100 +Subject: ole32/tests: Add additional tests for CoWaitForMultipleHandles and + WM_QUIT. + +--- + dlls/ole32/tests/compobj.c | 153 ++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 152 insertions(+), 1 deletion(-) + +diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c +index eed5ac8..187ea3d 100644 +--- a/dlls/ole32/tests/compobj.c ++++ b/dlls/ole32/tests/compobj.c +@@ -2103,6 +2103,22 @@ static DWORD CALLBACK release_semaphore_thread( LPVOID arg ) + return 0; + } + ++static DWORD CALLBACK send_message_thread(LPVOID arg) ++{ ++ HWND hWnd = arg; ++ Sleep(50); ++ SendMessageA(hWnd, WM_DDE_FIRST, 0, 0); ++ return 0; ++} ++ ++static DWORD CALLBACK post_message_thread(LPVOID arg) ++{ ++ HWND hWnd = arg; ++ Sleep(50); ++ PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); ++ return 0; ++} ++ + static void test_CoWaitForMultipleHandles(void) + { + static const char cls_name[] = "cowait_test_class"; +@@ -2183,6 +2199,32 @@ static void test_CoWaitForMultipleHandles(void) + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(!success, "CoWaitForMultipleHandles didn't pump any messages\n"); + ++ /* test PostMessageA/SendMessageA from a different thread */ ++ ++ index = 0xdeadbeef; ++ thread = CreateThread(NULL, 0, post_message_thread, hWnd, 0, &tid); ++ ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); ++ hr = CoWaitForMultipleHandles(0, 100, 2, handles, &index); ++ ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); ++ ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); ++ success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); ++ ok(!success, "CoWaitForMultipleHandles didn't pump any messages\n"); ++ index = WaitForSingleObject(thread, 200); ++ ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); ++ CloseHandle(thread); ++ ++ index = 0xdeadbeef; ++ thread = CreateThread(NULL, 0, send_message_thread, hWnd, 0, &tid); ++ ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); ++ hr = CoWaitForMultipleHandles(0, 100, 2, handles, &index); ++ ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); ++ ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); ++ success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); ++ ok(!success, "CoWaitForMultipleHandles didn't pump any messages\n"); ++ index = WaitForSingleObject(thread, 200); ++ ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); ++ CloseHandle(thread); ++ + ReleaseSemaphore(handles[0], 1, NULL); + ReleaseSemaphore(handles[1], 1, NULL); + +@@ -2264,7 +2306,7 @@ static void test_CoWaitForMultipleHandles(void) + hr = CoWaitForMultipleHandles(COWAIT_INPUTAVAILABLE, 50, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING || broken(hr == E_INVALIDARG) || broken(hr == S_OK) /* Win 8 */, + "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); +- ReleaseSemaphore(handles[1], 1, NULL); ++ if (hr != S_OK) ReleaseSemaphore(handles[1], 1, NULL); + ok(index == 0 || broken(index == 1) /* Win 8 */, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(!success || broken(success && hr == E_INVALIDARG), +@@ -2273,6 +2315,115 @@ static void test_CoWaitForMultipleHandles(void) + ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); + CloseHandle(thread); + ++ /* test behaviour of WM_QUIT (semaphores are still locked) */ ++ ++ PostMessageA(hWnd, WM_QUIT, 40, 0); ++ memset(&msg, 0, sizeof(msg)); ++ success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); ++ ok(success, "PeekMessageA failed, error %u\n", GetLastError()); ++ ok(msg.message == WM_QUIT, "expected msg.message = WM_QUIT, got %u\n", msg.message); ++ ok(msg.wParam == 40, "expected msg.wParam = 40, got %lu\n", msg.wParam); ++ success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); ++ ok(!success, "PeekMessageA succeeded\n"); ++ ++ index = 0xdeadbeef; ++ PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); ++ PostMessageA(hWnd, WM_QUIT, 41, 0); ++ thread = CreateThread(NULL, 0, post_message_thread, hWnd, 0, &tid); ++ ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); ++ hr = CoWaitForMultipleHandles(0, 100, 2, handles, &index); ++ ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); ++ ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); ++ success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); ++ todo_wine ++ ok(success || broken(!success) /* Win 2000/XP/8 */, "PeekMessageA failed, error %u\n", GetLastError()); ++ success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); ++ ok(!success, "PeekMessageA succeeded\n"); ++ memset(&msg, 0, sizeof(msg)); ++ success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); ++ todo_wine ++ ok(!success || broken(success) /* Win 2000/XP/8 */, "PeekMessageA succeeded\n"); ++ if (success) ++ { ++ ok(msg.message == WM_QUIT, "expected msg.message = WM_QUIT, got %u\n", msg.message); ++ ok(msg.wParam == 41, "expected msg.wParam = 41, got %lu\n", msg.wParam); ++ } ++ index = WaitForSingleObject(thread, 200); ++ ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); ++ CloseHandle(thread); ++ ++ index = 0xdeadbeef; ++ PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); ++ PostMessageA(hWnd, WM_QUIT, 42, 0); ++ thread = CreateThread(NULL, 0, send_message_thread, hWnd, 0, &tid); ++ ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); ++ hr = CoWaitForMultipleHandles(0, 100, 2, handles, &index); ++ ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); ++ ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); ++ success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); ++ ok(!success, "CoWaitForMultipleHandles didn't pump all WM_DDE_FIRST messages\n"); ++ memset(&msg, 0, sizeof(msg)); ++ success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); ++ ok(success, "PeekMessageA failed, error %u\n", GetLastError()); ++ ok(msg.message == WM_QUIT, "expected msg.message = WM_QUIT, got %u\n", msg.message); ++ ok(msg.wParam == 42, "expected msg.wParam = 42, got %lu\n", msg.wParam); ++ index = WaitForSingleObject(thread, 200); ++ ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); ++ CloseHandle(thread); ++ ++ PostQuitMessage(43); ++ memset(&msg, 0, sizeof(msg)); ++ success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); ++ ok(success || broken(!success) /* Win 8 */, "PeekMessageA failed, error %u\n", GetLastError()); ++ if (!success) ++ win_skip("PostQuitMessage didn't queue a WM_QUIT message, skipping tests\n"); ++ else ++ { ++ ok(msg.message == WM_QUIT, "expected msg.message = WM_QUIT, got %u\n", msg.message); ++ ok(msg.wParam == 43, "expected msg.wParam = 43, got %lu\n", msg.wParam); ++ success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); ++ ok(!success, "PeekMessageA succeeded\n"); ++ ++ index = 0xdeadbeef; ++ PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); ++ PostQuitMessage(44); ++ thread = CreateThread(NULL, 0, post_message_thread, hWnd, 0, &tid); ++ ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); ++ hr = CoWaitForMultipleHandles(0, 100, 2, handles, &index); ++ ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); ++ ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); ++ success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); ++ ok(success, "PeekMessageA failed, error %u\n", GetLastError()); ++ success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); ++ todo_wine ++ ok(!success, "PeekMessageA succeeded\n"); ++ success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); ++ todo_wine ++ ok(!success, "CoWaitForMultipleHandles didn't remove WM_QUIT messages\n"); ++ index = WaitForSingleObject(thread, 200); ++ ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); ++ CloseHandle(thread); ++ ++ index = 0xdeadbeef; ++ PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); ++ PostQuitMessage(45); ++ thread = CreateThread(NULL, 0, send_message_thread, hWnd, 0, &tid); ++ ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); ++ hr = CoWaitForMultipleHandles(0, 100, 2, handles, &index); ++ ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); ++ ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); ++ success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); ++ ok(success, "PeekMessageA failed, error %u\n", GetLastError()); ++ success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); ++ todo_wine ++ ok(!success, "PeekMessageA succeeded\n"); ++ success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); ++ ok(!success, "CoWaitForMultipleHandles didn't remove WM_QUIT messages\n"); ++ index = WaitForSingleObject(thread, 200); ++ ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); ++ CloseHandle(thread); ++ } ++ + CloseHandle(handles[0]); + CloseHandle(handles[1]); + DestroyWindow(hWnd); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/shell32-SHILCreateFromPath/0001-shell32-export-SHILCreateFromPath-by-name-too.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/shell32-SHILCreateFromPath/0001-shell32-export-SHILCreateFromPath-by-name-too.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/shell32-SHILCreateFromPath/0001-shell32-export-SHILCreateFromPath-by-name-too.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/shell32-SHILCreateFromPath/0001-shell32-export-SHILCreateFromPath-by-name-too.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,26 @@ +From 5aea6b429bdc985c59e8149d7d51fde8133e79bf Mon Sep 17 00:00:00 2001 +From: Stefan Leichter +Date: Wed, 10 Dec 2014 23:38:23 +0100 +Subject: shell32: export SHILCreateFromPath by name too + +https://bugs.winehq.org/show_bug.cgi?id=37265 +--- + dlls/shell32/shell32.spec | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec +index 0a8d448..f168ed7 100644 +--- a/dlls/shell32/shell32.spec ++++ b/dlls/shell32/shell32.spec +@@ -24,7 +24,7 @@ + 25 stdcall -ordinal ILCombine(ptr ptr) + 26 stdcall -noname ILLoadFromStream(ptr ptr) + 27 stdcall -ordinal ILSaveToStream(ptr ptr) +- 28 stdcall -noname SHILCreateFromPath(ptr ptr ptr) SHILCreateFromPathAW ++ 28 stdcall SHILCreateFromPath(ptr ptr ptr) SHILCreateFromPathAW + 29 stdcall -noname PathIsRoot(ptr) PathIsRootAW + 30 stdcall -noname PathBuildRoot(ptr long) PathBuildRootAW + 31 stdcall -noname PathFindExtension(ptr) PathFindExtensionAW +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/shell32-SHILCreateFromPath/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/shell32-SHILCreateFromPath/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/shell32-SHILCreateFromPath/definition 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/shell32-SHILCreateFromPath/definition 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1 @@ +Fixes: [37265] Provide named entry point shell32.SHILCreateFromPath for vista apps diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/shlwapi-StrCatChainW/0001-shlwapi-Add-implementation-for-StrCatChainW.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/shlwapi-StrCatChainW/0001-shlwapi-Add-implementation-for-StrCatChainW.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/shlwapi-StrCatChainW/0001-shlwapi-Add-implementation-for-StrCatChainW.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/shlwapi-StrCatChainW/0001-shlwapi-Add-implementation-for-StrCatChainW.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,233 @@ +From a850bb89ae8c415c8d7f04ba1c77b8933ca66d64 Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +Date: Sun, 7 Dec 2014 22:55:31 +0100 +Subject: shlwapi: Add implementation for StrCatChainW. + +Based on a patch by Huw Campbell. +--- + dlls/shlwapi/shlwapi.spec | 1 + + dlls/shlwapi/string.c | 41 +++++++++++++++ + dlls/shlwapi/tests/string.c | 122 ++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 164 insertions(+) + +diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec +index b7aac08..6b6ead2 100644 +--- a/dlls/shlwapi/shlwapi.spec ++++ b/dlls/shlwapi/shlwapi.spec +@@ -759,6 +759,7 @@ + @ stdcall StrCSpnW (wstr wstr) + @ stdcall StrCatBuffA (str str long) + @ stdcall StrCatBuffW (wstr wstr long) ++@ stdcall StrCatChainW (ptr long long wstr) + @ stdcall StrCatW (ptr wstr) + @ stdcall StrChrA (str long) + @ stdcall StrChrIA (str long) +diff --git a/dlls/shlwapi/string.c b/dlls/shlwapi/string.c +index 9ba6038..dfa383e 100644 +--- a/dlls/shlwapi/string.c ++++ b/dlls/shlwapi/string.c +@@ -459,6 +459,47 @@ LPWSTR WINAPI StrCatW(LPWSTR lpszStr, LPCWSTR lpszSrc) + } + + /************************************************************************* ++ * StrCatChainW [SHLWAPI.@] ++ * ++ * Concatenates two unicode strings. ++ * ++ * PARAMS ++ * lpszStr [O] Initial string ++ * cchMax [I] Length of destination buffer ++ * ichAt [I] Offset from the destination buffer to begin concatenation ++ * lpszCat [I] String to concatenate ++ * ++ * RETURNS ++ * The offset from the beginning of pszDst to the terminating NULL. ++ */ ++DWORD WINAPI StrCatChainW(LPWSTR lpszStr, DWORD cchMax, DWORD ichAt, LPCWSTR lpszCat) ++{ ++ TRACE("(%s,%i,%i,%s)\n", debugstr_w(lpszStr), cchMax, ichAt, debugstr_w(lpszCat)); ++ ++ if (ichAt == -1) ++ ichAt = strlenW(lpszStr); ++ ++ if (!cchMax) ++ return ichAt; ++ ++ if (ichAt == cchMax) ++ ichAt--; ++ ++ if (lpszCat && ichAt <= cchMax) ++ { ++ lpszStr += ichAt; ++ while (ichAt < cchMax - 1 && *lpszCat) ++ { ++ *lpszStr++ = *lpszCat++; ++ ichAt++; ++ } ++ *lpszStr = 0; ++ } ++ ++ return ichAt; ++} ++ ++/************************************************************************* + * StrCpyW [SHLWAPI.@] + * + * Copy a string to another string. +diff --git a/dlls/shlwapi/tests/string.c b/dlls/shlwapi/tests/string.c +index c72b774..ac14db0 100644 +--- a/dlls/shlwapi/tests/string.c ++++ b/dlls/shlwapi/tests/string.c +@@ -48,6 +48,7 @@ static DWORD (WINAPI *pSHAnsiToAnsi)(LPCSTR,LPSTR,int); + static DWORD (WINAPI *pSHUnicodeToUnicode)(LPCWSTR,LPWSTR,int); + static LPSTR (WINAPI *pStrCatBuffA)(LPSTR,LPCSTR,INT); + static LPWSTR (WINAPI *pStrCatBuffW)(LPWSTR,LPCWSTR,INT); ++static DWORD (WINAPI *pStrCatChainW)(LPWSTR,DWORD,DWORD,LPCWSTR); + static LPSTR (WINAPI *pStrCpyNXA)(LPSTR,LPCSTR,int); + static LPWSTR (WINAPI *pStrCpyNXW)(LPWSTR,LPCWSTR,int); + static LPSTR (WINAPI *pStrFormatByteSize64A)(LONGLONG,LPSTR,UINT); +@@ -1481,6 +1482,125 @@ static void test_StrStrNIW(void) + } + } + ++static void test_StrCatChainW(void) ++{ ++ static const WCHAR deadbeefW[] = {'D','e','A','d','B','e','E','f',0}; ++ static const WCHAR deadW[] = {'D','e','A','d',0}; ++ static const WCHAR beefW[] = {'B','e','E','f',0}; ++ ++ WCHAR buf[32 + 1]; ++ DWORD ret; ++ ++ if (!pStrCatChainW) ++ { ++ win_skip("StrCatChainW is not available\n"); ++ return; ++ } ++ ++ /* Test with NULL buffer */ ++ ret = pStrCatChainW(NULL, 0, 0, beefW); ++ ok(ret == 0, "Expected StrCatChainW to return 0, got %u\n", ret); ++ ++ /* Test with empty buffer */ ++ memset(buf, 0x11, sizeof(buf)); ++ ret = pStrCatChainW(buf, 0, 0, beefW); ++ ok(ret == 0, "Expected StrCatChainW to return 0, got %u\n", ret); ++ ok(buf[0] == 0x1111, "Expected buf[0] = 0x1111, got %x\n", buf[0]); ++ ++ memcpy(buf, deadbeefW, sizeof(deadbeefW)); ++ ret = pStrCatChainW(buf, 0, -1, beefW); ++ ok(ret == 8, "Expected StrCatChainW to return 8, got %u\n", ret); ++ ok(!memcmp(buf, deadbeefW, sizeof(deadbeefW)), "Buffer contains wrong data\n"); ++ ++ /* Append data to existing string with offset = -1 */ ++ memset(buf, 0x11, sizeof(buf)); ++ ret = pStrCatChainW(buf, 32, 0, deadW); ++ ok(ret == 4, "Expected StrCatChainW to return 4, got %u\n", ret); ++ ok(!memcmp(buf, deadW, sizeof(deadW)), "Buffer contains wrong data\n"); ++ ++ ret = pStrCatChainW(buf, 32, -1, beefW); ++ ok(ret == 8, "Expected StrCatChainW to return 8, got %u\n", ret); ++ ok(!memcmp(buf, deadbeefW, sizeof(deadbeefW)), "Buffer contains wrong data\n"); ++ ++ /* Append data at a fixed offset */ ++ memset(buf, 0x11, sizeof(buf)); ++ ret = pStrCatChainW(buf, 32, 0, deadW); ++ ok(ret == 4, "Expected StrCatChainW to return 4, got %u\n", ret); ++ ok(!memcmp(buf, deadW, sizeof(deadW)), "Buffer contains wrong data\n"); ++ ++ ret = pStrCatChainW(buf, 32, 4, beefW); ++ ok(ret == 8, "Expected StrCatChainW to return 8, got %u\n", ret); ++ ok(!memcmp(buf, deadbeefW, sizeof(deadbeefW)), "Buffer contains wrong data\n"); ++ ++ /* Buffer exactly sufficient for string + terminating null */ ++ memset(buf, 0x11, sizeof(buf)); ++ ret = pStrCatChainW(buf, 5, 0, deadW); ++ ok(ret == 4, "Expected StrCatChainW to return 4, got %u\n", ret); ++ ok(!memcmp(buf, deadW, sizeof(deadW)), "Buffer contains wrong data\n"); ++ ++ /* Buffer too small, string will be truncated */ ++ memset(buf, 0x11, sizeof(buf)); ++ ret = pStrCatChainW(buf, 4, 0, deadW); ++ if (ret == 4) ++ { ++ /* Windows 2000 and XP uses a slightly different implementation ++ * for StrCatChainW, which doesn't ensure that strings are null- ++ * terminated. Skip test if we detect such an implementation. */ ++ win_skip("Windows2000/XP behaviour detected for StrCatChainW, skipping tests\n"); ++ return; ++ } ++ ok(ret == 3, "Expected StrCatChainW to return 3, got %u\n", ret); ++ ok(!memcmp(buf, deadW, 3 * sizeof(WCHAR)), "Buffer contains wrong data\n"); ++ ok(!buf[3], "String is not nullterminated\n"); ++ ok(buf[4] == 0x1111, "Expected buf[4] = 0x1111, got %x\n", buf[4]); ++ ++ /* Overwrite part of an existing string */ ++ ret = pStrCatChainW(buf, 4, 1, beefW); ++ ok(ret == 3, "Expected StrCatChainW to return 3, got %u\n", ret); ++ ok(buf[0] == 'D', "Expected buf[0] = 'D', got %x\n", buf[0]); ++ ok(buf[1] == 'B', "Expected buf[1] = 'B', got %x\n", buf[1]); ++ ok(buf[2] == 'e', "Expected buf[2] = 'e', got %x\n", buf[2]); ++ ok(!buf[3], "String is not nullterminated\n"); ++ ok(buf[4] == 0x1111, "Expected buf[4] = 0x1111, got %x\n", buf[4]); ++ ++ /* Test appending to full buffer */ ++ memset(buf, 0x11, sizeof(buf)); ++ memcpy(buf, deadbeefW, sizeof(deadbeefW)); ++ memcpy(buf + 9, deadW, sizeof(deadW)); ++ ret = pStrCatChainW(buf, 9, 8, beefW); ++ ok(ret == 8, "Expected StrCatChainW to return 8, got %u\n", ret); ++ ok(!memcmp(buf, deadbeefW, sizeof(deadbeefW)), "Buffer contains wrong data\n"); ++ ok(!memcmp(buf + 9, deadW, sizeof(deadW)), "Buffer contains wrong data\n"); ++ ++ /* Offset points at the end of the buffer */ ++ ret = pStrCatChainW(buf, 9, 9, beefW); ++ ok(ret == 8, "Expected StrCatChainW to return 8, got %u\n", ret); ++ ok(!memcmp(buf, deadbeefW, sizeof(deadbeefW)), "Buffer contains wrong data\n"); ++ ok(!memcmp(buf + 9, deadW, sizeof(deadW)), "Buffer contains wrong data\n"); ++ ++ /* Offset points outside of the buffer */ ++ ret = pStrCatChainW(buf, 9, 10, beefW); ++ ok(ret == 10, "Expected StrCatChainW to return 10, got %u\n", ret); ++ ok(!memcmp(buf, deadbeefW, sizeof(deadbeefW)), "Buffer contains wrong data\n"); ++ ok(!memcmp(buf + 9, deadW, sizeof(deadW)), "Buffer contains wrong data\n"); ++ ++ /* The same but without nullterminated string */ ++ memcpy(buf, deadbeefW, sizeof(deadbeefW)); ++ ret = pStrCatChainW(buf, 5, -1, deadW); ++ ok(ret == 8, "Expected StrCatChainW to return 8, got %u\n", ret); ++ ok(!memcmp(buf, deadbeefW, sizeof(deadbeefW)), "Buffer contains wrong data\n"); ++ ++ ret = pStrCatChainW(buf, 5, 5, deadW); ++ ok(ret == 4, "Expected StrCatChainW to return 4, got %u\n", ret); ++ ok(!memcmp(buf, deadW, sizeof(deadW)), "Buffer contains wrong data\n"); ++ ok(buf[5] == 'e', "Expected buf[5] = 'e', got %x\n", buf[5]); ++ ++ ret = pStrCatChainW(buf, 5, 6, deadW); ++ ok(ret == 6, "Expected StrCatChainW to return 6, got %u\n", ret); ++ ok(!memcmp(buf, deadW, sizeof(deadW)), "Buffer contains wrong data\n"); ++ ok(buf[5] == 'e', "Expected buf[5] = 'e', got %x\n", buf[5]); ++} ++ + START_TEST(string) + { + HMODULE hShlwapi; +@@ -1500,6 +1620,7 @@ START_TEST(string) + pSHUnicodeToUnicode = (void *)GetProcAddress(hShlwapi, (LPSTR)346); + pStrCatBuffA = (void *)GetProcAddress(hShlwapi, "StrCatBuffA"); + pStrCatBuffW = (void *)GetProcAddress(hShlwapi, "StrCatBuffW"); ++ pStrCatChainW = (void *)GetProcAddress(hShlwapi, "StrCatChainW"); + pStrCpyNXA = (void *)GetProcAddress(hShlwapi, (LPSTR)399); + pStrCpyNXW = (void *)GetProcAddress(hShlwapi, (LPSTR)400); + pStrChrNW = (void *)GetProcAddress(hShlwapi, "StrChrNW"); +@@ -1565,6 +1686,7 @@ START_TEST(string) + test_StrStrIW(); + test_StrStrNW(); + test_StrStrNIW(); ++ test_StrCatChainW(); + + CoUninitialize(); + } +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/shlwapi-StrCatChainW/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/shlwapi-StrCatChainW/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/shlwapi-StrCatChainW/definition 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/shlwapi-StrCatChainW/definition 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1 @@ +Fixes: Support for StrCatChainW diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/urlmon-CoInternetSetFeatureEnabled/0001-urlmon-Ignore-unsupported-flags-for-CoInternetSetFea.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/urlmon-CoInternetSetFeatureEnabled/0001-urlmon-Ignore-unsupported-flags-for-CoInternetSetFea.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/urlmon-CoInternetSetFeatureEnabled/0001-urlmon-Ignore-unsupported-flags-for-CoInternetSetFea.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/urlmon-CoInternetSetFeatureEnabled/0001-urlmon-Ignore-unsupported-flags-for-CoInternetSetFea.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,28 @@ +From 15cc0b19149e0a1c811313ee1a97b82032cf41da Mon Sep 17 00:00:00 2001 +From: Bruno Jesus <00cpxxx@gmail.com> +Date: Fri, 12 Dec 2014 05:16:14 +0100 +Subject: urlmon: Ignore unsupported flags for CoInternetSetFeatureEnabled + +--- + dlls/urlmon/internet.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/dlls/urlmon/internet.c b/dlls/urlmon/internet.c +index e5d41b6..d7deccc 100644 +--- a/dlls/urlmon/internet.c ++++ b/dlls/urlmon/internet.c +@@ -536,10 +536,8 @@ static HRESULT set_internet_feature(INTERNETFEATURELIST feature, DWORD flags, BO + if(feature >= FEATURE_ENTRY_COUNT) + return E_FAIL; + +- if(flags & ~supported_flags) { ++ if(flags & ~supported_flags) + FIXME("Unsupported flags: %08x\n", flags & ~supported_flags); +- return E_NOTIMPL; +- } + + if(flags & SET_FEATURE_ON_PROCESS) + set_feature_on_process(feature, enable); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/urlmon-CoInternetSetFeatureEnabled/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/urlmon-CoInternetSetFeatureEnabled/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/urlmon-CoInternetSetFeatureEnabled/definition 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/urlmon-CoInternetSetFeatureEnabled/definition 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1 @@ +Fixes: [35197] Ignore unsupported flags for CoInternetSetFeatureEnabled diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/user32-GetRawInputDeviceList/0001-user32-Set-last-error-when-GetRawInputDeviceList-fai.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/user32-GetRawInputDeviceList/0001-user32-Set-last-error-when-GetRawInputDeviceList-fai.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/user32-GetRawInputDeviceList/0001-user32-Set-last-error-when-GetRawInputDeviceList-fai.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/user32-GetRawInputDeviceList/0001-user32-Set-last-error-when-GetRawInputDeviceList-fai.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,24 @@ +From 5d8bbfbf4bc409af8de7ad580e6cde74797c170c Mon Sep 17 00:00:00 2001 +From: Andrew Church +Date: Thu, 4 Dec 2014 14:57:46 +0100 +Subject: user32: Set last error when GetRawInputDeviceList fails. + +--- + dlls/user32/input.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/dlls/user32/input.c b/dlls/user32/input.c +index ec81e60..967b114 100644 +--- a/dlls/user32/input.c ++++ b/dlls/user32/input.c +@@ -493,6 +493,7 @@ UINT WINAPI GetRawInputDeviceList(RAWINPUTDEVICELIST *devices, UINT *device_coun + if (*device_count < 2) + { + *device_count = 2; ++ SetLastError(ERROR_INSUFFICIENT_BUFFER); + return ~0U; + } + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/user32-GetRawInputDeviceList/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/user32-GetRawInputDeviceList/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/user32-GetRawInputDeviceList/definition 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/user32-GetRawInputDeviceList/definition 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1 @@ +Fixes: [37667] Set last error when GetRawInputDeviceList fails diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/user32-ScrollWindowEx/0001-user32-Fix-return-value-of-ScrollWindowEx-for-invisi.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/user32-ScrollWindowEx/0001-user32-Fix-return-value-of-ScrollWindowEx-for-invisi.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/user32-ScrollWindowEx/0001-user32-Fix-return-value-of-ScrollWindowEx-for-invisi.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/user32-ScrollWindowEx/0001-user32-Fix-return-value-of-ScrollWindowEx-for-invisi.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,29 @@ +From 1b619dbaf833182f1b522271e980a58b057767d6 Mon Sep 17 00:00:00 2001 +From: Dmitry Timoshkov +Date: Fri, 12 Dec 2014 05:06:31 +0100 +Subject: user32: Fix return value of ScrollWindowEx for invisible windows. + +--- + dlls/user32/painting.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/dlls/user32/painting.c b/dlls/user32/painting.c +index 5c1dc69..2cc7703 100644 +--- a/dlls/user32/painting.c ++++ b/dlls/user32/painting.c +@@ -1430,10 +1430,10 @@ static INT scroll_window( HWND hwnd, INT dx, INT dy, const RECT *rect, const REC + rdw_flags = (flags & SW_ERASE) && (flags & SW_INVALIDATE) ? + RDW_INVALIDATE | RDW_ERASE : RDW_INVALIDATE ; + +- if (!WIN_IsWindowDrawable( hwnd, TRUE )) return ERROR; + hwnd = WIN_GetFullHandle( hwnd ); + +- GetClientRect(hwnd, &rc); ++ if (!WIN_IsWindowDrawable( hwnd, TRUE )) SetRectEmpty(&rc); ++ else GetClientRect(hwnd, &rc); + + if (clipRect) IntersectRect(&cliprc,&rc,clipRect); + else cliprc = rc; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/user32-ScrollWindowEx/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/user32-ScrollWindowEx/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/user32-ScrollWindowEx/definition 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/user32-ScrollWindowEx/definition 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1 @@ +Fixes: [37706] Fix return value of ScrollWindowEx for invisible windows diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/winecfg-Staging/0001-winecfg-Add-staging-tab-for-CSMT.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/winecfg-Staging/0001-winecfg-Add-staging-tab-for-CSMT.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/winecfg-Staging/0001-winecfg-Add-staging-tab-for-CSMT.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/winecfg-Staging/0001-winecfg-Add-staging-tab-for-CSMT.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,234 @@ +From 54437590d58e0181cbeac3a55cac81b32f1485de Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michael=20M=C3=BCller?= +Date: Sun, 14 Dec 2014 20:42:45 +0100 +Subject: winecfg: Add staging tab for CSMT. + +--- + programs/winecfg/Makefile.in | 1 + + programs/winecfg/main.c | 12 +++++- + programs/winecfg/resource.h | 5 +++ + programs/winecfg/staging.c | 98 ++++++++++++++++++++++++++++++++++++++++++++ + programs/winecfg/winecfg.h | 1 + + programs/winecfg/winecfg.rc | 10 +++++ + 6 files changed, 126 insertions(+), 1 deletion(-) + create mode 100644 programs/winecfg/staging.c + +diff --git a/programs/winecfg/Makefile.in b/programs/winecfg/Makefile.in +index 4e66e04..1cf7031 100644 +--- a/programs/winecfg/Makefile.in ++++ b/programs/winecfg/Makefile.in +@@ -11,6 +11,7 @@ C_SRCS = \ + driveui.c \ + libraries.c \ + main.c \ ++ staging.c \ + theme.c \ + winecfg.c \ + x11drvdlg.c +diff --git a/programs/winecfg/main.c b/programs/winecfg/main.c +index 6ac5f89..17909dc 100644 +--- a/programs/winecfg/main.c ++++ b/programs/winecfg/main.c +@@ -60,7 +60,7 @@ PropSheetCallback (HWND hWnd, UINT uMsg, LPARAM lParam) + return 0; + } + +-#define NUM_PROPERTY_PAGES 7 ++#define NUM_PROPERTY_PAGES 8 + + static INT_PTR + doPropertySheet (HINSTANCE hInstance, HWND hOwner) +@@ -141,6 +141,16 @@ doPropertySheet (HINSTANCE hInstance, HWND hOwner) + psp[pg].lParam = 0; + pg++; + ++ psp[pg].dwSize = sizeof (PROPSHEETPAGEW); ++ psp[pg].dwFlags = PSP_USETITLE; ++ psp[pg].hInstance = hInstance; ++ psp[pg].u.pszTemplate = MAKEINTRESOURCEW (IDD_STAGING); ++ psp[pg].u2.pszIcon = NULL; ++ psp[pg].pfnDlgProc = StagingDlgProc; ++ psp[pg].pszTitle = load_string (IDS_TAB_STAGING); ++ psp[pg].lParam = 0; ++ pg++; ++ + /* + * Fill out the (General) PROPSHEETPAGE data structure + * for the property sheet +diff --git a/programs/winecfg/resource.h b/programs/winecfg/resource.h +index fffc4da..7fb90f4 100644 +--- a/programs/winecfg/resource.h ++++ b/programs/winecfg/resource.h +@@ -45,6 +45,7 @@ + #define IDS_SHELL_FOLDER 16 + #define IDS_LINKS_TO 17 + #define IDS_WINECFG_TITLE_APP 18 /* App specific title */ ++#define IDS_TAB_STAGING 19 + #define IDI_WINECFG 100 + #define IDI_LOGO 102 + #define IDD_ABOUTCFG 107 +@@ -54,6 +55,7 @@ + #define IDD_DLLCFG 111 + #define IDD_DRIVECFG 112 + #define IDD_DESKTOP_INTEGRATION 115 ++#define IDD_STAGING 116 + #define IDC_WINVER 1012 + #define IDC_DESKTOP_WIDTH 1023 + #define IDC_DESKTOP_HEIGHT 1024 +@@ -202,6 +204,9 @@ + #define IDC_SYSPARAMS_MENU_HILIGHT 8430 + #define IDC_SYSPARAMS_MENUBAR 8431 + ++/* graphics */ ++#define IDC_ENABLE_CSMT 9001 ++ + /* About tab */ + #define IDC_ABT_OWNER 8432 + #define IDC_ABT_ORG 8433 +diff --git a/programs/winecfg/staging.c b/programs/winecfg/staging.c +new file mode 100644 +index 0000000..1d6cef9 +--- /dev/null ++++ b/programs/winecfg/staging.c +@@ -0,0 +1,98 @@ ++/* ++ * WineCfg Staging panel ++ * ++ * Copyright 2014 Michael Müller ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ++ * ++ */ ++ ++#define COBJMACROS ++ ++#include "config.h" ++ ++#include ++#include ++#include ++ ++#include "resource.h" ++#include "winecfg.h" ++ ++WINE_DEFAULT_DEBUG_CHANNEL(winecfg); ++ ++static WCHAR redirects_keyW[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\', ++ 'D','l','l','R','e','d','i','r','e','c','t','s',0}; ++static WCHAR wined3dW[] = {'w','i','n','e','d','3','d',0}; ++static WCHAR wined3d_csmtW[] = {'w','i','n','e','d','3','d','-','c','s','m','t','.','d','l','l',0}; ++ ++static BOOL csmt_get(void) ++{ ++ BOOL ret = FALSE; ++ WCHAR *redirect = get_reg_keyW(HKEY_CURRENT_USER, redirects_keyW, wined3dW, NULL); ++ if (!redirect) return FALSE; ++ ++ if (strcmpW(redirect, wined3d_csmtW) == 0) ++ ret = TRUE; ++ ++ HeapFree(GetProcessHeap(), 0, redirect); ++ return ret; ++} ++ ++static void csmt_set(BOOL status) ++{ ++ if (csmt_get() == status) ++ return; ++ ++ set_reg_keyW(HKEY_CURRENT_USER, redirects_keyW, wined3dW, status ? wined3d_csmtW : NULL); ++} ++ ++static void csmt_clicked(HWND dialog) ++{ ++ csmt_set(IsDlgButtonChecked(dialog, IDC_ENABLE_CSMT) == BST_CHECKED); ++} ++ ++static void initStagingDlg(HWND dialog) ++{ ++ CheckDlgButton(dialog, IDC_ENABLE_CSMT, csmt_get() ? BST_CHECKED : BST_UNCHECKED); ++} ++ ++INT_PTR CALLBACK StagingDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) ++{ ++ switch (uMsg) ++ { ++ case WM_NOTIFY: ++ break; ++ ++ case WM_INITDIALOG: ++ initStagingDlg(hDlg); ++ return TRUE; ++ ++ case WM_SHOWWINDOW: ++ set_window_title(hDlg); ++ break; ++ ++ case WM_DESTROY: ++ break; ++ ++ case WM_COMMAND: ++ if (LOWORD(wParam) == IDC_ENABLE_CSMT && HIWORD(wParam) == BN_CLICKED) ++ { ++ csmt_clicked(hDlg); ++ SendMessageW(GetParent(hDlg), PSM_CHANGED, 0, 0); ++ } ++ break; ++ } ++ return FALSE; ++} +diff --git a/programs/winecfg/winecfg.h b/programs/winecfg/winecfg.h +index 110856a..a949474 100644 +--- a/programs/winecfg/winecfg.h ++++ b/programs/winecfg/winecfg.h +@@ -87,6 +87,7 @@ INT_PTR CALLBACK AppDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) + INT_PTR CALLBACK LibrariesDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + INT_PTR CALLBACK AudioDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + INT_PTR CALLBACK ThemeDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); ++INT_PTR CALLBACK StagingDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + INT_PTR CALLBACK AboutDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + + /* Drive management */ +diff --git a/programs/winecfg/winecfg.rc b/programs/winecfg/winecfg.rc +index 9f763a7..ad3e842 100644 +--- a/programs/winecfg/winecfg.rc ++++ b/programs/winecfg/winecfg.rc +@@ -39,6 +39,7 @@ BEGIN + IDS_TAB_GRAPHICS "Graphics" + IDS_TAB_DESKTOP_INTEGRATION "Desktop Integration" + IDS_TAB_AUDIO "Audio" ++ IDS_TAB_STAGING "Staging" + IDS_TAB_ABOUT "About" + IDS_WINECFG_TITLE "Wine configuration" + IDS_WINECFG_TITLE_APP "Wine configuration for %s" +@@ -297,6 +298,15 @@ BEGIN + PUSHBUTTON "B&rowse...",IDC_BROWSE_SFPATH,195,195,50,13,WS_DISABLED + END + ++IDD_STAGING DIALOG 0, 0, 260, 220 ++STYLE WS_CHILD | WS_DISABLED ++FONT 8, "MS Shell Dlg" ++BEGIN ++ GROUPBOX "Staging settings",IDC_STATIC,8,4,244,210 ++ LTEXT "The following settings are experimental and may break stuff!\nMake sure to reset them again in case of a problem.",IDC_STATIC,16,16,230,16 ++ CONTROL "Enable &CSMT for better graphic performance",IDC_ENABLE_CSMT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,40,230,8 ++END ++ + LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + + /* @makedep: winecfg.ico */ +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/winecfg-Staging/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/winecfg-Staging/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/winecfg-Staging/definition 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/winecfg-Staging/definition 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,2 @@ +Depends: wined3d-CSMT_Main +Depends: ntdll-DllRedirects diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Helper/0001-wined3d-Merge-get_pitch-functions.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Helper/0001-wined3d-Merge-get_pitch-functions.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Helper/0001-wined3d-Merge-get_pitch-functions.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Helper/0001-wined3d-Merge-get_pitch-functions.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,406 @@ +From e40fbe3feb09e745a7cb95413b23f3087a2859af Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 19 Sep 2013 14:22:24 +0200 +Subject: wined3d: Merge get_pitch functions. + +--- + dlls/ddraw/surface.c | 12 ++++++-- + dlls/wined3d/resource.c | 31 +++++++++++++++++++ + dlls/wined3d/surface.c | 70 +++++++++++++++++------------------------- + dlls/wined3d/volume.c | 29 ++--------------- + dlls/wined3d/wined3d.spec | 2 +- + dlls/wined3d/wined3d_private.h | 2 +- + include/wine/wined3d.h | 3 +- + 7 files changed, 74 insertions(+), 75 deletions(-) + +diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c +index a4184b8..a0d7f2d 100644 +--- a/dlls/ddraw/surface.c ++++ b/dlls/ddraw/surface.c +@@ -6158,6 +6158,10 @@ void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, stru + DDSURFACEDESC2 *desc = &surface->surface_desc; + struct wined3d_resource_desc wined3d_desc; + unsigned int version = texture->version; ++ UINT row_pitch, slice_pitch; ++ struct wined3d_resource *resource = wined3d_surface_get_resource(wined3d_surface); ++ ++ wined3d_resource_get_pitch(resource, &row_pitch, &slice_pitch); + + surface->IDirectDrawSurface7_iface.lpVtbl = &ddraw_surface7_vtbl; + surface->IDirectDrawSurface4_iface.lpVtbl = &ddraw_surface4_vtbl; +@@ -6188,7 +6192,7 @@ void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, stru + } + + *desc = texture->surface_desc; +- wined3d_resource_get_desc(wined3d_surface_get_resource(wined3d_surface), &wined3d_desc); ++ wined3d_resource_get_desc(resource, &wined3d_desc); + desc->dwWidth = wined3d_desc.width; + desc->dwHeight = wined3d_desc.height; + surface->first_attached = surface; +@@ -6198,14 +6202,16 @@ void ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, stru + if (desc->dwFlags & DDSD_LPSURFACE) + desc->u1.dwLinearSize = ~0u; + else +- desc->u1.dwLinearSize = wined3d_surface_get_pitch(wined3d_surface) * ((desc->dwHeight + 3) / 4); ++ { ++ desc->u1.dwLinearSize = row_pitch * ((desc->dwHeight + 3) / 4); ++ } + desc->dwFlags |= DDSD_LINEARSIZE; + desc->dwFlags &= ~(DDSD_LPSURFACE | DDSD_PITCH); + } + else + { + if (!(desc->dwFlags & DDSD_LPSURFACE)) +- desc->u1.lPitch = wined3d_surface_get_pitch(wined3d_surface); ++ desc->u1.lPitch = row_pitch; + desc->dwFlags |= DDSD_PITCH; + desc->dwFlags &= ~(DDSD_LPSURFACE | DDSD_LINEARSIZE); + } +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 0ab55dc..8032a4c 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -331,3 +331,34 @@ void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) + else + resource->draw_binding = WINED3D_LOCATION_TEXTURE_RGB; + } ++ ++void CDECL wined3d_resource_get_pitch(const struct wined3d_resource *resource, UINT *row_pitch, ++ UINT *slice_pitch) ++{ ++ unsigned int alignment; ++ const struct wined3d_format *format = resource->format; ++ ++ if (resource->custom_row_pitch) ++ { ++ *row_pitch = resource->custom_row_pitch; ++ *slice_pitch = resource->custom_slice_pitch; ++ return; ++ } ++ ++ alignment = resource->device->surface_alignment; ++ *row_pitch = wined3d_format_calculate_pitch(resource->format, resource->width); ++ *row_pitch = (*row_pitch + alignment - 1) & ~(alignment - 1); ++ if (format->flags & WINED3DFMT_FLAG_BLOCKS) ++ { ++ /* Since compressed formats are block based, pitch means the amount of ++ * bytes to the next row of block rather than the next row of pixels. */ ++ UINT slice_block_count = (resource->height + format->block_height - 1) / format->block_height; ++ *slice_pitch = *row_pitch * slice_block_count; ++ } ++ else ++ { ++ *slice_pitch = *row_pitch * resource->height; ++ } ++ ++ TRACE("Returning row pitch %u, slice pitch %u.\n", *row_pitch, *slice_pitch); ++} +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 092cbe6..d9b1846 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -364,6 +364,7 @@ static HRESULT surface_create_dib_section(struct wined3d_surface *surface) + BITMAPINFO *b_info; + int extraline = 0; + DWORD *masks; ++ UINT row_pitch, slice_pitch; + + TRACE("surface %p.\n", surface); + +@@ -409,10 +410,11 @@ static HRESULT surface_create_dib_section(struct wined3d_surface *surface) + + b_info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + /* TODO: Is there a nicer way to force a specific alignment? (8 byte for ddraw) */ +- b_info->bmiHeader.biWidth = wined3d_surface_get_pitch(surface) / format->byte_count; ++ wined3d_resource_get_pitch(&surface->resource, &row_pitch, &slice_pitch); ++ b_info->bmiHeader.biWidth = row_pitch / format->byte_count; + b_info->bmiHeader.biHeight = 0 - surface->resource.height - extraline; + b_info->bmiHeader.biSizeImage = (surface->resource.height + extraline) +- * wined3d_surface_get_pitch(surface); ++ * row_pitch; + b_info->bmiHeader.biPlanes = 1; + b_info->bmiHeader.biBitCount = format->byte_count * 8; + +@@ -1359,14 +1361,14 @@ static void surface_download_data(struct wined3d_surface *surface, const struct + void *mem; + GLenum gl_format = format->glFormat; + GLenum gl_type = format->glType; +- int src_pitch = 0; +- int dst_pitch = 0; ++ UINT src_pitch = 0; ++ UINT dst_row_pitch, dst_slice_pitch; + + if (surface->flags & SFLAG_NONPOW2) + { + unsigned char alignment = surface->resource.device->surface_alignment; + src_pitch = format->byte_count * surface->pow2Width; +- dst_pitch = wined3d_surface_get_pitch(surface); ++ wined3d_resource_get_pitch(&surface->resource, &dst_row_pitch, &dst_slice_pitch); + src_pitch = (src_pitch + alignment - 1) & ~(alignment - 1); + mem = HeapAlloc(GetProcessHeap(), 0, src_pitch * surface->pow2Height); + } +@@ -1453,12 +1455,12 @@ static void surface_download_data(struct wined3d_surface *surface, const struct + * won't be released, and doesn't have to be re-read. */ + src_data = mem; + dst_data = data.addr; +- TRACE("(%p) : Repacking the surface data from pitch %d to pitch %d\n", surface, src_pitch, dst_pitch); ++ TRACE("(%p) : Repacking the surface data from pitch %d to pitch %d\n", surface, src_pitch, dst_row_pitch); + for (y = 0; y < surface->resource.height; ++y) + { +- memcpy(dst_data, src_data, dst_pitch); ++ memcpy(dst_data, src_data, dst_row_pitch); + src_data += src_pitch; +- dst_data += dst_pitch; ++ dst_data += dst_row_pitch; + } + + HeapFree(GetProcessHeap(), 0, mem); +@@ -1612,7 +1614,7 @@ HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const P + UINT update_w, update_h; + UINT dst_w, dst_h; + RECT r, dst_rect; +- UINT src_pitch; ++ UINT src_row_pitch, src_slice_pitch; + POINT p; + + TRACE("dst_surface %p, dst_point %s, src_surface %p, src_rect %s.\n", +@@ -1698,9 +1700,9 @@ HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const P + wined3d_texture_bind(dst_surface->container, context, FALSE); + + surface_get_memory(src_surface, &data, src_surface->locations); +- src_pitch = wined3d_surface_get_pitch(src_surface); ++ wined3d_resource_get_pitch(&src_surface->resource, &src_row_pitch, &src_slice_pitch); + +- surface_upload_data(dst_surface, gl_info, src_format, src_rect, src_pitch, dst_point, FALSE, &data); ++ surface_upload_data(dst_surface, gl_info, src_format, src_rect, src_row_pitch, dst_point, FALSE, &data); + + context_invalidate_active_texture(context); + +@@ -2008,25 +2010,6 @@ HRESULT CDECL wined3d_surface_restore(struct wined3d_surface *surface) + return WINED3D_OK; + } + +-DWORD CDECL wined3d_surface_get_pitch(const struct wined3d_surface *surface) +-{ +- unsigned int alignment; +- DWORD pitch; +- +- TRACE("surface %p.\n", surface); +- +- if (surface->pitch) +- return surface->pitch; +- +- alignment = surface->resource.device->surface_alignment; +- pitch = wined3d_format_calculate_pitch(surface->resource.format, surface->resource.width); +- pitch = (pitch + alignment - 1) & ~(alignment - 1); +- +- TRACE("Returning %u.\n", pitch); +- +- return pitch; +-} +- + HRESULT CDECL wined3d_surface_set_overlay_position(struct wined3d_surface *surface, LONG x, LONG y) + { + LONG w, h; +@@ -2207,12 +2190,13 @@ HRESULT wined3d_surface_update_desc(struct wined3d_surface *surface, + surface->resource.map_binding = WINED3D_LOCATION_USER_MEMORY; + valid_location = WINED3D_LOCATION_USER_MEMORY; + } +- surface->pitch = pitch; ++ surface->resource.custom_row_pitch = pitch; ++ surface->resource.custom_slice_pitch = pitch * surface->resource.height; + surface->resource.format = texture_resource->format; + surface->resource.multisample_type = texture_resource->multisample_type; + surface->resource.multisample_quality = texture_resource->multisample_quality; +- if (surface->pitch) +- surface->resource.size = height * surface->pitch; ++ if (surface->resource.custom_row_pitch) ++ surface->resource.size = height * surface->resource.custom_row_pitch; + else + surface->resource.size = wined3d_format_calculate_size(texture_resource->format, + texture_resource->device->surface_alignment, width, height, 1); +@@ -2680,7 +2664,7 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + if (format->flags & WINED3DFMT_FLAG_BROKEN_PITCH) + map_desc->row_pitch = surface->resource.width * format->byte_count; + else +- map_desc->row_pitch = wined3d_surface_get_pitch(surface); ++ wined3d_resource_get_pitch(&surface->resource, &map_desc->row_pitch, &map_desc->slice_pitch); + map_desc->slice_pitch = 0; + + if (!rect) +@@ -2860,7 +2844,9 @@ static void read_from_framebuffer(struct wined3d_surface *surface, DWORD dst_loc + { + /* glReadPixels returns the image upside down, and there is no way to prevent this. + * Flip the lines in software. */ +- UINT pitch = wined3d_surface_get_pitch(surface); ++ UINT pitch, slice_pitch; ++ ++ wined3d_resource_get_pitch(&surface->resource, &pitch, &slice_pitch); + + if (!(row = HeapAlloc(GetProcessHeap(), 0, pitch))) + goto error; +@@ -4092,7 +4078,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + const struct wined3d_color_key_conversion *conversion; + struct wined3d_texture *texture = surface->container; + struct wined3d_context *context; +- UINT width, src_pitch, dst_pitch; ++ UINT width, src_row_pitch, src_slice_pitch, dst_pitch; + struct wined3d_bo_address data; + struct wined3d_format format; + POINT dst_point = {0, 0}; +@@ -4187,7 +4173,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + else surface->flags &= ~SFLAG_GLCKEY; + + width = surface->resource.width; +- src_pitch = wined3d_surface_get_pitch(surface); ++ wined3d_resource_get_pitch(&surface->resource, &src_row_pitch, &src_slice_pitch); + + format = *texture->resource.format; + if ((conversion = wined3d_format_get_color_key_conversion(texture, TRUE))) +@@ -4226,9 +4212,9 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + context_release(context); + return E_OUTOFMEMORY; + } +- format.convert(data.addr, mem, src_pitch, src_pitch * height, ++ format.convert(data.addr, mem, src_row_pitch, src_row_pitch * height, + dst_pitch, dst_pitch * height, width, height, 1); +- src_pitch = dst_pitch; ++ src_row_pitch = dst_pitch; + data.addr = mem; + } + else if (conversion) +@@ -4248,13 +4234,13 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + } + if (texture->swapchain && texture->swapchain->palette) + palette = texture->swapchain->palette; +- conversion->convert(data.addr, src_pitch, mem, dst_pitch, ++ conversion->convert(data.addr, src_row_pitch, mem, dst_pitch, + width, height, palette, &texture->src_blt_color_key); +- src_pitch = dst_pitch; ++ src_row_pitch = dst_pitch; + data.addr = mem; + } + +- surface_upload_data(surface, gl_info, &format, &src_rect, src_pitch, &dst_point, srgb, &data); ++ surface_upload_data(surface, gl_info, &format, &src_rect, src_row_pitch, &dst_point, srgb, &data); + + context_release(context); + +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index 58d7321..af99825 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -40,31 +40,6 @@ BOOL volume_prepare_system_memory(struct wined3d_volume *volume) + return TRUE; + } + +-static void wined3d_volume_get_pitch(const struct wined3d_volume *volume, UINT *row_pitch, +- UINT *slice_pitch) +-{ +- const struct wined3d_format *format = volume->resource.format; +- +- if (format->flags & WINED3DFMT_FLAG_BLOCKS) +- { +- /* Since compressed formats are block based, pitch means the amount of +- * bytes to the next row of block rather than the next row of pixels. */ +- UINT row_block_count = (volume->resource.width + format->block_width - 1) / format->block_width; +- UINT slice_block_count = (volume->resource.height + format->block_height - 1) / format->block_height; +- *row_pitch = row_block_count * format->block_byte_count; +- *slice_pitch = *row_pitch * slice_block_count; +- } +- else +- { +- unsigned char alignment = volume->resource.device->surface_alignment; +- *row_pitch = format->byte_count * volume->resource.width; /* Bytes / row */ +- *row_pitch = (*row_pitch + alignment - 1) & ~(alignment - 1); +- *slice_pitch = *row_pitch * volume->resource.height; +- } +- +- TRACE("Returning row pitch %u, slice pitch %u.\n", *row_pitch, *slice_pitch); +-} +- + /* Context activation is done by the caller. */ + void wined3d_volume_upload_data(struct wined3d_volume *volume, const struct wined3d_context *context, + const struct wined3d_bo_address *data) +@@ -95,7 +70,7 @@ void wined3d_volume_upload_data(struct wined3d_volume *volume, const struct wine + dst_row_pitch = (dst_row_pitch + alignment - 1) & ~(alignment - 1); + dst_slice_pitch = dst_row_pitch * height; + +- wined3d_volume_get_pitch(volume, &src_row_pitch, &src_slice_pitch); ++ wined3d_resource_get_pitch(&volume->resource, &src_row_pitch, &src_slice_pitch); + + mem = HeapAlloc(GetProcessHeap(), 0, dst_slice_pitch * depth); + format->convert(data->addr, mem, src_row_pitch, src_slice_pitch, +@@ -638,7 +613,7 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + } + else + { +- wined3d_volume_get_pitch(volume, &map_desc->row_pitch, &map_desc->slice_pitch); ++ wined3d_resource_get_pitch(&volume->resource, &map_desc->row_pitch, &map_desc->slice_pitch); + } + + if (!box) +diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec +index 7a77003..95885c7 100644 +--- a/dlls/wined3d/wined3d.spec ++++ b/dlls/wined3d/wined3d.spec +@@ -181,6 +181,7 @@ + + @ cdecl wined3d_resource_get_desc(ptr ptr) + @ cdecl wined3d_resource_get_parent(ptr) ++@ cdecl wined3d_resource_get_pitch(ptr ptr ptr) + @ cdecl wined3d_resource_get_priority(ptr) + @ cdecl wined3d_resource_set_parent(ptr ptr) + @ cdecl wined3d_resource_set_priority(ptr long) +@@ -226,7 +227,6 @@ + @ cdecl wined3d_surface_get_flip_status(ptr long) + @ cdecl wined3d_surface_get_overlay_position(ptr ptr ptr) + @ cdecl wined3d_surface_get_parent(ptr) +-@ cdecl wined3d_surface_get_pitch(ptr) + @ cdecl wined3d_surface_get_render_target_data(ptr ptr) + @ cdecl wined3d_surface_get_resource(ptr) + @ cdecl wined3d_surface_getdc(ptr ptr) +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 7935a5d..abd8d2b 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2080,6 +2080,7 @@ struct wined3d_resource + UINT size; + DWORD priority; + void *heap_memory; ++ UINT custom_row_pitch, custom_slice_pitch; + struct list resource_list_entry; + + void *parent; +@@ -2298,7 +2299,6 @@ struct wined3d_surface + + DWORD flags; + +- UINT pitch; + UINT pow2Width; + UINT pow2Height; + +diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h +index 0cf26e1..3d24b98 100644 +--- a/include/wine/wined3d.h ++++ b/include/wine/wined3d.h +@@ -2411,6 +2411,8 @@ static inline HRESULT wined3d_private_store_set_private_data(struct wined3d_priv + void __cdecl wined3d_resource_get_desc(const struct wined3d_resource *resource, + struct wined3d_resource_desc *desc); + void * __cdecl wined3d_resource_get_parent(const struct wined3d_resource *resource); ++void __cdecl wined3d_resource_get_pitch(const struct wined3d_resource *resource, UINT *row_pitch, ++ UINT *slice_pitch); + DWORD __cdecl wined3d_resource_get_priority(const struct wined3d_resource *resource); + void __cdecl wined3d_resource_set_parent(struct wined3d_resource *resource, void *parent); + DWORD __cdecl wined3d_resource_set_priority(struct wined3d_resource *resource, DWORD priority); +@@ -2468,7 +2470,6 @@ HRESULT __cdecl wined3d_surface_get_blt_status(const struct wined3d_surface *sur + HRESULT __cdecl wined3d_surface_get_flip_status(const struct wined3d_surface *surface, DWORD flags); + HRESULT __cdecl wined3d_surface_get_overlay_position(const struct wined3d_surface *surface, LONG *x, LONG *y); + void * __cdecl wined3d_surface_get_parent(const struct wined3d_surface *surface); +-DWORD __cdecl wined3d_surface_get_pitch(const struct wined3d_surface *surface); + HRESULT __cdecl wined3d_surface_get_render_target_data(struct wined3d_surface *surface, + struct wined3d_surface *render_target); + struct wined3d_resource * __cdecl wined3d_surface_get_resource(struct wined3d_surface *surface); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Helper/0002-wined3d-Add-second-dll-with-STAGING_CSMT-definition-.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Helper/0002-wined3d-Add-second-dll-with-STAGING_CSMT-definition-.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Helper/0002-wined3d-Add-second-dll-with-STAGING_CSMT-definition-.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Helper/0002-wined3d-Add-second-dll-with-STAGING_CSMT-definition-.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,409 @@ +From af9c8f2a2a01b930ac867b79ca58c9010de40178 Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +Date: Sun, 14 Dec 2014 20:49:28 +0100 +Subject: wined3d: Add second dll with STAGING_CSMT definition set. + +--- + configure.ac | 1 + + dlls/wined3d-csmt/Makefile.in | 37 +++++ + dlls/wined3d-csmt/version.rc | 27 ++++ + dlls/wined3d-csmt/wined3d-csmt.spec | 297 ++++++++++++++++++++++++++++++++++++ + 4 files changed, 362 insertions(+) + create mode 100644 dlls/wined3d-csmt/Makefile.in + create mode 100644 dlls/wined3d-csmt/version.rc + create mode 100644 dlls/wined3d-csmt/wined3d-csmt.spec + +diff --git a/configure.ac b/configure.ac +index b909ae8..c197db1 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -3317,6 +3317,7 @@ WINE_CONFIG_TEST(dlls/windowscodecsext/tests) + WINE_CONFIG_DLL(winealsa.drv) + WINE_CONFIG_DLL(winecoreaudio.drv) + WINE_CONFIG_LIB(winecrt0) ++WINE_CONFIG_DLL(wined3d-csmt) + WINE_CONFIG_DLL(wined3d,,[implib]) + WINE_CONFIG_DLL(winegstreamer) + WINE_CONFIG_DLL(winejoystick.drv) +diff --git a/dlls/wined3d-csmt/Makefile.in b/dlls/wined3d-csmt/Makefile.in +new file mode 100644 +index 0000000..90b2fba +--- /dev/null ++++ b/dlls/wined3d-csmt/Makefile.in +@@ -0,0 +1,37 @@ ++EXTRADEFS = -DSTAGING_CSMT ++MODULE = wined3d-csmt.dll ++IMPORTS = uuid opengl32 user32 gdi32 advapi32 ++PARENTSRC = ../wined3d ++ ++C_SRCS = \ ++ arb_program_shader.c \ ++ ati_fragment_shader.c \ ++ buffer.c \ ++ context.c \ ++ cs.c \ ++ device.c \ ++ directx.c \ ++ drawprim.c \ ++ dxtn.c \ ++ gl_compat.c \ ++ glsl_shader.c \ ++ nvidia_texture_shader.c \ ++ palette.c \ ++ query.c \ ++ resource.c \ ++ sampler.c \ ++ shader.c \ ++ shader_sm1.c \ ++ shader_sm4.c \ ++ state.c \ ++ stateblock.c \ ++ surface.c \ ++ swapchain.c \ ++ texture.c \ ++ utils.c \ ++ vertexdeclaration.c \ ++ view.c \ ++ volume.c \ ++ wined3d_main.c ++ ++RC_SRCS = version.rc +diff --git a/dlls/wined3d-csmt/version.rc b/dlls/wined3d-csmt/version.rc +new file mode 100644 +index 0000000..0439375 +--- /dev/null ++++ b/dlls/wined3d-csmt/version.rc +@@ -0,0 +1,27 @@ ++/* ++ * Copyright 2009 Austin English ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ++ */ ++ ++#include "config.h" /* Needed to get PACKAGE_VERSION */ ++ ++#define WINE_FILEDESCRIPTION_STR "Wine D3D" ++#define WINE_FILENAME_STR "wined3d.dll" ++#define WINE_FILEVERSION_STR PACKAGE_VERSION ++#define WINE_PRODUCTVERSION_STR PACKAGE_VERSION ++#define WINE_PRODUCTNAME_STR "Wine D3D" ++ ++#include "wine/wine_common_ver.rc" +diff --git a/dlls/wined3d-csmt/wined3d-csmt.spec b/dlls/wined3d-csmt/wined3d-csmt.spec +new file mode 100644 +index 0000000..28d9a05 +--- /dev/null ++++ b/dlls/wined3d-csmt/wined3d-csmt.spec +@@ -0,0 +1,297 @@ ++@ stdcall wined3d_mutex_lock() ++@ stdcall wined3d_mutex_unlock() ++ ++@ cdecl wined3d_calculate_format_pitch(ptr long long long) ++@ cdecl wined3d_check_depth_stencil_match(ptr long long long long long) ++@ cdecl wined3d_check_device_format(ptr long long long long long long) ++@ cdecl wined3d_check_device_format_conversion(ptr long long long long) ++@ cdecl wined3d_check_device_multisample_type(ptr long long long long long ptr) ++@ cdecl wined3d_check_device_type(ptr long long long long long) ++@ cdecl wined3d_create(long) ++@ cdecl wined3d_decref(ptr) ++@ cdecl wined3d_enum_adapter_modes(ptr long long long long ptr) ++@ cdecl wined3d_get_adapter_count(ptr) ++@ cdecl wined3d_get_adapter_display_mode(ptr long ptr ptr) ++@ cdecl wined3d_get_adapter_identifier(ptr long long ptr) ++@ cdecl wined3d_get_adapter_mode_count(ptr long long long) ++@ cdecl wined3d_get_adapter_monitor(ptr long) ++@ cdecl wined3d_get_adapter_raster_status(ptr long ptr) ++@ cdecl wined3d_get_device_caps(ptr long long ptr) ++@ cdecl wined3d_incref(ptr) ++@ cdecl wined3d_register_software_device(ptr ptr) ++@ cdecl wined3d_set_adapter_display_mode(ptr long ptr) ++ ++@ cdecl wined3d_buffer_create(ptr ptr ptr ptr ptr ptr) ++@ cdecl wined3d_buffer_create_ib(ptr long long long ptr ptr ptr) ++@ cdecl wined3d_buffer_create_vb(ptr long long long ptr ptr ptr) ++@ cdecl wined3d_buffer_decref(ptr) ++@ cdecl wined3d_buffer_get_parent(ptr) ++@ cdecl wined3d_buffer_get_resource(ptr) ++@ cdecl wined3d_buffer_incref(ptr) ++@ cdecl wined3d_buffer_map(ptr long long ptr long) ++@ cdecl wined3d_buffer_preload(ptr) ++@ cdecl wined3d_buffer_unmap(ptr) ++ ++@ cdecl wined3d_device_acquire_focus_window(ptr ptr) ++@ cdecl wined3d_device_begin_scene(ptr) ++@ cdecl wined3d_device_begin_stateblock(ptr) ++@ cdecl wined3d_device_clear(ptr long ptr long ptr float long) ++@ cdecl wined3d_device_clear_rendertarget_view(ptr ptr ptr ptr) ++@ cdecl wined3d_device_copy_resource(ptr ptr ptr) ++@ cdecl wined3d_device_create(ptr long long ptr long long ptr ptr) ++@ cdecl wined3d_device_decref(ptr) ++@ cdecl wined3d_device_draw_indexed_primitive(ptr long long) ++@ cdecl wined3d_device_draw_indexed_primitive_instanced(ptr long long long long) ++@ cdecl wined3d_device_draw_primitive(ptr long long) ++@ cdecl wined3d_device_end_scene(ptr) ++@ cdecl wined3d_device_end_stateblock(ptr ptr) ++@ cdecl wined3d_device_evict_managed_resources(ptr) ++@ cdecl wined3d_device_get_available_texture_mem(ptr) ++@ cdecl wined3d_device_get_back_buffer(ptr long long long ptr) ++@ cdecl wined3d_device_get_base_vertex_index(ptr) ++@ cdecl wined3d_device_get_clip_plane(ptr long ptr) ++@ cdecl wined3d_device_get_clip_status(ptr ptr) ++@ cdecl wined3d_device_get_creation_parameters(ptr ptr) ++@ cdecl wined3d_device_get_depth_stencil_view(ptr) ++@ cdecl wined3d_device_get_device_caps(ptr ptr) ++@ cdecl wined3d_device_get_display_mode(ptr long ptr ptr) ++@ cdecl wined3d_device_get_front_buffer_data(ptr long ptr) ++@ cdecl wined3d_device_get_gamma_ramp(ptr long ptr) ++@ cdecl wined3d_device_get_geometry_shader(ptr) ++@ cdecl wined3d_device_get_gs_cb(ptr long) ++@ cdecl wined3d_device_get_gs_resource_view(ptr long) ++@ cdecl wined3d_device_get_gs_sampler(ptr long) ++@ cdecl wined3d_device_get_index_buffer(ptr ptr) ++@ cdecl wined3d_device_get_light(ptr long ptr) ++@ cdecl wined3d_device_get_light_enable(ptr long ptr) ++@ cdecl wined3d_device_get_material(ptr ptr) ++@ cdecl wined3d_device_get_npatch_mode(ptr) ++@ cdecl wined3d_device_get_pixel_shader(ptr) ++@ cdecl wined3d_device_get_predication(ptr ptr) ++@ cdecl wined3d_device_get_primitive_type(ptr ptr) ++@ cdecl wined3d_device_get_ps_cb(ptr long) ++@ cdecl wined3d_device_get_ps_consts_b(ptr long ptr long) ++@ cdecl wined3d_device_get_ps_consts_f(ptr long ptr long) ++@ cdecl wined3d_device_get_ps_consts_i(ptr long ptr long) ++@ cdecl wined3d_device_get_ps_resource_view(ptr long) ++@ cdecl wined3d_device_get_ps_sampler(ptr long) ++@ cdecl wined3d_device_get_raster_status(ptr long ptr) ++@ cdecl wined3d_device_get_render_state(ptr long) ++@ cdecl wined3d_device_get_rendertarget_view(ptr long) ++@ cdecl wined3d_device_get_sampler_state(ptr long long) ++@ cdecl wined3d_device_get_scissor_rect(ptr ptr) ++@ cdecl wined3d_device_get_software_vertex_processing(ptr) ++@ cdecl wined3d_device_get_stream_output(ptr long ptr) ++@ cdecl wined3d_device_get_stream_source(ptr long ptr ptr ptr) ++@ cdecl wined3d_device_get_stream_source_freq(ptr long ptr) ++@ cdecl wined3d_device_get_surface_from_dc(ptr ptr) ++@ cdecl wined3d_device_get_swapchain(ptr long) ++@ cdecl wined3d_device_get_swapchain_count(ptr) ++@ cdecl wined3d_device_get_texture(ptr long) ++@ cdecl wined3d_device_get_texture_stage_state(ptr long long) ++@ cdecl wined3d_device_get_transform(ptr long ptr) ++@ cdecl wined3d_device_get_vertex_declaration(ptr) ++@ cdecl wined3d_device_get_vertex_shader(ptr) ++@ cdecl wined3d_device_get_viewport(ptr ptr) ++@ cdecl wined3d_device_get_vs_cb(ptr long) ++@ cdecl wined3d_device_get_vs_consts_b(ptr long ptr long) ++@ cdecl wined3d_device_get_vs_consts_f(ptr long ptr long) ++@ cdecl wined3d_device_get_vs_consts_i(ptr long ptr long) ++@ cdecl wined3d_device_get_vs_resource_view(ptr long) ++@ cdecl wined3d_device_get_vs_sampler(ptr long) ++@ cdecl wined3d_device_incref(ptr) ++@ cdecl wined3d_device_init_3d(ptr ptr) ++@ cdecl wined3d_device_init_gdi(ptr ptr) ++@ cdecl wined3d_device_multiply_transform(ptr long ptr) ++@ cdecl wined3d_device_present(ptr ptr ptr ptr ptr long) ++@ cdecl wined3d_device_process_vertices(ptr long long long ptr ptr long long) ++@ cdecl wined3d_device_release_focus_window(ptr) ++@ cdecl wined3d_device_reset(ptr ptr ptr ptr long) ++@ cdecl wined3d_device_restore_fullscreen_window(ptr ptr) ++@ cdecl wined3d_device_set_base_vertex_index(ptr long) ++@ cdecl wined3d_device_set_clip_plane(ptr long ptr) ++@ cdecl wined3d_device_set_clip_status(ptr ptr) ++@ cdecl wined3d_device_set_cursor_position(ptr long long long) ++@ cdecl wined3d_device_set_cursor_properties(ptr long long ptr) ++@ cdecl wined3d_device_set_depth_stencil_view(ptr ptr) ++@ cdecl wined3d_device_set_dialog_box_mode(ptr long) ++@ cdecl wined3d_device_set_gamma_ramp(ptr long long ptr) ++@ cdecl wined3d_device_set_geometry_shader(ptr ptr) ++@ cdecl wined3d_device_set_gs_cb(ptr long ptr) ++@ cdecl wined3d_device_set_gs_resource_view(ptr long ptr) ++@ cdecl wined3d_device_set_gs_sampler(ptr long ptr) ++@ cdecl wined3d_device_set_index_buffer(ptr ptr long) ++@ cdecl wined3d_device_set_light(ptr long ptr) ++@ cdecl wined3d_device_set_light_enable(ptr long long) ++@ cdecl wined3d_device_set_material(ptr ptr) ++@ cdecl wined3d_device_set_multithreaded(ptr) ++@ cdecl wined3d_device_set_npatch_mode(ptr float) ++@ cdecl wined3d_device_set_pixel_shader(ptr ptr) ++@ cdecl wined3d_device_set_predication(ptr ptr long) ++@ cdecl wined3d_device_set_primitive_type(ptr long) ++@ cdecl wined3d_device_set_ps_cb(ptr long ptr) ++@ cdecl wined3d_device_set_ps_consts_b(ptr long ptr long) ++@ cdecl wined3d_device_set_ps_consts_f(ptr long ptr long) ++@ cdecl wined3d_device_set_ps_consts_i(ptr long ptr long) ++@ cdecl wined3d_device_set_ps_resource_view(ptr long ptr) ++@ cdecl wined3d_device_set_ps_sampler(ptr long ptr) ++@ cdecl wined3d_device_set_render_state(ptr long long) ++@ cdecl wined3d_device_set_rendertarget_view(ptr long ptr long) ++@ cdecl wined3d_device_set_sampler_state(ptr long long long) ++@ cdecl wined3d_device_set_scissor_rect(ptr ptr) ++@ cdecl wined3d_device_set_software_vertex_processing(ptr long) ++@ cdecl wined3d_device_set_stream_output(ptr long ptr long) ++@ cdecl wined3d_device_set_stream_source(ptr long ptr long long) ++@ cdecl wined3d_device_set_stream_source_freq(ptr long long) ++@ cdecl wined3d_device_set_texture(ptr long ptr) ++@ cdecl wined3d_device_set_texture_stage_state(ptr long long long) ++@ cdecl wined3d_device_set_transform(ptr long ptr) ++@ cdecl wined3d_device_set_vertex_declaration(ptr ptr) ++@ cdecl wined3d_device_set_vertex_shader(ptr ptr) ++@ cdecl wined3d_device_set_viewport(ptr ptr) ++@ cdecl wined3d_device_set_vs_cb(ptr long ptr) ++@ cdecl wined3d_device_set_vs_consts_b(ptr long ptr long) ++@ cdecl wined3d_device_set_vs_consts_f(ptr long ptr long) ++@ cdecl wined3d_device_set_vs_consts_i(ptr long ptr long) ++@ cdecl wined3d_device_set_vs_resource_view(ptr long ptr) ++@ cdecl wined3d_device_set_vs_sampler(ptr long ptr) ++@ cdecl wined3d_device_setup_fullscreen_window(ptr ptr long long) ++@ cdecl wined3d_device_show_cursor(ptr long) ++@ cdecl wined3d_device_uninit_3d(ptr) ++@ cdecl wined3d_device_uninit_gdi(ptr) ++@ cdecl wined3d_device_update_surface(ptr ptr ptr ptr ptr) ++@ cdecl wined3d_device_update_texture(ptr ptr ptr) ++@ cdecl wined3d_device_validate_device(ptr ptr) ++ ++@ cdecl wined3d_palette_create(ptr long long ptr ptr) ++@ cdecl wined3d_palette_decref(ptr) ++@ cdecl wined3d_palette_get_entries(ptr long long long ptr) ++@ cdecl wined3d_palette_apply_to_dc(ptr ptr) ++@ cdecl wined3d_palette_incref(ptr) ++@ cdecl wined3d_palette_set_entries(ptr long long long ptr) ++ ++@ cdecl wined3d_query_create(ptr long ptr ptr) ++@ cdecl wined3d_query_decref(ptr) ++@ cdecl wined3d_query_get_data(ptr ptr long long) ++@ cdecl wined3d_query_get_data_size(ptr) ++@ cdecl wined3d_query_get_parent(ptr) ++@ cdecl wined3d_query_get_type(ptr) ++@ cdecl wined3d_query_incref(ptr) ++@ cdecl wined3d_query_issue(ptr long) ++ ++@ cdecl wined3d_resource_get_desc(ptr ptr) ++@ cdecl wined3d_resource_get_parent(ptr) ++@ cdecl wined3d_resource_get_pitch(ptr ptr ptr) ++@ cdecl wined3d_resource_get_priority(ptr) ++@ cdecl wined3d_resource_set_parent(ptr ptr) ++@ cdecl wined3d_resource_set_priority(ptr long) ++ ++@ cdecl wined3d_rendertarget_view_create(ptr ptr ptr ptr ptr) ++@ cdecl wined3d_rendertarget_view_create_from_surface(ptr ptr ptr ptr) ++@ cdecl wined3d_rendertarget_view_decref(ptr) ++@ cdecl wined3d_rendertarget_view_get_parent(ptr) ++@ cdecl wined3d_rendertarget_view_get_resource(ptr) ++@ cdecl wined3d_rendertarget_view_get_sub_resource_parent(ptr) ++@ cdecl wined3d_rendertarget_view_incref(ptr) ++@ cdecl wined3d_rendertarget_view_set_parent(ptr ptr) ++ ++@ cdecl wined3d_sampler_create(ptr ptr) ++@ cdecl wined3d_sampler_decref(ptr) ++@ cdecl wined3d_sampler_get_parent(ptr) ++@ cdecl wined3d_sampler_incref(ptr) ++ ++@ cdecl wined3d_shader_create_gs(ptr ptr ptr ptr ptr ptr long) ++@ cdecl wined3d_shader_create_ps(ptr ptr ptr ptr ptr ptr long) ++@ cdecl wined3d_shader_create_vs(ptr ptr ptr ptr ptr ptr long) ++@ cdecl wined3d_shader_decref(ptr) ++@ cdecl wined3d_shader_get_byte_code(ptr ptr ptr) ++@ cdecl wined3d_shader_get_parent(ptr) ++@ cdecl wined3d_shader_incref(ptr) ++@ cdecl wined3d_shader_set_local_constants_float(ptr long ptr long) ++ ++@ cdecl wined3d_shader_resource_view_create(ptr ptr ptr) ++@ cdecl wined3d_shader_resource_view_decref(ptr) ++@ cdecl wined3d_shader_resource_view_get_parent(ptr) ++@ cdecl wined3d_shader_resource_view_incref(ptr) ++ ++@ cdecl wined3d_stateblock_apply(ptr) ++@ cdecl wined3d_stateblock_capture(ptr) ++@ cdecl wined3d_stateblock_create(ptr long ptr) ++@ cdecl wined3d_stateblock_decref(ptr) ++@ cdecl wined3d_stateblock_incref(ptr) ++ ++@ cdecl wined3d_surface_blt(ptr ptr ptr ptr long ptr long) ++@ cdecl wined3d_surface_decref(ptr) ++@ cdecl wined3d_surface_from_resource(ptr) ++@ cdecl wined3d_surface_get_blt_status(ptr long) ++@ cdecl wined3d_surface_get_flip_status(ptr long) ++@ cdecl wined3d_surface_get_overlay_position(ptr ptr ptr) ++@ cdecl wined3d_surface_get_parent(ptr) ++@ cdecl wined3d_surface_get_render_target_data(ptr ptr) ++@ cdecl wined3d_surface_get_resource(ptr) ++@ cdecl wined3d_surface_getdc(ptr ptr) ++@ cdecl wined3d_surface_incref(ptr) ++@ cdecl wined3d_surface_is_lost(ptr) ++@ cdecl wined3d_surface_map(ptr ptr ptr long) ++@ cdecl wined3d_surface_preload(ptr) ++@ cdecl wined3d_surface_releasedc(ptr ptr) ++@ cdecl wined3d_surface_restore(ptr) ++@ cdecl wined3d_surface_set_overlay_position(ptr long long) ++@ cdecl wined3d_surface_unmap(ptr) ++@ cdecl wined3d_surface_update_overlay(ptr ptr ptr ptr long ptr) ++@ cdecl wined3d_surface_update_overlay_z_order(ptr long ptr) ++ ++@ cdecl wined3d_swapchain_create(ptr ptr ptr ptr ptr) ++@ cdecl wined3d_swapchain_decref(ptr) ++@ cdecl wined3d_swapchain_get_back_buffer(ptr long long) ++@ cdecl wined3d_swapchain_get_device(ptr) ++@ cdecl wined3d_swapchain_get_display_mode(ptr ptr ptr) ++@ cdecl wined3d_swapchain_get_front_buffer_data(ptr ptr) ++@ cdecl wined3d_swapchain_get_gamma_ramp(ptr ptr) ++@ cdecl wined3d_swapchain_get_parent(ptr) ++@ cdecl wined3d_swapchain_get_desc(ptr ptr) ++@ cdecl wined3d_swapchain_get_raster_status(ptr ptr) ++@ cdecl wined3d_swapchain_incref(ptr) ++@ cdecl wined3d_swapchain_present(ptr ptr ptr ptr ptr long) ++@ cdecl wined3d_swapchain_set_gamma_ramp(ptr long ptr) ++@ cdecl wined3d_swapchain_set_palette(ptr ptr) ++@ cdecl wined3d_swapchain_set_window(ptr ptr) ++ ++@ cdecl wined3d_texture_add_dirty_region(ptr long ptr) ++@ cdecl wined3d_texture_create(ptr ptr long long ptr ptr ptr) ++@ cdecl wined3d_texture_decref(ptr) ++@ cdecl wined3d_texture_generate_mipmaps(ptr) ++@ cdecl wined3d_texture_get_autogen_filter_type(ptr) ++@ cdecl wined3d_texture_get_level_count(ptr) ++@ cdecl wined3d_texture_get_lod(ptr) ++@ cdecl wined3d_texture_get_parent(ptr) ++@ cdecl wined3d_texture_get_resource(ptr) ++@ cdecl wined3d_texture_get_sub_resource(ptr long) ++@ cdecl wined3d_texture_incref(ptr) ++@ cdecl wined3d_texture_preload(ptr) ++@ cdecl wined3d_texture_set_autogen_filter_type(ptr long) ++@ cdecl wined3d_texture_set_color_key(ptr long ptr) ++@ cdecl wined3d_texture_set_lod(ptr long) ++@ cdecl wined3d_texture_update_desc(ptr long long long long long ptr long) ++ ++@ cdecl wined3d_vertex_declaration_create(ptr ptr long ptr ptr ptr) ++@ cdecl wined3d_vertex_declaration_create_from_fvf(ptr long ptr ptr ptr) ++@ cdecl wined3d_vertex_declaration_decref(ptr) ++@ cdecl wined3d_vertex_declaration_get_parent(ptr) ++@ cdecl wined3d_vertex_declaration_incref(ptr) ++ ++@ cdecl wined3d_volume_decref(ptr) ++@ cdecl wined3d_volume_from_resource(ptr) ++@ cdecl wined3d_volume_get_parent(ptr) ++@ cdecl wined3d_volume_get_resource(ptr) ++@ cdecl wined3d_volume_incref(ptr) ++@ cdecl wined3d_volume_map(ptr ptr ptr long) ++@ cdecl wined3d_volume_preload(ptr) ++@ cdecl wined3d_volume_unmap(ptr) ++ ++@ cdecl wined3d_dxt1_decode(ptr ptr long long long long long) ++@ cdecl wined3d_dxt1_encode(ptr ptr long long long long long) ++@ cdecl wined3d_dxt3_decode(ptr ptr long long long long long) ++@ cdecl wined3d_dxt3_encode(ptr ptr long long long long long) ++@ cdecl wined3d_dxt5_decode(ptr ptr long long long long long) ++@ cdecl wined3d_dxt5_encode(ptr ptr long long long long long) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Helper/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Helper/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Helper/definition 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Helper/definition 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1 @@ +Depends: wined3d-DXTn diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0001-wined3d-Pass-a-context-to-surface_load_sysmem.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0001-wined3d-Pass-a-context-to-surface_load_sysmem.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0001-wined3d-Pass-a-context-to-surface_load_sysmem.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0001-wined3d-Pass-a-context-to-surface_load_sysmem.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,79 @@ +From d802d551603f20fde872cf45d43064426bea4434 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 17 Nov 2013 19:10:18 +0100 +Subject: wined3d: Pass a context to surface_load_sysmem. + +--- + dlls/wined3d/surface.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index d9b1846..3877139 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -4010,9 +4010,12 @@ static void surface_copy_simple_location(struct wined3d_surface *surface, DWORD + memcpy(dst.addr, src.addr, size); + } + ++/* Context activation is done by the caller. */ + static void surface_load_sysmem(struct wined3d_surface *surface, +- const struct wined3d_gl_info *gl_info, DWORD dst_location) ++ struct wined3d_context *context, DWORD dst_location) + { ++ const struct wined3d_gl_info *gl_info = context->gl_info; ++ + if (surface->locations & surface_simple_locations) + { + surface_copy_simple_location(surface, dst_location); +@@ -4025,18 +4028,10 @@ static void surface_load_sysmem(struct wined3d_surface *surface, + /* Download the surface to system memory. */ + if (surface->locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) + { +- struct wined3d_device *device = surface->resource.device; +- struct wined3d_context *context; +- +- /* TODO: Use already acquired context when possible. */ +- context = context_acquire(device, NULL); +- + wined3d_texture_bind_and_dirtify(surface->container, context, + !(surface->locations & WINED3D_LOCATION_TEXTURE_RGB)); + surface_download_data(surface, gl_info, dst_location); + +- context_release(context); +- + return; + } + +@@ -4266,6 +4261,7 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) + struct wined3d_device *device = surface->resource.device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + HRESULT hr; ++ struct wined3d_context *context = NULL; + + TRACE("surface %p, location %s.\n", surface, wined3d_debug_location(location)); + +@@ -4274,7 +4270,7 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) + if (location == WINED3D_LOCATION_TEXTURE_RGB + && surface->locations & (WINED3D_LOCATION_DRAWABLE | WINED3D_LOCATION_DISCARDED)) + { +- struct wined3d_context *context = context_acquire(device, NULL); ++ context = context_acquire(device, NULL); + surface_load_ds_location(surface, context, location); + context_release(context); + return WINED3D_OK; +@@ -4320,7 +4316,11 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) + case WINED3D_LOCATION_USER_MEMORY: + case WINED3D_LOCATION_SYSMEM: + case WINED3D_LOCATION_BUFFER: +- surface_load_sysmem(surface, gl_info, location); ++ if (device->d3d_initialized) ++ context = context_acquire(device, NULL); ++ surface_load_sysmem(surface, context, location); ++ if (context) ++ context_release(context); + break; + + case WINED3D_LOCATION_DRAWABLE: +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0002-wined3d-Pass-a-context-to-read_from_framebuffer.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0002-wined3d-Pass-a-context-to-read_from_framebuffer.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0002-wined3d-Pass-a-context-to-read_from_framebuffer.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0002-wined3d-Pass-a-context-to-read_from_framebuffer.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,81 @@ +From e29e2b0ccda7ed5e930eb18b3c73204150a68123 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 17 Nov 2013 19:16:40 +0100 +Subject: wined3d: Pass a context to read_from_framebuffer. + +In the average case the function will not be able to reuse it, because +it requires a specific context to access the WGL framebuffer. It will +restore the original context afterwards to hide the context change from +load_location / preload callers. This is related to bug 34574. +--- + dlls/wined3d/surface.c | 29 +++++++++++++++++++++++++---- + 1 file changed, 25 insertions(+), 4 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 3877139..ef6a233 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -2781,11 +2781,13 @@ HRESULT CDECL wined3d_surface_releasedc(struct wined3d_surface *surface, HDC dc) + return WINED3D_OK; + } + +-static void read_from_framebuffer(struct wined3d_surface *surface, DWORD dst_location) ++static void read_from_framebuffer(struct wined3d_surface *surface, ++ struct wined3d_context *old_ctx, DWORD dst_location) + { + struct wined3d_device *device = surface->resource.device; + const struct wined3d_gl_info *gl_info; + struct wined3d_context *context; ++ struct wined3d_surface *restore_rt; + BYTE *mem; + BYTE *row, *top, *bottom; + int i; +@@ -2794,7 +2796,21 @@ static void read_from_framebuffer(struct wined3d_surface *surface, DWORD dst_loc + + surface_get_memory(surface, &data, dst_location); + +- context = context_acquire(device, surface); ++ /* Context_release does not restore the original context in case of ++ * nested context_acquire calls. Only read_from_framebuffer and ++ * surface_blt_to_drawable use nested context_acquire calls. Manually ++ * restore the original context at the end of the function if needed. */ ++ if (old_ctx->current_rt == surface) ++ { ++ restore_rt = NULL; ++ context = old_ctx; ++ } ++ else ++ { ++ restore_rt = old_ctx->current_rt; ++ context = context_acquire(device, surface); ++ } ++ + context_apply_blit_state(context, device); + gl_info = context->gl_info; + +@@ -2882,7 +2898,12 @@ error: + checkGLcall("glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0)"); + } + +- context_release(context); ++ if (restore_rt) ++ { ++ context_release(context); ++ context = context_acquire(device, restore_rt); ++ context_release(context); ++ } + } + + /* Read the framebuffer contents into a texture. Note that this function +@@ -4037,7 +4058,7 @@ static void surface_load_sysmem(struct wined3d_surface *surface, + + if (surface->locations & WINED3D_LOCATION_DRAWABLE) + { +- read_from_framebuffer(surface, dst_location); ++ read_from_framebuffer(surface, context, dst_location); + return; + } + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0003-wined3d-Pass-a-context-to-surface_load_drawable-and-.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0003-wined3d-Pass-a-context-to-surface_load_drawable-and-.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0003-wined3d-Pass-a-context-to-surface_load_drawable-and-.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0003-wined3d-Pass-a-context-to-surface_load_drawable-and-.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,121 @@ +From da5210457d0a852e97fd20fed4b33030585b0549 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 17 Nov 2013 19:34:26 +0100 +Subject: wined3d: Pass a context to surface_load_drawable and + surface_blt_to_drawable. + +--- + dlls/wined3d/surface.c | 40 ++++++++++++++++++++++++++++++++++------ + 1 file changed, 34 insertions(+), 6 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index ef6a233..7a32f7f 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -3452,19 +3452,35 @@ void surface_translate_drawable_coords(const struct wined3d_surface *surface, HW + rect->bottom = drawable_height - rect->bottom; + } + ++/* Context activation is done by the caller. */ + static void surface_blt_to_drawable(const struct wined3d_device *device, ++ struct wined3d_context *old_ctx, + enum wined3d_texture_filter_type filter, BOOL alpha_test, + struct wined3d_surface *src_surface, const RECT *src_rect_in, + struct wined3d_surface *dst_surface, const RECT *dst_rect_in) + { + const struct wined3d_gl_info *gl_info; + struct wined3d_context *context; ++ struct wined3d_surface *restore_rt; + RECT src_rect, dst_rect; + + src_rect = *src_rect_in; + dst_rect = *dst_rect_in; + +- context = context_acquire(device, dst_surface); ++ /* Context_release does not restore the original context in case of ++ * nested context_acquire calls. Only read_from_framebuffer and ++ * surface_blt_to_drawable use nested context_acquire calls. Manually ++ * restore the original context at the end of the function if needed. */ ++ if (old_ctx->current_rt == dst_surface) ++ { ++ restore_rt = NULL; ++ context = old_ctx; ++ } ++ else ++ { ++ restore_rt = old_ctx->current_rt; ++ context = context_acquire(device, dst_surface); ++ } + gl_info = context->gl_info; + + /* Make sure the surface is up-to-date. This should probably use +@@ -3517,7 +3533,12 @@ static void surface_blt_to_drawable(const struct wined3d_device *device, + && dst_surface->container->swapchain->front_buffer == dst_surface->container)) + gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + +- context_release(context); ++ if (restore_rt) ++ { ++ context_release(context); ++ context = context_acquire(device, restore_rt); ++ context_release(context); ++ } + } + + HRESULT surface_color_fill(struct wined3d_surface *s, const RECT *rect, const struct wined3d_color *color) +@@ -3668,6 +3689,7 @@ static HRESULT surface_blt_special(struct wined3d_surface *dst_surface, const RE + /* Blit from offscreen surface to render target */ + struct wined3d_color_key old_blt_key = src_surface->container->src_blt_color_key; + DWORD old_color_key_flags = src_surface->container->color_key_flags; ++ struct wined3d_context *context; + + TRACE("Blt from surface %p to rendertarget %p\n", src_surface, dst_surface); + +@@ -3701,9 +3723,11 @@ static HRESULT surface_blt_special(struct wined3d_surface *dst_surface, const RE + wined3d_texture_set_color_key(src_surface->container, WINEDDSD_CKSRCBLT, NULL); + } + +- surface_blt_to_drawable(device, filter, ++ context = context_acquire(device, dst_surface); ++ surface_blt_to_drawable(device, context, filter, + flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE | WINEDDBLT_ALPHATEST), + src_surface, src_rect, dst_surface, dst_rect); ++ context_release(context); + + /* Restore the color key parameters */ + wined3d_texture_set_color_key(src_surface->container, WINEDDSD_CKSRCBLT, +@@ -4066,8 +4090,9 @@ static void surface_load_sysmem(struct wined3d_surface *surface, + surface, wined3d_debug_location(surface->locations)); + } + ++/* Context activation is done by the caller. */ + static HRESULT surface_load_drawable(struct wined3d_surface *surface, +- const struct wined3d_gl_info *gl_info) ++ struct wined3d_context *context) + { + RECT r; + +@@ -4080,7 +4105,7 @@ static HRESULT surface_load_drawable(struct wined3d_surface *surface, + + surface_get_rect(surface, NULL, &r); + surface_load_location(surface, WINED3D_LOCATION_TEXTURE_RGB); +- surface_blt_to_drawable(surface->resource.device, ++ surface_blt_to_drawable(surface->resource.device, context, + WINED3D_TEXF_POINT, FALSE, surface, &r, surface, &r); + + return WINED3D_OK; +@@ -4345,7 +4370,10 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) + break; + + case WINED3D_LOCATION_DRAWABLE: +- if (FAILED(hr = surface_load_drawable(surface, gl_info))) ++ context = context_acquire(device, NULL); ++ hr = surface_load_drawable(surface, context); ++ context_release(context); ++ if (FAILED(hr)) + return hr; + break; + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0004-wined3d-Pass-a-context-to-surface_blt_fbo.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0004-wined3d-Pass-a-context-to-surface_blt_fbo.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0004-wined3d-Pass-a-context-to-surface_blt_fbo.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0004-wined3d-Pass-a-context-to-surface_blt_fbo.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,140 @@ +From 61070d97c76557046a90cac37fbdf9c5f033adb4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 17 Nov 2013 19:49:38 +0100 +Subject: wined3d: Pass a context to surface_blt_fbo. + +--- + dlls/wined3d/surface.c | 53 +++++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 42 insertions(+), 11 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 7a32f7f..a2f8112 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -860,13 +860,15 @@ static void surface_depth_blt_fbo(const struct wined3d_device *device, + } + + /* Blit between surface locations. Onscreen on different swapchains is not supported. +- * Depth / stencil is not supported. */ +-static void surface_blt_fbo(const struct wined3d_device *device, enum wined3d_texture_filter_type filter, ++ * Depth / stencil is not supported. Context activation is done by the caller. */ ++static void surface_blt_fbo(const struct wined3d_device *device, ++ struct wined3d_context *old_ctx, enum wined3d_texture_filter_type filter, + struct wined3d_surface *src_surface, DWORD src_location, const RECT *src_rect_in, + struct wined3d_surface *dst_surface, DWORD dst_location, const RECT *dst_rect_in) + { + const struct wined3d_gl_info *gl_info; + struct wined3d_context *context; ++ struct wined3d_surface *required_rt, *restore_rt; + RECT src_rect, dst_rect; + GLenum gl_filter; + GLenum buffer; +@@ -909,9 +911,20 @@ static void surface_blt_fbo(const struct wined3d_device *device, enum wined3d_te + if (!surface_is_full_rect(dst_surface, &dst_rect)) + surface_load_location(dst_surface, dst_location); + +- if (src_location == WINED3D_LOCATION_DRAWABLE) context = context_acquire(device, src_surface); +- else if (dst_location == WINED3D_LOCATION_DRAWABLE) context = context_acquire(device, dst_surface); +- else context = context_acquire(device, NULL); ++ if (src_location == WINED3D_LOCATION_DRAWABLE) required_rt = src_surface; ++ else if (dst_location == WINED3D_LOCATION_DRAWABLE) required_rt = dst_surface; ++ else required_rt = NULL; ++ ++ if (required_rt && required_rt != old_ctx->current_rt) ++ { ++ restore_rt = context->current_rt; ++ context = context_acquire(device, required_rt); ++ } ++ else ++ { ++ restore_rt = NULL; ++ context = old_ctx; ++ } + + if (!context->valid) + { +@@ -974,7 +987,12 @@ static void surface_blt_fbo(const struct wined3d_device *device, enum wined3d_te + && dst_surface->container->swapchain->front_buffer == dst_surface->container)) + gl_info->gl_ops.gl.p_glFlush(); + +- context_release(context); ++ if (restore_rt) ++ { ++ context_release(context); ++ context = context_acquire(device, restore_rt); ++ context_release(context); ++ } + } + + static BOOL fbo_blit_supported(const struct wined3d_gl_info *gl_info, enum wined3d_blit_op blit_op, +@@ -4140,13 +4158,17 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + NULL, surface->resource.usage, surface->resource.pool, surface->resource.format, + NULL, surface->resource.usage, surface->resource.pool, surface->resource.format)) + { ++ context = context_acquire(device, NULL); ++ + if (srgb) +- surface_blt_fbo(device, WINED3D_TEXF_POINT, surface, WINED3D_LOCATION_TEXTURE_RGB, ++ surface_blt_fbo(device, context, WINED3D_TEXF_POINT, surface, WINED3D_LOCATION_TEXTURE_RGB, + &src_rect, surface, WINED3D_LOCATION_TEXTURE_SRGB, &src_rect); + else +- surface_blt_fbo(device, WINED3D_TEXF_POINT, surface, WINED3D_LOCATION_TEXTURE_SRGB, ++ surface_blt_fbo(device, context, WINED3D_TEXF_POINT, surface, WINED3D_LOCATION_TEXTURE_SRGB, + &src_rect, surface, WINED3D_LOCATION_TEXTURE_RGB, &src_rect); + ++ context_release(context); ++ + return WINED3D_OK; + } + +@@ -4161,8 +4183,10 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + DWORD dst_location = srgb ? WINED3D_LOCATION_TEXTURE_SRGB : WINED3D_LOCATION_TEXTURE_RGB; + RECT rect = {0, 0, surface->resource.width, surface->resource.height}; + +- surface_blt_fbo(device, WINED3D_TEXF_POINT, surface, src_location, ++ context = context_acquire(device, NULL); ++ surface_blt_fbo(device, context, WINED3D_TEXF_POINT, surface, src_location, + &rect, surface, dst_location, &rect); ++ context_release(context); + + return WINED3D_OK; + } +@@ -4292,14 +4316,17 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + + static void surface_multisample_resolve(struct wined3d_surface *surface) + { ++ struct wined3d_context *context; + RECT rect = {0, 0, surface->resource.width, surface->resource.height}; + + if (!(surface->locations & WINED3D_LOCATION_RB_MULTISAMPLE)) + ERR("Trying to resolve multisampled surface %p, but location WINED3D_LOCATION_RB_MULTISAMPLE not current.\n", + surface); + +- surface_blt_fbo(surface->resource.device, WINED3D_TEXF_POINT, ++ context = context_acquire(surface->resource.device, NULL); ++ surface_blt_fbo(surface->resource.device, context, WINED3D_TEXF_POINT, + surface, WINED3D_LOCATION_RB_MULTISAMPLE, &rect, surface, WINED3D_LOCATION_RB_RESOLVED, &rect); ++ context_release(context); + } + + HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) +@@ -5474,11 +5501,15 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + &src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format, + &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format)) + { ++ struct wined3d_context *context; + TRACE("Using FBO blit.\n"); + +- surface_blt_fbo(device, filter, ++ context = context_acquire(device, NULL); ++ surface_blt_fbo(device, context, filter, + src_surface, src_surface->container->resource.draw_binding, &src_rect, + dst_surface, dst_surface->container->resource.draw_binding, &dst_rect); ++ context_release(context); ++ + surface_validate_location(dst_surface, dst_surface->container->resource.draw_binding); + surface_invalidate_location(dst_surface, ~dst_surface->container->resource.draw_binding); + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0005-wined3d-Pass-a-context-to-surface_multisample_resolv.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0005-wined3d-Pass-a-context-to-surface_multisample_resolv.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0005-wined3d-Pass-a-context-to-surface_multisample_resolv.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0005-wined3d-Pass-a-context-to-surface_multisample_resolv.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,49 @@ +From f3cecdde174e3fc350ca4a35771183695b6777de Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 17 Nov 2013 19:50:47 +0100 +Subject: wined3d: Pass a context to surface_multisample_resolve. + +--- + dlls/wined3d/surface.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index a2f8112..ee6cfdd 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -4314,19 +4314,17 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + return WINED3D_OK; + } + +-static void surface_multisample_resolve(struct wined3d_surface *surface) ++/* Context activation is done by the caller. */ ++static void surface_multisample_resolve(struct wined3d_surface *surface, struct wined3d_context *context) + { +- struct wined3d_context *context; + RECT rect = {0, 0, surface->resource.width, surface->resource.height}; + + if (!(surface->locations & WINED3D_LOCATION_RB_MULTISAMPLE)) + ERR("Trying to resolve multisampled surface %p, but location WINED3D_LOCATION_RB_MULTISAMPLE not current.\n", + surface); + +- context = context_acquire(surface->resource.device, NULL); + surface_blt_fbo(surface->resource.device, context, WINED3D_TEXF_POINT, + surface, WINED3D_LOCATION_RB_MULTISAMPLE, &rect, surface, WINED3D_LOCATION_RB_RESOLVED, &rect); +- context_release(context); + } + + HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) +@@ -4405,7 +4403,9 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) + break; + + case WINED3D_LOCATION_RB_RESOLVED: +- surface_multisample_resolve(surface); ++ context = context_acquire(device, NULL); ++ surface_multisample_resolve(surface, context); ++ context_release(context); + break; + + case WINED3D_LOCATION_TEXTURE_RGB: +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0006-wined3d-Pass-a-context-to-surface_load_texture.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0006-wined3d-Pass-a-context-to-surface_load_texture.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0006-wined3d-Pass-a-context-to-surface_load_texture.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0006-wined3d-Pass-a-context-to-surface_load_texture.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,100 @@ +From c47fbee59422dcccdf545d9ca1a37eba75e7ef92 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 17 Nov 2013 19:52:56 +0100 +Subject: wined3d: Pass a context to surface_load_texture. + +--- + dlls/wined3d/surface.c | 21 ++++++--------------- + 1 file changed, 6 insertions(+), 15 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index ee6cfdd..b37dca9 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -4130,13 +4130,13 @@ static HRESULT surface_load_drawable(struct wined3d_surface *surface, + } + + static HRESULT surface_load_texture(struct wined3d_surface *surface, +- const struct wined3d_gl_info *gl_info, BOOL srgb) ++ struct wined3d_context *context, BOOL srgb) + { ++ const struct wined3d_gl_info *gl_info = context->gl_info; + RECT src_rect = {0, 0, surface->resource.width, surface->resource.height}; + struct wined3d_device *device = surface->resource.device; + const struct wined3d_color_key_conversion *conversion; + struct wined3d_texture *texture = surface->container; +- struct wined3d_context *context; + UINT width, src_row_pitch, src_slice_pitch, dst_pitch; + struct wined3d_bo_address data; + struct wined3d_format format; +@@ -4158,8 +4158,6 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + NULL, surface->resource.usage, surface->resource.pool, surface->resource.format, + NULL, surface->resource.usage, surface->resource.pool, surface->resource.format)) + { +- context = context_acquire(device, NULL); +- + if (srgb) + surface_blt_fbo(device, context, WINED3D_TEXF_POINT, surface, WINED3D_LOCATION_TEXTURE_RGB, + &src_rect, surface, WINED3D_LOCATION_TEXTURE_SRGB, &src_rect); +@@ -4167,8 +4165,6 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + surface_blt_fbo(device, context, WINED3D_TEXF_POINT, surface, WINED3D_LOCATION_TEXTURE_SRGB, + &src_rect, surface, WINED3D_LOCATION_TEXTURE_RGB, &src_rect); + +- context_release(context); +- + return WINED3D_OK; + } + +@@ -4183,10 +4179,8 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + DWORD dst_location = srgb ? WINED3D_LOCATION_TEXTURE_SRGB : WINED3D_LOCATION_TEXTURE_RGB; + RECT rect = {0, 0, surface->resource.width, surface->resource.height}; + +- context = context_acquire(device, NULL); + surface_blt_fbo(device, context, WINED3D_TEXF_POINT, surface, src_location, + &rect, surface, dst_location, &rect); +- context_release(context); + + return WINED3D_OK; + } +@@ -4224,9 +4218,6 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + surface_load_location(surface, WINED3D_LOCATION_SYSMEM); + } + +- /* TODO: Use already acquired context when possible. */ +- context = context_acquire(device, NULL); +- + wined3d_texture_prepare_texture(texture, context, srgb); + wined3d_texture_bind_and_dirtify(texture, context, srgb); + +@@ -4307,8 +4298,6 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + + surface_upload_data(surface, gl_info, &format, &src_rect, src_row_pitch, &dst_point, srgb, &data); + +- context_release(context); +- + HeapFree(GetProcessHeap(), 0, mem); + + return WINED3D_OK; +@@ -4330,7 +4319,6 @@ static void surface_multisample_resolve(struct wined3d_surface *surface, struct + HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) + { + struct wined3d_device *device = surface->resource.device; +- const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + HRESULT hr; + struct wined3d_context *context = NULL; + +@@ -4410,7 +4398,10 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) + + case WINED3D_LOCATION_TEXTURE_RGB: + case WINED3D_LOCATION_TEXTURE_SRGB: +- if (FAILED(hr = surface_load_texture(surface, gl_info, location == WINED3D_LOCATION_TEXTURE_SRGB))) ++ context = context_acquire(device, NULL); ++ hr = surface_load_texture(surface, context, location == WINED3D_LOCATION_TEXTURE_SRGB); ++ context_release(context); ++ if (FAILED(hr)) + return hr; + break; + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0007-wined3d-Pass-a-context-to-surface_load_location.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0007-wined3d-Pass-a-context-to-surface_load_location.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0007-wined3d-Pass-a-context-to-surface_load_location.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0007-wined3d-Pass-a-context-to-surface_load_location.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,543 @@ +From c6a152077c4e86728448103b7fdc72463d723c7c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 17 Nov 2013 20:19:24 +0100 +Subject: wined3d: Pass a context to surface_load_location. + +--- + dlls/wined3d/context.c | 4 +- + dlls/wined3d/device.c | 20 +++---- + dlls/wined3d/drawprim.c | 20 +++---- + dlls/wined3d/surface.c | 122 +++++++++++++++++++++++++---------------- + dlls/wined3d/swapchain.c | 8 +-- + dlls/wined3d/texture.c | 7 ++- + dlls/wined3d/wined3d_private.h | 5 +- + 7 files changed, 108 insertions(+), 78 deletions(-) + +diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c +index 4da8c7d..1f34992 100644 +--- a/dlls/wined3d/context.c ++++ b/dlls/wined3d/context.c +@@ -2199,7 +2199,7 @@ static BOOL match_depth_stencil_format(const struct wined3d_format *existing, + return TRUE; + } + +-/* The caller provides a context */ ++/* Context activation is done by the caller. */ + static void context_validate_onscreen_formats(struct wined3d_context *context, + const struct wined3d_rendertarget_view *depth_stencil) + { +@@ -2215,7 +2215,7 @@ static void context_validate_onscreen_formats(struct wined3d_context *context, + WARN("Depth stencil format is not supported by WGL, rendering the backbuffer in an FBO\n"); + + /* The currently active context is the necessary context to access the swapchain's onscreen buffers */ +- surface_load_location(context->current_rt, WINED3D_LOCATION_TEXTURE_RGB); ++ surface_load_location(context->current_rt, context, WINED3D_LOCATION_TEXTURE_RGB); + swapchain->render_to_fbo = TRUE; + swapchain_update_draw_bindings(swapchain); + context_set_render_offscreen(context, TRUE); +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 89ec00a..0b4c6f9 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -300,6 +300,15 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c + unsigned int i; + RECT ds_rect; + ++ context = context_acquire(device, target); ++ if (!context->valid) ++ { ++ context_release(context); ++ WARN("Invalid context, skipping clear.\n"); ++ return; ++ } ++ gl_info = context->gl_info; ++ + /* When we're clearing parts of the drawable, make sure that the target surface is well up to date in the + * drawable. After the clear we'll mark the drawable up to date, so we have to make sure that this is true + * for the cleared parts, and the untouched parts. +@@ -314,19 +323,10 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c + { + struct wined3d_surface *rt = wined3d_rendertarget_view_get_surface(fb->render_targets[i]); + if (rt) +- surface_load_location(rt, rt->container->resource.draw_binding); ++ surface_load_location(rt, context, rt->container->resource.draw_binding); + } + } + +- context = context_acquire(device, target); +- if (!context->valid) +- { +- context_release(context); +- WARN("Invalid context, skipping clear.\n"); +- return; +- } +- gl_info = context->gl_info; +- + if (target) + { + render_offscreen = context->render_offscreen; +diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c +index 265942c..2d39a83 100644 +--- a/dlls/wined3d/drawprim.c ++++ b/dlls/wined3d/drawprim.c +@@ -608,6 +608,15 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co + + if (!index_count) return; + ++ context = context_acquire(device, wined3d_rendertarget_view_get_surface(device->fb.render_targets[0])); ++ if (!context->valid) ++ { ++ context_release(context); ++ WARN("Invalid context, skipping draw.\n"); ++ return; ++ } ++ gl_info = context->gl_info; ++ + if (state->render_states[WINED3D_RS_COLORWRITEENABLE]) + { + /* Invalidate the back buffer memory so LockRect will read it the next time */ +@@ -616,21 +625,12 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co + struct wined3d_surface *target = wined3d_rendertarget_view_get_surface(device->fb.render_targets[i]); + if (target) + { +- surface_load_location(target, target->container->resource.draw_binding); ++ surface_load_location(target, context, target->container->resource.draw_binding); + surface_invalidate_location(target, ~target->container->resource.draw_binding); + } + } + } + +- context = context_acquire(device, wined3d_rendertarget_view_get_surface(device->fb.render_targets[0])); +- if (!context->valid) +- { +- context_release(context); +- WARN("Invalid context, skipping draw.\n"); +- return; +- } +- gl_info = context->gl_info; +- + if (device->fb.depth_stencil) + { + /* Note that this depends on the context_acquire() call above to set +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index b37dca9..66956df 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -753,7 +753,16 @@ static void surface_unmap(struct wined3d_surface *surface) + } + + if (surface->container->swapchain && surface->container->swapchain->front_buffer == surface->container) +- surface_load_location(surface, surface->container->resource.draw_binding); ++ { ++ struct wined3d_device *device = surface->resource.device; ++ struct wined3d_context *context = NULL; ++ ++ if (device->d3d_initialized) ++ context = context_acquire(device, surface); ++ surface_load_location(surface, context, surface->container->resource.draw_binding); ++ if (context) ++ context_release(context); ++ } + else if (surface->resource.format->flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) + FIXME("Depth / stencil buffer locking is not implemented.\n"); + } +@@ -806,12 +815,6 @@ static void surface_depth_blt_fbo(const struct wined3d_device *device, + if (src_mask & WINED3DFMT_FLAG_STENCIL) + gl_mask |= GL_STENCIL_BUFFER_BIT; + +- /* Make sure the locations are up-to-date. Loading the destination +- * surface isn't required if the entire surface is overwritten. */ +- surface_load_location(src_surface, src_location); +- if (!surface_is_full_rect(dst_surface, dst_rect)) +- surface_load_location(dst_surface, dst_location); +- + context = context_acquire(device, NULL); + if (!context->valid) + { +@@ -820,6 +823,12 @@ static void surface_depth_blt_fbo(const struct wined3d_device *device, + return; + } + ++ /* Make sure the locations are up-to-date. Loading the destination ++ * surface isn't required if the entire surface is overwritten. */ ++ surface_load_location(src_surface, context, src_location); ++ if (!surface_is_full_rect(dst_surface, dst_rect)) ++ surface_load_location(dst_surface, context, dst_location); ++ + gl_info = context->gl_info; + + context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, NULL, src_surface, src_location); +@@ -907,9 +916,9 @@ static void surface_blt_fbo(const struct wined3d_device *device, + * surface isn't required if the entire surface is overwritten. (And is + * in fact harmful if we're being called by surface_load_location() with + * the purpose of loading the destination surface.) */ +- surface_load_location(src_surface, src_location); ++ surface_load_location(src_surface, old_ctx, src_location); + if (!surface_is_full_rect(dst_surface, &dst_rect)) +- surface_load_location(dst_surface, dst_location); ++ surface_load_location(dst_surface, old_ctx, dst_location); + + if (src_location == WINED3D_LOCATION_DRAWABLE) required_rt = src_surface; + else if (dst_location == WINED3D_LOCATION_DRAWABLE) required_rt = dst_surface; +@@ -1199,6 +1208,9 @@ static void surface_unload(struct wined3d_resource *resource) + + TRACE("surface %p.\n", surface); + ++ context = context_acquire(device, NULL); ++ gl_info = context->gl_info; ++ + if (resource->pool == WINED3D_POOL_DEFAULT) + { + /* Default pool resources are supposed to be destroyed before Reset is called. +@@ -1224,13 +1236,10 @@ static void surface_unload(struct wined3d_resource *resource) + else + { + surface_prepare_map_memory(surface); +- surface_load_location(surface, surface->resource.map_binding); ++ surface_load_location(surface, context, surface->resource.map_binding); + surface_invalidate_location(surface, ~surface->resource.map_binding); + } + +- context = context_acquire(device, NULL); +- gl_info = context->gl_info; +- + /* Destroy PBOs, but load them into real sysmem before */ + if (surface->pbo) + surface_remove_pbo(surface, gl_info); +@@ -1714,7 +1723,7 @@ HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const P + if (update_w == dst_w && update_h == dst_h) + wined3d_texture_prepare_texture(dst_surface->container, context, FALSE); + else +- surface_load_location(dst_surface, WINED3D_LOCATION_TEXTURE_RGB); ++ surface_load_location(dst_surface, context, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_texture_bind(dst_surface->container, context, FALSE); + + surface_get_memory(src_surface, &data, src_surface->locations); +@@ -1831,7 +1840,8 @@ GLenum surface_get_gl_buffer(const struct wined3d_surface *surface) + return GL_BACK; + } + +-void surface_load(struct wined3d_surface *surface, BOOL srgb) ++/* Context activation is done by the caller. */ ++void surface_load(struct wined3d_surface *surface, struct wined3d_context *context, BOOL srgb) + { + DWORD location = srgb ? WINED3D_LOCATION_TEXTURE_SRGB : WINED3D_LOCATION_TEXTURE_RGB; + BOOL ck_changed; +@@ -1856,7 +1866,7 @@ void surface_load(struct wined3d_surface *surface, BOOL srgb) + * the surface. Make sure we have it. */ + + surface_prepare_map_memory(surface); +- surface_load_location(surface, surface->resource.map_binding); ++ surface_load_location(surface, context, surface->resource.map_binding); + surface_invalidate_location(surface, ~surface->resource.map_binding); + /* Switching color keying on / off may change the internal format. */ + if (ck_changed) +@@ -1872,7 +1882,7 @@ void surface_load(struct wined3d_surface *surface, BOOL srgb) + return; + } + +- surface_load_location(surface, location); ++ surface_load_location(surface, context, location); + surface_evict_sysmem(surface); + } + +@@ -2639,10 +2649,16 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + } + else + { ++ struct wined3d_context *context = NULL; ++ + if (surface->resource.usage & WINED3DUSAGE_DYNAMIC) + WARN_(d3d_perf)("Mapping a dynamic surface without WINED3D_MAP_DISCARD.\n"); + +- surface_load_location(surface, surface->resource.map_binding); ++ if (surface->resource.device->d3d_initialized) ++ context = context_acquire(surface->resource.device, NULL); ++ surface_load_location(surface, context, surface->resource.map_binding); ++ if (context) ++ context_release(context); + } + + if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY))) +@@ -2724,6 +2740,8 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc) + { + HRESULT hr; ++ struct wined3d_device *device = surface->resource.device; ++ struct wined3d_context *context = NULL; + + TRACE("surface %p, dc %p.\n", surface, dc); + +@@ -2735,26 +2753,36 @@ HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc) + if (surface->resource.map_count) + return WINED3DERR_INVALIDCALL; + ++ if (device->d3d_initialized) ++ context = context_acquire(surface->resource.device, NULL); ++ + /* Create a DIB section if there isn't a dc yet. */ + if (!surface->hDC) + { + if (surface->flags & SFLAG_CLIENT) + { +- surface_load_location(surface, WINED3D_LOCATION_SYSMEM); ++ surface_load_location(surface, context, WINED3D_LOCATION_SYSMEM); + surface_release_client_storage(surface); + } + hr = surface_create_dib_section(surface); + if (FAILED(hr)) +- return WINED3DERR_INVALIDCALL; ++ { ++ if (context) ++ context_release(context); ++ return WINED3DERR_INVALIDCALL; ++ } + if (!(surface->resource.map_binding == WINED3D_LOCATION_USER_MEMORY + || surface->container->flags & WINED3D_TEXTURE_PIN_SYSMEM + || surface->pbo)) + surface->resource.map_binding = WINED3D_LOCATION_DIB; + } + +- surface_load_location(surface, WINED3D_LOCATION_DIB); ++ surface_load_location(surface, context, WINED3D_LOCATION_DIB); + surface_invalidate_location(surface, ~WINED3D_LOCATION_DIB); + ++ if (context) ++ context_release(context); ++ + surface->flags |= SFLAG_DCINUSE; + surface->resource.map_count++; + +@@ -2792,8 +2820,16 @@ HRESULT CDECL wined3d_surface_releasedc(struct wined3d_surface *surface, HDC dc) + * copied back to the DIB in the next getdc call. + * + * The same consideration applies to user memory surfaces. */ +- surface_load_location(surface, surface->resource.map_binding); ++ struct wined3d_device *device = surface->resource.device; ++ struct wined3d_context *context = NULL; ++ ++ if (device->d3d_initialized) ++ context = context_acquire(device, NULL); ++ ++ surface_load_location(surface, context, surface->resource.map_binding); + surface_invalidate_location(surface, WINED3D_LOCATION_DIB); ++ if (context) ++ context_release(context); + } + + return WINED3D_OK; +@@ -4086,7 +4122,7 @@ static void surface_load_sysmem(struct wined3d_surface *surface, + } + + if (surface->locations & (WINED3D_LOCATION_RB_MULTISAMPLE | WINED3D_LOCATION_RB_RESOLVED)) +- surface_load_location(surface, WINED3D_LOCATION_TEXTURE_RGB); ++ surface_load_location(surface, context, WINED3D_LOCATION_TEXTURE_RGB); + + /* Download the surface to system memory. */ + if (surface->locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) +@@ -4122,7 +4158,7 @@ static HRESULT surface_load_drawable(struct wined3d_surface *surface, + } + + surface_get_rect(surface, NULL, &r); +- surface_load_location(surface, WINED3D_LOCATION_TEXTURE_RGB); ++ surface_load_location(surface, context, WINED3D_LOCATION_TEXTURE_RGB); + surface_blt_to_drawable(surface->resource.device, context, + WINED3D_TEXF_POINT, FALSE, surface, &r, surface, &r); + +@@ -4195,7 +4231,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + /* Performance warning... */ + FIXME("Downloading RGB surface %p to reload it as sRGB.\n", surface); + surface_prepare_map_memory(surface); +- surface_load_location(surface, surface->resource.map_binding); ++ surface_load_location(surface, context, surface->resource.map_binding); + } + } + else +@@ -4206,7 +4242,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + /* Performance warning... */ + FIXME("Downloading sRGB surface %p to reload it as RGB.\n", surface); + surface_prepare_map_memory(surface); +- surface_load_location(surface, surface->resource.map_binding); ++ surface_load_location(surface, context, surface->resource.map_binding); + } + } + +@@ -4215,7 +4251,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + WARN("Trying to load a texture from sysmem, but no simple location is valid.\n"); + /* Lets hope we get it from somewhere... */ + surface_prepare_system_memory(surface); +- surface_load_location(surface, WINED3D_LOCATION_SYSMEM); ++ surface_load_location(surface, context, WINED3D_LOCATION_SYSMEM); + } + + wined3d_texture_prepare_texture(texture, context, srgb); +@@ -4248,7 +4284,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + surface->resource.map_binding = WINED3D_LOCATION_SYSMEM; + + surface_prepare_map_memory(surface); +- surface_load_location(surface, surface->resource.map_binding); ++ surface_load_location(surface, context, surface->resource.map_binding); + surface_remove_pbo(surface, gl_info); + } + +@@ -4316,11 +4352,10 @@ static void surface_multisample_resolve(struct wined3d_surface *surface, struct + surface, WINED3D_LOCATION_RB_MULTISAMPLE, &rect, surface, WINED3D_LOCATION_RB_RESOLVED, &rect); + } + +-HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) ++/* Context activation is done by the caller. Context may be NULL in ddraw-only mode. */ ++HRESULT surface_load_location(struct wined3d_surface *surface, struct wined3d_context *context, DWORD location) + { +- struct wined3d_device *device = surface->resource.device; + HRESULT hr; +- struct wined3d_context *context = NULL; + + TRACE("surface %p, location %s.\n", surface, wined3d_debug_location(location)); + +@@ -4329,9 +4364,7 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) + if (location == WINED3D_LOCATION_TEXTURE_RGB + && surface->locations & (WINED3D_LOCATION_DRAWABLE | WINED3D_LOCATION_DISCARDED)) + { +- context = context_acquire(device, NULL); + surface_load_ds_location(surface, context, location); +- context_release(context); + return WINED3D_OK; + } + else if (location & surface->locations +@@ -4375,33 +4408,22 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) + case WINED3D_LOCATION_USER_MEMORY: + case WINED3D_LOCATION_SYSMEM: + case WINED3D_LOCATION_BUFFER: +- if (device->d3d_initialized) +- context = context_acquire(device, NULL); + surface_load_sysmem(surface, context, location); +- if (context) +- context_release(context); + break; + + case WINED3D_LOCATION_DRAWABLE: +- context = context_acquire(device, NULL); +- hr = surface_load_drawable(surface, context); +- context_release(context); +- if (FAILED(hr)) ++ if (FAILED(hr = surface_load_drawable(surface, context))) + return hr; + break; + + case WINED3D_LOCATION_RB_RESOLVED: +- context = context_acquire(device, NULL); + surface_multisample_resolve(surface, context); +- context_release(context); + break; + + case WINED3D_LOCATION_TEXTURE_RGB: + case WINED3D_LOCATION_TEXTURE_SRGB: +- context = context_acquire(device, NULL); +- hr = surface_load_texture(surface, context, location == WINED3D_LOCATION_TEXTURE_SRGB); +- context_release(context); +- if (FAILED(hr)) ++ if (FAILED(hr = surface_load_texture(surface, context, ++ location == WINED3D_LOCATION_TEXTURE_SRGB))) + return hr; + break; + +@@ -5459,7 +5481,11 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + if (SUCCEEDED(surface_upload_from_surface(dst_surface, &dst_point, src_surface, &src_rect))) + { + if (!wined3d_resource_is_offscreen(&dst_surface->container->resource)) +- surface_load_location(dst_surface, dst_surface->container->resource.draw_binding); ++ { ++ struct wined3d_context *context = context_acquire(device, dst_surface); ++ surface_load_location(dst_surface, context, dst_surface->container->resource.draw_binding); ++ context_release(context); ++ } + return WINED3D_OK; + } + } +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index 887143f..d742b11 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -309,7 +309,7 @@ static void swapchain_blit(const struct wined3d_swapchain *swapchain, + if (backbuffer->resource.multisample_type) + { + location = WINED3D_LOCATION_RB_RESOLVED; +- surface_load_location(backbuffer, location); ++ surface_load_location(backbuffer, context, location); + } + + context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, backbuffer, NULL, location); +@@ -511,14 +511,14 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + */ + if (!swapchain->render_to_fbo && render_to_fbo && wined3d_settings.offscreen_rendering_mode == ORM_FBO) + { +- surface_load_location(back_buffer, WINED3D_LOCATION_TEXTURE_RGB); ++ surface_load_location(back_buffer, context, WINED3D_LOCATION_TEXTURE_RGB); + surface_invalidate_location(back_buffer, WINED3D_LOCATION_DRAWABLE); + swapchain->render_to_fbo = TRUE; + swapchain_update_draw_bindings(swapchain); + } + else + { +- surface_load_location(back_buffer, back_buffer->container->resource.draw_binding); ++ surface_load_location(back_buffer, context, back_buffer->container->resource.draw_binding); + } + + if (swapchain->render_to_fbo) +@@ -640,7 +640,7 @@ void x11_copy_to_screen(const struct wined3d_swapchain *swapchain, const RECT *r + + TRACE("Copying surface %p to screen.\n", front); + +- surface_load_location(front, WINED3D_LOCATION_DIB); ++ surface_load_location(front, NULL, WINED3D_LOCATION_DIB); + + src_dc = front->hDC; + window = swapchain->win_handle; +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index 6ecd414..c173518 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -819,16 +819,19 @@ HRESULT CDECL wined3d_texture_add_dirty_region(struct wined3d_texture *texture, + static void texture2d_sub_resource_load(struct wined3d_resource *sub_resource, + struct wined3d_context *context, BOOL srgb) + { +- surface_load(surface_from_resource(sub_resource), srgb); ++ surface_load(surface_from_resource(sub_resource), context, srgb); + } + + static void texture2d_sub_resource_add_dirty_region(struct wined3d_resource *sub_resource, + const struct wined3d_box *dirty_region) + { + struct wined3d_surface *surface = surface_from_resource(sub_resource); ++ struct wined3d_context *context; + + surface_prepare_map_memory(surface); +- surface_load_location(surface, surface->resource.map_binding); ++ context = context_acquire(surface->resource.device, NULL); ++ surface_load_location(surface, context, surface->resource.map_binding); ++ context_release(context); + surface_invalidate_location(surface, ~surface->resource.map_binding); + } + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index abd8d2b..7115eca 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2350,11 +2350,12 @@ GLenum surface_get_gl_buffer(const struct wined3d_surface *surface) DECLSPEC_HID + void surface_get_drawable_size(const struct wined3d_surface *surface, const struct wined3d_context *context, + unsigned int *width, unsigned int *height) DECLSPEC_HIDDEN; + void surface_invalidate_location(struct wined3d_surface *surface, DWORD location) DECLSPEC_HIDDEN; +-void surface_load(struct wined3d_surface *surface, BOOL srgb) DECLSPEC_HIDDEN; ++void surface_load(struct wined3d_surface *surface, struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN; + void surface_load_ds_location(struct wined3d_surface *surface, + struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; + void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb) DECLSPEC_HIDDEN; +-HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) DECLSPEC_HIDDEN; ++HRESULT surface_load_location(struct wined3d_surface *surface, ++ struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; + void surface_modify_ds_location(struct wined3d_surface *surface, DWORD location, UINT w, UINT h) DECLSPEC_HIDDEN; + void surface_prepare_rb(struct wined3d_surface *surface, + const struct wined3d_gl_info *gl_info, BOOL multisample) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0008-wined3d-Make-surface_load_location-return-nothing.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0008-wined3d-Make-surface_load_location-return-nothing.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0008-wined3d-Make-surface_load_location-return-nothing.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0008-wined3d-Make-surface_load_location-return-nothing.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,106 @@ +From 7059ae36100e7efafcbcefcf582c34c0ce99e435 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 17 Nov 2013 20:25:01 +0100 +Subject: wined3d: Make surface_load_location return nothing. + +--- + dlls/wined3d/surface.c | 18 +++++++++--------- + dlls/wined3d/wined3d_private.h | 2 +- + 2 files changed, 10 insertions(+), 10 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 66956df..8a14169 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -4353,7 +4353,7 @@ static void surface_multisample_resolve(struct wined3d_surface *surface, struct + } + + /* Context activation is done by the caller. Context may be NULL in ddraw-only mode. */ +-HRESULT surface_load_location(struct wined3d_surface *surface, struct wined3d_context *context, DWORD location) ++void surface_load_location(struct wined3d_surface *surface, struct wined3d_context *context, DWORD location) + { + HRESULT hr; + +@@ -4365,26 +4365,26 @@ HRESULT surface_load_location(struct wined3d_surface *surface, struct wined3d_co + && surface->locations & (WINED3D_LOCATION_DRAWABLE | WINED3D_LOCATION_DISCARDED)) + { + surface_load_ds_location(surface, context, location); +- return WINED3D_OK; ++ return; + } + else if (location & surface->locations + && surface->container->resource.draw_binding != WINED3D_LOCATION_DRAWABLE) + { + /* Already up to date, nothing to do. */ +- return WINED3D_OK; ++ return; + } + else + { + FIXME("Unimplemented copy from %s to %s for depth/stencil buffers.\n", + wined3d_debug_location(surface->locations), wined3d_debug_location(location)); +- return WINED3DERR_INVALIDCALL; ++ return; + } + } + + if (surface->locations & location) + { + TRACE("Location already up to date.\n"); +- return WINED3D_OK; ++ return; + } + + if (WARN_ON(d3d_surface)) +@@ -4399,7 +4399,7 @@ HRESULT surface_load_location(struct wined3d_surface *surface, struct wined3d_co + { + ERR("Surface %p does not have any up to date location.\n", surface); + surface->flags |= SFLAG_LOST; +- return WINED3DERR_DEVICELOST; ++ return; + } + + switch (location) +@@ -4413,7 +4413,7 @@ HRESULT surface_load_location(struct wined3d_surface *surface, struct wined3d_co + + case WINED3D_LOCATION_DRAWABLE: + if (FAILED(hr = surface_load_drawable(surface, context))) +- return hr; ++ return; + break; + + case WINED3D_LOCATION_RB_RESOLVED: +@@ -4424,7 +4424,7 @@ HRESULT surface_load_location(struct wined3d_surface *surface, struct wined3d_co + case WINED3D_LOCATION_TEXTURE_SRGB: + if (FAILED(hr = surface_load_texture(surface, context, + location == WINED3D_LOCATION_TEXTURE_SRGB))) +- return hr; ++ return; + break; + + default: +@@ -4437,7 +4437,7 @@ HRESULT surface_load_location(struct wined3d_surface *surface, struct wined3d_co + if (location != WINED3D_LOCATION_SYSMEM && (surface->locations & WINED3D_LOCATION_SYSMEM)) + surface_evict_sysmem(surface); + +- return WINED3D_OK; ++ return; + } + + static HRESULT ffp_blit_alloc(struct wined3d_device *device) { return WINED3D_OK; } +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 7115eca..f24808b 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2354,7 +2354,7 @@ void surface_load(struct wined3d_surface *surface, struct wined3d_context *conte + void surface_load_ds_location(struct wined3d_surface *surface, + struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; + void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb) DECLSPEC_HIDDEN; +-HRESULT surface_load_location(struct wined3d_surface *surface, ++void surface_load_location(struct wined3d_surface *surface, + struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; + void surface_modify_ds_location(struct wined3d_surface *surface, DWORD location, UINT w, UINT h) DECLSPEC_HIDDEN; + void surface_prepare_rb(struct wined3d_surface *surface, +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0009-wined3d-Store-volume-locations-in-the-resource.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0009-wined3d-Store-volume-locations-in-the-resource.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0009-wined3d-Store-volume-locations-in-the-resource.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0009-wined3d-Store-volume-locations-in-the-resource.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,203 @@ +From 98ce21ea2f7c29d885b7dcf5b36819f8d977c5a5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 3 Oct 2013 12:31:24 +0200 +Subject: wined3d: Store volume locations in the resource. + +--- + dlls/wined3d/volume.c | 46 +++++++++++++++++++++--------------------- + dlls/wined3d/wined3d_private.h | 5 +++-- + 2 files changed, 26 insertions(+), 25 deletions(-) + +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index af99825..ea56b38 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -101,15 +101,15 @@ void wined3d_volume_upload_data(struct wined3d_volume *volume, const struct wine + static void wined3d_volume_validate_location(struct wined3d_volume *volume, DWORD location) + { + TRACE("Volume %p, setting %s.\n", volume, wined3d_debug_location(location)); +- volume->locations |= location; +- TRACE("new location flags are %s.\n", wined3d_debug_location(volume->locations)); ++ volume->resource.locations |= location; ++ TRACE("new location flags are %s.\n", wined3d_debug_location(volume->resource.locations)); + } + + void wined3d_volume_invalidate_location(struct wined3d_volume *volume, DWORD location) + { + TRACE("Volume %p, clearing %s.\n", volume, wined3d_debug_location(location)); +- volume->locations &= ~location; +- TRACE("new location flags are %s.\n", wined3d_debug_location(volume->locations)); ++ volume->resource.locations &= ~location; ++ TRACE("new location flags are %s.\n", wined3d_debug_location(volume->resource.locations)); + } + + /* Context activation is done by the caller. */ +@@ -217,9 +217,9 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume, + DWORD required_access = volume_access_from_location(location); + + TRACE("Volume %p, loading %s, have %s.\n", volume, wined3d_debug_location(location), +- wined3d_debug_location(volume->locations)); ++ wined3d_debug_location(volume->resource.locations)); + +- if ((volume->locations & location) == location) ++ if ((volume->resource.locations & location) == location) + { + TRACE("Location(s) already up to date.\n"); + return; +@@ -242,32 +242,32 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume, + && !(volume->container->flags & WINED3D_TEXTURE_SRGB_ALLOCATED))) + ERR("Trying to load (s)RGB texture without prior allocation.\n"); + +- if (volume->locations & WINED3D_LOCATION_DISCARDED) ++ if (volume->resource.locations & WINED3D_LOCATION_DISCARDED) + { + TRACE("Volume previously discarded, nothing to do.\n"); + wined3d_volume_invalidate_location(volume, WINED3D_LOCATION_DISCARDED); + } +- else if (volume->locations & WINED3D_LOCATION_SYSMEM) ++ else if (volume->resource.locations & WINED3D_LOCATION_SYSMEM) + { + struct wined3d_bo_address data = {0, volume->resource.heap_memory}; + wined3d_volume_upload_data(volume, context, &data); + } +- else if (volume->locations & WINED3D_LOCATION_BUFFER) ++ else if (volume->resource.locations & WINED3D_LOCATION_BUFFER) + { + struct wined3d_bo_address data = {volume->pbo, NULL}; + wined3d_volume_upload_data(volume, context, &data); + } +- else if (volume->locations & WINED3D_LOCATION_TEXTURE_RGB) ++ else if (volume->resource.locations & WINED3D_LOCATION_TEXTURE_RGB) + { + wined3d_volume_srgb_transfer(volume, context, TRUE); + } +- else if (volume->locations & WINED3D_LOCATION_TEXTURE_SRGB) ++ else if (volume->resource.locations & WINED3D_LOCATION_TEXTURE_SRGB) + { + wined3d_volume_srgb_transfer(volume, context, FALSE); + } + else + { +- FIXME("Implement texture loading from %s.\n", wined3d_debug_location(volume->locations)); ++ FIXME("Implement texture loading from %s.\n", wined3d_debug_location(volume->resource.locations)); + return; + } + wined3d_volume_validate_location(volume, location); +@@ -281,16 +281,16 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume, + if (!volume->resource.heap_memory) + ERR("Trying to load WINED3D_LOCATION_SYSMEM without setting it up first.\n"); + +- if (volume->locations & WINED3D_LOCATION_DISCARDED) ++ if (volume->resource.locations & WINED3D_LOCATION_DISCARDED) + { + TRACE("Volume previously discarded, nothing to do.\n"); + wined3d_volume_invalidate_location(volume, WINED3D_LOCATION_DISCARDED); + } +- else if (volume->locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) ++ else if (volume->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) + { + struct wined3d_bo_address data = {0, volume->resource.heap_memory}; + +- if (volume->locations & WINED3D_LOCATION_TEXTURE_RGB) ++ if (volume->resource.locations & WINED3D_LOCATION_TEXTURE_RGB) + wined3d_texture_bind_and_dirtify(volume->container, context, FALSE); + else + wined3d_texture_bind_and_dirtify(volume->container, context, TRUE); +@@ -301,7 +301,7 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume, + else + { + FIXME("Implement WINED3D_LOCATION_SYSMEM loading from %s.\n", +- wined3d_debug_location(volume->locations)); ++ wined3d_debug_location(volume->resource.locations)); + return; + } + wined3d_volume_validate_location(volume, WINED3D_LOCATION_SYSMEM); +@@ -311,16 +311,16 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume, + if (!volume->pbo) + ERR("Trying to load WINED3D_LOCATION_BUFFER without setting it up first.\n"); + +- if (volume->locations & WINED3D_LOCATION_DISCARDED) ++ if (volume->resource.locations & WINED3D_LOCATION_DISCARDED) + { + TRACE("Volume previously discarded, nothing to do.\n"); + wined3d_volume_invalidate_location(volume, WINED3D_LOCATION_DISCARDED); + } +- else if (volume->locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) ++ else if (volume->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) + { + struct wined3d_bo_address data = {volume->pbo, NULL}; + +- if (volume->locations & WINED3D_LOCATION_TEXTURE_RGB) ++ if (volume->resource.locations & WINED3D_LOCATION_TEXTURE_RGB) + wined3d_texture_bind_and_dirtify(volume->container, context, FALSE); + else + wined3d_texture_bind_and_dirtify(volume->container, context, TRUE); +@@ -330,7 +330,7 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume, + else + { + FIXME("Implement WINED3D_LOCATION_BUFFER loading from %s.\n", +- wined3d_debug_location(volume->locations)); ++ wined3d_debug_location(volume->resource.locations)); + return; + } + wined3d_volume_validate_location(volume, WINED3D_LOCATION_BUFFER); +@@ -338,7 +338,7 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume, + + default: + FIXME("Implement %s loading from %s.\n", wined3d_debug_location(location), +- wined3d_debug_location(volume->locations)); ++ wined3d_debug_location(volume->resource.locations)); + } + } + +@@ -595,7 +595,7 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + { + wined3d_volume_validate_location(volume, WINED3D_LOCATION_SYSMEM); + } +- else if (!(volume->locations & WINED3D_LOCATION_SYSMEM)) ++ else if (!(volume->resource.locations & WINED3D_LOCATION_SYSMEM)) + { + context = context_acquire(device, NULL); + wined3d_volume_load_location(volume, context, WINED3D_LOCATION_SYSMEM); +@@ -743,7 +743,7 @@ static HRESULT volume_init(struct wined3d_volume *volume, struct wined3d_texture + } + + volume->texture_level = level; +- volume->locations = WINED3D_LOCATION_DISCARDED; ++ volume->resource.locations = WINED3D_LOCATION_DISCARDED; + + if (desc->pool == WINED3D_POOL_DEFAULT && desc->usage & WINED3DUSAGE_DYNAMIC + && gl_info->supported[ARB_PIXEL_BUFFER_OBJECT] +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index f24808b..57a048f 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -5,7 +5,7 @@ + * Copyright 2002-2003 Raphael Junqueira + * Copyright 2002-2003, 2004 Jason Edmeades + * Copyright 2005 Oliver Stieber +- * Copyright 2006-2011, 2013 Stefan Dösinger for CodeWeavers ++ * Copyright 2006-2011, 2013-2014 Stefan Dösinger for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public +@@ -2082,6 +2082,7 @@ struct wined3d_resource + void *heap_memory; + UINT custom_row_pitch, custom_slice_pitch; + struct list resource_list_entry; ++ DWORD locations; + + void *parent; + const struct wined3d_parent_ops *parent_ops; +@@ -2236,7 +2237,7 @@ struct wined3d_volume + struct wined3d_resource resource; + struct wined3d_texture *container; + +- DWORD flags, locations; ++ DWORD flags; + GLint texture_level; + DWORD download_count; + GLuint pbo; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0010-wined3d-Move-validate_location-to-resource.c.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0010-wined3d-Move-validate_location-to-resource.c.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0010-wined3d-Move-validate_location-to-resource.c.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0010-wined3d-Move-validate_location-to-resource.c.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,116 @@ +From 8b7f33e2323fa2acac3722c3a8a753b7a8f11db2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 3 Oct 2013 12:34:13 +0200 +Subject: wined3d: Move validate_location to resource.c. + +--- + dlls/wined3d/resource.c | 7 +++++++ + dlls/wined3d/volume.c | 19 ++++++------------- + dlls/wined3d/wined3d_private.h | 1 + + 3 files changed, 14 insertions(+), 13 deletions(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 8032a4c..bac15c0 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -332,6 +332,13 @@ void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) + resource->draw_binding = WINED3D_LOCATION_TEXTURE_RGB; + } + ++void wined3d_resource_validate_location(struct wined3d_resource *resource, DWORD location) ++{ ++ TRACE("Resource %p, setting %s.\n", resource, wined3d_debug_location(location)); ++ resource->locations |= location; ++ TRACE("new location flags are %s.\n", wined3d_debug_location(resource->locations)); ++} ++ + void CDECL wined3d_resource_get_pitch(const struct wined3d_resource *resource, UINT *row_pitch, + UINT *slice_pitch) + { +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index ea56b38..6bc2724 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -98,13 +98,6 @@ void wined3d_volume_upload_data(struct wined3d_volume *volume, const struct wine + HeapFree(GetProcessHeap(), 0, mem); + } + +-static void wined3d_volume_validate_location(struct wined3d_volume *volume, DWORD location) +-{ +- TRACE("Volume %p, setting %s.\n", volume, wined3d_debug_location(location)); +- volume->resource.locations |= location; +- TRACE("new location flags are %s.\n", wined3d_debug_location(volume->resource.locations)); +-} +- + void wined3d_volume_invalidate_location(struct wined3d_volume *volume, DWORD location) + { + TRACE("Volume %p, clearing %s.\n", volume, wined3d_debug_location(location)); +@@ -270,7 +263,7 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume, + FIXME("Implement texture loading from %s.\n", wined3d_debug_location(volume->resource.locations)); + return; + } +- wined3d_volume_validate_location(volume, location); ++ wined3d_resource_validate_location(&volume->resource, location); + + if (wined3d_volume_can_evict(volume)) + wined3d_volume_evict_sysmem(volume); +@@ -304,7 +297,7 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume, + wined3d_debug_location(volume->resource.locations)); + return; + } +- wined3d_volume_validate_location(volume, WINED3D_LOCATION_SYSMEM); ++ wined3d_resource_validate_location(&volume->resource, WINED3D_LOCATION_SYSMEM); + break; + + case WINED3D_LOCATION_BUFFER: +@@ -333,7 +326,7 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume, + wined3d_debug_location(volume->resource.locations)); + return; + } +- wined3d_volume_validate_location(volume, WINED3D_LOCATION_BUFFER); ++ wined3d_resource_validate_location(&volume->resource, WINED3D_LOCATION_BUFFER); + break; + + default: +@@ -412,7 +405,7 @@ static void volume_unload(struct wined3d_resource *resource) + else + { + ERR("Out of memory when unloading volume %p.\n", volume); +- wined3d_volume_validate_location(volume, WINED3D_LOCATION_DISCARDED); ++ wined3d_resource_validate_location(&volume->resource, WINED3D_LOCATION_DISCARDED); + wined3d_volume_invalidate_location(volume, ~WINED3D_LOCATION_DISCARDED); + } + +@@ -558,7 +551,7 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + + wined3d_volume_prepare_pbo(volume, context); + if (flags & WINED3D_MAP_DISCARD) +- wined3d_volume_validate_location(volume, WINED3D_LOCATION_BUFFER); ++ wined3d_resource_validate_location(&volume->resource, WINED3D_LOCATION_BUFFER); + else + wined3d_volume_load_location(volume, context, WINED3D_LOCATION_BUFFER); + +@@ -593,7 +586,7 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + + if (flags & WINED3D_MAP_DISCARD) + { +- wined3d_volume_validate_location(volume, WINED3D_LOCATION_SYSMEM); ++ wined3d_resource_validate_location(&volume->resource, WINED3D_LOCATION_SYSMEM); + } + else if (!(volume->resource.locations & WINED3D_LOCATION_SYSMEM)) + { +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 57a048f..0c698b6 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2114,6 +2114,7 @@ GLenum wined3d_resource_gl_legacy_map_flags(DWORD d3d_flags) DECLSPEC_HIDDEN; + BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + DWORD wined3d_resource_sanitize_map_flags(const struct wined3d_resource *resource, DWORD flags) DECLSPEC_HIDDEN; + void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++void wined3d_resource_validate_location(struct wined3d_resource *resource, DWORD location) DECLSPEC_HIDDEN; + + /* Tests show that the start address of resources is 32 byte aligned */ + #define RESOURCE_ALIGNMENT 16 +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0011-wined3d-Move-surface-locations-into-the-resource.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0011-wined3d-Move-surface-locations-into-the-resource.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0011-wined3d-Move-surface-locations-into-the-resource.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0011-wined3d-Move-surface-locations-into-the-resource.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,457 @@ +From 298ba6d476f8f76000f879b2ca61ff1fd0e810ff Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 21 Jan 2014 12:22:30 +0100 +Subject: wined3d: Move surface locations into the resource. + +--- + dlls/wined3d/arb_program_shader.c | 2 +- + dlls/wined3d/device.c | 4 +- + dlls/wined3d/drawprim.c | 2 +- + dlls/wined3d/surface.c | 99 ++++++++++++++++++++------------------- + dlls/wined3d/swapchain.c | 4 +- + dlls/wined3d/wined3d_private.h | 1 - + 6 files changed, 56 insertions(+), 56 deletions(-) + +diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c +index bc66c4a..c1b3b6d 100644 +--- a/dlls/wined3d/arb_program_shader.c ++++ b/dlls/wined3d/arb_program_shader.c +@@ -7649,7 +7649,7 @@ HRESULT arbfp_blit_surface(struct wined3d_device *device, DWORD filter, + + /* Now load the surface */ + if (wined3d_settings.offscreen_rendering_mode != ORM_FBO +- && (src_surface->locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_DRAWABLE)) ++ && (src_surface->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_DRAWABLE)) + == WINED3D_LOCATION_DRAWABLE + && !wined3d_resource_is_offscreen(&src_surface->container->resource)) + { +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 0b4c6f9..01ccd9d 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -236,7 +236,7 @@ static void prepare_ds_clear(struct wined3d_surface *ds, struct wined3d_context + { + RECT current_rect, r; + +- if (ds->locations & WINED3D_LOCATION_DISCARDED) ++ if (ds->resource.locations & WINED3D_LOCATION_DISCARDED) + { + /* Depth buffer was discarded, make it entirely current in its new location since + * there is no other place where we would get data anyway. */ +@@ -244,7 +244,7 @@ static void prepare_ds_clear(struct wined3d_surface *ds, struct wined3d_context + return; + } + +- if (ds->locations & location) ++ if (ds->resource.locations & location) + SetRect(¤t_rect, 0, 0, + ds->ds_current_size.cx, + ds->ds_current_size.cy); +diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c +index 2d39a83..7034b25 100644 +--- a/dlls/wined3d/drawprim.c ++++ b/dlls/wined3d/drawprim.c +@@ -648,7 +648,7 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co + if (!context->render_offscreen && ds != device->onscreen_depth_stencil) + device_switch_onscreen_ds(device, context, ds); + +- if (ds->locations & location) ++ if (ds->resource.locations & location) + SetRect(¤t_rect, 0, 0, ds->ds_current_size.cx, ds->ds_current_size.cy); + else + SetRectEmpty(¤t_rect); +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 8a14169..c44179f 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -556,7 +556,7 @@ static void surface_prepare_system_memory(struct wined3d_surface *surface) + if (!wined3d_resource_allocate_sysmem(&surface->resource)) + ERR("Failed to allocate system memory.\n"); + +- if (surface->locations & WINED3D_LOCATION_SYSMEM) ++ if (surface->resource.locations & WINED3D_LOCATION_SYSMEM) + ERR("Surface without system memory has WINED3D_LOCATION_SYSMEM set.\n"); + } + +@@ -706,7 +706,7 @@ static HRESULT surface_private_setup(struct wined3d_surface *surface) + } + + if (surface->resource.usage & WINED3DUSAGE_DEPTHSTENCIL) +- surface->locations = WINED3D_LOCATION_DISCARDED; ++ surface->resource.locations = WINED3D_LOCATION_DISCARDED; + + if (surface_use_pbo(surface)) + surface->resource.map_binding = WINED3D_LOCATION_BUFFER; +@@ -746,7 +746,7 @@ static void surface_unmap(struct wined3d_surface *surface) + ERR("Unexpected map binding %s.\n", wined3d_debug_location(surface->resource.map_binding)); + } + +- if (surface->locations & (WINED3D_LOCATION_DRAWABLE | WINED3D_LOCATION_TEXTURE_RGB)) ++ if (surface->resource.locations & (WINED3D_LOCATION_DRAWABLE | WINED3D_LOCATION_TEXTURE_RGB)) + { + TRACE("Not dirtified, nothing to do.\n"); + return; +@@ -1726,7 +1726,7 @@ HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const P + surface_load_location(dst_surface, context, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_texture_bind(dst_surface->container, context, FALSE); + +- surface_get_memory(src_surface, &data, src_surface->locations); ++ surface_get_memory(src_surface, &data, src_surface->resource.locations); + wined3d_resource_get_pitch(&src_surface->resource, &src_row_pitch, &src_slice_pitch); + + surface_upload_data(dst_surface, gl_info, src_format, src_rect, src_row_pitch, dst_point, FALSE, &data); +@@ -1872,7 +1872,7 @@ void surface_load(struct wined3d_surface *surface, struct wined3d_context *conte + if (ck_changed) + wined3d_texture_force_reload(surface->container); + } +- else if (!(surface->locations & location)) ++ else if (!(surface->resource.locations & location)) + { + TRACE("Reloading because surface is dirty.\n"); + } +@@ -2186,7 +2186,7 @@ HRESULT wined3d_surface_update_desc(struct wined3d_surface *surface, + create_dib = TRUE; + } + +- surface->locations = 0; ++ surface->resource.locations = 0; + wined3d_resource_free_sysmem(&surface->resource); + + width = texture_resource->width; +@@ -3088,9 +3088,9 @@ void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) + back->flags = front->flags; + front->flags = tmp_flags; + +- tmp_flags = back->locations; +- back->locations = front->locations; +- front->locations = tmp_flags; ++ tmp_flags = back->resource.locations; ++ back->resource.locations = front->resource.locations; ++ front->resource.locations = tmp_flags; + } + } + +@@ -3269,7 +3269,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st + checkGLcall("glEnable(texture_target)"); + + /* For now invalidate the texture copy of the back buffer. Drawable and sysmem copy are untouched */ +- src_surface->locations &= ~WINED3D_LOCATION_TEXTURE_RGB; ++ src_surface->resource.locations &= ~WINED3D_LOCATION_TEXTURE_RGB; + } + + /* Make sure that the top pixel is always above the bottom pixel, and keep a separate upside down flag +@@ -3863,13 +3863,14 @@ void surface_modify_ds_location(struct wined3d_surface *surface, + { + TRACE("surface %p, new location %#x, w %u, h %u.\n", surface, location, w, h); + +- if (((surface->locations & WINED3D_LOCATION_TEXTURE_RGB) && !(location & WINED3D_LOCATION_TEXTURE_RGB)) +- || (!(surface->locations & WINED3D_LOCATION_TEXTURE_RGB) && (location & WINED3D_LOCATION_TEXTURE_RGB))) ++ if (((surface->resource.locations & WINED3D_LOCATION_TEXTURE_RGB) && !(location & WINED3D_LOCATION_TEXTURE_RGB)) ++ || (!(surface->resource.locations & WINED3D_LOCATION_TEXTURE_RGB) ++ && (location & WINED3D_LOCATION_TEXTURE_RGB))) + wined3d_texture_set_dirty(surface->container); + + surface->ds_current_size.cx = w; + surface->ds_current_size.cy = h; +- surface->locations = location; ++ surface->resource.locations = location; + } + + /* Context activation is done by the caller. */ +@@ -3884,7 +3885,7 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co + /* TODO: Make this work for modes other than FBO */ + if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) return; + +- if (!(surface->locations & location)) ++ if (!(surface->resource.locations & location)) + { + w = surface->ds_current_size.cx; + h = surface->ds_current_size.cy; +@@ -3910,7 +3911,7 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co + return; + } + +- if (surface->locations & WINED3D_LOCATION_DISCARDED) ++ if (surface->resource.locations & WINED3D_LOCATION_DISCARDED) + { + TRACE("Surface was discarded, no need copy data.\n"); + switch (location) +@@ -3927,17 +3928,17 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co + default: + FIXME("Unhandled location %#x\n", location); + } +- surface->locations &= ~WINED3D_LOCATION_DISCARDED; +- surface->locations |= location; ++ surface->resource.locations &= ~WINED3D_LOCATION_DISCARDED; ++ surface->resource.locations |= location; + surface->ds_current_size.cx = surface->resource.width; + surface->ds_current_size.cy = surface->resource.height; + return; + } + +- if (!surface->locations) ++ if (!surface->resource.locations) + { + FIXME("No up to date depth stencil location.\n"); +- surface->locations |= location; ++ surface->resource.locations |= location; + surface->ds_current_size.cx = surface->resource.width; + surface->ds_current_size.cy = surface->resource.height; + return; +@@ -4026,7 +4027,7 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co + ERR("Invalid location (%#x) specified.\n", location); + } + +- surface->locations |= location; ++ surface->resource.locations |= location; + surface->ds_current_size.cx = surface->resource.width; + surface->ds_current_size.cy = surface->resource.height; + } +@@ -4035,7 +4036,7 @@ void surface_validate_location(struct wined3d_surface *surface, DWORD location) + { + TRACE("surface %p, location %s.\n", surface, wined3d_debug_location(location)); + +- surface->locations |= location; ++ surface->resource.locations |= location; + } + + void surface_invalidate_location(struct wined3d_surface *surface, DWORD location) +@@ -4044,9 +4045,9 @@ void surface_invalidate_location(struct wined3d_surface *surface, DWORD location + + if (location & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) + wined3d_texture_set_dirty(surface->container); +- surface->locations &= ~location; ++ surface->resource.locations &= ~location; + +- if (!surface->locations) ++ if (!surface->resource.locations) + ERR("Surface %p does not have any up to date location.\n", surface); + } + +@@ -4082,7 +4083,7 @@ static void surface_copy_simple_location(struct wined3d_surface *surface, DWORD + UINT size = surface->resource.size; + + surface_get_memory(surface, &dst, location); +- surface_get_memory(surface, &src, surface->locations); ++ surface_get_memory(surface, &src, surface->resource.locations); + + if (dst.buffer_object) + { +@@ -4115,33 +4116,33 @@ static void surface_load_sysmem(struct wined3d_surface *surface, + { + const struct wined3d_gl_info *gl_info = context->gl_info; + +- if (surface->locations & surface_simple_locations) ++ if (surface->resource.locations & surface_simple_locations) + { + surface_copy_simple_location(surface, dst_location); + return; + } + +- if (surface->locations & (WINED3D_LOCATION_RB_MULTISAMPLE | WINED3D_LOCATION_RB_RESOLVED)) ++ if (surface->resource.locations & (WINED3D_LOCATION_RB_MULTISAMPLE | WINED3D_LOCATION_RB_RESOLVED)) + surface_load_location(surface, context, WINED3D_LOCATION_TEXTURE_RGB); + + /* Download the surface to system memory. */ +- if (surface->locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) ++ if (surface->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) + { + wined3d_texture_bind_and_dirtify(surface->container, context, +- !(surface->locations & WINED3D_LOCATION_TEXTURE_RGB)); ++ !(surface->resource.locations & WINED3D_LOCATION_TEXTURE_RGB)); + surface_download_data(surface, gl_info, dst_location); + + return; + } + +- if (surface->locations & WINED3D_LOCATION_DRAWABLE) ++ if (surface->resource.locations & WINED3D_LOCATION_DRAWABLE) + { + read_from_framebuffer(surface, context, dst_location); + return; + } + + FIXME("Can't load surface %p with location flags %s into sysmem.\n", +- surface, wined3d_debug_location(surface->locations)); ++ surface, wined3d_debug_location(surface->resource.locations)); + } + + /* Context activation is done by the caller. */ +@@ -4181,14 +4182,14 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + + if (wined3d_settings.offscreen_rendering_mode != ORM_FBO + && wined3d_resource_is_offscreen(&texture->resource) +- && (surface->locations & WINED3D_LOCATION_DRAWABLE)) ++ && (surface->resource.locations & WINED3D_LOCATION_DRAWABLE)) + { + surface_load_fb_texture(surface, srgb); + + return WINED3D_OK; + } + +- if (surface->locations & (WINED3D_LOCATION_TEXTURE_SRGB | WINED3D_LOCATION_TEXTURE_RGB) ++ if (surface->resource.locations & (WINED3D_LOCATION_TEXTURE_SRGB | WINED3D_LOCATION_TEXTURE_RGB) + && (surface->resource.format->flags & WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB) + && fbo_blit_supported(gl_info, WINED3D_BLIT_OP_COLOR_BLIT, + NULL, surface->resource.usage, surface->resource.pool, surface->resource.format, +@@ -4204,13 +4205,13 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + return WINED3D_OK; + } + +- if (surface->locations & (WINED3D_LOCATION_RB_MULTISAMPLE | WINED3D_LOCATION_RB_RESOLVED) ++ if (surface->resource.locations & (WINED3D_LOCATION_RB_MULTISAMPLE | WINED3D_LOCATION_RB_RESOLVED) + && (!srgb || (surface->resource.format->flags & WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB)) + && fbo_blit_supported(gl_info, WINED3D_BLIT_OP_COLOR_BLIT, + NULL, surface->resource.usage, surface->resource.pool, surface->resource.format, + NULL, surface->resource.usage, surface->resource.pool, surface->resource.format)) + { +- DWORD src_location = surface->locations & WINED3D_LOCATION_RB_RESOLVED ? ++ DWORD src_location = surface->resource.locations & WINED3D_LOCATION_RB_RESOLVED ? + WINED3D_LOCATION_RB_RESOLVED : WINED3D_LOCATION_RB_MULTISAMPLE; + DWORD dst_location = srgb ? WINED3D_LOCATION_TEXTURE_SRGB : WINED3D_LOCATION_TEXTURE_RGB; + RECT rect = {0, 0, surface->resource.width, surface->resource.height}; +@@ -4225,7 +4226,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + + if (srgb) + { +- if ((surface->locations & (WINED3D_LOCATION_TEXTURE_RGB | surface->resource.map_binding)) ++ if ((surface->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | surface->resource.map_binding)) + == WINED3D_LOCATION_TEXTURE_RGB) + { + /* Performance warning... */ +@@ -4236,7 +4237,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + } + else + { +- if ((surface->locations & (WINED3D_LOCATION_TEXTURE_SRGB | surface->resource.map_binding)) ++ if ((surface->resource.locations & (WINED3D_LOCATION_TEXTURE_SRGB | surface->resource.map_binding)) + == WINED3D_LOCATION_TEXTURE_SRGB) + { + /* Performance warning... */ +@@ -4246,7 +4247,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + } + } + +- if (!(surface->locations & surface_simple_locations)) ++ if (!(surface->resource.locations & surface_simple_locations)) + { + WARN("Trying to load a texture from sysmem, but no simple location is valid.\n"); + /* Lets hope we get it from somewhere... */ +@@ -4288,7 +4289,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + surface_remove_pbo(surface, gl_info); + } + +- surface_get_memory(surface, &data, surface->locations); ++ surface_get_memory(surface, &data, surface->resource.locations); + if (format.convert) + { + /* This code is entered for texture formats which need a fixup. */ +@@ -4344,7 +4345,7 @@ static void surface_multisample_resolve(struct wined3d_surface *surface, struct + { + RECT rect = {0, 0, surface->resource.width, surface->resource.height}; + +- if (!(surface->locations & WINED3D_LOCATION_RB_MULTISAMPLE)) ++ if (!(surface->resource.locations & WINED3D_LOCATION_RB_MULTISAMPLE)) + ERR("Trying to resolve multisampled surface %p, but location WINED3D_LOCATION_RB_MULTISAMPLE not current.\n", + surface); + +@@ -4362,12 +4363,12 @@ void surface_load_location(struct wined3d_surface *surface, struct wined3d_conte + if (surface->resource.usage & WINED3DUSAGE_DEPTHSTENCIL) + { + if (location == WINED3D_LOCATION_TEXTURE_RGB +- && surface->locations & (WINED3D_LOCATION_DRAWABLE | WINED3D_LOCATION_DISCARDED)) ++ && surface->resource.locations & (WINED3D_LOCATION_DRAWABLE | WINED3D_LOCATION_DISCARDED)) + { + surface_load_ds_location(surface, context, location); + return; + } +- else if (location & surface->locations ++ else if (location & surface->resource.locations + && surface->container->resource.draw_binding != WINED3D_LOCATION_DRAWABLE) + { + /* Already up to date, nothing to do. */ +@@ -4376,12 +4377,12 @@ void surface_load_location(struct wined3d_surface *surface, struct wined3d_conte + else + { + FIXME("Unimplemented copy from %s to %s for depth/stencil buffers.\n", +- wined3d_debug_location(surface->locations), wined3d_debug_location(location)); ++ wined3d_debug_location(surface->resource.locations), wined3d_debug_location(location)); + return; + } + } + +- if (surface->locations & location) ++ if (surface->resource.locations & location) + { + TRACE("Location already up to date.\n"); + return; +@@ -4395,7 +4396,7 @@ void surface_load_location(struct wined3d_surface *surface, struct wined3d_conte + required_access, surface->resource.access_flags); + } + +- if (!surface->locations) ++ if (!surface->resource.locations) + { + ERR("Surface %p does not have any up to date location.\n", surface); + surface->flags |= SFLAG_LOST; +@@ -4434,7 +4435,7 @@ void surface_load_location(struct wined3d_surface *surface, struct wined3d_conte + + surface_validate_location(surface, location); + +- if (location != WINED3D_LOCATION_SYSMEM && (surface->locations & WINED3D_LOCATION_SYSMEM)) ++ if (location != WINED3D_LOCATION_SYSMEM && (surface->resource.locations & WINED3D_LOCATION_SYSMEM)) + surface_evict_sysmem(surface); + + return; +@@ -5439,8 +5440,8 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + { + /* In principle this would apply to depth blits as well, but we don't + * implement those in the CPU blitter at the moment. */ +- if ((dst_surface->locations & dst_surface->resource.map_binding) +- && (!src_surface || (src_surface->locations & src_surface->resource.map_binding))) ++ if ((dst_surface->resource.locations & dst_surface->resource.map_binding) ++ && (!src_surface || (src_surface->resource.locations & src_surface->resource.map_binding))) + { + if (scale) + TRACE("Not doing sysmem blit because of scaling.\n"); +@@ -5467,8 +5468,8 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + TRACE("Color blit.\n"); + + /* Upload */ +- if ((src_surface->locations & WINED3D_LOCATION_SYSMEM) +- && !(dst_surface->locations & WINED3D_LOCATION_SYSMEM)) ++ if ((src_surface->resource.locations & WINED3D_LOCATION_SYSMEM) ++ && !(dst_surface->resource.locations & WINED3D_LOCATION_SYSMEM)) + { + if (scale) + TRACE("Not doing upload because of scaling.\n"); +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index d742b11..601d3ad 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -555,8 +555,8 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + } + + front = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0)); +- if (!swapchain->render_to_fbo && ((front->locations & WINED3D_LOCATION_SYSMEM) +- || (back_buffer->locations & WINED3D_LOCATION_SYSMEM))) ++ if (!swapchain->render_to_fbo && ((front->resource.locations & WINED3D_LOCATION_SYSMEM) ++ || (back_buffer->resource.locations & WINED3D_LOCATION_SYSMEM))) + { + /* Both memory copies of the surfaces are ok, flip them around too instead of dirtifying + * Doesn't work with render_to_fbo because we're not flipping +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 0c698b6..4011833 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2297,7 +2297,6 @@ struct wined3d_surface + const struct wined3d_surface_ops *surface_ops; + struct wined3d_texture *container; + void *user_memory; +- DWORD locations; + + DWORD flags; + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0012-wined3d-Remove-surface_validate_location.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0012-wined3d-Remove-surface_validate_location.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0012-wined3d-Remove-surface_validate_location.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0012-wined3d-Remove-surface_validate_location.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,217 @@ +From a15ccac8ee6ece2955548900f4e7b4a993a498b2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 4 Jan 2014 00:53:47 +0100 +Subject: wined3d: Remove surface_validate_location. + +--- + dlls/wined3d/arb_program_shader.c | 2 +- + dlls/wined3d/device.c | 2 +- + dlls/wined3d/surface.c | 29 +++++++++++------------------ + dlls/wined3d/swapchain.c | 12 ++++++------ + dlls/wined3d/wined3d_private.h | 1 - + 5 files changed, 19 insertions(+), 27 deletions(-) + +diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c +index c1b3b6d..08f92cb 100644 +--- a/dlls/wined3d/arb_program_shader.c ++++ b/dlls/wined3d/arb_program_shader.c +@@ -7686,7 +7686,7 @@ HRESULT arbfp_blit_surface(struct wined3d_device *device, DWORD filter, + + context_release(context); + +- surface_validate_location(dst_surface, dst_surface->container->resource.draw_binding); ++ wined3d_resource_validate_location(&dst_surface->resource, dst_surface->container->resource.draw_binding); + surface_invalidate_location(dst_surface, ~dst_surface->container->resource.draw_binding); + + return WINED3D_OK; +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 01ccd9d..e10ea1c 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -392,7 +392,7 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c + + if (rt) + { +- surface_validate_location(rt, rt->container->resource.draw_binding); ++ wined3d_resource_validate_location(&rt->resource, rt->container->resource.draw_binding); + surface_invalidate_location(rt, ~rt->container->resource.draw_binding); + } + } +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index c44179f..b56796e 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -1224,7 +1224,7 @@ static void surface_unload(struct wined3d_resource *resource) + * and all flags get lost */ + surface_prepare_system_memory(surface); + memset(surface->resource.heap_memory, 0, surface->resource.size); +- surface_validate_location(surface, WINED3D_LOCATION_SYSMEM); ++ wined3d_resource_validate_location(&surface->resource, WINED3D_LOCATION_SYSMEM); + surface_invalidate_location(surface, ~WINED3D_LOCATION_SYSMEM); + + /* We also get here when the ddraw swapchain is destroyed, for example +@@ -1735,7 +1735,7 @@ HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const P + + context_release(context); + +- surface_validate_location(dst_surface, WINED3D_LOCATION_TEXTURE_RGB); ++ wined3d_resource_validate_location(&dst_surface->resource, WINED3D_LOCATION_TEXTURE_RGB); + surface_invalidate_location(dst_surface, ~WINED3D_LOCATION_TEXTURE_RGB); + + return WINED3D_OK; +@@ -2253,7 +2253,7 @@ HRESULT wined3d_surface_update_desc(struct wined3d_surface *surface, + valid_location = WINED3D_LOCATION_SYSMEM; + } + +- surface_validate_location(surface, valid_location); ++ wined3d_resource_validate_location(&surface->resource, valid_location); + + return WINED3D_OK; + } +@@ -2645,7 +2645,7 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + { + TRACE("WINED3D_MAP_DISCARD flag passed, marking %s as up to date.\n", + wined3d_debug_location(surface->resource.map_binding)); +- surface_validate_location(surface, surface->resource.map_binding); ++ wined3d_resource_validate_location(&surface->resource, surface->resource.map_binding); + } + else + { +@@ -3200,7 +3200,7 @@ static void fb_copy_to_texture_direct(struct wined3d_surface *dst_surface, struc + + /* The texture is now most up to date - If the surface is a render target + * and has a drawable, this path is never entered. */ +- surface_validate_location(dst_surface, WINED3D_LOCATION_TEXTURE_RGB); ++ wined3d_resource_validate_location(&dst_surface->resource, WINED3D_LOCATION_TEXTURE_RGB); + surface_invalidate_location(dst_surface, ~WINED3D_LOCATION_TEXTURE_RGB); + } + +@@ -3474,7 +3474,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st + + /* The texture is now most up to date - If the surface is a render target + * and has a drawable, this path is never entered. */ +- surface_validate_location(dst_surface, WINED3D_LOCATION_TEXTURE_RGB); ++ wined3d_resource_validate_location(&dst_surface->resource, WINED3D_LOCATION_TEXTURE_RGB); + surface_invalidate_location(dst_surface, ~WINED3D_LOCATION_TEXTURE_RGB); + } + +@@ -3787,7 +3787,7 @@ static HRESULT surface_blt_special(struct wined3d_surface *dst_surface, const RE + wined3d_texture_set_color_key(src_surface->container, WINEDDSD_CKSRCBLT, + (old_color_key_flags & WINEDDSD_CKSRCBLT) ? &old_blt_key : NULL); + +- surface_validate_location(dst_surface, dst_surface->container->resource.draw_binding); ++ wined3d_resource_validate_location(&dst_surface->resource, dst_surface->container->resource.draw_binding); + surface_invalidate_location(dst_surface, ~dst_surface->container->resource.draw_binding); + + return WINED3D_OK; +@@ -4032,13 +4032,6 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co + surface->ds_current_size.cy = surface->resource.height; + } + +-void surface_validate_location(struct wined3d_surface *surface, DWORD location) +-{ +- TRACE("surface %p, location %s.\n", surface, wined3d_debug_location(location)); +- +- surface->resource.locations |= location; +-} +- + void surface_invalidate_location(struct wined3d_surface *surface, DWORD location) + { + TRACE("surface %p, location %s.\n", surface, wined3d_debug_location(location)); +@@ -4433,7 +4426,7 @@ void surface_load_location(struct wined3d_surface *surface, struct wined3d_conte + break; + } + +- surface_validate_location(surface, location); ++ wined3d_resource_validate_location(&surface->resource, location); + + if (location != WINED3D_LOCATION_SYSMEM && (surface->resource.locations & WINED3D_LOCATION_SYSMEM)) + surface_evict_sysmem(surface); +@@ -5528,7 +5521,7 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + dst_surface, dst_surface->container->resource.draw_binding, &dst_rect); + context_release(context); + +- surface_validate_location(dst_surface, dst_surface->container->resource.draw_binding); ++ wined3d_resource_validate_location(&dst_surface->resource, dst_surface->container->resource.draw_binding); + surface_invalidate_location(dst_surface, ~dst_surface->container->resource.draw_binding); + + return WINED3D_OK; +@@ -5625,7 +5618,7 @@ static HRESULT surface_init(struct wined3d_surface *surface, struct wined3d_text + } + + surface->container = container; +- surface_validate_location(surface, WINED3D_LOCATION_SYSMEM); ++ wined3d_resource_validate_location(&surface->resource, WINED3D_LOCATION_SYSMEM); + list_init(&surface->renderbuffers); + list_init(&surface->overlays); + +@@ -5657,7 +5650,7 @@ static HRESULT surface_init(struct wined3d_surface *surface, struct wined3d_text + if (surface->resource.map_binding == WINED3D_LOCATION_DIB) + { + wined3d_resource_free_sysmem(&surface->resource); +- surface_validate_location(surface, WINED3D_LOCATION_DIB); ++ wined3d_resource_validate_location(&surface->resource, WINED3D_LOCATION_DIB); + surface_invalidate_location(surface, WINED3D_LOCATION_SYSMEM); + } + +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index 601d3ad..bdb4b67 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -569,19 +569,19 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + /* Tell the front buffer surface that is has been modified. However, + * the other locations were preserved during that, so keep the flags. + * This serves to update the emulated overlay, if any. */ +- surface_validate_location(front, WINED3D_LOCATION_DRAWABLE); ++ wined3d_resource_validate_location(&front->resource, WINED3D_LOCATION_DRAWABLE); + } + else + { +- surface_validate_location(front, WINED3D_LOCATION_DRAWABLE); ++ wined3d_resource_validate_location(&front->resource, WINED3D_LOCATION_DRAWABLE); + surface_invalidate_location(front, ~WINED3D_LOCATION_DRAWABLE); +- surface_validate_location(back_buffer, WINED3D_LOCATION_DRAWABLE); ++ wined3d_resource_validate_location(&back_buffer->resource, WINED3D_LOCATION_DRAWABLE); + surface_invalidate_location(back_buffer, ~WINED3D_LOCATION_DRAWABLE); + } + } + else + { +- surface_validate_location(front, WINED3D_LOCATION_DRAWABLE); ++ wined3d_resource_validate_location(&front->resource, WINED3D_LOCATION_DRAWABLE); + surface_invalidate_location(front, ~WINED3D_LOCATION_DRAWABLE); + /* If the swapeffect is DISCARD, the back buffer is undefined. That means the SYSMEM + * and INTEXTURE copies can keep their old content if they have any defined content. +@@ -590,7 +590,7 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + */ + if (swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_FLIP) + { +- surface_validate_location(back_buffer, back_buffer->container->resource.draw_binding); ++ wined3d_resource_validate_location(&back_buffer->resource, back_buffer->container->resource.draw_binding); + surface_invalidate_location(back_buffer, ~back_buffer->container->resource.draw_binding); + } + } +@@ -865,7 +865,7 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3 + wined3d_texture_set_swapchain(swapchain->front_buffer, swapchain); + if (!(device->wined3d->flags & WINED3D_NO3D)) + { +- surface_validate_location(front_buffer, WINED3D_LOCATION_DRAWABLE); ++ wined3d_resource_validate_location(&front_buffer->resource, WINED3D_LOCATION_DRAWABLE); + surface_invalidate_location(front_buffer, ~WINED3D_LOCATION_DRAWABLE); + } + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 4011833..5ca3ab8 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2368,7 +2368,6 @@ HRESULT wined3d_surface_update_desc(struct wined3d_surface *surface, + const struct wined3d_gl_info *gl_info, void *mem, unsigned int pitch) DECLSPEC_HIDDEN; + HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const POINT *dst_point, + struct wined3d_surface *src_surface, const RECT *src_rect) DECLSPEC_HIDDEN; +-void surface_validate_location(struct wined3d_surface *surface, DWORD location) DECLSPEC_HIDDEN; + HRESULT wined3d_surface_create(struct wined3d_texture *container, const struct wined3d_resource_desc *desc, + GLenum target, unsigned int level, unsigned int layer, DWORD flags, + struct wined3d_surface **surface) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0013-wined3d-Move-invalidate_location-to-resource.c.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0013-wined3d-Move-invalidate_location-to-resource.c.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0013-wined3d-Move-invalidate_location-to-resource.c.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0013-wined3d-Move-invalidate_location-to-resource.c.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,161 @@ +From c7669f4cc8e98c81027cd1c2392d3435ec534206 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 3 Oct 2013 12:36:46 +0200 +Subject: wined3d: Move invalidate_location to resource.c. + +--- + dlls/wined3d/device.c | 2 +- + dlls/wined3d/resource.c | 7 +++++++ + dlls/wined3d/texture.c | 4 +--- + dlls/wined3d/volume.c | 21 +++++++-------------- + dlls/wined3d/wined3d_private.h | 2 +- + 5 files changed, 17 insertions(+), 19 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index e10ea1c..600afed 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -3487,7 +3487,7 @@ static HRESULT device_update_volume(struct wined3d_device *device, + data.buffer_object = 0; + data.addr = src.data; + wined3d_volume_upload_data(dst_volume, context, &data); +- wined3d_volume_invalidate_location(dst_volume, ~WINED3D_LOCATION_TEXTURE_RGB); ++ wined3d_resource_invalidate_location(&dst_volume->resource, ~WINED3D_LOCATION_TEXTURE_RGB); + + context_release(context); + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index bac15c0..1ec27d3 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -339,6 +339,13 @@ void wined3d_resource_validate_location(struct wined3d_resource *resource, DWORD + TRACE("new location flags are %s.\n", wined3d_debug_location(resource->locations)); + } + ++void wined3d_resource_invalidate_location(struct wined3d_resource *resource, DWORD location) ++{ ++ TRACE("Resource %p, setting %s.\n", resource, wined3d_debug_location(location)); ++ resource->locations &= ~location; ++ TRACE("new location flags are %s.\n", wined3d_debug_location(resource->locations)); ++} ++ + void CDECL wined3d_resource_get_pitch(const struct wined3d_resource *resource, UINT *row_pitch, + UINT *slice_pitch) + { +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index c173518..f003fa2 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -1286,9 +1286,7 @@ static void texture3d_sub_resource_cleanup(struct wined3d_resource *sub_resource + + static void texture3d_sub_resource_invalidate_location(struct wined3d_resource *sub_resource, DWORD location) + { +- struct wined3d_volume *volume = volume_from_resource(sub_resource); +- +- wined3d_volume_invalidate_location(volume, location); ++ wined3d_resource_invalidate_location(sub_resource, location); + } + + static void texture3d_prepare_texture(struct wined3d_texture *texture, struct wined3d_context *context, BOOL srgb) +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index 6bc2724..3b742d2 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -98,13 +98,6 @@ void wined3d_volume_upload_data(struct wined3d_volume *volume, const struct wine + HeapFree(GetProcessHeap(), 0, mem); + } + +-void wined3d_volume_invalidate_location(struct wined3d_volume *volume, DWORD location) +-{ +- TRACE("Volume %p, clearing %s.\n", volume, wined3d_debug_location(location)); +- volume->resource.locations &= ~location; +- TRACE("new location flags are %s.\n", wined3d_debug_location(volume->resource.locations)); +-} +- + /* Context activation is done by the caller. */ + static void wined3d_volume_download_data(struct wined3d_volume *volume, + const struct wined3d_context *context, const struct wined3d_bo_address *data) +@@ -140,7 +133,7 @@ static void wined3d_volume_download_data(struct wined3d_volume *volume, + static void wined3d_volume_evict_sysmem(struct wined3d_volume *volume) + { + wined3d_resource_free_sysmem(&volume->resource); +- wined3d_volume_invalidate_location(volume, WINED3D_LOCATION_SYSMEM); ++ wined3d_resource_invalidate_location(&volume->resource, WINED3D_LOCATION_SYSMEM); + } + + static DWORD volume_access_from_location(DWORD location) +@@ -238,7 +231,7 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume, + if (volume->resource.locations & WINED3D_LOCATION_DISCARDED) + { + TRACE("Volume previously discarded, nothing to do.\n"); +- wined3d_volume_invalidate_location(volume, WINED3D_LOCATION_DISCARDED); ++ wined3d_resource_invalidate_location(&volume->resource, WINED3D_LOCATION_DISCARDED); + } + else if (volume->resource.locations & WINED3D_LOCATION_SYSMEM) + { +@@ -277,7 +270,7 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume, + if (volume->resource.locations & WINED3D_LOCATION_DISCARDED) + { + TRACE("Volume previously discarded, nothing to do.\n"); +- wined3d_volume_invalidate_location(volume, WINED3D_LOCATION_DISCARDED); ++ wined3d_resource_invalidate_location(&volume->resource, WINED3D_LOCATION_DISCARDED); + } + else if (volume->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) + { +@@ -307,7 +300,7 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume, + if (volume->resource.locations & WINED3D_LOCATION_DISCARDED) + { + TRACE("Volume previously discarded, nothing to do.\n"); +- wined3d_volume_invalidate_location(volume, WINED3D_LOCATION_DISCARDED); ++ wined3d_resource_invalidate_location(&volume->resource, WINED3D_LOCATION_DISCARDED); + } + else if (volume->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) + { +@@ -400,13 +393,13 @@ static void volume_unload(struct wined3d_resource *resource) + context = context_acquire(device, NULL); + wined3d_volume_load_location(volume, context, WINED3D_LOCATION_SYSMEM); + context_release(context); +- wined3d_volume_invalidate_location(volume, ~WINED3D_LOCATION_SYSMEM); ++ wined3d_resource_invalidate_location(&volume->resource, ~WINED3D_LOCATION_SYSMEM); + } + else + { + ERR("Out of memory when unloading volume %p.\n", volume); + wined3d_resource_validate_location(&volume->resource, WINED3D_LOCATION_DISCARDED); +- wined3d_volume_invalidate_location(volume, ~WINED3D_LOCATION_DISCARDED); ++ wined3d_resource_invalidate_location(&volume->resource, ~WINED3D_LOCATION_DISCARDED); + } + + if (volume->pbo) +@@ -640,7 +633,7 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY))) + { + wined3d_texture_set_dirty(volume->container); +- wined3d_volume_invalidate_location(volume, ~volume->resource.map_binding); ++ wined3d_resource_invalidate_location(&volume->resource, ~volume->resource.map_binding); + } + + volume->resource.map_count++; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 5ca3ab8..fd28fa5 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2115,6 +2115,7 @@ BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource) DECLSPEC_H + DWORD wined3d_resource_sanitize_map_flags(const struct wined3d_resource *resource, DWORD flags) DECLSPEC_HIDDEN; + void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_validate_location(struct wined3d_resource *resource, DWORD location) DECLSPEC_HIDDEN; ++void wined3d_resource_invalidate_location(struct wined3d_resource *resource, DWORD location) DECLSPEC_HIDDEN; + + /* Tests show that the start address of resources is 32 byte aligned */ + #define RESOURCE_ALIGNMENT 16 +@@ -2255,7 +2256,6 @@ HRESULT wined3d_volume_create(struct wined3d_texture *container, const struct wi + void wined3d_volume_destroy(struct wined3d_volume *volume) DECLSPEC_HIDDEN; + void wined3d_volume_load(struct wined3d_volume *volume, struct wined3d_context *context, + BOOL srgb_mode) DECLSPEC_HIDDEN; +-void wined3d_volume_invalidate_location(struct wined3d_volume *volume, DWORD location) DECLSPEC_HIDDEN; + void wined3d_volume_upload_data(struct wined3d_volume *volume, const struct wined3d_context *context, + const struct wined3d_bo_address *data) DECLSPEC_HIDDEN; + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0014-wined3d-Invalidate-containers-via-callback.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0014-wined3d-Invalidate-containers-via-callback.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0014-wined3d-Invalidate-containers-via-callback.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0014-wined3d-Invalidate-containers-via-callback.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,144 @@ +From 39c0dd79f403ac4aac1cf660e207b0ed2703e81b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 17 Nov 2013 18:44:48 +0100 +Subject: wined3d: Invalidate containers via callback. + +--- + dlls/wined3d/buffer.c | 6 ++++++ + dlls/wined3d/resource.c | 2 ++ + dlls/wined3d/surface.c | 6 ++++++ + dlls/wined3d/texture.c | 6 ++++++ + dlls/wined3d/volume.c | 12 +++++++++--- + dlls/wined3d/wined3d_private.h | 1 + + 6 files changed, 30 insertions(+), 3 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index 989026f..d9bc820 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -1123,11 +1123,17 @@ static ULONG buffer_resource_decref(struct wined3d_resource *resource) + return wined3d_buffer_decref(buffer_from_resource(resource)); + } + ++static void wined3d_buffer_location_invalidated(struct wined3d_resource *resource, DWORD location) ++{ ++ ERR("Not yet implemented.\n"); ++} ++ + static const struct wined3d_resource_ops buffer_resource_ops = + { + buffer_resource_incref, + buffer_resource_decref, + buffer_unload, ++ wined3d_buffer_location_invalidated, + }; + + static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device *device, +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 1ec27d3..9d2db2b 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -344,6 +344,8 @@ void wined3d_resource_invalidate_location(struct wined3d_resource *resource, DWO + TRACE("Resource %p, setting %s.\n", resource, wined3d_debug_location(location)); + resource->locations &= ~location; + TRACE("new location flags are %s.\n", wined3d_debug_location(resource->locations)); ++ ++ resource->resource_ops->resource_location_invalidated(resource, location); + } + + void CDECL wined3d_resource_get_pitch(const struct wined3d_resource *resource, UINT *row_pitch, +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index b56796e..6c2698a 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -1273,11 +1273,17 @@ static void surface_unload(struct wined3d_resource *resource) + resource_unload(resource); + } + ++static void wined3d_surface_location_invalidated(struct wined3d_resource *resource, DWORD location) ++{ ++ ERR("Not yet implemented.\n"); ++} ++ + static const struct wined3d_resource_ops surface_resource_ops = + { + surface_resource_incref, + surface_resource_decref, + surface_unload, ++ wined3d_surface_location_invalidated, + }; + + static const struct wined3d_surface_ops surface_ops = +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index f003fa2..c42e475 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -986,11 +986,17 @@ static void wined3d_texture_unload(struct wined3d_resource *resource) + wined3d_texture_unload_gl_texture(texture); + } + ++static void wined3d_texture_load_location_invalidated(struct wined3d_resource *resource, DWORD location) ++{ ++ ERR("Should not be called on textures.\n"); ++} ++ + static const struct wined3d_resource_ops texture_resource_ops = + { + texture_resource_incref, + texture_resource_decref, + wined3d_texture_unload, ++ wined3d_texture_load_location_invalidated, + }; + + static HRESULT cubetexture_init(struct wined3d_texture *texture, const struct wined3d_resource_desc *desc, +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index 3b742d2..6921b87 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -631,10 +631,7 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + } + + if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY))) +- { +- wined3d_texture_set_dirty(volume->container); + wined3d_resource_invalidate_location(&volume->resource, ~volume->resource.map_binding); +- } + + volume->resource.map_count++; + +@@ -688,11 +685,20 @@ static ULONG volume_resource_decref(struct wined3d_resource *resource) + return wined3d_volume_decref(volume_from_resource(resource)); + } + ++static void wined3d_volume_location_invalidated(struct wined3d_resource *resource, DWORD location) ++{ ++ struct wined3d_volume *volume = volume_from_resource(resource); ++ ++ if (location & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) ++ wined3d_texture_set_dirty(volume->container); ++} ++ + static const struct wined3d_resource_ops volume_resource_ops = + { + volume_resource_incref, + volume_resource_decref, + volume_unload, ++ wined3d_volume_location_invalidated, + }; + + static HRESULT volume_init(struct wined3d_volume *volume, struct wined3d_texture *container, +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index fd28fa5..60d1b56 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2057,6 +2057,7 @@ struct wined3d_resource_ops + ULONG (*resource_incref)(struct wined3d_resource *resource); + ULONG (*resource_decref)(struct wined3d_resource *resource); + void (*resource_unload)(struct wined3d_resource *resource); ++ void (*resource_location_invalidated)(struct wined3d_resource *resource, DWORD location); + }; + + struct wined3d_resource +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0015-wined3d-Remove-surface_invalidate_location.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0015-wined3d-Remove-surface_invalidate_location.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0015-wined3d-Remove-surface_invalidate_location.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0015-wined3d-Remove-surface_invalidate_location.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,327 @@ +From 421ef7716a0748076fd14bb607849f81ab149679 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 4 Jan 2014 01:02:15 +0100 +Subject: wined3d: Remove surface_invalidate_location. + +--- + dlls/wined3d/arb_program_shader.c | 2 +- + dlls/wined3d/context.c | 2 +- + dlls/wined3d/device.c | 2 +- + dlls/wined3d/drawprim.c | 2 +- + dlls/wined3d/surface.c | 47 ++++++++++++++++----------------------- + dlls/wined3d/swapchain.c | 12 +++++----- + dlls/wined3d/texture.c | 6 ++--- + dlls/wined3d/wined3d_private.h | 1 - + 8 files changed, 31 insertions(+), 43 deletions(-) + +diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c +index 08f92cb..f612099 100644 +--- a/dlls/wined3d/arb_program_shader.c ++++ b/dlls/wined3d/arb_program_shader.c +@@ -7687,7 +7687,7 @@ HRESULT arbfp_blit_surface(struct wined3d_device *device, DWORD filter, + context_release(context); + + wined3d_resource_validate_location(&dst_surface->resource, dst_surface->container->resource.draw_binding); +- surface_invalidate_location(dst_surface, ~dst_surface->container->resource.draw_binding); ++ wined3d_resource_invalidate_location(&dst_surface->resource, ~dst_surface->container->resource.draw_binding); + + return WINED3D_OK; + } +diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c +index 1f34992..61c074f 100644 +--- a/dlls/wined3d/context.c ++++ b/dlls/wined3d/context.c +@@ -3085,7 +3085,7 @@ static void context_setup_target(struct wined3d_context *context, struct wined3d + if (texture->texture_srgb.name) + wined3d_texture_load(texture, context, TRUE); + wined3d_texture_load(texture, context, FALSE); +- surface_invalidate_location(context->current_rt, WINED3D_LOCATION_DRAWABLE); ++ wined3d_resource_invalidate_location(&context->current_rt->resource, WINED3D_LOCATION_DRAWABLE); + } + } + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 600afed..70a30f0 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -393,7 +393,7 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c + if (rt) + { + wined3d_resource_validate_location(&rt->resource, rt->container->resource.draw_binding); +- surface_invalidate_location(rt, ~rt->container->resource.draw_binding); ++ wined3d_resource_invalidate_location(&rt->resource, ~rt->container->resource.draw_binding); + } + } + +diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c +index 7034b25..eef7e2c 100644 +--- a/dlls/wined3d/drawprim.c ++++ b/dlls/wined3d/drawprim.c +@@ -626,7 +626,7 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co + if (target) + { + surface_load_location(target, context, target->container->resource.draw_binding); +- surface_invalidate_location(target, ~target->container->resource.draw_binding); ++ wined3d_resource_invalidate_location(&target->resource, ~target->container->resource.draw_binding); + } + } + } +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 6c2698a..ef52ed0 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -599,7 +599,7 @@ static void surface_evict_sysmem(struct wined3d_surface *surface) + return; + + wined3d_resource_free_sysmem(&surface->resource); +- surface_invalidate_location(surface, WINED3D_LOCATION_SYSMEM); ++ wined3d_resource_invalidate_location(&surface->resource, WINED3D_LOCATION_SYSMEM); + } + + static void surface_release_client_storage(struct wined3d_surface *surface) +@@ -1185,7 +1185,7 @@ static void surface_remove_pbo(struct wined3d_surface *surface, const struct win + checkGLcall("glDeleteBuffersARB(1, &surface->pbo)"); + + surface->pbo = 0; +- surface_invalidate_location(surface, WINED3D_LOCATION_BUFFER); ++ wined3d_resource_invalidate_location(&surface->resource, WINED3D_LOCATION_BUFFER); + } + + static ULONG surface_resource_incref(struct wined3d_resource *resource) +@@ -1225,7 +1225,7 @@ static void surface_unload(struct wined3d_resource *resource) + surface_prepare_system_memory(surface); + memset(surface->resource.heap_memory, 0, surface->resource.size); + wined3d_resource_validate_location(&surface->resource, WINED3D_LOCATION_SYSMEM); +- surface_invalidate_location(surface, ~WINED3D_LOCATION_SYSMEM); ++ wined3d_resource_invalidate_location(&surface->resource, ~WINED3D_LOCATION_SYSMEM); + + /* We also get here when the ddraw swapchain is destroyed, for example + * for a mode switch. In this case this surface won't necessarily be +@@ -1237,7 +1237,7 @@ static void surface_unload(struct wined3d_resource *resource) + { + surface_prepare_map_memory(surface); + surface_load_location(surface, context, surface->resource.map_binding); +- surface_invalidate_location(surface, ~surface->resource.map_binding); ++ wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); + } + + /* Destroy PBOs, but load them into real sysmem before */ +@@ -1275,7 +1275,10 @@ static void surface_unload(struct wined3d_resource *resource) + + static void wined3d_surface_location_invalidated(struct wined3d_resource *resource, DWORD location) + { +- ERR("Not yet implemented.\n"); ++ struct wined3d_surface *surface = surface_from_resource(resource); ++ ++ if (location & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) ++ wined3d_texture_set_dirty(surface->container); + } + + static const struct wined3d_resource_ops surface_resource_ops = +@@ -1742,7 +1745,7 @@ HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const P + context_release(context); + + wined3d_resource_validate_location(&dst_surface->resource, WINED3D_LOCATION_TEXTURE_RGB); +- surface_invalidate_location(dst_surface, ~WINED3D_LOCATION_TEXTURE_RGB); ++ wined3d_resource_invalidate_location(&dst_surface->resource, ~WINED3D_LOCATION_TEXTURE_RGB); + + return WINED3D_OK; + } +@@ -1873,7 +1876,7 @@ void surface_load(struct wined3d_surface *surface, struct wined3d_context *conte + + surface_prepare_map_memory(surface); + surface_load_location(surface, context, surface->resource.map_binding); +- surface_invalidate_location(surface, ~surface->resource.map_binding); ++ wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); + /* Switching color keying on / off may change the internal format. */ + if (ck_changed) + wined3d_texture_force_reload(surface->container); +@@ -2668,7 +2671,7 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + } + + if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY))) +- surface_invalidate_location(surface, ~surface->resource.map_binding); ++ wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); + + switch (surface->resource.map_binding) + { +@@ -2784,7 +2787,7 @@ HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc) + } + + surface_load_location(surface, context, WINED3D_LOCATION_DIB); +- surface_invalidate_location(surface, ~WINED3D_LOCATION_DIB); ++ wined3d_resource_invalidate_location(&surface->resource, ~WINED3D_LOCATION_DIB); + + if (context) + context_release(context); +@@ -2833,7 +2836,7 @@ HRESULT CDECL wined3d_surface_releasedc(struct wined3d_surface *surface, HDC dc) + context = context_acquire(device, NULL); + + surface_load_location(surface, context, surface->resource.map_binding); +- surface_invalidate_location(surface, WINED3D_LOCATION_DIB); ++ wined3d_resource_invalidate_location(&surface->resource, WINED3D_LOCATION_DIB); + if (context) + context_release(context); + } +@@ -3207,7 +3210,7 @@ static void fb_copy_to_texture_direct(struct wined3d_surface *dst_surface, struc + /* The texture is now most up to date - If the surface is a render target + * and has a drawable, this path is never entered. */ + wined3d_resource_validate_location(&dst_surface->resource, WINED3D_LOCATION_TEXTURE_RGB); +- surface_invalidate_location(dst_surface, ~WINED3D_LOCATION_TEXTURE_RGB); ++ wined3d_resource_invalidate_location(&dst_surface->resource, ~WINED3D_LOCATION_TEXTURE_RGB); + } + + /* Uses the hardware to stretch and flip the image */ +@@ -3275,7 +3278,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st + checkGLcall("glEnable(texture_target)"); + + /* For now invalidate the texture copy of the back buffer. Drawable and sysmem copy are untouched */ +- src_surface->resource.locations &= ~WINED3D_LOCATION_TEXTURE_RGB; ++ wined3d_resource_invalidate_location(&src_surface->resource, WINED3D_LOCATION_TEXTURE_RGB); + } + + /* Make sure that the top pixel is always above the bottom pixel, and keep a separate upside down flag +@@ -3481,7 +3484,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st + /* The texture is now most up to date - If the surface is a render target + * and has a drawable, this path is never entered. */ + wined3d_resource_validate_location(&dst_surface->resource, WINED3D_LOCATION_TEXTURE_RGB); +- surface_invalidate_location(dst_surface, ~WINED3D_LOCATION_TEXTURE_RGB); ++ wined3d_resource_invalidate_location(&dst_surface->resource, ~WINED3D_LOCATION_TEXTURE_RGB); + } + + /* Front buffer coordinates are always full screen coordinates, but our GL +@@ -3794,7 +3797,7 @@ static HRESULT surface_blt_special(struct wined3d_surface *dst_surface, const RE + (old_color_key_flags & WINEDDSD_CKSRCBLT) ? &old_blt_key : NULL); + + wined3d_resource_validate_location(&dst_surface->resource, dst_surface->container->resource.draw_binding); +- surface_invalidate_location(dst_surface, ~dst_surface->container->resource.draw_binding); ++ wined3d_resource_invalidate_location(&dst_surface->resource, ~dst_surface->container->resource.draw_binding); + + return WINED3D_OK; + } +@@ -4038,18 +4041,6 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co + surface->ds_current_size.cy = surface->resource.height; + } + +-void surface_invalidate_location(struct wined3d_surface *surface, DWORD location) +-{ +- TRACE("surface %p, location %s.\n", surface, wined3d_debug_location(location)); +- +- if (location & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) +- wined3d_texture_set_dirty(surface->container); +- surface->resource.locations &= ~location; +- +- if (!surface->resource.locations) +- ERR("Surface %p does not have any up to date location.\n", surface); +-} +- + static DWORD resource_access_from_location(DWORD location) + { + switch (location) +@@ -5528,7 +5519,7 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + context_release(context); + + wined3d_resource_validate_location(&dst_surface->resource, dst_surface->container->resource.draw_binding); +- surface_invalidate_location(dst_surface, ~dst_surface->container->resource.draw_binding); ++ wined3d_resource_invalidate_location(&dst_surface->resource, ~dst_surface->container->resource.draw_binding); + + return WINED3D_OK; + } +@@ -5657,7 +5648,7 @@ static HRESULT surface_init(struct wined3d_surface *surface, struct wined3d_text + { + wined3d_resource_free_sysmem(&surface->resource); + wined3d_resource_validate_location(&surface->resource, WINED3D_LOCATION_DIB); +- surface_invalidate_location(surface, WINED3D_LOCATION_SYSMEM); ++ wined3d_resource_invalidate_location(&surface->resource, WINED3D_LOCATION_SYSMEM); + } + + return hr; +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index bdb4b67..e64715e 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -512,7 +512,7 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + if (!swapchain->render_to_fbo && render_to_fbo && wined3d_settings.offscreen_rendering_mode == ORM_FBO) + { + surface_load_location(back_buffer, context, WINED3D_LOCATION_TEXTURE_RGB); +- surface_invalidate_location(back_buffer, WINED3D_LOCATION_DRAWABLE); ++ wined3d_resource_invalidate_location(&back_buffer->resource, WINED3D_LOCATION_DRAWABLE); + swapchain->render_to_fbo = TRUE; + swapchain_update_draw_bindings(swapchain); + } +@@ -574,15 +574,15 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + else + { + wined3d_resource_validate_location(&front->resource, WINED3D_LOCATION_DRAWABLE); +- surface_invalidate_location(front, ~WINED3D_LOCATION_DRAWABLE); ++ wined3d_resource_invalidate_location(&front->resource, ~WINED3D_LOCATION_DRAWABLE); + wined3d_resource_validate_location(&back_buffer->resource, WINED3D_LOCATION_DRAWABLE); +- surface_invalidate_location(back_buffer, ~WINED3D_LOCATION_DRAWABLE); ++ wined3d_resource_invalidate_location(&back_buffer->resource, ~WINED3D_LOCATION_DRAWABLE); + } + } + else + { + wined3d_resource_validate_location(&front->resource, WINED3D_LOCATION_DRAWABLE); +- surface_invalidate_location(front, ~WINED3D_LOCATION_DRAWABLE); ++ wined3d_resource_invalidate_location(&front->resource, ~WINED3D_LOCATION_DRAWABLE); + /* If the swapeffect is DISCARD, the back buffer is undefined. That means the SYSMEM + * and INTEXTURE copies can keep their old content if they have any defined content. + * If the swapeffect is COPY, the content remains the same. If it is FLIP however, +@@ -591,7 +591,7 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + if (swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_FLIP) + { + wined3d_resource_validate_location(&back_buffer->resource, back_buffer->container->resource.draw_binding); +- surface_invalidate_location(back_buffer, ~back_buffer->container->resource.draw_binding); ++ wined3d_resource_invalidate_location(&back_buffer->resource, ~back_buffer->container->resource.draw_binding); + } + } + +@@ -866,7 +866,7 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3 + if (!(device->wined3d->flags & WINED3D_NO3D)) + { + wined3d_resource_validate_location(&front_buffer->resource, WINED3D_LOCATION_DRAWABLE); +- surface_invalidate_location(front_buffer, ~WINED3D_LOCATION_DRAWABLE); ++ wined3d_resource_invalidate_location(&front_buffer->resource, ~WINED3D_LOCATION_DRAWABLE); + } + + /* MSDN says we're only allowed a single fullscreen swapchain per device, +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index c42e475..941d935 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -832,7 +832,7 @@ static void texture2d_sub_resource_add_dirty_region(struct wined3d_resource *sub + context = context_acquire(surface->resource.device, NULL); + surface_load_location(surface, context, surface->resource.map_binding); + context_release(context); +- surface_invalidate_location(surface, ~surface->resource.map_binding); ++ wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); + } + + static void texture2d_sub_resource_cleanup(struct wined3d_resource *sub_resource) +@@ -844,9 +844,7 @@ static void texture2d_sub_resource_cleanup(struct wined3d_resource *sub_resource + + static void texture2d_sub_resource_invalidate_location(struct wined3d_resource *sub_resource, DWORD location) + { +- struct wined3d_surface *surface = surface_from_resource(sub_resource); +- +- surface_invalidate_location(surface, location); ++ wined3d_resource_invalidate_location(sub_resource, location); + } + + /* Context activation is done by the caller. */ +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 60d1b56..640aa95 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2351,7 +2351,6 @@ HRESULT surface_color_fill(struct wined3d_surface *s, + GLenum surface_get_gl_buffer(const struct wined3d_surface *surface) DECLSPEC_HIDDEN; + void surface_get_drawable_size(const struct wined3d_surface *surface, const struct wined3d_context *context, + unsigned int *width, unsigned int *height) DECLSPEC_HIDDEN; +-void surface_invalidate_location(struct wined3d_surface *surface, DWORD location) DECLSPEC_HIDDEN; + void surface_load(struct wined3d_surface *surface, struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN; + void surface_load_ds_location(struct wined3d_surface *surface, + struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0016-wined3d-Move-bitmap_data-and-user_memory-into-the-re.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0016-wined3d-Move-bitmap_data-and-user_memory-into-the-re.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0016-wined3d-Move-bitmap_data-and-user_memory-into-the-re.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0016-wined3d-Move-bitmap_data-and-user_memory-into-the-re.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,171 @@ +From 2341723442d5ab7fb42bb82d066b306cc458813d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 16 Jan 2014 22:04:55 +0100 +Subject: wined3d: Move bitmap_data and user_memory into the resource. + +I may want to change this to keep this in the surface. Not sure yet. +--- + dlls/wined3d/surface.c | 32 ++++++++++++++++---------------- + dlls/wined3d/swapchain.c | 6 +++--- + dlls/wined3d/wined3d_private.h | 4 +--- + 3 files changed, 20 insertions(+), 22 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index ef52ed0..c689880 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -88,7 +88,7 @@ static void surface_cleanup(struct wined3d_surface *surface) + { + DeleteDC(surface->hDC); + DeleteObject(surface->dib.DIBsection); +- surface->dib.bitmap_data = NULL; ++ surface->resource.bitmap_data = NULL; + } + + if (surface->overlay_dest) +@@ -456,7 +456,7 @@ static HRESULT surface_create_dib_section(struct wined3d_surface *surface) + TRACE("Creating a DIB section with size %dx%dx%d, size=%d.\n", + b_info->bmiHeader.biWidth, b_info->bmiHeader.biHeight, + b_info->bmiHeader.biBitCount, b_info->bmiHeader.biSizeImage); +- surface->dib.DIBsection = CreateDIBSection(0, b_info, DIB_RGB_COLORS, &surface->dib.bitmap_data, 0, 0); ++ surface->dib.DIBsection = CreateDIBSection(0, b_info, DIB_RGB_COLORS, &surface->resource.bitmap_data, 0, 0); + + if (!surface->dib.DIBsection) + { +@@ -465,7 +465,7 @@ static HRESULT surface_create_dib_section(struct wined3d_surface *surface) + return HRESULT_FROM_WIN32(GetLastError()); + } + +- TRACE("DIBSection at %p.\n", surface->dib.bitmap_data); ++ TRACE("DIBSection at %p.\n", surface->resource.bitmap_data); + surface->dib.bitmap_size = b_info->bmiHeader.biSizeImage; + + HeapFree(GetProcessHeap(), 0, b_info); +@@ -490,13 +490,13 @@ static void surface_get_memory(const struct wined3d_surface *surface, struct win + } + if (location & WINED3D_LOCATION_USER_MEMORY) + { +- data->addr = surface->user_memory; ++ data->addr = surface->resource.user_memory; + data->buffer_object = 0; + return; + } + if (location & WINED3D_LOCATION_DIB) + { +- data->addr = surface->dib.bitmap_data; ++ data->addr = surface->resource.bitmap_data; + data->buffer_object = 0; + return; + } +@@ -569,13 +569,13 @@ void surface_prepare_map_memory(struct wined3d_surface *surface) + break; + + case WINED3D_LOCATION_USER_MEMORY: +- if (!surface->user_memory) +- ERR("Map binding is set to WINED3D_LOCATION_USER_MEMORY but surface->user_memory is NULL.\n"); ++ if (!surface->resource.user_memory) ++ ERR("Map binding is set to WINED3D_LOCATION_USER_MEMORY but surface->resource.user_memory is NULL.\n"); + break; + + case WINED3D_LOCATION_DIB: +- if (!surface->dib.bitmap_data) +- ERR("Map binding is set to WINED3D_LOCATION_DIB but surface->dib.bitmap_data is NULL.\n"); ++ if (!surface->resource.bitmap_data) ++ ERR("Map binding is set to WINED3D_LOCATION_DIB but surface->resource.bitmap_data is NULL.\n"); + break; + + case WINED3D_LOCATION_BUFFER: +@@ -2190,7 +2190,7 @@ HRESULT wined3d_surface_update_desc(struct wined3d_surface *surface, + { + DeleteDC(surface->hDC); + DeleteObject(surface->dib.DIBsection); +- surface->dib.bitmap_data = NULL; ++ surface->resource.bitmap_data = NULL; + surface->flags &= ~SFLAG_DIBSECTION; + create_dib = TRUE; + } +@@ -2222,7 +2222,7 @@ HRESULT wined3d_surface_update_desc(struct wined3d_surface *surface, + else + surface->flags &= ~SFLAG_NONPOW2; + +- if ((surface->user_memory = mem)) ++ if ((surface->resource.user_memory = mem)) + { + surface->resource.map_binding = WINED3D_LOCATION_USER_MEMORY; + valid_location = WINED3D_LOCATION_USER_MEMORY; +@@ -2680,11 +2680,11 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + break; + + case WINED3D_LOCATION_USER_MEMORY: +- base_memory = surface->user_memory; ++ base_memory = surface->resource.user_memory; + break; + + case WINED3D_LOCATION_DIB: +- base_memory = surface->dib.bitmap_data; ++ base_memory = surface->resource.bitmap_data; + break; + + case WINED3D_LOCATION_BUFFER: +@@ -3052,9 +3052,9 @@ void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) + { + void* tmp; + +- tmp = front->dib.bitmap_data; +- front->dib.bitmap_data = back->dib.bitmap_data; +- back->dib.bitmap_data = tmp; ++ tmp = front->resource.bitmap_data; ++ front->resource.bitmap_data = back->resource.bitmap_data; ++ back->resource.bitmap_data = tmp; + + tmp = front->resource.heap_memory; + front->resource.heap_memory = back->resource.heap_memory; +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index e64715e..17f1afe 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -695,9 +695,9 @@ static void swapchain_gdi_present(struct wined3d_swapchain *swapchain, const REC + { + void *tmp; + +- tmp = front->dib.bitmap_data; +- front->dib.bitmap_data = back->dib.bitmap_data; +- back->dib.bitmap_data = tmp; ++ tmp = front->resource.bitmap_data; ++ front->resource.bitmap_data = back->resource.bitmap_data; ++ back->resource.bitmap_data = tmp; + + if (front->resource.heap_memory) + ERR("GDI Surface %p has heap memory allocated.\n", front); +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 640aa95..52280a7 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2080,7 +2080,7 @@ struct wined3d_resource + UINT depth; + UINT size; + DWORD priority; +- void *heap_memory; ++ void *heap_memory, *user_memory, *bitmap_data; + UINT custom_row_pitch, custom_slice_pitch; + struct list resource_list_entry; + DWORD locations; +@@ -2263,7 +2263,6 @@ void wined3d_volume_upload_data(struct wined3d_volume *volume, const struct wine + struct wined3d_surface_dib + { + HBITMAP DIBsection; +- void *bitmap_data; + UINT bitmap_size; + }; + +@@ -2297,7 +2296,6 @@ struct wined3d_surface + struct wined3d_resource resource; + const struct wined3d_surface_ops *surface_ops; + struct wined3d_texture *container; +- void *user_memory; + + DWORD flags; + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0017-wined3d-Move-load_location-into-the-resource.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0017-wined3d-Move-load_location-into-the-resource.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0017-wined3d-Move-load_location-into-the-resource.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0017-wined3d-Move-load_location-into-the-resource.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,309 @@ +From 647e3b2622558e3a8350bb3521fdbd3119b92d95 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 3 Oct 2013 12:47:01 +0200 +Subject: wined3d: Move load_location into the resource. + +The resource part of load_location will handle transfers between sysmem +locations (heap memory, user memory, dib) and buffers. Texture loading +and downloading from textures will be delegated to surfaces / volumes. +--- + dlls/wined3d/buffer.c | 8 +++++++ + dlls/wined3d/resource.c | 50 ++++++++++++++++++++++++++++++++++++++++++ + dlls/wined3d/surface.c | 12 ++++++++-- + dlls/wined3d/texture.c | 8 +++++++ + dlls/wined3d/volume.c | 42 ++++++++--------------------------- + dlls/wined3d/wined3d_private.h | 7 +++++- + 6 files changed, 91 insertions(+), 36 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index d9bc820..2e44f0f 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -1128,12 +1128,20 @@ static void wined3d_buffer_location_invalidated(struct wined3d_resource *resourc + ERR("Not yet implemented.\n"); + } + ++/* Context activation is done by the caller. */ ++static void wined3d_buffer_load_location(struct wined3d_resource *resource, ++ struct wined3d_context *context, DWORD location) ++{ ++ ERR("Not yet implemented.\n"); ++} ++ + static const struct wined3d_resource_ops buffer_resource_ops = + { + buffer_resource_incref, + buffer_resource_decref, + buffer_unload, + wined3d_buffer_location_invalidated, ++ wined3d_buffer_load_location, + }; + + static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device *device, +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 9d2db2b..63f8584 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -348,6 +348,56 @@ void wined3d_resource_invalidate_location(struct wined3d_resource *resource, DWO + resource->resource_ops->resource_location_invalidated(resource, location); + } + ++DWORD wined3d_resource_access_from_location(DWORD location) ++{ ++ switch (location) ++ { ++ case WINED3D_LOCATION_DISCARDED: ++ return 0; ++ ++ case WINED3D_LOCATION_SYSMEM: ++ case WINED3D_LOCATION_USER_MEMORY: ++ case WINED3D_LOCATION_DIB: ++ return WINED3D_RESOURCE_ACCESS_CPU; ++ ++ case WINED3D_LOCATION_BUFFER: ++ case WINED3D_LOCATION_TEXTURE_RGB: ++ case WINED3D_LOCATION_TEXTURE_SRGB: ++ case WINED3D_LOCATION_DRAWABLE: ++ case WINED3D_LOCATION_RB_MULTISAMPLE: ++ case WINED3D_LOCATION_RB_RESOLVED: ++ return WINED3D_RESOURCE_ACCESS_GPU; ++ ++ default: ++ FIXME("Unhandled location %#x.\n", location); ++ return 0; ++ } ++} ++ ++/* Context activation is optionally by the caller. Context may be NULL. */ ++void wined3d_resource_load_location(struct wined3d_resource *resource, ++ struct wined3d_context *context, DWORD location) ++{ ++ DWORD required_access = wined3d_resource_access_from_location(location); ++ ++ if ((resource->locations & location) == location) ++ { ++ TRACE("Location(s) already up to date.\n"); ++ return; ++ } ++ ++ /* Keep this a WARN for now until surfaces are cleaned up. */ ++ if ((resource->access_flags & required_access) != required_access) ++ WARN("Operation requires %#x access, but resource only has %#x.\n", ++ required_access, resource->access_flags); ++ ++ /* Context is NULL in ddraw-only operation without OpenGL. */ ++ if (!context) ++ ERR("A context is required for non-sysmem operation.\n"); ++ ++ resource->resource_ops->resource_load_location(resource, context, location); ++} ++ + void CDECL wined3d_resource_get_pitch(const struct wined3d_resource *resource, UINT *row_pitch, + UINT *slice_pitch) + { +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index c689880..de57d25 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -1281,12 +1281,20 @@ static void wined3d_surface_location_invalidated(struct wined3d_resource *resour + wined3d_texture_set_dirty(surface->container); + } + ++/* Context activation is done by the caller. */ ++static void wined3d_surface_load_location(struct wined3d_resource *resource, ++ struct wined3d_context *context, DWORD location) ++{ ++ ERR("Not yet implemented.\n"); ++} ++ + static const struct wined3d_resource_ops surface_resource_ops = + { + surface_resource_incref, + surface_resource_decref, + surface_unload, + wined3d_surface_location_invalidated, ++ wined3d_surface_load_location, + }; + + static const struct wined3d_surface_ops surface_ops = +@@ -4041,7 +4049,7 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co + surface->ds_current_size.cy = surface->resource.height; + } + +-static DWORD resource_access_from_location(DWORD location) ++static DWORD surface_access_from_location(DWORD location) + { + switch (location) + { +@@ -4380,7 +4388,7 @@ void surface_load_location(struct wined3d_surface *surface, struct wined3d_conte + + if (WARN_ON(d3d_surface)) + { +- DWORD required_access = resource_access_from_location(location); ++ DWORD required_access = surface_access_from_location(location); + if ((surface->resource.access_flags & required_access) != required_access) + WARN("Operation requires %#x access, but surface only has %#x.\n", + required_access, surface->resource.access_flags); +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index 941d935..ea9eacc 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -989,12 +989,20 @@ static void wined3d_texture_load_location_invalidated(struct wined3d_resource *r + ERR("Should not be called on textures.\n"); + } + ++/* Context activation is done by the caller. */ ++static void wined3d_texture_load_location(struct wined3d_resource *resource, ++ struct wined3d_context *context, DWORD location) ++{ ++ ERR("Should not be called on textures.\n"); ++} ++ + static const struct wined3d_resource_ops texture_resource_ops = + { + texture_resource_incref, + texture_resource_decref, + wined3d_texture_unload, + wined3d_texture_load_location_invalidated, ++ wined3d_texture_load_location, + }; + + static HRESULT cubetexture_init(struct wined3d_texture *texture, const struct wined3d_resource_desc *desc, +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index 6921b87..c93a1ef 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -136,27 +136,6 @@ static void wined3d_volume_evict_sysmem(struct wined3d_volume *volume) + wined3d_resource_invalidate_location(&volume->resource, WINED3D_LOCATION_SYSMEM); + } + +-static DWORD volume_access_from_location(DWORD location) +-{ +- switch (location) +- { +- case WINED3D_LOCATION_DISCARDED: +- return 0; +- +- case WINED3D_LOCATION_SYSMEM: +- return WINED3D_RESOURCE_ACCESS_CPU; +- +- case WINED3D_LOCATION_BUFFER: +- case WINED3D_LOCATION_TEXTURE_RGB: +- case WINED3D_LOCATION_TEXTURE_SRGB: +- return WINED3D_RESOURCE_ACCESS_GPU; +- +- default: +- FIXME("Unhandled location %#x.\n", location); +- return 0; +- } +-} +- + /* Context activation is done by the caller. */ + static void wined3d_volume_srgb_transfer(struct wined3d_volume *volume, + struct wined3d_context *context, BOOL dest_is_srgb) +@@ -196,21 +175,17 @@ static BOOL wined3d_volume_can_evict(const struct wined3d_volume *volume) + + return TRUE; + } ++ + /* Context activation is done by the caller. */ +-static void wined3d_volume_load_location(struct wined3d_volume *volume, ++static void wined3d_volume_load_location(struct wined3d_resource *resource, + struct wined3d_context *context, DWORD location) + { +- DWORD required_access = volume_access_from_location(location); ++ struct wined3d_volume *volume = volume_from_resource(resource); ++ DWORD required_access = wined3d_resource_access_from_location(location); + + TRACE("Volume %p, loading %s, have %s.\n", volume, wined3d_debug_location(location), + wined3d_debug_location(volume->resource.locations)); + +- if ((volume->resource.locations & location) == location) +- { +- TRACE("Location(s) already up to date.\n"); +- return; +- } +- + if ((volume->resource.access_flags & required_access) != required_access) + { + ERR("Operation requires %#x access, but volume only has %#x.\n", +@@ -332,7 +307,7 @@ static void wined3d_volume_load_location(struct wined3d_volume *volume, + void wined3d_volume_load(struct wined3d_volume *volume, struct wined3d_context *context, BOOL srgb_mode) + { + wined3d_texture_prepare_texture(volume->container, context, srgb_mode); +- wined3d_volume_load_location(volume, context, ++ wined3d_resource_load_location(&volume->resource, context, + srgb_mode ? WINED3D_LOCATION_TEXTURE_SRGB : WINED3D_LOCATION_TEXTURE_RGB); + } + +@@ -391,7 +366,7 @@ static void volume_unload(struct wined3d_resource *resource) + if (volume_prepare_system_memory(volume)) + { + context = context_acquire(device, NULL); +- wined3d_volume_load_location(volume, context, WINED3D_LOCATION_SYSMEM); ++ wined3d_resource_load_location(&volume->resource, context, WINED3D_LOCATION_SYSMEM); + context_release(context); + wined3d_resource_invalidate_location(&volume->resource, ~WINED3D_LOCATION_SYSMEM); + } +@@ -546,7 +521,7 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + if (flags & WINED3D_MAP_DISCARD) + wined3d_resource_validate_location(&volume->resource, WINED3D_LOCATION_BUFFER); + else +- wined3d_volume_load_location(volume, context, WINED3D_LOCATION_BUFFER); ++ wined3d_resource_load_location(&volume->resource, context, WINED3D_LOCATION_BUFFER); + + GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->pbo)); + +@@ -584,7 +559,7 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + else if (!(volume->resource.locations & WINED3D_LOCATION_SYSMEM)) + { + context = context_acquire(device, NULL); +- wined3d_volume_load_location(volume, context, WINED3D_LOCATION_SYSMEM); ++ wined3d_resource_load_location(&volume->resource, context, WINED3D_LOCATION_SYSMEM); + context_release(context); + } + base_memory = volume->resource.heap_memory; +@@ -699,6 +674,7 @@ static const struct wined3d_resource_ops volume_resource_ops = + volume_resource_decref, + volume_unload, + wined3d_volume_location_invalidated, ++ wined3d_volume_load_location, + }; + + static HRESULT volume_init(struct wined3d_volume *volume, struct wined3d_texture *container, +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 52280a7..b1e4cb6 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2058,6 +2058,8 @@ struct wined3d_resource_ops + ULONG (*resource_decref)(struct wined3d_resource *resource); + void (*resource_unload)(struct wined3d_resource *resource); + void (*resource_location_invalidated)(struct wined3d_resource *resource, DWORD location); ++ void (*resource_load_location)(struct wined3d_resource *resource, ++ struct wined3d_context *context, DWORD location); + }; + + struct wined3d_resource +@@ -2108,15 +2110,18 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device * + void *parent, const struct wined3d_parent_ops *parent_ops, + const struct wined3d_resource_ops *resource_ops) DECLSPEC_HIDDEN; + void resource_unload(struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++DWORD wined3d_resource_access_from_location(DWORD location) DECLSPEC_HIDDEN; + BOOL wined3d_resource_allocate_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_free_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + GLbitfield wined3d_resource_gl_map_flags(DWORD d3d_flags) DECLSPEC_HIDDEN; + GLenum wined3d_resource_gl_legacy_map_flags(DWORD d3d_flags) DECLSPEC_HIDDEN; ++void wined3d_resource_invalidate_location(struct wined3d_resource *resource, DWORD location) DECLSPEC_HIDDEN; + BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++void wined3d_resource_load_location(struct wined3d_resource *resource, ++ struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; + DWORD wined3d_resource_sanitize_map_flags(const struct wined3d_resource *resource, DWORD flags) DECLSPEC_HIDDEN; + void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_validate_location(struct wined3d_resource *resource, DWORD location) DECLSPEC_HIDDEN; +-void wined3d_resource_invalidate_location(struct wined3d_resource *resource, DWORD location) DECLSPEC_HIDDEN; + + /* Tests show that the start address of resources is 32 byte aligned */ + #define RESOURCE_ALIGNMENT 16 +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0018-wined3d-Replace-surface_load_location-with-resource_.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0018-wined3d-Replace-surface_load_location-with-resource_.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0018-wined3d-Replace-surface_load_location-with-resource_.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0018-wined3d-Replace-surface_load_location-with-resource_.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,411 @@ +From a1e69a04b1cb46aa0d16b4bc4b696321e0698972 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 17 Nov 2013 20:33:17 +0100 +Subject: wined3d: Replace surface_load_location with resource_load_location. + +FIXME: Check if this patch is complete enough to make sense. +--- + dlls/wined3d/context.c | 2 +- + dlls/wined3d/device.c | 2 +- + dlls/wined3d/drawprim.c | 2 +- + dlls/wined3d/surface.c | 113 +++++++++++++---------------------------- + dlls/wined3d/swapchain.c | 8 +-- + dlls/wined3d/texture.c | 2 +- + dlls/wined3d/wined3d_private.h | 2 - + 7 files changed, 44 insertions(+), 87 deletions(-) + +diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c +index 61c074f..cc60348 100644 +--- a/dlls/wined3d/context.c ++++ b/dlls/wined3d/context.c +@@ -2215,7 +2215,7 @@ static void context_validate_onscreen_formats(struct wined3d_context *context, + WARN("Depth stencil format is not supported by WGL, rendering the backbuffer in an FBO\n"); + + /* The currently active context is the necessary context to access the swapchain's onscreen buffers */ +- surface_load_location(context->current_rt, context, WINED3D_LOCATION_TEXTURE_RGB); ++ wined3d_resource_load_location(&context->current_rt->resource, context, WINED3D_LOCATION_TEXTURE_RGB); + swapchain->render_to_fbo = TRUE; + swapchain_update_draw_bindings(swapchain); + context_set_render_offscreen(context, TRUE); +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 70a30f0..565a92c 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -323,7 +323,7 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c + { + struct wined3d_surface *rt = wined3d_rendertarget_view_get_surface(fb->render_targets[i]); + if (rt) +- surface_load_location(rt, context, rt->container->resource.draw_binding); ++ wined3d_resource_load_location(&rt->resource, context, rt->container->resource.draw_binding); + } + } + +diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c +index eef7e2c..62b7032 100644 +--- a/dlls/wined3d/drawprim.c ++++ b/dlls/wined3d/drawprim.c +@@ -625,7 +625,7 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co + struct wined3d_surface *target = wined3d_rendertarget_view_get_surface(device->fb.render_targets[i]); + if (target) + { +- surface_load_location(target, context, target->container->resource.draw_binding); ++ wined3d_resource_load_location(&target->resource, context, target->container->resource.draw_binding); + wined3d_resource_invalidate_location(&target->resource, ~target->container->resource.draw_binding); + } + } +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index de57d25..6154315 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -759,7 +759,7 @@ static void surface_unmap(struct wined3d_surface *surface) + + if (device->d3d_initialized) + context = context_acquire(device, surface); +- surface_load_location(surface, context, surface->container->resource.draw_binding); ++ wined3d_resource_load_location(&surface->resource, context, surface->container->resource.draw_binding); + if (context) + context_release(context); + } +@@ -825,9 +825,9 @@ static void surface_depth_blt_fbo(const struct wined3d_device *device, + + /* Make sure the locations are up-to-date. Loading the destination + * surface isn't required if the entire surface is overwritten. */ +- surface_load_location(src_surface, context, src_location); ++ wined3d_resource_load_location(&src_surface->resource, context, src_location); + if (!surface_is_full_rect(dst_surface, dst_rect)) +- surface_load_location(dst_surface, context, dst_location); ++ wined3d_resource_load_location(&dst_surface->resource, context, dst_location); + + gl_info = context->gl_info; + +@@ -916,9 +916,9 @@ static void surface_blt_fbo(const struct wined3d_device *device, + * surface isn't required if the entire surface is overwritten. (And is + * in fact harmful if we're being called by surface_load_location() with + * the purpose of loading the destination surface.) */ +- surface_load_location(src_surface, old_ctx, src_location); ++ wined3d_resource_load_location(&src_surface->resource, old_ctx, src_location); + if (!surface_is_full_rect(dst_surface, &dst_rect)) +- surface_load_location(dst_surface, old_ctx, dst_location); ++ wined3d_resource_load_location(&dst_surface->resource, old_ctx, dst_location); + + if (src_location == WINED3D_LOCATION_DRAWABLE) required_rt = src_surface; + else if (dst_location == WINED3D_LOCATION_DRAWABLE) required_rt = dst_surface; +@@ -1236,7 +1236,7 @@ static void surface_unload(struct wined3d_resource *resource) + else + { + surface_prepare_map_memory(surface); +- surface_load_location(surface, context, surface->resource.map_binding); ++ wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); + } + +@@ -1281,22 +1281,6 @@ static void wined3d_surface_location_invalidated(struct wined3d_resource *resour + wined3d_texture_set_dirty(surface->container); + } + +-/* Context activation is done by the caller. */ +-static void wined3d_surface_load_location(struct wined3d_resource *resource, +- struct wined3d_context *context, DWORD location) +-{ +- ERR("Not yet implemented.\n"); +-} +- +-static const struct wined3d_resource_ops surface_resource_ops = +-{ +- surface_resource_incref, +- surface_resource_decref, +- surface_unload, +- wined3d_surface_location_invalidated, +- wined3d_surface_load_location, +-}; +- + static const struct wined3d_surface_ops surface_ops = + { + surface_private_setup, +@@ -1740,7 +1724,7 @@ HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const P + if (update_w == dst_w && update_h == dst_h) + wined3d_texture_prepare_texture(dst_surface->container, context, FALSE); + else +- surface_load_location(dst_surface, context, WINED3D_LOCATION_TEXTURE_RGB); ++ wined3d_resource_load_location(&dst_surface->resource, context, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_texture_bind(dst_surface->container, context, FALSE); + + surface_get_memory(src_surface, &data, src_surface->resource.locations); +@@ -1883,7 +1867,7 @@ void surface_load(struct wined3d_surface *surface, struct wined3d_context *conte + * the surface. Make sure we have it. */ + + surface_prepare_map_memory(surface); +- surface_load_location(surface, context, surface->resource.map_binding); ++ wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); + /* Switching color keying on / off may change the internal format. */ + if (ck_changed) +@@ -1899,7 +1883,7 @@ void surface_load(struct wined3d_surface *surface, struct wined3d_context *conte + return; + } + +- surface_load_location(surface, context, location); ++ wined3d_resource_load_location(&surface->resource, context, location); + surface_evict_sysmem(surface); + } + +@@ -2673,7 +2657,7 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + + if (surface->resource.device->d3d_initialized) + context = context_acquire(surface->resource.device, NULL); +- surface_load_location(surface, context, surface->resource.map_binding); ++ wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + if (context) + context_release(context); + } +@@ -2778,7 +2762,7 @@ HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc) + { + if (surface->flags & SFLAG_CLIENT) + { +- surface_load_location(surface, context, WINED3D_LOCATION_SYSMEM); ++ wined3d_resource_load_location(&surface->resource, context, WINED3D_LOCATION_SYSMEM); + surface_release_client_storage(surface); + } + hr = surface_create_dib_section(surface); +@@ -2794,7 +2778,7 @@ HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc) + surface->resource.map_binding = WINED3D_LOCATION_DIB; + } + +- surface_load_location(surface, context, WINED3D_LOCATION_DIB); ++ wined3d_resource_load_location(&surface->resource, context, WINED3D_LOCATION_DIB); + wined3d_resource_invalidate_location(&surface->resource, ~WINED3D_LOCATION_DIB); + + if (context) +@@ -2843,7 +2827,7 @@ HRESULT CDECL wined3d_surface_releasedc(struct wined3d_surface *surface, HDC dc) + if (device->d3d_initialized) + context = context_acquire(device, NULL); + +- surface_load_location(surface, context, surface->resource.map_binding); ++ wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + wined3d_resource_invalidate_location(&surface->resource, WINED3D_LOCATION_DIB); + if (context) + context_release(context); +@@ -3555,8 +3539,8 @@ static void surface_blt_to_drawable(const struct wined3d_device *device, + gl_info = context->gl_info; + + /* Make sure the surface is up-to-date. This should probably use +- * surface_load_location() and worry about the destination surface too, +- * unless we're overwriting it completely. */ ++ * wined3d_resource_load_location() and worry about the destination ++ * surface too, unless we're overwriting it completely. */ + wined3d_texture_load(src_surface->container, context, FALSE); + + /* Activate the destination context, set it up for blitting */ +@@ -4049,29 +4033,6 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co + surface->ds_current_size.cy = surface->resource.height; + } + +-static DWORD surface_access_from_location(DWORD location) +-{ +- switch (location) +- { +- case WINED3D_LOCATION_SYSMEM: +- case WINED3D_LOCATION_USER_MEMORY: +- case WINED3D_LOCATION_DIB: +- case WINED3D_LOCATION_BUFFER: +- return WINED3D_RESOURCE_ACCESS_CPU; +- +- case WINED3D_LOCATION_DRAWABLE: +- case WINED3D_LOCATION_TEXTURE_SRGB: +- case WINED3D_LOCATION_TEXTURE_RGB: +- case WINED3D_LOCATION_RB_MULTISAMPLE: +- case WINED3D_LOCATION_RB_RESOLVED: +- return WINED3D_RESOURCE_ACCESS_GPU; +- +- default: +- FIXME("Unhandled location %#x.\n", location); +- return 0; +- } +-} +- + static void surface_copy_simple_location(struct wined3d_surface *surface, DWORD location) + { + struct wined3d_device *device = surface->resource.device; +@@ -4121,7 +4082,7 @@ static void surface_load_sysmem(struct wined3d_surface *surface, + } + + if (surface->resource.locations & (WINED3D_LOCATION_RB_MULTISAMPLE | WINED3D_LOCATION_RB_RESOLVED)) +- surface_load_location(surface, context, WINED3D_LOCATION_TEXTURE_RGB); ++ wined3d_resource_load_location(&surface->resource, context, WINED3D_LOCATION_TEXTURE_RGB); + + /* Download the surface to system memory. */ + if (surface->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) +@@ -4157,7 +4118,7 @@ static HRESULT surface_load_drawable(struct wined3d_surface *surface, + } + + surface_get_rect(surface, NULL, &r); +- surface_load_location(surface, context, WINED3D_LOCATION_TEXTURE_RGB); ++ wined3d_resource_load_location(&surface->resource, context, WINED3D_LOCATION_TEXTURE_RGB); + surface_blt_to_drawable(surface->resource.device, context, + WINED3D_TEXF_POINT, FALSE, surface, &r, surface, &r); + +@@ -4230,7 +4191,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + /* Performance warning... */ + FIXME("Downloading RGB surface %p to reload it as sRGB.\n", surface); + surface_prepare_map_memory(surface); +- surface_load_location(surface, context, surface->resource.map_binding); ++ wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + } + } + else +@@ -4241,7 +4202,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + /* Performance warning... */ + FIXME("Downloading sRGB surface %p to reload it as RGB.\n", surface); + surface_prepare_map_memory(surface); +- surface_load_location(surface, context, surface->resource.map_binding); ++ wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + } + } + +@@ -4250,7 +4211,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + WARN("Trying to load a texture from sysmem, but no simple location is valid.\n"); + /* Lets hope we get it from somewhere... */ + surface_prepare_system_memory(surface); +- surface_load_location(surface, context, WINED3D_LOCATION_SYSMEM); ++ wined3d_resource_load_location(&surface->resource, context, WINED3D_LOCATION_SYSMEM); + } + + wined3d_texture_prepare_texture(texture, context, srgb); +@@ -4283,7 +4244,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + surface->resource.map_binding = WINED3D_LOCATION_SYSMEM; + + surface_prepare_map_memory(surface); +- surface_load_location(surface, context, surface->resource.map_binding); ++ wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + surface_remove_pbo(surface, gl_info); + } + +@@ -4351,9 +4312,11 @@ static void surface_multisample_resolve(struct wined3d_surface *surface, struct + surface, WINED3D_LOCATION_RB_MULTISAMPLE, &rect, surface, WINED3D_LOCATION_RB_RESOLVED, &rect); + } + +-/* Context activation is done by the caller. Context may be NULL in ddraw-only mode. */ +-void surface_load_location(struct wined3d_surface *surface, struct wined3d_context *context, DWORD location) ++/* Context activation is done by the caller. */ ++static void wined3d_surface_load_location(struct wined3d_resource *resource, ++ struct wined3d_context *context, DWORD location) + { ++ struct wined3d_surface *surface = surface_from_resource(resource); + HRESULT hr; + + TRACE("surface %p, location %s.\n", surface, wined3d_debug_location(location)); +@@ -4380,20 +4343,6 @@ void surface_load_location(struct wined3d_surface *surface, struct wined3d_conte + } + } + +- if (surface->resource.locations & location) +- { +- TRACE("Location already up to date.\n"); +- return; +- } +- +- if (WARN_ON(d3d_surface)) +- { +- DWORD required_access = surface_access_from_location(location); +- if ((surface->resource.access_flags & required_access) != required_access) +- WARN("Operation requires %#x access, but surface only has %#x.\n", +- required_access, surface->resource.access_flags); +- } +- + if (!surface->resource.locations) + { + ERR("Surface %p does not have any up to date location.\n", surface); +@@ -5482,7 +5431,8 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + if (!wined3d_resource_is_offscreen(&dst_surface->container->resource)) + { + struct wined3d_context *context = context_acquire(device, dst_surface); +- surface_load_location(dst_surface, context, dst_surface->container->resource.draw_binding); ++ wined3d_resource_load_location(&dst_surface->resource, context, ++ dst_surface->container->resource.draw_binding); + context_release(context); + } + return WINED3D_OK; +@@ -5557,6 +5507,15 @@ cpu: + return surface_cpu_blt(dst_surface, &dst_rect, src_surface, &src_rect, flags, fx, filter); + } + ++static const struct wined3d_resource_ops surface_resource_ops = ++{ ++ surface_resource_incref, ++ surface_resource_decref, ++ surface_unload, ++ wined3d_surface_location_invalidated, ++ wined3d_surface_load_location, ++}; ++ + static HRESULT surface_init(struct wined3d_surface *surface, struct wined3d_texture *container, + const struct wined3d_resource_desc *desc, GLenum target, unsigned int level, unsigned int layer, DWORD flags) + { +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index 17f1afe..e1a5b8a 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -309,7 +309,7 @@ static void swapchain_blit(const struct wined3d_swapchain *swapchain, + if (backbuffer->resource.multisample_type) + { + location = WINED3D_LOCATION_RB_RESOLVED; +- surface_load_location(backbuffer, context, location); ++ wined3d_resource_load_location(&backbuffer->resource, context, location); + } + + context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, backbuffer, NULL, location); +@@ -511,14 +511,14 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + */ + if (!swapchain->render_to_fbo && render_to_fbo && wined3d_settings.offscreen_rendering_mode == ORM_FBO) + { +- surface_load_location(back_buffer, context, WINED3D_LOCATION_TEXTURE_RGB); ++ wined3d_resource_load_location(&back_buffer->resource, context, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_resource_invalidate_location(&back_buffer->resource, WINED3D_LOCATION_DRAWABLE); + swapchain->render_to_fbo = TRUE; + swapchain_update_draw_bindings(swapchain); + } + else + { +- surface_load_location(back_buffer, context, back_buffer->container->resource.draw_binding); ++ wined3d_resource_load_location(&back_buffer->resource, context, back_buffer->container->resource.draw_binding); + } + + if (swapchain->render_to_fbo) +@@ -640,7 +640,7 @@ void x11_copy_to_screen(const struct wined3d_swapchain *swapchain, const RECT *r + + TRACE("Copying surface %p to screen.\n", front); + +- surface_load_location(front, NULL, WINED3D_LOCATION_DIB); ++ wined3d_resource_load_location(&front->resource, NULL, WINED3D_LOCATION_DIB); + + src_dc = front->hDC; + window = swapchain->win_handle; +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index ea9eacc..48717d7 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -830,7 +830,7 @@ static void texture2d_sub_resource_add_dirty_region(struct wined3d_resource *sub + + surface_prepare_map_memory(surface); + context = context_acquire(surface->resource.device, NULL); +- surface_load_location(surface, context, surface->resource.map_binding); ++ wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + context_release(context); + wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); + } +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index b1e4cb6..059310b 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2358,8 +2358,6 @@ void surface_load(struct wined3d_surface *surface, struct wined3d_context *conte + void surface_load_ds_location(struct wined3d_surface *surface, + struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; + void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb) DECLSPEC_HIDDEN; +-void surface_load_location(struct wined3d_surface *surface, +- struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; + void surface_modify_ds_location(struct wined3d_surface *surface, DWORD location, UINT w, UINT h) DECLSPEC_HIDDEN; + void surface_prepare_rb(struct wined3d_surface *surface, + const struct wined3d_gl_info *gl_info, BOOL multisample) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0019-wined3d-Introduce-helper-functions-for-mapping-volum.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0019-wined3d-Introduce-helper-functions-for-mapping-volum.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0019-wined3d-Introduce-helper-functions-for-mapping-volum.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0019-wined3d-Introduce-helper-functions-for-mapping-volum.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,213 @@ +From 6502ec68de4a38d59a2e6690eca2546e710b6cbc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 18 Sep 2013 22:30:57 +0200 +Subject: wined3d: Introduce helper functions for mapping volumes. + +--- + dlls/wined3d/volume.c | 157 ++++++++++++++++++++++++++++++-------------------- + 1 file changed, 96 insertions(+), 61 deletions(-) + +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index c93a1ef..ee64070 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -475,12 +475,67 @@ static BOOL wined3d_volume_check_box_dimensions(const struct wined3d_volume *vol + return TRUE; + } + ++/* Context activation is done by the caller. */ ++static BOOL wined3d_volume_prepare_map_memory(struct wined3d_volume *volume, struct wined3d_context *context) ++{ ++ switch (volume->resource.map_binding) ++ { ++ case WINED3D_LOCATION_BUFFER: ++ wined3d_volume_prepare_pbo(volume, context); ++ return TRUE; ++ ++ case WINED3D_LOCATION_SYSMEM: ++ return volume_prepare_system_memory(volume); ++ ++ default: ++ ERR("Unexpected map binding %s.\n", wined3d_debug_location(volume->resource.map_binding)); ++ return FALSE; ++ } ++} ++ ++static BYTE *wined3d_volume_get_map_ptr(const struct wined3d_volume *volume, ++ const struct wined3d_context *context, DWORD flags) ++{ ++ const struct wined3d_gl_info *gl_info; ++ BYTE *ptr; ++ ++ switch (volume->resource.map_binding) ++ { ++ case WINED3D_LOCATION_BUFFER: ++ gl_info = context->gl_info; ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->pbo)); ++ ++ if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) ++ { ++ GLbitfield mapflags = wined3d_resource_gl_map_flags(flags); ++ mapflags &= ~GL_MAP_FLUSH_EXPLICIT_BIT; ++ ptr = GL_EXTCALL(glMapBufferRange(GL_PIXEL_UNPACK_BUFFER_ARB, ++ 0, volume->resource.size, mapflags)); ++ } ++ else ++ { ++ GLenum access = wined3d_resource_gl_legacy_map_flags(flags); ++ ptr = GL_EXTCALL(glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, access)); ++ } ++ ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); ++ checkGLcall("Map PBO"); ++ return ptr; ++ ++ case WINED3D_LOCATION_SYSMEM: ++ return volume->resource.heap_memory; ++ ++ default: ++ ERR("Unexpected map binding %s.\n", wined3d_debug_location(volume->resource.map_binding)); ++ return NULL; ++ } ++} ++ + HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags) + { + struct wined3d_device *device = volume->resource.device; + struct wined3d_context *context; +- const struct wined3d_gl_info *gl_info; + BYTE *base_memory; + const struct wined3d_format *format = volume->resource.format; + +@@ -512,58 +567,22 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + + flags = wined3d_resource_sanitize_map_flags(&volume->resource, flags); + +- if (volume->resource.map_binding == WINED3D_LOCATION_BUFFER) ++ context = context_acquire(device, NULL); ++ if (!wined3d_volume_prepare_map_memory(volume, context)) + { +- context = context_acquire(device, NULL); +- gl_info = context->gl_info; +- +- wined3d_volume_prepare_pbo(volume, context); +- if (flags & WINED3D_MAP_DISCARD) +- wined3d_resource_validate_location(&volume->resource, WINED3D_LOCATION_BUFFER); +- else +- wined3d_resource_load_location(&volume->resource, context, WINED3D_LOCATION_BUFFER); +- +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->pbo)); +- +- if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) +- { +- GLbitfield mapflags = wined3d_resource_gl_map_flags(flags); +- mapflags &= ~GL_MAP_FLUSH_EXPLICIT_BIT; +- base_memory = GL_EXTCALL(glMapBufferRange(GL_PIXEL_UNPACK_BUFFER_ARB, +- 0, volume->resource.size, mapflags)); +- } +- else +- { +- GLenum access = wined3d_resource_gl_legacy_map_flags(flags); +- base_memory = GL_EXTCALL(glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, access)); +- } +- +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); +- checkGLcall("Map PBO"); +- ++ WARN("Out of memory.\n"); ++ map_desc->data = NULL; + context_release(context); ++ return E_OUTOFMEMORY; + } ++ ++ if (flags & WINED3D_MAP_DISCARD) ++ wined3d_resource_validate_location(&volume->resource, volume->resource.map_binding); + else +- { +- if (!volume_prepare_system_memory(volume)) +- { +- WARN("Out of memory.\n"); +- map_desc->data = NULL; +- return E_OUTOFMEMORY; +- } ++ wined3d_resource_load_location(&volume->resource, context, volume->resource.map_binding); + +- if (flags & WINED3D_MAP_DISCARD) +- { +- wined3d_resource_validate_location(&volume->resource, WINED3D_LOCATION_SYSMEM); +- } +- else if (!(volume->resource.locations & WINED3D_LOCATION_SYSMEM)) +- { +- context = context_acquire(device, NULL); +- wined3d_resource_load_location(&volume->resource, context, WINED3D_LOCATION_SYSMEM); +- context_release(context); +- } +- base_memory = volume->resource.heap_memory; +- } ++ base_memory = wined3d_volume_get_map_ptr(volume, context, flags); ++ context_release(context); + + TRACE("Base memory pointer %p.\n", base_memory); + +@@ -621,8 +640,34 @@ struct wined3d_volume * CDECL wined3d_volume_from_resource(struct wined3d_resour + return volume_from_resource(resource); + } + ++static void wined3d_volume_release_map_ptr(const struct wined3d_volume *volume, ++ const struct wined3d_context *context) ++{ ++ const struct wined3d_gl_info *gl_info; ++ ++ switch (volume->resource.map_binding) ++ { ++ case WINED3D_LOCATION_BUFFER: ++ gl_info = context->gl_info; ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->pbo)); ++ GL_EXTCALL(glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); ++ checkGLcall("Unmap PBO"); ++ return; ++ ++ case WINED3D_LOCATION_SYSMEM: ++ return; ++ ++ default: ++ ERR("Unexpected map binding %s.\n", wined3d_debug_location(volume->resource.map_binding)); ++ return; ++ } ++} ++ + HRESULT CDECL wined3d_volume_unmap(struct wined3d_volume *volume) + { ++ struct wined3d_device *device = volume->resource.device; ++ struct wined3d_context *context; + TRACE("volume %p.\n", volume); + + if (!volume->resource.map_count) +@@ -631,19 +676,9 @@ HRESULT CDECL wined3d_volume_unmap(struct wined3d_volume *volume) + return WINED3DERR_INVALIDCALL; + } + +- if (volume->resource.map_binding == WINED3D_LOCATION_BUFFER) +- { +- struct wined3d_device *device = volume->resource.device; +- struct wined3d_context *context = context_acquire(device, NULL); +- const struct wined3d_gl_info *gl_info = context->gl_info; +- +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->pbo)); +- GL_EXTCALL(glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB)); +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); +- checkGLcall("Unmap PBO"); +- +- context_release(context); +- } ++ context = context_acquire(device, NULL); ++ wined3d_volume_release_map_ptr(volume, context); ++ context_release(context); + + volume->resource.map_count--; + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0020-wined3d-Move-volume-PBO-infrastructure-into-the-reso.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0020-wined3d-Move-volume-PBO-infrastructure-into-the-reso.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0020-wined3d-Move-volume-PBO-infrastructure-into-the-reso.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0020-wined3d-Move-volume-PBO-infrastructure-into-the-reso.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,311 @@ +From b416ab9ae21fee5c8253969318c55156c1d5fc0a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 16 Jan 2014 22:07:17 +0100 +Subject: wined3d: Move volume PBO infrastructure into the resource. + +--- + dlls/wined3d/resource.c | 64 +++++++++++++++++++++++++++++- + dlls/wined3d/volume.c | 90 +++++++----------------------------------- + dlls/wined3d/wined3d_private.h | 7 +++- + 3 files changed, 82 insertions(+), 79 deletions(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 63f8584..d904c36 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -292,7 +292,7 @@ GLbitfield wined3d_resource_gl_map_flags(DWORD d3d_flags) + return ret; + } + +-GLenum wined3d_resource_gl_legacy_map_flags(DWORD d3d_flags) ++static GLenum wined3d_resource_gl_legacy_map_flags(DWORD d3d_flags) + { + if (d3d_flags & WINED3D_MAP_READONLY) + return GL_READ_ONLY_ARB; +@@ -398,6 +398,68 @@ void wined3d_resource_load_location(struct wined3d_resource *resource, + resource->resource_ops->resource_load_location(resource, context, location); + } + ++BYTE *wined3d_resource_get_map_ptr(const struct wined3d_resource *resource, ++ const struct wined3d_context *context, DWORD flags) ++{ ++ const struct wined3d_gl_info *gl_info; ++ BYTE *ptr; ++ ++ switch (resource->map_binding) ++ { ++ case WINED3D_LOCATION_BUFFER: ++ gl_info = context->gl_info; ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, resource->buffer_object)); ++ ++ if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) ++ { ++ GLbitfield mapflags = wined3d_resource_gl_map_flags(flags); ++ mapflags &= ~GL_MAP_FLUSH_EXPLICIT_BIT; ++ ptr = GL_EXTCALL(glMapBufferRange(GL_PIXEL_UNPACK_BUFFER_ARB, ++ 0, resource->size, mapflags)); ++ } ++ else ++ { ++ GLenum access = wined3d_resource_gl_legacy_map_flags(flags); ++ ptr = GL_EXTCALL(glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, access)); ++ } ++ ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); ++ checkGLcall("Map GL buffer"); ++ return ptr; ++ ++ case WINED3D_LOCATION_SYSMEM: ++ return resource->heap_memory; ++ ++ default: ++ ERR("Unexpected map binding %s.\n", wined3d_debug_location(resource->map_binding)); ++ return NULL; ++ } ++} ++ ++void wined3d_resource_release_map_ptr(const struct wined3d_resource *resource, ++ const struct wined3d_context *context) ++{ ++ const struct wined3d_gl_info *gl_info; ++ ++ switch (resource->map_binding) ++ { ++ case WINED3D_LOCATION_BUFFER: ++ gl_info = context->gl_info; ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, resource->buffer_object)); ++ GL_EXTCALL(glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); ++ checkGLcall("Unmap GL buffer"); ++ return; ++ ++ case WINED3D_LOCATION_SYSMEM: ++ return; ++ ++ default: ++ ERR("Unexpected map binding %s.\n", wined3d_debug_location(resource->map_binding)); ++ return; ++ } ++} ++ + void CDECL wined3d_resource_get_pitch(const struct wined3d_resource *resource, UINT *row_pitch, + UINT *slice_pitch) + { +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index ee64070..1e03097 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -215,7 +215,7 @@ static void wined3d_volume_load_location(struct wined3d_resource *resource, + } + else if (volume->resource.locations & WINED3D_LOCATION_BUFFER) + { +- struct wined3d_bo_address data = {volume->pbo, NULL}; ++ struct wined3d_bo_address data = {volume->resource.buffer_object, NULL}; + wined3d_volume_upload_data(volume, context, &data); + } + else if (volume->resource.locations & WINED3D_LOCATION_TEXTURE_RGB) +@@ -269,7 +269,7 @@ static void wined3d_volume_load_location(struct wined3d_resource *resource, + break; + + case WINED3D_LOCATION_BUFFER: +- if (!volume->pbo) ++ if (!volume->resource.buffer_object) + ERR("Trying to load WINED3D_LOCATION_BUFFER without setting it up first.\n"); + + if (volume->resource.locations & WINED3D_LOCATION_DISCARDED) +@@ -279,7 +279,7 @@ static void wined3d_volume_load_location(struct wined3d_resource *resource, + } + else if (volume->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) + { +- struct wined3d_bo_address data = {volume->pbo, NULL}; ++ struct wined3d_bo_address data = {volume->resource.buffer_object, NULL}; + + if (volume->resource.locations & WINED3D_LOCATION_TEXTURE_RGB) + wined3d_texture_bind_and_dirtify(volume->container, context, FALSE); +@@ -316,16 +316,16 @@ static void wined3d_volume_prepare_pbo(struct wined3d_volume *volume, struct win + { + const struct wined3d_gl_info *gl_info = context->gl_info; + +- if (volume->pbo) ++ if (volume->resource.buffer_object) + return; + +- GL_EXTCALL(glGenBuffersARB(1, &volume->pbo)); +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->pbo)); ++ GL_EXTCALL(glGenBuffersARB(1, &volume->resource.buffer_object)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->resource.buffer_object)); + GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->resource.size, NULL, GL_STREAM_DRAW_ARB)); + GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); + checkGLcall("Create PBO"); + +- TRACE("Created PBO %u for volume %p.\n", volume->pbo, volume); ++ TRACE("Created PBO %u for volume %p.\n", volume->resource.buffer_object, volume); + } + + static void wined3d_volume_free_pbo(struct wined3d_volume *volume) +@@ -333,10 +333,10 @@ static void wined3d_volume_free_pbo(struct wined3d_volume *volume) + struct wined3d_context *context = context_acquire(volume->resource.device, NULL); + const struct wined3d_gl_info *gl_info = context->gl_info; + +- TRACE("Deleting PBO %u belonging to volume %p.\n", volume->pbo, volume); +- GL_EXTCALL(glDeleteBuffersARB(1, &volume->pbo)); ++ TRACE("Deleting PBO %u belonging to volume %p.\n", volume->resource.buffer_object, volume); ++ GL_EXTCALL(glDeleteBuffersARB(1, &volume->resource.buffer_object)); + checkGLcall("glDeleteBuffersARB"); +- volume->pbo = 0; ++ volume->resource.buffer_object = 0; + context_release(context); + } + +@@ -344,7 +344,7 @@ void wined3d_volume_destroy(struct wined3d_volume *volume) + { + TRACE("volume %p.\n", volume); + +- if (volume->pbo) ++ if (volume->resource.buffer_object) + wined3d_volume_free_pbo(volume); + + resource_cleanup(&volume->resource); +@@ -377,7 +377,7 @@ static void volume_unload(struct wined3d_resource *resource) + wined3d_resource_invalidate_location(&volume->resource, ~WINED3D_LOCATION_DISCARDED); + } + +- if (volume->pbo) ++ if (volume->resource.buffer_object) + { + /* Should not happen because only dynamic default pool volumes + * have a buffer, and those are not evicted by device_evit_managed_resources +@@ -493,44 +493,6 @@ static BOOL wined3d_volume_prepare_map_memory(struct wined3d_volume *volume, str + } + } + +-static BYTE *wined3d_volume_get_map_ptr(const struct wined3d_volume *volume, +- const struct wined3d_context *context, DWORD flags) +-{ +- const struct wined3d_gl_info *gl_info; +- BYTE *ptr; +- +- switch (volume->resource.map_binding) +- { +- case WINED3D_LOCATION_BUFFER: +- gl_info = context->gl_info; +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->pbo)); +- +- if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) +- { +- GLbitfield mapflags = wined3d_resource_gl_map_flags(flags); +- mapflags &= ~GL_MAP_FLUSH_EXPLICIT_BIT; +- ptr = GL_EXTCALL(glMapBufferRange(GL_PIXEL_UNPACK_BUFFER_ARB, +- 0, volume->resource.size, mapflags)); +- } +- else +- { +- GLenum access = wined3d_resource_gl_legacy_map_flags(flags); +- ptr = GL_EXTCALL(glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, access)); +- } +- +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); +- checkGLcall("Map PBO"); +- return ptr; +- +- case WINED3D_LOCATION_SYSMEM: +- return volume->resource.heap_memory; +- +- default: +- ERR("Unexpected map binding %s.\n", wined3d_debug_location(volume->resource.map_binding)); +- return NULL; +- } +-} +- + HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags) + { +@@ -581,7 +543,7 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + else + wined3d_resource_load_location(&volume->resource, context, volume->resource.map_binding); + +- base_memory = wined3d_volume_get_map_ptr(volume, context, flags); ++ base_memory = wined3d_resource_get_map_ptr(&volume->resource, context, flags); + context_release(context); + + TRACE("Base memory pointer %p.\n", base_memory); +@@ -640,30 +602,6 @@ struct wined3d_volume * CDECL wined3d_volume_from_resource(struct wined3d_resour + return volume_from_resource(resource); + } + +-static void wined3d_volume_release_map_ptr(const struct wined3d_volume *volume, +- const struct wined3d_context *context) +-{ +- const struct wined3d_gl_info *gl_info; +- +- switch (volume->resource.map_binding) +- { +- case WINED3D_LOCATION_BUFFER: +- gl_info = context->gl_info; +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->pbo)); +- GL_EXTCALL(glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB)); +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); +- checkGLcall("Unmap PBO"); +- return; +- +- case WINED3D_LOCATION_SYSMEM: +- return; +- +- default: +- ERR("Unexpected map binding %s.\n", wined3d_debug_location(volume->resource.map_binding)); +- return; +- } +-} +- + HRESULT CDECL wined3d_volume_unmap(struct wined3d_volume *volume) + { + struct wined3d_device *device = volume->resource.device; +@@ -677,7 +615,7 @@ HRESULT CDECL wined3d_volume_unmap(struct wined3d_volume *volume) + } + + context = context_acquire(device, NULL); +- wined3d_volume_release_map_ptr(volume, context); ++ wined3d_resource_release_map_ptr(&volume->resource, context); + context_release(context); + + volume->resource.map_count--; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 059310b..9285ab8 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2083,6 +2083,7 @@ struct wined3d_resource + UINT size; + DWORD priority; + void *heap_memory, *user_memory, *bitmap_data; ++ GLuint buffer_object; + UINT custom_row_pitch, custom_slice_pitch; + struct list resource_list_entry; + DWORD locations; +@@ -2113,12 +2114,15 @@ void resource_unload(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + DWORD wined3d_resource_access_from_location(DWORD location) DECLSPEC_HIDDEN; + BOOL wined3d_resource_allocate_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_free_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++BYTE *wined3d_resource_get_map_ptr(const struct wined3d_resource *resource, ++ const struct wined3d_context *context, DWORD flags) DECLSPEC_HIDDEN; + GLbitfield wined3d_resource_gl_map_flags(DWORD d3d_flags) DECLSPEC_HIDDEN; +-GLenum wined3d_resource_gl_legacy_map_flags(DWORD d3d_flags) DECLSPEC_HIDDEN; + void wined3d_resource_invalidate_location(struct wined3d_resource *resource, DWORD location) DECLSPEC_HIDDEN; + BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_load_location(struct wined3d_resource *resource, + struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; ++void wined3d_resource_release_map_ptr(const struct wined3d_resource *resource, ++ const struct wined3d_context *context) DECLSPEC_HIDDEN; + DWORD wined3d_resource_sanitize_map_flags(const struct wined3d_resource *resource, DWORD flags) DECLSPEC_HIDDEN; + void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_validate_location(struct wined3d_resource *resource, DWORD location) DECLSPEC_HIDDEN; +@@ -2248,7 +2252,6 @@ struct wined3d_volume + DWORD flags; + GLint texture_level; + DWORD download_count; +- GLuint pbo; + }; + + static inline struct wined3d_volume *volume_from_resource(struct wined3d_resource *resource) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0021-wined3d-Remove-surface-pbo.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0021-wined3d-Remove-surface-pbo.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0021-wined3d-Remove-surface-pbo.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0021-wined3d-Remove-surface-pbo.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,160 @@ +From f6bb878818089d9f8f735ce5e2e4495f40ce7ec8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 21 Jan 2014 13:25:48 +0100 +Subject: wined3d: Remove surface->pbo. + +--- + dlls/wined3d/surface.c | 42 +++++++++++++++++++++--------------------- + dlls/wined3d/wined3d_private.h | 2 -- + 2 files changed, 21 insertions(+), 23 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 6154315..4a2b636 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -46,7 +46,7 @@ static void surface_cleanup(struct wined3d_surface *surface) + + TRACE("surface %p.\n", surface); + +- if (surface->pbo || surface->rb_multisample ++ if (surface->resource.buffer_object || surface->rb_multisample + || surface->rb_resolved || !list_empty(&surface->renderbuffers)) + { + struct wined3d_renderbuffer_entry *entry, *entry2; +@@ -56,10 +56,10 @@ static void surface_cleanup(struct wined3d_surface *surface) + context = context_acquire(surface->resource.device, NULL); + gl_info = context->gl_info; + +- if (surface->pbo) ++ if (surface->resource.buffer_object) + { +- TRACE("Deleting PBO %u.\n", surface->pbo); +- GL_EXTCALL(glDeleteBuffersARB(1, &surface->pbo)); ++ TRACE("Deleting PBO %u.\n", surface->resource.buffer_object); ++ GL_EXTCALL(glDeleteBuffersARB(1, &surface->resource.buffer_object)); + } + + if (surface->rb_multisample) +@@ -485,7 +485,7 @@ static void surface_get_memory(const struct wined3d_surface *surface, struct win + if (location & WINED3D_LOCATION_BUFFER) + { + data->addr = NULL; +- data->buffer_object = surface->pbo; ++ data->buffer_object = surface->resource.buffer_object; + return; + } + if (location & WINED3D_LOCATION_USER_MEMORY) +@@ -518,20 +518,20 @@ static void surface_prepare_buffer(struct wined3d_surface *surface) + GLenum error; + const struct wined3d_gl_info *gl_info; + +- if (surface->pbo) ++ if (surface->resource.buffer_object) + return; + + context = context_acquire(surface->resource.device, NULL); + gl_info = context->gl_info; + +- GL_EXTCALL(glGenBuffersARB(1, &surface->pbo)); ++ GL_EXTCALL(glGenBuffersARB(1, &surface->resource.buffer_object)); + error = gl_info->gl_ops.gl.p_glGetError(); +- if (!surface->pbo || error != GL_NO_ERROR) ++ if (!surface->resource.buffer_object || error != GL_NO_ERROR) + ERR("Failed to create a PBO with error %s (%#x).\n", debug_glerror(error), error); + +- TRACE("Binding PBO %u.\n", surface->pbo); ++ TRACE("Binding PBO %u.\n", surface->resource.buffer_object); + +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->pbo)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->resource.buffer_object)); + checkGLcall("glBindBufferARB"); + + GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->resource.size + 4, +@@ -735,7 +735,7 @@ static void surface_unmap(struct wined3d_surface *surface) + context = context_acquire(device, NULL); + gl_info = context->gl_info; + +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->pbo)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->resource.buffer_object)); + GL_EXTCALL(glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB)); + GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); + checkGLcall("glUnmapBufferARB"); +@@ -1181,10 +1181,10 @@ HRESULT CDECL wined3d_surface_get_render_target_data(struct wined3d_surface *sur + /* Context activation is done by the caller. */ + static void surface_remove_pbo(struct wined3d_surface *surface, const struct wined3d_gl_info *gl_info) + { +- GL_EXTCALL(glDeleteBuffersARB(1, &surface->pbo)); +- checkGLcall("glDeleteBuffersARB(1, &surface->pbo)"); ++ GL_EXTCALL(glDeleteBuffersARB(1, &surface->resource.buffer_object)); ++ checkGLcall("glDeleteBuffersARB(1, &surface->resource.buffer_object)"); + +- surface->pbo = 0; ++ surface->resource.buffer_object = 0; + wined3d_resource_invalidate_location(&surface->resource, WINED3D_LOCATION_BUFFER); + } + +@@ -1241,7 +1241,7 @@ static void surface_unload(struct wined3d_resource *resource) + } + + /* Destroy PBOs, but load them into real sysmem before */ +- if (surface->pbo) ++ if (surface->resource.buffer_object) + surface_remove_pbo(surface, gl_info); + + /* Destroy fbo render buffers. This is needed for implicit render targets, for +@@ -2683,7 +2683,7 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + context = context_acquire(device, NULL); + gl_info = context->gl_info; + +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->pbo)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->resource.buffer_object)); + base_memory = GL_EXTCALL(glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_READ_WRITE_ARB)); + GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); + checkGLcall("map PBO"); +@@ -2774,7 +2774,7 @@ HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc) + } + if (!(surface->resource.map_binding == WINED3D_LOCATION_USER_MEMORY + || surface->container->flags & WINED3D_TEXTURE_PIN_SYSMEM +- || surface->pbo)) ++ || surface->resource.buffer_object)) + surface->resource.map_binding = WINED3D_LOCATION_DIB; + } + +@@ -3055,9 +3055,9 @@ void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) + + /* Flip the PBO */ + { +- GLuint tmp_pbo = front->pbo; +- front->pbo = back->pbo; +- back->pbo = tmp_pbo; ++ GLuint tmp_pbo = front->resource.buffer_object; ++ front->resource.buffer_object = back->resource.buffer_object; ++ back->resource.buffer_object = tmp_pbo; + } + + /* Flip the opengl texture */ +@@ -4234,7 +4234,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + /* Don't use PBOs for converted surfaces. During PBO conversion we look at + * WINED3D_TEXTURE_CONVERTED but it isn't set (yet) in all cases it is + * getting called. */ +- if ((format.convert || conversion) && surface->pbo) ++ if ((format.convert || conversion) && surface->resource.buffer_object) + { + TRACE("Removing the pbo attached to surface %p.\n", surface); + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 9285ab8..8dbee1a 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2310,8 +2310,6 @@ struct wined3d_surface + UINT pow2Width; + UINT pow2Height; + +- /* PBO */ +- GLuint pbo; + GLuint rb_multisample; + GLuint rb_resolved; + GLenum texture_target; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0022-wined3d-Use-resource-buffer-mapping-facilities-in-su.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0022-wined3d-Use-resource-buffer-mapping-facilities-in-su.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0022-wined3d-Use-resource-buffer-mapping-facilities-in-su.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0022-wined3d-Use-resource-buffer-mapping-facilities-in-su.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,177 @@ +From f3a0af1c19472f9af90881b17ffe0352285b5d64 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 21 Jan 2014 13:30:59 +0100 +Subject: wined3d: Use resource buffer mapping facilities in surfaces. + +--- + dlls/wined3d/resource.c | 8 +++++ + dlls/wined3d/surface.c | 78 ++++++++++--------------------------------------- + 2 files changed, 23 insertions(+), 63 deletions(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index d904c36..c0e4d70 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -430,6 +430,12 @@ BYTE *wined3d_resource_get_map_ptr(const struct wined3d_resource *resource, + case WINED3D_LOCATION_SYSMEM: + return resource->heap_memory; + ++ case WINED3D_LOCATION_DIB: ++ return resource->bitmap_data; ++ ++ case WINED3D_LOCATION_USER_MEMORY: ++ return resource->user_memory; ++ + default: + ERR("Unexpected map binding %s.\n", wined3d_debug_location(resource->map_binding)); + return NULL; +@@ -452,6 +458,8 @@ void wined3d_resource_release_map_ptr(const struct wined3d_resource *resource, + return; + + case WINED3D_LOCATION_SYSMEM: ++ case WINED3D_LOCATION_DIB: ++ case WINED3D_LOCATION_USER_MEMORY: + return; + + default: +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 4a2b636..4be6a50 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -716,36 +716,10 @@ static HRESULT surface_private_setup(struct wined3d_surface *surface) + + static void surface_unmap(struct wined3d_surface *surface) + { +- struct wined3d_device *device = surface->resource.device; +- const struct wined3d_gl_info *gl_info; +- struct wined3d_context *context; +- + TRACE("surface %p.\n", surface); + + memset(&surface->lockedRect, 0, sizeof(surface->lockedRect)); + +- switch (surface->resource.map_binding) +- { +- case WINED3D_LOCATION_SYSMEM: +- case WINED3D_LOCATION_USER_MEMORY: +- case WINED3D_LOCATION_DIB: +- break; +- +- case WINED3D_LOCATION_BUFFER: +- context = context_acquire(device, NULL); +- gl_info = context->gl_info; +- +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->resource.buffer_object)); +- GL_EXTCALL(glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB)); +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); +- checkGLcall("glUnmapBufferARB"); +- context_release(context); +- break; +- +- default: +- ERR("Unexpected map binding %s.\n", wined3d_debug_location(surface->resource.map_binding)); +- } +- + if (surface->resource.locations & (WINED3D_LOCATION_DRAWABLE | WINED3D_LOCATION_TEXTURE_RGB)) + { + TRACE("Not dirtified, nothing to do.\n"); +@@ -2579,6 +2553,8 @@ struct wined3d_surface * CDECL wined3d_surface_from_resource(struct wined3d_reso + + HRESULT CDECL wined3d_surface_unmap(struct wined3d_surface *surface) + { ++ struct wined3d_device *device = surface->resource.device; ++ struct wined3d_context *context = NULL; + TRACE("surface %p.\n", surface); + + if (!surface->resource.map_count) +@@ -2588,6 +2564,12 @@ HRESULT CDECL wined3d_surface_unmap(struct wined3d_surface *surface) + } + --surface->resource.map_count; + ++ if (device->d3d_initialized) ++ context = context_acquire(device, NULL); ++ wined3d_resource_release_map_ptr(&surface->resource, context); ++ if (context) ++ context_release(context); ++ + surface->surface_ops->surface_unmap(surface); + + return WINED3D_OK; +@@ -2598,8 +2580,7 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + { + const struct wined3d_format *format = surface->resource.format; + struct wined3d_device *device = surface->resource.device; +- struct wined3d_context *context; +- const struct wined3d_gl_info *gl_info; ++ struct wined3d_context *context = NULL; + BYTE *base_memory; + + TRACE("surface %p, map_desc %p, rect %s, flags %#x.\n", +@@ -2641,6 +2622,9 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + } + } + ++ if (device->d3d_initialized) ++ context = context_acquire(device, NULL); ++ + surface_prepare_map_memory(surface); + if (flags & WINED3D_MAP_DISCARD) + { +@@ -2650,51 +2634,19 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + } + else + { +- struct wined3d_context *context = NULL; +- + if (surface->resource.usage & WINED3DUSAGE_DYNAMIC) + WARN_(d3d_perf)("Mapping a dynamic surface without WINED3D_MAP_DISCARD.\n"); + +- if (surface->resource.device->d3d_initialized) +- context = context_acquire(surface->resource.device, NULL); + wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); +- if (context) +- context_release(context); + } + + if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY))) + wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); + +- switch (surface->resource.map_binding) +- { +- case WINED3D_LOCATION_SYSMEM: +- base_memory = surface->resource.heap_memory; +- break; +- +- case WINED3D_LOCATION_USER_MEMORY: +- base_memory = surface->resource.user_memory; +- break; +- +- case WINED3D_LOCATION_DIB: +- base_memory = surface->resource.bitmap_data; +- break; +- +- case WINED3D_LOCATION_BUFFER: +- context = context_acquire(device, NULL); +- gl_info = context->gl_info; ++ base_memory = wined3d_resource_get_map_ptr(&surface->resource, context, flags); + +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->resource.buffer_object)); +- base_memory = GL_EXTCALL(glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_READ_WRITE_ARB)); +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); +- checkGLcall("map PBO"); +- +- context_release(context); +- break; +- +- default: +- ERR("Unexpected map binding %s.\n", wined3d_debug_location(surface->resource.map_binding)); +- base_memory = NULL; +- } ++ if (context) ++ context_release(context); + + if (format->flags & WINED3DFMT_FLAG_BROKEN_PITCH) + map_desc->row_pitch = surface->resource.width * format->byte_count; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0023-wined3d-Move-buffer-creation-into-the-resource.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0023-wined3d-Move-buffer-creation-into-the-resource.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0023-wined3d-Move-buffer-creation-into-the-resource.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0023-wined3d-Move-buffer-creation-into-the-resource.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,278 @@ +From df1b8896b325fb67b08f7cc8b6656d7166b451c2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 18 Sep 2013 22:49:34 +0200 +Subject: wined3d: Move buffer creation into the resource. + +More code from volume_unload can be moved to resource_unload eventually. +Before doing that, surfaces and buffers have to be migrated to the new +location scheme. Otherwise the unimplemented buffer_load_location and +surface_load_location will write a lot of ERRs. +--- + dlls/wined3d/resource.c | 66 ++++++++++++++++++++++++++++++++++++ + dlls/wined3d/texture.c | 2 +- + dlls/wined3d/volume.c | 76 ++---------------------------------------- + dlls/wined3d/wined3d_private.h | 4 ++- + 4 files changed, 72 insertions(+), 76 deletions(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index c0e4d70..d5ec71f 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -142,6 +142,18 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device * + return WINED3D_OK; + } + ++static void wined3d_resource_free_bo(struct wined3d_resource *resource) ++{ ++ struct wined3d_context *context = context_acquire(resource->device, NULL); ++ const struct wined3d_gl_info *gl_info = context->gl_info; ++ ++ TRACE("Deleting GL buffer %u belonging to resource %p.\n", resource->buffer_object, resource); ++ GL_EXTCALL(glDeleteBuffersARB(1, &resource->buffer_object)); ++ checkGLcall("glDeleteBuffersARB"); ++ resource->buffer_object = 0; ++ context_release(context); ++} ++ + void resource_cleanup(struct wined3d_resource *resource) + { + const struct wined3d *d3d = resource->device->wined3d; +@@ -154,6 +166,9 @@ void resource_cleanup(struct wined3d_resource *resource) + adapter_adjust_memory(resource->device->adapter, (INT64)0 - resource->size); + } + ++ if (resource->buffer_object) ++ wined3d_resource_free_bo(resource); ++ + wined3d_resource_free_sysmem(resource); + + device_resource_released(resource->device, resource); +@@ -164,6 +179,9 @@ void resource_unload(struct wined3d_resource *resource) + if (resource->map_count) + ERR("Resource %p is being unloaded while mapped.\n", resource); + ++ if (resource->buffer_object) ++ wined3d_resource_free_bo(resource); ++ + context_resource_unloaded(resource->device, + resource, resource->type); + } +@@ -468,6 +486,54 @@ void wined3d_resource_release_map_ptr(const struct wined3d_resource *resource, + } + } + ++/* Context activation is done by the caller. */ ++static void wined3d_resource_prepare_bo(struct wined3d_resource *resource, const struct wined3d_context *context) ++{ ++ const struct wined3d_gl_info *gl_info = context->gl_info; ++ ++ if (resource->buffer_object) ++ return; ++ ++ GL_EXTCALL(glGenBuffersARB(1, &resource->buffer_object)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, resource->buffer_object)); ++ GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, resource->size, NULL, GL_STREAM_DRAW_ARB)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); ++ checkGLcall("Create GL buffer"); ++ ++ TRACE("Created GL buffer %u for resource %p.\n", resource->buffer_object, resource); ++} ++ ++BOOL wined3d_resource_prepare_system_memory(struct wined3d_resource *resource) ++{ ++ if (resource->heap_memory) ++ return TRUE; ++ ++ if (!wined3d_resource_allocate_sysmem(resource)) ++ { ++ ERR("Failed to allocate system memory.\n"); ++ return FALSE; ++ } ++ return TRUE; ++} ++ ++/* Context activation is done by the caller. */ ++BOOL wined3d_resource_prepare_map_memory(struct wined3d_resource *resource, struct wined3d_context *context) ++{ ++ switch (resource->map_binding) ++ { ++ case WINED3D_LOCATION_BUFFER: ++ wined3d_resource_prepare_bo(resource, context); ++ return TRUE; ++ ++ case WINED3D_LOCATION_SYSMEM: ++ return wined3d_resource_prepare_system_memory(resource); ++ ++ default: ++ ERR("Unexpected map binding %s.\n", wined3d_debug_location(resource->map_binding)); ++ return FALSE; ++ } ++} ++ + void CDECL wined3d_resource_get_pitch(const struct wined3d_resource *resource, UINT *row_pitch, + UINT *slice_pitch) + { +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index 48717d7..41cf61d 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -1316,7 +1316,7 @@ static void texture3d_prepare_texture(struct wined3d_texture *texture, struct wi + void *mem = NULL; + + if (gl_info->supported[APPLE_CLIENT_STORAGE] && !format->convert +- && volume_prepare_system_memory(volume)) ++ && wined3d_resource_prepare_system_memory(&volume->resource)) + { + TRACE("Enabling GL_UNPACK_CLIENT_STORAGE_APPLE for volume %p\n", volume); + gl_info->gl_ops.gl.p_glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE); +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index 1e03097..a40d9f0 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -27,19 +27,6 @@ + WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface); + WINE_DECLARE_DEBUG_CHANNEL(d3d_perf); + +-BOOL volume_prepare_system_memory(struct wined3d_volume *volume) +-{ +- if (volume->resource.heap_memory) +- return TRUE; +- +- if (!wined3d_resource_allocate_sysmem(&volume->resource)) +- { +- ERR("Failed to allocate system memory.\n"); +- return FALSE; +- } +- return TRUE; +-} +- + /* Context activation is done by the caller. */ + void wined3d_volume_upload_data(struct wined3d_volume *volume, const struct wined3d_context *context, + const struct wined3d_bo_address *data) +@@ -311,42 +298,10 @@ void wined3d_volume_load(struct wined3d_volume *volume, struct wined3d_context * + srgb_mode ? WINED3D_LOCATION_TEXTURE_SRGB : WINED3D_LOCATION_TEXTURE_RGB); + } + +-/* Context activation is done by the caller. */ +-static void wined3d_volume_prepare_pbo(struct wined3d_volume *volume, struct wined3d_context *context) +-{ +- const struct wined3d_gl_info *gl_info = context->gl_info; +- +- if (volume->resource.buffer_object) +- return; +- +- GL_EXTCALL(glGenBuffersARB(1, &volume->resource.buffer_object)); +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->resource.buffer_object)); +- GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->resource.size, NULL, GL_STREAM_DRAW_ARB)); +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); +- checkGLcall("Create PBO"); +- +- TRACE("Created PBO %u for volume %p.\n", volume->resource.buffer_object, volume); +-} +- +-static void wined3d_volume_free_pbo(struct wined3d_volume *volume) +-{ +- struct wined3d_context *context = context_acquire(volume->resource.device, NULL); +- const struct wined3d_gl_info *gl_info = context->gl_info; +- +- TRACE("Deleting PBO %u belonging to volume %p.\n", volume->resource.buffer_object, volume); +- GL_EXTCALL(glDeleteBuffersARB(1, &volume->resource.buffer_object)); +- checkGLcall("glDeleteBuffersARB"); +- volume->resource.buffer_object = 0; +- context_release(context); +-} +- + void wined3d_volume_destroy(struct wined3d_volume *volume) + { + TRACE("volume %p.\n", volume); + +- if (volume->resource.buffer_object) +- wined3d_volume_free_pbo(volume); +- + resource_cleanup(&volume->resource); + volume->resource.parent_ops->wined3d_object_destroyed(volume->resource.parent); + HeapFree(GetProcessHeap(), 0, volume); +@@ -363,7 +318,7 @@ static void volume_unload(struct wined3d_resource *resource) + + TRACE("texture %p.\n", resource); + +- if (volume_prepare_system_memory(volume)) ++ if (wined3d_resource_prepare_system_memory(&volume->resource)) + { + context = context_acquire(device, NULL); + wined3d_resource_load_location(&volume->resource, context, WINED3D_LOCATION_SYSMEM); +@@ -377,15 +332,6 @@ static void volume_unload(struct wined3d_resource *resource) + wined3d_resource_invalidate_location(&volume->resource, ~WINED3D_LOCATION_DISCARDED); + } + +- if (volume->resource.buffer_object) +- { +- /* Should not happen because only dynamic default pool volumes +- * have a buffer, and those are not evicted by device_evit_managed_resources +- * and must be freed before a non-ex device reset. */ +- ERR("Unloading a volume with a buffer\n"); +- wined3d_volume_free_pbo(volume); +- } +- + /* The texture name is managed by the container. */ + volume->flags &= ~WINED3D_VFLAG_CLIENT_STORAGE; + +@@ -475,24 +421,6 @@ static BOOL wined3d_volume_check_box_dimensions(const struct wined3d_volume *vol + return TRUE; + } + +-/* Context activation is done by the caller. */ +-static BOOL wined3d_volume_prepare_map_memory(struct wined3d_volume *volume, struct wined3d_context *context) +-{ +- switch (volume->resource.map_binding) +- { +- case WINED3D_LOCATION_BUFFER: +- wined3d_volume_prepare_pbo(volume, context); +- return TRUE; +- +- case WINED3D_LOCATION_SYSMEM: +- return volume_prepare_system_memory(volume); +- +- default: +- ERR("Unexpected map binding %s.\n", wined3d_debug_location(volume->resource.map_binding)); +- return FALSE; +- } +-} +- + HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags) + { +@@ -530,7 +458,7 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + flags = wined3d_resource_sanitize_map_flags(&volume->resource, flags); + + context = context_acquire(device, NULL); +- if (!wined3d_volume_prepare_map_memory(volume, context)) ++ if (!wined3d_resource_prepare_map_memory(&volume->resource, context)) + { + WARN("Out of memory.\n"); + map_desc->data = NULL; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 8dbee1a..9353e57 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2121,6 +2121,9 @@ void wined3d_resource_invalidate_location(struct wined3d_resource *resource, DWO + BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_load_location(struct wined3d_resource *resource, + struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; ++BOOL wined3d_resource_prepare_map_memory(struct wined3d_resource *resource, ++ struct wined3d_context *context) DECLSPEC_HIDDEN; ++BOOL wined3d_resource_prepare_system_memory(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_release_map_ptr(const struct wined3d_resource *resource, + const struct wined3d_context *context) DECLSPEC_HIDDEN; + DWORD wined3d_resource_sanitize_map_flags(const struct wined3d_resource *resource, DWORD flags) DECLSPEC_HIDDEN; +@@ -2259,7 +2262,6 @@ static inline struct wined3d_volume *volume_from_resource(struct wined3d_resourc + return CONTAINING_RECORD(resource, struct wined3d_volume, resource); + } + +-BOOL volume_prepare_system_memory(struct wined3d_volume *volume) DECLSPEC_HIDDEN; + HRESULT wined3d_volume_create(struct wined3d_texture *container, const struct wined3d_resource_desc *desc, + unsigned int level, struct wined3d_volume **volume) DECLSPEC_HIDDEN; + void wined3d_volume_destroy(struct wined3d_volume *volume) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0024-wined3d-Handle-WINED3D_LOCATION_DISCARDED-in-surface.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0024-wined3d-Handle-WINED3D_LOCATION_DISCARDED-in-surface.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0024-wined3d-Handle-WINED3D_LOCATION_DISCARDED-in-surface.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0024-wined3d-Handle-WINED3D_LOCATION_DISCARDED-in-surface.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,31 @@ +From 34c2831af2c72f793ddb94da134f21f9cd613b5a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 19 Sep 2013 12:06:00 +0200 +Subject: wined3d: Handle WINED3D_LOCATION_DISCARDED in surface_load_texture. + +TODO: Move texture allocation to the caller, this way discarded locations can be handled in the resource. +--- + dlls/wined3d/surface.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 4be6a50..09bd72b 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -4091,6 +4091,13 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + POINT dst_point = {0, 0}; + BYTE *mem = NULL; + ++ if (surface->resource.locations & WINED3D_LOCATION_DISCARDED) ++ { ++ TRACE("Surface was discarded, nothing to do.\n"); ++ wined3d_texture_prepare_texture(texture, context, srgb); ++ return WINED3D_OK; ++ } ++ + if (wined3d_settings.offscreen_rendering_mode != ORM_FBO + && wined3d_resource_is_offscreen(&texture->resource) + && (surface->resource.locations & WINED3D_LOCATION_DRAWABLE)) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0025-wined3d-Handle-LOCATION_DISCARDED-in-surface_load_dr.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0025-wined3d-Handle-LOCATION_DISCARDED-in-surface_load_dr.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0025-wined3d-Handle-LOCATION_DISCARDED-in-surface_load_dr.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0025-wined3d-Handle-LOCATION_DISCARDED-in-surface_load_dr.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,29 @@ +From 8f62fa5a9451ff5575e115758fcff80c7383aebe Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 19 Sep 2013 12:11:32 +0200 +Subject: wined3d: Handle LOCATION_DISCARDED in surface_load_drawable. + +--- + dlls/wined3d/surface.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 09bd72b..4a7e982 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -4062,6 +4062,12 @@ static HRESULT surface_load_drawable(struct wined3d_surface *surface, + { + RECT r; + ++ if (surface->resource.locations & WINED3D_LOCATION_DISCARDED) ++ { ++ TRACE("Surface was discarded, nothing to do.\n"); ++ return WINED3D_OK; ++ } ++ + if (wined3d_settings.offscreen_rendering_mode == ORM_FBO + && wined3d_resource_is_offscreen(&surface->container->resource)) + { +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0026-wined3d-Handle-WINED3D_LOCATION_DISCARDED-for-sysmem.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0026-wined3d-Handle-WINED3D_LOCATION_DISCARDED-for-sysmem.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0026-wined3d-Handle-WINED3D_LOCATION_DISCARDED-for-sysmem.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0026-wined3d-Handle-WINED3D_LOCATION_DISCARDED-for-sysmem.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,75 @@ +From 73bc99a081af878150b2093f211239d44aab5444 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 19 Sep 2013 12:13:31 +0200 +Subject: wined3d: Handle WINED3D_LOCATION_DISCARDED for sysmem loads. + +--- + dlls/wined3d/resource.c | 12 ++++++++++++ + dlls/wined3d/volume.c | 14 ++------------ + 2 files changed, 14 insertions(+), 12 deletions(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index d5ec71f..051297c 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -397,6 +397,8 @@ void wined3d_resource_load_location(struct wined3d_resource *resource, + struct wined3d_context *context, DWORD location) + { + DWORD required_access = wined3d_resource_access_from_location(location); ++ DWORD simple_locations = WINED3D_LOCATION_SYSMEM | WINED3D_LOCATION_USER_MEMORY ++ | WINED3D_LOCATION_DIB | WINED3D_LOCATION_BUFFER; + + if ((resource->locations & location) == location) + { +@@ -409,6 +411,16 @@ void wined3d_resource_load_location(struct wined3d_resource *resource, + WARN("Operation requires %#x access, but resource only has %#x.\n", + required_access, resource->access_flags); + ++ if (location & simple_locations) ++ { ++ if (resource->locations & WINED3D_LOCATION_DISCARDED) ++ { ++ TRACE("Resource was discarded, nothing to do.\n"); ++ resource->locations |= location; ++ return; ++ } ++ } ++ + /* Context is NULL in ddraw-only operation without OpenGL. */ + if (!context) + ERR("A context is required for non-sysmem operation.\n"); +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index a40d9f0..9ad7d75 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -229,12 +229,7 @@ static void wined3d_volume_load_location(struct wined3d_resource *resource, + if (!volume->resource.heap_memory) + ERR("Trying to load WINED3D_LOCATION_SYSMEM without setting it up first.\n"); + +- if (volume->resource.locations & WINED3D_LOCATION_DISCARDED) +- { +- TRACE("Volume previously discarded, nothing to do.\n"); +- wined3d_resource_invalidate_location(&volume->resource, WINED3D_LOCATION_DISCARDED); +- } +- else if (volume->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) ++ if (volume->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) + { + struct wined3d_bo_address data = {0, volume->resource.heap_memory}; + +@@ -259,12 +254,7 @@ static void wined3d_volume_load_location(struct wined3d_resource *resource, + if (!volume->resource.buffer_object) + ERR("Trying to load WINED3D_LOCATION_BUFFER without setting it up first.\n"); + +- if (volume->resource.locations & WINED3D_LOCATION_DISCARDED) +- { +- TRACE("Volume previously discarded, nothing to do.\n"); +- wined3d_resource_invalidate_location(&volume->resource, WINED3D_LOCATION_DISCARDED); +- } +- else if (volume->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) ++ if (volume->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) + { + struct wined3d_bo_address data = {volume->resource.buffer_object, NULL}; + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0027-wined3d-Discard-implicit-surfaces-on-unload.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0027-wined3d-Discard-implicit-surfaces-on-unload.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0027-wined3d-Discard-implicit-surfaces-on-unload.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0027-wined3d-Discard-implicit-surfaces-on-unload.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,36 @@ +From 50e46931f38887d0164033482e502f90ef806ffd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 4 Jan 2014 13:20:25 +0100 +Subject: wined3d: Discard implicit surfaces on unload. + +--- + dlls/wined3d/surface.c | 13 +++---------- + 1 file changed, 3 insertions(+), 10 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 4a7e982..29f4563 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -1190,16 +1190,9 @@ static void surface_unload(struct wined3d_resource *resource) + /* Default pool resources are supposed to be destroyed before Reset is called. + * Implicit resources stay however. So this means we have an implicit render target + * or depth stencil. The content may be destroyed, but we still have to tear down +- * opengl resources, so we cannot leave early. +- * +- * Put the surfaces into sysmem, and reset the content. The D3D content is undefined, +- * but we can't set the sysmem INDRAWABLE because when we're rendering the swapchain +- * or the depth stencil into an FBO the texture or render buffer will be removed +- * and all flags get lost */ +- surface_prepare_system_memory(surface); +- memset(surface->resource.heap_memory, 0, surface->resource.size); +- wined3d_resource_validate_location(&surface->resource, WINED3D_LOCATION_SYSMEM); +- wined3d_resource_invalidate_location(&surface->resource, ~WINED3D_LOCATION_SYSMEM); ++ * opengl resources, so we cannot leave early. */ ++ wined3d_resource_validate_location(&surface->resource, WINED3D_LOCATION_DISCARDED); ++ wined3d_resource_invalidate_location(&surface->resource, ~WINED3D_LOCATION_DISCARDED); + + /* We also get here when the ddraw swapchain is destroyed, for example + * for a mode switch. In this case this surface won't necessarily be +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0028-wined3d-Don-t-try-to-flip-sysmem-copies-in-swapchain.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0028-wined3d-Don-t-try-to-flip-sysmem-copies-in-swapchain.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0028-wined3d-Don-t-try-to-flip-sysmem-copies-in-swapchain.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0028-wined3d-Don-t-try-to-flip-sysmem-copies-in-swapchain.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,73 @@ +From 33832b5fb0f7d3c8a0f93d4e3f3d7e1d4de0e6df Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 19 Sep 2013 13:08:33 +0200 +Subject: wined3d: Don't try to flip sysmem copies in swapchain_present. + +This was once an optimization for ddraw applications that mapped the +backbuffer to render movies. It doesn't work any more in the intended +fashion. +--- + dlls/wined3d/swapchain.c | 46 +++++++++------------------------------------- + 1 file changed, 9 insertions(+), 37 deletions(-) + +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index e1a5b8a..05f68f7 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -555,44 +555,16 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + } + + front = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0)); +- if (!swapchain->render_to_fbo && ((front->resource.locations & WINED3D_LOCATION_SYSMEM) +- || (back_buffer->resource.locations & WINED3D_LOCATION_SYSMEM))) ++ wined3d_resource_validate_location(&front->resource, WINED3D_LOCATION_DRAWABLE); ++ wined3d_resource_invalidate_location(&front->resource, ~WINED3D_LOCATION_DRAWABLE); ++ /* If the swapeffect is DISCARD, the back buffer is undefined. That means the SYSMEM ++ * and INTEXTURE copies can keep their old content if they have any defined content. ++ * If the swapeffect is COPY, the content remains the same. If it is FLIP however, ++ * the texture / sysmem copy needs to be reloaded from the drawable. */ ++ if (swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_FLIP) + { +- /* Both memory copies of the surfaces are ok, flip them around too instead of dirtifying +- * Doesn't work with render_to_fbo because we're not flipping +- */ +- +- if (front->resource.size == back_buffer->resource.size) +- { +- flip_surface(front, back_buffer); +- +- /* Tell the front buffer surface that is has been modified. However, +- * the other locations were preserved during that, so keep the flags. +- * This serves to update the emulated overlay, if any. */ +- wined3d_resource_validate_location(&front->resource, WINED3D_LOCATION_DRAWABLE); +- } +- else +- { +- wined3d_resource_validate_location(&front->resource, WINED3D_LOCATION_DRAWABLE); +- wined3d_resource_invalidate_location(&front->resource, ~WINED3D_LOCATION_DRAWABLE); +- wined3d_resource_validate_location(&back_buffer->resource, WINED3D_LOCATION_DRAWABLE); +- wined3d_resource_invalidate_location(&back_buffer->resource, ~WINED3D_LOCATION_DRAWABLE); +- } +- } +- else +- { +- wined3d_resource_validate_location(&front->resource, WINED3D_LOCATION_DRAWABLE); +- wined3d_resource_invalidate_location(&front->resource, ~WINED3D_LOCATION_DRAWABLE); +- /* If the swapeffect is DISCARD, the back buffer is undefined. That means the SYSMEM +- * and INTEXTURE copies can keep their old content if they have any defined content. +- * If the swapeffect is COPY, the content remains the same. If it is FLIP however, +- * the texture / sysmem copy needs to be reloaded from the drawable +- */ +- if (swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_FLIP) +- { +- wined3d_resource_validate_location(&back_buffer->resource, back_buffer->container->resource.draw_binding); +- wined3d_resource_invalidate_location(&back_buffer->resource, ~back_buffer->container->resource.draw_binding); +- } ++ wined3d_resource_validate_location(&back_buffer->resource, back_buffer->container->resource.draw_binding); ++ wined3d_resource_invalidate_location(&back_buffer->resource, ~back_buffer->container->resource.draw_binding); + } + + if (fb->depth_stencil) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0029-wined3d-Discard-the-backbuffer-in-discard-presents.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0029-wined3d-Discard-the-backbuffer-in-discard-presents.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0029-wined3d-Discard-the-backbuffer-in-discard-presents.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0029-wined3d-Discard-the-backbuffer-in-discard-presents.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,43 @@ +From bcd6f4338c70693ca49ce0775bdd08a2527db255 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 19 Sep 2013 13:09:58 +0200 +Subject: wined3d: Discard the backbuffer in discard presents. + +--- + dlls/wined3d/swapchain.c | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index 05f68f7..dd7d2c7 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -557,14 +557,19 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + front = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0)); + wined3d_resource_validate_location(&front->resource, WINED3D_LOCATION_DRAWABLE); + wined3d_resource_invalidate_location(&front->resource, ~WINED3D_LOCATION_DRAWABLE); +- /* If the swapeffect is DISCARD, the back buffer is undefined. That means the SYSMEM +- * and INTEXTURE copies can keep their old content if they have any defined content. +- * If the swapeffect is COPY, the content remains the same. If it is FLIP however, +- * the texture / sysmem copy needs to be reloaded from the drawable. */ +- if (swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_FLIP) ++ switch (swapchain->desc.swap_effect) + { +- wined3d_resource_validate_location(&back_buffer->resource, back_buffer->container->resource.draw_binding); +- wined3d_resource_invalidate_location(&back_buffer->resource, ~back_buffer->container->resource.draw_binding); ++ case WINED3D_SWAP_EFFECT_DISCARD: ++ wined3d_resource_validate_location(&back_buffer->resource, WINED3D_LOCATION_DISCARDED); ++ break; ++ ++ case WINED3D_SWAP_EFFECT_FLIP: ++ wined3d_resource_validate_location(&back_buffer->resource, back_buffer->container->resource.draw_binding); ++ wined3d_resource_invalidate_location(&back_buffer->resource, ~back_buffer->container->resource.draw_binding); ++ break; ++ ++ default: ++ break; + } + + if (fb->depth_stencil) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0030-wined3d-Allocate-sysmem-for-client-storage-if-it-doe.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0030-wined3d-Allocate-sysmem-for-client-storage-if-it-doe.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0030-wined3d-Allocate-sysmem-for-client-storage-if-it-doe.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0030-wined3d-Allocate-sysmem-for-client-storage-if-it-doe.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,37 @@ +From d0f1f1278a8225075bd03c9586112bf29318563c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Mon, 16 Sep 2013 22:22:39 +0200 +Subject: wined3d: Allocate sysmem for client storage if it doesn't exist + already. + +--- + dlls/wined3d/texture.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index 41cf61d..8298e53 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -904,8 +904,7 @@ static void texture2d_prepare_texture(struct wined3d_texture *texture, struct wi + if (gl_info->supported[APPLE_CLIENT_STORAGE]) + { + if (surface->flags & (SFLAG_NONPOW2 | SFLAG_DIBSECTION) +- || texture->flags & WINED3D_TEXTURE_CONVERTED +- || !surface->resource.heap_memory) ++ || texture->flags & WINED3D_TEXTURE_CONVERTED) + { + /* In some cases we want to disable client storage. + * SFLAG_NONPOW2 has a bigger opengl texture than the client memory, and different pitches +@@ -917,6 +916,9 @@ static void texture2d_prepare_texture(struct wined3d_texture *texture, struct wi + } + else + { ++ if (!surface->resource.heap_memory) ++ wined3d_resource_allocate_sysmem(&surface->resource); ++ + surface->flags |= SFLAG_CLIENT; + mem = surface->resource.heap_memory; + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0031-wined3d-Introduce-a-function-to-retrieve-resource-me.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0031-wined3d-Introduce-a-function-to-retrieve-resource-me.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0031-wined3d-Introduce-a-function-to-retrieve-resource-me.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0031-wined3d-Introduce-a-function-to-retrieve-resource-me.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,159 @@ +From 564052d9ce2b7450a97ca3310d54d1b416976978 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Mon, 16 Sep 2013 22:44:33 +0200 +Subject: wined3d: Introduce a function to retrieve resource memory. + +--- + dlls/wined3d/resource.c | 30 ++++++++++++++++++++++++++++ + dlls/wined3d/surface.c | 45 ++++++------------------------------------ + dlls/wined3d/wined3d_private.h | 2 ++ + 3 files changed, 38 insertions(+), 39 deletions(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 051297c..94c06ac 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -392,6 +392,36 @@ DWORD wined3d_resource_access_from_location(DWORD location) + } + } + ++void wined3d_resource_get_memory(const struct wined3d_resource *resource, ++ DWORD location, struct wined3d_bo_address *data) ++{ ++ if (location & WINED3D_LOCATION_BUFFER) ++ { ++ data->buffer_object = resource->buffer_object; ++ data->addr = NULL; ++ return; ++ } ++ if (location & WINED3D_LOCATION_USER_MEMORY) ++ { ++ data->buffer_object = 0; ++ data->addr = resource->user_memory; ++ return; ++ } ++ if (location & WINED3D_LOCATION_DIB) ++ { ++ data->buffer_object = 0; ++ data->addr = resource->bitmap_data; ++ return; ++ } ++ if (location & WINED3D_LOCATION_SYSMEM) ++ { ++ data->buffer_object = 0; ++ data->addr = resource->heap_memory; ++ return; ++ } ++ ERR("Unexpected location %s.\n", wined3d_debug_location(location)); ++} ++ + /* Context activation is optionally by the caller. Context may be NULL. */ + void wined3d_resource_load_location(struct wined3d_resource *resource, + struct wined3d_context *context, DWORD location) +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 29f4563..4815965 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -479,39 +479,6 @@ static HRESULT surface_create_dib_section(struct wined3d_surface *surface) + return WINED3D_OK; + } + +-static void surface_get_memory(const struct wined3d_surface *surface, struct wined3d_bo_address *data, +- DWORD location) +-{ +- if (location & WINED3D_LOCATION_BUFFER) +- { +- data->addr = NULL; +- data->buffer_object = surface->resource.buffer_object; +- return; +- } +- if (location & WINED3D_LOCATION_USER_MEMORY) +- { +- data->addr = surface->resource.user_memory; +- data->buffer_object = 0; +- return; +- } +- if (location & WINED3D_LOCATION_DIB) +- { +- data->addr = surface->resource.bitmap_data; +- data->buffer_object = 0; +- return; +- } +- if (location & WINED3D_LOCATION_SYSMEM) +- { +- data->addr = surface->resource.heap_memory; +- data->buffer_object = 0; +- return; +- } +- +- ERR("Unexpected locations %s.\n", wined3d_debug_location(location)); +- data->addr = NULL; +- data->buffer_object = 0; +-} +- + static void surface_prepare_buffer(struct wined3d_surface *surface) + { + struct wined3d_context *context; +@@ -1328,7 +1295,7 @@ static void surface_download_data(struct wined3d_surface *surface, const struct + return; + } + +- surface_get_memory(surface, &data, dst_location); ++ wined3d_resource_get_memory(&surface->resource, dst_location, &data); + + if (format->flags & WINED3DFMT_FLAG_COMPRESSED) + { +@@ -1694,7 +1661,7 @@ HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const P + wined3d_resource_load_location(&dst_surface->resource, context, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_texture_bind(dst_surface->container, context, FALSE); + +- surface_get_memory(src_surface, &data, src_surface->resource.locations); ++ wined3d_resource_get_memory(&src_surface->resource, src_surface->resource.locations, &data); + wined3d_resource_get_pitch(&src_surface->resource, &src_row_pitch, &src_slice_pitch); + + surface_upload_data(dst_surface, gl_info, src_format, src_rect, src_row_pitch, dst_point, FALSE, &data); +@@ -2794,7 +2761,7 @@ static void read_from_framebuffer(struct wined3d_surface *surface, + BOOL srcIsUpsideDown; + struct wined3d_bo_address data; + +- surface_get_memory(surface, &data, dst_location); ++ wined3d_resource_get_memory(&surface->resource, dst_location, &data); + + /* Context_release does not restore the original context in case of + * nested context_acquire calls. Only read_from_framebuffer and +@@ -3986,8 +3953,8 @@ static void surface_copy_simple_location(struct wined3d_surface *surface, DWORD + struct wined3d_bo_address dst, src; + UINT size = surface->resource.size; + +- surface_get_memory(surface, &dst, location); +- surface_get_memory(surface, &src, surface->resource.locations); ++ wined3d_resource_get_memory(&surface->resource, location, &dst); ++ wined3d_resource_get_memory(&surface->resource, surface->resource.locations, &src); + + if (dst.buffer_object) + { +@@ -4206,7 +4173,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + surface_remove_pbo(surface, gl_info); + } + +- surface_get_memory(surface, &data, surface->resource.locations); ++ wined3d_resource_get_memory(&surface->resource, surface->resource.locations, &data); + if (format.convert) + { + /* This code is entered for texture formats which need a fixup. */ +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 9353e57..df2031a 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2116,6 +2116,8 @@ BOOL wined3d_resource_allocate_sysmem(struct wined3d_resource *resource) DECLSPE + void wined3d_resource_free_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + BYTE *wined3d_resource_get_map_ptr(const struct wined3d_resource *resource, + const struct wined3d_context *context, DWORD flags) DECLSPEC_HIDDEN; ++void wined3d_resource_get_memory(const struct wined3d_resource *resource, ++ DWORD location, struct wined3d_bo_address *data) DECLSPEC_HIDDEN; + GLbitfield wined3d_resource_gl_map_flags(DWORD d3d_flags) DECLSPEC_HIDDEN; + void wined3d_resource_invalidate_location(struct wined3d_resource *resource, DWORD location) DECLSPEC_HIDDEN; + BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0032-wined3d-Make-surface_ops-unmap-specific-for-front-bu.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0032-wined3d-Make-surface_ops-unmap-specific-for-front-bu.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0032-wined3d-Make-surface_ops-unmap-specific-for-front-bu.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0032-wined3d-Make-surface_ops-unmap-specific-for-front-bu.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,116 @@ +From e13017df9a84b37e8452e16feebf5c5f06a132a8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 19 Sep 2013 13:36:00 +0200 +Subject: wined3d: Make surface_ops->unmap specific for front buffers. + +--- + dlls/wined3d/surface.c | 45 +++++++++++++++--------------------------- + dlls/wined3d/wined3d_private.h | 2 +- + 2 files changed, 17 insertions(+), 30 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 4815965..50d7e74 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -681,31 +681,22 @@ static HRESULT surface_private_setup(struct wined3d_surface *surface) + return WINED3D_OK; + } + +-static void surface_unmap(struct wined3d_surface *surface) ++static void surface_frontbuffer_updated(struct wined3d_surface *surface) + { +- TRACE("surface %p.\n", surface); +- +- memset(&surface->lockedRect, 0, sizeof(surface->lockedRect)); ++ struct wined3d_context *context = NULL; ++ struct wined3d_device *device = surface->resource.device; + +- if (surface->resource.locations & (WINED3D_LOCATION_DRAWABLE | WINED3D_LOCATION_TEXTURE_RGB)) ++ if (surface->resource.locations & WINED3D_LOCATION_DRAWABLE) + { + TRACE("Not dirtified, nothing to do.\n"); + return; + } + +- if (surface->container->swapchain && surface->container->swapchain->front_buffer == surface->container) +- { +- struct wined3d_device *device = surface->resource.device; +- struct wined3d_context *context = NULL; +- +- if (device->d3d_initialized) +- context = context_acquire(device, surface); +- wined3d_resource_load_location(&surface->resource, context, surface->container->resource.draw_binding); +- if (context) +- context_release(context); +- } +- else if (surface->resource.format->flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) +- FIXME("Depth / stencil buffer locking is not implemented.\n"); ++ if (device->d3d_initialized) ++ context = context_acquire(surface->resource.device, NULL); ++ wined3d_resource_load_location(&surface->resource, context, surface->container->resource.draw_binding); ++ if (context) ++ context_release(context); + } + + static BOOL surface_is_full_rect(const struct wined3d_surface *surface, const RECT *r) +@@ -1218,7 +1209,7 @@ static void wined3d_surface_location_invalidated(struct wined3d_resource *resour + static const struct wined3d_surface_ops surface_ops = + { + surface_private_setup, +- surface_unmap, ++ surface_frontbuffer_updated, + }; + + /***************************************************************************** +@@ -1262,21 +1253,15 @@ static HRESULT gdi_surface_private_setup(struct wined3d_surface *surface) + return WINED3D_OK; + } + +-static void gdi_surface_unmap(struct wined3d_surface *surface) ++static void gdi_surface_frontbuffer_updated(struct wined3d_surface *surface) + { +- TRACE("surface %p.\n", surface); +- +- /* Tell the swapchain to update the screen. */ +- if (surface->container->swapchain && surface->container == surface->container->swapchain->front_buffer) +- x11_copy_to_screen(surface->container->swapchain, &surface->lockedRect); +- +- memset(&surface->lockedRect, 0, sizeof(RECT)); ++ x11_copy_to_screen(surface->container->swapchain, &surface->lockedRect); + } + + static const struct wined3d_surface_ops gdi_surface_ops = + { + gdi_surface_private_setup, +- gdi_surface_unmap, ++ gdi_surface_frontbuffer_updated, + }; + + /* This call just downloads data, the caller is responsible for binding the +@@ -2530,7 +2515,9 @@ HRESULT CDECL wined3d_surface_unmap(struct wined3d_surface *surface) + if (context) + context_release(context); + +- surface->surface_ops->surface_unmap(surface); ++ if (surface->container->swapchain && surface->container == surface->container->swapchain->front_buffer) ++ surface->surface_ops->surface_frontbuffer_updated(surface); ++ memset(&surface->lockedRect, 0, sizeof(surface->lockedRect)); + + return WINED3D_OK; + } +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index df2031a..d69a581 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2300,7 +2300,7 @@ struct fbo_entry + struct wined3d_surface_ops + { + HRESULT (*surface_private_setup)(struct wined3d_surface *surface); +- void (*surface_unmap)(struct wined3d_surface *surface); ++ void (*surface_frontbuffer_updated)(struct wined3d_surface *surface); + }; + + struct wined3d_surface +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0033-wined3d-Move-check_block_align-to-resource.c.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0033-wined3d-Move-check_block_align-to-resource.c.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0033-wined3d-Move-check_block_align-to-resource.c.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0033-wined3d-Move-check_block_align-to-resource.c.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,152 @@ +From 56c5228fce24415412c59b16744c1eab1fb6e038 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 19 Sep 2013 14:55:00 +0200 +Subject: wined3d: Move check_block_align to resource.c + +--- + dlls/wined3d/resource.c | 28 ++++++++++++++++++++++++++++ + dlls/wined3d/surface.c | 27 +++++++++++---------------- + dlls/wined3d/volume.c | 31 ++----------------------------- + dlls/wined3d/wined3d_private.h | 2 ++ + 4 files changed, 43 insertions(+), 45 deletions(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 94c06ac..947fe8d 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -606,3 +606,31 @@ void CDECL wined3d_resource_get_pitch(const struct wined3d_resource *resource, U + + TRACE("Returning row pitch %u, slice pitch %u.\n", *row_pitch, *slice_pitch); + } ++ ++BOOL wined3d_resource_check_block_align(const struct wined3d_resource *resource, ++ const struct wined3d_box *box) ++{ ++ UINT width_mask, height_mask; ++ const struct wined3d_format *format = resource->format; ++ ++ if (!box) ++ return TRUE; ++ ++ /* This assumes power of two block sizes, but NPOT block sizes would be ++ * silly anyway. ++ * ++ * This also assumes that the format's block depth is 1. */ ++ width_mask = format->block_width - 1; ++ height_mask = format->block_height - 1; ++ ++ if (box->left & width_mask) ++ return FALSE; ++ if (box->top & height_mask) ++ return FALSE; ++ if (box->right & width_mask && box->right != resource->width) ++ return FALSE; ++ if (box->bottom & height_mask && box->bottom != resource->height) ++ return FALSE; ++ ++ return TRUE; ++} +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 50d7e74..6fa2576 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -1531,23 +1531,18 @@ static void surface_upload_data(struct wined3d_surface *surface, const struct wi + + static BOOL surface_check_block_align(struct wined3d_surface *surface, const RECT *rect) + { +- UINT width_mask, height_mask; ++ struct wined3d_box box; + +- if (!rect->left && !rect->top +- && rect->right == surface->resource.width +- && rect->bottom == surface->resource.height) +- return TRUE; +- +- /* This assumes power of two block sizes, but NPOT block sizes would be +- * silly anyway. */ +- width_mask = surface->resource.format->block_width - 1; +- height_mask = surface->resource.format->block_height - 1; +- +- if (!(rect->left & width_mask) && !(rect->top & height_mask) +- && !(rect->right & width_mask) && !(rect->bottom & height_mask)) +- return TRUE; +- +- return FALSE; ++ if (!rect) ++ return wined3d_resource_check_block_align(&surface->resource, NULL); ++ ++ box.left = rect->left; ++ box.top = rect->top; ++ box.front = 0; ++ box.right = rect->right; ++ box.bottom = rect->bottom; ++ box.back = 1; ++ return wined3d_resource_check_block_align(&surface->resource, &box); + } + + HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const POINT *dst_point, +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index 9ad7d75..c11c98c 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -361,34 +361,6 @@ struct wined3d_resource * CDECL wined3d_volume_get_resource(struct wined3d_volum + return &volume->resource; + } + +-static BOOL volume_check_block_align(const struct wined3d_volume *volume, +- const struct wined3d_box *box) +-{ +- UINT width_mask, height_mask; +- const struct wined3d_format *format = volume->resource.format; +- +- if (!box) +- return TRUE; +- +- /* This assumes power of two block sizes, but NPOT block sizes would be +- * silly anyway. +- * +- * This also assumes that the format's block depth is 1. */ +- width_mask = format->block_width - 1; +- height_mask = format->block_height - 1; +- +- if (box->left & width_mask) +- return FALSE; +- if (box->top & height_mask) +- return FALSE; +- if (box->right & width_mask && box->right != volume->resource.width) +- return FALSE; +- if (box->bottom & height_mask && box->bottom != volume->resource.height) +- return FALSE; +- +- return TRUE; +-} +- + static BOOL wined3d_volume_check_box_dimensions(const struct wined3d_volume *volume, + const struct wined3d_box *box) + { +@@ -438,7 +410,8 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + WARN("Map box is invalid.\n"); + return WINED3DERR_INVALIDCALL; + } +- if ((format->flags & WINED3DFMT_FLAG_BLOCKS) && !volume_check_block_align(volume, box)) ++ if ((format->flags & WINED3DFMT_FLAG_BLOCKS) && ++ !wined3d_resource_check_block_align(&volume->resource, box)) + { + WARN("Map box is misaligned for %ux%u blocks.\n", + format->block_width, format->block_height); +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index d69a581..35f2445 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2113,6 +2113,8 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device * + void resource_unload(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + DWORD wined3d_resource_access_from_location(DWORD location) DECLSPEC_HIDDEN; + BOOL wined3d_resource_allocate_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++BOOL wined3d_resource_check_block_align(const struct wined3d_resource *resource, ++ const struct wined3d_box *box) DECLSPEC_HIDDEN; + void wined3d_resource_free_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + BYTE *wined3d_resource_get_map_ptr(const struct wined3d_resource *resource, + const struct wined3d_context *context, DWORD flags) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0034-wined3d-Replace-surface-alloc-functions-with-resourc.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0034-wined3d-Replace-surface-alloc-functions-with-resourc.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0034-wined3d-Replace-surface-alloc-functions-with-resourc.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0034-wined3d-Replace-surface-alloc-functions-with-resourc.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,230 @@ +From 86e9642f816e8f9bfa7b71f3157fd42071aaf7d6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 21 Jan 2014 16:40:56 +0100 +Subject: wined3d: Replace surface alloc functions with resource ones. + +--- + dlls/wined3d/resource.c | 10 +++++ + dlls/wined3d/surface.c | 91 ++++-------------------------------------- + dlls/wined3d/texture.c | 5 +-- + dlls/wined3d/wined3d_private.h | 1 - + 4 files changed, 20 insertions(+), 87 deletions(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 947fe8d..aa81c00 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -570,6 +570,16 @@ BOOL wined3d_resource_prepare_map_memory(struct wined3d_resource *resource, stru + case WINED3D_LOCATION_SYSMEM: + return wined3d_resource_prepare_system_memory(resource); + ++ case WINED3D_LOCATION_USER_MEMORY: ++ if (!resource->user_memory) ++ ERR("Map binding is set to WINED3D_LOCATION_USER_MEMORY but resource->user_memory is NULL.\n"); ++ return TRUE; ++ ++ case WINED3D_LOCATION_DIB: ++ if (!resource->bitmap_data) ++ ERR("Map binding is set to WINED3D_LOCATION_DIB but resource->bitmap_data is NULL.\n"); ++ return TRUE; ++ + default: + ERR("Unexpected map binding %s.\n", wined3d_debug_location(resource->map_binding)); + return FALSE; +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 6fa2576..4c2a759 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -479,81 +479,6 @@ static HRESULT surface_create_dib_section(struct wined3d_surface *surface) + return WINED3D_OK; + } + +-static void surface_prepare_buffer(struct wined3d_surface *surface) +-{ +- struct wined3d_context *context; +- GLenum error; +- const struct wined3d_gl_info *gl_info; +- +- if (surface->resource.buffer_object) +- return; +- +- context = context_acquire(surface->resource.device, NULL); +- gl_info = context->gl_info; +- +- GL_EXTCALL(glGenBuffersARB(1, &surface->resource.buffer_object)); +- error = gl_info->gl_ops.gl.p_glGetError(); +- if (!surface->resource.buffer_object || error != GL_NO_ERROR) +- ERR("Failed to create a PBO with error %s (%#x).\n", debug_glerror(error), error); +- +- TRACE("Binding PBO %u.\n", surface->resource.buffer_object); +- +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->resource.buffer_object)); +- checkGLcall("glBindBufferARB"); +- +- GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->resource.size + 4, +- NULL, GL_STREAM_DRAW_ARB)); +- checkGLcall("glBufferDataARB"); +- +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); +- checkGLcall("glBindBufferARB"); +- +- context_release(context); +-} +- +-static void surface_prepare_system_memory(struct wined3d_surface *surface) +-{ +- TRACE("surface %p.\n", surface); +- +- if (surface->resource.heap_memory) +- return; +- +- /* Whatever surface we have, make sure that there is memory allocated +- * for the downloaded copy, or a PBO to map. */ +- if (!wined3d_resource_allocate_sysmem(&surface->resource)) +- ERR("Failed to allocate system memory.\n"); +- +- if (surface->resource.locations & WINED3D_LOCATION_SYSMEM) +- ERR("Surface without system memory has WINED3D_LOCATION_SYSMEM set.\n"); +-} +- +-void surface_prepare_map_memory(struct wined3d_surface *surface) +-{ +- switch (surface->resource.map_binding) +- { +- case WINED3D_LOCATION_SYSMEM: +- surface_prepare_system_memory(surface); +- break; +- +- case WINED3D_LOCATION_USER_MEMORY: +- if (!surface->resource.user_memory) +- ERR("Map binding is set to WINED3D_LOCATION_USER_MEMORY but surface->resource.user_memory is NULL.\n"); +- break; +- +- case WINED3D_LOCATION_DIB: +- if (!surface->resource.bitmap_data) +- ERR("Map binding is set to WINED3D_LOCATION_DIB but surface->resource.bitmap_data is NULL.\n"); +- break; +- +- case WINED3D_LOCATION_BUFFER: +- surface_prepare_buffer(surface); +- break; +- +- default: +- ERR("Unexpected map binding %s.\n", wined3d_debug_location(surface->resource.map_binding)); +- } +-} +- + static void surface_evict_sysmem(struct wined3d_surface *surface) + { + /* In some conditions the surface memory must not be freed: +@@ -1160,7 +1085,7 @@ static void surface_unload(struct wined3d_resource *resource) + } + else + { +- surface_prepare_map_memory(surface); ++ wined3d_resource_prepare_map_memory(&surface->resource, context); + wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); + } +@@ -1780,7 +1705,7 @@ void surface_load(struct wined3d_surface *surface, struct wined3d_context *conte + /* To perform the color key conversion we need a sysmem copy of + * the surface. Make sure we have it. */ + +- surface_prepare_map_memory(surface); ++ wined3d_resource_prepare_map_memory(&surface->resource, context); + wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); + /* Switching color keying on / off may change the internal format. */ +@@ -2164,7 +2089,7 @@ HRESULT wined3d_surface_update_desc(struct wined3d_surface *surface, + + if (!valid_location) + { +- surface_prepare_system_memory(surface); ++ wined3d_resource_prepare_system_memory(&surface->resource); + valid_location = WINED3D_LOCATION_SYSMEM; + } + +@@ -2567,7 +2492,7 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + if (device->d3d_initialized) + context = context_acquire(device, NULL); + +- surface_prepare_map_memory(surface); ++ wined3d_resource_prepare_map_memory(&surface->resource, context); + if (flags & WINED3D_MAP_DISCARD) + { + TRACE("WINED3D_MAP_DISCARD flag passed, marking %s as up to date.\n", +@@ -4097,7 +4022,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + { + /* Performance warning... */ + FIXME("Downloading RGB surface %p to reload it as sRGB.\n", surface); +- surface_prepare_map_memory(surface); ++ wined3d_resource_prepare_map_memory(&surface->resource, context); + wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + } + } +@@ -4108,7 +4033,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + { + /* Performance warning... */ + FIXME("Downloading sRGB surface %p to reload it as RGB.\n", surface); +- surface_prepare_map_memory(surface); ++ wined3d_resource_prepare_map_memory(&surface->resource, context); + wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + } + } +@@ -4117,7 +4042,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + { + WARN("Trying to load a texture from sysmem, but no simple location is valid.\n"); + /* Lets hope we get it from somewhere... */ +- surface_prepare_system_memory(surface); ++ wined3d_resource_prepare_system_memory(&surface->resource); + wined3d_resource_load_location(&surface->resource, context, WINED3D_LOCATION_SYSMEM); + } + +@@ -4150,7 +4075,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + else + surface->resource.map_binding = WINED3D_LOCATION_SYSMEM; + +- surface_prepare_map_memory(surface); ++ wined3d_resource_prepare_map_memory(&surface->resource, context); + wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + surface_remove_pbo(surface, gl_info); + } +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index 8298e53..429eb89 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -828,8 +828,8 @@ static void texture2d_sub_resource_add_dirty_region(struct wined3d_resource *sub + struct wined3d_surface *surface = surface_from_resource(sub_resource); + struct wined3d_context *context; + +- surface_prepare_map_memory(surface); + context = context_acquire(surface->resource.device, NULL); ++ wined3d_resource_prepare_map_memory(&surface->resource, context); + wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + context_release(context); + wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); +@@ -916,8 +916,7 @@ static void texture2d_prepare_texture(struct wined3d_texture *texture, struct wi + } + else + { +- if (!surface->resource.heap_memory) +- wined3d_resource_allocate_sysmem(&surface->resource); ++ wined3d_resource_prepare_system_memory(&surface->resource); + + surface->flags |= SFLAG_CLIENT; + mem = surface->resource.heap_memory; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 35f2445..51c957b 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2380,7 +2380,6 @@ HRESULT wined3d_surface_create(struct wined3d_texture *container, const struct w + GLenum target, unsigned int level, unsigned int layer, DWORD flags, + struct wined3d_surface **surface) DECLSPEC_HIDDEN; + void wined3d_surface_destroy(struct wined3d_surface *surface) DECLSPEC_HIDDEN; +-void surface_prepare_map_memory(struct wined3d_surface *surface) DECLSPEC_HIDDEN; + + void draw_textured_quad(const struct wined3d_surface *src_surface, struct wined3d_context *context, + const RECT *src_rect, const RECT *dst_rect, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0035-wined3d-Don-t-delete-the-buffer-in-surface_cleanup.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0035-wined3d-Don-t-delete-the-buffer-in-surface_cleanup.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0035-wined3d-Don-t-delete-the-buffer-in-surface_cleanup.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0035-wined3d-Don-t-delete-the-buffer-in-surface_cleanup.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,29 @@ +From 900dc644b944426cf580aa03f236043322a1ac20 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 21 Jan 2014 16:41:33 +0100 +Subject: wined3d: Don't delete the buffer in surface_cleanup. + +--- + dlls/wined3d/surface.c | 6 ------ + 1 file changed, 6 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 4c2a759..7d2d1ea 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -56,12 +56,6 @@ static void surface_cleanup(struct wined3d_surface *surface) + context = context_acquire(surface->resource.device, NULL); + gl_info = context->gl_info; + +- if (surface->resource.buffer_object) +- { +- TRACE("Deleting PBO %u.\n", surface->resource.buffer_object); +- GL_EXTCALL(glDeleteBuffersARB(1, &surface->resource.buffer_object)); +- } +- + if (surface->rb_multisample) + { + TRACE("Deleting multisample renderbuffer %u.\n", surface->rb_multisample); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0036-wined3d-Use-resource-facilities-to-destroy-PBOs.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0036-wined3d-Use-resource-facilities-to-destroy-PBOs.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0036-wined3d-Use-resource-facilities-to-destroy-PBOs.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0036-wined3d-Use-resource-facilities-to-destroy-PBOs.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,81 @@ +From 259e98f79a3de596a4fb79227180106c47423aa8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 21 Jan 2014 16:49:21 +0100 +Subject: wined3d: Use resource facilities to destroy PBOs. + +--- + dlls/wined3d/resource.c | 2 +- + dlls/wined3d/surface.c | 17 ++--------------- + dlls/wined3d/wined3d_private.h | 1 + + 3 files changed, 4 insertions(+), 16 deletions(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index aa81c00..2a58a0c 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -142,7 +142,7 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device * + return WINED3D_OK; + } + +-static void wined3d_resource_free_bo(struct wined3d_resource *resource) ++void wined3d_resource_free_bo(struct wined3d_resource *resource) + { + struct wined3d_context *context = context_acquire(resource->device, NULL); + const struct wined3d_gl_info *gl_info = context->gl_info; +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 7d2d1ea..91d9e59 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -1029,16 +1029,6 @@ HRESULT CDECL wined3d_surface_get_render_target_data(struct wined3d_surface *sur + return wined3d_surface_blt(surface, NULL, render_target, NULL, 0, NULL, WINED3D_TEXF_POINT); + } + +-/* Context activation is done by the caller. */ +-static void surface_remove_pbo(struct wined3d_surface *surface, const struct wined3d_gl_info *gl_info) +-{ +- GL_EXTCALL(glDeleteBuffersARB(1, &surface->resource.buffer_object)); +- checkGLcall("glDeleteBuffersARB(1, &surface->resource.buffer_object)"); +- +- surface->resource.buffer_object = 0; +- wined3d_resource_invalidate_location(&surface->resource, WINED3D_LOCATION_BUFFER); +-} +- + static ULONG surface_resource_incref(struct wined3d_resource *resource) + { + return wined3d_surface_incref(surface_from_resource(resource)); +@@ -1084,10 +1074,6 @@ static void surface_unload(struct wined3d_resource *resource) + wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); + } + +- /* Destroy PBOs, but load them into real sysmem before */ +- if (surface->resource.buffer_object) +- surface_remove_pbo(surface, gl_info); +- + /* Destroy fbo render buffers. This is needed for implicit render targets, for + * all application-created targets the application has to release the surface + * before calling _Reset +@@ -4071,7 +4057,8 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + + wined3d_resource_prepare_map_memory(&surface->resource, context); + wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); +- surface_remove_pbo(surface, gl_info); ++ wined3d_resource_free_bo(&surface->resource); ++ wined3d_resource_invalidate_location(&surface->resource, WINED3D_LOCATION_BUFFER); + } + + wined3d_resource_get_memory(&surface->resource, surface->resource.locations, &data); +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 51c957b..81c9cfe 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2115,6 +2115,7 @@ DWORD wined3d_resource_access_from_location(DWORD location) DECLSPEC_HIDDEN; + BOOL wined3d_resource_allocate_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + BOOL wined3d_resource_check_block_align(const struct wined3d_resource *resource, + const struct wined3d_box *box) DECLSPEC_HIDDEN; ++void wined3d_resource_free_bo(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_free_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + BYTE *wined3d_resource_get_map_ptr(const struct wined3d_resource *resource, + const struct wined3d_context *context, DWORD flags) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0037-wined3d-Move-simple-location-copying-to-the-resource.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0037-wined3d-Move-simple-location-copying-to-the-resource.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0037-wined3d-Move-simple-location-copying-to-the-resource.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0037-wined3d-Move-simple-location-copying-to-the-resource.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,158 @@ +From 15497169d7c01aa9cbe051377b8e7088daacf2b3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 21 Jan 2014 16:58:08 +0100 +Subject: wined3d: Move simple location copying to the resource. + +--- + dlls/wined3d/resource.c | 38 ++++++++++++++++++++++++++++++++++++ + dlls/wined3d/surface.c | 51 ++++--------------------------------------------- + 2 files changed, 42 insertions(+), 47 deletions(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 2a58a0c..d9e2216 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -423,6 +423,38 @@ void wined3d_resource_get_memory(const struct wined3d_resource *resource, + } + + /* Context activation is optionally by the caller. Context may be NULL. */ ++static void wined3d_resource_copy_simple_location(struct wined3d_resource *resource, ++ struct wined3d_context *context, DWORD location) ++{ ++ const struct wined3d_gl_info *gl_info; ++ struct wined3d_bo_address dst, src; ++ UINT size = resource->size; ++ ++ wined3d_resource_get_memory(resource, location, &dst); ++ wined3d_resource_get_memory(resource, resource->locations, &src); ++ ++ if (dst.buffer_object) ++ { ++ gl_info = context->gl_info; ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, dst.buffer_object)); ++ GL_EXTCALL(glBufferSubDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0, size, src.addr)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); ++ checkGLcall("Upload PBO"); ++ return; ++ } ++ if (src.buffer_object) ++ { ++ gl_info = context->gl_info; ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, src.buffer_object)); ++ GL_EXTCALL(glGetBufferSubDataARB(GL_PIXEL_PACK_BUFFER_ARB, 0, size, dst.addr)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0)); ++ checkGLcall("Download PBO"); ++ return; ++ } ++ memcpy(dst.addr, src.addr, size); ++} ++ ++/* Context activation is optionally by the caller. Context may be NULL. */ + void wined3d_resource_load_location(struct wined3d_resource *resource, + struct wined3d_context *context, DWORD location) + { +@@ -449,6 +481,12 @@ void wined3d_resource_load_location(struct wined3d_resource *resource, + resource->locations |= location; + return; + } ++ if (resource->locations & simple_locations) ++ { ++ wined3d_resource_copy_simple_location(resource, context, location); ++ resource->locations |= location; ++ return; ++ } + } + + /* Context is NULL in ddraw-only operation without OpenGL. */ +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 91d9e59..5b2359e 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -36,10 +36,6 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d); + + #define MAXLOCKCOUNT 50 /* After this amount of locks do not free the sysmem copy. */ + +-static const DWORD surface_simple_locations = +- WINED3D_LOCATION_SYSMEM | WINED3D_LOCATION_USER_MEMORY +- | WINED3D_LOCATION_DIB | WINED3D_LOCATION_BUFFER; +- + static void surface_cleanup(struct wined3d_surface *surface) + { + struct wined3d_surface *overlay, *cur; +@@ -3832,54 +3828,12 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co + surface->ds_current_size.cy = surface->resource.height; + } + +-static void surface_copy_simple_location(struct wined3d_surface *surface, DWORD location) +-{ +- struct wined3d_device *device = surface->resource.device; +- struct wined3d_context *context; +- const struct wined3d_gl_info *gl_info; +- struct wined3d_bo_address dst, src; +- UINT size = surface->resource.size; +- +- wined3d_resource_get_memory(&surface->resource, location, &dst); +- wined3d_resource_get_memory(&surface->resource, surface->resource.locations, &src); +- +- if (dst.buffer_object) +- { +- context = context_acquire(device, NULL); +- gl_info = context->gl_info; +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, dst.buffer_object)); +- GL_EXTCALL(glBufferSubDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0, size, src.addr)); +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); +- checkGLcall("Upload PBO"); +- context_release(context); +- return; +- } +- if (src.buffer_object) +- { +- context = context_acquire(device, NULL); +- gl_info = context->gl_info; +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, src.buffer_object)); +- GL_EXTCALL(glGetBufferSubDataARB(GL_PIXEL_PACK_BUFFER_ARB, 0, size, dst.addr)); +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0)); +- checkGLcall("Download PBO"); +- context_release(context); +- return; +- } +- memcpy(dst.addr, src.addr, size); +-} +- + /* Context activation is done by the caller. */ + static void surface_load_sysmem(struct wined3d_surface *surface, + struct wined3d_context *context, DWORD dst_location) + { + const struct wined3d_gl_info *gl_info = context->gl_info; + +- if (surface->resource.locations & surface_simple_locations) +- { +- surface_copy_simple_location(surface, dst_location); +- return; +- } +- + if (surface->resource.locations & (WINED3D_LOCATION_RB_MULTISAMPLE | WINED3D_LOCATION_RB_RESOLVED)) + wined3d_resource_load_location(&surface->resource, context, WINED3D_LOCATION_TEXTURE_RGB); + +@@ -3943,6 +3897,9 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + struct wined3d_format format; + POINT dst_point = {0, 0}; + BYTE *mem = NULL; ++ const DWORD simple_locations = ++ WINED3D_LOCATION_SYSMEM | WINED3D_LOCATION_USER_MEMORY ++ | WINED3D_LOCATION_DIB | WINED3D_LOCATION_BUFFER; + + if (surface->resource.locations & WINED3D_LOCATION_DISCARDED) + { +@@ -4018,7 +3975,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + } + } + +- if (!(surface->resource.locations & surface_simple_locations)) ++ if (!(surface->resource.locations & simple_locations)) + { + WARN("Trying to load a texture from sysmem, but no simple location is valid.\n"); + /* Lets hope we get it from somewhere... */ +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0038-wined3d-Move-most-of-volume_map-to-resource.c.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0038-wined3d-Move-most-of-volume_map-to-resource.c.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0038-wined3d-Move-most-of-volume_map-to-resource.c.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0038-wined3d-Move-most-of-volume_map-to-resource.c.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,294 @@ +From 9e47e310ee0c12e0793312777a1f170fcbd363f0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 19 Sep 2013 17:51:38 +0200 +Subject: wined3d: Move most of volume_map to resource.c + +The CPU access check can be moved once surfaces don't have to lock for +sysmem blits. Surfaces and volume have different block alignment and +boundary check behaviours. +--- + dlls/wined3d/resource.c | 114 +++++++++++++++++++++++++++++++++++++++++ + dlls/wined3d/volume.c | 101 +++--------------------------------- + dlls/wined3d/wined3d_private.h | 3 ++ + 3 files changed, 123 insertions(+), 95 deletions(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index d9e2216..2443a9b 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -682,3 +682,117 @@ BOOL wined3d_resource_check_block_align(const struct wined3d_resource *resource, + + return TRUE; + } ++ ++HRESULT wined3d_resource_map(struct wined3d_resource *resource, ++ struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags) ++{ ++ struct wined3d_device *device = resource->device; ++ struct wined3d_context *context = NULL; ++ BYTE *base_memory; ++ const struct wined3d_format *format = resource->format; ++ ++ TRACE("resource %p, map_desc %p, box %p, flags %#x.\n", ++ resource, map_desc, box, flags); ++ ++ if (resource->map_count) ++ { ++ WARN("Volume is already mapped.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ flags = wined3d_resource_sanitize_map_flags(resource, flags); ++ ++ if (device->d3d_initialized) ++ context = context_acquire(device, NULL); ++ ++ if (!wined3d_resource_prepare_map_memory(resource, context)) ++ { ++ WARN("Out of memory.\n"); ++ map_desc->data = NULL; ++ context_release(context); ++ return E_OUTOFMEMORY; ++ } ++ ++ if (flags & WINED3D_MAP_DISCARD) ++ wined3d_resource_validate_location(resource, resource->map_binding); ++ else ++ wined3d_resource_load_location(resource, context, resource->map_binding); ++ ++ base_memory = wined3d_resource_get_map_ptr(resource, context, flags); ++ ++ if (context) ++ context_release(context); ++ ++ TRACE("Base memory pointer %p.\n", base_memory); ++ ++ if (format->flags & WINED3DFMT_FLAG_BROKEN_PITCH) ++ { ++ map_desc->row_pitch = resource->width * format->byte_count; ++ map_desc->slice_pitch = map_desc->row_pitch * resource->height; ++ } ++ else ++ { ++ wined3d_resource_get_pitch(resource, &map_desc->row_pitch, &map_desc->slice_pitch); ++ } ++ ++ if (!box) ++ { ++ TRACE("No box supplied - all is ok\n"); ++ map_desc->data = base_memory; ++ } ++ else ++ { ++ TRACE("Lock Box (%p) = l %u, t %u, r %u, b %u, fr %u, ba %u\n", ++ box, box->left, box->top, box->right, box->bottom, box->front, box->back); ++ ++ if ((format->flags & (WINED3DFMT_FLAG_BLOCKS | WINED3DFMT_FLAG_BROKEN_PITCH)) == WINED3DFMT_FLAG_BLOCKS) ++ { ++ /* Compressed textures are block based, so calculate the offset of ++ * the block that contains the top-left pixel of the locked rectangle. */ ++ map_desc->data = base_memory ++ + (box->front * map_desc->slice_pitch) ++ + ((box->top / format->block_height) * map_desc->row_pitch) ++ + ((box->left / format->block_width) * format->block_byte_count); ++ } ++ else ++ { ++ map_desc->data = base_memory ++ + (map_desc->slice_pitch * box->front) ++ + (map_desc->row_pitch * box->top) ++ + (box->left * format->byte_count); ++ } ++ } ++ ++ if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY))) ++ wined3d_resource_invalidate_location(resource, ~resource->map_binding); ++ ++ resource->map_count++; ++ ++ TRACE("Returning memory %p, row pitch %d, slice pitch %d.\n", ++ map_desc->data, map_desc->row_pitch, map_desc->slice_pitch); ++ ++ return WINED3D_OK; ++} ++ ++HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) ++{ ++ struct wined3d_device *device = resource->device; ++ struct wined3d_context *context = NULL; ++ TRACE("resource %p.\n", resource); ++ ++ if (!resource->map_count) ++ { ++ WARN("Trying to unlock an unlocked resource %p.\n", resource); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ if (device->d3d_initialized) ++ context = context_acquire(device, NULL); ++ wined3d_resource_release_map_ptr(resource, context); ++ if (context) ++ context_release(context); ++ ++ resource->map_count--; ++ ++ return WINED3D_OK; ++} +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index c11c98c..7e5576b 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -386,25 +386,15 @@ static BOOL wined3d_volume_check_box_dimensions(const struct wined3d_volume *vol + HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags) + { +- struct wined3d_device *device = volume->resource.device; +- struct wined3d_context *context; +- BYTE *base_memory; ++ HRESULT hr; + const struct wined3d_format *format = volume->resource.format; + +- TRACE("volume %p, map_desc %p, box %p, flags %#x.\n", +- volume, map_desc, box, flags); +- + map_desc->data = NULL; + if (!(volume->resource.access_flags & WINED3D_RESOURCE_ACCESS_CPU)) + { + WARN("Volume %p is not CPU accessible.\n", volume); + return WINED3DERR_INVALIDCALL; + } +- if (volume->resource.map_count) +- { +- WARN("Volume is already mapped.\n"); +- return WINED3DERR_INVALIDCALL; +- } + if (!wined3d_volume_check_box_dimensions(volume, box)) + { + WARN("Map box is invalid.\n"); +@@ -418,74 +408,11 @@ HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + return WINED3DERR_INVALIDCALL; + } + +- flags = wined3d_resource_sanitize_map_flags(&volume->resource, flags); +- +- context = context_acquire(device, NULL); +- if (!wined3d_resource_prepare_map_memory(&volume->resource, context)) +- { +- WARN("Out of memory.\n"); +- map_desc->data = NULL; +- context_release(context); +- return E_OUTOFMEMORY; +- } +- +- if (flags & WINED3D_MAP_DISCARD) +- wined3d_resource_validate_location(&volume->resource, volume->resource.map_binding); +- else +- wined3d_resource_load_location(&volume->resource, context, volume->resource.map_binding); +- +- base_memory = wined3d_resource_get_map_ptr(&volume->resource, context, flags); +- context_release(context); +- +- TRACE("Base memory pointer %p.\n", base_memory); +- +- if (format->flags & WINED3DFMT_FLAG_BROKEN_PITCH) +- { +- map_desc->row_pitch = volume->resource.width * format->byte_count; +- map_desc->slice_pitch = map_desc->row_pitch * volume->resource.height; +- } +- else +- { +- wined3d_resource_get_pitch(&volume->resource, &map_desc->row_pitch, &map_desc->slice_pitch); +- } +- +- if (!box) +- { +- TRACE("No box supplied - all is ok\n"); +- map_desc->data = base_memory; +- } +- else +- { +- TRACE("Lock Box (%p) = l %u, t %u, r %u, b %u, fr %u, ba %u\n", +- box, box->left, box->top, box->right, box->bottom, box->front, box->back); +- +- if ((format->flags & (WINED3DFMT_FLAG_BLOCKS | WINED3DFMT_FLAG_BROKEN_PITCH)) == WINED3DFMT_FLAG_BLOCKS) +- { +- /* Compressed textures are block based, so calculate the offset of +- * the block that contains the top-left pixel of the locked rectangle. */ +- map_desc->data = base_memory +- + (box->front * map_desc->slice_pitch) +- + ((box->top / format->block_height) * map_desc->row_pitch) +- + ((box->left / format->block_width) * format->block_byte_count); +- } +- else +- { +- map_desc->data = base_memory +- + (map_desc->slice_pitch * box->front) +- + (map_desc->row_pitch * box->top) +- + (box->left * volume->resource.format->byte_count); +- } +- } +- +- if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY))) +- wined3d_resource_invalidate_location(&volume->resource, ~volume->resource.map_binding); +- +- volume->resource.map_count++; +- +- TRACE("Returning memory %p, row pitch %d, slice pitch %d.\n", +- map_desc->data, map_desc->row_pitch, map_desc->slice_pitch); ++ hr = wined3d_resource_map(&volume->resource, map_desc, box, flags); ++ if (FAILED(hr)) ++ return hr; + +- return WINED3D_OK; ++ return hr; + } + + struct wined3d_volume * CDECL wined3d_volume_from_resource(struct wined3d_resource *resource) +@@ -495,23 +422,7 @@ struct wined3d_volume * CDECL wined3d_volume_from_resource(struct wined3d_resour + + HRESULT CDECL wined3d_volume_unmap(struct wined3d_volume *volume) + { +- struct wined3d_device *device = volume->resource.device; +- struct wined3d_context *context; +- TRACE("volume %p.\n", volume); +- +- if (!volume->resource.map_count) +- { +- WARN("Trying to unlock an unlocked volume %p.\n", volume); +- return WINED3DERR_INVALIDCALL; +- } +- +- context = context_acquire(device, NULL); +- wined3d_resource_release_map_ptr(&volume->resource, context); +- context_release(context); +- +- volume->resource.map_count--; +- +- return WINED3D_OK; ++ return wined3d_resource_unmap(&volume->resource); + } + + static ULONG volume_resource_incref(struct wined3d_resource *resource) +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 81c9cfe..43e1c21 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2126,12 +2126,15 @@ void wined3d_resource_invalidate_location(struct wined3d_resource *resource, DWO + BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_load_location(struct wined3d_resource *resource, + struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; ++HRESULT wined3d_resource_map(struct wined3d_resource *resource, struct wined3d_map_desc *map_desc, ++ const struct wined3d_box *box, DWORD flags) DECLSPEC_HIDDEN; + BOOL wined3d_resource_prepare_map_memory(struct wined3d_resource *resource, + struct wined3d_context *context) DECLSPEC_HIDDEN; + BOOL wined3d_resource_prepare_system_memory(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_release_map_ptr(const struct wined3d_resource *resource, + const struct wined3d_context *context) DECLSPEC_HIDDEN; + DWORD wined3d_resource_sanitize_map_flags(const struct wined3d_resource *resource, DWORD flags) DECLSPEC_HIDDEN; ++HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_validate_location(struct wined3d_resource *resource, DWORD location) DECLSPEC_HIDDEN; + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0039-wined3d-Use-resource_map-for-surface_map.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0039-wined3d-Use-resource_map-for-surface_map.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0039-wined3d-Use-resource_map-for-surface_map.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0039-wined3d-Use-resource_map-for-surface_map.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,196 @@ +From 4f15b07cc64a3d364197a0ac73dd561c7b969183 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 19 Sep 2013 18:00:23 +0200 +Subject: wined3d: Use resource_map for surface_map. + +--- + dlls/wined3d/resource.c | 2 +- + dlls/wined3d/surface.c | 102 +++++++----------------------------------------- + dlls/wined3d/volume.c | 7 +++- + 3 files changed, 22 insertions(+), 89 deletions(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 2443a9b..8486dc3 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -783,7 +783,7 @@ HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) + if (!resource->map_count) + { + WARN("Trying to unlock an unlocked resource %p.\n", resource); +- return WINED3DERR_INVALIDCALL; ++ return WINEDDERR_NOTLOCKED; + } + + if (device->d3d_initialized) +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 5b2359e..16233d3 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -2394,46 +2394,25 @@ struct wined3d_surface * CDECL wined3d_surface_from_resource(struct wined3d_reso + + HRESULT CDECL wined3d_surface_unmap(struct wined3d_surface *surface) + { +- struct wined3d_device *device = surface->resource.device; +- struct wined3d_context *context = NULL; ++ HRESULT hr; + TRACE("surface %p.\n", surface); + +- if (!surface->resource.map_count) +- { +- WARN("Trying to unmap unmapped surface.\n"); +- return WINEDDERR_NOTLOCKED; +- } +- --surface->resource.map_count; +- +- if (device->d3d_initialized) +- context = context_acquire(device, NULL); +- wined3d_resource_release_map_ptr(&surface->resource, context); +- if (context) +- context_release(context); ++ hr = wined3d_resource_unmap(&surface->resource); ++ if (FAILED(hr)) ++ return hr; + + if (surface->container->swapchain && surface->container == surface->container->swapchain->front_buffer) + surface->surface_ops->surface_frontbuffer_updated(surface); + memset(&surface->lockedRect, 0, sizeof(surface->lockedRect)); + +- return WINED3D_OK; ++ return hr; + } + + HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + struct wined3d_map_desc *map_desc, const RECT *rect, DWORD flags) + { ++ struct wined3d_box box; + const struct wined3d_format *format = surface->resource.format; +- struct wined3d_device *device = surface->resource.device; +- struct wined3d_context *context = NULL; +- BYTE *base_memory; +- +- TRACE("surface %p, map_desc %p, rect %s, flags %#x.\n", +- surface, map_desc, wine_dbgstr_rect(rect), flags); +- +- if (surface->resource.map_count) +- { +- WARN("Surface is already mapped.\n"); +- return WINED3DERR_INVALIDCALL; +- } + + if ((format->flags & WINED3DFMT_FLAG_BLOCKS) && rect + && !surface_check_block_align(surface, rect)) +@@ -2445,11 +2424,6 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + return WINED3DERR_INVALIDCALL; + } + +- ++surface->resource.map_count; +- +- if (!(surface->resource.access_flags & WINED3D_RESOURCE_ACCESS_CPU)) +- WARN("Trying to lock unlockable surface.\n"); +- + /* Performance optimization: Count how often a surface is mapped, if it is + * mapped regularly do not throw away the system memory copy. This avoids + * the need to download the surface from OpenGL all the time. The surface +@@ -2465,72 +2439,26 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + } + } + +- if (device->d3d_initialized) +- context = context_acquire(device, NULL); +- +- wined3d_resource_prepare_map_memory(&surface->resource, context); +- if (flags & WINED3D_MAP_DISCARD) +- { +- TRACE("WINED3D_MAP_DISCARD flag passed, marking %s as up to date.\n", +- wined3d_debug_location(surface->resource.map_binding)); +- wined3d_resource_validate_location(&surface->resource, surface->resource.map_binding); +- } +- else ++ if (rect) + { +- if (surface->resource.usage & WINED3DUSAGE_DYNAMIC) +- WARN_(d3d_perf)("Mapping a dynamic surface without WINED3D_MAP_DISCARD.\n"); ++ surface->lockedRect = *rect; + +- wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); ++ box.left = rect->left; ++ box.top = rect->top; ++ box.front = 0; ++ box.right = rect->right; ++ box.bottom = rect->bottom; ++ box.back = 1; + } +- +- if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY))) +- wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); +- +- base_memory = wined3d_resource_get_map_ptr(&surface->resource, context, flags); +- +- if (context) +- context_release(context); +- +- if (format->flags & WINED3DFMT_FLAG_BROKEN_PITCH) +- map_desc->row_pitch = surface->resource.width * format->byte_count; + else +- wined3d_resource_get_pitch(&surface->resource, &map_desc->row_pitch, &map_desc->slice_pitch); +- map_desc->slice_pitch = 0; +- +- if (!rect) + { +- map_desc->data = base_memory; + surface->lockedRect.left = 0; + surface->lockedRect.top = 0; + surface->lockedRect.right = surface->resource.width; + surface->lockedRect.bottom = surface->resource.height; + } +- else +- { +- if ((format->flags & (WINED3DFMT_FLAG_BLOCKS | WINED3DFMT_FLAG_BROKEN_PITCH)) == WINED3DFMT_FLAG_BLOCKS) +- { +- /* Compressed textures are block based, so calculate the offset of +- * the block that contains the top-left pixel of the locked rectangle. */ +- map_desc->data = base_memory +- + ((rect->top / format->block_height) * map_desc->row_pitch) +- + ((rect->left / format->block_width) * format->block_byte_count); +- } +- else +- { +- map_desc->data = base_memory +- + (map_desc->row_pitch * rect->top) +- + (rect->left * format->byte_count); +- } +- surface->lockedRect.left = rect->left; +- surface->lockedRect.top = rect->top; +- surface->lockedRect.right = rect->right; +- surface->lockedRect.bottom = rect->bottom; +- } +- +- TRACE("Locked rect %s.\n", wine_dbgstr_rect(&surface->lockedRect)); +- TRACE("Returning memory %p, pitch %u.\n", map_desc->data, map_desc->row_pitch); + +- return WINED3D_OK; ++ return wined3d_resource_map(&surface->resource, map_desc, rect ? &box : NULL, flags); + } + + HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc) +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index 7e5576b..7ce5331 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -422,7 +422,12 @@ struct wined3d_volume * CDECL wined3d_volume_from_resource(struct wined3d_resour + + HRESULT CDECL wined3d_volume_unmap(struct wined3d_volume *volume) + { +- return wined3d_resource_unmap(&volume->resource); ++ HRESULT hr; ++ ++ hr = wined3d_resource_unmap(&volume->resource); ++ if (hr == WINEDDERR_NOTLOCKED) ++ return WINED3DERR_INVALIDCALL; ++ return hr; + } + + static ULONG volume_resource_incref(struct wined3d_resource *resource) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0040-wined3d-Use-client-storage-with-DIB-sections.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0040-wined3d-Use-client-storage-with-DIB-sections.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0040-wined3d-Use-client-storage-with-DIB-sections.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0040-wined3d-Use-client-storage-with-DIB-sections.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,78 @@ +From e2500c76e7b1b762eeb610d580ce90eec9798773 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 21 Jan 2014 17:06:20 +0100 +Subject: wined3d: Use client storage with DIB sections. + +Now that DIBs are a separate location, we can keep the sysmem around for +OpenGL's use. +--- + dlls/wined3d/surface.c | 27 --------------------------- + dlls/wined3d/texture.c | 3 +-- + 2 files changed, 1 insertion(+), 29 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 16233d3..303a0dc 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -484,28 +484,6 @@ static void surface_evict_sysmem(struct wined3d_surface *surface) + wined3d_resource_invalidate_location(&surface->resource, WINED3D_LOCATION_SYSMEM); + } + +-static void surface_release_client_storage(struct wined3d_surface *surface) +-{ +- struct wined3d_context *context = context_acquire(surface->resource.device, NULL); +- const struct wined3d_gl_info *gl_info = context->gl_info; +- +- if (surface->container->texture_rgb.name) +- { +- wined3d_texture_bind_and_dirtify(surface->container, context, FALSE); +- gl_info->gl_ops.gl.p_glTexImage2D(surface->texture_target, surface->texture_level, +- GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); +- } +- if (surface->container->texture_srgb.name) +- { +- wined3d_texture_bind_and_dirtify(surface->container, context, TRUE); +- gl_info->gl_ops.gl.p_glTexImage2D(surface->texture_target, surface->texture_level, +- GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); +- } +- wined3d_texture_force_reload(surface->container); +- +- context_release(context); +-} +- + static BOOL surface_use_pbo(const struct wined3d_surface *surface) + { + const struct wined3d_gl_info *gl_info = &surface->resource.device->adapter->gl_info; +@@ -2483,11 +2461,6 @@ HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc) + /* Create a DIB section if there isn't a dc yet. */ + if (!surface->hDC) + { +- if (surface->flags & SFLAG_CLIENT) +- { +- wined3d_resource_load_location(&surface->resource, context, WINED3D_LOCATION_SYSMEM); +- surface_release_client_storage(surface); +- } + hr = surface_create_dib_section(surface); + if (FAILED(hr)) + { +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index 429eb89..ec5c847 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -903,12 +903,11 @@ static void texture2d_prepare_texture(struct wined3d_texture *texture, struct wi + + if (gl_info->supported[APPLE_CLIENT_STORAGE]) + { +- if (surface->flags & (SFLAG_NONPOW2 | SFLAG_DIBSECTION) ++ if (surface->flags & (SFLAG_NONPOW2) + || texture->flags & WINED3D_TEXTURE_CONVERTED) + { + /* In some cases we want to disable client storage. + * SFLAG_NONPOW2 has a bigger opengl texture than the client memory, and different pitches +- * SFLAG_DIBSECTION: Dibsections may have read / write protections on the memory. Avoid issues... + * WINED3D_TEXTURE_CONVERTED: The conversion destination memory is freed after loading the surface + * heap_memory == NULL: Not defined in the extension. Seems to disable client storage effectively + */ +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0041-wined3d-Don-t-call-the-public-map-function-in-surfac.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0041-wined3d-Don-t-call-the-public-map-function-in-surfac.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0041-wined3d-Don-t-call-the-public-map-function-in-surfac.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0041-wined3d-Don-t-call-the-public-map-function-in-surfac.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,101 @@ +From 89a2597787017d7bc966c2a146fa4c4fc59e9ebb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Mon, 23 Sep 2013 23:58:41 +0200 +Subject: wined3d: Don't call the public map function in + surface_convert_format. + +TODO: Creating a helper surface and releasing it won't work with the CS. +surface_cpu_blt will be called via the CS, so it can't call external +methods that enqueue commands in the stream. +--- + dlls/wined3d/surface.c | 57 +++++++++++++++++++++++++++++++++----------------- + 1 file changed, 38 insertions(+), 19 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 303a0dc..045ede5 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -2253,11 +2253,14 @@ static inline const struct d3dfmt_converter_desc *find_converter(enum wined3d_fo + + static struct wined3d_texture *surface_convert_format(struct wined3d_surface *source, enum wined3d_format_id to_fmt) + { +- struct wined3d_map_desc src_map, dst_map; ++ void *dst_data = NULL, *src_data = NULL; ++ UINT src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch; + const struct d3dfmt_converter_desc *conv; + struct wined3d_texture *ret = NULL; + struct wined3d_resource_desc desc; + struct wined3d_surface *dst; ++ struct wined3d_context *context = NULL; ++ struct wined3d_device *device = source->resource.device; + + conv = find_converter(source->resource.format->id, to_fmt); + if (!conv) +@@ -2281,30 +2284,46 @@ static struct wined3d_texture *surface_convert_format(struct wined3d_surface *so + } + dst = surface_from_resource(wined3d_texture_get_sub_resource(ret, 0)); + +- memset(&src_map, 0, sizeof(src_map)); +- memset(&dst_map, 0, sizeof(dst_map)); ++ wined3d_resource_get_pitch(&source->resource, &src_row_pitch, &src_slice_pitch); ++ wined3d_resource_get_pitch(&ret->resource, &dst_row_pitch, &dst_slice_pitch); + +- if (FAILED(wined3d_surface_map(source, &src_map, NULL, WINED3D_MAP_READONLY))) +- { +- ERR("Failed to lock the source surface.\n"); +- wined3d_texture_decref(ret); +- return NULL; +- } +- if (FAILED(wined3d_surface_map(dst, &dst_map, NULL, 0))) +- { +- ERR("Failed to lock the destination surface.\n"); +- wined3d_surface_unmap(source); +- wined3d_texture_decref(ret); +- return NULL; +- } ++ if (device->d3d_initialized) ++ context = context_acquire(device, NULL); ++ ++ wined3d_resource_load_location(&source->resource, context, source->resource.map_binding); ++ src_data = wined3d_resource_get_map_ptr(&source->resource, context, WINED3D_MAP_READONLY); ++ if (!src_data) ++ goto error; + +- conv->convert(src_map.data, dst_map.data, src_map.row_pitch, dst_map.row_pitch, ++ if (!wined3d_resource_prepare_map_memory(&dst->resource, context)) ++ goto error; ++ dst_data = wined3d_resource_get_map_ptr(&dst->resource, context, 0); ++ if (!dst_data) ++ goto error; ++ ++ conv->convert(src_data, dst_data, src_row_pitch, dst_row_pitch, + source->resource.width, source->resource.height); + +- wined3d_surface_unmap(dst); +- wined3d_surface_unmap(source); ++ wined3d_resource_release_map_ptr(&dst->resource, context); ++ wined3d_resource_release_map_ptr(&source->resource, context); ++ ++ if (context) ++ context_release(context); + + return ret; ++ ++error: ++ ERR("Surface conversion failed.\n"); ++ ++ if (src_data) ++ wined3d_resource_release_map_ptr(&source->resource, context); ++ if (dst_data) ++ wined3d_resource_release_map_ptr(&ret->resource, context); ++ if (ret) ++ wined3d_texture_decref(ret); ++ if (context) ++ context_release(context); ++ return NULL; + } + + static HRESULT _Blt_ColorFill(BYTE *buf, unsigned int width, unsigned int height, +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0042-wined3d-Don-t-call-the-public-map-function-in-surfac.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0042-wined3d-Don-t-call-the-public-map-function-in-surfac.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0042-wined3d-Don-t-call-the-public-map-function-in-surfac.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0042-wined3d-Don-t-call-the-public-map-function-in-surfac.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,292 @@ +From fa6437785e10e647df1af29b1ac544d2d1f3466f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 24 Sep 2013 00:31:39 +0200 +Subject: wined3d: Don't call the public map function in surface_cpu_blt. + +--- + dlls/wined3d/surface.c | 111 ++++++++++++++++++++++++++++++++----------------- + 1 file changed, 74 insertions(+), 37 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 045ede5..3702866 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -4359,21 +4359,36 @@ static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT * + int bpp, srcheight, srcwidth, dstheight, dstwidth, width; + const struct wined3d_format *src_format, *dst_format; + struct wined3d_texture *src_texture = NULL; +- struct wined3d_map_desc dst_map, src_map; ++ void *src_data = NULL, *dst_data = NULL; ++ UINT src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch; + const BYTE *sbase = NULL; + HRESULT hr = WINED3D_OK; + const BYTE *sbuf; + BYTE *dbuf; + int x, y; ++ struct wined3d_device *device = dst_surface->resource.device; ++ struct wined3d_context *context = NULL; + + TRACE("dst_surface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, fx %p, filter %s.\n", + dst_surface, wine_dbgstr_rect(dst_rect), src_surface, wine_dbgstr_rect(src_rect), + flags, fx, debug_d3dtexturefiltertype(filter)); + ++ if (device->d3d_initialized) ++ context = context_acquire(device, NULL); ++ ++ if (!wined3d_resource_prepare_map_memory(&dst_surface->resource, context)) ++ { ++ hr = E_OUTOFMEMORY; ++ goto error; ++ } ++ wined3d_resource_load_location(&dst_surface->resource, context, dst_surface->resource.map_binding); ++ + if (src_surface == dst_surface) + { +- wined3d_surface_map(dst_surface, &dst_map, NULL, 0); +- src_map = dst_map; ++ dst_data = wined3d_resource_get_map_ptr(&dst_surface->resource, context, 0); ++ wined3d_resource_get_pitch(&dst_surface->resource, &dst_row_pitch, &dst_slice_pitch); ++ src_data = dst_data; ++ src_row_pitch = dst_row_pitch; + src_format = dst_surface->resource.format; + dst_format = src_format; + } +@@ -4382,6 +4397,12 @@ static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT * + dst_format = dst_surface->resource.format; + if (src_surface) + { ++ if (!wined3d_resource_prepare_map_memory(&src_surface->resource, context)) ++ { ++ hr = E_OUTOFMEMORY; ++ goto error; ++ } ++ + if (dst_surface->resource.format->id != src_surface->resource.format->id) + { + if (!(src_texture = surface_convert_format(src_surface, dst_format->id))) +@@ -4392,7 +4413,9 @@ static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT * + } + src_surface = surface_from_resource(wined3d_texture_get_sub_resource(src_texture, 0)); + } +- wined3d_surface_map(src_surface, &src_map, NULL, WINED3D_MAP_READONLY); ++ wined3d_resource_load_location(&src_surface->resource, context, src_surface->resource.map_binding); ++ wined3d_resource_get_pitch(&src_surface->resource, &src_row_pitch, &src_slice_pitch); ++ src_data = wined3d_resource_get_map_ptr(&src_surface->resource, context, 0); + src_format = src_surface->resource.format; + } + else +@@ -4400,7 +4423,8 @@ static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT * + src_format = dst_format; + } + +- wined3d_surface_map(dst_surface, &dst_map, dst_rect, 0); ++ wined3d_resource_get_pitch(&dst_surface->resource, &dst_row_pitch, &dst_slice_pitch); ++ dst_data = wined3d_resource_get_map_ptr(&dst_surface->resource, context, 0); + } + + bpp = dst_surface->resource.format->byte_count; +@@ -4411,15 +4435,12 @@ static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT * + width = (dst_rect->right - dst_rect->left) * bpp; + + if (src_surface) +- sbase = (BYTE *)src_map.data +- + ((src_rect->top / src_format->block_height) * src_map.row_pitch) ++ sbase = (BYTE *)src_data ++ + ((src_rect->top / src_format->block_height) * src_row_pitch) + + ((src_rect->left / src_format->block_width) * src_format->block_byte_count); +- if (src_surface != dst_surface) +- dbuf = dst_map.data; +- else +- dbuf = (BYTE *)dst_map.data +- + ((dst_rect->top / dst_format->block_height) * dst_map.row_pitch) +- + ((dst_rect->left / dst_format->block_width) * dst_format->block_byte_count); ++ dbuf = (BYTE *)dst_data ++ + ((dst_rect->top / dst_format->block_height) * dst_row_pitch) ++ + ((dst_rect->left / dst_format->block_width) * dst_format->block_byte_count); + + if (src_format->flags & dst_format->flags & WINED3DFMT_FLAG_BLOCKS) + { +@@ -4454,7 +4475,7 @@ static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT * + } + + hr = surface_cpu_blt_compressed(sbase, dbuf, +- src_map.row_pitch, dst_map.row_pitch, dstwidth, dstheight, ++ src_row_pitch, dst_row_pitch, dstwidth, dstheight, + src_format, flags, fx); + goto release; + } +@@ -4462,7 +4483,7 @@ static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT * + /* First, all the 'source-less' blits */ + if (flags & WINEDDBLT_COLORFILL) + { +- hr = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, dst_map.row_pitch, fx->u5.dwFillColor); ++ hr = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, dst_row_pitch, fx->u5.dwFillColor); + flags &= ~WINEDDBLT_COLORFILL; + } + +@@ -4476,12 +4497,12 @@ static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT * + switch (fx->dwROP) + { + case BLACKNESS: +- hr = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, dst_map.row_pitch, 0); ++ hr = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, dst_row_pitch, 0); + break; + case 0xaa0029: /* No-op */ + break; + case WHITENESS: +- hr = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, dst_map.row_pitch, ~0U); ++ hr = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, dst_row_pitch, ~0U); + break; + case SRCCOPY: /* Well, we do that below? */ + break; +@@ -4532,19 +4553,19 @@ static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT * + for (y = 0; y < dstheight; ++y) + { + memcpy(dbuf, sbuf, width); +- sbuf += src_map.row_pitch; +- dbuf += dst_map.row_pitch; ++ sbuf += src_row_pitch; ++ dbuf += dst_row_pitch; + } + } + else if (dst_rect->top > src_rect->top) + { + /* Copy from bottom upwards. */ +- sbuf += src_map.row_pitch * dstheight; +- dbuf += dst_map.row_pitch * dstheight; ++ sbuf += src_row_pitch * dstheight; ++ dbuf += dst_row_pitch * dstheight; + for (y = 0; y < dstheight; ++y) + { +- sbuf -= src_map.row_pitch; +- dbuf -= dst_map.row_pitch; ++ sbuf -= src_row_pitch; ++ dbuf -= dst_row_pitch; + memcpy(dbuf, sbuf, width); + } + } +@@ -4554,8 +4575,8 @@ static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT * + for (y = 0; y < dstheight; ++y) + { + memmove(dbuf, sbuf, width); +- sbuf += src_map.row_pitch; +- dbuf += dst_map.row_pitch; ++ sbuf += src_row_pitch; ++ dbuf += dst_row_pitch; + } + } + } +@@ -4564,9 +4585,9 @@ static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT * + /* Stretching in y direction only. */ + for (y = sy = 0; y < dstheight; ++y, sy += yinc) + { +- sbuf = sbase + (sy >> 16) * src_map.row_pitch; ++ sbuf = sbase + (sy >> 16) * src_row_pitch; + memcpy(dbuf, sbuf, width); +- dbuf += dst_map.row_pitch; ++ dbuf += dst_row_pitch; + } + } + } +@@ -4576,13 +4597,13 @@ static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT * + int last_sy = -1; + for (y = sy = 0; y < dstheight; ++y, sy += yinc) + { +- sbuf = sbase + (sy >> 16) * src_map.row_pitch; ++ sbuf = sbase + (sy >> 16) * src_row_pitch; + + if ((sy >> 16) == (last_sy >> 16)) + { + /* This source row is the same as last source row - + * Copy the already stretched row. */ +- memcpy(dbuf, dbuf - dst_map.row_pitch, width); ++ memcpy(dbuf, dbuf - dst_row_pitch, width); + } + else + { +@@ -4629,14 +4650,14 @@ do { \ + } + #undef STRETCH_ROW + } +- dbuf += dst_map.row_pitch; ++ dbuf += dst_row_pitch; + last_sy = sy; + } + } + } + else + { +- LONG dstyinc = dst_map.row_pitch, dstxinc = bpp; ++ LONG dstyinc = dst_row_pitch, dstxinc = bpp; + DWORD keylow = 0xffffffff, keyhigh = 0, keymask = 0xffffffff; + DWORD destkeylow = 0x0, destkeyhigh = 0xffffffff, destkeymask = 0xffffffff; + if (flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYDEST | WINEDDBLT_KEYSRCOVERRIDE | WINEDDBLT_KEYDESTOVERRIDE)) +@@ -4686,7 +4707,7 @@ do { \ + LONG tmpxy; + dTopLeft = dbuf; + dTopRight = dbuf + ((dstwidth - 1) * bpp); +- dBottomLeft = dTopLeft + ((dstheight - 1) * dst_map.row_pitch); ++ dBottomLeft = dTopLeft + ((dstheight - 1) * dst_row_pitch); + dBottomRight = dBottomLeft + ((dstwidth - 1) * bpp); + + if (fx->dwDDFX & WINEDDBLTFX_ARITHSTRETCHY) +@@ -4769,7 +4790,7 @@ do { \ + type *d = (type *)dbuf, *dx, tmp; \ + for (y = sy = 0; y < dstheight; ++y, sy += yinc) \ + { \ +- s = (const type *)(sbase + (sy >> 16) * src_map.row_pitch); \ ++ s = (const type *)(sbase + (sy >> 16) * src_row_pitch); \ + dx = d; \ + for (x = sx = 0; x < dstwidth; ++x, sx += xinc) \ + { \ +@@ -4802,7 +4823,7 @@ do { \ + BYTE *d = dbuf, *dx; + for (y = sy = 0; y < dstheight; ++y, sy += yinc) + { +- sbuf = sbase + (sy >> 16) * src_map.row_pitch; ++ sbuf = sbase + (sy >> 16) * src_row_pitch; + dx = d; + for (x = sx = 0; x < dstwidth; ++x, sx+= xinc) + { +@@ -4833,6 +4854,10 @@ do { \ + } + } + ++ wined3d_resource_invalidate_location(&dst_surface->resource, ~dst_surface->resource.map_binding); ++ if (dst_surface->container) ++ wined3d_texture_set_dirty(dst_surface->container); ++ + error: + if (flags && FIXME_ON(d3d_surface)) + { +@@ -4840,12 +4865,24 @@ error: + } + + release: +- wined3d_surface_unmap(dst_surface); +- if (src_surface && src_surface != dst_surface) +- wined3d_surface_unmap(src_surface); ++ if (dst_data) ++ { ++ wined3d_resource_release_map_ptr(&dst_surface->resource, context); ++ ++ if (dst_surface->container->swapchain ++ && dst_surface->container == dst_surface->container->swapchain->front_buffer) ++ { ++ dst_surface->lockedRect = *dst_rect; ++ dst_surface->surface_ops->surface_frontbuffer_updated(dst_surface); ++ } ++ } ++ if (src_surface && src_surface != dst_surface && src_data) ++ wined3d_resource_release_map_ptr(&src_surface->resource, context); + /* Release the converted surface, if any. */ + if (src_texture) + wined3d_texture_decref(src_texture); ++ if (context) ++ context_release(context); + + return hr; + } +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0043-wined3d-Move-the-framebuffer-into-wined3d_state.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0043-wined3d-Move-the-framebuffer-into-wined3d_state.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0043-wined3d-Move-the-framebuffer-into-wined3d_state.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0043-wined3d-Move-the-framebuffer-into-wined3d_state.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,932 @@ +From b9c81476bc8d3bc8aa55fac10f0c7fc22a74dcb0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 20 Dec 2012 13:09:17 +0100 +Subject: wined3d: Move the framebuffer into wined3d_state + +--- + dlls/wined3d/arb_program_shader.c | 4 +- + dlls/wined3d/context.c | 20 +++++-- + dlls/wined3d/cs.c | 21 ++----- + dlls/wined3d/device.c | 117 +++++++++++++++++--------------------- + dlls/wined3d/drawprim.c | 14 ++--- + dlls/wined3d/glsl_shader.c | 2 +- + dlls/wined3d/shader.c | 2 +- + dlls/wined3d/state.c | 18 +++--- + dlls/wined3d/stateblock.c | 45 +++++++++++++-- + dlls/wined3d/surface.c | 2 +- + dlls/wined3d/swapchain.c | 2 +- + dlls/wined3d/utils.c | 2 +- + dlls/wined3d/wined3d_private.h | 46 +++++++++++---- + 13 files changed, 170 insertions(+), 125 deletions(-) + +diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c +index f612099..2875fe1 100644 +--- a/dlls/wined3d/arb_program_shader.c ++++ b/dlls/wined3d/arb_program_shader.c +@@ -706,7 +706,7 @@ static void shader_arb_load_constants_internal(struct shader_arb_priv *priv, + { + const struct wined3d_shader *pshader = state->shader[WINED3D_SHADER_TYPE_PIXEL]; + const struct arb_ps_compiled_shader *gl_shader = priv->compiled_fprog; +- UINT rt_height = state->fb->render_targets[0]->height; ++ UINT rt_height = state->fb.render_targets[0]->height; + + /* Load DirectX 9 float constants for pixel shader */ + priv->highest_dirty_ps_const = shader_arb_load_constantsF(pshader, gl_info, GL_FRAGMENT_PROGRAM_ARB, +@@ -4674,7 +4674,7 @@ static void shader_arb_select(void *shader_priv, struct wined3d_context *context + } + else + { +- UINT rt_height = state->fb->render_targets[0]->height; ++ UINT rt_height = state->fb.render_targets[0]->height; + shader_arb_ps_local_constants(compiled, context, state, rt_height); + } + +diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c +index cc60348..679e728 100644 +--- a/dlls/wined3d/context.c ++++ b/dlls/wined3d/context.c +@@ -1448,6 +1448,12 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain, + goto out; + } + ++ ret->current_fb.render_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ++ sizeof(*ret->current_fb.render_targets) * gl_info->limits.buffers); ++ ret->current_fb.rt_size = gl_info->limits.buffers; ++ if (!ret->current_fb.render_targets) ++ goto out; ++ + /* Initialize the texture unit mapping to a 1:1 mapping */ + for (s = 0; s < MAX_COMBINED_SAMPLERS; ++s) + { +@@ -1764,6 +1770,7 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain, + + out: + device->shader_backend->shader_free_context_data(ret); ++ HeapFree(GetProcessHeap(), 0, ret->current_fb.render_targets); + HeapFree(GetProcessHeap(), 0, ret->free_event_queries); + HeapFree(GetProcessHeap(), 0, ret->free_occlusion_queries); + HeapFree(GetProcessHeap(), 0, ret->free_timestamp_queries); +@@ -1797,6 +1804,7 @@ void context_destroy(struct wined3d_device *device, struct wined3d_context *cont + } + + device->shader_backend->shader_free_context_data(context); ++ HeapFree(GetProcessHeap(), 0, context->current_fb.render_targets); + HeapFree(GetProcessHeap(), 0, context->draw_buffers); + HeapFree(GetProcessHeap(), 0, context->blit_targets); + device_context_remove(device, context); +@@ -2306,7 +2314,7 @@ BOOL context_apply_clear_state(struct wined3d_context *context, const struct win + DWORD rt_mask = 0, *cur_mask; + UINT i; + +- if (isStateDirty(context, STATE_FRAMEBUFFER) || fb != &device->fb ++ if (isStateDirty(context, STATE_FRAMEBUFFER) || !wined3d_fb_equal(fb, &context->current_fb) + || rt_count != context->gl_info->limits.buffers) + { + if (!context_validate_rt_config(rt_count, rts, fb->depth_stencil)) +@@ -2349,6 +2357,8 @@ BOOL context_apply_clear_state(struct wined3d_context *context, const struct win + rt_mask = context_generate_rt_mask_no_fbo(device, + rt_count ? wined3d_rendertarget_view_get_surface(rts[0]) : NULL); + } ++ ++ wined3d_fb_copy(&context->current_fb, fb); + } + else if (wined3d_settings.offscreen_rendering_mode == ORM_FBO + && (!rt_count || wined3d_resource_is_offscreen(rts[0]->resource))) +@@ -2399,7 +2409,7 @@ BOOL context_apply_clear_state(struct wined3d_context *context, const struct win + static DWORD find_draw_buffers_mask(const struct wined3d_context *context, const struct wined3d_device *device) + { + const struct wined3d_state *state = &device->state; +- struct wined3d_rendertarget_view **rts = state->fb->render_targets; ++ struct wined3d_rendertarget_view **rts = state->fb.render_targets; + struct wined3d_shader *ps = state->shader[WINED3D_SHADER_TYPE_PIXEL]; + DWORD rt_mask, rt_mask_bits; + unsigned int i; +@@ -2429,7 +2439,7 @@ static DWORD find_draw_buffers_mask(const struct wined3d_context *context, const + void context_state_fb(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { + const struct wined3d_device *device = context->swapchain->device; +- const struct wined3d_fb_state *fb = state->fb; ++ const struct wined3d_fb_state *fb = &state->fb; + DWORD rt_mask = find_draw_buffers_mask(context, device); + DWORD *cur_mask; + +@@ -2459,6 +2469,8 @@ void context_state_fb(struct wined3d_context *context, const struct wined3d_stat + context_apply_draw_buffers(context, rt_mask); + *cur_mask = rt_mask; + } ++ ++ wined3d_fb_copy(&context->current_fb, &state->fb); + } + + static void context_map_stage(struct wined3d_context *context, DWORD stage, DWORD unit) +@@ -2960,7 +2972,7 @@ BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_de + { + const struct wined3d_state *state = &device->state; + const struct StateEntry *state_table = context->state_table; +- const struct wined3d_fb_state *fb = state->fb; ++ const struct wined3d_fb_state *fb = &state->fb; + unsigned int i, j; + WORD map; + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index b8a32e5..7bebe80 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -280,7 +280,7 @@ static void wined3d_cs_exec_clear(struct wined3d_cs *cs, const void *data) + device = cs->device; + wined3d_get_draw_rect(&device->state, &draw_rect); + device_clear_render_targets(device, device->adapter->gl_info.limits.buffers, +- &device->fb, op->rect_count, op->rects, &draw_rect, op->flags, ++ &cs->state.fb, op->rect_count, op->rects, &draw_rect, op->flags, + op->color, op->depth, op->stencil); + } + +@@ -387,7 +387,7 @@ static void wined3d_cs_exec_set_rendertarget_view(struct wined3d_cs *cs, const v + { + const struct wined3d_cs_set_rendertarget_view *op = data; + +- cs->state.fb->render_targets[op->view_idx] = op->view; ++ cs->state.fb.render_targets[op->view_idx] = op->view; + device_invalidate_state(cs->device, STATE_FRAMEBUFFER); + } + +@@ -410,7 +410,7 @@ static void wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const + struct wined3d_device *device = cs->device; + struct wined3d_rendertarget_view *prev; + +- if ((prev = cs->state.fb->depth_stencil)) ++ if ((prev = cs->state.fb.depth_stencil)) + { + struct wined3d_surface *prev_surface = wined3d_rendertarget_view_get_surface(prev); + +@@ -426,7 +426,7 @@ static void wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const + } + } + +- cs->fb.depth_stencil = op->view; ++ cs->state.fb.depth_stencil = op->view; + + if (!prev != !op->view) + { +@@ -893,7 +893,7 @@ static void wined3d_cs_exec_reset_state(struct wined3d_cs *cs, const void *data) + + state_cleanup(&cs->state); + memset(&cs->state, 0, sizeof(cs->state)); +- if (FAILED(hr = state_init(&cs->state, &cs->fb, &adapter->gl_info, &adapter->d3d_info, ++ if (FAILED(hr = state_init(&cs->state, &adapter->gl_info, &adapter->d3d_info, + WINED3D_STATE_NO_REF | WINED3D_STATE_INIT_DEFAULT))) + ERR("Failed to initialize CS state, hr %#x.\n", hr); + } +@@ -975,17 +975,9 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) + if (!(cs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*cs)))) + return NULL; + +- if (!(cs->fb.render_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, +- sizeof(*cs->fb.render_targets) * gl_info->limits.buffers))) +- { +- HeapFree(GetProcessHeap(), 0, cs); +- return NULL; +- } +- +- if (FAILED(state_init(&cs->state, &cs->fb, gl_info, &device->adapter->d3d_info, ++ if (FAILED(state_init(&cs->state, gl_info, &device->adapter->d3d_info, + WINED3D_STATE_NO_REF | WINED3D_STATE_INIT_DEFAULT))) + { +- HeapFree(GetProcessHeap(), 0, cs->fb.render_targets); + HeapFree(GetProcessHeap(), 0, cs); + return NULL; + } +@@ -1006,7 +998,6 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) + void wined3d_cs_destroy(struct wined3d_cs *cs) + { + state_cleanup(&cs->state); +- HeapFree(GetProcessHeap(), 0, cs->fb.render_targets); + HeapFree(GetProcessHeap(), 0, cs->data); + HeapFree(GetProcessHeap(), 0, cs); + } +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 565a92c..92478d7 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -851,7 +851,7 @@ static void device_init_swapchain_state(struct wined3d_device *device, struct wi + BOOL ds_enable = !!swapchain->desc.enable_auto_depth_stencil; + unsigned int i; + +- if (device->fb.render_targets) ++ if (device->state.fb.render_targets) + { + for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i) + { +@@ -869,7 +869,6 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device, + struct wined3d_swapchain_desc *swapchain_desc) + { + static const struct wined3d_color black = {0.0f, 0.0f, 0.0f, 0.0f}; +- const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + struct wined3d_swapchain *swapchain = NULL; + struct wined3d_context *context; + DWORD clear_flags = 0; +@@ -882,9 +881,6 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device, + if (device->wined3d->flags & WINED3D_NO3D) + return WINED3DERR_INVALIDCALL; + +- device->fb.render_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, +- sizeof(*device->fb.render_targets) * gl_info->limits.buffers); +- + if (FAILED(hr = device->shader_backend->shader_alloc_private(device, + device->adapter->vertex_pipe, device->adapter->fragment_pipe))) + { +@@ -972,7 +968,6 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device, + return WINED3D_OK; + + err_out: +- HeapFree(GetProcessHeap(), 0, device->fb.render_targets); + HeapFree(GetProcessHeap(), 0, device->swapchains); + device->swapchain_count = 0; + if (device->back_buffer_view) +@@ -1044,8 +1039,25 @@ HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device) + if (device->cursor_texture) + wined3d_texture_decref(device->cursor_texture); + ++ /* Release the buffers (with sanity checks). ++ * FIXME: Move this move into a separate patch. I think the idea ++ * behind this is that those surfaces should be freed before unloading ++ * remaining resources below. */ ++ if (device->onscreen_depth_stencil) ++ { ++ surface = device->onscreen_depth_stencil; ++ device->onscreen_depth_stencil = NULL; ++ wined3d_surface_decref(surface); ++ } ++ + state_unbind_resources(&device->state); + ++ if (device->auto_depth_stencil_view) ++ { ++ wined3d_rendertarget_view_decref(device->auto_depth_stencil_view); ++ device->auto_depth_stencil_view = NULL; ++ } ++ + /* Unload resources */ + LIST_FOR_EACH_ENTRY_SAFE(resource, cursor, &device->resources, struct wined3d_resource, resource_list_entry) + { +@@ -1068,37 +1080,6 @@ HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device) + device->shader_backend->shader_free_private(device); + destroy_dummy_textures(device, gl_info); + +- /* Release the buffers (with sanity checks)*/ +- if (device->onscreen_depth_stencil) +- { +- surface = device->onscreen_depth_stencil; +- device->onscreen_depth_stencil = NULL; +- wined3d_surface_decref(surface); +- } +- +- if (device->fb.depth_stencil) +- { +- struct wined3d_rendertarget_view *view = device->fb.depth_stencil; +- +- TRACE("Releasing depth/stencil view %p.\n", view); +- +- device->fb.depth_stencil = NULL; +- wined3d_rendertarget_view_decref(view); +- } +- +- if (device->auto_depth_stencil_view) +- { +- struct wined3d_rendertarget_view *view = device->auto_depth_stencil_view; +- +- device->auto_depth_stencil_view = NULL; +- if (wined3d_rendertarget_view_decref(view)) +- ERR("Something's still holding the auto depth/stencil view (%p).\n", view); +- } +- +- for (i = 0; i < gl_info->limits.buffers; ++i) +- { +- wined3d_device_set_rendertarget_view(device, i, NULL, FALSE); +- } + if (device->back_buffer_view) + { + wined3d_rendertarget_view_decref(device->back_buffer_view); +@@ -1118,9 +1099,6 @@ HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device) + device->swapchains = NULL; + device->swapchain_count = 0; + +- HeapFree(GetProcessHeap(), 0, device->fb.render_targets); +- device->fb.render_targets = NULL; +- + device->d3d_initialized = FALSE; + + return WINED3D_OK; +@@ -1910,7 +1888,7 @@ static void resolve_depth_buffer(struct wined3d_state *state) + || !(texture->resource.format->flags & WINED3DFMT_FLAG_DEPTH)) + return; + surface = surface_from_resource(texture->sub_resources[0]); +- if (!(depth_stencil = wined3d_rendertarget_view_get_surface(state->fb->depth_stencil))) ++ if (!(depth_stencil = wined3d_rendertarget_view_get_surface(state->fb.depth_stencil))) + return; + + wined3d_surface_blt(surface, NULL, depth_stencil, NULL, 0, NULL, WINED3D_TEXF_POINT); +@@ -3299,6 +3277,8 @@ HRESULT CDECL wined3d_device_present(const struct wined3d_device *device, const + HRESULT CDECL wined3d_device_clear(struct wined3d_device *device, DWORD rect_count, + const RECT *rects, DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil) + { ++ const struct wined3d_fb_state *fb = &device->state.fb; ++ + TRACE("device %p, rect_count %u, rects %p, flags %#x, color {%.8e, %.8e, %.8e, %.8e}, depth %.8e, stencil %u.\n", + device, rect_count, rects, flags, color->r, color->g, color->b, color->a, depth, stencil); + +@@ -3310,7 +3290,7 @@ HRESULT CDECL wined3d_device_clear(struct wined3d_device *device, DWORD rect_cou + + if (flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL)) + { +- struct wined3d_rendertarget_view *ds = device->fb.depth_stencil; ++ struct wined3d_rendertarget_view *ds = fb->depth_stencil; + if (!ds) + { + WARN("Clearing depth and/or stencil without a depth stencil buffer attached, returning WINED3DERR_INVALIDCALL\n"); +@@ -3319,8 +3299,8 @@ HRESULT CDECL wined3d_device_clear(struct wined3d_device *device, DWORD rect_cou + } + else if (flags & WINED3DCLEAR_TARGET) + { +- if (ds->width < device->fb.render_targets[0]->width +- || ds->height < device->fb.render_targets[0]->height) ++ if (ds->width < fb->render_targets[0]->width ++ || ds->height < fb->render_targets[0]->height) + { + WARN("Silently ignoring depth and target clear with mismatching sizes\n"); + return WINED3D_OK; +@@ -3668,8 +3648,8 @@ HRESULT CDECL wined3d_device_validate_device(const struct wined3d_device *device + if (state->render_states[WINED3D_RS_ZENABLE] || state->render_states[WINED3D_RS_ZWRITEENABLE] + || state->render_states[WINED3D_RS_STENCILENABLE]) + { +- struct wined3d_rendertarget_view *rt = device->fb.render_targets[0]; +- struct wined3d_rendertarget_view *ds = device->fb.depth_stencil; ++ struct wined3d_rendertarget_view *rt = state->fb.render_targets[0]; ++ struct wined3d_rendertarget_view *ds = state->fb.depth_stencil; + + if (ds && rt && (ds->width < rt->width || ds->height < rt->height)) + { +@@ -3895,20 +3875,21 @@ struct wined3d_rendertarget_view * CDECL wined3d_device_get_rendertarget_view(co + return NULL; + } + +- return device->fb.render_targets[view_idx]; ++ return device->state.fb.render_targets[view_idx]; + } + + struct wined3d_rendertarget_view * CDECL wined3d_device_get_depth_stencil_view(const struct wined3d_device *device) + { + TRACE("device %p.\n", device); + +- return device->fb.depth_stencil; ++ return device->state.fb.depth_stencil; + } + + HRESULT CDECL wined3d_device_set_rendertarget_view(struct wined3d_device *device, + unsigned int view_idx, struct wined3d_rendertarget_view *view, BOOL set_viewport) + { + struct wined3d_rendertarget_view *prev; ++ struct wined3d_fb_state *fb = &device->state.fb; + + TRACE("device %p, view_idx %u, view %p, set_viewport %#x.\n", + device, view_idx, view, set_viewport); +@@ -3948,13 +3929,13 @@ HRESULT CDECL wined3d_device_set_rendertarget_view(struct wined3d_device *device + } + + +- prev = device->fb.render_targets[view_idx]; ++ prev = fb->render_targets[view_idx]; + if (view == prev) + return WINED3D_OK; + + if (view) + wined3d_rendertarget_view_incref(view); +- device->fb.render_targets[view_idx] = view; ++ fb->render_targets[view_idx] = view; + wined3d_cs_emit_set_rendertarget_view(device->cs, view_idx, view); + /* Release after the assignment, to prevent device_resource_released() + * from seeing the surface as still in use. */ +@@ -3966,18 +3947,19 @@ HRESULT CDECL wined3d_device_set_rendertarget_view(struct wined3d_device *device + + void CDECL wined3d_device_set_depth_stencil_view(struct wined3d_device *device, struct wined3d_rendertarget_view *view) + { ++ struct wined3d_fb_state *fb = &device->state.fb; + struct wined3d_rendertarget_view *prev; + + TRACE("device %p, view %p.\n", device, view); + +- prev = device->fb.depth_stencil; ++ prev = fb->depth_stencil; + if (prev == view) + { + TRACE("Trying to do a NOP SetRenderTarget operation.\n"); + return; + } + +- if ((device->fb.depth_stencil = view)) ++ if ((fb->depth_stencil = view)) + wined3d_rendertarget_view_incref(view); + wined3d_cs_emit_set_depth_stencil_view(device->cs, view); + if (prev) +@@ -4350,10 +4332,9 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, + wined3d_texture_decref(device->cursor_texture); + device->cursor_texture = NULL; + } +- state_unbind_resources(&device->state); + } + +- if (device->fb.render_targets) ++ if (device->state.fb.render_targets) + { + for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i) + { +@@ -4362,6 +4343,11 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, + } + wined3d_device_set_depth_stencil_view(device, NULL); + ++ if (reset_state) ++ { ++ state_unbind_resources(&device->state); ++ } ++ + if (device->onscreen_depth_stencil) + { + wined3d_surface_decref(device->onscreen_depth_stencil); +@@ -4644,7 +4630,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, + if (device->d3d_initialized) + delete_opengl_contexts(device, swapchain); + +- if (FAILED(hr = state_init(&device->state, &device->fb, &device->adapter->gl_info, ++ if (FAILED(hr = state_init(&device->state, &device->adapter->gl_info, + &device->adapter->d3d_info, WINED3D_STATE_INIT_DEFAULT))) + ERR("Failed to initialize device state, hr %#x.\n", hr); + device->update_state = &device->state; +@@ -4653,22 +4639,21 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, + } + else if (device->back_buffer_view) + { +- struct wined3d_rendertarget_view *view = device->back_buffer_view; + struct wined3d_state *state = &device->state; + +- wined3d_device_set_rendertarget_view(device, 0, view, FALSE); ++ wined3d_device_set_rendertarget_view(device, 0, device->back_buffer_view, FALSE); + + /* Note the min_z / max_z is not reset. */ + state->viewport.x = 0; + state->viewport.y = 0; +- state->viewport.width = view->width; +- state->viewport.height = view->height; ++ state->viewport.width = swapchain->desc.backbuffer_width; ++ state->viewport.height = swapchain->desc.backbuffer_height; + wined3d_cs_emit_set_viewport(device->cs, &state->viewport); + + state->scissor_rect.top = 0; + state->scissor_rect.left = 0; +- state->scissor_rect.right = view->width; +- state->scissor_rect.bottom = view->height; ++ state->scissor_rect.right = swapchain->desc.backbuffer_width; ++ state->scissor_rect.bottom = swapchain->desc.backbuffer_height; + wined3d_cs_emit_set_scissor_rect(device->cs, &state->scissor_rect); + } + +@@ -4759,17 +4744,17 @@ void device_resource_released(struct wined3d_device *device, struct wined3d_reso + + for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i) + { +- if (wined3d_rendertarget_view_get_surface(device->fb.render_targets[i]) == surface) ++ if (wined3d_rendertarget_view_get_surface(device->state.fb.render_targets[i]) == surface) + { + ERR("Surface %p is still in use as render target %u.\n", surface, i); +- device->fb.render_targets[i] = NULL; ++ device->state.fb.render_targets[i] = NULL; + } + } + +- if (wined3d_rendertarget_view_get_surface(device->fb.depth_stencil) == surface) ++ if (wined3d_rendertarget_view_get_surface(device->state.fb.depth_stencil) == surface) + { + ERR("Surface %p is still in use as depth/stencil buffer.\n", surface); +- device->fb.depth_stencil = NULL; ++ device->state.fb.depth_stencil = NULL; + } + } + break; +@@ -4910,7 +4895,7 @@ HRESULT device_init(struct wined3d_device *device, struct wined3d *wined3d, + + device->blitter = adapter->blitter; + +- if (FAILED(hr = state_init(&device->state, &device->fb, &adapter->gl_info, ++ if (FAILED(hr = state_init(&device->state, &adapter->gl_info, + &adapter->d3d_info, WINED3D_STATE_INIT_DEFAULT))) + { + ERR("Failed to initialize device state, hr %#x.\n", hr); +diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c +index 62b7032..98261f9 100644 +--- a/dlls/wined3d/drawprim.c ++++ b/dlls/wined3d/drawprim.c +@@ -608,7 +608,7 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co + + if (!index_count) return; + +- context = context_acquire(device, wined3d_rendertarget_view_get_surface(device->fb.render_targets[0])); ++ context = context_acquire(device, wined3d_rendertarget_view_get_surface(state->fb.render_targets[0])); + if (!context->valid) + { + context_release(context); +@@ -622,7 +622,7 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co + /* Invalidate the back buffer memory so LockRect will read it the next time */ + for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i) + { +- struct wined3d_surface *target = wined3d_rendertarget_view_get_surface(device->fb.render_targets[i]); ++ struct wined3d_surface *target = wined3d_rendertarget_view_get_surface(state->fb.render_targets[i]); + if (target) + { + wined3d_resource_load_location(&target->resource, context, target->container->resource.draw_binding); +@@ -631,18 +631,18 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co + } + } + +- if (device->fb.depth_stencil) ++ if (state->fb.depth_stencil) + { + /* Note that this depends on the context_acquire() call above to set + * context->render_offscreen properly. We don't currently take the + * Z-compare function into account, but we could skip loading the + * depthstencil for D3DCMP_NEVER and D3DCMP_ALWAYS as well. Also note + * that we never copy the stencil data.*/ +- DWORD location = context->render_offscreen ? device->fb.depth_stencil->resource->draw_binding ++ DWORD location = context->render_offscreen ? state->fb.depth_stencil->resource->draw_binding + : WINED3D_LOCATION_DRAWABLE; + if (state->render_states[WINED3D_RS_ZWRITEENABLE] || state->render_states[WINED3D_RS_ZENABLE]) + { +- struct wined3d_surface *ds = wined3d_rendertarget_view_get_surface(device->fb.depth_stencil); ++ struct wined3d_surface *ds = wined3d_rendertarget_view_get_surface(state->fb.depth_stencil); + RECT current_rect, draw_rect, r; + + if (!context->render_offscreen && ds != device->onscreen_depth_stencil) +@@ -668,9 +668,9 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co + return; + } + +- if (device->fb.depth_stencil && state->render_states[WINED3D_RS_ZWRITEENABLE]) ++ if (state->fb.depth_stencil && state->render_states[WINED3D_RS_ZWRITEENABLE]) + { +- struct wined3d_surface *ds = wined3d_rendertarget_view_get_surface(device->fb.depth_stencil); ++ struct wined3d_surface *ds = wined3d_rendertarget_view_get_surface(state->fb.depth_stencil); + DWORD location = context->render_offscreen ? ds->container->resource.draw_binding : WINED3D_LOCATION_DRAWABLE; + + surface_modify_ds_location(ds, location, ds->ds_current_size.cx, ds->ds_current_size.cy); +diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c +index 0ab591f..4ef473b 100644 +--- a/dlls/wined3d/glsl_shader.c ++++ b/dlls/wined3d/glsl_shader.c +@@ -957,7 +957,7 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont + const struct wined3d_state *state = &shader->device->state; + const struct ps_compile_args *ps_args = ctx_priv->cur_ps_args; + const struct wined3d_gl_info *gl_info = context->gl_info; +- const struct wined3d_fb_state *fb = &shader->device->fb; ++ const struct wined3d_fb_state *fb = &state->fb; + unsigned int i, extra_constants_needed = 0; + const struct wined3d_shader_lconst *lconst; + const char *prefix; +diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c +index 6531803..cc969b8 100644 +--- a/dlls/wined3d/shader.c ++++ b/dlls/wined3d/shader.c +@@ -2184,7 +2184,7 @@ void find_ps_compile_args(const struct wined3d_state *state, const struct wined3 + memset(args, 0, sizeof(*args)); /* FIXME: Make sure all bits are set. */ + if (!gl_info->supported[ARB_FRAMEBUFFER_SRGB] && state->render_states[WINED3D_RS_SRGBWRITEENABLE]) + { +- const struct wined3d_format *rt_format = state->fb->render_targets[0]->format; ++ const struct wined3d_format *rt_format = state->fb.render_targets[0]->format; + if (rt_format->flags & WINED3DFMT_FLAG_SRGB_WRITE) + { + static unsigned int warned = 0; +diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c +index 700db84..20f00d6 100644 +--- a/dlls/wined3d/state.c ++++ b/dlls/wined3d/state.c +@@ -106,7 +106,7 @@ static void state_zenable(struct wined3d_context *context, const struct wined3d_ + static UINT once; + + /* No z test without depth stencil buffers */ +- if (!state->fb->depth_stencil) ++ if (!state->fb.depth_stencil) + { + TRACE("No Z buffer - disabling depth test\n"); + zenable = WINED3D_ZB_FALSE; +@@ -381,7 +381,7 @@ static GLenum gl_blend_factor(enum wined3d_blend factor, const struct wined3d_fo + + static void state_blend(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { +- const struct wined3d_format *rt_format = state->fb->render_targets[0]->format; ++ const struct wined3d_format *rt_format = state->fb.render_targets[0]->format; + const struct wined3d_gl_info *gl_info = context->gl_info; + GLenum srcBlend, dstBlend; + enum wined3d_blend d3d_blend; +@@ -826,7 +826,7 @@ static void state_stencil(struct wined3d_context *context, const struct wined3d_ + GLint depthFail_ccw; + + /* No stencil test without a stencil buffer. */ +- if (!state->fb->depth_stencil) ++ if (!state->fb.depth_stencil) + { + gl_info->gl_ops.gl.p_glDisable(GL_STENCIL_TEST); + checkGLcall("glDisable GL_STENCIL_TEST"); +@@ -912,7 +912,7 @@ static void state_stencil(struct wined3d_context *context, const struct wined3d_ + + static void state_stencilwrite2s(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { +- DWORD mask = state->fb->depth_stencil ? state->render_states[WINED3D_RS_STENCILWRITEMASK] : 0; ++ DWORD mask = state->fb.depth_stencil ? state->render_states[WINED3D_RS_STENCILWRITEMASK] : 0; + const struct wined3d_gl_info *gl_info = context->gl_info; + + GL_EXTCALL(glActiveStencilFaceEXT(GL_BACK)); +@@ -926,7 +926,7 @@ static void state_stencilwrite2s(struct wined3d_context *context, const struct w + + static void state_stencilwrite(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { +- DWORD mask = state->fb->depth_stencil ? state->render_states[WINED3D_RS_STENCILWRITEMASK] : 0; ++ DWORD mask = state->fb.depth_stencil ? state->render_states[WINED3D_RS_STENCILWRITEMASK] : 0; + const struct wined3d_gl_info *gl_info = context->gl_info; + + gl_info->gl_ops.gl.p_glStencilMask(mask); +@@ -1765,7 +1765,7 @@ static void state_depthbias(struct wined3d_context *context, const struct wined3 + if (state->render_states[WINED3D_RS_SLOPESCALEDEPTHBIAS] + || state->render_states[WINED3D_RS_DEPTHBIAS]) + { +- const struct wined3d_rendertarget_view *depth = state->fb->depth_stencil; ++ const struct wined3d_rendertarget_view *depth = state->fb.depth_stencil; + float scale; + + union +@@ -4653,7 +4653,7 @@ void vertexdeclaration(struct wined3d_context *context, const struct wined3d_sta + + static void viewport_miscpart(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { +- const struct wined3d_rendertarget_view *target = state->fb->render_targets[0]; ++ const struct wined3d_rendertarget_view *target = state->fb.render_targets[0]; + const struct wined3d_gl_info *gl_info = context->gl_info; + struct wined3d_viewport vp = state->viewport; + +@@ -4833,7 +4833,7 @@ static void scissorrect(struct wined3d_context *context, const struct wined3d_st + } + else + { +- const struct wined3d_rendertarget_view *target = state->fb->render_targets[0]; ++ const struct wined3d_rendertarget_view *target = state->fb.render_targets[0]; + UINT height; + UINT width; + +@@ -4900,7 +4900,7 @@ static void psorigin(struct wined3d_context *context, const struct wined3d_state + + void state_srgbwrite(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { +- const struct wined3d_format *rt_format = state->fb->render_targets[0]->format; ++ const struct wined3d_format *rt_format = state->fb.render_targets[0]->format; + const struct wined3d_gl_info *gl_info = context->gl_info; + + TRACE("context %p, state %p, state_id %#x.\n", context, state, state_id); +diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c +index dc146fc..141e539 100644 +--- a/dlls/wined3d/stateblock.c ++++ b/dlls/wined3d/stateblock.c +@@ -464,6 +464,7 @@ void state_unbind_resources(struct wined3d_state *state) + struct wined3d_texture *texture; + struct wined3d_buffer *buffer; + struct wined3d_shader *shader; ++ struct wined3d_rendertarget_view *view; + unsigned int i, j; + + if ((decl = state->vertex_declaration)) +@@ -540,6 +541,31 @@ void state_unbind_resources(struct wined3d_state *state) + } + } + } ++ ++ if (state->fb.depth_stencil) ++ { ++ view = state->fb.depth_stencil; ++ ++ TRACE("Releasing depth/stencil buffer %p.\n", view); ++ ++ state->fb.depth_stencil = NULL; ++ wined3d_rendertarget_view_decref(view); ++ } ++ ++ if (state->fb.render_targets) ++ { ++ for (i = 0; i < state->fb.rt_size; i++) ++ { ++ view = state->fb.render_targets[i]; ++ TRACE("Setting rendertarget %u to NULL\n", i); ++ state->fb.render_targets[i] = NULL; ++ if (view) ++ { ++ TRACE("Releasing the rendertarget view at %p\n", view); ++ wined3d_rendertarget_view_decref(view); ++ } ++ } ++ } + } + + void state_cleanup(struct wined3d_state *state) +@@ -567,6 +593,7 @@ void state_cleanup(struct wined3d_state *state) + + HeapFree(GetProcessHeap(), 0, state->vs_consts_f); + HeapFree(GetProcessHeap(), 0, state->ps_consts_f); ++ HeapFree(GetProcessHeap(), 0, state->fb.render_targets); + } + + ULONG CDECL wined3d_stateblock_decref(struct wined3d_stateblock *stateblock) +@@ -1315,14 +1342,12 @@ static void state_init_default(struct wined3d_state *state, const struct wined3d + } + } + +-HRESULT state_init(struct wined3d_state *state, struct wined3d_fb_state *fb, +- const struct wined3d_gl_info *gl_info, const struct wined3d_d3d_info *d3d_info, +- DWORD flags) ++HRESULT state_init(struct wined3d_state *state, const struct wined3d_gl_info *gl_info, ++ const struct wined3d_d3d_info *d3d_info, DWORD flags) + { + unsigned int i; + + state->flags = flags; +- state->fb = fb; + + for (i = 0; i < LIGHTMAP_SIZE; i++) + { +@@ -1340,6 +1365,15 @@ HRESULT state_init(struct wined3d_state *state, struct wined3d_fb_state *fb, + return E_OUTOFMEMORY; + } + ++ if (!(state->fb.render_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ++ sizeof(*state->fb.render_targets) * gl_info->limits.buffers))) ++ { ++ HeapFree(GetProcessHeap(), 0, state->ps_consts_f); ++ HeapFree(GetProcessHeap(), 0, state->vs_consts_f); ++ return E_OUTOFMEMORY; ++ } ++ state->fb.rt_size = gl_info->limits.buffers; ++ + if (flags & WINED3D_STATE_INIT_DEFAULT) + state_init_default(state, gl_info); + +@@ -1350,12 +1384,13 @@ static HRESULT stateblock_init(struct wined3d_stateblock *stateblock, + struct wined3d_device *device, enum wined3d_stateblock_type type) + { + HRESULT hr; ++ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + const struct wined3d_d3d_info *d3d_info = &device->adapter->d3d_info; + + stateblock->ref = 1; + stateblock->device = device; + +- if (FAILED(hr = state_init(&stateblock->state, NULL, &device->adapter->gl_info, d3d_info, 0))) ++ if (FAILED(hr = state_init(&stateblock->state, gl_info, d3d_info, 0))) + return hr; + + if (FAILED(hr = stateblock_allocate_shader_constants(stateblock))) +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 3702866..642210d 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -3332,9 +3332,9 @@ static HRESULT surface_blt_special(struct wined3d_surface *dst_surface, const RE + enum wined3d_texture_filter_type filter) + { + struct wined3d_device *device = dst_surface->resource.device; +- const struct wined3d_surface *rt = wined3d_rendertarget_view_get_surface(device->fb.render_targets[0]); + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + struct wined3d_swapchain *src_swapchain, *dst_swapchain; ++ const struct wined3d_surface *rt = wined3d_rendertarget_view_get_surface(device->state.fb.render_targets[0]); + + TRACE("dst_surface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, blt_fx %p, filter %s.\n", + dst_surface, wine_dbgstr_rect(dst_rect), src_surface, wine_dbgstr_rect(src_rect), +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index dd7d2c7..ed2964e 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -421,7 +421,7 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + { + struct wined3d_surface *back_buffer = surface_from_resource( + wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)); +- const struct wined3d_fb_state *fb = &swapchain->device->fb; ++ const struct wined3d_fb_state *fb = &swapchain->device->state.fb; + const struct wined3d_gl_info *gl_info; + struct wined3d_context *context; + struct wined3d_surface *front; +diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c +index 6ce07b8..8ff4e3e 100644 +--- a/dlls/wined3d/utils.c ++++ b/dlls/wined3d/utils.c +@@ -3428,7 +3428,7 @@ void gen_ffp_frag_op(const struct wined3d_context *context, const struct wined3d + unsigned int i; + DWORD ttff; + DWORD cop, aop, carg0, carg1, carg2, aarg0, aarg1, aarg2; +- const struct wined3d_format *rt_format = state->fb->render_targets[0]->format; ++ const struct wined3d_format *rt_format = state->fb.render_targets[0]->format; + const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_d3d_info *d3d_info = context->d3d_info; + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 43e1c21..7339ae5 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -1088,6 +1088,36 @@ struct wined3d_timestamp_query + void context_alloc_timestamp_query(struct wined3d_context *context, struct wined3d_timestamp_query *query) DECLSPEC_HIDDEN; + void context_free_timestamp_query(struct wined3d_timestamp_query *query) DECLSPEC_HIDDEN; + ++struct wined3d_fb_state ++{ ++ struct wined3d_rendertarget_view **render_targets; ++ struct wined3d_rendertarget_view *depth_stencil; ++ UINT rt_size; ++}; ++ ++static inline BOOL wined3d_fb_equal(const struct wined3d_fb_state *fb1, const struct wined3d_fb_state *fb2) ++{ ++ UINT i; ++ ++ if (fb1->depth_stencil != fb2->depth_stencil) ++ return FALSE; ++ if (fb1->rt_size != fb2->rt_size) ++ return FALSE; ++ for (i = 0; i < fb1->rt_size; i++) ++ if (fb1->render_targets[i] != fb2->render_targets[i]) ++ return FALSE; ++ return TRUE; ++} ++ ++static inline void wined3d_fb_copy(struct wined3d_fb_state *dst, const struct wined3d_fb_state *src) ++{ ++ UINT i; ++ ++ dst->depth_stencil = src->depth_stencil; ++ for (i = 0; i < min(dst->rt_size, src->rt_size); i++) ++ dst->render_targets[i] = src->render_targets[i]; ++} ++ + struct wined3d_context + { + const struct wined3d_gl_info *gl_info; +@@ -1102,6 +1132,7 @@ struct wined3d_context + DWORD dirtyArray[STATE_HIGHEST + 1]; /* Won't get bigger than that, a state is never marked dirty 2 times */ + DWORD numDirtyEntries; + DWORD isStateDirty[STATE_HIGHEST / (sizeof(DWORD) * CHAR_BIT) + 1]; /* Bitmap to find out quickly if a state is dirty */ ++ struct wined3d_fb_state current_fb; + + struct wined3d_swapchain *swapchain; + struct wined3d_surface *current_rt; +@@ -1201,12 +1232,6 @@ struct wined3d_context + GLuint dummy_arbfp_prog; + }; + +-struct wined3d_fb_state +-{ +- struct wined3d_rendertarget_view **render_targets; +- struct wined3d_rendertarget_view *depth_stencil; +-}; +- + typedef void (*APPLYSTATEFUNC)(struct wined3d_context *ctx, const struct wined3d_state *state, DWORD state_id); + + struct StateEntry +@@ -1881,7 +1906,7 @@ struct wined3d_stream_state + struct wined3d_state + { + DWORD flags; +- const struct wined3d_fb_state *fb; ++ struct wined3d_fb_state fb; + + struct wined3d_vertex_declaration *vertex_declaration; + struct wined3d_stream_output stream_output[MAX_STREAM_OUT]; +@@ -1986,7 +2011,6 @@ struct wined3d_device + struct list shaders; /* a linked list to track shaders (pixel and vertex) */ + + /* Render Target Support */ +- struct wined3d_fb_state fb; + struct wined3d_surface *onscreen_depth_stencil; + struct wined3d_rendertarget_view *auto_depth_stencil_view; + +@@ -2497,9 +2521,8 @@ struct wined3d_stateblock + void stateblock_init_contained_states(struct wined3d_stateblock *stateblock) DECLSPEC_HIDDEN; + + void state_cleanup(struct wined3d_state *state) DECLSPEC_HIDDEN; +-HRESULT state_init(struct wined3d_state *state, struct wined3d_fb_state *fb, +- const struct wined3d_gl_info *gl_info, const struct wined3d_d3d_info *d3d_info, +- DWORD flags) DECLSPEC_HIDDEN; ++HRESULT state_init(struct wined3d_state *state, const struct wined3d_gl_info *gl_info, ++ const struct wined3d_d3d_info *d3d_info, DWORD flags) DECLSPEC_HIDDEN; + void state_unbind_resources(struct wined3d_state *state) DECLSPEC_HIDDEN; + + struct wined3d_cs_ops +@@ -2512,7 +2535,6 @@ struct wined3d_cs + { + const struct wined3d_cs_ops *ops; + struct wined3d_device *device; +- struct wined3d_fb_state fb; + struct wined3d_state state; + + size_t data_size; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0044-wined3d-Get-rid-of-state-access-in-shader_generate_g.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0044-wined3d-Get-rid-of-state-access-in-shader_generate_g.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0044-wined3d-Get-rid-of-state-access-in-shader_generate_g.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0044-wined3d-Get-rid-of-state-access-in-shader_generate_g.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,63 @@ +From 25c76a39621543e2650531aef15d131d04927f3b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 20 Dec 2012 14:19:52 +0100 +Subject: wined3d: Get rid of state access in shader_generate_glsl_declarations + +--- + dlls/wined3d/glsl_shader.c | 21 ++++++--------------- + 1 file changed, 6 insertions(+), 15 deletions(-) + +diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c +index 4ef473b..3b049e6 100644 +--- a/dlls/wined3d/glsl_shader.c ++++ b/dlls/wined3d/glsl_shader.c +@@ -954,10 +954,8 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont + const struct wined3d_shader_reg_maps *reg_maps, const struct shader_glsl_ctx_priv *ctx_priv) + { + const struct wined3d_shader_version *version = ®_maps->shader_version; +- const struct wined3d_state *state = &shader->device->state; + const struct ps_compile_args *ps_args = ctx_priv->cur_ps_args; + const struct wined3d_gl_info *gl_info = context->gl_info; +- const struct wined3d_fb_state *fb = &state->fb; + unsigned int i, extra_constants_needed = 0; + const struct wined3d_shader_lconst *lconst; + const char *prefix; +@@ -1186,7 +1184,7 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont + { + UINT in_count = min(vec4_varyings(version->major, gl_info), shader->limits->packed_input); + +- if (use_vs(state)) ++ if (ps_args->vp_mode == vertexshader) + shader_addline(buffer, "varying vec4 %s_in[%u];\n", prefix, in_count); + else + /* TODO: Write a replacement shader for the fixed function +@@ -1233,21 +1231,14 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont + } + else + { +- float ycorrection[] = +- { +- context->render_offscreen ? 0.0f : fb->render_targets[0]->height, +- context->render_offscreen ? 1.0f : -1.0f, +- 0.0f, +- 0.0f, +- }; +- + /* This happens because we do not have proper tracking of the + * constant registers that are actually used, only the max +- * limit of the shader version. */ ++ * limit of the shader version. ++ * ++ * FIXME 2: This is wrong, there's no need to do this. Get rid of ++ * it and just create the uniform. ++ */ + FIXME("Cannot find a free uniform for vpos correction params\n"); +- shader_addline(buffer, "const vec4 ycorrection = "); +- shader_glsl_append_imm_vec4(buffer, ycorrection); +- shader_addline(buffer, ";\n"); + } + shader_addline(buffer, "vec4 vpos;\n"); + } +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0045-wined3d-Preload-buffers-if-streamsrc-is-not-dirty.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0045-wined3d-Preload-buffers-if-streamsrc-is-not-dirty.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0045-wined3d-Preload-buffers-if-streamsrc-is-not-dirty.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0045-wined3d-Preload-buffers-if-streamsrc-is-not-dirty.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,65 @@ +From b3e18543b31f43d2f72e4271c37f65c47e3f674f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 7 Jul 2013 12:06:31 +0200 +Subject: wined3d: Preload buffers if streamsrc is not dirty + +FIXME: Merge this with the preload calls done by +context_update_stream_info, preload only used buffers + +FIXME2: Merge this patch with the patch that removes +PreLoad from buffer_unmap + +FIXME3: There may be more unintended consequences of calling preload +here... +--- + dlls/wined3d/buffer.c | 2 +- + dlls/wined3d/context.c | 6 +++++- + dlls/wined3d/wined3d_private.h | 1 - + 3 files changed, 6 insertions(+), 3 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index 2e44f0f..f335dfc 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -711,7 +711,7 @@ static void buffer_direct_upload(struct wined3d_buffer *This, const struct wined + checkGLcall("glUnmapBufferARB"); + } + +-void buffer_mark_used(struct wined3d_buffer *buffer) ++static void buffer_mark_used(struct wined3d_buffer *buffer) + { + buffer->flags &= ~(WINED3D_BUFFER_SYNC | WINED3D_BUFFER_DISCARD); + } +diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c +index 679e728..ffb1c43 100644 +--- a/dlls/wined3d/context.c ++++ b/dlls/wined3d/context.c +@@ -2999,8 +2999,12 @@ BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_de + for (i = 0, map = context->stream_info.use_map; map; map >>= 1, ++i) + { + if (map & 1) +- buffer_mark_used(state->streams[context->stream_info.elements[i].stream_idx].buffer); ++ buffer_internal_preload(state->streams[context->stream_info.elements[i].stream_idx].buffer, ++ context, state); + } ++ /* PreLoad may kick buffers out of vram. */ ++ if (isStateDirty(context, STATE_STREAMSRC)) ++ context_update_stream_info(context, state); + } + if (state->index_buffer) + { +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 7339ae5..9c05b6c 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2669,7 +2669,6 @@ void buffer_get_memory(struct wined3d_buffer *buffer, struct wined3d_context *co + BYTE *buffer_get_sysmem(struct wined3d_buffer *This, struct wined3d_context *context) DECLSPEC_HIDDEN; + void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_context *context, + const struct wined3d_state *state) DECLSPEC_HIDDEN; +-void buffer_mark_used(struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; + + struct wined3d_rendertarget_view + { +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0046-wined3d-Hackily-introduce-a-multithreaded-command-st.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0046-wined3d-Hackily-introduce-a-multithreaded-command-st.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0046-wined3d-Hackily-introduce-a-multithreaded-command-st.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0046-wined3d-Hackily-introduce-a-multithreaded-command-st.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,867 @@ +From 5b81c252f4f8dbb4073e28b5a6d0c181b74facdc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 1 Oct 2013 14:31:56 +0200 +Subject: wined3d: Hackily introduce a multithreaded command stream + +--- + dlls/wined3d/cs.c | 376 ++++++++++++++++++++++++++++++++++++----- + dlls/wined3d/wined3d_main.c | 9 + + dlls/wined3d/wined3d_private.h | 18 ++ + 3 files changed, 365 insertions(+), 38 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 7bebe80..1122073 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -24,8 +24,19 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); + + #define WINED3D_INITIAL_CS_SIZE 4096 + ++static CRITICAL_SECTION wined3d_cs_list_mutex; ++static CRITICAL_SECTION_DEBUG wined3d_cs_list_mutex_debug = ++{ ++ 0, 0, &wined3d_cs_list_mutex, ++ {&wined3d_cs_list_mutex_debug.ProcessLocksList, ++ &wined3d_cs_list_mutex_debug.ProcessLocksList}, ++ 0, 0, {(DWORD_PTR)(__FILE__ ": wined3d_cs_list_mutex")} ++}; ++static CRITICAL_SECTION wined3d_cs_list_mutex = {&wined3d_cs_list_mutex_debug, -1, 0, 0, 0, 0}; ++ + enum wined3d_cs_op + { ++ WINED3D_CS_OP_FENCE, + WINED3D_CS_OP_PRESENT, + WINED3D_CS_OP_CLEAR, + WINED3D_CS_OP_DRAW, +@@ -51,6 +62,18 @@ enum wined3d_cs_op + WINED3D_CS_OP_SET_CLIP_PLANE, + WINED3D_CS_OP_SET_MATERIAL, + WINED3D_CS_OP_RESET_STATE, ++ WINED3D_CS_OP_STOP, ++}; ++ ++struct wined3d_cs_stop ++{ ++ enum wined3d_cs_op opcode; ++}; ++ ++struct wined3d_cs_fence ++{ ++ enum wined3d_cs_op opcode; ++ BOOL *signalled; + }; + + struct wined3d_cs_present +@@ -101,7 +124,7 @@ struct wined3d_cs_set_viewport + struct wined3d_cs_set_scissor_rect + { + enum wined3d_cs_op opcode; +- const RECT *rect; ++ RECT rect; + }; + + struct wined3d_cs_set_rendertarget_view +@@ -220,20 +243,20 @@ struct wined3d_cs_set_transform + { + enum wined3d_cs_op opcode; + enum wined3d_transform_state state; +- const struct wined3d_matrix *matrix; ++ struct wined3d_matrix matrix; + }; + + struct wined3d_cs_set_clip_plane + { + enum wined3d_cs_op opcode; + UINT plane_idx; +- const struct wined3d_vec4 *plane; ++ struct wined3d_vec4 plane; + }; + + struct wined3d_cs_set_material + { + enum wined3d_cs_op opcode; +- const struct wined3d_material *material; ++ struct wined3d_material material; + }; + + struct wined3d_cs_reset_state +@@ -241,7 +264,134 @@ struct wined3d_cs_reset_state + enum wined3d_cs_op opcode; + }; + +-static void wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data) ++/* FIXME: The list synchronization probably isn't particularly fast. */ ++static void wined3d_cs_list_enqueue(struct wined3d_cs_list *list, struct wined3d_cs_block *block) ++{ ++ EnterCriticalSection(&wined3d_cs_list_mutex); ++ list_add_tail(&list->blocks, &block->entry); ++ LeaveCriticalSection(&wined3d_cs_list_mutex); ++} ++ ++static struct wined3d_cs_block *wined3d_cs_list_dequeue(struct wined3d_cs_list *list) ++{ ++ struct list *head; ++ ++ EnterCriticalSection(&wined3d_cs_list_mutex); ++ if (!(head = list_head(&list->blocks))) ++ { ++ LeaveCriticalSection(&wined3d_cs_list_mutex); ++ return NULL; ++ } ++ list_remove(head); ++ LeaveCriticalSection(&wined3d_cs_list_mutex); ++ ++ return LIST_ENTRY(head, struct wined3d_cs_block, entry); ++} ++ ++static struct wined3d_cs_block *wined3d_cs_list_dequeue_blocking(struct wined3d_cs_list *list) ++{ ++ struct wined3d_cs_block *block; ++ ++ /* FIXME: Use an event to wait after a couple of spins. */ ++ for (;;) ++ { ++ if ((block = wined3d_cs_list_dequeue(list))) ++ return block; ++ } ++} ++ ++static void wined3d_cs_list_init(struct wined3d_cs_list *list) ++{ ++ list_init(&list->blocks); ++} ++ ++static struct wined3d_cs_block *wined3d_cs_get_thread_block(const struct wined3d_cs *cs) ++{ ++ return TlsGetValue(cs->tls_idx); ++} ++ ++static void wined3d_cs_set_thread_block(const struct wined3d_cs *cs, struct wined3d_cs_block *block) ++{ ++ if (!TlsSetValue(cs->tls_idx, block)) ++ ERR("Failed to set thread block.\n"); ++} ++ ++static void wined3d_cs_flush(struct wined3d_cs *cs) ++{ ++ wined3d_cs_list_enqueue(&cs->exec_list, wined3d_cs_get_thread_block(cs)); ++ wined3d_cs_set_thread_block(cs, NULL); ++} ++ ++static struct wined3d_cs_block *wined3d_cs_get_block(struct wined3d_cs *cs) ++{ ++ struct wined3d_cs_block *block; ++ ++ if (!(block = wined3d_cs_list_dequeue(&cs->free_list))) ++ { ++ if (!(block = HeapAlloc(GetProcessHeap(), 0, sizeof(*block)))) ++ { ++ ERR("Failed to get new block.\n"); ++ return NULL; ++ } ++ } ++ ++ block->pos = 0; ++ ++ return block; ++} ++ ++static void *wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size) ++{ ++ struct wined3d_cs_block *block = wined3d_cs_get_thread_block(cs); ++ void *data; ++ ++ if (!block || block->pos + size > sizeof(block->data)) ++ { ++ if (block) ++ wined3d_cs_flush(cs); ++ block = wined3d_cs_get_block(cs); ++ wined3d_cs_set_thread_block(cs, block); ++ } ++ ++ data = &block->data[block->pos]; ++ block->pos += size; ++ ++ return data; ++} ++ ++static UINT wined3d_cs_exec_fence(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_fence *op = data; ++ ++ InterlockedExchange(op->signalled, TRUE); ++ ++ return sizeof(*op); ++} ++ ++static void wined3d_cs_emit_fence(struct wined3d_cs *cs, BOOL *signalled) ++{ ++ struct wined3d_cs_fence *op; ++ ++ *signalled = FALSE; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_FENCE; ++ op->signalled = signalled; ++} ++ ++static void wined3d_cs_flush_and_wait(struct wined3d_cs *cs) ++{ ++ BOOL fence; ++ ++ wined3d_cs_emit_fence(cs, &fence); ++ wined3d_cs_flush(cs); ++ ++ /* A busy wait should be fine, we're not supposed to have to wait very ++ * long. */ ++ while (!InterlockedCompareExchange(&fence, TRUE, TRUE)); ++} ++ ++static UINT wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_present *op = data; + struct wined3d_swapchain *swapchain; +@@ -251,6 +401,8 @@ static void wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data) + + swapchain->swapchain_ops->swapchain_present(swapchain, + op->src_rect, op->dst_rect, op->dirty_region, op->flags); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *swapchain, +@@ -271,7 +423,7 @@ void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *sw + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_clear(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_clear(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_clear *op = data; + struct wined3d_device *device; +@@ -282,6 +434,8 @@ static void wined3d_cs_exec_clear(struct wined3d_cs *cs, const void *data) + device_clear_render_targets(device, device->adapter->gl_info.limits.buffers, + &cs->state.fb, op->rect_count, op->rects, &draw_rect, op->flags, + op->color, op->depth, op->stencil); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *rects, +@@ -301,12 +455,14 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT * + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_draw *op = data; + + draw_primitive(cs->device, op->start_idx, op->index_count, + op->start_instance, op->instance_count, op->indexed); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_draw(struct wined3d_cs *cs, UINT start_idx, UINT index_count, +@@ -325,12 +481,14 @@ void wined3d_cs_emit_draw(struct wined3d_cs *cs, UINT start_idx, UINT index_coun + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_predication(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_predication(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_predication *op = data; + + cs->state.predicate = op->predicate; + cs->state.predicate_value = op->value; ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_predication(struct wined3d_cs *cs, struct wined3d_query *predicate, BOOL value) +@@ -345,12 +503,14 @@ void wined3d_cs_emit_set_predication(struct wined3d_cs *cs, struct wined3d_query + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_viewport(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_viewport(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_viewport *op = data; + + cs->state.viewport = *op->viewport; + device_invalidate_state(cs->device, STATE_VIEWPORT); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_viewport(struct wined3d_cs *cs, const struct wined3d_viewport *viewport) +@@ -364,12 +524,14 @@ void wined3d_cs_emit_set_viewport(struct wined3d_cs *cs, const struct wined3d_vi + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_scissor_rect(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_scissor_rect(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_scissor_rect *op = data; + +- cs->state.scissor_rect = *op->rect; ++ cs->state.scissor_rect = op->rect; + device_invalidate_state(cs->device, STATE_SCISSORRECT); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_scissor_rect(struct wined3d_cs *cs, const RECT *rect) +@@ -378,17 +540,19 @@ void wined3d_cs_emit_set_scissor_rect(struct wined3d_cs *cs, const RECT *rect) + + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_SET_SCISSOR_RECT; +- op->rect = rect; ++ op->rect = *rect; + + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_rendertarget_view(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_rendertarget_view(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_rendertarget_view *op = data; + + cs->state.fb.render_targets[op->view_idx] = op->view; + device_invalidate_state(cs->device, STATE_FRAMEBUFFER); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_rendertarget_view(struct wined3d_cs *cs, unsigned int view_idx, +@@ -404,7 +568,7 @@ void wined3d_cs_emit_set_rendertarget_view(struct wined3d_cs *cs, unsigned int v + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_depth_stencil_view *op = data; + struct wined3d_device *device = cs->device; +@@ -442,6 +606,8 @@ static void wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const + } + + device_invalidate_state(device, STATE_FRAMEBUFFER); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_depth_stencil_view(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view) +@@ -455,12 +621,14 @@ void wined3d_cs_emit_set_depth_stencil_view(struct wined3d_cs *cs, struct wined3 + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_vertex_declaration(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_vertex_declaration(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_vertex_declaration *op = data; + + cs->state.vertex_declaration = op->declaration; + device_invalidate_state(cs->device, STATE_VDECL); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_vertex_declaration(struct wined3d_cs *cs, struct wined3d_vertex_declaration *declaration) +@@ -474,7 +642,7 @@ void wined3d_cs_emit_set_vertex_declaration(struct wined3d_cs *cs, struct wined3 + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_stream_source(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_stream_source(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_stream_source *op = data; + struct wined3d_stream_state *stream; +@@ -492,6 +660,8 @@ static void wined3d_cs_exec_set_stream_source(struct wined3d_cs *cs, const void + InterlockedDecrement(&prev->resource.bind_count); + + device_invalidate_state(cs->device, STATE_STREAMSRC); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_stream_source(struct wined3d_cs *cs, UINT stream_idx, +@@ -509,7 +679,7 @@ void wined3d_cs_emit_set_stream_source(struct wined3d_cs *cs, UINT stream_idx, + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_stream_source_freq(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_stream_source_freq(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_stream_source_freq *op = data; + struct wined3d_stream_state *stream; +@@ -519,6 +689,8 @@ static void wined3d_cs_exec_set_stream_source_freq(struct wined3d_cs *cs, const + stream->flags = op->flags; + + device_invalidate_state(cs->device, STATE_STREAMSRC); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_stream_source_freq(struct wined3d_cs *cs, UINT stream_idx, UINT frequency, UINT flags) +@@ -534,7 +706,7 @@ void wined3d_cs_emit_set_stream_source_freq(struct wined3d_cs *cs, UINT stream_i + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_stream_output(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_stream_output(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_stream_output *op = data; + struct wined3d_stream_output *stream; +@@ -549,6 +721,8 @@ static void wined3d_cs_exec_set_stream_output(struct wined3d_cs *cs, const void + InterlockedIncrement(&op->buffer->resource.bind_count); + if (prev) + InterlockedDecrement(&prev->resource.bind_count); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_stream_output(struct wined3d_cs *cs, UINT stream_idx, +@@ -565,7 +739,7 @@ void wined3d_cs_emit_set_stream_output(struct wined3d_cs *cs, UINT stream_idx, + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_index_buffer(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_index_buffer(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_index_buffer *op = data; + struct wined3d_buffer *prev; +@@ -580,6 +754,8 @@ static void wined3d_cs_exec_set_index_buffer(struct wined3d_cs *cs, const void * + InterlockedDecrement(&prev->resource.bind_count); + + device_invalidate_state(cs->device, STATE_INDEXBUFFER); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_index_buffer(struct wined3d_cs *cs, struct wined3d_buffer *buffer, +@@ -595,7 +771,7 @@ void wined3d_cs_emit_set_index_buffer(struct wined3d_cs *cs, struct wined3d_buff + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_constant_buffer(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_constant_buffer(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_constant_buffer *op = data; + struct wined3d_buffer *prev; +@@ -609,6 +785,7 @@ static void wined3d_cs_exec_set_constant_buffer(struct wined3d_cs *cs, const voi + InterlockedDecrement(&prev->resource.bind_count); + + device_invalidate_state(cs->device, STATE_CONSTANT_BUFFER(op->type)); ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_constant_buffer(struct wined3d_cs *cs, enum wined3d_shader_type type, +@@ -625,7 +802,7 @@ void wined3d_cs_emit_set_constant_buffer(struct wined3d_cs *cs, enum wined3d_sha + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_texture(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_texture(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_d3d_info *d3d_info = &cs->device->adapter->d3d_info; + const struct wined3d_cs_set_texture *op = data; +@@ -685,6 +862,8 @@ static void wined3d_cs_exec_set_texture(struct wined3d_cs *cs, const void *data) + } + + device_invalidate_state(cs->device, STATE_SAMPLER(op->stage)); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_texture(struct wined3d_cs *cs, UINT stage, struct wined3d_texture *texture) +@@ -699,11 +878,13 @@ void wined3d_cs_emit_set_texture(struct wined3d_cs *cs, UINT stage, struct wined + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_shader_resource_view(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_shader_resource_view(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_shader_resource_view *op = data; + + cs->state.shader_resource_view[op->type][op->view_idx] = op->view; ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_shader_resource_view(struct wined3d_cs *cs, enum wined3d_shader_type type, +@@ -720,11 +901,13 @@ void wined3d_cs_emit_set_shader_resource_view(struct wined3d_cs *cs, enum wined3 + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_sampler(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_sampler(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_sampler *op = data; + + cs->state.sampler[op->type][op->sampler_idx] = op->sampler; ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_sampler(struct wined3d_cs *cs, enum wined3d_shader_type type, +@@ -741,12 +924,14 @@ void wined3d_cs_emit_set_sampler(struct wined3d_cs *cs, enum wined3d_shader_type + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_shader(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_shader(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_shader *op = data; + + cs->state.shader[op->type] = op->shader; + device_invalidate_state(cs->device, STATE_SHADER(op->type)); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_shader(struct wined3d_cs *cs, enum wined3d_shader_type type, struct wined3d_shader *shader) +@@ -761,12 +946,14 @@ void wined3d_cs_emit_set_shader(struct wined3d_cs *cs, enum wined3d_shader_type + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_render_state(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_render_state(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_render_state *op = data; + + cs->state.render_states[op->state] = op->value; + device_invalidate_state(cs->device, STATE_RENDER(op->state)); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_render_state(struct wined3d_cs *cs, enum wined3d_render_state state, DWORD value) +@@ -781,12 +968,14 @@ void wined3d_cs_emit_set_render_state(struct wined3d_cs *cs, enum wined3d_render + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_texture_state(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_texture_state(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_texture_state *op = data; + + cs->state.texture_states[op->stage][op->state] = op->value; + device_invalidate_state(cs->device, STATE_TEXTURESTAGE(op->stage, op->state)); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_texture_state(struct wined3d_cs *cs, UINT stage, +@@ -803,12 +992,14 @@ void wined3d_cs_emit_set_texture_state(struct wined3d_cs *cs, UINT stage, + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_sampler_state(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_sampler_state(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_sampler_state *op = data; + + cs->state.sampler_states[op->sampler_idx][op->state] = op->value; + device_invalidate_state(cs->device, STATE_SAMPLER(op->sampler_idx)); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_sampler_state(struct wined3d_cs *cs, UINT sampler_idx, +@@ -825,13 +1016,15 @@ void wined3d_cs_emit_set_sampler_state(struct wined3d_cs *cs, UINT sampler_idx, + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_transform(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_transform(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_transform *op = data; + +- cs->state.transforms[op->state] = *op->matrix; ++ cs->state.transforms[op->state] = op->matrix; + if (op->state < WINED3D_TS_WORLD_MATRIX(cs->device->adapter->gl_info.limits.blends)) + device_invalidate_state(cs->device, STATE_TRANSFORM(op->state)); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_transform(struct wined3d_cs *cs, enum wined3d_transform_state state, +@@ -842,17 +1035,19 @@ void wined3d_cs_emit_set_transform(struct wined3d_cs *cs, enum wined3d_transform + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_SET_TRANSFORM; + op->state = state; +- op->matrix = matrix; ++ op->matrix = *matrix; + + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_clip_plane(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_clip_plane(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_clip_plane *op = data; + +- cs->state.clip_planes[op->plane_idx] = *op->plane; ++ cs->state.clip_planes[op->plane_idx] = op->plane; + device_invalidate_state(cs->device, STATE_CLIPPLANE(op->plane_idx)); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_clip_plane(struct wined3d_cs *cs, UINT plane_idx, const struct wined3d_vec4 *plane) +@@ -862,17 +1057,19 @@ void wined3d_cs_emit_set_clip_plane(struct wined3d_cs *cs, UINT plane_idx, const + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_SET_CLIP_PLANE; + op->plane_idx = plane_idx; +- op->plane = plane; ++ op->plane = *plane; + + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_set_material(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_set_material(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_material *op = data; + +- cs->state.material = *op->material; ++ cs->state.material = op->material; + device_invalidate_state(cs->device, STATE_MATERIAL); ++ ++ return sizeof(*op); + } + + void wined3d_cs_emit_set_material(struct wined3d_cs *cs, const struct wined3d_material *material) +@@ -881,12 +1078,12 @@ void wined3d_cs_emit_set_material(struct wined3d_cs *cs, const struct wined3d_ma + + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_SET_MATERIAL; +- op->material = material; ++ op->material = *material; + + cs->ops->submit(cs); + } + +-static void wined3d_cs_exec_reset_state(struct wined3d_cs *cs, const void *data) ++static UINT wined3d_cs_exec_reset_state(struct wined3d_cs *cs, const void *data) + { + struct wined3d_adapter *adapter = cs->device->adapter; + HRESULT hr; +@@ -896,6 +1093,8 @@ static void wined3d_cs_exec_reset_state(struct wined3d_cs *cs, const void *data) + if (FAILED(hr = state_init(&cs->state, &adapter->gl_info, &adapter->d3d_info, + WINED3D_STATE_NO_REF | WINED3D_STATE_INIT_DEFAULT))) + ERR("Failed to initialize CS state, hr %#x.\n", hr); ++ ++ return sizeof(struct wined3d_cs_reset_state); + } + + void wined3d_cs_emit_reset_state(struct wined3d_cs *cs) +@@ -908,8 +1107,9 @@ void wined3d_cs_emit_reset_state(struct wined3d_cs *cs) + cs->ops->submit(cs); + } + +-static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = ++static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { ++ /* WINED3D_CS_OP_FENCE */ wined3d_cs_exec_fence, + /* WINED3D_CS_OP_PRESENT */ wined3d_cs_exec_present, + /* WINED3D_CS_OP_CLEAR */ wined3d_cs_exec_clear, + /* WINED3D_CS_OP_DRAW */ wined3d_cs_exec_draw, +@@ -967,6 +1167,58 @@ static const struct wined3d_cs_ops wined3d_cs_st_ops = + wined3d_cs_st_submit, + }; + ++static const struct wined3d_cs_ops wined3d_cs_mt_ops = ++{ ++ wined3d_cs_mt_require_space, ++ wined3d_cs_flush_and_wait, ++}; ++ ++/* FIXME: wined3d_device_uninit_3d() should either flush and wait, or be an ++ * OP itself. */ ++static void wined3d_cs_emit_stop(struct wined3d_cs *cs) ++{ ++ struct wined3d_cs_stop *op; ++ ++ op = wined3d_cs_mt_require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_STOP; ++ ++ wined3d_cs_flush(cs); ++} ++ ++static DWORD WINAPI wined3d_cs_run(void *thread_param) ++{ ++ struct wined3d_cs *cs = thread_param; ++ ++ TRACE("Started.\n"); ++ ++ for (;;) ++ { ++ struct wined3d_cs_block *block; ++ UINT pos = 0; ++ ++ block = wined3d_cs_list_dequeue_blocking(&cs->exec_list); ++ while (pos < block->pos) ++ { ++ enum wined3d_cs_op opcode = *(const enum wined3d_cs_op *)&block->data[pos]; ++ ++ if (opcode >= WINED3D_CS_OP_STOP) ++ { ++ if (opcode > WINED3D_CS_OP_STOP) ++ ERR("Invalid opcode %#x.\n", opcode); ++ goto done; ++ } ++ ++ pos += wined3d_cs_op_handlers[opcode](cs, &block->data[pos]); ++ } ++ ++ wined3d_cs_list_enqueue(&cs->free_list, block); ++ } ++ ++done: ++ TRACE("Stopped.\n"); ++ return 0; ++} ++ + struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) + { + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; +@@ -992,12 +1244,60 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) + return NULL; + } + ++ if ((cs->tls_idx = TlsAlloc()) == TLS_OUT_OF_INDEXES) ++ { ++ ERR("Failed to allocate cs TLS index, err %#x.\n", GetLastError()); ++ HeapFree(GetProcessHeap(), 0, cs->data); ++ HeapFree(GetProcessHeap(), 0, cs); ++ return NULL; ++ } ++ ++ if (wined3d_settings.cs_multithreaded) ++ { ++ cs->ops = &wined3d_cs_mt_ops; ++ ++ wined3d_cs_list_init(&cs->free_list); ++ wined3d_cs_list_init(&cs->exec_list); ++ ++ if (!(cs->thread = CreateThread(NULL, 0, wined3d_cs_run, cs, 0, NULL))) ++ { ++ ERR("Failed to create wined3d command stream thread.\n"); ++ if (!TlsFree(cs->tls_idx)) ++ ERR("Failed to free cs TLS index, err %#x.\n", GetLastError()); ++ HeapFree(GetProcessHeap(), 0, cs->data); ++ HeapFree(GetProcessHeap(), 0, cs); ++ return NULL; ++ } ++ } ++ + return cs; + } + + void wined3d_cs_destroy(struct wined3d_cs *cs) + { ++ DWORD ret; ++ + state_cleanup(&cs->state); ++ ++ if (wined3d_settings.cs_multithreaded) ++ { ++ wined3d_cs_emit_stop(cs); ++ ++ ret = WaitForSingleObject(cs->thread, INFINITE); ++ CloseHandle(cs->thread); ++ if (ret != WAIT_OBJECT_0) ++ ERR("Wait failed (%#x).\n", ret); ++ ++ /* FIXME: Cleanup the block lists on thread exit. */ ++#if 0 ++ wined3d_cs_list_cleanup(&cs->exec_list); ++ wined3d_cs_list_cleanup(&cs->free_list); ++#endif ++ } ++ ++ if (!TlsFree(cs->tls_idx)) ++ ERR("Failed to free cs TLS index, err %#x.\n", GetLastError()); ++ + HeapFree(GetProcessHeap(), 0, cs->data); + HeapFree(GetProcessHeap(), 0, cs); + } +diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c +index 758ba43..5471e6e 100644 +--- a/dlls/wined3d/wined3d_main.c ++++ b/dlls/wined3d/wined3d_main.c +@@ -85,6 +85,7 @@ struct wined3d_settings wined3d_settings = + ~0U, /* No GS shader model limit by default. */ + ~0U, /* No PS shader model limit by default. */ + FALSE, /* 3D support enabled by default. */ ++ FALSE, /* No multithreaded CS by default. */ + }; + + struct wined3d * CDECL wined3d_create(DWORD flags) +@@ -304,6 +305,14 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL) + TRACE("Disabling 3D support.\n"); + wined3d_settings.no_3d = TRUE; + } ++ if (!get_config_key(hkey, appkey, "CSMT", buffer, size) ++ && !strcmp(buffer,"enabled")) ++ { ++ TRACE("Enabling multithreaded command stream.\n"); ++ wined3d_settings.cs_multithreaded = TRUE; ++ TRACE("Enforcing strict draw ordering for multithreaded command stream.\n"); ++ wined3d_settings.strict_draw_ordering = TRUE; ++ } + } + + if (appkey) RegCloseKey( appkey ); +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 9c05b6c..5c5d52c 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -279,6 +279,7 @@ struct wined3d_settings + unsigned int max_sm_gs; + unsigned int max_sm_ps; + BOOL no_3d; ++ BOOL cs_multithreaded; + }; + + extern struct wined3d_settings wined3d_settings DECLSPEC_HIDDEN; +@@ -2525,6 +2526,18 @@ HRESULT state_init(struct wined3d_state *state, const struct wined3d_gl_info *gl + const struct wined3d_d3d_info *d3d_info, DWORD flags) DECLSPEC_HIDDEN; + void state_unbind_resources(struct wined3d_state *state) DECLSPEC_HIDDEN; + ++struct wined3d_cs_list ++{ ++ struct list blocks; ++}; ++ ++struct wined3d_cs_block ++{ ++ struct list entry; ++ UINT pos; ++ BYTE data[4000]; /* FIXME? The size is somewhat arbitrary. */ ++}; ++ + struct wined3d_cs_ops + { + void *(*require_space)(struct wined3d_cs *cs, size_t size); +@@ -2536,9 +2549,14 @@ struct wined3d_cs + const struct wined3d_cs_ops *ops; + struct wined3d_device *device; + struct wined3d_state state; ++ HANDLE thread; ++ DWORD tls_idx; + + size_t data_size; + void *data; ++ ++ struct wined3d_cs_list free_list; ++ struct wined3d_cs_list exec_list; + }; + + struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0047-wined3d-Wait-for-resource-updates-to-finish-when-usi.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0047-wined3d-Wait-for-resource-updates-to-finish-when-usi.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0047-wined3d-Wait-for-resource-updates-to-finish-when-usi.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0047-wined3d-Wait-for-resource-updates-to-finish-when-usi.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,190 @@ +From 8eb60915d38e68c45223eafa534452fc4ffeb1fe Mon Sep 17 00:00:00 2001 +From: Henri Verbeet +Date: Sat, 8 Dec 2012 19:28:54 +0100 +Subject: wined3d: Wait for resource updates to finish when using the + multithreaded command stream. + +As opposed to just making sure they're submitted to the GPU for +"StrictDrawOrdering". This will eventually be disabled by default, but even +then it's probably useful for debugging. +--- + dlls/wined3d/arb_program_shader.c | 4 +++- + dlls/wined3d/buffer.c | 4 +++- + dlls/wined3d/device.c | 9 +++++++-- + dlls/wined3d/drawprim.c | 4 +++- + dlls/wined3d/surface.c | 28 +++++++++++++++++++++------- + dlls/wined3d/swapchain.c | 4 +++- + 6 files changed, 40 insertions(+), 13 deletions(-) + +diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c +index 2875fe1..ca456ad 100644 +--- a/dlls/wined3d/arb_program_shader.c ++++ b/dlls/wined3d/arb_program_shader.c +@@ -7679,7 +7679,9 @@ HRESULT arbfp_blit_surface(struct wined3d_device *device, DWORD filter, + /* Leave the opengl state valid for blitting */ + arbfp_blit_unset(context->gl_info); + +- if (wined3d_settings.strict_draw_ordering ++ if (wined3d_settings.cs_multithreaded) ++ context->gl_info->gl_ops.gl.p_glFinish(); ++ else if (wined3d_settings.strict_draw_ordering + || (dst_surface->container->swapchain + && (dst_surface->container->swapchain->front_buffer == dst_surface->container))) + context->gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index f335dfc..abad8b8 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -1100,7 +1100,9 @@ void CDECL wined3d_buffer_unmap(struct wined3d_buffer *buffer) + } + + GL_EXTCALL(glUnmapBufferARB(buffer->buffer_type_hint)); +- if (wined3d_settings.strict_draw_ordering) ++ if (wined3d_settings.cs_multithreaded) ++ gl_info->gl_ops.gl.p_glFinish(); ++ else if (wined3d_settings.strict_draw_ordering) + gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + context_release(context); + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 92478d7..08422ad 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -463,7 +463,9 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c + } + } + +- if (wined3d_settings.strict_draw_ordering || (flags & WINED3DCLEAR_TARGET ++ if (wined3d_settings.cs_multithreaded) ++ gl_info->gl_ops.gl.p_glFinish(); ++ else if (wined3d_settings.strict_draw_ordering || (flags & WINED3DCLEAR_TARGET + && target->container->swapchain && target->container->swapchain->front_buffer == target->container)) + gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + +@@ -3247,7 +3249,10 @@ HRESULT CDECL wined3d_device_end_scene(struct wined3d_device *device) + + context = context_acquire(device, NULL); + /* We only have to do this if we need to read the, swapbuffers performs a flush for us */ +- context->gl_info->gl_ops.gl.p_glFlush(); ++ if (wined3d_settings.cs_multithreaded) ++ context->gl_info->gl_ops.gl.p_glFinish(); ++ else ++ context->gl_info->gl_ops.gl.p_glFlush(); + /* No checkGLcall here to avoid locking the lock just for checking a call that hardly ever + * fails. */ + context_release(context); +diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c +index 98261f9..d3a9e03 100644 +--- a/dlls/wined3d/drawprim.c ++++ b/dlls/wined3d/drawprim.c +@@ -781,7 +781,9 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co + wined3d_event_query_issue(context->buffer_queries[i], device); + } + +- if (wined3d_settings.strict_draw_ordering) ++ if (wined3d_settings.cs_multithreaded) ++ gl_info->gl_ops.gl.p_glFinish(); ++ else if (wined3d_settings.strict_draw_ordering) + gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + + context_release(context); +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 642210d..8fa2c9f 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -687,7 +687,9 @@ static void surface_depth_blt_fbo(const struct wined3d_device *device, + dst_rect->left, dst_rect->top, dst_rect->right, dst_rect->bottom, gl_mask, GL_NEAREST); + checkGLcall("glBlitFramebuffer()"); + +- if (wined3d_settings.strict_draw_ordering) ++ if (wined3d_settings.cs_multithreaded) ++ gl_info->gl_ops.gl.p_glFinish(); ++ else if (wined3d_settings.strict_draw_ordering) + gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + + context_release(context); +@@ -816,7 +818,9 @@ static void surface_blt_fbo(const struct wined3d_device *device, + dst_rect.left, dst_rect.top, dst_rect.right, dst_rect.bottom, GL_COLOR_BUFFER_BIT, gl_filter); + checkGLcall("glBlitFramebuffer()"); + +- if (wined3d_settings.strict_draw_ordering ++ if (wined3d_settings.cs_multithreaded) ++ gl_info->gl_ops.gl.p_glFinish(); ++ else if (wined3d_settings.strict_draw_ordering + || (dst_location == WINED3D_LOCATION_DRAWABLE + && dst_surface->container->swapchain->front_buffer == dst_surface->container)) + gl_info->gl_ops.gl.p_glFlush(); +@@ -1393,7 +1397,9 @@ static void surface_upload_data(struct wined3d_surface *surface, const struct wi + checkGLcall("glBindBufferARB"); + } + +- if (wined3d_settings.strict_draw_ordering) ++ if (wined3d_settings.cs_multithreaded) ++ gl_info->gl_ops.gl.p_glFinish(); ++ else if (wined3d_settings.strict_draw_ordering) + gl_info->gl_ops.gl.p_glFlush(); + + if (gl_info->quirks & WINED3D_QUIRK_FBO_TEX_UPDATE) +@@ -3183,7 +3189,9 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st + checkGLcall("glDeleteTextures(1, &backup)"); + } + +- if (wined3d_settings.strict_draw_ordering) ++ if (wined3d_settings.cs_multithreaded) ++ gl_info->gl_ops.gl.p_glFinish(); ++ else if (wined3d_settings.strict_draw_ordering) + gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + + context_release(context); +@@ -3298,7 +3306,9 @@ static void surface_blt_to_drawable(const struct wined3d_device *device, + /* Leave the opengl state valid for blitting */ + device->blitter->unset_shader(context->gl_info); + +- if (wined3d_settings.strict_draw_ordering ++ if (wined3d_settings.cs_multithreaded) ++ gl_info->gl_ops.gl.p_glFinish(); ++ else if (wined3d_settings.strict_draw_ordering + || (dst_surface->container->swapchain + && dst_surface->container->swapchain->front_buffer == dst_surface->container)) + gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ +@@ -3719,7 +3729,9 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co + + context_invalidate_state(context, STATE_FRAMEBUFFER); + +- if (wined3d_settings.strict_draw_ordering) ++ if (wined3d_settings.cs_multithreaded) ++ gl_info->gl_ops.gl.p_glFinish(); ++ else if (wined3d_settings.strict_draw_ordering) + gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + } + else if (location == WINED3D_LOCATION_DRAWABLE) +@@ -3735,7 +3747,9 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co + + context_invalidate_state(context, STATE_FRAMEBUFFER); + +- if (wined3d_settings.strict_draw_ordering) ++ if (wined3d_settings.cs_multithreaded) ++ gl_info->gl_ops.gl.p_glFinish(); ++ else if (wined3d_settings.strict_draw_ordering) + gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + } + else +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index ed2964e..60504ef 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -531,8 +531,10 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + swapchain_blit(swapchain, context, &src_rect, &dst_rect); + } + +- if (swapchain->num_contexts > 1) ++ if (wined3d_settings.cs_multithreaded) + gl_info->gl_ops.gl.p_glFinish(); ++ else if (swapchain->num_contexts > 1) ++ gl_info->gl_ops.gl.p_glFlush(); + + /* call wglSwapBuffers through the gl table to avoid confusing the Steam overlay */ + gl_info->gl_ops.wgl.p_wglSwapBuffers(context->hdc); /* TODO: cycle through the swapchain buffers */ +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0048-wined3d-Don-t-store-pointers-in-struct-wined3d_cs_pr.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0048-wined3d-Don-t-store-pointers-in-struct-wined3d_cs_pr.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0048-wined3d-Don-t-store-pointers-in-struct-wined3d_cs_pr.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0048-wined3d-Don-t-store-pointers-in-struct-wined3d_cs_pr.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,82 @@ +From 72ea1f2801924c3856ae7a2b8045beef511b6e9e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 12 Mar 2013 11:34:58 -0700 +Subject: wined3d: Don't store pointers in struct wined3d_cs_present + +--- + dlls/wined3d/cs.c | 34 +++++++++++++++++++++++++++------- + 1 file changed, 27 insertions(+), 7 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 1122073..b30e62a 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -76,15 +76,19 @@ struct wined3d_cs_fence + BOOL *signalled; + }; + ++#define CS_PRESENT_SRC_RECT 1 ++#define CS_PRESENT_DST_RECT 2 ++#define CS_PRESENT_DIRTY_RGN 4 + struct wined3d_cs_present + { + enum wined3d_cs_op opcode; + HWND dst_window_override; + struct wined3d_swapchain *swapchain; +- const RECT *src_rect; +- const RECT *dst_rect; +- const RGNDATA *dirty_region; ++ RECT src_rect; ++ RECT dst_rect; ++ RGNDATA dirty_region; + DWORD flags; ++ DWORD set_data; + }; + + struct wined3d_cs_clear +@@ -395,12 +399,15 @@ static UINT wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_present *op = data; + struct wined3d_swapchain *swapchain; ++ const RECT *src_rect = op->set_data & CS_PRESENT_SRC_RECT ? &op->src_rect : NULL; ++ const RECT *dst_rect = op->set_data & CS_PRESENT_DST_RECT ? &op->dst_rect : NULL; ++ const RGNDATA *dirty_region = op->set_data & CS_PRESENT_DIRTY_RGN ? &op->dirty_region : NULL; + + swapchain = op->swapchain; + wined3d_swapchain_set_window(swapchain, op->dst_window_override); + + swapchain->swapchain_ops->swapchain_present(swapchain, +- op->src_rect, op->dst_rect, op->dirty_region, op->flags); ++ src_rect, dst_rect, dirty_region, op->flags); + + return sizeof(*op); + } +@@ -415,9 +422,22 @@ void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *sw + op->opcode = WINED3D_CS_OP_PRESENT; + op->dst_window_override = dst_window_override; + op->swapchain = swapchain; +- op->src_rect = src_rect; +- op->dst_rect = dst_rect; +- op->dirty_region = dirty_region; ++ op->set_data = 0; ++ if (src_rect) ++ { ++ op->src_rect = *src_rect; ++ op->set_data |= CS_PRESENT_SRC_RECT; ++ } ++ if (dst_rect) ++ { ++ op->dst_rect = *dst_rect; ++ op->set_data |= CS_PRESENT_DST_RECT; ++ } ++ if (dirty_region) ++ { ++ op->dirty_region = *dirty_region; ++ op->set_data = CS_PRESENT_DIRTY_RGN; ++ } + op->flags = flags; + + cs->ops->submit(cs); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0049-wined3d-Don-t-put-rectangle-pointers-into-wined3d_cs.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0049-wined3d-Don-t-put-rectangle-pointers-into-wined3d_cs.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0049-wined3d-Don-t-put-rectangle-pointers-into-wined3d_cs.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0049-wined3d-Don-t-put-rectangle-pointers-into-wined3d_cs.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,76 @@ +From 6a9d163ab416a7d1c44a11b75716ee32fb3c9f0b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 2 Apr 2013 16:17:34 +0200 +Subject: wined3d: Don't put rectangle pointers into wined3d_cs_clear + +--- + dlls/wined3d/cs.c | 13 ++++++++----- + dlls/wined3d/device.c | 2 ++ + 2 files changed, 10 insertions(+), 5 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index b30e62a..bac3fdb 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -95,11 +95,11 @@ struct wined3d_cs_clear + { + enum wined3d_cs_op opcode; + DWORD rect_count; +- const RECT *rects; + DWORD flags; + const struct wined3d_color *color; + float depth; + DWORD stencil; ++ RECT rects[1]; + }; + + struct wined3d_cs_draw +@@ -448,25 +448,28 @@ static UINT wined3d_cs_exec_clear(struct wined3d_cs *cs, const void *data) + const struct wined3d_cs_clear *op = data; + struct wined3d_device *device; + RECT draw_rect; ++ unsigned int extra_rects = op->rect_count ? op->rect_count - 1 : 0; + + device = cs->device; + wined3d_get_draw_rect(&device->state, &draw_rect); + device_clear_render_targets(device, device->adapter->gl_info.limits.buffers, +- &cs->state.fb, op->rect_count, op->rects, &draw_rect, op->flags, ++ &cs->state.fb, op->rect_count, op->rect_count ? op->rects : NULL, &draw_rect, op->flags, + op->color, op->depth, op->stencil); + +- return sizeof(*op); ++ return sizeof(*op) + sizeof(*op->rects) * extra_rects; + } + + void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *rects, + DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil) + { + struct wined3d_cs_clear *op; ++ unsigned int extra_rects = rect_count ? rect_count - 1 : 0; + +- op = cs->ops->require_space(cs, sizeof(*op)); ++ op = cs->ops->require_space(cs, sizeof(*op) + sizeof(*op->rects) * extra_rects); + op->opcode = WINED3D_CS_OP_CLEAR; + op->rect_count = rect_count; +- op->rects = rects; ++ if (rect_count) ++ memcpy(op->rects, rects, rect_count * sizeof(*rects)); + op->flags = flags; + op->color = color; + op->depth = depth; +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 08422ad..3bb3cf0 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -3292,6 +3292,8 @@ HRESULT CDECL wined3d_device_clear(struct wined3d_device *device, DWORD rect_cou + WARN("Rects is %p, but rect_count is 0, ignoring clear\n", rects); + return WINED3D_OK; + } ++ if (rect_count && !rects) ++ rect_count = 0; + + if (flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL)) + { +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0050-wined3d-Store-the-color-in-clear-ops-instead-of-a-po.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0050-wined3d-Store-the-color-in-clear-ops-instead-of-a-po.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0050-wined3d-Store-the-color-in-clear-ops-instead-of-a-po.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0050-wined3d-Store-the-color-in-clear-ops-instead-of-a-po.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,43 @@ +From 95126fce6331a34c71f5ff736192d25e78e67dde Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 2 Apr 2013 16:20:13 +0200 +Subject: wined3d: Store the color in clear ops instead of a pointer + +--- + dlls/wined3d/cs.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index bac3fdb..fa1ee3a 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -96,7 +96,7 @@ struct wined3d_cs_clear + enum wined3d_cs_op opcode; + DWORD rect_count; + DWORD flags; +- const struct wined3d_color *color; ++ struct wined3d_color color; + float depth; + DWORD stencil; + RECT rects[1]; +@@ -454,7 +454,7 @@ static UINT wined3d_cs_exec_clear(struct wined3d_cs *cs, const void *data) + wined3d_get_draw_rect(&device->state, &draw_rect); + device_clear_render_targets(device, device->adapter->gl_info.limits.buffers, + &cs->state.fb, op->rect_count, op->rect_count ? op->rects : NULL, &draw_rect, op->flags, +- op->color, op->depth, op->stencil); ++ &op->color, op->depth, op->stencil); + + return sizeof(*op) + sizeof(*op->rects) * extra_rects; + } +@@ -471,7 +471,7 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT * + if (rect_count) + memcpy(op->rects, rects, rect_count * sizeof(*rects)); + op->flags = flags; +- op->color = color; ++ op->color = *color; + op->depth = depth; + op->stencil = stencil; + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0051-wined3d-Pass-the-state-to-draw_primitive.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0051-wined3d-Pass-the-state-to-draw_primitive.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0051-wined3d-Pass-the-state-to-draw_primitive.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0051-wined3d-Pass-the-state-to-draw_primitive.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,258 @@ +From a28b86b048950e7f1bc93168bc3313eae44f82fa Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 2 Apr 2013 17:25:19 +0200 +Subject: wined3d: Pass the state to draw_primitive + +--- + dlls/wined3d/buffer.c | 6 +++--- + dlls/wined3d/context.c | 6 +++--- + dlls/wined3d/cs.c | 2 +- + dlls/wined3d/directx.c | 2 +- + dlls/wined3d/drawprim.c | 25 ++++++++++++------------- + dlls/wined3d/state.c | 4 ++-- + dlls/wined3d/utils.c | 2 +- + dlls/wined3d/wined3d_private.h | 8 +++++--- + 8 files changed, 28 insertions(+), 27 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index abad8b8..8165d6b 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -423,7 +423,7 @@ static inline void fixup_d3dcolor(DWORD *dst_color) + { + DWORD src_color = *dst_color; + +- /* Color conversion like in drawStridedSlow. watch out for little endianity ++ /* Color conversion like in draw_strided_slow. watch out for little endianity + * If we want that stuff to work on big endian machines too we have to consider more things + * + * 0xff000000: Alpha mask +@@ -1185,11 +1185,11 @@ static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device + + dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_BUFFER_RANGE] || gl_info->supported[ARB_MAP_BUFFER_RANGE]; + +- /* Observations show that drawStridedSlow is faster on dynamic VBs than converting + ++ /* Observations show that draw_strided_slow is faster on dynamic VBs than converting + + * drawStridedFast (half-life 2 and others). + * + * Basically converting the vertices in the buffer is quite expensive, and observations +- * show that drawStridedSlow is faster than converting + uploading + drawStridedFast. ++ * show that draw_strided_slow is faster than converting + uploading + drawStridedFast. + * Therefore do not create a VBO for WINED3DUSAGE_DYNAMIC buffers. + */ + if (!gl_info->supported[ARB_VERTEX_BUFFER_OBJECT]) +diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c +index ffb1c43..7ba4086 100644 +--- a/dlls/wined3d/context.c ++++ b/dlls/wined3d/context.c +@@ -2896,7 +2896,7 @@ static void context_update_stream_info(struct wined3d_context *context, const st + { + if (state->vertex_declaration->half_float_conv_needed && !stream_info->all_vbo) + { +- TRACE("Using drawStridedSlow with vertex shaders for FLOAT16 conversion.\n"); ++ TRACE("Using draw_strided_slow with vertex shaders for FLOAT16 conversion.\n"); + context->use_immediate_mode_draw = TRUE; + } + else +@@ -2968,9 +2968,9 @@ static void context_preload_textures(struct wined3d_context *context, const stru + } + + /* Context activation is done by the caller. */ +-BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_device *device) ++BOOL context_apply_draw_state(struct wined3d_context *context, const struct wined3d_device *device, ++ const struct wined3d_state *state) + { +- const struct wined3d_state *state = &device->state; + const struct StateEntry *state_table = context->state_table; + const struct wined3d_fb_state *fb = &state->fb; + unsigned int i, j; +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index fa1ee3a..eac7739 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -482,7 +482,7 @@ static UINT wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_draw *op = data; + +- draw_primitive(cs->device, op->start_idx, op->index_count, ++ draw_primitive(cs->device, &cs->device->state, op->start_idx, op->index_count, + op->start_instance, op->instance_count, op->indexed); + + return sizeof(*op); +diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c +index 794496b..f7b5562 100644 +--- a/dlls/wined3d/directx.c ++++ b/dlls/wined3d/directx.c +@@ -4732,7 +4732,7 @@ static void WINE_GLAPI invalid_texcoord_func(GLenum unit, const void *data) + } + + /* Helper functions for providing vertex data to opengl. The arrays are initialized based on +- * the extension detection and are used in drawStridedSlow ++ * the extension detection and are used in draw_strided_slow + */ + static void WINE_GLAPI position_d3dcolor(const void *data) + { +diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c +index d3a9e03..1627cfa 100644 +--- a/dlls/wined3d/drawprim.c ++++ b/dlls/wined3d/drawprim.c +@@ -36,7 +36,7 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_perf); + #include + + /* Context activation is done by the caller. */ +-static void drawStridedFast(const struct wined3d_gl_info *gl_info, GLenum primitive_type, UINT count, UINT idx_size, ++static void draw_strided_fast(const struct wined3d_gl_info *gl_info, GLenum primitive_type, UINT count, UINT idx_size, + const void *idx_data, UINT start_idx, INT base_vertex_index, UINT start_instance, UINT instance_count) + { + if (idx_size) +@@ -92,7 +92,7 @@ static void drawStridedFast(const struct wined3d_gl_info *gl_info, GLenum primit + */ + + /* Context activation is done by the caller. */ +-static void drawStridedSlow(const struct wined3d_device *device, struct wined3d_context *context, ++static void draw_strided_slow(const struct wined3d_state *state, struct wined3d_context *context, + const struct wined3d_stream_info *si, UINT NumVertexes, GLenum glPrimType, + const void *idxData, UINT idxSize, UINT startIdx) + { +@@ -100,7 +100,6 @@ static void drawStridedSlow(const struct wined3d_device *device, struct wined3d_ + const WORD *pIdxBufS = NULL; + const DWORD *pIdxBufL = NULL; + UINT vx_index; +- const struct wined3d_state *state = &device->state; + LONG SkipnStrides = startIdx; + BOOL pixelShader = use_ps(state); + BOOL specular_fog = FALSE; +@@ -450,7 +449,7 @@ static inline void send_attribute(const struct wined3d_gl_info *gl_info, + } + + /* Context activation is done by the caller. */ +-static void drawStridedSlowVs(struct wined3d_context *context, const struct wined3d_state *state, ++static void draw_strided_slow_vs(struct wined3d_context *context, const struct wined3d_state *state, + const struct wined3d_stream_info *si, UINT numberOfVertices, GLenum glPrimitiveType, + const void *idxData, UINT idxSize, UINT startIdx) + { +@@ -507,7 +506,7 @@ static void drawStridedSlowVs(struct wined3d_context *context, const struct wine + } + + /* Context activation is done by the caller. */ +-static void drawStridedInstanced(struct wined3d_context *context, const struct wined3d_state *state, ++static void draw_strided_instanced(struct wined3d_context *context, const struct wined3d_state *state, + const struct wined3d_stream_info *si, UINT numberOfVertices, GLenum glPrimitiveType, + const void *idxData, UINT idxSize, UINT startIdx, UINT base_vertex_index, UINT instance_count) + { +@@ -592,10 +591,10 @@ static void remove_vbos(struct wined3d_context *context, + } + + /* Routine common to the draw primitive and draw indexed primitive routines */ +-void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_count, +- UINT start_instance, UINT instance_count, BOOL indexed) ++void draw_primitive(struct wined3d_device *device, const struct wined3d_state *state, ++ UINT start_idx, UINT index_count, UINT start_instance, UINT instance_count, ++ BOOL indexed) + { +- const struct wined3d_state *state = &device->state; + const struct wined3d_stream_info *stream_info; + struct wined3d_event_query *ib_query = NULL; + struct wined3d_stream_info si_emulated; +@@ -661,7 +660,7 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co + } + } + +- if (!context_apply_draw_state(context, device)) ++ if (!context_apply_draw_state(context, device, state)) + { + context_release(context); + WARN("Unable to apply draw state, skipping draw.\n"); +@@ -753,24 +752,24 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co + else + WARN_(d3d_perf)("Using immediate mode with vertex shaders for half float emulation.\n"); + +- drawStridedSlowVs(context, state, stream_info, index_count, ++ draw_strided_slow_vs(context, state, stream_info, index_count, + state->gl_primitive_type, idx_data, idx_size, start_idx); + } + else + { +- drawStridedSlow(device, context, stream_info, index_count, ++ draw_strided_slow(state, context, stream_info, index_count, + state->gl_primitive_type, idx_data, idx_size, start_idx); + } + } + else if (!gl_info->supported[ARB_INSTANCED_ARRAYS] && instance_count) + { + /* Instancing emulation by mixing immediate mode and arrays. */ +- drawStridedInstanced(context, state, stream_info, index_count, state->gl_primitive_type, ++ draw_strided_instanced(context, state, stream_info, index_count, state->gl_primitive_type, + idx_data, idx_size, start_idx, state->base_vertex_index, instance_count); + } + else + { +- drawStridedFast(gl_info, state->gl_primitive_type, index_count, idx_size, idx_data, ++ draw_strided_fast(gl_info, state->gl_primitive_type, index_count, idx_size, idx_data, + start_idx, state->base_vertex_index, start_instance, instance_count); + } + +diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c +index 20f00d6..ba5c127 100644 +--- a/dlls/wined3d/state.c ++++ b/dlls/wined3d/state.c +@@ -1168,7 +1168,7 @@ void state_fog_fragpart(struct wined3d_context *context, const struct wined3d_st + + case WINED3D_FOG_NONE: + /* Both are none? According to msdn the alpha channel of the specular +- * color contains a fog factor. Set it in drawStridedSlow. ++ * color contains a fog factor. Set it in draw_strided_slow. + * Same happens with Vertexfog on transformed vertices + */ + new_source = FOGSOURCE_COORD; +@@ -4296,7 +4296,7 @@ static void load_vertex_data(struct wined3d_context *context, + } + } + } else { +- /* TODO: support blends in drawStridedSlow ++ /* TODO: support blends in draw_strided_slow + * No need to write a FIXME here, this is done after the general vertex decl decoding + */ + WARN("unsupported blending in openGl\n"); +diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c +index 8ff4e3e..389f31a 100644 +--- a/dlls/wined3d/utils.c ++++ b/dlls/wined3d/utils.c +@@ -3160,7 +3160,7 @@ void set_texture_matrix(const struct wined3d_gl_info *gl_info, const float *smat + * check for pixel shaders, and the shader has to undo the default gl divide. + * + * A more serious problem occurs if the app passes 4 coordinates in, and the +- * 4th is != 1.0(opengl default). This would have to be fixed in drawStridedSlow ++ * 4th is != 1.0(opengl default). This would have to be fixed in draw_strided_slow + * or a replacement shader. */ + default: + mat[3] = mat[7] = mat[11] = 0; mat[15] = 1; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 5c5d52c..a48cc7d 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -966,8 +966,9 @@ struct wined3d_stream_info + WORD use_map; /* MAX_ATTRIBS, 16 */ + }; + +-void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_count, +- UINT start_instance, UINT instance_count, BOOL indexed) DECLSPEC_HIDDEN; ++void draw_primitive(struct wined3d_device *device, const struct wined3d_state *state, ++ UINT start_idx, UINT index_count, UINT start_instance, UINT instance_count, ++ BOOL indexed) DECLSPEC_HIDDEN; + DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) DECLSPEC_HIDDEN; + + #define eps 1e-8f +@@ -1358,7 +1359,8 @@ void context_alloc_occlusion_query(struct wined3d_context *context, + void context_apply_blit_state(struct wined3d_context *context, const struct wined3d_device *device) DECLSPEC_HIDDEN; + BOOL context_apply_clear_state(struct wined3d_context *context, const struct wined3d_device *device, + UINT rt_count, const struct wined3d_fb_state *fb) DECLSPEC_HIDDEN; +-BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_device *device) DECLSPEC_HIDDEN; ++BOOL context_apply_draw_state(struct wined3d_context *context, const struct wined3d_device *device, ++ const struct wined3d_state *state) DECLSPEC_HIDDEN; + void context_apply_fbo_state_blit(struct wined3d_context *context, GLenum target, + struct wined3d_surface *render_target, struct wined3d_surface *depth_stencil, DWORD location) DECLSPEC_HIDDEN; + void context_active_texture(struct wined3d_context *context, const struct wined3d_gl_info *gl_info, +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0052-wined3d-Wait-for-the-cs-before-destroying-objects.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0052-wined3d-Wait-for-the-cs-before-destroying-objects.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0052-wined3d-Wait-for-the-cs-before-destroying-objects.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0052-wined3d-Wait-for-the-cs-before-destroying-objects.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,135 @@ +From 534d7a18db58161682a42210ced42e8e7cf55ba8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 3 Apr 2013 18:01:34 +0200 +Subject: wined3d: Wait for the cs before destroying objects + +This is to avoid destroying objects that are still referenced in +commands in the cs. Later patches will migrate resource destruction to +the CS. +--- + dlls/wined3d/buffer.c | 6 ++++++ + dlls/wined3d/cs.c | 2 ++ + dlls/wined3d/shader.c | 5 +++++ + dlls/wined3d/surface.c | 6 ++++++ + dlls/wined3d/texture.c | 6 ++++++ + dlls/wined3d/vertexdeclaration.c | 5 +++++ + dlls/wined3d/wined3d_private.h | 1 + + 7 files changed, 31 insertions(+) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index 8165d6b..bc34050 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -552,6 +552,12 @@ ULONG CDECL wined3d_buffer_decref(struct wined3d_buffer *buffer) + + if (!refcount) + { ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ buffer->resource.device->cs->ops->finish(buffer->resource.device->cs); ++ } ++ + if (buffer->buffer_object) + { + context = context_acquire(buffer->resource.device, NULL); +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index eac7739..8823c9a 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -1188,12 +1188,14 @@ static const struct wined3d_cs_ops wined3d_cs_st_ops = + { + wined3d_cs_st_require_space, + wined3d_cs_st_submit, ++ wined3d_cs_st_submit, + }; + + static const struct wined3d_cs_ops wined3d_cs_mt_ops = + { + wined3d_cs_mt_require_space, + wined3d_cs_flush_and_wait, ++ wined3d_cs_flush_and_wait, + }; + + /* FIXME: wined3d_device_uninit_3d() should either flush and wait, or be an +diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c +index cc969b8..0faabaa 100644 +--- a/dlls/wined3d/shader.c ++++ b/dlls/wined3d/shader.c +@@ -1957,6 +1957,11 @@ ULONG CDECL wined3d_shader_decref(struct wined3d_shader *shader) + + if (!refcount) + { ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ shader->device->cs->ops->finish(shader->device->cs); ++ } + shader_cleanup(shader); + shader->parent_ops->wined3d_object_destroyed(shader->parent); + HeapFree(GetProcessHeap(), 0, shader); +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 8fa2c9f..8f8af4d 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -42,6 +42,12 @@ static void surface_cleanup(struct wined3d_surface *surface) + + TRACE("surface %p.\n", surface); + ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ surface->resource.device->cs->ops->finish(surface->resource.device->cs); ++ } ++ + if (surface->resource.buffer_object || surface->rb_multisample + || surface->rb_resolved || !list_empty(&surface->renderbuffers)) + { +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index ec5c847..68889e5 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -136,6 +136,12 @@ static void wined3d_texture_cleanup(struct wined3d_texture *texture) + + TRACE("texture %p.\n", texture); + ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ texture->resource.device->cs->ops->finish(texture->resource.device->cs); ++ } ++ + for (i = 0; i < sub_count; ++i) + { + struct wined3d_resource *sub_resource = texture->sub_resources[i]; +diff --git a/dlls/wined3d/vertexdeclaration.c b/dlls/wined3d/vertexdeclaration.c +index cf5378c..3f4d5e4 100644 +--- a/dlls/wined3d/vertexdeclaration.c ++++ b/dlls/wined3d/vertexdeclaration.c +@@ -56,6 +56,11 @@ ULONG CDECL wined3d_vertex_declaration_decref(struct wined3d_vertex_declaration + + if (!refcount) + { ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ declaration->device->cs->ops->finish(declaration->device->cs); ++ } + HeapFree(GetProcessHeap(), 0, declaration->elements); + declaration->parent_ops->wined3d_object_destroyed(declaration->parent); + HeapFree(GetProcessHeap(), 0, declaration); +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index a48cc7d..b856b6f 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2544,6 +2544,7 @@ struct wined3d_cs_ops + { + void *(*require_space)(struct wined3d_cs *cs, size_t size); + void (*submit)(struct wined3d_cs *cs); ++ void (*finish)(struct wined3d_cs *cs); + }; + + struct wined3d_cs +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0053-wined3d-Give-the-cs-its-own-state.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0053-wined3d-Give-the-cs-its-own-state.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0053-wined3d-Give-the-cs-its-own-state.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0053-wined3d-Give-the-cs-its-own-state.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,255 @@ +From d2d8473f40a3cd357c33b4804d3b2489eaf6d979 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 1 Oct 2013 15:30:26 +0200 +Subject: wined3d: Give the cs its own state + +--- + dlls/wined3d/cs.c | 108 +++++++++++++++++++++++++++++++++++------ + dlls/wined3d/device.c | 3 ++ + dlls/wined3d/wined3d_private.h | 4 +- + 3 files changed, 99 insertions(+), 16 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 8823c9a..d252773 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -62,6 +62,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_SET_CLIP_PLANE, + WINED3D_CS_OP_SET_MATERIAL, + WINED3D_CS_OP_RESET_STATE, ++ WINED3D_CS_OP_STATEBLOCK, + WINED3D_CS_OP_STOP, + }; + +@@ -268,6 +269,13 @@ struct wined3d_cs_reset_state + enum wined3d_cs_op opcode; + }; + ++struct wined3d_cs_stateblock ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_state state; ++ float vs_consts_f[256 * 4], ps_consts_f[256 * 4]; ++}; ++ + /* FIXME: The list synchronization probably isn't particularly fast. */ + static void wined3d_cs_list_enqueue(struct wined3d_cs_list *list, struct wined3d_cs_block *block) + { +@@ -451,7 +459,7 @@ static UINT wined3d_cs_exec_clear(struct wined3d_cs *cs, const void *data) + unsigned int extra_rects = op->rect_count ? op->rect_count - 1 : 0; + + device = cs->device; +- wined3d_get_draw_rect(&device->state, &draw_rect); ++ wined3d_get_draw_rect(&cs->state, &draw_rect); + device_clear_render_targets(device, device->adapter->gl_info.limits.buffers, + &cs->state.fb, op->rect_count, op->rect_count ? op->rects : NULL, &draw_rect, op->flags, + &op->color, op->depth, op->stencil); +@@ -482,7 +490,7 @@ static UINT wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_draw *op = data; + +- draw_primitive(cs->device, &cs->device->state, op->start_idx, op->index_count, ++ draw_primitive(cs->device, &cs->state, op->start_idx, op->index_count, + op->start_instance, op->instance_count, op->indexed); + + return sizeof(*op); +@@ -897,6 +905,72 @@ void wined3d_cs_emit_set_texture(struct wined3d_cs *cs, UINT stage, struct wined + op->opcode = WINED3D_CS_OP_SET_TEXTURE; + op->stage = stage; + op->texture = texture; ++ cs->ops->submit(cs); ++} ++ ++static UINT wined3d_cs_exec_transfer_stateblock(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_adapter *adapter = cs->device->adapter; ++ const struct wined3d_cs_stateblock *op = data; ++ UINT num_vs_consts_f = sizeof(op->vs_consts_f) / sizeof(*op->vs_consts_f) / 4; ++ UINT num_ps_consts_f = sizeof(op->ps_consts_f) / sizeof(*op->ps_consts_f) / 4; ++ ++ num_vs_consts_f = min(num_vs_consts_f, adapter->d3d_info.limits.vs_uniform_count); ++ num_ps_consts_f = min(num_ps_consts_f, adapter->d3d_info.limits.ps_uniform_count); ++ ++ /* Don't memcpy the entire struct, we'll remove single items as we add dedicated ++ * ops for setting states */ ++ ++ cs->state.base_vertex_index = op->state.base_vertex_index; ++ cs->state.load_base_vertex_index = op->state.load_base_vertex_index; ++ cs->state.gl_primitive_type = op->state.gl_primitive_type; ++ ++ memcpy(cs->state.vs_consts_b, op->state.vs_consts_b, sizeof(cs->state.vs_consts_b)); ++ memcpy(cs->state.vs_consts_i, op->state.vs_consts_i, sizeof(cs->state.vs_consts_i)); ++ memcpy(cs->state.vs_consts_f, op->state.vs_consts_f, sizeof(*cs->state.vs_consts_f) * num_vs_consts_f); ++ ++ memcpy(cs->state.ps_consts_b, op->state.ps_consts_b, sizeof(cs->state.ps_consts_b)); ++ memcpy(cs->state.ps_consts_i, op->state.ps_consts_i, sizeof(cs->state.ps_consts_i)); ++ memcpy(cs->state.ps_consts_f, op->state.ps_consts_f, sizeof(*cs->state.ps_consts_f) * num_ps_consts_f); ++ ++ memcpy(cs->state.lights, op->state.lights, sizeof(cs->state.lights)); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_transfer_stateblock(struct wined3d_cs *cs, const struct wined3d_state *state) ++{ ++ const struct wined3d_device *device = cs->device; ++ const struct wined3d_adapter *adapter = device->adapter; ++ struct wined3d_cs_stateblock *op; ++ UINT num_vs_consts_f = sizeof(op->vs_consts_f) / sizeof(*op->vs_consts_f) / 4; ++ UINT num_ps_consts_f = sizeof(op->ps_consts_f) / sizeof(*op->ps_consts_f) / 4; ++ ++ num_vs_consts_f = min(num_vs_consts_f, adapter->d3d_info.limits.vs_uniform_count); ++ num_ps_consts_f = min(num_ps_consts_f, adapter->d3d_info.limits.ps_uniform_count); ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_STATEBLOCK; ++ ++ /* Don't memcpy the entire struct, we'll remove single items as we add dedicated ++ * ops for setting states */ ++ op->state.base_vertex_index = state->base_vertex_index; ++ op->state.load_base_vertex_index = state->load_base_vertex_index; ++ op->state.gl_primitive_type = state->gl_primitive_type; ++ ++ memcpy(op->state.vs_consts_b, state->vs_consts_b, sizeof(op->state.vs_consts_b)); ++ memcpy(op->state.vs_consts_i, state->vs_consts_i, sizeof(op->state.vs_consts_i)); ++ op->state.vs_consts_f = op->vs_consts_f; ++ memcpy(op->state.vs_consts_f, state->vs_consts_f, sizeof(*op->state.vs_consts_f) * num_vs_consts_f); ++ ++ memcpy(op->state.ps_consts_b, state->ps_consts_b, sizeof(op->state.ps_consts_b)); ++ memcpy(op->state.ps_consts_i, state->ps_consts_i, sizeof(op->state.ps_consts_i)); ++ op->state.ps_consts_f = op->ps_consts_f; ++ memcpy(op->state.ps_consts_f, state->ps_consts_f, sizeof(*op->state.ps_consts_f) * num_ps_consts_f); ++ ++ /* FIXME: This is not ideal. CS is still running synchronously, so this is ok. ++ * It will go away soon anyway. */ ++ memcpy(op->state.lights, state->lights, sizeof(op->state.lights)); + + cs->ops->submit(cs); + } +@@ -1158,6 +1232,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_SET_CLIP_PLANE */ wined3d_cs_exec_set_clip_plane, + /* WINED3D_CS_OP_SET_MATERIAL */ wined3d_cs_exec_set_material, + /* WINED3D_CS_OP_RESET_STATE */ wined3d_cs_exec_reset_state, ++ /* WINED3D_CS_OP_STATEBLOCK */ wined3d_cs_exec_transfer_stateblock, + }; + + static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) +@@ -1247,7 +1322,7 @@ done: + struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) + { + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; +- struct wined3d_cs *cs; ++ struct wined3d_cs *cs = NULL; + + if (!(cs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*cs)))) + return NULL; +@@ -1255,8 +1330,7 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) + if (FAILED(state_init(&cs->state, gl_info, &device->adapter->d3d_info, + WINED3D_STATE_NO_REF | WINED3D_STATE_INIT_DEFAULT))) + { +- HeapFree(GetProcessHeap(), 0, cs); +- return NULL; ++ goto err; + } + + cs->ops = &wined3d_cs_st_ops; +@@ -1265,16 +1339,13 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) + cs->data_size = WINED3D_INITIAL_CS_SIZE; + if (!(cs->data = HeapAlloc(GetProcessHeap(), 0, cs->data_size))) + { +- HeapFree(GetProcessHeap(), 0, cs); +- return NULL; ++ goto err; + } + + if ((cs->tls_idx = TlsAlloc()) == TLS_OUT_OF_INDEXES) + { + ERR("Failed to allocate cs TLS index, err %#x.\n", GetLastError()); +- HeapFree(GetProcessHeap(), 0, cs->data); +- HeapFree(GetProcessHeap(), 0, cs); +- return NULL; ++ goto err; + } + + if (wined3d_settings.cs_multithreaded) +@@ -1287,15 +1358,22 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) + if (!(cs->thread = CreateThread(NULL, 0, wined3d_cs_run, cs, 0, NULL))) + { + ERR("Failed to create wined3d command stream thread.\n"); +- if (!TlsFree(cs->tls_idx)) +- ERR("Failed to free cs TLS index, err %#x.\n", GetLastError()); +- HeapFree(GetProcessHeap(), 0, cs->data); +- HeapFree(GetProcessHeap(), 0, cs); +- return NULL; ++ goto err; + } + } + + return cs; ++ ++err: ++ if (cs) ++ { ++ state_cleanup(&cs->state); ++ if (cs->tls_idx != TLS_OUT_OF_INDEXES && !TlsFree(cs->tls_idx)) ++ ERR("Failed to free cs TLS index, err %#x.\n", GetLastError()); ++ HeapFree(GetProcessHeap(), 0, cs->data); ++ } ++ HeapFree(GetProcessHeap(), 0, cs); ++ return NULL; + } + + void wined3d_cs_destroy(struct wined3d_cs *cs) +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 3bb3cf0..6ea0b9a 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -3391,6 +3391,7 @@ HRESULT CDECL wined3d_device_draw_primitive(struct wined3d_device *device, UINT + device_invalidate_state(device, STATE_BASEVERTEXINDEX); + } + ++ wined3d_cs_emit_transfer_stateblock(device->cs, &device->state); + wined3d_cs_emit_draw(device->cs, start_vertex, vertex_count, 0, 0, FALSE); + + return WINED3D_OK; +@@ -3425,6 +3426,7 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *devic + device_invalidate_state(device, STATE_BASEVERTEXINDEX); + } + ++ wined3d_cs_emit_transfer_stateblock(device->cs, &device->state); + wined3d_cs_emit_draw(device->cs, start_idx, index_count, 0, 0, TRUE); + + return WINED3D_OK; +@@ -3435,6 +3437,7 @@ void CDECL wined3d_device_draw_indexed_primitive_instanced(struct wined3d_device + { + TRACE("device %p, start_idx %u, index_count %u.\n", device, start_idx, index_count); + ++ wined3d_cs_emit_transfer_stateblock(device->cs, &device->state); + wined3d_cs_emit_draw(device->cs, start_idx, index_count, start_instance, instance_count, TRUE); + } + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index b856b6f..02104ce 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2537,7 +2537,7 @@ struct wined3d_cs_block + { + struct list entry; + UINT pos; +- BYTE data[4000]; /* FIXME? The size is somewhat arbitrary. */ ++ BYTE data[sizeof(struct wined3d_state) * 2]; /* FIXME? The size is somewhat arbitrary. */ + }; + + struct wined3d_cs_ops +@@ -2577,6 +2577,8 @@ void wined3d_cs_emit_set_clip_plane(struct wined3d_cs *cs, UINT plane_idx, + const struct wined3d_vec4 *plane) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_constant_buffer(struct wined3d_cs *cs, enum wined3d_shader_type type, + UINT cb_idx, struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_transfer_stateblock(struct wined3d_cs *cs, ++ const struct wined3d_state *state) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_depth_stencil_view(struct wined3d_cs *cs, + struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_index_buffer(struct wined3d_cs *cs, struct wined3d_buffer *buffer, +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0054-wined3d-Send-float-constant-updates-through-the-comm.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0054-wined3d-Send-float-constant-updates-through-the-comm.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0054-wined3d-Send-float-constant-updates-through-the-comm.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0054-wined3d-Send-float-constant-updates-through-the-comm.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,208 @@ +From bbd02a077bf5ba977724ada68709f46150e482fb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 20 Aug 2013 15:12:26 +0200 +Subject: wined3d: Send float constant updates through the command stream + +--- + dlls/wined3d/cs.c | 88 ++++++++++++++++++++++++++++++++---------- + dlls/wined3d/device.c | 7 ++-- + dlls/wined3d/wined3d_private.h | 2 + + 3 files changed, 74 insertions(+), 23 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index d252773..56cbcb6 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -63,6 +63,8 @@ enum wined3d_cs_op + WINED3D_CS_OP_SET_MATERIAL, + WINED3D_CS_OP_RESET_STATE, + WINED3D_CS_OP_STATEBLOCK, ++ WINED3D_CS_OP_SET_VS_CONSTS_F, ++ WINED3D_CS_OP_SET_PS_CONSTS_F, + WINED3D_CS_OP_STOP, + }; + +@@ -273,7 +275,13 @@ struct wined3d_cs_stateblock + { + enum wined3d_cs_op opcode; + struct wined3d_state state; +- float vs_consts_f[256 * 4], ps_consts_f[256 * 4]; ++}; ++ ++struct wined3d_cs_set_consts_f ++{ ++ enum wined3d_cs_op opcode; ++ UINT start_register, vector4f_count; ++ float constants[4]; + }; + + /* FIXME: The list synchronization probably isn't particularly fast. */ +@@ -910,13 +918,7 @@ void wined3d_cs_emit_set_texture(struct wined3d_cs *cs, UINT stage, struct wined + + static UINT wined3d_cs_exec_transfer_stateblock(struct wined3d_cs *cs, const void *data) + { +- const struct wined3d_adapter *adapter = cs->device->adapter; + const struct wined3d_cs_stateblock *op = data; +- UINT num_vs_consts_f = sizeof(op->vs_consts_f) / sizeof(*op->vs_consts_f) / 4; +- UINT num_ps_consts_f = sizeof(op->ps_consts_f) / sizeof(*op->ps_consts_f) / 4; +- +- num_vs_consts_f = min(num_vs_consts_f, adapter->d3d_info.limits.vs_uniform_count); +- num_ps_consts_f = min(num_ps_consts_f, adapter->d3d_info.limits.ps_uniform_count); + + /* Don't memcpy the entire struct, we'll remove single items as we add dedicated + * ops for setting states */ +@@ -927,11 +929,9 @@ static UINT wined3d_cs_exec_transfer_stateblock(struct wined3d_cs *cs, const voi + + memcpy(cs->state.vs_consts_b, op->state.vs_consts_b, sizeof(cs->state.vs_consts_b)); + memcpy(cs->state.vs_consts_i, op->state.vs_consts_i, sizeof(cs->state.vs_consts_i)); +- memcpy(cs->state.vs_consts_f, op->state.vs_consts_f, sizeof(*cs->state.vs_consts_f) * num_vs_consts_f); + + memcpy(cs->state.ps_consts_b, op->state.ps_consts_b, sizeof(cs->state.ps_consts_b)); + memcpy(cs->state.ps_consts_i, op->state.ps_consts_i, sizeof(cs->state.ps_consts_i)); +- memcpy(cs->state.ps_consts_f, op->state.ps_consts_f, sizeof(*cs->state.ps_consts_f) * num_ps_consts_f); + + memcpy(cs->state.lights, op->state.lights, sizeof(cs->state.lights)); + +@@ -940,14 +940,7 @@ static UINT wined3d_cs_exec_transfer_stateblock(struct wined3d_cs *cs, const voi + + void wined3d_cs_emit_transfer_stateblock(struct wined3d_cs *cs, const struct wined3d_state *state) + { +- const struct wined3d_device *device = cs->device; +- const struct wined3d_adapter *adapter = device->adapter; + struct wined3d_cs_stateblock *op; +- UINT num_vs_consts_f = sizeof(op->vs_consts_f) / sizeof(*op->vs_consts_f) / 4; +- UINT num_ps_consts_f = sizeof(op->ps_consts_f) / sizeof(*op->ps_consts_f) / 4; +- +- num_vs_consts_f = min(num_vs_consts_f, adapter->d3d_info.limits.vs_uniform_count); +- num_ps_consts_f = min(num_ps_consts_f, adapter->d3d_info.limits.ps_uniform_count); + + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_STATEBLOCK; +@@ -960,13 +953,9 @@ void wined3d_cs_emit_transfer_stateblock(struct wined3d_cs *cs, const struct win + + memcpy(op->state.vs_consts_b, state->vs_consts_b, sizeof(op->state.vs_consts_b)); + memcpy(op->state.vs_consts_i, state->vs_consts_i, sizeof(op->state.vs_consts_i)); +- op->state.vs_consts_f = op->vs_consts_f; +- memcpy(op->state.vs_consts_f, state->vs_consts_f, sizeof(*op->state.vs_consts_f) * num_vs_consts_f); + + memcpy(op->state.ps_consts_b, state->ps_consts_b, sizeof(op->state.ps_consts_b)); + memcpy(op->state.ps_consts_i, state->ps_consts_i, sizeof(op->state.ps_consts_i)); +- op->state.ps_consts_f = op->ps_consts_f; +- memcpy(op->state.ps_consts_f, state->ps_consts_f, sizeof(*op->state.ps_consts_f) * num_ps_consts_f); + + /* FIXME: This is not ideal. CS is still running synchronously, so this is ok. + * It will go away soon anyway. */ +@@ -1039,6 +1028,63 @@ void wined3d_cs_emit_set_shader(struct wined3d_cs *cs, enum wined3d_shader_type + op->opcode = WINED3D_CS_OP_SET_SHADER; + op->type = type; + op->shader = shader; ++} ++ ++static UINT wined3d_cs_exec_set_vs_consts_f(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_consts_f *op = data; ++ struct wined3d_device *device = cs->device; ++ ++ memcpy(cs->state.vs_consts_f + op->start_register * 4, op->constants, ++ sizeof(*cs->state.vs_consts_f) * 4 * op->vector4f_count); ++ ++ device->shader_backend->shader_update_float_vertex_constants(device, ++ op->start_register, op->vector4f_count); ++ ++ return sizeof(*op) + sizeof(op->constants) * (op->vector4f_count - 1); ++} ++ ++static UINT wined3d_cs_exec_set_ps_consts_f(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_consts_f *op = data; ++ struct wined3d_device *device = cs->device; ++ ++ memcpy(cs->state.ps_consts_f + op->start_register * 4, op->constants, ++ sizeof(*cs->state.ps_consts_f) * 4 * op->vector4f_count); ++ ++ device->shader_backend->shader_update_float_pixel_constants(device, ++ op->start_register, op->vector4f_count); ++ ++ return sizeof(*op) + sizeof(op->constants) * (op->vector4f_count - 1); ++} ++ ++void wined3d_cs_emit_set_consts_f(struct wined3d_cs *cs, UINT start_register, ++ const float *constants, UINT vector4f_count, enum wined3d_shader_type type) ++{ ++ struct wined3d_cs_set_consts_f *op; ++ UINT extra_space = vector4f_count - 1; ++ ++ op = cs->ops->require_space(cs, sizeof(*op) + sizeof(op->constants) * extra_space); ++ switch (type) ++ { ++ case WINED3D_SHADER_TYPE_PIXEL: ++ op->opcode = WINED3D_CS_OP_SET_PS_CONSTS_F; ++ break; ++ ++ case WINED3D_SHADER_TYPE_VERTEX: ++ op->opcode = WINED3D_CS_OP_SET_VS_CONSTS_F; ++ break; ++ ++ case WINED3D_SHADER_TYPE_GEOMETRY: ++ FIXME("Invalid for geometry shaders\n"); ++ return; ++ ++ case WINED3D_SHADER_TYPE_COUNT: ++ break; ++ } ++ op->start_register = start_register; ++ op->vector4f_count = vector4f_count; ++ memcpy(op->constants, constants, sizeof(*constants) * 4 * vector4f_count); + + cs->ops->submit(cs); + } +@@ -1233,6 +1279,8 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_SET_MATERIAL */ wined3d_cs_exec_set_material, + /* WINED3D_CS_OP_RESET_STATE */ wined3d_cs_exec_reset_state, + /* WINED3D_CS_OP_STATEBLOCK */ wined3d_cs_exec_transfer_stateblock, ++ /* WINED3D_CS_OP_SET_VS_CONSTS_F */ wined3d_cs_exec_set_vs_consts_f, ++ /* WINED3D_CS_OP_SET_PS_CONSTS_F */ wined3d_cs_exec_set_ps_consts_f, + }; + + static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 6ea0b9a..2aba2a4 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -2341,8 +2341,8 @@ HRESULT CDECL wined3d_device_set_vs_consts_f(struct wined3d_device *device, + memset(device->recording->changed.vertexShaderConstantsF + start_register, 1, + sizeof(*device->recording->changed.vertexShaderConstantsF) * vector4f_count); + else +- device->shader_backend->shader_update_float_vertex_constants(device, start_register, vector4f_count); +- ++ wined3d_cs_emit_set_consts_f(device->cs, start_register, constants, vector4f_count, ++ WINED3D_SHADER_TYPE_VERTEX); + + return WINED3D_OK; + } +@@ -2576,7 +2576,8 @@ HRESULT CDECL wined3d_device_set_ps_consts_f(struct wined3d_device *device, + memset(device->recording->changed.pixelShaderConstantsF + start_register, 1, + sizeof(*device->recording->changed.pixelShaderConstantsF) * vector4f_count); + else +- device->shader_backend->shader_update_float_pixel_constants(device, start_register, vector4f_count); ++ wined3d_cs_emit_set_consts_f(device->cs, start_register, constants, vector4f_count, ++ WINED3D_SHADER_TYPE_PIXEL); + + return WINED3D_OK; + } +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 02104ce..d673a8f 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2613,6 +2613,8 @@ void wined3d_cs_emit_set_transform(struct wined3d_cs *cs, enum wined3d_transform + void wined3d_cs_emit_set_vertex_declaration(struct wined3d_cs *cs, + struct wined3d_vertex_declaration *declaration) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_viewport(struct wined3d_cs *cs, const struct wined3d_viewport *viewport) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_set_consts_f(struct wined3d_cs *cs, UINT start_register, const float *constants, ++ UINT vector4f_count, enum wined3d_shader_type type) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0055-wined3d-Request-a-glFinish-before-modifying-resource.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0055-wined3d-Request-a-glFinish-before-modifying-resource.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0055-wined3d-Request-a-glFinish-before-modifying-resource.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0055-wined3d-Request-a-glFinish-before-modifying-resource.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,253 @@ +From e6796ac98c5263a0cec410ecaf7392f2a22ff4da Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Apr 2013 11:50:09 +0200 +Subject: wined3d: Request a glFinish before modifying resources outside the cs + +--- + dlls/wined3d/buffer.c | 17 +++++++++++++++++ + dlls/wined3d/cs.c | 30 ++++++++++++++++++++++++++++++ + dlls/wined3d/device.c | 42 ++++++++++++++++++++++++++++++++++++++++++ + dlls/wined3d/resource.c | 7 +++++++ + dlls/wined3d/surface.c | 7 +++++++ + dlls/wined3d/wined3d_private.h | 1 + + 6 files changed, 104 insertions(+) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index bc34050..d2c1d62 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -931,6 +931,15 @@ void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_conte + void CDECL wined3d_buffer_preload(struct wined3d_buffer *buffer) + { + struct wined3d_context *context; ++ struct wined3d_device *device = buffer->resource.device; ++ ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ wined3d_cs_emit_glfinish(device->cs); ++ device->cs->ops->finish(device->cs); ++ } ++ + context = context_acquire(buffer->resource.device, NULL); + buffer_internal_preload(buffer, context, NULL); + context_release(context); +@@ -947,9 +956,17 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + { + LONG count; + BYTE *base; ++ struct wined3d_device *device = buffer->resource.device; + + TRACE("buffer %p, offset %u, size %u, data %p, flags %#x\n", buffer, offset, size, data, flags); + ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ wined3d_cs_emit_glfinish(device->cs); ++ device->cs->ops->finish(device->cs); ++ } ++ + flags = wined3d_resource_sanitize_map_flags(&buffer->resource, flags); + /* Filter redundant WINED3D_MAP_DISCARD maps. The 3DMark2001 multitexture + * fill rate test seems to depend on this. When we map a buffer with +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 56cbcb6..8b24e73 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -65,6 +65,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_STATEBLOCK, + WINED3D_CS_OP_SET_VS_CONSTS_F, + WINED3D_CS_OP_SET_PS_CONSTS_F, ++ WINED3D_CS_OP_GLFINISH, + WINED3D_CS_OP_STOP, + }; + +@@ -284,6 +285,11 @@ struct wined3d_cs_set_consts_f + float constants[4]; + }; + ++struct wined3d_cs_finish ++{ ++ enum wined3d_cs_op opcode; ++}; ++ + /* FIXME: The list synchronization probably isn't particularly fast. */ + static void wined3d_cs_list_enqueue(struct wined3d_cs_list *list, struct wined3d_cs_block *block) + { +@@ -1250,6 +1256,29 @@ void wined3d_cs_emit_reset_state(struct wined3d_cs *cs) + cs->ops->submit(cs); + } + ++static UINT wined3d_cs_exec_glfinish(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_finish *op = data; ++ struct wined3d_device *device = cs->device; ++ struct wined3d_context *context; ++ ++ context = context_acquire(device, NULL); ++ context->gl_info->gl_ops.gl.p_glFinish(); ++ context_release(context); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_glfinish(struct wined3d_cs *cs) ++{ ++ struct wined3d_cs_finish *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_GLFINISH; ++ ++ cs->ops->submit(cs); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_FENCE */ wined3d_cs_exec_fence, +@@ -1281,6 +1310,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_STATEBLOCK */ wined3d_cs_exec_transfer_stateblock, + /* WINED3D_CS_OP_SET_VS_CONSTS_F */ wined3d_cs_exec_set_vs_consts_f, + /* WINED3D_CS_OP_SET_PS_CONSTS_F */ wined3d_cs_exec_set_ps_consts_f, ++ /* WINED3D_CS_OP_GLFINISH */ wined3d_cs_exec_glfinish, + }; + + static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 2aba2a4..4d15518 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -2737,6 +2737,13 @@ static HRESULT process_vertices_strided(const struct wined3d_device *device, DWO + return hr; + } + ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ wined3d_cs_emit_glfinish(device->cs); ++ device->cs->ops->finish(device->cs); ++ } ++ + wined3d_device_get_transform(device, WINED3D_TS_VIEW, &view_mat); + wined3d_device_get_transform(device, WINED3D_TS_PROJECTION, &proj_mat); + wined3d_device_get_transform(device, WINED3D_TS_WORLD_MATRIX(0), &world_mat); +@@ -3531,6 +3538,13 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device, + return WINED3DERR_INVALIDCALL; + } + ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ wined3d_cs_emit_glfinish(device->cs); ++ device->cs->ops->finish(device->cs); ++ } ++ + /* Make sure that the destination texture is loaded. */ + context = context_acquire(device, NULL); + wined3d_texture_load(dst_texture, context, FALSE); +@@ -3768,6 +3782,13 @@ HRESULT CDECL wined3d_device_update_surface(struct wined3d_device *device, + return WINED3DERR_INVALIDCALL; + } + ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ wined3d_cs_emit_glfinish(device->cs); ++ device->cs->ops->finish(device->cs); ++ } ++ + return surface_upload_from_surface(dst_surface, dst_point, src_surface, src_rect); + } + +@@ -3870,6 +3891,13 @@ HRESULT CDECL wined3d_device_clear_rendertarget_view(struct wined3d_device *devi + rect = &r; + } + ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ wined3d_cs_emit_glfinish(device->cs); ++ device->cs->ops->finish(device->cs); ++ } ++ + resource = wined3d_texture_get_sub_resource(wined3d_texture_from_resource(resource), view->sub_resource_idx); + + return surface_color_fill(surface_from_resource(resource), rect, color); +@@ -4200,6 +4228,13 @@ void CDECL wined3d_device_evict_managed_resources(struct wined3d_device *device) + + TRACE("device %p.\n", device); + ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ wined3d_cs_emit_glfinish(device->cs); ++ device->cs->ops->finish(device->cs); ++ } ++ + LIST_FOR_EACH_ENTRY_SAFE(resource, cursor, &device->resources, struct wined3d_resource, resource_list_entry) + { + TRACE("Checking resource %p for eviction.\n", resource); +@@ -4324,6 +4359,13 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, + + TRACE("device %p, swapchain_desc %p, mode %p, callback %p.\n", device, swapchain_desc, mode, callback); + ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ wined3d_cs_emit_glfinish(device->cs); ++ device->cs->ops->finish(device->cs); ++ } ++ + if (!(swapchain = wined3d_device_get_swapchain(device, 0))) + { + ERR("Failed to get the first implicit swapchain.\n"); +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 8486dc3..bf228d1 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -702,6 +702,13 @@ HRESULT wined3d_resource_map(struct wined3d_resource *resource, + + flags = wined3d_resource_sanitize_map_flags(resource, flags); + ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ wined3d_cs_emit_glfinish(device->cs); ++ device->cs->ops->finish(device->cs); ++ } ++ + if (device->d3d_initialized) + context = context_acquire(device, NULL); + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 8f8af4d..97450ef 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -5051,6 +5051,13 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + flags &= ~WINEDDBLT_DONOTWAIT; + } + ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("Waiting for cs.\n"); ++ wined3d_cs_emit_glfinish(device->cs); ++ device->cs->ops->finish(device->cs); ++ } ++ + if (!device->d3d_initialized) + { + WARN("D3D not initialized, using fallback.\n"); +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index d673a8f..ba0ce26 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2615,6 +2615,7 @@ void wined3d_cs_emit_set_vertex_declaration(struct wined3d_cs *cs, + void wined3d_cs_emit_set_viewport(struct wined3d_cs *cs, const struct wined3d_viewport *viewport) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_consts_f(struct wined3d_cs *cs, UINT start_register, const float *constants, + UINT vector4f_count, enum wined3d_shader_type type) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_glfinish(struct wined3d_cs *cs) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0056-wined3d-Finish-the-cs-before-changing-the-texture-lo.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0056-wined3d-Finish-the-cs-before-changing-the-texture-lo.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0056-wined3d-Finish-the-cs-before-changing-the-texture-lo.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0056-wined3d-Finish-the-cs-before-changing-the-texture-lo.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,30 @@ +From 64d0e5c85cdd399857597ab57cfd4e2444e17226 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 10 Apr 2013 19:53:44 +0200 +Subject: wined3d: Finish the cs before changing the texture lod + +--- + dlls/wined3d/texture.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index 68889e5..8212c96 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -601,6 +601,13 @@ DWORD CDECL wined3d_texture_set_lod(struct wined3d_texture *texture, DWORD lod) + + if (texture->lod != lod) + { ++ if (wined3d_settings.cs_multithreaded) ++ { ++ struct wined3d_device *device = texture->resource.device; ++ FIXME("Waiting for cs.\n"); ++ device->cs->ops->finish(device->cs); ++ } ++ + texture->lod = lod; + + texture->texture_rgb.states[WINED3DTEXSTA_MAXMIPLEVEL] = ~0U; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0057-wined3d-Don-t-call-glFinish-after-clears.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0057-wined3d-Don-t-call-glFinish-after-clears.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0057-wined3d-Don-t-call-glFinish-after-clears.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0057-wined3d-Don-t-call-glFinish-after-clears.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,27 @@ +From d4014863c602be40898af0f2be9b718ee6abe7d0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Apr 2013 11:51:13 +0200 +Subject: wined3d: Don't call glFinish after clears + +--- + dlls/wined3d/device.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 4d15518..98c0717 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -463,9 +463,7 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c + } + } + +- if (wined3d_settings.cs_multithreaded) +- gl_info->gl_ops.gl.p_glFinish(); +- else if (wined3d_settings.strict_draw_ordering || (flags & WINED3DCLEAR_TARGET ++ if (wined3d_settings.strict_draw_ordering || (flags & WINED3DCLEAR_TARGET + && target->container->swapchain && target->container->swapchain->front_buffer == target->container)) + gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0058-wined3d-Don-t-call-glFinish-after-draws.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0058-wined3d-Don-t-call-glFinish-after-draws.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0058-wined3d-Don-t-call-glFinish-after-draws.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0058-wined3d-Don-t-call-glFinish-after-draws.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,27 @@ +From 7fd4d602c8a324c5f474370457363910e074296f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Apr 2013 11:53:10 +0200 +Subject: wined3d: Don't call glFinish after draws + +--- + dlls/wined3d/drawprim.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c +index 1627cfa..43d867d 100644 +--- a/dlls/wined3d/drawprim.c ++++ b/dlls/wined3d/drawprim.c +@@ -780,9 +780,7 @@ void draw_primitive(struct wined3d_device *device, const struct wined3d_state *s + wined3d_event_query_issue(context->buffer_queries[i], device); + } + +- if (wined3d_settings.cs_multithreaded) +- gl_info->gl_ops.gl.p_glFinish(); +- else if (wined3d_settings.strict_draw_ordering) ++ if (wined3d_settings.strict_draw_ordering) + gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + + context_release(context); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0059-wined3d-Shadow-device-offscreenBuffer-in-the-context.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0059-wined3d-Shadow-device-offscreenBuffer-in-the-context.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0059-wined3d-Shadow-device-offscreenBuffer-in-the-context.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0059-wined3d-Shadow-device-offscreenBuffer-in-the-context.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,54 @@ +From e0c083d32b61b7a5bee9371bcf8a1b03964303a0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Apr 2013 14:40:47 +0200 +Subject: wined3d: Shadow device->offscreenBuffer in the context + +Meh. Should probably go into the adapter, or non-fbo ORM should just die +TODO 2: See what this is actually used for. +--- + dlls/wined3d/context.c | 2 ++ + dlls/wined3d/device.c | 1 + + dlls/wined3d/wined3d_private.h | 2 ++ + 3 files changed, 5 insertions(+) + +diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c +index 7ba4086..fc66ff1 100644 +--- a/dlls/wined3d/context.c ++++ b/dlls/wined3d/context.c +@@ -1453,6 +1453,8 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain, + ret->current_fb.rt_size = gl_info->limits.buffers; + if (!ret->current_fb.render_targets) + goto out; ++ if (device->context_count) ++ ret->offscreenBuffer = device->contexts[0]->offscreenBuffer; + + /* Initialize the texture unit mapping to a 1:1 mapping */ + for (s = 0; s < MAX_COMBINED_SAMPLERS; ++s) +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 98c0717..ee8b418 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -948,6 +948,7 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device, + } + } + } ++ device->contexts[0]->offscreenBuffer = device->offscreenBuffer; + + TRACE("All defaults now set up, leaving 3D init.\n"); + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index ba0ce26..a16909c 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -1232,6 +1232,8 @@ struct wined3d_context + GLfloat fog_coord_value; + GLfloat color[4], fogstart, fogend, fogcolor[4]; + GLuint dummy_arbfp_prog; ++ ++ GLenum offscreenBuffer; + }; + + typedef void (*APPLYSTATEFUNC)(struct wined3d_context *ctx, const struct wined3d_state *state, DWORD state_id); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0060-wined3d-Don-t-access-the-stateblock-in-find_draw_buf.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0060-wined3d-Don-t-access-the-stateblock-in-find_draw_buf.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0060-wined3d-Don-t-access-the-stateblock-in-find_draw_buf.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0060-wined3d-Don-t-access-the-stateblock-in-find_draw_buf.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,105 @@ +From 61077043981635623c0f2eda20aa252c18fc4104 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Apr 2013 14:43:23 +0200 +Subject: wined3d: Don't access the stateblock in find_draw_buffers_mask + +--- + dlls/wined3d/context.c | 21 +++++++++------------ + 1 file changed, 9 insertions(+), 12 deletions(-) + +diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c +index fc66ff1..39c9464 100644 +--- a/dlls/wined3d/context.c ++++ b/dlls/wined3d/context.c +@@ -2231,14 +2231,14 @@ static void context_validate_onscreen_formats(struct wined3d_context *context, + context_set_render_offscreen(context, TRUE); + } + +-static DWORD context_generate_rt_mask_no_fbo(const struct wined3d_device *device, const struct wined3d_surface *rt) ++static DWORD context_generate_rt_mask_no_fbo(const struct wined3d_context *context, const struct wined3d_surface *rt) + { + if (!rt || rt->resource.format->id == WINED3DFMT_NULL) + return 0; + else if (rt->container->swapchain) + return context_generate_rt_mask_from_surface(rt); + else +- return context_generate_rt_mask(device->offscreenBuffer); ++ return context_generate_rt_mask(context->offscreenBuffer); + } + + /* Context activation is done by the caller. */ +@@ -2270,7 +2270,7 @@ void context_apply_blit_state(struct wined3d_context *context, const struct wine + } + else + { +- rt_mask = context_generate_rt_mask_no_fbo(device, rt); ++ rt_mask = context_generate_rt_mask_no_fbo(context, rt); + } + + cur_mask = context->current_fbo ? &context->current_fbo->rt_mask : &context->draw_buffers_mask; +@@ -2356,7 +2356,7 @@ BOOL context_apply_clear_state(struct wined3d_context *context, const struct win + } + else + { +- rt_mask = context_generate_rt_mask_no_fbo(device, ++ rt_mask = context_generate_rt_mask_no_fbo(context, + rt_count ? wined3d_rendertarget_view_get_surface(rts[0]) : NULL); + } + +@@ -2373,7 +2373,7 @@ BOOL context_apply_clear_state(struct wined3d_context *context, const struct win + } + else + { +- rt_mask = context_generate_rt_mask_no_fbo(device, ++ rt_mask = context_generate_rt_mask_no_fbo(context, + rt_count ? wined3d_rendertarget_view_get_surface(rts[0]) : NULL); + } + +@@ -2408,16 +2408,15 @@ BOOL context_apply_clear_state(struct wined3d_context *context, const struct win + return TRUE; + } + +-static DWORD find_draw_buffers_mask(const struct wined3d_context *context, const struct wined3d_device *device) ++static DWORD find_draw_buffers_mask(const struct wined3d_context *context, const struct wined3d_state *state) + { +- const struct wined3d_state *state = &device->state; + struct wined3d_rendertarget_view **rts = state->fb.render_targets; + struct wined3d_shader *ps = state->shader[WINED3D_SHADER_TYPE_PIXEL]; + DWORD rt_mask, rt_mask_bits; + unsigned int i; + + if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) +- return context_generate_rt_mask_no_fbo(device, wined3d_rendertarget_view_get_surface(rts[0])); ++ return context_generate_rt_mask_no_fbo(context, wined3d_rendertarget_view_get_surface(rts[0])); + else if (!context->render_offscreen) + return context_generate_rt_mask_from_surface(wined3d_rendertarget_view_get_surface(rts[0])); + +@@ -2440,9 +2439,8 @@ static DWORD find_draw_buffers_mask(const struct wined3d_context *context, const + /* Context activation is done by the caller. */ + void context_state_fb(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { +- const struct wined3d_device *device = context->swapchain->device; + const struct wined3d_fb_state *fb = &state->fb; +- DWORD rt_mask = find_draw_buffers_mask(context, device); ++ DWORD rt_mask = find_draw_buffers_mask(context, state); + DWORD *cur_mask; + + if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) +@@ -2710,13 +2708,12 @@ static void context_update_tex_unit_map(struct wined3d_context *context, const s + /* Context activation is done by the caller. */ + void context_state_drawbuf(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { +- const struct wined3d_device *device = context->swapchain->device; + DWORD rt_mask, *cur_mask; + + if (isStateDirty(context, STATE_FRAMEBUFFER)) return; + + cur_mask = context->current_fbo ? &context->current_fbo->rt_mask : &context->draw_buffers_mask; +- rt_mask = find_draw_buffers_mask(context, device); ++ rt_mask = find_draw_buffers_mask(context, state); + if (rt_mask != *cur_mask) + { + context_apply_draw_buffers(context, rt_mask); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0061-wined3d-Pass-the-depth-stencil-to-swapchain-present.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0061-wined3d-Pass-the-depth-stencil-to-swapchain-present.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0061-wined3d-Pass-the-depth-stencil-to-swapchain-present.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0061-wined3d-Pass-the-depth-stencil-to-swapchain-present.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,95 @@ +From 7b57d279336b852ad0286bdb865deeba2e55f3eb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Apr 2013 14:52:24 +0200 +Subject: wined3d: Pass the depth stencil to swapchain->present + +TODO: Test if D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL discards the current +DS or the implicit DS. +--- + dlls/wined3d/cs.c | 3 ++- + dlls/wined3d/swapchain.c | 21 ++++++++++----------- + dlls/wined3d/wined3d_private.h | 3 ++- + 3 files changed, 14 insertions(+), 13 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 8b24e73..03e760d 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -429,7 +429,8 @@ static UINT wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data) + wined3d_swapchain_set_window(swapchain, op->dst_window_override); + + swapchain->swapchain_ops->swapchain_present(swapchain, +- src_rect, dst_rect, dirty_region, op->flags); ++ src_rect, dst_rect, dirty_region, op->flags, ++ wined3d_rendertarget_view_get_surface(cs->state.fb.depth_stencil)); + + return sizeof(*op); + } +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index 60504ef..e190892 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -417,11 +417,11 @@ static void swapchain_blit(const struct wined3d_swapchain *swapchain, + } + + static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT *src_rect_in, +- const RECT *dst_rect_in, const RGNDATA *dirty_region, DWORD flags) ++ const RECT *dst_rect_in, const RGNDATA *dirty_region, DWORD flags, ++ struct wined3d_surface *depth_stencil) + { + struct wined3d_surface *back_buffer = surface_from_resource( + wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)); +- const struct wined3d_fb_state *fb = &swapchain->device->state.fb; + const struct wined3d_gl_info *gl_info; + struct wined3d_context *context; + struct wined3d_surface *front; +@@ -574,16 +574,14 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + break; + } + +- if (fb->depth_stencil) ++ if (depth_stencil) + { +- struct wined3d_surface *ds = wined3d_rendertarget_view_get_surface(fb->depth_stencil); +- +- if (ds && (swapchain->desc.flags & WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL +- || ds->flags & SFLAG_DISCARD)) ++ if (swapchain->desc.flags & WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL ++ || depth_stencil->flags & SFLAG_DISCARD) + { +- surface_modify_ds_location(ds, WINED3D_LOCATION_DISCARDED, +- fb->depth_stencil->width, fb->depth_stencil->height); +- if (ds == swapchain->device->onscreen_depth_stencil) ++ surface_modify_ds_location(depth_stencil, WINED3D_LOCATION_DISCARDED, ++ depth_stencil->resource.width, depth_stencil->resource.height); ++ if (depth_stencil == swapchain->device->onscreen_depth_stencil) + { + wined3d_surface_decref(swapchain->device->onscreen_depth_stencil); + swapchain->device->onscreen_depth_stencil = NULL; +@@ -647,7 +645,8 @@ void x11_copy_to_screen(const struct wined3d_swapchain *swapchain, const RECT *r + } + + static void swapchain_gdi_present(struct wined3d_swapchain *swapchain, const RECT *src_rect_in, +- const RECT *dst_rect_in, const RGNDATA *dirty_region, DWORD flags) ++ const RECT *dst_rect_in, const RGNDATA *dirty_region, DWORD flags, ++ struct wined3d_surface *depth_stencil) + { + struct wined3d_surface *front, *back; + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index a16909c..024b55b 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2746,7 +2746,8 @@ struct wined3d_shader_resource_view + struct wined3d_swapchain_ops + { + void (*swapchain_present)(struct wined3d_swapchain *swapchain, const RECT *src_rect, +- const RECT *dst_rect, const RGNDATA *dirty_region, DWORD flags); ++ const RECT *dst_rect, const RGNDATA *dirty_region, DWORD flags, ++ struct wined3d_surface *depth_stencil); + }; + + struct wined3d_swapchain +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0062-wined3d-Don-t-store-viewport-pointers-in-the-command.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0062-wined3d-Don-t-store-viewport-pointers-in-the-command.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0062-wined3d-Don-t-store-viewport-pointers-in-the-command.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0062-wined3d-Don-t-store-viewport-pointers-in-the-command.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,47 @@ +From eb236d88cef3c5c73289c1147466a1cc85657500 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 5 Apr 2013 10:12:06 +0200 +Subject: wined3d: Don't store viewport pointers in the command stream. + +--- + dlls/wined3d/cs.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 03e760d..4b1ed18 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -126,7 +126,7 @@ struct wined3d_cs_set_predication + struct wined3d_cs_set_viewport + { + enum wined3d_cs_op opcode; +- const struct wined3d_viewport *viewport; ++ struct wined3d_viewport viewport; + }; + + struct wined3d_cs_set_scissor_rect +@@ -552,9 +552,10 @@ void wined3d_cs_emit_set_predication(struct wined3d_cs *cs, struct wined3d_query + static UINT wined3d_cs_exec_set_viewport(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_viewport *op = data; ++ struct wined3d_device *device = cs->device; + +- cs->state.viewport = *op->viewport; +- device_invalidate_state(cs->device, STATE_VIEWPORT); ++ cs->state.viewport = op->viewport; ++ device_invalidate_state(device, STATE_VIEWPORT); + + return sizeof(*op); + } +@@ -565,7 +566,7 @@ void wined3d_cs_emit_set_viewport(struct wined3d_cs *cs, const struct wined3d_vi + + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_SET_VIEWPORT; +- op->viewport = viewport; ++ op->viewport = *viewport; + + cs->ops->submit(cs); + } +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0063-wined3d-Keep-track-of-the-onscreen-depth-stencil-in-.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0063-wined3d-Keep-track-of-the-onscreen-depth-stencil-in-.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0063-wined3d-Keep-track-of-the-onscreen-depth-stencil-in-.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0063-wined3d-Keep-track-of-the-onscreen-depth-stencil-in-.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,216 @@ +From 9afc54cc004880662dff5ebe6734d27b11c2e8bc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 5 Apr 2013 14:37:44 +0200 +Subject: wined3d: Keep track of the onscreen depth stencil in the command + stream instead of the device. + +Based on a patch by Henri Verbeet. + +TODO: Not sure if its the right way to go. There are certainly some +missing bits, e.g. accessing the cs via the device in all but one places +defeats the point of this at the moment. + +Since the GL onscreen depth stencil is part of the WGL framebuffer, +which belongs to the swapchain, storing this info in the swapchain might +be the right thing to do. This should help multi-window or multi-head +configurations. +--- + dlls/wined3d/cs.c | 22 +++++++++++++++++++--- + dlls/wined3d/device.c | 35 ++++++++++------------------------- + dlls/wined3d/drawprim.c | 4 ++-- + dlls/wined3d/swapchain.c | 6 +++--- + dlls/wined3d/wined3d_private.h | 10 ++++------ + 5 files changed, 38 insertions(+), 39 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 4b1ed18..236e2f2 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -629,10 +629,10 @@ static UINT wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const + || prev_surface->flags & SFLAG_DISCARD)) + { + surface_modify_ds_location(prev_surface, WINED3D_LOCATION_DISCARDED, prev->width, prev->height); +- if (prev_surface == device->onscreen_depth_stencil) ++ if (prev_surface == cs->onscreen_depth_stencil) + { +- wined3d_surface_decref(device->onscreen_depth_stencil); +- device->onscreen_depth_stencil = NULL; ++ wined3d_surface_decref(cs->onscreen_depth_stencil); ++ cs->onscreen_depth_stencil = NULL; + } + } + } +@@ -1365,6 +1365,22 @@ static void wined3d_cs_emit_stop(struct wined3d_cs *cs) + wined3d_cs_flush(cs); + } + ++void wined3d_cs_switch_onscreen_ds(struct wined3d_cs *cs, ++ struct wined3d_context *context, struct wined3d_surface *depth_stencil) ++{ ++ if (cs->onscreen_depth_stencil) ++ { ++ surface_load_ds_location(cs->onscreen_depth_stencil, context, WINED3D_LOCATION_TEXTURE_RGB); ++ ++ surface_modify_ds_location(cs->onscreen_depth_stencil, WINED3D_LOCATION_TEXTURE_RGB, ++ cs->onscreen_depth_stencil->ds_current_size.cx, ++ cs->onscreen_depth_stencil->ds_current_size.cy); ++ wined3d_surface_decref(cs->onscreen_depth_stencil); ++ } ++ cs->onscreen_depth_stencil = depth_stencil; ++ wined3d_surface_incref(cs->onscreen_depth_stencil); ++} ++ + static DWORD WINAPI wined3d_cs_run(void *thread_param) + { + struct wined3d_cs *cs = thread_param; +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index ee8b418..dfc0619 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -198,22 +198,6 @@ void device_context_remove(struct wined3d_device *device, struct wined3d_context + device->contexts = new_array; + } + +-void device_switch_onscreen_ds(struct wined3d_device *device, +- struct wined3d_context *context, struct wined3d_surface *depth_stencil) +-{ +- if (device->onscreen_depth_stencil) +- { +- surface_load_ds_location(device->onscreen_depth_stencil, context, WINED3D_LOCATION_TEXTURE_RGB); +- +- surface_modify_ds_location(device->onscreen_depth_stencil, WINED3D_LOCATION_TEXTURE_RGB, +- device->onscreen_depth_stencil->ds_current_size.cx, +- device->onscreen_depth_stencil->ds_current_size.cy); +- wined3d_surface_decref(device->onscreen_depth_stencil); +- } +- device->onscreen_depth_stencil = depth_stencil; +- wined3d_surface_incref(device->onscreen_depth_stencil); +-} +- + static BOOL is_full_clear(const struct wined3d_surface *target, const RECT *draw_rect, const RECT *clear_rect) + { + /* partial draw rect */ +@@ -343,8 +327,8 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c + { + DWORD location = render_offscreen ? fb->depth_stencil->resource->draw_binding : WINED3D_LOCATION_DRAWABLE; + +- if (!render_offscreen && depth_stencil != device->onscreen_depth_stencil) +- device_switch_onscreen_ds(device, context, depth_stencil); ++ if (!render_offscreen && depth_stencil != device->cs->onscreen_depth_stencil) ++ wined3d_cs_switch_onscreen_ds(device->cs, context, depth_stencil); + prepare_ds_clear(depth_stencil, context, location, + draw_rect, rect_count, clear_rect, &ds_rect); + } +@@ -1043,11 +1027,12 @@ HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device) + /* Release the buffers (with sanity checks). + * FIXME: Move this move into a separate patch. I think the idea + * behind this is that those surfaces should be freed before unloading +- * remaining resources below. */ +- if (device->onscreen_depth_stencil) ++ * remaining resources below. ++ * FIXME 2: Shouldn't the cs take care of onscreen_depth_stencil? */ ++ if (device->cs->onscreen_depth_stencil) + { +- surface = device->onscreen_depth_stencil; +- device->onscreen_depth_stencil = NULL; ++ surface = device->cs->onscreen_depth_stencil; ++ device->cs->onscreen_depth_stencil = NULL; + wined3d_surface_decref(surface); + } + +@@ -4400,10 +4385,10 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, + state_unbind_resources(&device->state); + } + +- if (device->onscreen_depth_stencil) ++ if (device->cs->onscreen_depth_stencil) + { +- wined3d_surface_decref(device->onscreen_depth_stencil); +- device->onscreen_depth_stencil = NULL; ++ wined3d_surface_decref(device->cs->onscreen_depth_stencil); ++ device->cs->onscreen_depth_stencil = NULL; + } + + if (reset_state) +diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c +index 43d867d..5eb80f0 100644 +--- a/dlls/wined3d/drawprim.c ++++ b/dlls/wined3d/drawprim.c +@@ -644,8 +644,8 @@ void draw_primitive(struct wined3d_device *device, const struct wined3d_state *s + struct wined3d_surface *ds = wined3d_rendertarget_view_get_surface(state->fb.depth_stencil); + RECT current_rect, draw_rect, r; + +- if (!context->render_offscreen && ds != device->onscreen_depth_stencil) +- device_switch_onscreen_ds(device, context, ds); ++ if (!context->render_offscreen && ds != device->cs->onscreen_depth_stencil) ++ wined3d_cs_switch_onscreen_ds(device->cs, context, ds); + + if (ds->resource.locations & location) + SetRect(¤t_rect, 0, 0, ds->ds_current_size.cx, ds->ds_current_size.cy); +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index e190892..fa0c241 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -581,10 +581,10 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + { + surface_modify_ds_location(depth_stencil, WINED3D_LOCATION_DISCARDED, + depth_stencil->resource.width, depth_stencil->resource.height); +- if (depth_stencil == swapchain->device->onscreen_depth_stencil) ++ if (depth_stencil == swapchain->device->cs->onscreen_depth_stencil) + { +- wined3d_surface_decref(swapchain->device->onscreen_depth_stencil); +- swapchain->device->onscreen_depth_stencil = NULL; ++ wined3d_surface_decref(swapchain->device->cs->onscreen_depth_stencil); ++ swapchain->device->cs->onscreen_depth_stencil = NULL; + } + } + } +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 024b55b..e4dbd9d 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2011,14 +2011,11 @@ struct wined3d_device + struct wined3d_rendertarget_view *back_buffer_view; + struct wined3d_swapchain **swapchains; + UINT swapchain_count; ++ struct wined3d_rendertarget_view *auto_depth_stencil_view; + + struct list resources; /* a linked list to track resources created by the device */ + struct list shaders; /* a linked list to track shaders (pixel and vertex) */ + +- /* Render Target Support */ +- struct wined3d_surface *onscreen_depth_stencil; +- struct wined3d_rendertarget_view *auto_depth_stencil_view; +- + /* For rendering to a texture using glCopyTexImage */ + GLuint depth_blt_texture; + +@@ -2060,8 +2057,6 @@ LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL + UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc) DECLSPEC_HIDDEN; + void device_resource_add(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void device_resource_released(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN; +-void device_switch_onscreen_ds(struct wined3d_device *device, struct wined3d_context *context, +- struct wined3d_surface *depth_stencil) DECLSPEC_HIDDEN; + void device_invalidate_state(const struct wined3d_device *device, DWORD state) DECLSPEC_HIDDEN; + + static inline BOOL isStateDirty(const struct wined3d_context *context, DWORD state) +@@ -2556,6 +2551,7 @@ struct wined3d_cs + struct wined3d_state state; + HANDLE thread; + DWORD tls_idx; ++ struct wined3d_surface *onscreen_depth_stencil; + + size_t data_size; + void *data; +@@ -2566,6 +2562,8 @@ struct wined3d_cs + + struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) DECLSPEC_HIDDEN; + void wined3d_cs_destroy(struct wined3d_cs *cs) DECLSPEC_HIDDEN; ++void wined3d_cs_switch_onscreen_ds(struct wined3d_cs *cs, struct wined3d_context *context, ++ struct wined3d_surface *depth_stencil) DECLSPEC_HIDDEN; + + void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *rects, + DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0064-wined3d-Send-base-vertex-index-updates-through-the-c.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0064-wined3d-Send-base-vertex-index-updates-through-the-c.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0064-wined3d-Send-base-vertex-index-updates-through-the-c.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0064-wined3d-Send-base-vertex-index-updates-through-the-c.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,178 @@ +From 4b5e47ede0b1ac538b6439e8b1888e4da542ceee Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 7 Apr 2013 17:33:20 +0200 +Subject: wined3d: Send base vertex index updates through the cs + +--- + dlls/wined3d/cs.c | 49 ++++++++++++++++++++++++++++++++++++++---- + dlls/wined3d/device.c | 17 +++------------ + dlls/wined3d/wined3d_private.h | 2 ++ + 3 files changed, 50 insertions(+), 18 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 236e2f2..0525a59 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -66,6 +66,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_SET_VS_CONSTS_F, + WINED3D_CS_OP_SET_PS_CONSTS_F, + WINED3D_CS_OP_GLFINISH, ++ WINED3D_CS_OP_SET_BASE_VERTEX_INDEX, + WINED3D_CS_OP_STOP, + }; + +@@ -290,6 +291,12 @@ struct wined3d_cs_finish + enum wined3d_cs_op opcode; + }; + ++struct wined3d_cs_set_base_vertex_index ++{ ++ enum wined3d_cs_op opcode; ++ UINT base_vertex_index; ++}; ++ + /* FIXME: The list synchronization probably isn't particularly fast. */ + static void wined3d_cs_list_enqueue(struct wined3d_cs_list *list, struct wined3d_cs_block *block) + { +@@ -504,6 +511,21 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT * + static UINT wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_draw *op = data; ++ const struct wined3d_gl_info *gl_info = &cs->device->adapter->gl_info; ++ ++ if (op->indexed && !gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX]) ++ { ++ if (cs->state.load_base_vertex_index != cs->state.base_vertex_index) ++ { ++ cs->state.load_base_vertex_index = cs->state.base_vertex_index; ++ device_invalidate_state(cs->device, STATE_BASEVERTEXINDEX); ++ } ++ } ++ else if (cs->state.load_base_vertex_index) ++ { ++ cs->state.load_base_vertex_index = 0; ++ device_invalidate_state(cs->device, STATE_BASEVERTEXINDEX); ++ } + + draw_primitive(cs->device, &cs->state, op->start_idx, op->index_count, + op->start_instance, op->instance_count, op->indexed); +@@ -931,8 +953,6 @@ static UINT wined3d_cs_exec_transfer_stateblock(struct wined3d_cs *cs, const voi + /* Don't memcpy the entire struct, we'll remove single items as we add dedicated + * ops for setting states */ + +- cs->state.base_vertex_index = op->state.base_vertex_index; +- cs->state.load_base_vertex_index = op->state.load_base_vertex_index; + cs->state.gl_primitive_type = op->state.gl_primitive_type; + + memcpy(cs->state.vs_consts_b, op->state.vs_consts_b, sizeof(cs->state.vs_consts_b)); +@@ -955,8 +975,6 @@ void wined3d_cs_emit_transfer_stateblock(struct wined3d_cs *cs, const struct win + + /* Don't memcpy the entire struct, we'll remove single items as we add dedicated + * ops for setting states */ +- op->state.base_vertex_index = state->base_vertex_index; +- op->state.load_base_vertex_index = state->load_base_vertex_index; + op->state.gl_primitive_type = state->gl_primitive_type; + + memcpy(op->state.vs_consts_b, state->vs_consts_b, sizeof(op->state.vs_consts_b)); +@@ -1281,6 +1299,28 @@ void wined3d_cs_emit_glfinish(struct wined3d_cs *cs) + cs->ops->submit(cs); + } + ++static UINT wined3d_cs_exec_set_base_vertex_index(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_base_vertex_index *op = data; ++ ++ cs->state.base_vertex_index = op->base_vertex_index; ++ device_invalidate_state(cs->device, STATE_BASEVERTEXINDEX); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_set_base_vertex_index(struct wined3d_cs *cs, ++ UINT base_vertex_index) ++{ ++ struct wined3d_cs_set_base_vertex_index *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_BASE_VERTEX_INDEX; ++ op->base_vertex_index = base_vertex_index; ++ ++ cs->ops->submit(cs); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_FENCE */ wined3d_cs_exec_fence, +@@ -1313,6 +1353,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_SET_VS_CONSTS_F */ wined3d_cs_exec_set_vs_consts_f, + /* WINED3D_CS_OP_SET_PS_CONSTS_F */ wined3d_cs_exec_set_ps_consts_f, + /* WINED3D_CS_OP_GLFINISH */ wined3d_cs_exec_glfinish, ++ /* WINED3D_CS_OP_SET_BASE_VERTEX_INDEX */ wined3d_cs_exec_set_base_vertex_index, + }; + + static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index dfc0619..a80784b 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -1830,6 +1830,9 @@ void CDECL wined3d_device_set_base_vertex_index(struct wined3d_device *device, I + TRACE("device %p, base_index %d.\n", device, base_index); + + device->update_state->base_vertex_index = base_index; ++ ++ if (!device->recording) ++ wined3d_cs_emit_set_base_vertex_index(device->cs, base_index); + } + + INT CDECL wined3d_device_get_base_vertex_index(const struct wined3d_device *device) +@@ -3377,12 +3380,6 @@ HRESULT CDECL wined3d_device_draw_primitive(struct wined3d_device *device, UINT + return WINED3DERR_INVALIDCALL; + } + +- if (device->state.load_base_vertex_index) +- { +- device->state.load_base_vertex_index = 0; +- device_invalidate_state(device, STATE_BASEVERTEXINDEX); +- } +- + wined3d_cs_emit_transfer_stateblock(device->cs, &device->state); + wined3d_cs_emit_draw(device->cs, start_vertex, vertex_count, 0, 0, FALSE); + +@@ -3391,8 +3388,6 @@ HRESULT CDECL wined3d_device_draw_primitive(struct wined3d_device *device, UINT + + HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *device, UINT start_idx, UINT index_count) + { +- const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; +- + TRACE("device %p, start_idx %u, index_count %u.\n", device, start_idx, index_count); + + if (!device->state.index_buffer) +@@ -3411,12 +3406,6 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *devic + return WINED3DERR_INVALIDCALL; + } + +- if (!gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX] && +- device->state.load_base_vertex_index != device->state.base_vertex_index) +- { +- device->state.load_base_vertex_index = device->state.base_vertex_index; +- device_invalidate_state(device, STATE_BASEVERTEXINDEX); +- } + + wined3d_cs_emit_transfer_stateblock(device->cs, &device->state); + wined3d_cs_emit_draw(device->cs, start_idx, index_count, 0, 0, TRUE); +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index e4dbd9d..382c120 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2616,6 +2616,8 @@ void wined3d_cs_emit_set_viewport(struct wined3d_cs *cs, const struct wined3d_vi + void wined3d_cs_emit_set_consts_f(struct wined3d_cs *cs, UINT start_register, const float *constants, + UINT vector4f_count, enum wined3d_shader_type type) DECLSPEC_HIDDEN; + void wined3d_cs_emit_glfinish(struct wined3d_cs *cs) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_set_base_vertex_index(struct wined3d_cs *cs, ++ UINT base_vertex_index) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0065-wined3d-Send-primitive-type-updates-through-the-comm.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0065-wined3d-Send-primitive-type-updates-through-the-comm.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0065-wined3d-Send-primitive-type-updates-through-the-comm.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0065-wined3d-Send-primitive-type-updates-through-the-comm.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,151 @@ +From a322b70c446dcd49facd2c6987a70b289c4678d1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 7 Apr 2013 17:53:43 +0200 +Subject: wined3d: Send primitive type updates through the command stream + +--- + dlls/wined3d/cs.c | 39 ++++++++++++++++++++++++++++++++++----- + dlls/wined3d/device.c | 5 ++--- + dlls/wined3d/stateblock.c | 4 ++-- + dlls/wined3d/wined3d_private.h | 2 ++ + 4 files changed, 40 insertions(+), 10 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 0525a59..a7ba2b4 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -67,6 +67,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_SET_PS_CONSTS_F, + WINED3D_CS_OP_GLFINISH, + WINED3D_CS_OP_SET_BASE_VERTEX_INDEX, ++ WINED3D_CS_OP_SET_PRIMITIVE_TYPE, + WINED3D_CS_OP_STOP, + }; + +@@ -297,6 +298,12 @@ struct wined3d_cs_set_base_vertex_index + UINT base_vertex_index; + }; + ++struct wined3d_cs_set_primitive_type ++{ ++ enum wined3d_cs_op opcode; ++ GLenum gl_primitive_type; ++}; ++ + /* FIXME: The list synchronization probably isn't particularly fast. */ + static void wined3d_cs_list_enqueue(struct wined3d_cs_list *list, struct wined3d_cs_block *block) + { +@@ -952,9 +959,6 @@ static UINT wined3d_cs_exec_transfer_stateblock(struct wined3d_cs *cs, const voi + + /* Don't memcpy the entire struct, we'll remove single items as we add dedicated + * ops for setting states */ +- +- cs->state.gl_primitive_type = op->state.gl_primitive_type; +- + memcpy(cs->state.vs_consts_b, op->state.vs_consts_b, sizeof(cs->state.vs_consts_b)); + memcpy(cs->state.vs_consts_i, op->state.vs_consts_i, sizeof(cs->state.vs_consts_i)); + +@@ -975,8 +979,6 @@ void wined3d_cs_emit_transfer_stateblock(struct wined3d_cs *cs, const struct win + + /* Don't memcpy the entire struct, we'll remove single items as we add dedicated + * ops for setting states */ +- op->state.gl_primitive_type = state->gl_primitive_type; +- + memcpy(op->state.vs_consts_b, state->vs_consts_b, sizeof(op->state.vs_consts_b)); + memcpy(op->state.vs_consts_i, state->vs_consts_i, sizeof(op->state.vs_consts_i)); + +@@ -1321,6 +1323,32 @@ void wined3d_cs_emit_set_base_vertex_index(struct wined3d_cs *cs, + cs->ops->submit(cs); + } + ++static UINT wined3d_cs_exec_set_primitive_type(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_primitive_type *op = data; ++ GLenum prev; ++ ++ prev = cs->state.gl_primitive_type; ++ ++ if (op->gl_primitive_type == GL_POINTS || prev == GL_POINTS) ++ device_invalidate_state(cs->device, STATE_POINT_SIZE_ENABLE); ++ ++ cs->state.gl_primitive_type = op->gl_primitive_type; ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_set_primitive_type(struct wined3d_cs *cs, GLenum primitive_type) ++{ ++ struct wined3d_cs_set_primitive_type *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_PRIMITIVE_TYPE; ++ op->gl_primitive_type = primitive_type; ++ ++ cs->ops->submit(cs); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_FENCE */ wined3d_cs_exec_fence, +@@ -1354,6 +1382,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_SET_PS_CONSTS_F */ wined3d_cs_exec_set_ps_consts_f, + /* WINED3D_CS_OP_GLFINISH */ wined3d_cs_exec_glfinish, + /* WINED3D_CS_OP_SET_BASE_VERTEX_INDEX */ wined3d_cs_exec_set_base_vertex_index, ++ /* WINED3D_CS_OP_SET_PRIMITIVE_TYPE */ wined3d_cs_exec_set_primitive_type, + }; + + static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index a80784b..e87a52c 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -3348,7 +3348,6 @@ void CDECL wined3d_device_set_primitive_type(struct wined3d_device *device, + enum wined3d_primitive_type primitive_type) + { + GLenum gl_primitive_type, prev; +- + TRACE("device %p, primitive_type %s\n", device, debug_d3dprimitivetype(primitive_type)); + + gl_primitive_type = gl_primitive_type_from_d3d(primitive_type); +@@ -3356,8 +3355,8 @@ void CDECL wined3d_device_set_primitive_type(struct wined3d_device *device, + device->update_state->gl_primitive_type = gl_primitive_type; + if (device->recording) + device->recording->changed.primitive_type = TRUE; +- else if (gl_primitive_type != prev && (gl_primitive_type == GL_POINTS || prev == GL_POINTS)) +- device_invalidate_state(device, STATE_POINT_SIZE_ENABLE); ++ else if (gl_primitive_type != prev) ++ wined3d_cs_emit_set_primitive_type(device->cs, gl_primitive_type); + } + + void CDECL wined3d_device_get_primitive_type(const struct wined3d_device *device, +diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c +index 141e539..606134c 100644 +--- a/dlls/wined3d/stateblock.c ++++ b/dlls/wined3d/stateblock.c +@@ -1075,8 +1075,8 @@ void CDECL wined3d_stateblock_apply(const struct wined3d_stateblock *stateblock) + gl_primitive_type = stateblock->state.gl_primitive_type; + prev = device->update_state->gl_primitive_type; + device->update_state->gl_primitive_type = gl_primitive_type; +- if (gl_primitive_type != prev && (gl_primitive_type == GL_POINTS || prev == GL_POINTS)) +- device_invalidate_state(device, STATE_POINT_SIZE_ENABLE); ++ if (gl_primitive_type != prev) ++ wined3d_cs_emit_set_primitive_type(device->cs, gl_primitive_type); + } + + if (stateblock->changed.indices) +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 382c120..a647ca9 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2618,6 +2618,8 @@ void wined3d_cs_emit_set_consts_f(struct wined3d_cs *cs, UINT start_register, co + void wined3d_cs_emit_glfinish(struct wined3d_cs *cs) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_base_vertex_index(struct wined3d_cs *cs, + UINT base_vertex_index) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_set_primitive_type(struct wined3d_cs *cs, ++ GLenum primitive_type) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0066-wined3d-Send-bool-constant-updates-through-the-comma.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0066-wined3d-Send-bool-constant-updates-through-the-comma.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0066-wined3d-Send-bool-constant-updates-through-the-comma.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0066-wined3d-Send-bool-constant-updates-through-the-comma.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,192 @@ +From 870ae689d58feb0e2c28603ab7a5c202dc1bf6c2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 9 Apr 2013 21:50:30 +0200 +Subject: wined3d: Send bool constant updates through the command stream + +--- + dlls/wined3d/cs.c | 72 +++++++++++++++++++++++++++++++++++++++--- + dlls/wined3d/device.c | 8 +++-- + dlls/wined3d/wined3d_private.h | 3 ++ + 3 files changed, 76 insertions(+), 7 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index a7ba2b4..9d8491a 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -64,7 +64,9 @@ enum wined3d_cs_op + WINED3D_CS_OP_RESET_STATE, + WINED3D_CS_OP_STATEBLOCK, + WINED3D_CS_OP_SET_VS_CONSTS_F, ++ WINED3D_CS_OP_SET_VS_CONSTS_B, + WINED3D_CS_OP_SET_PS_CONSTS_F, ++ WINED3D_CS_OP_SET_PS_CONSTS_B, + WINED3D_CS_OP_GLFINISH, + WINED3D_CS_OP_SET_BASE_VERTEX_INDEX, + WINED3D_CS_OP_SET_PRIMITIVE_TYPE, +@@ -287,6 +289,13 @@ struct wined3d_cs_set_consts_f + float constants[4]; + }; + ++struct wined3d_cs_set_consts_b ++{ ++ enum wined3d_cs_op opcode; ++ UINT start_register, bool_count; ++ BOOL constants[1]; ++}; ++ + struct wined3d_cs_finish + { + enum wined3d_cs_op opcode; +@@ -959,10 +968,8 @@ static UINT wined3d_cs_exec_transfer_stateblock(struct wined3d_cs *cs, const voi + + /* Don't memcpy the entire struct, we'll remove single items as we add dedicated + * ops for setting states */ +- memcpy(cs->state.vs_consts_b, op->state.vs_consts_b, sizeof(cs->state.vs_consts_b)); + memcpy(cs->state.vs_consts_i, op->state.vs_consts_i, sizeof(cs->state.vs_consts_i)); + +- memcpy(cs->state.ps_consts_b, op->state.ps_consts_b, sizeof(cs->state.ps_consts_b)); + memcpy(cs->state.ps_consts_i, op->state.ps_consts_i, sizeof(cs->state.ps_consts_i)); + + memcpy(cs->state.lights, op->state.lights, sizeof(cs->state.lights)); +@@ -979,10 +986,8 @@ void wined3d_cs_emit_transfer_stateblock(struct wined3d_cs *cs, const struct win + + /* Don't memcpy the entire struct, we'll remove single items as we add dedicated + * ops for setting states */ +- memcpy(op->state.vs_consts_b, state->vs_consts_b, sizeof(op->state.vs_consts_b)); + memcpy(op->state.vs_consts_i, state->vs_consts_i, sizeof(op->state.vs_consts_i)); + +- memcpy(op->state.ps_consts_b, state->ps_consts_b, sizeof(op->state.ps_consts_b)); + memcpy(op->state.ps_consts_i, state->ps_consts_i, sizeof(op->state.ps_consts_i)); + + /* FIXME: This is not ideal. CS is still running synchronously, so this is ok. +@@ -1137,6 +1142,63 @@ void wined3d_cs_emit_set_render_state(struct wined3d_cs *cs, enum wined3d_render + op->value = value; + + cs->ops->submit(cs); ++}; ++ ++static UINT wined3d_cs_exec_set_vs_consts_b(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_consts_b *op = data; ++ struct wined3d_device *device = cs->device; ++ ++ memcpy(&cs->state.vs_consts_b[op->start_register], op->constants, ++ sizeof(*cs->state.vs_consts_b) * op->bool_count); ++ ++ device_invalidate_shader_constants(device, WINED3D_SHADER_CONST_VS_B); ++ ++ return sizeof(*op) + sizeof(op->constants) * (op->bool_count - 1); ++} ++ ++static UINT wined3d_cs_exec_set_ps_consts_b(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_consts_b *op = data; ++ struct wined3d_device *device = cs->device; ++ ++ memcpy(&cs->state.ps_consts_b[op->start_register], op->constants, ++ sizeof(*cs->state.ps_consts_b) * op->bool_count); ++ ++ device_invalidate_shader_constants(device, WINED3D_SHADER_CONST_PS_B); ++ ++ return sizeof(*op) + sizeof(op->constants) * (op->bool_count - 1); ++} ++ ++void wined3d_cs_emit_set_consts_b(struct wined3d_cs *cs, UINT start_register, ++ const BOOL *constants, UINT bool_count, enum wined3d_shader_type type) ++{ ++ struct wined3d_cs_set_consts_b *op; ++ UINT extra_space = bool_count - 1; ++ ++ op = cs->ops->require_space(cs, sizeof(*op) + sizeof(op->constants) * extra_space); ++ switch (type) ++ { ++ case WINED3D_SHADER_TYPE_PIXEL: ++ op->opcode = WINED3D_CS_OP_SET_PS_CONSTS_B; ++ break; ++ ++ case WINED3D_SHADER_TYPE_VERTEX: ++ op->opcode = WINED3D_CS_OP_SET_VS_CONSTS_B; ++ break; ++ ++ case WINED3D_SHADER_TYPE_GEOMETRY: ++ FIXME("Invalid for geometry shaders\n"); ++ return; ++ ++ case WINED3D_SHADER_TYPE_COUNT: ++ break; ++ } ++ op->start_register = start_register; ++ op->bool_count = bool_count; ++ memcpy(op->constants, constants, sizeof(op->constants) * bool_count); ++ ++ cs->ops->submit(cs); + } + + static UINT wined3d_cs_exec_set_texture_state(struct wined3d_cs *cs, const void *data) +@@ -1379,7 +1441,9 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_RESET_STATE */ wined3d_cs_exec_reset_state, + /* WINED3D_CS_OP_STATEBLOCK */ wined3d_cs_exec_transfer_stateblock, + /* WINED3D_CS_OP_SET_VS_CONSTS_F */ wined3d_cs_exec_set_vs_consts_f, ++ /* WINED3D_CS_OP_SET_VS_CONSTS_B */ wined3d_cs_exec_set_vs_consts_b, + /* WINED3D_CS_OP_SET_PS_CONSTS_F */ wined3d_cs_exec_set_ps_consts_f, ++ /* WINED3D_CS_OP_SET_PS_CONSTS_B */ wined3d_cs_exec_set_ps_consts_b, + /* WINED3D_CS_OP_GLFINISH */ wined3d_cs_exec_glfinish, + /* WINED3D_CS_OP_SET_BASE_VERTEX_INDEX */ wined3d_cs_exec_set_base_vertex_index, + /* WINED3D_CS_OP_SET_PRIMITIVE_TYPE */ wined3d_cs_exec_set_primitive_type, +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index e87a52c..14d3080 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -2197,7 +2197,7 @@ struct wined3d_sampler * CDECL wined3d_device_get_vs_sampler(const struct wined3 + return device->state.sampler[WINED3D_SHADER_TYPE_VERTEX][idx]; + } + +-static void device_invalidate_shader_constants(const struct wined3d_device *device, DWORD mask) ++void device_invalidate_shader_constants(const struct wined3d_device *device, DWORD mask) + { + UINT i; + +@@ -2230,7 +2230,8 @@ HRESULT CDECL wined3d_device_set_vs_consts_b(struct wined3d_device *device, + } + else + { +- device_invalidate_shader_constants(device, WINED3D_SHADER_CONST_VS_B); ++ wined3d_cs_emit_set_consts_b(device->cs, start_register, constants, ++ bool_count, WINED3D_SHADER_TYPE_VERTEX); + } + + return WINED3D_OK; +@@ -2464,7 +2465,8 @@ HRESULT CDECL wined3d_device_set_ps_consts_b(struct wined3d_device *device, + } + else + { +- device_invalidate_shader_constants(device, WINED3D_SHADER_CONST_PS_B); ++ wined3d_cs_emit_set_consts_b(device->cs, start_register, constants, ++ bool_count, WINED3D_SHADER_TYPE_PIXEL); + } + + return WINED3D_OK; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index a647ca9..4ecb626 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2058,6 +2058,7 @@ LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL + void device_resource_add(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void device_resource_released(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void device_invalidate_state(const struct wined3d_device *device, DWORD state) DECLSPEC_HIDDEN; ++void device_invalidate_shader_constants(const struct wined3d_device *device, DWORD mask) DECLSPEC_HIDDEN; + + static inline BOOL isStateDirty(const struct wined3d_context *context, DWORD state) + { +@@ -2615,6 +2616,8 @@ void wined3d_cs_emit_set_vertex_declaration(struct wined3d_cs *cs, + void wined3d_cs_emit_set_viewport(struct wined3d_cs *cs, const struct wined3d_viewport *viewport) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_consts_f(struct wined3d_cs *cs, UINT start_register, const float *constants, + UINT vector4f_count, enum wined3d_shader_type type) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_set_consts_b(struct wined3d_cs *cs, UINT start_register, ++ const BOOL *constants, UINT bool_count, enum wined3d_shader_type type) DECLSPEC_HIDDEN; + void wined3d_cs_emit_glfinish(struct wined3d_cs *cs) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_base_vertex_index(struct wined3d_cs *cs, + UINT base_vertex_index) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0067-wined3d-Send-int-constant-updates-through-the-comman.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0067-wined3d-Send-int-constant-updates-through-the-comman.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0067-wined3d-Send-int-constant-updates-through-the-comman.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0067-wined3d-Send-int-constant-updates-through-the-comman.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,175 @@ +From 68141ab2e84252e99bcf6801a5bcc629b1494665 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 10 Apr 2013 14:20:47 +0200 +Subject: wined3d: Send int constant updates through the command stream + +--- + dlls/wined3d/cs.c | 74 ++++++++++++++++++++++++++++++++++++++---- + dlls/wined3d/device.c | 6 ++-- + dlls/wined3d/wined3d_private.h | 2 ++ + 3 files changed, 74 insertions(+), 8 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 9d8491a..cf3a523 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -65,8 +65,10 @@ enum wined3d_cs_op + WINED3D_CS_OP_STATEBLOCK, + WINED3D_CS_OP_SET_VS_CONSTS_F, + WINED3D_CS_OP_SET_VS_CONSTS_B, ++ WINED3D_CS_OP_SET_VS_CONSTS_I, + WINED3D_CS_OP_SET_PS_CONSTS_F, + WINED3D_CS_OP_SET_PS_CONSTS_B, ++ WINED3D_CS_OP_SET_PS_CONSTS_I, + WINED3D_CS_OP_GLFINISH, + WINED3D_CS_OP_SET_BASE_VERTEX_INDEX, + WINED3D_CS_OP_SET_PRIMITIVE_TYPE, +@@ -296,6 +298,13 @@ struct wined3d_cs_set_consts_b + BOOL constants[1]; + }; + ++struct wined3d_cs_set_consts_i ++{ ++ enum wined3d_cs_op opcode; ++ UINT start_register, vector4i_count; ++ int constants[4]; ++}; ++ + struct wined3d_cs_finish + { + enum wined3d_cs_op opcode; +@@ -968,9 +977,6 @@ static UINT wined3d_cs_exec_transfer_stateblock(struct wined3d_cs *cs, const voi + + /* Don't memcpy the entire struct, we'll remove single items as we add dedicated + * ops for setting states */ +- memcpy(cs->state.vs_consts_i, op->state.vs_consts_i, sizeof(cs->state.vs_consts_i)); +- +- memcpy(cs->state.ps_consts_i, op->state.ps_consts_i, sizeof(cs->state.ps_consts_i)); + + memcpy(cs->state.lights, op->state.lights, sizeof(cs->state.lights)); + +@@ -986,9 +992,6 @@ void wined3d_cs_emit_transfer_stateblock(struct wined3d_cs *cs, const struct win + + /* Don't memcpy the entire struct, we'll remove single items as we add dedicated + * ops for setting states */ +- memcpy(op->state.vs_consts_i, state->vs_consts_i, sizeof(op->state.vs_consts_i)); +- +- memcpy(op->state.ps_consts_i, state->ps_consts_i, sizeof(op->state.ps_consts_i)); + + /* FIXME: This is not ideal. CS is still running synchronously, so this is ok. + * It will go away soon anyway. */ +@@ -1201,6 +1204,63 @@ void wined3d_cs_emit_set_consts_b(struct wined3d_cs *cs, UINT start_register, + cs->ops->submit(cs); + } + ++static UINT wined3d_cs_exec_set_vs_consts_i(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_consts_i *op = data; ++ struct wined3d_device *device = cs->device; ++ ++ memcpy(&cs->state.vs_consts_i[op->start_register * 4], op->constants, ++ sizeof(*cs->state.vs_consts_i) * 4 * op->vector4i_count); ++ ++ device_invalidate_shader_constants(device, WINED3D_SHADER_CONST_VS_I); ++ ++ return sizeof(*op) + sizeof(op->constants) * (op->vector4i_count - 1); ++} ++ ++static UINT wined3d_cs_exec_set_ps_consts_i(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_consts_i *op = data; ++ struct wined3d_device *device = cs->device; ++ ++ memcpy(&cs->state.ps_consts_i[op->start_register * 4], op->constants, ++ sizeof(*cs->state.ps_consts_i) * 4 * op->vector4i_count); ++ ++ device_invalidate_shader_constants(device, WINED3D_SHADER_CONST_PS_I); ++ ++ return sizeof(*op) + sizeof(op->constants) * (op->vector4i_count - 1); ++} ++ ++void wined3d_cs_emit_set_consts_i(struct wined3d_cs *cs, UINT start_register, ++ const int *constants, UINT vector4i_count, enum wined3d_shader_type type) ++{ ++ struct wined3d_cs_set_consts_i *op; ++ UINT extra_space = vector4i_count - 1; ++ ++ op = cs->ops->require_space(cs, sizeof(*op) + sizeof(op->constants) * extra_space); ++ switch (type) ++ { ++ case WINED3D_SHADER_TYPE_PIXEL: ++ op->opcode = WINED3D_CS_OP_SET_PS_CONSTS_I; ++ break; ++ ++ case WINED3D_SHADER_TYPE_VERTEX: ++ op->opcode = WINED3D_CS_OP_SET_VS_CONSTS_I; ++ break; ++ ++ case WINED3D_SHADER_TYPE_GEOMETRY: ++ ERR("Invalid for geometry shaders\n"); ++ return; ++ ++ case WINED3D_SHADER_TYPE_COUNT: ++ break; ++ } ++ op->start_register = start_register; ++ op->vector4i_count = vector4i_count; ++ memcpy(op->constants, constants, sizeof(op->constants) * vector4i_count); ++ ++ cs->ops->submit(cs); ++} ++ + static UINT wined3d_cs_exec_set_texture_state(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_texture_state *op = data; +@@ -1442,8 +1502,10 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_STATEBLOCK */ wined3d_cs_exec_transfer_stateblock, + /* WINED3D_CS_OP_SET_VS_CONSTS_F */ wined3d_cs_exec_set_vs_consts_f, + /* WINED3D_CS_OP_SET_VS_CONSTS_B */ wined3d_cs_exec_set_vs_consts_b, ++ /* WINED3D_CS_OP_SET_VS_CONSTS_I */ wined3d_cs_exec_set_vs_consts_i, + /* WINED3D_CS_OP_SET_PS_CONSTS_F */ wined3d_cs_exec_set_ps_consts_f, + /* WINED3D_CS_OP_SET_PS_CONSTS_B */ wined3d_cs_exec_set_ps_consts_b, ++ /* WINED3D_CS_OP_SET_PS_CONSTS_I */ wined3d_cs_exec_set_ps_consts_i, + /* WINED3D_CS_OP_GLFINISH */ wined3d_cs_exec_glfinish, + /* WINED3D_CS_OP_SET_BASE_VERTEX_INDEX */ wined3d_cs_exec_set_base_vertex_index, + /* WINED3D_CS_OP_SET_PRIMITIVE_TYPE */ wined3d_cs_exec_set_primitive_type, +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 14d3080..9ba40df 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -2278,7 +2278,8 @@ HRESULT CDECL wined3d_device_set_vs_consts_i(struct wined3d_device *device, + } + else + { +- device_invalidate_shader_constants(device, WINED3D_SHADER_CONST_VS_I); ++ wined3d_cs_emit_set_consts_i(device->cs, start_register, constants, ++ vector4i_count, WINED3D_SHADER_TYPE_VERTEX); + } + + return WINED3D_OK; +@@ -2513,7 +2514,8 @@ HRESULT CDECL wined3d_device_set_ps_consts_i(struct wined3d_device *device, + } + else + { +- device_invalidate_shader_constants(device, WINED3D_SHADER_CONST_PS_I); ++ wined3d_cs_emit_set_consts_i(device->cs, start_register, constants, ++ vector4i_count, WINED3D_SHADER_TYPE_PIXEL); + } + + return WINED3D_OK; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 4ecb626..59149bd 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2618,6 +2618,8 @@ void wined3d_cs_emit_set_consts_f(struct wined3d_cs *cs, UINT start_register, co + UINT vector4f_count, enum wined3d_shader_type type) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_consts_b(struct wined3d_cs *cs, UINT start_register, + const BOOL *constants, UINT bool_count, enum wined3d_shader_type type) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_set_consts_i(struct wined3d_cs *cs, UINT start_register, ++ const int *constants, UINT vector4i_count, enum wined3d_shader_type type) DECLSPEC_HIDDEN; + void wined3d_cs_emit_glfinish(struct wined3d_cs *cs) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_base_vertex_index(struct wined3d_cs *cs, + UINT base_vertex_index) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0068-wined3d-Send-light-updates-through-the-command-strea.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0068-wined3d-Send-light-updates-through-the-command-strea.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0068-wined3d-Send-light-updates-through-the-command-strea.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0068-wined3d-Send-light-updates-through-the-command-strea.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,394 @@ +From 8ca77cbd15b2c770395d2f8d4dfc7d1eb05fc131 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 10 Apr 2013 17:16:02 +0200 +Subject: wined3d: Send light updates through the command stream + +--- + dlls/wined3d/cs.c | 200 +++++++++++++++++++++++++++++++++-------- + dlls/wined3d/device.c | 31 ++----- + dlls/wined3d/wined3d_private.h | 8 +- + 3 files changed, 174 insertions(+), 65 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index cf3a523..f48d14a 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -62,7 +62,6 @@ enum wined3d_cs_op + WINED3D_CS_OP_SET_CLIP_PLANE, + WINED3D_CS_OP_SET_MATERIAL, + WINED3D_CS_OP_RESET_STATE, +- WINED3D_CS_OP_STATEBLOCK, + WINED3D_CS_OP_SET_VS_CONSTS_F, + WINED3D_CS_OP_SET_VS_CONSTS_B, + WINED3D_CS_OP_SET_VS_CONSTS_I, +@@ -72,6 +71,8 @@ enum wined3d_cs_op + WINED3D_CS_OP_GLFINISH, + WINED3D_CS_OP_SET_BASE_VERTEX_INDEX, + WINED3D_CS_OP_SET_PRIMITIVE_TYPE, ++ WINED3D_CS_OP_SET_LIGHT, ++ WINED3D_CS_OP_SET_LIGHT_ENABLE, + WINED3D_CS_OP_STOP, + }; + +@@ -278,12 +279,6 @@ struct wined3d_cs_reset_state + enum wined3d_cs_op opcode; + }; + +-struct wined3d_cs_stateblock +-{ +- enum wined3d_cs_op opcode; +- struct wined3d_state state; +-}; +- + struct wined3d_cs_set_consts_f + { + enum wined3d_cs_op opcode; +@@ -322,6 +317,19 @@ struct wined3d_cs_set_primitive_type + GLenum gl_primitive_type; + }; + ++struct wined3d_cs_set_light ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_light_info light; ++}; ++ ++struct wined3d_cs_set_light_enable ++{ ++ enum wined3d_cs_op opcode; ++ UINT idx; ++ BOOL enable; ++}; ++ + /* FIXME: The list synchronization probably isn't particularly fast. */ + static void wined3d_cs_list_enqueue(struct wined3d_cs_list *list, struct wined3d_cs_block *block) + { +@@ -971,35 +979,6 @@ void wined3d_cs_emit_set_texture(struct wined3d_cs *cs, UINT stage, struct wined + cs->ops->submit(cs); + } + +-static UINT wined3d_cs_exec_transfer_stateblock(struct wined3d_cs *cs, const void *data) +-{ +- const struct wined3d_cs_stateblock *op = data; +- +- /* Don't memcpy the entire struct, we'll remove single items as we add dedicated +- * ops for setting states */ +- +- memcpy(cs->state.lights, op->state.lights, sizeof(cs->state.lights)); +- +- return sizeof(*op); +-} +- +-void wined3d_cs_emit_transfer_stateblock(struct wined3d_cs *cs, const struct wined3d_state *state) +-{ +- struct wined3d_cs_stateblock *op; +- +- op = cs->ops->require_space(cs, sizeof(*op)); +- op->opcode = WINED3D_CS_OP_STATEBLOCK; +- +- /* Don't memcpy the entire struct, we'll remove single items as we add dedicated +- * ops for setting states */ +- +- /* FIXME: This is not ideal. CS is still running synchronously, so this is ok. +- * It will go away soon anyway. */ +- memcpy(op->state.lights, state->lights, sizeof(op->state.lights)); +- +- cs->ops->submit(cs); +-} +- + static UINT wined3d_cs_exec_set_shader_resource_view(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_set_shader_resource_view *op = data; +@@ -1471,6 +1450,152 @@ void wined3d_cs_emit_set_primitive_type(struct wined3d_cs *cs, GLenum primitive_ + cs->ops->submit(cs); + } + ++static UINT wined3d_cs_exec_set_light(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_light *op = data; ++ ++ UINT light_idx = op->light.OriginalIndex; ++ UINT hash_idx = LIGHTMAP_HASHFUNC(op->light.OriginalIndex); ++ struct wined3d_light_info *object = NULL; ++ struct list *e; ++ ++ LIST_FOR_EACH(e, &cs->state.light_map[hash_idx]) ++ { ++ object = LIST_ENTRY(e, struct wined3d_light_info, entry); ++ if (object->OriginalIndex == light_idx) ++ break; ++ object = NULL; ++ } ++ ++ if (!object) ++ { ++ TRACE("Adding new light\n"); ++ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); ++ if (!object) ++ return E_OUTOFMEMORY; ++ ++ list_add_head(&cs->state.light_map[hash_idx], &object->entry); ++ object->glIndex = -1; ++ object->OriginalIndex = light_idx; ++ } ++ ++ object->OriginalParms = op->light.OriginalParms; ++ memcpy(object->lightPosn, op->light.lightPosn, sizeof(object->lightPosn)); ++ memcpy(object->lightDirn, op->light.lightDirn, sizeof(object->lightDirn)); ++ object->exponent = op->light.exponent; ++ object->cutoff = op->light.cutoff; ++ ++ /* Update the live definitions if the light is currently assigned a glIndex. */ ++ if (object->glIndex != -1) ++ { ++ if (object->OriginalParms.type != op->light.OriginalParms.type) ++ device_invalidate_state(cs->device, STATE_LIGHT_TYPE); ++ device_invalidate_state(cs->device, STATE_ACTIVELIGHT(object->glIndex)); ++ } ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_set_light(struct wined3d_cs *cs, const struct wined3d_light_info *light) ++{ ++ struct wined3d_cs_set_light *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_LIGHT; ++ op->light = *light; ++ ++ cs->ops->submit(cs); ++} ++ ++static UINT wined3d_cs_exec_set_light_enable(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_light_enable *op = data; ++ UINT hash_idx = LIGHTMAP_HASHFUNC(op->idx); ++ struct wined3d_light_info *light_info = NULL; ++ struct list *e; ++ struct wined3d_device *device = cs->device; ++ ++ LIST_FOR_EACH(e, &cs->state.light_map[hash_idx]) ++ { ++ light_info = LIST_ENTRY(e, struct wined3d_light_info, entry); ++ if (light_info->OriginalIndex == op->idx) ++ break; ++ light_info = NULL; ++ } ++ TRACE("Found light %p.\n", light_info); ++ ++ /* Should be handled by the device by emitting a set_light op */ ++ if (!light_info) ++ { ++ ERR("Light enabled requested but light not defined in cs state!\n"); ++ return sizeof(*op); ++ } ++ ++ if (!op->enable) ++ { ++ if (light_info->glIndex != -1) ++ { ++ device_invalidate_state(device, STATE_LIGHT_TYPE); ++ device_invalidate_state(device, STATE_ACTIVELIGHT(light_info->glIndex)); ++ cs->state.lights[light_info->glIndex] = NULL; ++ light_info->glIndex = -1; ++ } ++ else ++ { ++ TRACE("Light already disabled, nothing to do\n"); ++ } ++ light_info->enabled = FALSE; ++ } ++ else ++ { ++ light_info->enabled = TRUE; ++ if (light_info->glIndex != -1) ++ { ++ TRACE("Nothing to do as light was enabled\n"); ++ } ++ else ++ { ++ unsigned int i; ++ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; ++ /* Find a free GL light. */ ++ for (i = 0; i < gl_info->limits.lights; ++i) ++ { ++ if (!cs->state.lights[i]) ++ { ++ cs->state.lights[i] = light_info; ++ light_info->glIndex = i; ++ break; ++ } ++ } ++ if (light_info->glIndex == -1) ++ { ++ /* Should be caught by the device before emitting ++ * the light_enable op */ ++ ERR("Too many concurrently active lights in cs\n"); ++ return sizeof(*op); ++ } ++ ++ /* i == light_info->glIndex */ ++ device_invalidate_state(device, STATE_LIGHT_TYPE); ++ device_invalidate_state(device, STATE_ACTIVELIGHT(i)); ++ } ++ } ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_set_light_enable(struct wined3d_cs *cs, UINT idx, BOOL enable) ++{ ++ struct wined3d_cs_set_light_enable *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_LIGHT_ENABLE; ++ op->idx = idx; ++ op->enable = enable; ++ ++ cs->ops->submit(cs); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_FENCE */ wined3d_cs_exec_fence, +@@ -1499,7 +1624,6 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_SET_CLIP_PLANE */ wined3d_cs_exec_set_clip_plane, + /* WINED3D_CS_OP_SET_MATERIAL */ wined3d_cs_exec_set_material, + /* WINED3D_CS_OP_RESET_STATE */ wined3d_cs_exec_reset_state, +- /* WINED3D_CS_OP_STATEBLOCK */ wined3d_cs_exec_transfer_stateblock, + /* WINED3D_CS_OP_SET_VS_CONSTS_F */ wined3d_cs_exec_set_vs_consts_f, + /* WINED3D_CS_OP_SET_VS_CONSTS_B */ wined3d_cs_exec_set_vs_consts_b, + /* WINED3D_CS_OP_SET_VS_CONSTS_I */ wined3d_cs_exec_set_vs_consts_i, +@@ -1509,6 +1633,8 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_GLFINISH */ wined3d_cs_exec_glfinish, + /* WINED3D_CS_OP_SET_BASE_VERTEX_INDEX */ wined3d_cs_exec_set_base_vertex_index, + /* WINED3D_CS_OP_SET_PRIMITIVE_TYPE */ wined3d_cs_exec_set_primitive_type, ++ /* WINED3D_CS_OP_SET_LIGHT */ wined3d_cs_exec_set_light, ++ /* WINED3D_CS_OP_SET_LIGHT_ENABLE */ wined3d_cs_exec_set_light_enable, + }; + + static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 9ba40df..05a353c 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -1448,14 +1448,6 @@ HRESULT CDECL wined3d_device_set_light(struct wined3d_device *device, + TRACE("... Range(%f), Falloff(%f), Theta(%f), Phi(%f)\n", + light->range, light->falloff, light->theta, light->phi); + +- /* Update the live definitions if the light is currently assigned a glIndex. */ +- if (object->glIndex != -1 && !device->recording) +- { +- if (object->OriginalParms.type != light->type) +- device_invalidate_state(device, STATE_LIGHT_TYPE); +- device_invalidate_state(device, STATE_ACTIVELIGHT(object->glIndex)); +- } +- + /* Save away the information. */ + object->OriginalParms = *light; + +@@ -1528,6 +1520,9 @@ HRESULT CDECL wined3d_device_set_light(struct wined3d_device *device, + FIXME("Unrecognized light type %#x.\n", light->type); + } + ++ if (!device->recording) ++ wined3d_cs_emit_set_light(device->cs, object); ++ + return WINED3D_OK; + } + +@@ -1600,12 +1595,6 @@ HRESULT CDECL wined3d_device_set_light_enable(struct wined3d_device *device, UIN + { + if (light_info->glIndex != -1) + { +- if (!device->recording) +- { +- device_invalidate_state(device, STATE_LIGHT_TYPE); +- device_invalidate_state(device, STATE_ACTIVELIGHT(light_info->glIndex)); +- } +- + device->update_state->lights[light_info->glIndex] = NULL; + light_info->glIndex = -1; + } +@@ -1647,16 +1636,12 @@ HRESULT CDECL wined3d_device_set_light_enable(struct wined3d_device *device, UIN + WARN("Too many concurrently active lights\n"); + return WINED3D_OK; + } +- +- /* i == light_info->glIndex */ +- if (!device->recording) +- { +- device_invalidate_state(device, STATE_LIGHT_TYPE); +- device_invalidate_state(device, STATE_ACTIVELIGHT(i)); +- } + } + } + ++ if (!device->recording) ++ wined3d_cs_emit_set_light_enable(device->cs, light_idx, enable); ++ + return WINED3D_OK; + } + +@@ -3383,7 +3368,6 @@ HRESULT CDECL wined3d_device_draw_primitive(struct wined3d_device *device, UINT + return WINED3DERR_INVALIDCALL; + } + +- wined3d_cs_emit_transfer_stateblock(device->cs, &device->state); + wined3d_cs_emit_draw(device->cs, start_vertex, vertex_count, 0, 0, FALSE); + + return WINED3D_OK; +@@ -3409,8 +3393,6 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *devic + return WINED3DERR_INVALIDCALL; + } + +- +- wined3d_cs_emit_transfer_stateblock(device->cs, &device->state); + wined3d_cs_emit_draw(device->cs, start_idx, index_count, 0, 0, TRUE); + + return WINED3D_OK; +@@ -3421,7 +3403,6 @@ void CDECL wined3d_device_draw_indexed_primitive_instanced(struct wined3d_device + { + TRACE("device %p, start_idx %u, index_count %u.\n", device, start_idx, index_count); + +- wined3d_cs_emit_transfer_stateblock(device->cs, &device->state); + wined3d_cs_emit_draw(device->cs, start_idx, index_count, start_instance, instance_count, TRUE); + } + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 59149bd..54cf7b5 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2535,7 +2535,9 @@ struct wined3d_cs_block + { + struct list entry; + UINT pos; +- BYTE data[sizeof(struct wined3d_state) * 2]; /* FIXME? The size is somewhat arbitrary. */ ++ /* FIXME? The size is somewhat arbitrary. It's big enough for huge ++ * shader constant set calls though */ ++ BYTE data[sizeof(float) * 4 * 256 * 2]; + }; + + struct wined3d_cs_ops +@@ -2578,8 +2580,6 @@ void wined3d_cs_emit_set_clip_plane(struct wined3d_cs *cs, UINT plane_idx, + const struct wined3d_vec4 *plane) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_constant_buffer(struct wined3d_cs *cs, enum wined3d_shader_type type, + UINT cb_idx, struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; +-void wined3d_cs_emit_transfer_stateblock(struct wined3d_cs *cs, +- const struct wined3d_state *state) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_depth_stencil_view(struct wined3d_cs *cs, + struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_index_buffer(struct wined3d_cs *cs, struct wined3d_buffer *buffer, +@@ -2625,6 +2625,8 @@ void wined3d_cs_emit_set_base_vertex_index(struct wined3d_cs *cs, + UINT base_vertex_index) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_primitive_type(struct wined3d_cs *cs, + GLenum primitive_type) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_set_light(struct wined3d_cs *cs, const struct wined3d_light_info *light) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_set_light_enable(struct wined3d_cs *cs, UINT idx, BOOL enable) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0069-wined3d-Prevent-the-command-stream-from-running-ahea.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0069-wined3d-Prevent-the-command-stream-from-running-ahea.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0069-wined3d-Prevent-the-command-stream-from-running-ahea.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0069-wined3d-Prevent-the-command-stream-from-running-ahea.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,60 @@ +From 0fe58ec92cc169b54b6d1f579ee59f70aa4554d0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 10 Apr 2013 19:10:41 +0200 +Subject: wined3d: Prevent the command stream from running ahead too far + +--- + dlls/wined3d/cs.c | 8 ++++++++ + dlls/wined3d/wined3d_private.h | 2 ++ + 2 files changed, 10 insertions(+) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index f48d14a..dbfd86d 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -472,6 +472,8 @@ static UINT wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data) + src_rect, dst_rect, dirty_region, op->flags, + wined3d_rendertarget_view_get_surface(cs->state.fb.depth_stencil)); + ++ InterlockedDecrement(&cs->pending_presents); ++ + return sizeof(*op); + } + +@@ -480,6 +482,7 @@ void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *sw + const RGNDATA *dirty_region, DWORD flags) + { + struct wined3d_cs_present *op; ++ LONG pending; + + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_PRESENT; +@@ -503,7 +506,12 @@ void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *sw + } + op->flags = flags; + ++ pending = InterlockedIncrement(&cs->pending_presents); ++ + cs->ops->submit(cs); ++ ++ while (pending > 1) ++ pending = InterlockedCompareExchange(&cs->pending_presents, 0, 0); + } + + static UINT wined3d_cs_exec_clear(struct wined3d_cs *cs, const void *data) +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 54cf7b5..ab3d07f 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2561,6 +2561,8 @@ struct wined3d_cs + + struct wined3d_cs_list free_list; + struct wined3d_cs_list exec_list; ++ ++ LONG pending_presents; + }; + + struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0070-wined3d-Wait-for-the-cs-to-finish-before-destroying-.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0070-wined3d-Wait-for-the-cs-to-finish-before-destroying-.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0070-wined3d-Wait-for-the-cs-to-finish-before-destroying-.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0070-wined3d-Wait-for-the-cs-to-finish-before-destroying-.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,26 @@ +From 0f21b13a057d684fa30678d8c08e87614eca066a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 10 Apr 2013 20:09:55 +0200 +Subject: wined3d: Wait for the cs to finish before destroying the device + +--- + dlls/wined3d/device.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 05a353c..9ef99b2 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -1013,6 +1013,9 @@ HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device) + if (!device->d3d_initialized) + return WINED3DERR_INVALIDCALL; + ++ if (wined3d_settings.cs_multithreaded) ++ device->cs->ops->finish(device->cs); ++ + /* I don't think that the interface guarantees that the device is destroyed from the same thread + * it was created. Thus make sure a context is active for the glDelete* calls + */ +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0071-wined3d-Run-the-cs-asynchronously.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0071-wined3d-Run-the-cs-asynchronously.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0071-wined3d-Run-the-cs-asynchronously.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0071-wined3d-Run-the-cs-asynchronously.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,25 @@ +From ae49b3a304769185e9f2a92ec21975d44a389654 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 10 Apr 2013 20:12:27 +0200 +Subject: wined3d: Run the cs asynchronously + +--- + dlls/wined3d/cs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index dbfd86d..949bd6b 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -1679,7 +1679,7 @@ static const struct wined3d_cs_ops wined3d_cs_st_ops = + static const struct wined3d_cs_ops wined3d_cs_mt_ops = + { + wined3d_cs_mt_require_space, +- wined3d_cs_flush_and_wait, ++ wined3d_cs_flush, + wined3d_cs_flush_and_wait, + }; + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0072-wined3d-Send-blits-through-the-command-stream.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0072-wined3d-Send-blits-through-the-command-stream.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0072-wined3d-Send-blits-through-the-command-stream.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0072-wined3d-Send-blits-through-the-command-stream.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,555 @@ +From f2f3b1c84b57d393a2eb2986704537d37d81f04b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Mon, 29 Apr 2013 18:49:53 +0200 +Subject: wined3d: Send blits through the command stream. + +This needs more work. This patch breaks error handling, and the split +between surface_blt and surface_blt_ugly isn't particularly nice. +--- + dlls/wined3d/cs.c | 50 +++++++ + dlls/wined3d/surface.c | 307 ++++++++++++++++++++++------------------- + dlls/wined3d/wined3d_private.h | 8 ++ + 3 files changed, 226 insertions(+), 139 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 949bd6b..dcaedfd 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -73,6 +73,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_SET_PRIMITIVE_TYPE, + WINED3D_CS_OP_SET_LIGHT, + WINED3D_CS_OP_SET_LIGHT_ENABLE, ++ WINED3D_CS_OP_BLT, + WINED3D_CS_OP_STOP, + }; + +@@ -330,6 +331,18 @@ struct wined3d_cs_set_light_enable + BOOL enable; + }; + ++struct wined3d_cs_blt ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_surface *dst_surface; ++ RECT dst_rect; ++ struct wined3d_surface *src_surface; ++ RECT src_rect; ++ DWORD flags; ++ WINEDDBLTFX fx; ++ enum wined3d_texture_filter_type filter; ++}; ++ + /* FIXME: The list synchronization probably isn't particularly fast. */ + static void wined3d_cs_list_enqueue(struct wined3d_cs_list *list, struct wined3d_cs_block *block) + { +@@ -1393,6 +1406,9 @@ static UINT wined3d_cs_exec_glfinish(struct wined3d_cs *cs, const void *data) + struct wined3d_device *device = cs->device; + struct wined3d_context *context; + ++ if (!device->d3d_initialized) ++ return sizeof(*op); ++ + context = context_acquire(device, NULL); + context->gl_info->gl_ops.gl.p_glFinish(); + context_release(context); +@@ -1604,6 +1620,38 @@ void wined3d_cs_emit_set_light_enable(struct wined3d_cs *cs, UINT idx, BOOL enab + cs->ops->submit(cs); + } + ++static UINT wined3d_cs_exec_blt(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_blt *op = data; ++ ++ surface_blt_ugly(op->dst_surface, &op->dst_rect, ++ op->src_surface, &op->src_rect, ++ op->flags, &op->fx, op->filter); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_blt(struct wined3d_cs *cs, struct wined3d_surface *dst_surface, ++ const RECT *dst_rect, struct wined3d_surface *src_surface, ++ const RECT *src_rect, DWORD flags, const WINEDDBLTFX *fx, ++ enum wined3d_texture_filter_type filter) ++{ ++ struct wined3d_cs_blt *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_BLT; ++ op->dst_surface = dst_surface; ++ op->dst_rect = *dst_rect; ++ op->src_surface = src_surface; ++ op->src_rect = *src_rect; ++ op->flags = flags; ++ op->filter = filter; ++ if (fx) ++ op->fx = *fx; ++ ++ cs->ops->submit(cs); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_FENCE */ wined3d_cs_exec_fence, +@@ -1643,6 +1691,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_SET_PRIMITIVE_TYPE */ wined3d_cs_exec_set_primitive_type, + /* WINED3D_CS_OP_SET_LIGHT */ wined3d_cs_exec_set_light, + /* WINED3D_CS_OP_SET_LIGHT_ENABLE */ wined3d_cs_exec_set_light_enable, ++ /* WINED3D_CS_OP_BLT */ wined3d_cs_exec_blt, + }; + + static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) +@@ -1717,6 +1766,7 @@ static DWORD WINAPI wined3d_cs_run(void *thread_param) + + TRACE("Started.\n"); + ++ cs->thread_id = GetCurrentThreadId(); + for (;;) + { + struct wined3d_cs_block *block; +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 97450ef..2620570 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -4937,14 +4937,13 @@ const struct blit_shader cpu_blit = { + cpu_blit_depth_fill, + }; + +-HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const RECT *dst_rect_in, +- struct wined3d_surface *src_surface, const RECT *src_rect_in, DWORD flags, ++void surface_blt_ugly(struct wined3d_surface *dst_surface, const RECT *dst_rect, ++ struct wined3d_surface *src_surface, const RECT *src_rect, DWORD flags, + const WINEDDBLTFX *fx, enum wined3d_texture_filter_type filter) + { + struct wined3d_swapchain *src_swapchain, *dst_swapchain; + struct wined3d_device *device = dst_surface->resource.device; + DWORD src_ds_flags, dst_ds_flags; +- RECT src_rect, dst_rect; + BOOL scale, convert; + + static const DWORD simple_blit = WINEDDBLT_ASYNC +@@ -4953,111 +4952,6 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + | WINEDDBLT_DEPTHFILL + | WINEDDBLT_DONOTWAIT; + +- TRACE("dst_surface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, fx %p, filter %s.\n", +- dst_surface, wine_dbgstr_rect(dst_rect_in), src_surface, wine_dbgstr_rect(src_rect_in), +- flags, fx, debug_d3dtexturefiltertype(filter)); +- TRACE("Usage is %s.\n", debug_d3dusage(dst_surface->resource.usage)); +- +- if (fx) +- { +- TRACE("dwSize %#x.\n", fx->dwSize); +- TRACE("dwDDFX %#x.\n", fx->dwDDFX); +- TRACE("dwROP %#x.\n", fx->dwROP); +- TRACE("dwDDROP %#x.\n", fx->dwDDROP); +- TRACE("dwRotationAngle %#x.\n", fx->dwRotationAngle); +- TRACE("dwZBufferOpCode %#x.\n", fx->dwZBufferOpCode); +- TRACE("dwZBufferLow %#x.\n", fx->dwZBufferLow); +- TRACE("dwZBufferHigh %#x.\n", fx->dwZBufferHigh); +- TRACE("dwZBufferBaseDest %#x.\n", fx->dwZBufferBaseDest); +- TRACE("dwZDestConstBitDepth %#x.\n", fx->dwZDestConstBitDepth); +- TRACE("lpDDSZBufferDest %p.\n", fx->u1.lpDDSZBufferDest); +- TRACE("dwZSrcConstBitDepth %#x.\n", fx->dwZSrcConstBitDepth); +- TRACE("lpDDSZBufferSrc %p.\n", fx->u2.lpDDSZBufferSrc); +- TRACE("dwAlphaEdgeBlendBitDepth %#x.\n", fx->dwAlphaEdgeBlendBitDepth); +- TRACE("dwAlphaEdgeBlend %#x.\n", fx->dwAlphaEdgeBlend); +- TRACE("dwReserved %#x.\n", fx->dwReserved); +- TRACE("dwAlphaDestConstBitDepth %#x.\n", fx->dwAlphaDestConstBitDepth); +- TRACE("lpDDSAlphaDest %p.\n", fx->u3.lpDDSAlphaDest); +- TRACE("dwAlphaSrcConstBitDepth %#x.\n", fx->dwAlphaSrcConstBitDepth); +- TRACE("lpDDSAlphaSrc %p.\n", fx->u4.lpDDSAlphaSrc); +- TRACE("lpDDSPattern %p.\n", fx->u5.lpDDSPattern); +- TRACE("ddckDestColorkey {%#x, %#x}.\n", +- fx->ddckDestColorkey.color_space_low_value, +- fx->ddckDestColorkey.color_space_high_value); +- TRACE("ddckSrcColorkey {%#x, %#x}.\n", +- fx->ddckSrcColorkey.color_space_low_value, +- fx->ddckSrcColorkey.color_space_high_value); +- } +- +- if (dst_surface->resource.map_count || (src_surface && src_surface->resource.map_count)) +- { +- WARN("Surface is busy, returning WINEDDERR_SURFACEBUSY.\n"); +- return WINEDDERR_SURFACEBUSY; +- } +- +- surface_get_rect(dst_surface, dst_rect_in, &dst_rect); +- +- if (dst_rect.left >= dst_rect.right || dst_rect.top >= dst_rect.bottom +- || dst_rect.left > dst_surface->resource.width || dst_rect.left < 0 +- || dst_rect.top > dst_surface->resource.height || dst_rect.top < 0 +- || dst_rect.right > dst_surface->resource.width || dst_rect.right < 0 +- || dst_rect.bottom > dst_surface->resource.height || dst_rect.bottom < 0) +- { +- WARN("The application gave us a bad destination rectangle.\n"); +- return WINEDDERR_INVALIDRECT; +- } +- +- if (src_surface) +- { +- surface_get_rect(src_surface, src_rect_in, &src_rect); +- +- if (src_rect.left >= src_rect.right || src_rect.top >= src_rect.bottom +- || src_rect.left > src_surface->resource.width || src_rect.left < 0 +- || src_rect.top > src_surface->resource.height || src_rect.top < 0 +- || src_rect.right > src_surface->resource.width || src_rect.right < 0 +- || src_rect.bottom > src_surface->resource.height || src_rect.bottom < 0) +- { +- WARN("Application gave us bad source rectangle for Blt.\n"); +- return WINEDDERR_INVALIDRECT; +- } +- } +- else +- { +- memset(&src_rect, 0, sizeof(src_rect)); +- } +- +- if (!fx || !(fx->dwDDFX)) +- flags &= ~WINEDDBLT_DDFX; +- +- if (flags & WINEDDBLT_WAIT) +- flags &= ~WINEDDBLT_WAIT; +- +- if (flags & WINEDDBLT_ASYNC) +- { +- static unsigned int once; +- +- if (!once++) +- FIXME("Can't handle WINEDDBLT_ASYNC flag.\n"); +- flags &= ~WINEDDBLT_ASYNC; +- } +- +- /* WINEDDBLT_DONOTWAIT appeared in DX7. */ +- if (flags & WINEDDBLT_DONOTWAIT) +- { +- static unsigned int once; +- +- if (!once++) +- FIXME("Can't handle WINEDDBLT_DONOTWAIT flag.\n"); +- flags &= ~WINEDDBLT_DONOTWAIT; +- } +- +- if (wined3d_settings.cs_multithreaded) +- { +- FIXME("Waiting for cs.\n"); +- wined3d_cs_emit_glfinish(device->cs); +- device->cs->ops->finish(device->cs); +- } +- + if (!device->d3d_initialized) + { + WARN("D3D not initialized, using fallback.\n"); +@@ -5100,8 +4994,8 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + } + + scale = src_surface +- && (src_rect.right - src_rect.left != dst_rect.right - dst_rect.left +- || src_rect.bottom - src_rect.top != dst_rect.bottom - dst_rect.top); ++ && (src_rect->right - src_rect->left != dst_rect->right - dst_rect->left ++ || src_rect->bottom - src_rect->top != dst_rect->bottom - dst_rect->top); + convert = src_surface && src_surface->resource.format->id != dst_surface->resource.format->id; + + dst_ds_flags = dst_surface->resource.format->flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL); +@@ -5119,22 +5013,16 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + TRACE("Depth fill.\n"); + + if (!surface_convert_depth_to_float(dst_surface, fx->u5.dwFillDepth, &depth)) +- return WINED3DERR_INVALIDCALL; ++ return; + +- if (SUCCEEDED(wined3d_surface_depth_fill(dst_surface, &dst_rect, depth))) +- return WINED3D_OK; ++ if (SUCCEEDED(wined3d_surface_depth_fill(dst_surface, dst_rect, depth))) ++ return; + } + else + { +- if (src_ds_flags != dst_ds_flags) +- { +- WARN("Rejecting depth / stencil blit between incompatible formats.\n"); +- return WINED3DERR_INVALIDCALL; +- } +- + if (SUCCEEDED(wined3d_surface_depth_blt(src_surface, src_surface->container->resource.draw_binding, +- &src_rect, dst_surface, dst_surface->container->resource.draw_binding, &dst_rect))) +- return WINED3D_OK; ++ src_rect, dst_surface, dst_surface->container->resource.draw_binding, dst_rect))) ++ return; + } + } + else +@@ -5161,8 +5049,8 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + if (!surface_convert_color_to_float(dst_surface, fx->u5.dwFillColor, &color)) + goto fallback; + +- if (SUCCEEDED(surface_color_fill(dst_surface, &dst_rect, &color))) +- return WINED3D_OK; ++ if (SUCCEEDED(surface_color_fill(dst_surface, dst_rect, &color))) ++ return; + } + else + { +@@ -5178,9 +5066,9 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + TRACE("Not doing upload because of format conversion.\n"); + else + { +- POINT dst_point = {dst_rect.left, dst_rect.top}; ++ POINT dst_point = {dst_rect->left, dst_rect->top}; + +- if (SUCCEEDED(surface_upload_from_surface(dst_surface, &dst_point, src_surface, &src_rect))) ++ if (SUCCEEDED(surface_upload_from_surface(dst_surface, &dst_point, src_surface, src_rect))) + { + if (!wined3d_resource_is_offscreen(&dst_surface->container->resource)) + { +@@ -5189,7 +5077,7 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + dst_surface->container->resource.draw_binding); + context_release(context); + } +- return WINED3D_OK; ++ return; + } + } + } +@@ -5214,51 +5102,192 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC + wined3d_swapchain_present(dst_swapchain, NULL, NULL, dst_swapchain->win_handle, NULL, 0); + dst_swapchain->desc.swap_effect = swap_effect; + +- return WINED3D_OK; ++ return; + } + + if (fbo_blit_supported(&device->adapter->gl_info, WINED3D_BLIT_OP_COLOR_BLIT, +- &src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format, +- &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format)) ++ src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format, ++ dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format)) + { + struct wined3d_context *context; + TRACE("Using FBO blit.\n"); + + context = context_acquire(device, NULL); + surface_blt_fbo(device, context, filter, +- src_surface, src_surface->container->resource.draw_binding, &src_rect, +- dst_surface, dst_surface->container->resource.draw_binding, &dst_rect); ++ src_surface, src_surface->container->resource.draw_binding, src_rect, ++ dst_surface, dst_surface->container->resource.draw_binding, dst_rect); + context_release(context); + + wined3d_resource_validate_location(&dst_surface->resource, dst_surface->container->resource.draw_binding); + wined3d_resource_invalidate_location(&dst_surface->resource, ~dst_surface->container->resource.draw_binding); + +- return WINED3D_OK; ++ return; + } + + if (arbfp_blit.blit_supported(&device->adapter->gl_info, WINED3D_BLIT_OP_COLOR_BLIT, +- &src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format, +- &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format)) ++ src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format, ++ dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format)) + { + TRACE("Using arbfp blit.\n"); + +- if (SUCCEEDED(arbfp_blit_surface(device, filter, src_surface, &src_rect, dst_surface, &dst_rect))) +- return WINED3D_OK; ++ if (SUCCEEDED(arbfp_blit_surface(device, filter, src_surface, src_rect, dst_surface, dst_rect))) ++ return; + } + } + } + + fallback: + /* Special cases for render targets. */ +- if (SUCCEEDED(surface_blt_special(dst_surface, &dst_rect, src_surface, &src_rect, flags, fx, filter))) +- return WINED3D_OK; ++ if ((dst_surface->resource.usage & WINED3DUSAGE_RENDERTARGET) ++ || (src_surface && (src_surface->resource.usage & WINED3DUSAGE_RENDERTARGET))) ++ { ++ if (SUCCEEDED(surface_blt_special(dst_surface, dst_rect, src_surface, src_rect, flags, fx, filter))) ++ return; ++ } + + cpu: + + /* For the rest call the X11 surface implementation. For render targets + * this should be implemented OpenGL accelerated in surface_blt_special(), + * other blits are rather rare. */ +- return surface_cpu_blt(dst_surface, &dst_rect, src_surface, &src_rect, flags, fx, filter); ++ surface_cpu_blt(dst_surface, dst_rect, src_surface, src_rect, flags, fx, filter); ++ return; ++} ++ ++HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const RECT *dst_rect_in, ++ struct wined3d_surface *src_surface, const RECT *src_rect_in, DWORD flags, ++ const WINEDDBLTFX *fx, enum wined3d_texture_filter_type filter) ++{ ++ struct wined3d_device *device = dst_surface->resource.device; ++ RECT src_rect, dst_rect; ++ ++ TRACE("dst_surface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, fx %p, filter %s.\n", ++ dst_surface, wine_dbgstr_rect(dst_rect_in), src_surface, wine_dbgstr_rect(src_rect_in), ++ flags, fx, debug_d3dtexturefiltertype(filter)); ++ TRACE("Usage is %s.\n", debug_d3dusage(dst_surface->resource.usage)); ++ ++ if (fx) ++ { ++ TRACE("dwSize %#x.\n", fx->dwSize); ++ TRACE("dwDDFX %#x.\n", fx->dwDDFX); ++ TRACE("dwROP %#x.\n", fx->dwROP); ++ TRACE("dwDDROP %#x.\n", fx->dwDDROP); ++ TRACE("dwRotationAngle %#x.\n", fx->dwRotationAngle); ++ TRACE("dwZBufferOpCode %#x.\n", fx->dwZBufferOpCode); ++ TRACE("dwZBufferLow %#x.\n", fx->dwZBufferLow); ++ TRACE("dwZBufferHigh %#x.\n", fx->dwZBufferHigh); ++ TRACE("dwZBufferBaseDest %#x.\n", fx->dwZBufferBaseDest); ++ TRACE("dwZDestConstBitDepth %#x.\n", fx->dwZDestConstBitDepth); ++ TRACE("lpDDSZBufferDest %p.\n", fx->u1.lpDDSZBufferDest); ++ TRACE("dwZSrcConstBitDepth %#x.\n", fx->dwZSrcConstBitDepth); ++ TRACE("lpDDSZBufferSrc %p.\n", fx->u2.lpDDSZBufferSrc); ++ TRACE("dwAlphaEdgeBlendBitDepth %#x.\n", fx->dwAlphaEdgeBlendBitDepth); ++ TRACE("dwAlphaEdgeBlend %#x.\n", fx->dwAlphaEdgeBlend); ++ TRACE("dwReserved %#x.\n", fx->dwReserved); ++ TRACE("dwAlphaDestConstBitDepth %#x.\n", fx->dwAlphaDestConstBitDepth); ++ TRACE("lpDDSAlphaDest %p.\n", fx->u3.lpDDSAlphaDest); ++ TRACE("dwAlphaSrcConstBitDepth %#x.\n", fx->dwAlphaSrcConstBitDepth); ++ TRACE("lpDDSAlphaSrc %p.\n", fx->u4.lpDDSAlphaSrc); ++ TRACE("lpDDSPattern %p.\n", fx->u5.lpDDSPattern); ++ TRACE("ddckDestColorkey {%#x, %#x}.\n", ++ fx->ddckDestColorkey.color_space_low_value, ++ fx->ddckDestColorkey.color_space_high_value); ++ TRACE("ddckSrcColorkey {%#x, %#x}.\n", ++ fx->ddckSrcColorkey.color_space_low_value, ++ fx->ddckSrcColorkey.color_space_high_value); ++ } ++ ++ if (dst_surface->resource.map_count || (src_surface && src_surface->resource.map_count)) ++ { ++ /* TODO: Separate application maps from internal maps */ ++ if (!wined3d_settings.cs_multithreaded) ++ { ++ WARN("Surface is busy, returning WINEDDERR_SURFACEBUSY.\n"); ++ return WINEDDERR_SURFACEBUSY; ++ } ++ ++ wined3d_cs_emit_glfinish(dst_surface->resource.device->cs); ++ dst_surface->resource.device->cs->ops->finish(dst_surface->resource.device->cs); ++ ++ if (dst_surface->resource.map_count || (src_surface && src_surface->resource.map_count)) ++ { ++ WARN("Surface is busy, returning WINEDDERR_SURFACEBUSY.\n"); ++ return WINEDDERR_SURFACEBUSY; ++ } ++ } ++ ++ surface_get_rect(dst_surface, dst_rect_in, &dst_rect); ++ ++ if (dst_rect.left >= dst_rect.right || dst_rect.top >= dst_rect.bottom ++ || dst_rect.left > dst_surface->resource.width || dst_rect.left < 0 ++ || dst_rect.top > dst_surface->resource.height || dst_rect.top < 0 ++ || dst_rect.right > dst_surface->resource.width || dst_rect.right < 0 ++ || dst_rect.bottom > dst_surface->resource.height || dst_rect.bottom < 0) ++ { ++ WARN("The application gave us a bad destination rectangle.\n"); ++ return WINEDDERR_INVALIDRECT; ++ } ++ ++ if (src_surface) ++ { ++ DWORD src_ds_flags, dst_ds_flags; ++ ++ surface_get_rect(src_surface, src_rect_in, &src_rect); ++ ++ if (src_rect.left >= src_rect.right || src_rect.top >= src_rect.bottom ++ || src_rect.left > src_surface->resource.width || src_rect.left < 0 ++ || src_rect.top > src_surface->resource.height || src_rect.top < 0 ++ || src_rect.right > src_surface->resource.width || src_rect.right < 0 ++ || src_rect.bottom > src_surface->resource.height || src_rect.bottom < 0) ++ { ++ WARN("Application gave us bad source rectangle for Blt.\n"); ++ return WINEDDERR_INVALIDRECT; ++ } ++ ++ dst_ds_flags = dst_surface->resource.format->flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL); ++ src_ds_flags = src_surface->resource.format->flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL); ++ if (src_ds_flags != dst_ds_flags) ++ { ++ WARN("Rejecting depth / stencil blit between incompatible formats.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ } ++ else ++ { ++ memset(&src_rect, 0, sizeof(src_rect)); ++ } ++ ++ if (!fx || !(fx->dwDDFX)) ++ flags &= ~WINEDDBLT_DDFX; ++ ++ if (flags & WINEDDBLT_WAIT) ++ flags &= ~WINEDDBLT_WAIT; ++ ++ if (flags & WINEDDBLT_ASYNC) ++ { ++ static unsigned int once; ++ ++ if (!once++) ++ FIXME("Can't handle WINEDDBLT_ASYNC flag.\n"); ++ flags &= ~WINEDDBLT_ASYNC; ++ } ++ ++ /* WINEDDBLT_DONOTWAIT appeared in DX7. */ ++ if (flags & WINEDDBLT_DONOTWAIT) ++ { ++ static unsigned int once; ++ ++ if (!once++) ++ FIXME("Can't handle WINEDDBLT_DONOTWAIT flag.\n"); ++ flags &= ~WINEDDBLT_DONOTWAIT; ++ } ++ ++ TRACE("Emitting blit %p <== %p\n", dst_surface, src_surface); ++ wined3d_cs_emit_blt(device->cs, dst_surface, &dst_rect, src_surface, &src_rect, ++ flags, fx, filter); ++ ++ return WINED3D_OK; + } + + static const struct wined3d_resource_ops surface_resource_ops = +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index ab3d07f..a311a35 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2409,6 +2409,9 @@ HRESULT wined3d_surface_create(struct wined3d_texture *container, const struct w + GLenum target, unsigned int level, unsigned int layer, DWORD flags, + struct wined3d_surface **surface) DECLSPEC_HIDDEN; + void wined3d_surface_destroy(struct wined3d_surface *surface) DECLSPEC_HIDDEN; ++void surface_blt_ugly(struct wined3d_surface *dst_surface, const RECT *dst_rect_in, ++ struct wined3d_surface *src_surface, const RECT *src_rect_in, DWORD flags, ++ const WINEDDBLTFX *fx, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; + + void draw_textured_quad(const struct wined3d_surface *src_surface, struct wined3d_context *context, + const RECT *src_rect, const RECT *dst_rect, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; +@@ -2553,6 +2556,7 @@ struct wined3d_cs + struct wined3d_device *device; + struct wined3d_state state; + HANDLE thread; ++ DWORD thread_id; + DWORD tls_idx; + struct wined3d_surface *onscreen_depth_stencil; + +@@ -2629,6 +2633,10 @@ void wined3d_cs_emit_set_primitive_type(struct wined3d_cs *cs, + GLenum primitive_type) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_light(struct wined3d_cs *cs, const struct wined3d_light_info *light) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_light_enable(struct wined3d_cs *cs, UINT idx, BOOL enable) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_blt(struct wined3d_cs *cs, struct wined3d_surface *dst_surface, ++ const RECT *dst_rect, struct wined3d_surface *src_surface, ++ const RECT *src_rect, DWORD flags, const WINEDDBLTFX *fx, ++ enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0073-wined3d-Put-update_surface-checks-back-in-place.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0073-wined3d-Put-update_surface-checks-back-in-place.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0073-wined3d-Put-update_surface-checks-back-in-place.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0073-wined3d-Put-update_surface-checks-back-in-place.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,125 @@ +From f563282c26b069e5e053bd2bc441fe079854f998 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 20 Aug 2014 14:14:23 +0200 +Subject: wined3d: Put update_surface checks back in place + +Unfortunately I can't remove the code from surface_update_from_surface +yet because blits depend on them. +--- + dlls/wined3d/device.c | 66 ++++++++++++++++++++++++++++++++++++++++++ + dlls/wined3d/surface.c | 2 +- + dlls/wined3d/wined3d_private.h | 1 + + 3 files changed, 68 insertions(+), 1 deletion(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 9ef99b2..599a25d 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -3731,6 +3731,13 @@ HRESULT CDECL wined3d_device_update_surface(struct wined3d_device *device, + struct wined3d_surface *src_surface, const RECT *src_rect, + struct wined3d_surface *dst_surface, const POINT *dst_point) + { ++ const struct wined3d_format *src_format = src_surface->resource.format; ++ const struct wined3d_format *dst_format = dst_surface->resource.format; ++ UINT update_w, update_h; ++ UINT dst_w, dst_h; ++ RECT r, dst_rect; ++ POINT p; ++ + TRACE("device %p, src_surface %p, src_rect %s, dst_surface %p, dst_point %s.\n", + device, src_surface, wine_dbgstr_rect(src_rect), + dst_surface, wine_dbgstr_point(dst_point)); +@@ -3742,6 +3749,65 @@ HRESULT CDECL wined3d_device_update_surface(struct wined3d_device *device, + return WINED3DERR_INVALIDCALL; + } + ++ if (src_format->id != dst_format->id) ++ { ++ WARN("Source and destination surfaces should have the same format.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ if (!dst_point) ++ { ++ p.x = 0; ++ p.y = 0; ++ dst_point = &p; ++ } ++ else if (dst_point->x < 0 || dst_point->y < 0) ++ { ++ WARN("Invalid destination point.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ if (!src_rect) ++ { ++ r.left = 0; ++ r.top = 0; ++ r.right = src_surface->resource.width; ++ r.bottom = src_surface->resource.height; ++ src_rect = &r; ++ } ++ else if (src_rect->left < 0 || src_rect->left >= src_rect->right ++ || src_rect->top < 0 || src_rect->top >= src_rect->bottom) ++ { ++ WARN("Invalid source rectangle.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ dst_w = dst_surface->resource.width; ++ dst_h = dst_surface->resource.height; ++ ++ update_w = src_rect->right - src_rect->left; ++ update_h = src_rect->bottom - src_rect->top; ++ ++ if (update_w > dst_w || dst_point->x > dst_w - update_w ++ || update_h > dst_h || dst_point->y > dst_h - update_h) ++ { ++ WARN("Destination out of bounds.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ if ((src_format->flags & WINED3DFMT_FLAG_BLOCKS) && !surface_check_block_align(src_surface, src_rect)) ++ { ++ WARN("Source rectangle not block-aligned.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ SetRect(&dst_rect, dst_point->x, dst_point->y, dst_point->x + update_w, dst_point->y + update_h); ++ if ((dst_format->flags & WINED3DFMT_FLAG_BLOCKS) && !surface_check_block_align(dst_surface, &dst_rect)) ++ { ++ WARN("Destination rectangle not block-aligned.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ + if (wined3d_settings.cs_multithreaded) + { + FIXME("Waiting for cs.\n"); +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 2620570..c47f78c 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -1420,7 +1420,7 @@ static void surface_upload_data(struct wined3d_surface *surface, const struct wi + } + } + +-static BOOL surface_check_block_align(struct wined3d_surface *surface, const RECT *rect) ++BOOL surface_check_block_align(struct wined3d_surface *surface, const RECT *rect) + { + struct wined3d_box box; + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index a311a35..0d76377 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2412,6 +2412,7 @@ void wined3d_surface_destroy(struct wined3d_surface *surface) DECLSPEC_HIDDEN; + void surface_blt_ugly(struct wined3d_surface *dst_surface, const RECT *dst_rect_in, + struct wined3d_surface *src_surface, const RECT *src_rect_in, DWORD flags, + const WINEDDBLTFX *fx, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; ++BOOL surface_check_block_align(struct wined3d_surface *surface, const RECT *rect) DECLSPEC_HIDDEN; + + void draw_textured_quad(const struct wined3d_surface *src_surface, struct wined3d_context *context, + const RECT *src_rect, const RECT *dst_rect, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0074-wined3d-Get-rid-of-WINED3D_BUFFER_FLUSH.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0074-wined3d-Get-rid-of-WINED3D_BUFFER_FLUSH.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0074-wined3d-Get-rid-of-WINED3D_BUFFER_FLUSH.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0074-wined3d-Get-rid-of-WINED3D_BUFFER_FLUSH.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,57 @@ +From 7a25ed307d8aa08209a3e56ad4aa0bfc5995a5f3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 7 May 2013 14:53:48 +0200 +Subject: wined3d: Get rid of WINED3D_BUFFER_FLUSH + +--- + dlls/wined3d/buffer.c | 13 +++++-------- + 1 file changed, 5 insertions(+), 8 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index d2c1d62..5544640 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -32,10 +32,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); + #define WINED3D_BUFFER_HASDESC 0x01 /* A vertex description has been found. */ + #define WINED3D_BUFFER_CREATEBO 0x02 /* Create a buffer object for this buffer. */ + #define WINED3D_BUFFER_DOUBLEBUFFER 0x04 /* Keep both a buffer object and a system memory copy for this buffer. */ +-#define WINED3D_BUFFER_FLUSH 0x08 /* Manual unmap flushing. */ +-#define WINED3D_BUFFER_DISCARD 0x10 /* A DISCARD lock has occurred since the last preload. */ +-#define WINED3D_BUFFER_SYNC 0x20 /* There has been at least one synchronized map since the last preload. */ +-#define WINED3D_BUFFER_APPLESYNC 0x40 /* Using sync as in GL_APPLE_flush_buffer_range. */ ++#define WINED3D_BUFFER_DISCARD 0x08 /* A DISCARD lock has occurred since the last preload. */ ++#define WINED3D_BUFFER_SYNC 0x10 /* There has been at least one synchronized map since the last preload. */ ++#define WINED3D_BUFFER_APPLESYNC 0x20 /* Using sync as in GL_APPLE_flush_buffer_range. */ + + #define VB_MAXDECLCHANGES 100 /* After that number of decl changes we stop converting */ + #define VB_RESETDECLCHANGE 1000 /* Reset the decl changecount after that number of draws */ +@@ -167,8 +166,6 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This, struct wine + { + GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE)); + checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE)"); +- This->flags |= WINED3D_BUFFER_FLUSH; +- + GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE)); + checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE)"); + This->flags |= WINED3D_BUFFER_APPLESYNC; +@@ -707,7 +704,7 @@ static void buffer_direct_upload(struct wined3d_buffer *This, const struct wined + GL_EXTCALL(glFlushMappedBufferRange(This->buffer_type_hint, start, len)); + checkGLcall("glFlushMappedBufferRange"); + } +- else if (This->flags & WINED3D_BUFFER_FLUSH) ++ else if (This->flags & WINED3D_BUFFER_APPLESYNC) + { + GL_EXTCALL(glFlushMappedBufferRangeAPPLE(This->buffer_type_hint, start, len)); + checkGLcall("glFlushMappedBufferRangeAPPLE"); +@@ -1112,7 +1109,7 @@ void CDECL wined3d_buffer_unmap(struct wined3d_buffer *buffer) + checkGLcall("glFlushMappedBufferRange"); + } + } +- else if (buffer->flags & WINED3D_BUFFER_FLUSH) ++ else if (buffer->flags & WINED3D_BUFFER_APPLESYNC) + { + for (i = 0; i < buffer->modified_areas; ++i) + { +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0075-wined3d-Add-cs-waiting-debug-code.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0075-wined3d-Add-cs-waiting-debug-code.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0075-wined3d-Add-cs-waiting-debug-code.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0075-wined3d-Add-cs-waiting-debug-code.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,29 @@ +From 121bee481f27a42d6a759a29a01b002ecffec65e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Jul 2013 20:40:39 +0200 +Subject: wined3d: Add cs waiting debug code + +--- + dlls/wined3d/texture.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index 8212c96..b7891d9 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -667,6 +667,12 @@ HRESULT CDECL wined3d_texture_set_color_key(struct wined3d_texture *texture, + return WINED3DERR_INVALIDCALL; + } + ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("waiting for cs\n"); ++ texture->resource.device->cs->ops->finish(texture->resource.device->cs); ++ } ++ + if (color_key) + { + switch (flags & ~WINEDDCKEY_COLORSPACE) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0076-wined3d-Don-t-force-strict-draw-ordering-for-multith.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0076-wined3d-Don-t-force-strict-draw-ordering-for-multith.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0076-wined3d-Don-t-force-strict-draw-ordering-for-multith.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0076-wined3d-Don-t-force-strict-draw-ordering-for-multith.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,26 @@ +From 6464090c8161886fba8637324b7714d67accf7c9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Jul 2013 21:00:17 +0200 +Subject: wined3d: Don't force strict draw ordering for multithreaded CS + +Shouldn't be needed any more +--- + dlls/wined3d/wined3d_main.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c +index 5471e6e..e6dc444 100644 +--- a/dlls/wined3d/wined3d_main.c ++++ b/dlls/wined3d/wined3d_main.c +@@ -310,8 +310,6 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL) + { + TRACE("Enabling multithreaded command stream.\n"); + wined3d_settings.cs_multithreaded = TRUE; +- TRACE("Enforcing strict draw ordering for multithreaded command stream.\n"); +- wined3d_settings.strict_draw_ordering = TRUE; + } + } + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0077-wined3d-Send-render-target-view-clears-through-the-c.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0077-wined3d-Send-render-target-view-clears-through-the-c.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0077-wined3d-Send-render-target-view-clears-through-the-c.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0077-wined3d-Send-render-target-view-clears-through-the-c.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,118 @@ +From 793b7f174651b67263e170e1144b3c293eac651f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Jul 2013 21:10:16 +0200 +Subject: wined3d: Send render target view clears through the command stream + +--- + dlls/wined3d/cs.c | 36 ++++++++++++++++++++++++++++++++++++ + dlls/wined3d/device.c | 12 ++---------- + dlls/wined3d/wined3d_private.h | 2 ++ + 3 files changed, 40 insertions(+), 10 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index dcaedfd..366a4d3 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -74,6 +74,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_SET_LIGHT, + WINED3D_CS_OP_SET_LIGHT_ENABLE, + WINED3D_CS_OP_BLT, ++ WINED3D_CS_OP_CLEAR_RTV, + WINED3D_CS_OP_STOP, + }; + +@@ -343,6 +344,14 @@ struct wined3d_cs_blt + enum wined3d_texture_filter_type filter; + }; + ++struct wined3d_cs_clear_rtv ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_rendertarget_view *view; ++ RECT rect; ++ struct wined3d_color color; ++}; ++ + /* FIXME: The list synchronization probably isn't particularly fast. */ + static void wined3d_cs_list_enqueue(struct wined3d_cs_list *list, struct wined3d_cs_block *block) + { +@@ -1652,6 +1661,32 @@ void wined3d_cs_emit_blt(struct wined3d_cs *cs, struct wined3d_surface *dst_surf + cs->ops->submit(cs); + } + ++static UINT wined3d_cs_exec_clear_rtv(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_clear_rtv *op = data; ++ struct wined3d_resource *resource = op->view->resource; ++ ++ resource = wined3d_texture_get_sub_resource(wined3d_texture_from_resource(resource), op->view->sub_resource_idx); ++ ++ surface_color_fill(surface_from_resource(resource), &op->rect, &op->color); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_clear_rtv(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view, ++ const RECT *rect, const struct wined3d_color *color) ++{ ++ struct wined3d_cs_clear_rtv *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_CLEAR_RTV; ++ op->view = view; ++ op->rect = *rect; ++ op->color = *color; ++ ++ cs->ops->submit(cs); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_FENCE */ wined3d_cs_exec_fence, +@@ -1692,6 +1727,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_SET_LIGHT */ wined3d_cs_exec_set_light, + /* WINED3D_CS_OP_SET_LIGHT_ENABLE */ wined3d_cs_exec_set_light_enable, + /* WINED3D_CS_OP_BLT */ wined3d_cs_exec_blt, ++ /* WINED3D_CS_OP_CLEAR_RTV */ wined3d_cs_exec_clear_rtv, + }; + + static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 599a25d..b2e7ec3 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -3917,16 +3917,8 @@ HRESULT CDECL wined3d_device_clear_rendertarget_view(struct wined3d_device *devi + rect = &r; + } + +- if (wined3d_settings.cs_multithreaded) +- { +- FIXME("Waiting for cs.\n"); +- wined3d_cs_emit_glfinish(device->cs); +- device->cs->ops->finish(device->cs); +- } +- +- resource = wined3d_texture_get_sub_resource(wined3d_texture_from_resource(resource), view->sub_resource_idx); +- +- return surface_color_fill(surface_from_resource(resource), rect, color); ++ wined3d_cs_emit_clear_rtv(device->cs, view, rect, color); ++ return WINED3D_OK; + } + + struct wined3d_rendertarget_view * CDECL wined3d_device_get_rendertarget_view(const struct wined3d_device *device, +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 0d76377..e554099 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2638,6 +2638,8 @@ void wined3d_cs_emit_blt(struct wined3d_cs *cs, struct wined3d_surface *dst_surf + const RECT *dst_rect, struct wined3d_surface *src_surface, + const RECT *src_rect, DWORD flags, const WINEDDBLTFX *fx, + enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_clear_rtv(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view, ++ const RECT *rect, const struct wined3d_color *color) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0078-wined3d-Wait-for-the-CS-in-GetDC.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0078-wined3d-Wait-for-the-CS-in-GetDC.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0078-wined3d-Wait-for-the-CS-in-GetDC.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0078-wined3d-Wait-for-the-CS-in-GetDC.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,37 @@ +From 7cebca953dd9d2a81646a5277ff700e94cf401da Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 26 Sep 2013 16:40:34 +0200 +Subject: wined3d: Wait for the CS in GetDC. + +--- + dlls/wined3d/surface.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index c47f78c..9dadb6d 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -2478,6 +2478,20 @@ HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc) + + TRACE("surface %p, dc %p.\n", surface, dc); + ++ if (!(surface->resource.format->flags & WINED3DFMT_FLAG_GETDC)) ++ { ++ WARN("Cannot use GetDC on a %s surface.\n", debug_d3dformat(surface->resource.format->id)); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ if (wined3d_settings.cs_multithreaded) ++ { ++ struct wined3d_device *device = surface->resource.device; ++ FIXME("Waiting for cs.\n"); ++ wined3d_cs_emit_glfinish(device->cs); ++ device->cs->ops->finish(device->cs); ++ } ++ + /* Give more detailed info for ddraw. */ + if (surface->flags & SFLAG_DCINUSE) + return WINEDDERR_DCALREADYCREATED; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0079-wined3d-send-resource-maps-through-the-command-strea.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0079-wined3d-send-resource-maps-through-the-command-strea.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0079-wined3d-send-resource-maps-through-the-command-strea.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0079-wined3d-send-resource-maps-through-the-command-strea.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,273 @@ +From aebae1f8597794f2fab4b468f2573a8591f60615 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 26 Sep 2013 16:41:00 +0200 +Subject: wined3d: send resource maps through the command stream + +Slow version only. Good enough to dodge some Nvidia bugs in the ddraw tests. +--- + dlls/wined3d/cs.c | 69 +++++++++++++++++++++++++++++++++++++ + dlls/wined3d/resource.c | 77 ++++++++++++++++++++++++------------------ + dlls/wined3d/wined3d_private.h | 5 +++ + 3 files changed, 119 insertions(+), 32 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 366a4d3..b691924 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -75,6 +75,8 @@ enum wined3d_cs_op + WINED3D_CS_OP_SET_LIGHT_ENABLE, + WINED3D_CS_OP_BLT, + WINED3D_CS_OP_CLEAR_RTV, ++ WINED3D_CS_OP_RESOURCE_MAP, ++ WINED3D_CS_OP_RESOURCE_UNMAP, + WINED3D_CS_OP_STOP, + }; + +@@ -352,6 +354,20 @@ struct wined3d_cs_clear_rtv + struct wined3d_color color; + }; + ++struct wined3d_cs_resource_map ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_resource *resource; ++ DWORD flags; ++ void **mem; ++}; ++ ++struct wined3d_cs_resource_unmap ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_resource *resource; ++}; ++ + /* FIXME: The list synchronization probably isn't particularly fast. */ + static void wined3d_cs_list_enqueue(struct wined3d_cs_list *list, struct wined3d_cs_block *block) + { +@@ -1687,6 +1703,57 @@ void wined3d_cs_emit_clear_rtv(struct wined3d_cs *cs, struct wined3d_rendertarge + cs->ops->submit(cs); + } + ++static UINT wined3d_cs_exec_resource_map(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_resource_map *op = data; ++ ++ *op->mem = wined3d_resource_map_internal(op->resource, op->flags); ++ ++ return sizeof(*op); ++} ++ ++void *wined3d_cs_emit_resource_map(struct wined3d_cs *cs, struct wined3d_resource *resource, ++ DWORD flags) ++{ ++ struct wined3d_cs_resource_map *op; ++ void *ret; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_RESOURCE_MAP; ++ op->resource = resource; ++ op->flags = flags; ++ op->mem = &ret; ++ ++ cs->ops->finish(cs); ++ ++ if (flags & (WINED3D_MAP_NOOVERWRITE | WINED3D_MAP_DISCARD)) ++ { ++ FIXME("Dynamic resource map is inefficient\n"); ++ } ++ return ret; ++} ++ ++static UINT wined3d_cs_exec_resource_unmap(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_resource_unmap *op = data; ++ struct wined3d_resource *resource = op->resource; ++ ++ wined3d_resource_unmap_internal(resource); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_resource_unmap(struct wined3d_cs *cs, struct wined3d_resource *resource) ++{ ++ struct wined3d_cs_resource_unmap *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_RESOURCE_UNMAP; ++ op->resource = resource; ++ ++ cs->ops->submit(cs); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_FENCE */ wined3d_cs_exec_fence, +@@ -1728,6 +1795,8 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_SET_LIGHT_ENABLE */ wined3d_cs_exec_set_light_enable, + /* WINED3D_CS_OP_BLT */ wined3d_cs_exec_blt, + /* WINED3D_CS_OP_CLEAR_RTV */ wined3d_cs_exec_clear_rtv, ++ /* WINED3D_CS_OP_RESOURCE_MAP */ wined3d_cs_exec_resource_map, ++ /* WINED3D_CS_OP_RESOURCE_UNMAP */ wined3d_cs_exec_resource_unmap, + }; + + static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index bf228d1..af60d51 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -683,31 +683,11 @@ BOOL wined3d_resource_check_block_align(const struct wined3d_resource *resource, + return TRUE; + } + +-HRESULT wined3d_resource_map(struct wined3d_resource *resource, +- struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags) ++void *wined3d_resource_map_internal(struct wined3d_resource *resource, DWORD flags) + { + struct wined3d_device *device = resource->device; + struct wined3d_context *context = NULL; +- BYTE *base_memory; +- const struct wined3d_format *format = resource->format; +- +- TRACE("resource %p, map_desc %p, box %p, flags %#x.\n", +- resource, map_desc, box, flags); +- +- if (resource->map_count) +- { +- WARN("Volume is already mapped.\n"); +- return WINED3DERR_INVALIDCALL; +- } +- +- flags = wined3d_resource_sanitize_map_flags(resource, flags); +- +- if (wined3d_settings.cs_multithreaded) +- { +- FIXME("Waiting for cs.\n"); +- wined3d_cs_emit_glfinish(device->cs); +- device->cs->ops->finish(device->cs); +- } ++ void *mem; + + if (device->d3d_initialized) + context = context_acquire(device, NULL); +@@ -715,9 +695,8 @@ HRESULT wined3d_resource_map(struct wined3d_resource *resource, + if (!wined3d_resource_prepare_map_memory(resource, context)) + { + WARN("Out of memory.\n"); +- map_desc->data = NULL; + context_release(context); +- return E_OUTOFMEMORY; ++ return NULL; + } + + if (flags & WINED3D_MAP_DISCARD) +@@ -725,11 +704,39 @@ HRESULT wined3d_resource_map(struct wined3d_resource *resource, + else + wined3d_resource_load_location(resource, context, resource->map_binding); + +- base_memory = wined3d_resource_get_map_ptr(resource, context, flags); ++ mem = wined3d_resource_get_map_ptr(resource, context, flags); + + if (context) + context_release(context); + ++ return mem; ++} ++ ++HRESULT wined3d_resource_map(struct wined3d_resource *resource, ++ struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags) ++{ ++ struct wined3d_device *device = resource->device; ++ BYTE *base_memory; ++ const struct wined3d_format *format = resource->format; ++ ++ TRACE("resource %p, map_desc %p, box %p, flags %#x.\n", ++ resource, map_desc, box, flags); ++ ++ if (resource->map_count) ++ { ++ WARN("Volume is already mapped.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ flags = wined3d_resource_sanitize_map_flags(resource, flags); ++ ++ base_memory = wined3d_cs_emit_resource_map(device->cs, resource, flags); ++ if (!base_memory) ++ { ++ WARN("Map failed.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ + TRACE("Base memory pointer %p.\n", base_memory); + + if (format->flags & WINED3DFMT_FLAG_BROKEN_PITCH) +@@ -781,10 +788,21 @@ HRESULT wined3d_resource_map(struct wined3d_resource *resource, + return WINED3D_OK; + } + +-HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) ++void wined3d_resource_unmap_internal(struct wined3d_resource *resource) + { + struct wined3d_device *device = resource->device; + struct wined3d_context *context = NULL; ++ ++ if (device->d3d_initialized) ++ context = context_acquire(device, NULL); ++ wined3d_resource_release_map_ptr(resource, context); ++ if (context) ++ context_release(context); ++} ++ ++HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) ++{ ++ struct wined3d_device *device = resource->device; + TRACE("resource %p.\n", resource); + + if (!resource->map_count) +@@ -793,12 +811,7 @@ HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) + return WINEDDERR_NOTLOCKED; + } + +- if (device->d3d_initialized) +- context = context_acquire(device, NULL); +- wined3d_resource_release_map_ptr(resource, context); +- if (context) +- context_release(context); +- ++ wined3d_cs_emit_resource_unmap(device->cs, resource); + resource->map_count--; + + return WINED3D_OK; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index e554099..6ee0c24 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2153,6 +2153,7 @@ void wined3d_resource_load_location(struct wined3d_resource *resource, + struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; + HRESULT wined3d_resource_map(struct wined3d_resource *resource, struct wined3d_map_desc *map_desc, + const struct wined3d_box *box, DWORD flags) DECLSPEC_HIDDEN; ++void *wined3d_resource_map_internal(struct wined3d_resource *resource, DWORD flags) DECLSPEC_HIDDEN; + BOOL wined3d_resource_prepare_map_memory(struct wined3d_resource *resource, + struct wined3d_context *context) DECLSPEC_HIDDEN; + BOOL wined3d_resource_prepare_system_memory(struct wined3d_resource *resource) DECLSPEC_HIDDEN; +@@ -2160,6 +2161,7 @@ void wined3d_resource_release_map_ptr(const struct wined3d_resource *resource, + const struct wined3d_context *context) DECLSPEC_HIDDEN; + DWORD wined3d_resource_sanitize_map_flags(const struct wined3d_resource *resource, DWORD flags) DECLSPEC_HIDDEN; + HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++void wined3d_resource_unmap_internal(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_validate_location(struct wined3d_resource *resource, DWORD location) DECLSPEC_HIDDEN; + +@@ -2640,6 +2642,9 @@ void wined3d_cs_emit_blt(struct wined3d_cs *cs, struct wined3d_surface *dst_surf + enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; + void wined3d_cs_emit_clear_rtv(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view, + const RECT *rect, const struct wined3d_color *color) DECLSPEC_HIDDEN; ++void *wined3d_cs_emit_resource_map(struct wined3d_cs *cs, struct wined3d_resource *resource, ++ DWORD flags) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_resource_unmap(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0080-wined3d-Get-rid-of-the-end_scene-flush-and-finish.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0080-wined3d-Get-rid-of-the-end_scene-flush-and-finish.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0080-wined3d-Get-rid-of-the-end_scene-flush-and-finish.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0080-wined3d-Get-rid-of-the-end_scene-flush-and-finish.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,45 @@ +From 907befb9104d166a5423d92c8aec0e8d6835bb92 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Jul 2013 22:59:33 +0200 +Subject: wined3d: Get rid of the end_scene flush and finish + +Either keep the patch this way, or send a flush through the CS. I'm not +sure it's worth it though, this has never had any real performance +impact. +--- + dlls/wined3d/device.c | 12 ------------ + 1 file changed, 12 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index b2e7ec3..cd90c76 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -3224,8 +3224,6 @@ HRESULT CDECL wined3d_device_begin_scene(struct wined3d_device *device) + + HRESULT CDECL wined3d_device_end_scene(struct wined3d_device *device) + { +- struct wined3d_context *context; +- + TRACE("device %p.\n", device); + + if (!device->inScene) +@@ -3234,16 +3232,6 @@ HRESULT CDECL wined3d_device_end_scene(struct wined3d_device *device) + return WINED3DERR_INVALIDCALL; + } + +- context = context_acquire(device, NULL); +- /* We only have to do this if we need to read the, swapbuffers performs a flush for us */ +- if (wined3d_settings.cs_multithreaded) +- context->gl_info->gl_ops.gl.p_glFinish(); +- else +- context->gl_info->gl_ops.gl.p_glFlush(); +- /* No checkGLcall here to avoid locking the lock just for checking a call that hardly ever +- * fails. */ +- context_release(context); +- + device->inScene = FALSE; + return WINED3D_OK; + } +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0081-wined3d-Replace-the-linked-lists-with-a-ringbuffer.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0081-wined3d-Replace-the-linked-lists-with-a-ringbuffer.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0081-wined3d-Replace-the-linked-lists-with-a-ringbuffer.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0081-wined3d-Replace-the-linked-lists-with-a-ringbuffer.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,843 @@ +From 68ab1f57ab88ea0592fcaa9c2c73a283fdb8dd3c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Jul 2013 23:33:14 +0200 +Subject: wined3d: Replace the linked lists with a ringbuffer + +--- + dlls/wined3d/cs.c | 360 ++++++++++++++++++----------------------- + dlls/wined3d/wined3d_private.h | 20 +-- + 2 files changed, 161 insertions(+), 219 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index b691924..d35f114 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -22,20 +22,10 @@ + + WINE_DEFAULT_DEBUG_CHANNEL(d3d); + +-#define WINED3D_INITIAL_CS_SIZE 4096 +- +-static CRITICAL_SECTION wined3d_cs_list_mutex; +-static CRITICAL_SECTION_DEBUG wined3d_cs_list_mutex_debug = +-{ +- 0, 0, &wined3d_cs_list_mutex, +- {&wined3d_cs_list_mutex_debug.ProcessLocksList, +- &wined3d_cs_list_mutex_debug.ProcessLocksList}, +- 0, 0, {(DWORD_PTR)(__FILE__ ": wined3d_cs_list_mutex")} +-}; +-static CRITICAL_SECTION wined3d_cs_list_mutex = {&wined3d_cs_list_mutex_debug, -1, 0, 0, 0, 0}; +- + enum wined3d_cs_op + { ++ WINED3D_CS_OP_NOP, ++ WINED3D_CS_OP_SKIP, + WINED3D_CS_OP_FENCE, + WINED3D_CS_OP_PRESENT, + WINED3D_CS_OP_CLEAR, +@@ -368,99 +358,30 @@ struct wined3d_cs_resource_unmap + struct wined3d_resource *resource; + }; + +-/* FIXME: The list synchronization probably isn't particularly fast. */ +-static void wined3d_cs_list_enqueue(struct wined3d_cs_list *list, struct wined3d_cs_block *block) +-{ +- EnterCriticalSection(&wined3d_cs_list_mutex); +- list_add_tail(&list->blocks, &block->entry); +- LeaveCriticalSection(&wined3d_cs_list_mutex); +-} +- +-static struct wined3d_cs_block *wined3d_cs_list_dequeue(struct wined3d_cs_list *list) +-{ +- struct list *head; +- +- EnterCriticalSection(&wined3d_cs_list_mutex); +- if (!(head = list_head(&list->blocks))) +- { +- LeaveCriticalSection(&wined3d_cs_list_mutex); +- return NULL; +- } +- list_remove(head); +- LeaveCriticalSection(&wined3d_cs_list_mutex); +- +- return LIST_ENTRY(head, struct wined3d_cs_block, entry); +-} +- +-static struct wined3d_cs_block *wined3d_cs_list_dequeue_blocking(struct wined3d_cs_list *list) +-{ +- struct wined3d_cs_block *block; +- +- /* FIXME: Use an event to wait after a couple of spins. */ +- for (;;) +- { +- if ((block = wined3d_cs_list_dequeue(list))) +- return block; +- } +-} +- +-static void wined3d_cs_list_init(struct wined3d_cs_list *list) +-{ +- list_init(&list->blocks); +-} +- +-static struct wined3d_cs_block *wined3d_cs_get_thread_block(const struct wined3d_cs *cs) +-{ +- return TlsGetValue(cs->tls_idx); +-} +- +-static void wined3d_cs_set_thread_block(const struct wined3d_cs *cs, struct wined3d_cs_block *block) ++struct wined3d_cs_skip + { +- if (!TlsSetValue(cs->tls_idx, block)) +- ERR("Failed to set thread block.\n"); +-} ++ enum wined3d_cs_op opcode; ++ DWORD size; ++}; + +-static void wined3d_cs_flush(struct wined3d_cs *cs) ++static void wined3d_cs_submit(struct wined3d_cs *cs, size_t size) + { +- wined3d_cs_list_enqueue(&cs->exec_list, wined3d_cs_get_thread_block(cs)); +- wined3d_cs_set_thread_block(cs, NULL); ++ LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); ++ /* There is only one thread writing to queue.head, InterlockedExchange ++ * is used for the memory barrier. */ ++ InterlockedExchange(&cs->queue.head, new_val); + } + +-static struct wined3d_cs_block *wined3d_cs_get_block(struct wined3d_cs *cs) ++static UINT wined3d_cs_exec_nop(struct wined3d_cs *cs, const void *data) + { +- struct wined3d_cs_block *block; +- +- if (!(block = wined3d_cs_list_dequeue(&cs->free_list))) +- { +- if (!(block = HeapAlloc(GetProcessHeap(), 0, sizeof(*block)))) +- { +- ERR("Failed to get new block.\n"); +- return NULL; +- } +- } +- +- block->pos = 0; +- +- return block; ++ return sizeof(enum wined3d_cs_op); + } + +-static void *wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size) ++static UINT wined3d_cs_exec_skip(struct wined3d_cs *cs, const void *data) + { +- struct wined3d_cs_block *block = wined3d_cs_get_thread_block(cs); +- void *data; +- +- if (!block || block->pos + size > sizeof(block->data)) +- { +- if (block) +- wined3d_cs_flush(cs); +- block = wined3d_cs_get_block(cs); +- wined3d_cs_set_thread_block(cs, block); +- } ++ const struct wined3d_cs_skip *op = data; + +- data = &block->data[block->pos]; +- block->pos += size; +- +- return data; ++ return op->size; + } + + static UINT wined3d_cs_exec_fence(struct wined3d_cs *cs, const void *data) +@@ -481,14 +402,14 @@ static void wined3d_cs_emit_fence(struct wined3d_cs *cs, BOOL *signalled) + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_FENCE; + op->signalled = signalled; ++ cs->ops->submit(cs, sizeof(*op)); + } + +-static void wined3d_cs_flush_and_wait(struct wined3d_cs *cs) ++static void wined3d_cs_finish(struct wined3d_cs *cs) + { + BOOL fence; + + wined3d_cs_emit_fence(cs, &fence); +- wined3d_cs_flush(cs); + + /* A busy wait should be fine, we're not supposed to have to wait very + * long. */ +@@ -546,7 +467,7 @@ void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *sw + + pending = InterlockedIncrement(&cs->pending_presents); + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + + while (pending > 1) + pending = InterlockedCompareExchange(&cs->pending_presents, 0, 0); +@@ -573,8 +494,9 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT * + { + struct wined3d_cs_clear *op; + unsigned int extra_rects = rect_count ? rect_count - 1 : 0; ++ size_t size = sizeof(*op) + sizeof(*op->rects) * extra_rects; + +- op = cs->ops->require_space(cs, sizeof(*op) + sizeof(*op->rects) * extra_rects); ++ op = cs->ops->require_space(cs, size); + op->opcode = WINED3D_CS_OP_CLEAR; + op->rect_count = rect_count; + if (rect_count) +@@ -584,7 +506,7 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT * + op->depth = depth; + op->stencil = stencil; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, size); + } + + static UINT wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data) +@@ -625,7 +547,7 @@ void wined3d_cs_emit_draw(struct wined3d_cs *cs, UINT start_idx, UINT index_coun + op->instance_count = instance_count; + op->indexed = indexed; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_predication(struct wined3d_cs *cs, const void *data) +@@ -647,7 +569,7 @@ void wined3d_cs_emit_set_predication(struct wined3d_cs *cs, struct wined3d_query + op->predicate = predicate; + op->value = value; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_viewport(struct wined3d_cs *cs, const void *data) +@@ -669,7 +591,7 @@ void wined3d_cs_emit_set_viewport(struct wined3d_cs *cs, const struct wined3d_vi + op->opcode = WINED3D_CS_OP_SET_VIEWPORT; + op->viewport = *viewport; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_scissor_rect(struct wined3d_cs *cs, const void *data) +@@ -690,7 +612,7 @@ void wined3d_cs_emit_set_scissor_rect(struct wined3d_cs *cs, const RECT *rect) + op->opcode = WINED3D_CS_OP_SET_SCISSOR_RECT; + op->rect = *rect; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_rendertarget_view(struct wined3d_cs *cs, const void *data) +@@ -713,7 +635,7 @@ void wined3d_cs_emit_set_rendertarget_view(struct wined3d_cs *cs, unsigned int v + op->view_idx = view_idx; + op->view = view; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const void *data) +@@ -766,7 +688,7 @@ void wined3d_cs_emit_set_depth_stencil_view(struct wined3d_cs *cs, struct wined3 + op->opcode = WINED3D_CS_OP_SET_DEPTH_STENCIL_VIEW; + op->view = view; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_vertex_declaration(struct wined3d_cs *cs, const void *data) +@@ -787,7 +709,7 @@ void wined3d_cs_emit_set_vertex_declaration(struct wined3d_cs *cs, struct wined3 + op->opcode = WINED3D_CS_OP_SET_VERTEX_DECLARATION; + op->declaration = declaration; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_stream_source(struct wined3d_cs *cs, const void *data) +@@ -824,7 +746,7 @@ void wined3d_cs_emit_set_stream_source(struct wined3d_cs *cs, UINT stream_idx, + op->offset = offset; + op->stride = stride; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_stream_source_freq(struct wined3d_cs *cs, const void *data) +@@ -851,7 +773,7 @@ void wined3d_cs_emit_set_stream_source_freq(struct wined3d_cs *cs, UINT stream_i + op->frequency = frequency; + op->flags = flags; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_stream_output(struct wined3d_cs *cs, const void *data) +@@ -884,7 +806,7 @@ void wined3d_cs_emit_set_stream_output(struct wined3d_cs *cs, UINT stream_idx, + op->buffer = buffer; + op->offset = offset; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_index_buffer(struct wined3d_cs *cs, const void *data) +@@ -916,7 +838,7 @@ void wined3d_cs_emit_set_index_buffer(struct wined3d_cs *cs, struct wined3d_buff + op->buffer = buffer; + op->format_id = format_id; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_constant_buffer(struct wined3d_cs *cs, const void *data) +@@ -947,7 +869,7 @@ void wined3d_cs_emit_set_constant_buffer(struct wined3d_cs *cs, enum wined3d_sha + op->cb_idx = cb_idx; + op->buffer = buffer; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_texture(struct wined3d_cs *cs, const void *data) +@@ -1022,7 +944,7 @@ void wined3d_cs_emit_set_texture(struct wined3d_cs *cs, UINT stage, struct wined + op->opcode = WINED3D_CS_OP_SET_TEXTURE; + op->stage = stage; + op->texture = texture; +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_shader_resource_view(struct wined3d_cs *cs, const void *data) +@@ -1045,7 +967,7 @@ void wined3d_cs_emit_set_shader_resource_view(struct wined3d_cs *cs, enum wined3 + op->view_idx = view_idx; + op->view = view; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_sampler(struct wined3d_cs *cs, const void *data) +@@ -1068,7 +990,7 @@ void wined3d_cs_emit_set_sampler(struct wined3d_cs *cs, enum wined3d_shader_type + op->sampler_idx = sampler_idx; + op->sampler = sampler; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_shader(struct wined3d_cs *cs, const void *data) +@@ -1089,6 +1011,8 @@ void wined3d_cs_emit_set_shader(struct wined3d_cs *cs, enum wined3d_shader_type + op->opcode = WINED3D_CS_OP_SET_SHADER; + op->type = type; + op->shader = shader; ++ ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_vs_consts_f(struct wined3d_cs *cs, const void *data) +@@ -1124,8 +1048,9 @@ void wined3d_cs_emit_set_consts_f(struct wined3d_cs *cs, UINT start_register, + { + struct wined3d_cs_set_consts_f *op; + UINT extra_space = vector4f_count - 1; ++ size_t size = sizeof(*op) + sizeof(op->constants) * extra_space; + +- op = cs->ops->require_space(cs, sizeof(*op) + sizeof(op->constants) * extra_space); ++ op = cs->ops->require_space(cs, size); + switch (type) + { + case WINED3D_SHADER_TYPE_PIXEL: +@@ -1147,7 +1072,7 @@ void wined3d_cs_emit_set_consts_f(struct wined3d_cs *cs, UINT start_register, + op->vector4f_count = vector4f_count; + memcpy(op->constants, constants, sizeof(*constants) * 4 * vector4f_count); + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, size); + } + + static UINT wined3d_cs_exec_set_render_state(struct wined3d_cs *cs, const void *data) +@@ -1169,8 +1094,8 @@ void wined3d_cs_emit_set_render_state(struct wined3d_cs *cs, enum wined3d_render + op->state = state; + op->value = value; + +- cs->ops->submit(cs); +-}; ++ cs->ops->submit(cs, sizeof(*op)); ++} + + static UINT wined3d_cs_exec_set_vs_consts_b(struct wined3d_cs *cs, const void *data) + { +@@ -1203,8 +1128,9 @@ void wined3d_cs_emit_set_consts_b(struct wined3d_cs *cs, UINT start_register, + { + struct wined3d_cs_set_consts_b *op; + UINT extra_space = bool_count - 1; ++ size_t size = sizeof(*op) + sizeof(op->constants) * extra_space; + +- op = cs->ops->require_space(cs, sizeof(*op) + sizeof(op->constants) * extra_space); ++ op = cs->ops->require_space(cs, size); + switch (type) + { + case WINED3D_SHADER_TYPE_PIXEL: +@@ -1226,7 +1152,7 @@ void wined3d_cs_emit_set_consts_b(struct wined3d_cs *cs, UINT start_register, + op->bool_count = bool_count; + memcpy(op->constants, constants, sizeof(op->constants) * bool_count); + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, size); + } + + static UINT wined3d_cs_exec_set_vs_consts_i(struct wined3d_cs *cs, const void *data) +@@ -1260,8 +1186,9 @@ void wined3d_cs_emit_set_consts_i(struct wined3d_cs *cs, UINT start_register, + { + struct wined3d_cs_set_consts_i *op; + UINT extra_space = vector4i_count - 1; ++ size_t size = sizeof(*op) + sizeof(op->constants) * extra_space; + +- op = cs->ops->require_space(cs, sizeof(*op) + sizeof(op->constants) * extra_space); ++ op = cs->ops->require_space(cs, size); + switch (type) + { + case WINED3D_SHADER_TYPE_PIXEL: +@@ -1283,7 +1210,7 @@ void wined3d_cs_emit_set_consts_i(struct wined3d_cs *cs, UINT start_register, + op->vector4i_count = vector4i_count; + memcpy(op->constants, constants, sizeof(op->constants) * vector4i_count); + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, size); + } + + static UINT wined3d_cs_exec_set_texture_state(struct wined3d_cs *cs, const void *data) +@@ -1307,7 +1234,7 @@ void wined3d_cs_emit_set_texture_state(struct wined3d_cs *cs, UINT stage, + op->state = state; + op->value = value; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_sampler_state(struct wined3d_cs *cs, const void *data) +@@ -1331,7 +1258,7 @@ void wined3d_cs_emit_set_sampler_state(struct wined3d_cs *cs, UINT sampler_idx, + op->state = state; + op->value = value; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_transform(struct wined3d_cs *cs, const void *data) +@@ -1355,7 +1282,7 @@ void wined3d_cs_emit_set_transform(struct wined3d_cs *cs, enum wined3d_transform + op->state = state; + op->matrix = *matrix; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_clip_plane(struct wined3d_cs *cs, const void *data) +@@ -1377,7 +1304,7 @@ void wined3d_cs_emit_set_clip_plane(struct wined3d_cs *cs, UINT plane_idx, const + op->plane_idx = plane_idx; + op->plane = *plane; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_material(struct wined3d_cs *cs, const void *data) +@@ -1398,7 +1325,7 @@ void wined3d_cs_emit_set_material(struct wined3d_cs *cs, const struct wined3d_ma + op->opcode = WINED3D_CS_OP_SET_MATERIAL; + op->material = *material; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_reset_state(struct wined3d_cs *cs, const void *data) +@@ -1422,7 +1349,7 @@ void wined3d_cs_emit_reset_state(struct wined3d_cs *cs) + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_RESET_STATE; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_glfinish(struct wined3d_cs *cs, const void *data) +@@ -1448,7 +1375,7 @@ void wined3d_cs_emit_glfinish(struct wined3d_cs *cs) + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_GLFINISH; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_base_vertex_index(struct wined3d_cs *cs, const void *data) +@@ -1470,7 +1397,7 @@ void wined3d_cs_emit_set_base_vertex_index(struct wined3d_cs *cs, + op->opcode = WINED3D_CS_OP_SET_BASE_VERTEX_INDEX; + op->base_vertex_index = base_vertex_index; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_primitive_type(struct wined3d_cs *cs, const void *data) +@@ -1496,7 +1423,7 @@ void wined3d_cs_emit_set_primitive_type(struct wined3d_cs *cs, GLenum primitive_ + op->opcode = WINED3D_CS_OP_SET_PRIMITIVE_TYPE; + op->gl_primitive_type = primitive_type; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_light(struct wined3d_cs *cs, const void *data) +@@ -1553,7 +1480,7 @@ void wined3d_cs_emit_set_light(struct wined3d_cs *cs, const struct wined3d_light + op->opcode = WINED3D_CS_OP_SET_LIGHT; + op->light = *light; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_set_light_enable(struct wined3d_cs *cs, const void *data) +@@ -1642,7 +1569,7 @@ void wined3d_cs_emit_set_light_enable(struct wined3d_cs *cs, UINT idx, BOOL enab + op->idx = idx; + op->enable = enable; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_blt(struct wined3d_cs *cs, const void *data) +@@ -1674,7 +1601,7 @@ void wined3d_cs_emit_blt(struct wined3d_cs *cs, struct wined3d_surface *dst_surf + if (fx) + op->fx = *fx; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_clear_rtv(struct wined3d_cs *cs, const void *data) +@@ -1700,7 +1627,7 @@ void wined3d_cs_emit_clear_rtv(struct wined3d_cs *cs, struct wined3d_rendertarge + op->rect = *rect; + op->color = *color; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_resource_map(struct wined3d_cs *cs, const void *data) +@@ -1724,12 +1651,14 @@ void *wined3d_cs_emit_resource_map(struct wined3d_cs *cs, struct wined3d_resourc + op->flags = flags; + op->mem = &ret; + +- cs->ops->finish(cs); ++ cs->ops->submit(cs, sizeof(*op)); + + if (flags & (WINED3D_MAP_NOOVERWRITE | WINED3D_MAP_DISCARD)) + { + FIXME("Dynamic resource map is inefficient\n"); + } ++ cs->ops->finish(cs); ++ + return ret; + } + +@@ -1751,11 +1680,13 @@ void wined3d_cs_emit_resource_unmap(struct wined3d_cs *cs, struct wined3d_resour + op->opcode = WINED3D_CS_OP_RESOURCE_UNMAP; + op->resource = resource; + +- cs->ops->submit(cs); ++ cs->ops->submit(cs, sizeof(*op)); + } + + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { ++ /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, ++ /* WINED3D_CS_OP_SKIP */ wined3d_cs_exec_skip, + /* WINED3D_CS_OP_FENCE */ wined3d_cs_exec_fence, + /* WINED3D_CS_OP_PRESENT */ wined3d_cs_exec_present, + /* WINED3D_CS_OP_CLEAR */ wined3d_cs_exec_clear, +@@ -1799,42 +1730,59 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_RESOURCE_UNMAP */ wined3d_cs_exec_resource_unmap, + }; + +-static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) ++static void *wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size) + { +- if (size > cs->data_size) ++ struct wined3d_cs_queue *queue = &cs->queue; ++ size_t queue_size = sizeof(queue->data) / sizeof(*queue->data); ++ ++ if (queue_size - size < queue->head) + { +- void *new_data; ++ struct wined3d_cs_skip *skip; ++ size_t nop_size = queue_size - queue->head; + +- size = max( size, cs->data_size * 2 ); +- if (!(new_data = HeapReAlloc(GetProcessHeap(), 0, cs->data, size))) +- return NULL; ++ skip = wined3d_cs_mt_require_space(cs, nop_size); ++ if (nop_size < sizeof(*skip)) ++ { ++ skip->opcode = WINED3D_CS_OP_NOP; ++ } ++ else ++ { ++ skip->opcode = WINED3D_CS_OP_SKIP; ++ skip->size = nop_size; ++ } + +- cs->data_size = size; +- cs->data = new_data; ++ cs->ops->submit(cs, nop_size); ++ assert(!queue->head); + } + +- return cs->data; +-} ++ while(1) ++ { ++ LONG head = queue->head; ++ LONG tail = *((volatile LONG *)&queue->tail); ++ LONG new_pos; ++ /* Empty */ ++ if (head == tail) ++ break; ++ /* Head ahead of tail, take care of wrap-around */ ++ new_pos = (head + size) & (WINED3D_CS_QUEUE_SIZE - 1); ++ if (head > tail && (new_pos || tail)) ++ break; ++ /* Tail ahead of head, but still enough space */ ++ if (new_pos < tail && new_pos) ++ break; + +-static void wined3d_cs_st_submit(struct wined3d_cs *cs) +-{ +- enum wined3d_cs_op opcode = *(const enum wined3d_cs_op *)cs->data; ++ TRACE("Waiting for free space. Head %u, tail %u, want %u\n", head, tail, ++ (unsigned int) size); ++ } + +- wined3d_cs_op_handlers[opcode](cs, cs->data); ++ return &queue->data[queue->head]; + } + +-static const struct wined3d_cs_ops wined3d_cs_st_ops = +-{ +- wined3d_cs_st_require_space, +- wined3d_cs_st_submit, +- wined3d_cs_st_submit, +-}; +- + static const struct wined3d_cs_ops wined3d_cs_mt_ops = + { + wined3d_cs_mt_require_space, +- wined3d_cs_flush, +- wined3d_cs_flush_and_wait, ++ wined3d_cs_submit, ++ wined3d_cs_finish, + }; + + /* FIXME: wined3d_device_uninit_3d() should either flush and wait, or be an +@@ -1846,9 +1794,38 @@ static void wined3d_cs_emit_stop(struct wined3d_cs *cs) + op = wined3d_cs_mt_require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_STOP; + +- wined3d_cs_flush(cs); ++ wined3d_cs_submit(cs, sizeof(*op)); ++} ++ ++static void wined3d_cs_st_submit(struct wined3d_cs *cs, size_t size) ++{ ++ enum wined3d_cs_op opcode = *(const enum wined3d_cs_op *)&cs->queue.data; ++ ++ if (opcode >= WINED3D_CS_OP_STOP) ++ { ++ ERR("Invalid opcode %#x.\n", opcode); ++ return; ++ } ++ ++ wined3d_cs_op_handlers[opcode](cs, &cs->queue.data); + } + ++static void wined3d_cs_st_finish(struct wined3d_cs *cs) ++{ ++} ++ ++static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) ++{ ++ return cs->queue.data; ++} ++ ++static const struct wined3d_cs_ops wined3d_cs_st_ops = ++{ ++ wined3d_cs_st_require_space, ++ wined3d_cs_st_submit, ++ wined3d_cs_st_finish, ++}; ++ + void wined3d_cs_switch_onscreen_ds(struct wined3d_cs *cs, + struct wined3d_context *context, struct wined3d_surface *depth_stencil) + { +@@ -1868,31 +1845,32 @@ void wined3d_cs_switch_onscreen_ds(struct wined3d_cs *cs, + static DWORD WINAPI wined3d_cs_run(void *thread_param) + { + struct wined3d_cs *cs = thread_param; ++ enum wined3d_cs_op opcode; ++ LONG tail; + + TRACE("Started.\n"); + + cs->thread_id = GetCurrentThreadId(); + for (;;) + { +- struct wined3d_cs_block *block; +- UINT pos = 0; +- +- block = wined3d_cs_list_dequeue_blocking(&cs->exec_list); +- while (pos < block->pos) ++ if (*((volatile LONG *)&cs->queue.head) == cs->queue.tail) + { +- enum wined3d_cs_op opcode = *(const enum wined3d_cs_op *)&block->data[pos]; ++ continue; ++ } + +- if (opcode >= WINED3D_CS_OP_STOP) +- { +- if (opcode > WINED3D_CS_OP_STOP) +- ERR("Invalid opcode %#x.\n", opcode); +- goto done; +- } ++ tail = cs->queue.tail; ++ opcode = *(const enum wined3d_cs_op *)&cs->queue.data[tail]; + +- pos += wined3d_cs_op_handlers[opcode](cs, &block->data[pos]); ++ if (opcode >= WINED3D_CS_OP_STOP) ++ { ++ if (opcode > WINED3D_CS_OP_STOP) ++ ERR("Invalid opcode %#x.\n", opcode); ++ goto done; + } + +- wined3d_cs_list_enqueue(&cs->free_list, block); ++ tail += wined3d_cs_op_handlers[opcode](cs, &cs->queue.data[tail]); ++ tail &= (WINED3D_CS_QUEUE_SIZE - 1); ++ InterlockedExchange(&cs->queue.tail, tail); + } + + done: +@@ -1917,25 +1895,10 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) + cs->ops = &wined3d_cs_st_ops; + cs->device = device; + +- cs->data_size = WINED3D_INITIAL_CS_SIZE; +- if (!(cs->data = HeapAlloc(GetProcessHeap(), 0, cs->data_size))) +- { +- goto err; +- } +- +- if ((cs->tls_idx = TlsAlloc()) == TLS_OUT_OF_INDEXES) +- { +- ERR("Failed to allocate cs TLS index, err %#x.\n", GetLastError()); +- goto err; +- } +- + if (wined3d_settings.cs_multithreaded) + { + cs->ops = &wined3d_cs_mt_ops; + +- wined3d_cs_list_init(&cs->free_list); +- wined3d_cs_list_init(&cs->exec_list); +- + if (!(cs->thread = CreateThread(NULL, 0, wined3d_cs_run, cs, 0, NULL))) + { + ERR("Failed to create wined3d command stream thread.\n"); +@@ -1947,12 +1910,7 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) + + err: + if (cs) +- { + state_cleanup(&cs->state); +- if (cs->tls_idx != TLS_OUT_OF_INDEXES && !TlsFree(cs->tls_idx)) +- ERR("Failed to free cs TLS index, err %#x.\n", GetLastError()); +- HeapFree(GetProcessHeap(), 0, cs->data); +- } + HeapFree(GetProcessHeap(), 0, cs); + return NULL; + } +@@ -1971,17 +1929,7 @@ void wined3d_cs_destroy(struct wined3d_cs *cs) + CloseHandle(cs->thread); + if (ret != WAIT_OBJECT_0) + ERR("Wait failed (%#x).\n", ret); +- +- /* FIXME: Cleanup the block lists on thread exit. */ +-#if 0 +- wined3d_cs_list_cleanup(&cs->exec_list); +- wined3d_cs_list_cleanup(&cs->free_list); +-#endif + } + +- if (!TlsFree(cs->tls_idx)) +- ERR("Failed to free cs TLS index, err %#x.\n", GetLastError()); +- +- HeapFree(GetProcessHeap(), 0, cs->data); + HeapFree(GetProcessHeap(), 0, cs); + } +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 6ee0c24..59d9753 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -31,6 +31,7 @@ + #define WINE_GLAPI + #endif + ++#include + #include + #include + #include +@@ -2537,19 +2538,17 @@ struct wined3d_cs_list + struct list blocks; + }; + +-struct wined3d_cs_block ++#define WINED3D_CS_QUEUE_SIZE 0x100000 ++struct wined3d_cs_queue + { +- struct list entry; +- UINT pos; +- /* FIXME? The size is somewhat arbitrary. It's big enough for huge +- * shader constant set calls though */ +- BYTE data[sizeof(float) * 4 * 256 * 2]; ++ LONG head, tail; ++ BYTE data[WINED3D_CS_QUEUE_SIZE]; + }; + + struct wined3d_cs_ops + { + void *(*require_space)(struct wined3d_cs *cs, size_t size); +- void (*submit)(struct wined3d_cs *cs); ++ void (*submit)(struct wined3d_cs *cs, size_t size); + void (*finish)(struct wined3d_cs *cs); + }; + +@@ -2560,14 +2559,9 @@ struct wined3d_cs + struct wined3d_state state; + HANDLE thread; + DWORD thread_id; +- DWORD tls_idx; + struct wined3d_surface *onscreen_depth_stencil; + +- size_t data_size; +- void *data; +- +- struct wined3d_cs_list free_list; +- struct wined3d_cs_list exec_list; ++ struct wined3d_cs_queue queue; + + LONG pending_presents; + }; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0082-wined3d-Don-t-preload-buffers-on-unmap.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0082-wined3d-Don-t-preload-buffers-on-unmap.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0082-wined3d-Don-t-preload-buffers-on-unmap.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0082-wined3d-Don-t-preload-buffers-on-unmap.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,27 @@ +From 0603f71135885ebf0666d406380385936ed5ff7b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Jul 2013 23:40:56 +0200 +Subject: wined3d: Don't preload buffers on unmap + +--- + dlls/wined3d/buffer.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index 5544640..b76a07d 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -1129,10 +1129,6 @@ void CDECL wined3d_buffer_unmap(struct wined3d_buffer *buffer) + buffer_clear_dirty_areas(buffer); + buffer->map_ptr = NULL; + } +- else if (buffer->flags & WINED3D_BUFFER_HASDESC) +- { +- wined3d_buffer_preload(buffer); +- } + } + + static ULONG buffer_resource_incref(struct wined3d_resource *resource) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0083-wined3d-Don-t-call-glFinish-before-swapping.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0083-wined3d-Don-t-call-glFinish-before-swapping.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0083-wined3d-Don-t-call-glFinish-before-swapping.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0083-wined3d-Don-t-call-glFinish-before-swapping.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,29 @@ +From 808198079459086ac70236bacaacd85aa717f7ff Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Jul 2013 23:50:20 +0200 +Subject: wined3d: Don't call glFinish before swapping + +The code is probably not ready yet, so delay this patch until everything +is CSified. Right now I need it for performance testing. +--- + dlls/wined3d/swapchain.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index fa0c241..7ebdd1b 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -531,9 +531,7 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + swapchain_blit(swapchain, context, &src_rect, &dst_rect); + } + +- if (wined3d_settings.cs_multithreaded) +- gl_info->gl_ops.gl.p_glFinish(); +- else if (swapchain->num_contexts > 1) ++ if (swapchain->num_contexts > 1 && !wined3d_settings.cs_multithreaded) + gl_info->gl_ops.gl.p_glFlush(); + + /* call wglSwapBuffers through the gl table to avoid confusing the Steam overlay */ +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0084-wined3d-wined3d_-_query_issue-never-fails.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0084-wined3d-wined3d_-_query_issue-never-fails.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0084-wined3d-wined3d_-_query_issue-never-fails.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0084-wined3d-wined3d_-_query_issue-never-fails.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,116 @@ +From ea0804eca5b9d5df9eeb4a435d11ad1e6f4227b1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 6 Jul 2013 18:15:00 +0200 +Subject: wined3d: wined3d_*_query_issue never fails + +--- + dlls/wined3d/query.c | 21 ++++++++------------- + dlls/wined3d/wined3d_private.h | 2 +- + 2 files changed, 9 insertions(+), 14 deletions(-) + +diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c +index e755764..3de4282 100644 +--- a/dlls/wined3d/query.c ++++ b/dlls/wined3d/query.c +@@ -292,7 +292,8 @@ HRESULT CDECL wined3d_query_issue(struct wined3d_query *query, DWORD flags) + { + TRACE("query %p, flags %#x.\n", query, flags); + +- return query->query_ops->query_issue(query, flags); ++ query->query_ops->query_issue(query, flags); ++ return WINED3D_OK; + } + + static void fill_query_data(void *out, unsigned int out_size, const void *result, unsigned int result_size) +@@ -435,7 +436,7 @@ enum wined3d_query_type CDECL wined3d_query_get_type(const struct wined3d_query + return query->type; + } + +-static HRESULT wined3d_event_query_ops_issue(struct wined3d_query *query, DWORD flags) ++static void wined3d_event_query_ops_issue(struct wined3d_query *query, DWORD flags) + { + TRACE("query %p, flags %#x.\n", query, flags); + +@@ -445,7 +446,7 @@ static HRESULT wined3d_event_query_ops_issue(struct wined3d_query *query, DWORD + struct wined3d_event_query *event_query = query->extendedData; + + /* Faked event query support */ +- if (!event_query) return WINED3D_OK; ++ if (!event_query) return; + + wined3d_event_query_issue(event_query, query->device); + } +@@ -459,11 +460,9 @@ static HRESULT wined3d_event_query_ops_issue(struct wined3d_query *query, DWORD + query->state = QUERY_BUILDING; + else + query->state = QUERY_SIGNALLED; +- +- return WINED3D_OK; + } + +-static HRESULT wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD flags) ++static void wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD flags) + { + struct wined3d_device *device = query->device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; +@@ -542,7 +541,7 @@ static HRESULT wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DW + else + query->state = QUERY_SIGNALLED; + +- return WINED3D_OK; /* can be WINED3DERR_INVALIDCALL. */ ++ return; + } + + static HRESULT wined3d_timestamp_query_ops_get_data(struct wined3d_query *query, +@@ -605,7 +604,7 @@ static HRESULT wined3d_timestamp_query_ops_get_data(struct wined3d_query *query, + return res; + } + +-static HRESULT wined3d_timestamp_query_ops_issue(struct wined3d_query *query, DWORD flags) ++static void wined3d_timestamp_query_ops_issue(struct wined3d_query *query, DWORD flags) + { + struct wined3d_device *device = query->device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; +@@ -639,8 +638,6 @@ static HRESULT wined3d_timestamp_query_ops_issue(struct wined3d_query *query, DW + + if (flags & WINED3DISSUE_END) + query->state = QUERY_SIGNALLED; +- +- return WINED3D_OK; + } + + static HRESULT wined3d_timestamp_disjoint_query_ops_get_data(struct wined3d_query *query, +@@ -669,7 +666,7 @@ static HRESULT wined3d_timestamp_disjoint_query_ops_get_data(struct wined3d_quer + return S_OK; + } + +-static HRESULT wined3d_timestamp_disjoint_query_ops_issue(struct wined3d_query *query, DWORD flags) ++static void wined3d_timestamp_disjoint_query_ops_issue(struct wined3d_query *query, DWORD flags) + { + TRACE("query %p, flags %#x.\n", query, flags); + +@@ -677,8 +674,6 @@ static HRESULT wined3d_timestamp_disjoint_query_ops_issue(struct wined3d_query * + query->state = QUERY_BUILDING; + if (flags & WINED3DISSUE_END) + query->state = QUERY_SIGNALLED; +- +- return WINED3D_OK; + } + + static const struct wined3d_query_ops event_query_ops = +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 59d9753..ff05a97 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2653,7 +2653,7 @@ enum query_state { + struct wined3d_query_ops + { + HRESULT (*query_get_data)(struct wined3d_query *query, void *data, DWORD data_size, DWORD flags); +- HRESULT (*query_issue)(struct wined3d_query *query, DWORD flags); ++ void (*query_issue)(struct wined3d_query *query, DWORD flags); + }; + + struct wined3d_query +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0085-wined3d-Add-query-support-to-the-command-stream.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0085-wined3d-Add-query-support-to-the-command-stream.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0085-wined3d-Add-query-support-to-the-command-stream.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0085-wined3d-Add-query-support-to-the-command-stream.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,163 @@ +From c0687b2ce9d0056bce2fc514f25baa20ab834f1e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 6 Jul 2013 18:26:11 +0200 +Subject: wined3d: Add query support to the command stream + +--- + dlls/wined3d/cs.c | 73 ++++++++++++++++++++++++++++++++++++++++++ + dlls/wined3d/query.c | 8 +++-- + dlls/wined3d/wined3d_private.h | 4 +++ + 3 files changed, 83 insertions(+), 2 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index d35f114..e4d60d8 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -67,6 +67,8 @@ enum wined3d_cs_op + WINED3D_CS_OP_CLEAR_RTV, + WINED3D_CS_OP_RESOURCE_MAP, + WINED3D_CS_OP_RESOURCE_UNMAP, ++ WINED3D_CS_OP_QUERY_ISSUE, ++ WINED3D_CS_OP_QUERY_GET_DATA, + WINED3D_CS_OP_STOP, + }; + +@@ -364,6 +366,23 @@ struct wined3d_cs_skip + DWORD size; + }; + ++struct wined3d_cs_query_issue ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_query *query; ++ DWORD flags; ++}; ++ ++struct wined3d_cs_query_get_data ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_query *query; ++ void *data; ++ UINT data_size; ++ DWORD flags; ++ HRESULT *ret; ++}; ++ + static void wined3d_cs_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -1683,6 +1702,58 @@ void wined3d_cs_emit_resource_unmap(struct wined3d_cs *cs, struct wined3d_resour + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_query_issue(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_query_issue *op = data; ++ ++ op->query->query_ops->query_issue(op->query, op->flags); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_query_issue(struct wined3d_cs *cs, struct wined3d_query *query, DWORD flags) ++{ ++ struct wined3d_cs_query_issue *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_QUERY_ISSUE; ++ op->query = query; ++ op->flags = flags; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ ++static UINT wined3d_cs_exec_query_get_data(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_query_get_data *op = data; ++ struct wined3d_query *query = op->query; ++ ++ *op->ret = query->query_ops->query_get_data(query, op->data, op->data_size, op->flags); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_query_get_data(struct wined3d_cs *cs, struct wined3d_query *query, void *data, ++ UINT data_size, DWORD flags, HRESULT *ret) ++{ ++ struct wined3d_cs_query_get_data *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_QUERY_GET_DATA; ++ op->query = query; ++ op->data = data; ++ op->data_size = data_size; ++ op->flags = flags; ++ op->ret = ret; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++ ++ if (wined3d_settings.cs_multithreaded) ++ FIXME("Query handling is not particularly fast yet\n"); ++ ++ cs->ops->finish(cs); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -1728,6 +1799,8 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_CLEAR_RTV */ wined3d_cs_exec_clear_rtv, + /* WINED3D_CS_OP_RESOURCE_MAP */ wined3d_cs_exec_resource_map, + /* WINED3D_CS_OP_RESOURCE_UNMAP */ wined3d_cs_exec_resource_unmap, ++ /* WINED3D_CS_OP_QUERY_ISSUE */ wined3d_cs_exec_query_issue, ++ /* WINED3D_CS_OP_QUERY_GET_DATA */ wined3d_cs_exec_query_get_data, + }; + + static void *wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size) +diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c +index 3de4282..6436bd7 100644 +--- a/dlls/wined3d/query.c ++++ b/dlls/wined3d/query.c +@@ -275,10 +275,14 @@ ULONG CDECL wined3d_query_decref(struct wined3d_query *query) + HRESULT CDECL wined3d_query_get_data(struct wined3d_query *query, + void *data, UINT data_size, DWORD flags) + { ++ HRESULT hr; + TRACE("query %p, data %p, data_size %u, flags %#x.\n", + query, data, data_size, flags); + +- return query->query_ops->query_get_data(query, data, data_size, flags); ++ wined3d_cs_emit_query_get_data(query->device->cs, query, data, data_size, ++ flags, &hr); ++ ++ return hr; + } + + UINT CDECL wined3d_query_get_data_size(const struct wined3d_query *query) +@@ -292,7 +296,7 @@ HRESULT CDECL wined3d_query_issue(struct wined3d_query *query, DWORD flags) + { + TRACE("query %p, flags %#x.\n", query, flags); + +- query->query_ops->query_issue(query, flags); ++ wined3d_cs_emit_query_issue(query->device->cs, query, flags); + return WINED3D_OK; + } + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index ff05a97..6175f13 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2639,6 +2639,10 @@ void wined3d_cs_emit_clear_rtv(struct wined3d_cs *cs, struct wined3d_rendertarge + void *wined3d_cs_emit_resource_map(struct wined3d_cs *cs, struct wined3d_resource *resource, + DWORD flags) DECLSPEC_HIDDEN; + void wined3d_cs_emit_resource_unmap(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_query_issue(struct wined3d_cs *cs, struct wined3d_query *query, ++ DWORD flags) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_query_get_data(struct wined3d_cs *cs, struct wined3d_query *query, void *data, ++ UINT data_size, DWORD flags, HRESULT *ret) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0086-wined3d-Check-our-CS-state-to-find-out-if-a-query-is.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0086-wined3d-Check-our-CS-state-to-find-out-if-a-query-is.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0086-wined3d-Check-our-CS-state-to-find-out-if-a-query-is.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0086-wined3d-Check-our-CS-state-to-find-out-if-a-query-is.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,72 @@ +From ed3e1f3c0fb3ed7d687235e0683039169d412c99 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 6 Jul 2013 18:31:41 +0200 +Subject: wined3d: Check our CS state to find out if a query is done + +--- + dlls/wined3d/cs.c | 6 +++++- + dlls/wined3d/query.c | 9 +++++++++ + dlls/wined3d/wined3d_private.h | 2 ++ + 3 files changed, 16 insertions(+), 1 deletion(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index e4d60d8..ba8e840 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -1705,8 +1705,12 @@ void wined3d_cs_emit_resource_unmap(struct wined3d_cs *cs, struct wined3d_resour + static UINT wined3d_cs_exec_query_issue(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_query_issue *op = data; ++ struct wined3d_query *query = op->query; ++ ++ query->query_ops->query_issue(query, op->flags); + +- op->query->query_ops->query_issue(op->query, op->flags); ++ if (op->flags & WINED3DISSUE_END) ++ InterlockedIncrement(&query->counter_worker); + + return sizeof(*op); + } +diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c +index 6436bd7..bea03ed 100644 +--- a/dlls/wined3d/query.c ++++ b/dlls/wined3d/query.c +@@ -279,6 +279,12 @@ HRESULT CDECL wined3d_query_get_data(struct wined3d_query *query, + TRACE("query %p, data %p, data_size %u, flags %#x.\n", + query, data, data_size, flags); + ++ if (query->counter_main != query->counter_worker) ++ { ++ TRACE("D3DISSUE_END command not submitted to GL yet\n"); ++ return S_FALSE; ++ } ++ + wined3d_cs_emit_query_get_data(query->device->cs, query, data, data_size, + flags, &hr); + +@@ -296,6 +302,9 @@ HRESULT CDECL wined3d_query_issue(struct wined3d_query *query, DWORD flags) + { + TRACE("query %p, flags %#x.\n", query, flags); + ++ if (flags & WINED3DISSUE_END) ++ query->counter_main++; ++ + wined3d_cs_emit_query_issue(query->device->cs, query, flags); + return WINED3D_OK; + } +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 6175f13..3fd7fa7 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2671,6 +2671,8 @@ struct wined3d_query + enum wined3d_query_type type; + DWORD data_size; + void *extendedData; ++ ++ LONG counter_main, counter_worker; + }; + + /* TODO: Add tests and support for FLOAT16_4 POSITIONT, D3DCOLOR position, other +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0087-wined3d-Poll-queries-automatically-in-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0087-wined3d-Poll-queries-automatically-in-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0087-wined3d-Poll-queries-automatically-in-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0087-wined3d-Poll-queries-automatically-in-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,586 @@ +From e041aaa221e23ed7af4d1620180dc4e00cf006f3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 6 Jul 2013 19:18:48 +0200 +Subject: wined3d: Poll queries automatically in the CS + +--- + dlls/wined3d/cs.c | 76 ++++++-------- + dlls/wined3d/query.c | 225 ++++++++++++++++++++++++++--------------- + dlls/wined3d/wined3d_private.h | 7 +- + 3 files changed, 180 insertions(+), 128 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index ba8e840..68e1ed7 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -68,7 +68,6 @@ enum wined3d_cs_op + WINED3D_CS_OP_RESOURCE_MAP, + WINED3D_CS_OP_RESOURCE_UNMAP, + WINED3D_CS_OP_QUERY_ISSUE, +- WINED3D_CS_OP_QUERY_GET_DATA, + WINED3D_CS_OP_STOP, + }; + +@@ -373,16 +372,6 @@ struct wined3d_cs_query_issue + DWORD flags; + }; + +-struct wined3d_cs_query_get_data +-{ +- enum wined3d_cs_op opcode; +- struct wined3d_query *query; +- void *data; +- UINT data_size; +- DWORD flags; +- HRESULT *ret; +-}; +- + static void wined3d_cs_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -1709,8 +1698,9 @@ static UINT wined3d_cs_exec_query_issue(struct wined3d_cs *cs, const void *data) + + query->query_ops->query_issue(query, op->flags); + +- if (op->flags & WINED3DISSUE_END) +- InterlockedIncrement(&query->counter_worker); ++ if (wined3d_settings.cs_multithreaded && op->flags & WINED3DISSUE_END ++ && list_empty(&query->poll_list_entry)) ++ list_add_tail(&cs->query_poll_list, &query->poll_list_entry); + + return sizeof(*op); + } +@@ -1727,37 +1717,6 @@ void wined3d_cs_emit_query_issue(struct wined3d_cs *cs, struct wined3d_query *qu + cs->ops->submit(cs, sizeof(*op)); + } + +-static UINT wined3d_cs_exec_query_get_data(struct wined3d_cs *cs, const void *data) +-{ +- const struct wined3d_cs_query_get_data *op = data; +- struct wined3d_query *query = op->query; +- +- *op->ret = query->query_ops->query_get_data(query, op->data, op->data_size, op->flags); +- +- return sizeof(*op); +-} +- +-void wined3d_cs_emit_query_get_data(struct wined3d_cs *cs, struct wined3d_query *query, void *data, +- UINT data_size, DWORD flags, HRESULT *ret) +-{ +- struct wined3d_cs_query_get_data *op; +- +- op = cs->ops->require_space(cs, sizeof(*op)); +- op->opcode = WINED3D_CS_OP_QUERY_GET_DATA; +- op->query = query; +- op->data = data; +- op->data_size = data_size; +- op->flags = flags; +- op->ret = ret; +- +- cs->ops->submit(cs, sizeof(*op)); +- +- if (wined3d_settings.cs_multithreaded) +- FIXME("Query handling is not particularly fast yet\n"); +- +- cs->ops->finish(cs); +-} +- + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -1804,7 +1763,6 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_RESOURCE_MAP */ wined3d_cs_exec_resource_map, + /* WINED3D_CS_OP_RESOURCE_UNMAP */ wined3d_cs_exec_resource_unmap, + /* WINED3D_CS_OP_QUERY_ISSUE */ wined3d_cs_exec_query_issue, +- /* WINED3D_CS_OP_QUERY_GET_DATA */ wined3d_cs_exec_query_get_data, + }; + + static void *wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size) +@@ -1919,17 +1877,45 @@ void wined3d_cs_switch_onscreen_ds(struct wined3d_cs *cs, + wined3d_surface_incref(cs->onscreen_depth_stencil); + } + ++static inline void poll_queries(struct wined3d_cs *cs) ++{ ++ struct wined3d_query *query, *cursor; ++ ++ LIST_FOR_EACH_ENTRY_SAFE(query, cursor, &cs->query_poll_list, struct wined3d_query, poll_list_entry) ++ { ++ BOOL ret; ++ ++ ret = query->query_ops->query_poll(query); ++ if (ret) ++ { ++ list_remove(&query->poll_list_entry); ++ list_init(&query->poll_list_entry); ++ InterlockedIncrement(&query->counter_retrieved); ++ } ++ } ++} ++ + static DWORD WINAPI wined3d_cs_run(void *thread_param) + { + struct wined3d_cs *cs = thread_param; + enum wined3d_cs_op opcode; + LONG tail; ++ char poll = 0; + + TRACE("Started.\n"); + ++ list_init(&cs->query_poll_list); + cs->thread_id = GetCurrentThreadId(); + for (;;) + { ++ if (poll == 10) ++ { ++ poll = 0; ++ poll_queries(cs); ++ } ++ else ++ poll++; ++ + if (*((volatile LONG *)&cs->queue.head) == cs->queue.tail) + { + continue; +diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c +index bea03ed..621a9d7 100644 +--- a/dlls/wined3d/query.c ++++ b/dlls/wined3d/query.c +@@ -241,6 +241,15 @@ ULONG CDECL wined3d_query_decref(struct wined3d_query *query) + + if (!refcount) + { ++ if (wined3d_settings.cs_multithreaded) ++ { ++ struct wined3d_device *device = query->device; ++ ++ FIXME("waiting for cs\n"); ++ wined3d_cs_emit_glfinish(device->cs); ++ device->cs->ops->finish(device->cs); ++ } ++ + /* Queries are specific to the GL context that created them. Not + * deleting the query will obviously leak it, but that's still better + * than potentially deleting a different query with the same id in this +@@ -275,20 +284,10 @@ ULONG CDECL wined3d_query_decref(struct wined3d_query *query) + HRESULT CDECL wined3d_query_get_data(struct wined3d_query *query, + void *data, UINT data_size, DWORD flags) + { +- HRESULT hr; + TRACE("query %p, data %p, data_size %u, flags %#x.\n", + query, data, data_size, flags); + +- if (query->counter_main != query->counter_worker) +- { +- TRACE("D3DISSUE_END command not submitted to GL yet\n"); +- return S_FALSE; +- } +- +- wined3d_cs_emit_query_get_data(query->device->cs, query, data, data_size, +- flags, &hr); +- +- return hr; ++ return query->query_ops->query_get_data(query, data, data_size, flags); + } + + UINT CDECL wined3d_query_get_data_size(const struct wined3d_query *query) +@@ -317,15 +316,10 @@ static void fill_query_data(void *out, unsigned int out_size, const void *result + static HRESULT wined3d_occlusion_query_ops_get_data(struct wined3d_query *query, + void *data, DWORD size, DWORD flags) + { +- struct wined3d_occlusion_query *oq = query->extendedData; + struct wined3d_device *device = query->device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; +- struct wined3d_context *context; +- GLuint available; ++ struct wined3d_occlusion_query *oq = query->extendedData; + GLuint samples; +- HRESULT res; +- +- TRACE("query %p, data %p, size %#x, flags %#x.\n", query, data, size, flags); + + if (!oq->context) + query->state = QUERY_CREATED; +@@ -339,6 +333,8 @@ static HRESULT wined3d_occlusion_query_ops_get_data(struct wined3d_query *query, + return S_OK; + } + ++ TRACE("(%p) : type D3DQUERY_OCCLUSION, data %p, size %#x, flags %#x.\n", query, data, size, flags); ++ + if (query->state == QUERY_BUILDING) + { + /* Msdn says this returns an error, but our tests show that S_FALSE is returned */ +@@ -354,12 +350,37 @@ static HRESULT wined3d_occlusion_query_ops_get_data(struct wined3d_query *query, + return S_OK; + } + ++ if (!wined3d_settings.cs_multithreaded) ++ { ++ if (!query->query_ops->query_poll(query)) ++ return S_FALSE; ++ } ++ else if (query->counter_main != query->counter_retrieved) ++ { ++ return S_FALSE; ++ } ++ ++ if (data) ++ fill_query_data(data, size, &oq->samples, sizeof(oq->samples)); ++ ++ return S_OK; ++} ++ ++static BOOL wined3d_occlusion_query_ops_poll(struct wined3d_query *query) ++{ ++ struct wined3d_occlusion_query *oq = query->extendedData; ++ struct wined3d_device *device = query->device; ++ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; ++ struct wined3d_context *context; ++ GLuint available; ++ GLuint samples; ++ BOOL ret; ++ + if (oq->context->tid != GetCurrentThreadId()) + { + FIXME("%p Wrong thread, returning 1.\n", query); +- samples = 1; +- fill_query_data(data, size, &samples, sizeof(samples)); +- return S_OK; ++ oq->samples = 1; ++ return TRUE; + } + + context = context_acquire(query->device, oq->context->current_rt); +@@ -370,68 +391,78 @@ static HRESULT wined3d_occlusion_query_ops_get_data(struct wined3d_query *query, + + if (available) + { +- if (size) +- { +- GL_EXTCALL(glGetQueryObjectuivARB(oq->id, GL_QUERY_RESULT_ARB, &samples)); +- checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT)"); +- TRACE("Returning %d samples.\n", samples); +- fill_query_data(data, size, &samples, sizeof(samples)); +- } +- res = S_OK; ++ GL_EXTCALL(glGetQueryObjectuivARB(oq->id, GL_QUERY_RESULT_ARB, &samples)); ++ checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT)"); ++ TRACE("Returning %d samples.\n", samples); ++ oq->samples = samples; ++ ret = TRUE; + } + else + { +- res = S_FALSE; ++ ret = FALSE; + } + + context_release(context); + +- return res; ++ return ret; + } + +-static HRESULT wined3d_event_query_ops_get_data(struct wined3d_query *query, +- void *data, DWORD size, DWORD flags) ++static BOOL wined3d_event_query_ops_poll(struct wined3d_query *query) + { + struct wined3d_event_query *event_query = query->extendedData; +- BOOL signaled; + enum wined3d_event_query_result ret; + +- TRACE("query %p, data %p, size %#x, flags %#x.\n", query, data, size, flags); +- +- if (!data || !size) return S_OK; +- if (!event_query) +- { +- WARN("Event query not supported by GL, reporting GPU idle.\n"); +- signaled = TRUE; +- fill_query_data(data, size, &signaled, sizeof(signaled)); +- return S_OK; +- } +- + ret = wined3d_event_query_test(event_query, query->device); + switch(ret) + { + case WINED3D_EVENT_QUERY_OK: + case WINED3D_EVENT_QUERY_NOT_STARTED: +- signaled = TRUE; +- fill_query_data(data, size, &signaled, sizeof(signaled)); +- break; ++ return TRUE; + + case WINED3D_EVENT_QUERY_WAITING: +- signaled = FALSE; +- fill_query_data(data, size, &signaled, sizeof(signaled)); +- break; ++ return FALSE; + + case WINED3D_EVENT_QUERY_WRONG_THREAD: + FIXME("(%p) Wrong thread, reporting GPU idle.\n", query); +- signaled = TRUE; +- fill_query_data(data, size, &signaled, sizeof(signaled)); +- break; ++ return TRUE; + + case WINED3D_EVENT_QUERY_ERROR: + ERR("The GL event query failed, returning D3DERR_INVALIDCALL\n"); +- return WINED3DERR_INVALIDCALL; ++ return TRUE; ++ ++ default: ++ ERR("Unexpected wined3d_event_query_test result %u\n", ret); ++ return TRUE; ++ } ++} ++ ++static HRESULT wined3d_event_query_ops_get_data(struct wined3d_query *query, ++ void *pData, DWORD dwSize, DWORD flags) ++{ ++ struct wined3d_event_query *event_query = query->extendedData; ++ BOOL *data = pData; ++ enum wined3d_event_query_result ret; ++ ++ TRACE("query %p, pData %p, dwSize %#x, flags %#x.\n", query, pData, dwSize, flags); ++ ++ if (!pData || !dwSize) return S_OK; ++ if (!event_query) ++ { ++ WARN("Event query not supported by GL, reporting GPU idle.\n"); ++ *data = TRUE; ++ return S_OK; + } + ++ if (!wined3d_settings.cs_multithreaded) ++ ret = query->query_ops->query_poll(query); ++ else if (query->counter_main != query->counter_retrieved) ++ ret = FALSE; ++ else ++ ret = TRUE; ++ ++ if (data) ++ fill_query_data(data, dwSize, &ret, sizeof(ret)); ++ + return S_OK; + } + +@@ -561,33 +592,57 @@ static HRESULT wined3d_timestamp_query_ops_get_data(struct wined3d_query *query, + void *data, DWORD size, DWORD flags) + { + struct wined3d_timestamp_query *tq = query->extendedData; ++ ++ TRACE("(%p) : type D3DQUERY_TIMESTAMP, data %p, size %#x, flags %#x.\n", query, data, size, flags); ++ ++ if (query->state == QUERY_CREATED) ++ { ++ UINT64 zero = 0; ++ /* D3D allows GetData on a new query, OpenGL doesn't. So just invent the data ourselves */ ++ TRACE("Query wasn't yet started, returning S_OK.\n"); ++ if (data) ++ fill_query_data(data, size, &zero, sizeof(zero)); ++ return S_OK; ++ } ++ ++ if (!wined3d_settings.cs_multithreaded) ++ { ++ if (!query->query_ops->query_poll(query)) ++ return S_FALSE; ++ } ++ else if (query->counter_main != query->counter_retrieved) ++ { ++ return S_FALSE; ++ } ++ ++ if (data) ++ fill_query_data(data, size, &tq->timestamp, sizeof(tq->timestamp)); ++ ++ return S_OK; ++} ++ ++static BOOL wined3d_timestamp_query_ops_poll(struct wined3d_query *query) ++{ ++ struct wined3d_timestamp_query *tq = query->extendedData; + struct wined3d_device *device = query->device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + struct wined3d_context *context; + GLuint available; + GLuint64 timestamp; +- HRESULT res; ++ BOOL ret; + +- TRACE("query %p, data %p, size %#x, flags %#x.\n", query, data, size, flags); +- +- if (!tq->context) +- query->state = QUERY_CREATED; +- +- if (query->state == QUERY_CREATED) ++ if (!gl_info->supported[ARB_TIMER_QUERY]) + { +- /* D3D allows GetData on a new query, OpenGL doesn't. So just invent the data ourselves. */ +- TRACE("Query wasn't yet started, returning S_OK.\n"); +- timestamp = 0; +- fill_query_data(data, size, ×tamp, sizeof(timestamp)); +- return S_OK; ++ TRACE("Faking timestamp.\n"); ++ QueryPerformanceCounter((LARGE_INTEGER *)&tq->timestamp); ++ return TRUE; + } + + if (tq->context->tid != GetCurrentThreadId()) + { + FIXME("%p Wrong thread, returning 1.\n", query); +- timestamp = 1; +- fill_query_data(data, size, ×tamp, sizeof(timestamp)); +- return S_OK; ++ tq->timestamp = 1; ++ return TRUE; + } + + context = context_acquire(query->device, tq->context->current_rt); +@@ -598,23 +653,20 @@ static HRESULT wined3d_timestamp_query_ops_get_data(struct wined3d_query *query, + + if (available) + { +- if (size) +- { +- GL_EXTCALL(glGetQueryObjectui64v(tq->id, GL_QUERY_RESULT_ARB, ×tamp)); +- checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT)"); +- TRACE("Returning timestamp %s.\n", wine_dbgstr_longlong(timestamp)); +- fill_query_data(data, size, ×tamp, sizeof(timestamp)); +- } +- res = S_OK; ++ GL_EXTCALL(glGetQueryObjectui64v(tq->id, GL_QUERY_RESULT_ARB, ×tamp)); ++ checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT)"); ++ TRACE("Returning timestamp %s.\n", wine_dbgstr_longlong(timestamp)); ++ tq->timestamp = timestamp; ++ ret = TRUE; + } + else + { +- res = S_FALSE; ++ ret = FALSE; + } + + context_release(context); + +- return res; ++ return ret; + } + + static void wined3d_timestamp_query_ops_issue(struct wined3d_query *query, DWORD flags) +@@ -657,15 +709,14 @@ static HRESULT wined3d_timestamp_disjoint_query_ops_get_data(struct wined3d_quer + void *data, DWORD size, DWORD flags) + { + TRACE("query %p, data %p, size %#x, flags %#x.\n", query, data, size, flags); +- + if (query->type == WINED3D_QUERY_TYPE_TIMESTAMP_DISJOINT) + { + static const struct wined3d_query_data_timestamp_disjoint disjoint_data = {FALSE, 1000 * 1000 * 1000}; + + if (query->state == QUERY_BUILDING) + { +- TRACE("Query is building, returning S_FALSE.\n"); +- return S_FALSE; ++ TRACE("Query is building, returning S_FALSE.\n"); ++ return S_FALSE; + } + + fill_query_data(data, size, &disjoint_data, sizeof(disjoint_data)); +@@ -679,6 +730,11 @@ static HRESULT wined3d_timestamp_disjoint_query_ops_get_data(struct wined3d_quer + return S_OK; + } + ++static BOOL wined3d_timestamp_disjoint_query_ops_poll(struct wined3d_query *query) ++{ ++ return TRUE; ++} ++ + static void wined3d_timestamp_disjoint_query_ops_issue(struct wined3d_query *query, DWORD flags) + { + TRACE("query %p, flags %#x.\n", query, flags); +@@ -692,24 +748,28 @@ static void wined3d_timestamp_disjoint_query_ops_issue(struct wined3d_query *que + static const struct wined3d_query_ops event_query_ops = + { + wined3d_event_query_ops_get_data, ++ wined3d_event_query_ops_poll, + wined3d_event_query_ops_issue, + }; + + static const struct wined3d_query_ops occlusion_query_ops = + { + wined3d_occlusion_query_ops_get_data, ++ wined3d_occlusion_query_ops_poll, + wined3d_occlusion_query_ops_issue, + }; + + static const struct wined3d_query_ops timestamp_query_ops = + { + wined3d_timestamp_query_ops_get_data, ++ wined3d_timestamp_query_ops_poll, + wined3d_timestamp_query_ops_issue, + }; + + static const struct wined3d_query_ops timestamp_disjoint_query_ops = + { + wined3d_timestamp_disjoint_query_ops_get_data, ++ wined3d_timestamp_disjoint_query_ops_poll, + wined3d_timestamp_disjoint_query_ops_issue, + }; + +@@ -810,6 +870,7 @@ static HRESULT query_init(struct wined3d_query *query, struct wined3d_device *de + query->state = QUERY_CREATED; + query->device = device; + query->ref = 1; ++ list_init(&query->poll_list_entry); + + return WINED3D_OK; + } +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 3fd7fa7..7bda9f0 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -1051,6 +1051,7 @@ struct wined3d_occlusion_query + struct list entry; + GLuint id; + struct wined3d_context *context; ++ DWORD samples; + }; + + union wined3d_gl_query_object +@@ -1086,6 +1087,7 @@ struct wined3d_timestamp_query + struct list entry; + GLuint id; + struct wined3d_context *context; ++ UINT64 timestamp; + }; + + void context_alloc_timestamp_query(struct wined3d_context *context, struct wined3d_timestamp_query *query) DECLSPEC_HIDDEN; +@@ -2564,6 +2566,7 @@ struct wined3d_cs + struct wined3d_cs_queue queue; + + LONG pending_presents; ++ struct list query_poll_list; + }; + + struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) DECLSPEC_HIDDEN; +@@ -2657,6 +2660,7 @@ enum query_state { + struct wined3d_query_ops + { + HRESULT (*query_get_data)(struct wined3d_query *query, void *data, DWORD data_size, DWORD flags); ++ BOOL (*query_poll)(struct wined3d_query *query); + void (*query_issue)(struct wined3d_query *query, DWORD flags); + }; + +@@ -2672,7 +2676,8 @@ struct wined3d_query + DWORD data_size; + void *extendedData; + +- LONG counter_main, counter_worker; ++ LONG counter_main, counter_retrieved; ++ struct list poll_list_entry; + }; + + /* TODO: Add tests and support for FLOAT16_4 POSITIONT, D3DCOLOR position, other +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0088-wined3d-Introduce-a-separate-queue-for-priority-comm.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0088-wined3d-Introduce-a-separate-queue-for-priority-comm.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0088-wined3d-Introduce-a-separate-queue-for-priority-comm.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0088-wined3d-Introduce-a-separate-queue-for-priority-comm.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,268 @@ +From 0a14b53f4dcb38e852db14d186d14c8526f3549a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 6 Jul 2013 19:18:03 +0200 +Subject: wined3d: Introduce a separate queue for priority commands + +--- + dlls/wined3d/cs.c | 128 ++++++++++++++++++++++++++++++++++------- + dlls/wined3d/wined3d_private.h | 5 +- + 2 files changed, 110 insertions(+), 23 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 68e1ed7..a7f7694 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -372,7 +372,7 @@ struct wined3d_cs_query_issue + DWORD flags; + }; + +-static void wined3d_cs_submit(struct wined3d_cs *cs, size_t size) ++static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); + /* There is only one thread writing to queue.head, InterlockedExchange +@@ -380,6 +380,14 @@ static void wined3d_cs_submit(struct wined3d_cs *cs, size_t size) + InterlockedExchange(&cs->queue.head, new_val); + } + ++static void wined3d_cs_mt_submit_prio(struct wined3d_cs *cs, size_t size) ++{ ++ LONG new_val = (cs->prio_queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); ++ /* There is only one thread writing to queue.head, InterlockedExchange ++ * is used for the memory barrier. */ ++ InterlockedExchange(&cs->prio_queue.head, new_val); ++} ++ + static UINT wined3d_cs_exec_nop(struct wined3d_cs *cs, const void *data) + { + return sizeof(enum wined3d_cs_op); +@@ -413,15 +421,16 @@ static void wined3d_cs_emit_fence(struct wined3d_cs *cs, BOOL *signalled) + cs->ops->submit(cs, sizeof(*op)); + } + +-static void wined3d_cs_finish(struct wined3d_cs *cs) ++static void wined3d_cs_emit_fence_prio(struct wined3d_cs *cs, BOOL *signalled) + { +- BOOL fence; ++ struct wined3d_cs_fence *op; + +- wined3d_cs_emit_fence(cs, &fence); ++ *signalled = FALSE; + +- /* A busy wait should be fine, we're not supposed to have to wait very +- * long. */ +- while (!InterlockedCompareExchange(&fence, TRUE, TRUE)); ++ op = cs->ops->require_space_prio(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_FENCE; ++ op->signalled = signalled; ++ cs->ops->submit_prio(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data) +@@ -1765,9 +1774,9 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_QUERY_ISSUE */ wined3d_cs_exec_query_issue, + }; + +-static void *wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size) ++static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) + { +- struct wined3d_cs_queue *queue = &cs->queue; ++ struct wined3d_cs_queue *queue = prio ? &cs->prio_queue : &cs->queue; + size_t queue_size = sizeof(queue->data) / sizeof(*queue->data); + + if (queue_size - size < queue->head) +@@ -1775,7 +1784,7 @@ static void *wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size) + struct wined3d_cs_skip *skip; + size_t nop_size = queue_size - queue->head; + +- skip = wined3d_cs_mt_require_space(cs, nop_size); ++ skip = _wined3d_cs_mt_require_space(cs, nop_size, prio); + if (nop_size < sizeof(*skip)) + { + skip->opcode = WINED3D_CS_OP_NOP; +@@ -1786,7 +1795,11 @@ static void *wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size) + skip->size = nop_size; + } + +- cs->ops->submit(cs, nop_size); ++ if (prio) ++ cs->ops->submit_prio(cs, nop_size); ++ else ++ cs->ops->submit(cs, nop_size); ++ + assert(!queue->head); + } + +@@ -1813,12 +1826,15 @@ static void *wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size) + return &queue->data[queue->head]; + } + +-static const struct wined3d_cs_ops wined3d_cs_mt_ops = ++static inline void *wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size) + { +- wined3d_cs_mt_require_space, +- wined3d_cs_submit, +- wined3d_cs_finish, +-}; ++ return _wined3d_cs_mt_require_space(cs, size, FALSE); ++} ++ ++static inline void *wined3d_cs_mt_require_space_prio(struct wined3d_cs *cs, size_t size) ++{ ++ return _wined3d_cs_mt_require_space(cs, size, TRUE); ++} + + /* FIXME: wined3d_device_uninit_3d() should either flush and wait, or be an + * OP itself. */ +@@ -1829,9 +1845,63 @@ static void wined3d_cs_emit_stop(struct wined3d_cs *cs) + op = wined3d_cs_mt_require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_STOP; + +- wined3d_cs_submit(cs, sizeof(*op)); ++ wined3d_cs_mt_submit(cs, sizeof(*op)); + } + ++static void wined3d_cs_mt_finish(struct wined3d_cs *cs) ++{ ++ BOOL fence; ++ ++ if (cs->thread_id == GetCurrentThreadId()) ++ { ++ static BOOL once; ++ if (!once) ++ { ++ FIXME("flush_and_wait called from cs thread\n"); ++ once = TRUE; ++ } ++ return; ++ } ++ ++ wined3d_cs_emit_fence(cs, &fence); ++ ++ /* A busy wait should be fine, we're not supposed to have to wait very ++ * long. */ ++ while (!InterlockedCompareExchange(&fence, TRUE, TRUE)); ++} ++ ++static void wined3d_cs_mt_finish_prio(struct wined3d_cs *cs) ++{ ++ BOOL fence; ++ ++ if (cs->thread_id == GetCurrentThreadId()) ++ { ++ static BOOL once; ++ if (!once) ++ { ++ FIXME("flush_and_wait called from cs thread\n"); ++ once = TRUE; ++ } ++ return; ++ } ++ ++ wined3d_cs_emit_fence_prio(cs, &fence); ++ ++ /* A busy wait should be fine, we're not supposed to have to wait very ++ * long. */ ++ while (!InterlockedCompareExchange(&fence, TRUE, TRUE)); ++} ++ ++static const struct wined3d_cs_ops wined3d_cs_mt_ops = ++{ ++ wined3d_cs_mt_require_space, ++ wined3d_cs_mt_require_space_prio, ++ wined3d_cs_mt_submit, ++ wined3d_cs_mt_submit_prio, ++ wined3d_cs_mt_finish, ++ wined3d_cs_mt_finish_prio, ++}; ++ + static void wined3d_cs_st_submit(struct wined3d_cs *cs, size_t size) + { + enum wined3d_cs_op opcode = *(const enum wined3d_cs_op *)&cs->queue.data; +@@ -1857,8 +1927,11 @@ static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) + static const struct wined3d_cs_ops wined3d_cs_st_ops = + { + wined3d_cs_st_require_space, ++ wined3d_cs_st_require_space, ++ wined3d_cs_st_submit, + wined3d_cs_st_submit, + wined3d_cs_st_finish, ++ wined3d_cs_st_finish, + }; + + void wined3d_cs_switch_onscreen_ds(struct wined3d_cs *cs, +@@ -1901,6 +1974,7 @@ static DWORD WINAPI wined3d_cs_run(void *thread_param) + enum wined3d_cs_op opcode; + LONG tail; + char poll = 0; ++ struct wined3d_cs_queue *queue; + + TRACE("Started.\n"); + +@@ -1916,13 +1990,23 @@ static DWORD WINAPI wined3d_cs_run(void *thread_param) + else + poll++; + +- if (*((volatile LONG *)&cs->queue.head) == cs->queue.tail) ++ if (*((volatile LONG *)&cs->prio_queue.head) != cs->prio_queue.tail) ++ { ++ queue = &cs->prio_queue; ++ } ++ else if (*((volatile LONG *)&cs->queue.head) != cs->queue.tail) ++ { ++ queue = &cs->queue; ++ if (*((volatile LONG *)&cs->prio_queue.head) != cs->prio_queue.tail) ++ queue = &cs->prio_queue; ++ } ++ else + { + continue; + } + +- tail = cs->queue.tail; +- opcode = *(const enum wined3d_cs_op *)&cs->queue.data[tail]; ++ tail = queue->tail; ++ opcode = *(const enum wined3d_cs_op *)&queue->data[tail]; + + if (opcode >= WINED3D_CS_OP_STOP) + { +@@ -1931,9 +2015,9 @@ static DWORD WINAPI wined3d_cs_run(void *thread_param) + goto done; + } + +- tail += wined3d_cs_op_handlers[opcode](cs, &cs->queue.data[tail]); ++ tail += wined3d_cs_op_handlers[opcode](cs, &queue->data[tail]); + tail &= (WINED3D_CS_QUEUE_SIZE - 1); +- InterlockedExchange(&cs->queue.tail, tail); ++ InterlockedExchange(&queue->tail, tail); + } + + done: +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 7bda9f0..cf01a6a 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2550,8 +2550,11 @@ struct wined3d_cs_queue + struct wined3d_cs_ops + { + void *(*require_space)(struct wined3d_cs *cs, size_t size); ++ void *(*require_space_prio)(struct wined3d_cs *cs, size_t size); + void (*submit)(struct wined3d_cs *cs, size_t size); ++ void (*submit_prio)(struct wined3d_cs *cs, size_t size); + void (*finish)(struct wined3d_cs *cs); ++ void (*finish_prio)(struct wined3d_cs *cs); + }; + + struct wined3d_cs +@@ -2563,7 +2566,7 @@ struct wined3d_cs + DWORD thread_id; + struct wined3d_surface *onscreen_depth_stencil; + +- struct wined3d_cs_queue queue; ++ struct wined3d_cs_queue queue, prio_queue; + + LONG pending_presents; + struct list query_poll_list; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0089-wined3d-Destroy-queries-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0089-wined3d-Destroy-queries-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0089-wined3d-Destroy-queries-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0089-wined3d-Destroy-queries-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,183 @@ +From ef12b024a49a4390df02fad20938e04d5cfae35e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 6 Jul 2013 21:54:45 +0200 +Subject: wined3d: Destroy queries through the CS + +--- + dlls/wined3d/cs.c | 31 ++++++++++++++++++++ + dlls/wined3d/query.c | 66 +++++++++++++++++++----------------------- + dlls/wined3d/wined3d_private.h | 3 ++ + 3 files changed, 64 insertions(+), 36 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index a7f7694..b2af05b 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -68,6 +68,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_RESOURCE_MAP, + WINED3D_CS_OP_RESOURCE_UNMAP, + WINED3D_CS_OP_QUERY_ISSUE, ++ WINED3D_CS_OP_QUERY_DESTROY, + WINED3D_CS_OP_STOP, + }; + +@@ -372,6 +373,12 @@ struct wined3d_cs_query_issue + DWORD flags; + }; + ++struct wined3d_cs_query_destroy ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_query *query; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -1726,6 +1733,29 @@ void wined3d_cs_emit_query_issue(struct wined3d_cs *cs, struct wined3d_query *qu + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_query_destroy(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_query_destroy *op = data; ++ ++ if (!list_empty(&op->query->poll_list_entry)) ++ list_remove(&op->query->poll_list_entry); ++ ++ wined3d_query_destroy(op->query); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_query_destroy(struct wined3d_cs *cs, struct wined3d_query *query) ++{ ++ struct wined3d_cs_query_destroy *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_QUERY_DESTROY; ++ op->query = query; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -1772,6 +1802,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_RESOURCE_MAP */ wined3d_cs_exec_resource_map, + /* WINED3D_CS_OP_RESOURCE_UNMAP */ wined3d_cs_exec_resource_unmap, + /* WINED3D_CS_OP_QUERY_ISSUE */ wined3d_cs_exec_query_issue, ++ /* WINED3D_CS_OP_QUERY_DESTROY */ wined3d_cs_exec_query_destroy, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c +index 621a9d7..f377eea 100644 +--- a/dlls/wined3d/query.c ++++ b/dlls/wined3d/query.c +@@ -233,50 +233,44 @@ ULONG CDECL wined3d_query_incref(struct wined3d_query *query) + return refcount; + } + +-ULONG CDECL wined3d_query_decref(struct wined3d_query *query) ++void wined3d_query_destroy(struct wined3d_query *query) + { +- ULONG refcount = InterlockedDecrement(&query->ref); +- +- TRACE("%p decreasing refcount to %u.\n", query, refcount); ++ /* Queries are specific to the GL context that created them. Not ++ * deleting the query will obviously leak it, but that's still better ++ * than potentially deleting a different query with the same id in this ++ * context, and (still) leaking the actual query. */ ++ if (query->type == WINED3D_QUERY_TYPE_EVENT) ++ { ++ struct wined3d_event_query *event_query = query->extendedData; ++ if (event_query) wined3d_event_query_destroy(event_query); ++ } ++ else if (query->type == WINED3D_QUERY_TYPE_OCCLUSION) ++ { ++ struct wined3d_occlusion_query *oq = query->extendedData; + +- if (!refcount) ++ if (oq->context) context_free_occlusion_query(oq); ++ HeapFree(GetProcessHeap(), 0, query->extendedData); ++ } ++ else if (query->type == WINED3D_QUERY_TYPE_TIMESTAMP) + { +- if (wined3d_settings.cs_multithreaded) +- { +- struct wined3d_device *device = query->device; ++ struct wined3d_timestamp_query *tq = query->extendedData; + +- FIXME("waiting for cs\n"); +- wined3d_cs_emit_glfinish(device->cs); +- device->cs->ops->finish(device->cs); +- } ++ if (tq->context) ++ context_free_timestamp_query(tq); ++ HeapFree(GetProcessHeap(), 0, query->extendedData); ++ } + +- /* Queries are specific to the GL context that created them. Not +- * deleting the query will obviously leak it, but that's still better +- * than potentially deleting a different query with the same id in this +- * context, and (still) leaking the actual query. */ +- if (query->type == WINED3D_QUERY_TYPE_EVENT) +- { +- struct wined3d_event_query *event_query = query->extendedData; +- if (event_query) wined3d_event_query_destroy(event_query); +- } +- else if (query->type == WINED3D_QUERY_TYPE_OCCLUSION) +- { +- struct wined3d_occlusion_query *oq = query->extendedData; ++ HeapFree(GetProcessHeap(), 0, query); ++} + +- if (oq->context) context_free_occlusion_query(oq); +- HeapFree(GetProcessHeap(), 0, query->extendedData); +- } +- else if (query->type == WINED3D_QUERY_TYPE_TIMESTAMP) +- { +- struct wined3d_timestamp_query *tq = query->extendedData; ++ULONG CDECL wined3d_query_decref(struct wined3d_query *query) ++{ ++ ULONG refcount = InterlockedDecrement(&query->ref); + +- if (tq->context) +- context_free_timestamp_query(tq); +- HeapFree(GetProcessHeap(), 0, query->extendedData); +- } ++ TRACE("%p decreasing refcount to %u.\n", query, refcount); + +- HeapFree(GetProcessHeap(), 0, query); +- } ++ if (!refcount) ++ wined3d_cs_emit_query_destroy(query->device->cs, query); + + return refcount; + } +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index cf01a6a..28badf6 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2649,6 +2649,7 @@ void wined3d_cs_emit_query_issue(struct wined3d_cs *cs, struct wined3d_query *qu + DWORD flags) DECLSPEC_HIDDEN; + void wined3d_cs_emit_query_get_data(struct wined3d_cs *cs, struct wined3d_query *query, void *data, + UINT data_size, DWORD flags, HRESULT *ret) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_query_destroy(struct wined3d_cs *cs, struct wined3d_query *query) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +@@ -2683,6 +2684,8 @@ struct wined3d_query + struct list poll_list_entry; + }; + ++void wined3d_query_destroy(struct wined3d_query *query) DECLSPEC_HIDDEN; ++ + /* TODO: Add tests and support for FLOAT16_4 POSITIONT, D3DCOLOR position, other + * fixed function semantics as D3DCOLOR or FLOAT16 */ + enum wined3d_buffer_conversion_type +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0090-wined3d-Separate-main-and-worker-thread-query-state.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0090-wined3d-Separate-main-and-worker-thread-query-state.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0090-wined3d-Separate-main-and-worker-thread-query-state.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0090-wined3d-Separate-main-and-worker-thread-query-state.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,138 @@ +From 1a53e5cd7279145ad9f78f2970a186f488216d6b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 24 Jul 2013 16:34:17 +0200 +Subject: wined3d: Separate main and worker thread query state + +--- + dlls/wined3d/query.c | 34 ++++++++++++---------------------- + dlls/wined3d/wined3d_private.h | 1 + + 2 files changed, 13 insertions(+), 22 deletions(-) + +diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c +index f377eea..97483a2 100644 +--- a/dlls/wined3d/query.c ++++ b/dlls/wined3d/query.c +@@ -299,6 +299,12 @@ HRESULT CDECL wined3d_query_issue(struct wined3d_query *query, DWORD flags) + query->counter_main++; + + wined3d_cs_emit_query_issue(query->device->cs, query, flags); ++ ++ if (flags & WINED3DISSUE_BEGIN) ++ query->state = QUERY_BUILDING; ++ else ++ query->state = QUERY_SIGNALLED; ++ + return WINED3D_OK; + } + +@@ -493,11 +499,6 @@ static void wined3d_event_query_ops_issue(struct wined3d_query *query, DWORD fla + /* Started implicitly at device creation */ + ERR("Event query issued with START flag - what to do?\n"); + } +- +- if (flags & WINED3DISSUE_BEGIN) +- query->state = QUERY_BUILDING; +- else +- query->state = QUERY_SIGNALLED; + } + + static void wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD flags) +@@ -515,7 +516,7 @@ static void wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD + /* This is allowed according to msdn and our tests. Reset the query and restart */ + if (flags & WINED3DISSUE_BEGIN) + { +- if (query->state == QUERY_BUILDING) ++ if (oq->started) + { + if (oq->context->tid != GetCurrentThreadId()) + { +@@ -544,6 +545,7 @@ static void wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD + checkGLcall("glBeginQuery()"); + + context_release(context); ++ oq->started = TRUE; + } + if (flags & WINED3DISSUE_END) + { +@@ -551,7 +553,7 @@ static void wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD + * our tests show that it returns OK. But OpenGL doesn't like it, so avoid + * generating an error + */ +- if (query->state == QUERY_BUILDING) ++ if (oq->started) + { + if (oq->context->tid != GetCurrentThreadId()) + { +@@ -567,6 +569,7 @@ static void wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD + context_release(context); + } + } ++ oq->started = FALSE; + } + } + else +@@ -574,11 +577,6 @@ static void wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD + FIXME("%p Occlusion queries not supported.\n", query); + } + +- if (flags & WINED3DISSUE_BEGIN) +- query->state = QUERY_BUILDING; +- else +- query->state = QUERY_SIGNALLED; +- + return; + } + +@@ -694,9 +692,6 @@ static void wined3d_timestamp_query_ops_issue(struct wined3d_query *query, DWORD + { + ERR("Timestamp queries not supported.\n"); + } +- +- if (flags & WINED3DISSUE_END) +- query->state = QUERY_SIGNALLED; + } + + static HRESULT wined3d_timestamp_disjoint_query_ops_get_data(struct wined3d_query *query, +@@ -732,11 +727,6 @@ static BOOL wined3d_timestamp_disjoint_query_ops_poll(struct wined3d_query *quer + static void wined3d_timestamp_disjoint_query_ops_issue(struct wined3d_query *query, DWORD flags) + { + TRACE("query %p, flags %#x.\n", query, flags); +- +- if (flags & WINED3DISSUE_BEGIN) +- query->state = QUERY_BUILDING; +- if (flags & WINED3DISSUE_END) +- query->state = QUERY_SIGNALLED; + } + + static const struct wined3d_query_ops event_query_ops = +@@ -785,13 +775,13 @@ static HRESULT query_init(struct wined3d_query *query, struct wined3d_device *de + } + query->query_ops = &occlusion_query_ops; + query->data_size = sizeof(DWORD); +- query->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_occlusion_query)); ++ query->extendedData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ++ sizeof(struct wined3d_occlusion_query)); + if (!query->extendedData) + { + ERR("Failed to allocate occlusion query extended data.\n"); + return E_OUTOFMEMORY; + } +- ((struct wined3d_occlusion_query *)query->extendedData)->context = NULL; + break; + + case WINED3D_QUERY_TYPE_EVENT: +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 28badf6..ec474dd 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -1052,6 +1052,7 @@ struct wined3d_occlusion_query + GLuint id; + struct wined3d_context *context; + DWORD samples; ++ BOOL started; + }; + + union wined3d_gl_query_object +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0091-wined3d-Don-t-poll-queries-that-failed-to-start.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0091-wined3d-Don-t-poll-queries-that-failed-to-start.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0091-wined3d-Don-t-poll-queries-that-failed-to-start.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0091-wined3d-Don-t-poll-queries-that-failed-to-start.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,134 @@ +From 3ee3d46182ba5a4f968d2bed318a80e9380b1246 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 24 Jul 2013 17:27:35 +0200 +Subject: wined3d: Don't poll queries that failed to start + +--- + dlls/wined3d/cs.c | 5 +++-- + dlls/wined3d/query.c | 21 +++++++++++++++------ + dlls/wined3d/wined3d_private.h | 2 +- + 3 files changed, 19 insertions(+), 9 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index b2af05b..4c0695a 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -1711,10 +1711,11 @@ static UINT wined3d_cs_exec_query_issue(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_query_issue *op = data; + struct wined3d_query *query = op->query; ++ BOOL poll; + +- query->query_ops->query_issue(query, op->flags); ++ poll = query->query_ops->query_issue(query, op->flags); + +- if (wined3d_settings.cs_multithreaded && op->flags & WINED3DISSUE_END ++ if (wined3d_settings.cs_multithreaded && poll + && list_empty(&query->poll_list_entry)) + list_add_tail(&cs->query_poll_list, &query->poll_list_entry); + +diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c +index 97483a2..a42a1bd 100644 +--- a/dlls/wined3d/query.c ++++ b/dlls/wined3d/query.c +@@ -480,7 +480,7 @@ enum wined3d_query_type CDECL wined3d_query_get_type(const struct wined3d_query + return query->type; + } + +-static void wined3d_event_query_ops_issue(struct wined3d_query *query, DWORD flags) ++static BOOL wined3d_event_query_ops_issue(struct wined3d_query *query, DWORD flags) + { + TRACE("query %p, flags %#x.\n", query, flags); + +@@ -490,21 +490,24 @@ static void wined3d_event_query_ops_issue(struct wined3d_query *query, DWORD fla + struct wined3d_event_query *event_query = query->extendedData; + + /* Faked event query support */ +- if (!event_query) return; ++ if (!event_query) return FALSE; + + wined3d_event_query_issue(event_query, query->device); ++ return TRUE; + } + else if (flags & WINED3DISSUE_BEGIN) + { + /* Started implicitly at device creation */ + ERR("Event query issued with START flag - what to do?\n"); + } ++ return FALSE; + } + +-static void wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD flags) ++static BOOL wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD flags) + { + struct wined3d_device *device = query->device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; ++ BOOL poll = FALSE; + + TRACE("query %p, flags %#x.\n", query, flags); + +@@ -570,6 +573,7 @@ static void wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD + } + } + oq->started = FALSE; ++ poll = TRUE; + } + } + else +@@ -577,7 +581,7 @@ static void wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD + FIXME("%p Occlusion queries not supported.\n", query); + } + +- return; ++ return poll; + } + + static HRESULT wined3d_timestamp_query_ops_get_data(struct wined3d_query *query, +@@ -661,7 +665,7 @@ static BOOL wined3d_timestamp_query_ops_poll(struct wined3d_query *query) + return ret; + } + +-static void wined3d_timestamp_query_ops_issue(struct wined3d_query *query, DWORD flags) ++static BOOL wined3d_timestamp_query_ops_issue(struct wined3d_query *query, DWORD flags) + { + struct wined3d_device *device = query->device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; +@@ -692,6 +696,10 @@ static void wined3d_timestamp_query_ops_issue(struct wined3d_query *query, DWORD + { + ERR("Timestamp queries not supported.\n"); + } ++ ++ if (flags & WINED3DISSUE_END) ++ return TRUE; ++ return FALSE; + } + + static HRESULT wined3d_timestamp_disjoint_query_ops_get_data(struct wined3d_query *query, +@@ -724,9 +732,10 @@ static BOOL wined3d_timestamp_disjoint_query_ops_poll(struct wined3d_query *quer + return TRUE; + } + +-static void wined3d_timestamp_disjoint_query_ops_issue(struct wined3d_query *query, DWORD flags) ++static BOOL wined3d_timestamp_disjoint_query_ops_issue(struct wined3d_query *query, DWORD flags) + { + TRACE("query %p, flags %#x.\n", query, flags); ++ return FALSE; + } + + static const struct wined3d_query_ops event_query_ops = +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index ec474dd..8dd9786 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2666,7 +2666,7 @@ struct wined3d_query_ops + { + HRESULT (*query_get_data)(struct wined3d_query *query, void *data, DWORD data_size, DWORD flags); + BOOL (*query_poll)(struct wined3d_query *query); +- void (*query_issue)(struct wined3d_query *query, DWORD flags); ++ BOOL (*query_issue)(struct wined3d_query *query, DWORD flags); + }; + + struct wined3d_query +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0092-wined3d-Remove-restated-queries-from-the-poll-list.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0092-wined3d-Remove-restated-queries-from-the-poll-list.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0092-wined3d-Remove-restated-queries-from-the-poll-list.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0092-wined3d-Remove-restated-queries-from-the-poll-list.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,40 @@ +From d46500650ef16a6bd292705ce9896bc8b1427d99 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 24 Jul 2013 17:50:16 +0200 +Subject: wined3d: Remove restated queries from the poll list + +--- + dlls/wined3d/cs.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 4c0695a..5c19a17 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -1715,9 +1715,20 @@ static UINT wined3d_cs_exec_query_issue(struct wined3d_cs *cs, const void *data) + + poll = query->query_ops->query_issue(query, op->flags); + +- if (wined3d_settings.cs_multithreaded && poll +- && list_empty(&query->poll_list_entry)) +- list_add_tail(&cs->query_poll_list, &query->poll_list_entry); ++ if (wined3d_settings.cs_multithreaded) ++ { ++ if (poll && list_empty(&query->poll_list_entry)) ++ { ++ list_add_tail(&cs->query_poll_list, &query->poll_list_entry); ++ } ++ else if (!poll && !list_empty(&query->poll_list_entry)) ++ { ++ /* Can happen if occlusion queries are restarted. This discards the old ++ * result, polling it could result in a GL error */ ++ list_remove(&query->poll_list_entry); ++ list_init(&query->poll_list_entry); ++ } ++ } + + return sizeof(*op); + } +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0093-wined3d-Don-t-reset-the-query-state-if-it-doesn-t-ha.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0093-wined3d-Don-t-reset-the-query-state-if-it-doesn-t-ha.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0093-wined3d-Don-t-reset-the-query-state-if-it-doesn-t-ha.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0093-wined3d-Don-t-reset-the-query-state-if-it-doesn-t-ha.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,31 @@ +From 681469685b22ba7fedfbc808498028b518b890a0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Mon, 5 Aug 2013 13:07:42 +0200 +Subject: wined3d: Don't reset the query state if it doesn't have a ctx + +The CS recreates occlusion queries and changes the context variable. +This leads to incorrect query results. + +TODO: Before sending, find out why the line was there in the first place +and if it is needed with the multithreaded and/or singlethreaded CS. +--- + dlls/wined3d/query.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c +index a42a1bd..39d663a 100644 +--- a/dlls/wined3d/query.c ++++ b/dlls/wined3d/query.c +@@ -321,9 +321,6 @@ static HRESULT wined3d_occlusion_query_ops_get_data(struct wined3d_query *query, + struct wined3d_occlusion_query *oq = query->extendedData; + GLuint samples; + +- if (!oq->context) +- query->state = QUERY_CREATED; +- + if (query->state == QUERY_CREATED) + { + /* D3D allows GetData on a new query, OpenGL doesn't. So just invent the data ourselves */ +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0094-wined3d-Put-this-into-the-query-poll-patch.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0094-wined3d-Put-this-into-the-query-poll-patch.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0094-wined3d-Put-this-into-the-query-poll-patch.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0094-wined3d-Put-this-into-the-query-poll-patch.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,52 @@ +From 5797fdf345e0af334745c957771b6a7a770eecbc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 30 Aug 2013 13:53:48 +0200 +Subject: wined3d: Put this into the query poll patch + +--- + dlls/wined3d/cs.c | 12 ++++++++++++ + dlls/wined3d/query.c | 2 +- + 2 files changed, 13 insertions(+), 1 deletion(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 5c19a17..3540cb7 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -1728,6 +1728,18 @@ static UINT wined3d_cs_exec_query_issue(struct wined3d_cs *cs, const void *data) + list_remove(&query->poll_list_entry); + list_init(&query->poll_list_entry); + } ++ else if (op->flags & WINED3DISSUE_END) ++ { ++ /* Can happen when an occlusion query is ended without being started, ++ * in which case we don't want to poll, but still have to counter-balance ++ * the increment of the main counter (!poll && list_empty). ++ * ++ * This can also happen if an event query is re-issued before the first ++ * fence was reached (poll && !list_empty). In this case the query is ++ * already in the list and the poll function will check the new fence. ++ * We have to counter-balance the discarded increment. */ ++ InterlockedIncrement(&query->counter_retrieved); ++ } + } + + return sizeof(*op); +diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c +index 39d663a..f33b30e 100644 +--- a/dlls/wined3d/query.c ++++ b/dlls/wined3d/query.c +@@ -567,10 +567,10 @@ static BOOL wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD + checkGLcall("glEndQuery()"); + + context_release(context); ++ poll = TRUE; + } + } + oq->started = FALSE; +- poll = TRUE; + } + } + else +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0095-wined3d-Send-update_surface-commands-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0095-wined3d-Send-update_surface-commands-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0095-wined3d-Send-update_surface-commands-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0095-wined3d-Send-update_surface-commands-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,128 @@ +From 961a8cb3c42a2969dd1500b4fc16adb4d47b514f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 1 Aug 2013 00:00:26 +0200 +Subject: wined3d: Send update_surface commands through the CS + +--- + dlls/wined3d/cs.c | 48 ++++++++++++++++++++++++++++++++++++++++++ + dlls/wined3d/device.c | 9 ++------ + dlls/wined3d/wined3d_private.h | 2 ++ + 3 files changed, 52 insertions(+), 7 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 3540cb7..3264d17 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -69,6 +69,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_RESOURCE_UNMAP, + WINED3D_CS_OP_QUERY_ISSUE, + WINED3D_CS_OP_QUERY_DESTROY, ++ WINED3D_CS_OP_UPDATE_SURFACE, + WINED3D_CS_OP_STOP, + }; + +@@ -379,6 +380,15 @@ struct wined3d_cs_query_destroy + struct wined3d_query *query; + }; + ++struct wined3d_cs_update_surface ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_surface *src, *dst; ++ RECT src_rect; ++ POINT dst_point; ++ BOOL has_src_rect, has_dst_point; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -1780,6 +1790,43 @@ void wined3d_cs_emit_query_destroy(struct wined3d_cs *cs, struct wined3d_query * + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_update_surface(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_update_surface *op = data; ++ ++ surface_upload_from_surface(op->dst, op->has_dst_point ? &op->dst_point : NULL, ++ op->src, op->has_src_rect ? &op->src_rect : NULL); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_update_surface(struct wined3d_cs *cs, struct wined3d_surface *src, const RECT *src_rect, ++ struct wined3d_surface *dst, const POINT *dst_point) ++{ ++ struct wined3d_cs_update_surface *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_UPDATE_SURFACE; ++ op->src = src; ++ op->dst = dst; ++ op->has_src_rect = FALSE; ++ op->has_dst_point = FALSE; ++ ++ if (src_rect) ++ { ++ op->has_src_rect = TRUE; ++ op->src_rect = *src_rect; ++ } ++ ++ if (dst_point) ++ { ++ op->has_dst_point = TRUE; ++ op->dst_point = *dst_point; ++ } ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -1827,6 +1874,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_RESOURCE_UNMAP */ wined3d_cs_exec_resource_unmap, + /* WINED3D_CS_OP_QUERY_ISSUE */ wined3d_cs_exec_query_issue, + /* WINED3D_CS_OP_QUERY_DESTROY */ wined3d_cs_exec_query_destroy, ++ /* WINED3D_CS_OP_UPDATE_SURFACE */ wined3d_cs_exec_update_surface, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index cd90c76..ed055f8 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -3796,14 +3796,9 @@ HRESULT CDECL wined3d_device_update_surface(struct wined3d_device *device, + return WINED3DERR_INVALIDCALL; + } + +- if (wined3d_settings.cs_multithreaded) +- { +- FIXME("Waiting for cs.\n"); +- wined3d_cs_emit_glfinish(device->cs); +- device->cs->ops->finish(device->cs); +- } ++ wined3d_cs_emit_update_surface(device->cs, src_surface, src_rect, dst_surface, dst_point); + +- return surface_upload_from_surface(dst_surface, dst_point, src_surface, src_rect); ++ return WINED3D_OK; + } + + void CDECL wined3d_device_copy_resource(struct wined3d_device *device, +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 8dd9786..07d1613 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2651,6 +2651,8 @@ void wined3d_cs_emit_query_issue(struct wined3d_cs *cs, struct wined3d_query *qu + void wined3d_cs_emit_query_get_data(struct wined3d_cs *cs, struct wined3d_query *query, void *data, + UINT data_size, DWORD flags, HRESULT *ret) DECLSPEC_HIDDEN; + void wined3d_cs_emit_query_destroy(struct wined3d_cs *cs, struct wined3d_query *query) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_update_surface(struct wined3d_cs *cs, struct wined3d_surface *src, ++ const RECT *src_rect, struct wined3d_surface *dst, const POINT *dst_point) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0096-wined3d-Send-texture-preloads-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0096-wined3d-Send-texture-preloads-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0096-wined3d-Send-texture-preloads-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0096-wined3d-Send-texture-preloads-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,107 @@ +From dd0852f22f9a3e04e9fefae6c0a3ac4913cc390d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 1 Aug 2013 00:10:40 +0200 +Subject: wined3d: Send texture preloads through the CS + +--- + dlls/wined3d/cs.c | 32 ++++++++++++++++++++++++++++++++ + dlls/wined3d/texture.c | 6 ++---- + dlls/wined3d/wined3d_private.h | 1 + + 3 files changed, 35 insertions(+), 4 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 3264d17..78e5010 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -70,6 +70,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_QUERY_ISSUE, + WINED3D_CS_OP_QUERY_DESTROY, + WINED3D_CS_OP_UPDATE_SURFACE, ++ WINED3D_CS_OP_TEXTURE_PRELOAD, + WINED3D_CS_OP_STOP, + }; + +@@ -389,6 +390,12 @@ struct wined3d_cs_update_surface + BOOL has_src_rect, has_dst_point; + }; + ++struct wined3d_cs_texture_preload ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_texture *texture; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -1827,6 +1834,30 @@ void wined3d_cs_emit_update_surface(struct wined3d_cs *cs, struct wined3d_surfac + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_texture_preload(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_texture_preload *op = data; ++ struct wined3d_context *context; ++ struct wined3d_texture *texture = op->texture; ++ ++ context = context_acquire(cs->device, NULL); ++ wined3d_texture_load(texture, context, texture->flags & WINED3D_TEXTURE_IS_SRGB); ++ context_release(context); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_texture_preload(struct wined3d_cs *cs, struct wined3d_texture *texture) ++{ ++ struct wined3d_cs_texture_preload *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_TEXTURE_PRELOAD; ++ op->texture = texture; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -1875,6 +1906,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_QUERY_ISSUE */ wined3d_cs_exec_query_issue, + /* WINED3D_CS_OP_QUERY_DESTROY */ wined3d_cs_exec_query_destroy, + /* WINED3D_CS_OP_UPDATE_SURFACE */ wined3d_cs_exec_update_surface, ++ /* WINED3D_CS_OP_TEXTURE_PRELOAD */ wined3d_cs_exec_texture_preload, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index b7891d9..ea8589a 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -569,10 +569,8 @@ void wined3d_texture_load(struct wined3d_texture *texture, + + void CDECL wined3d_texture_preload(struct wined3d_texture *texture) + { +- struct wined3d_context *context; +- context = context_acquire(texture->resource.device, NULL); +- wined3d_texture_load(texture, context, texture->flags & WINED3D_TEXTURE_IS_SRGB); +- context_release(context); ++ const struct wined3d_device *device = texture->resource.device; ++ wined3d_cs_emit_texture_preload(device->cs, texture); + } + + void * CDECL wined3d_texture_get_parent(const struct wined3d_texture *texture) +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 07d1613..de82b46 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2653,6 +2653,7 @@ void wined3d_cs_emit_query_get_data(struct wined3d_cs *cs, struct wined3d_query + void wined3d_cs_emit_query_destroy(struct wined3d_cs *cs, struct wined3d_query *query) DECLSPEC_HIDDEN; + void wined3d_cs_emit_update_surface(struct wined3d_cs *cs, struct wined3d_surface *src, + const RECT *src_rect, struct wined3d_surface *dst, const POINT *dst_point) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_texture_preload(struct wined3d_cs *cs, struct wined3d_texture *texture) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0097-wined3d-Send-surface-preloads-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0097-wined3d-Send-surface-preloads-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0097-wined3d-Send-surface-preloads-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0097-wined3d-Send-surface-preloads-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,112 @@ +From 2f0bb40d8d1791180b93f3d4eccbf7c3f190d19e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 1 Aug 2013 00:15:58 +0200 +Subject: wined3d: Send surface preloads through the CS + +--- + dlls/wined3d/cs.c | 31 +++++++++++++++++++++++++++++++ + dlls/wined3d/surface.c | 5 +++-- + dlls/wined3d/wined3d_private.h | 1 + + 3 files changed, 35 insertions(+), 2 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 78e5010..4834dd4 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -71,6 +71,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_QUERY_DESTROY, + WINED3D_CS_OP_UPDATE_SURFACE, + WINED3D_CS_OP_TEXTURE_PRELOAD, ++ WINED3D_CS_OP_SURFACE_PRELOAD, + WINED3D_CS_OP_STOP, + }; + +@@ -396,6 +397,12 @@ struct wined3d_cs_texture_preload + struct wined3d_texture *texture; + }; + ++struct wined3d_cs_surface_preload ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_surface *surface; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -1858,6 +1865,29 @@ void wined3d_cs_emit_texture_preload(struct wined3d_cs *cs, struct wined3d_textu + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_surface_preload(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_surface_preload *op = data; ++ struct wined3d_context *context; ++ ++ context = context_acquire(cs->device, NULL); ++ wined3d_texture_preload(op->surface->container); ++ context_release(context); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_surface_preload(struct wined3d_cs *cs, struct wined3d_surface *surface) ++{ ++ struct wined3d_cs_surface_preload *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SURFACE_PRELOAD; ++ op->surface = surface; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -1907,6 +1937,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_QUERY_DESTROY */ wined3d_cs_exec_query_destroy, + /* WINED3D_CS_OP_UPDATE_SURFACE */ wined3d_cs_exec_update_surface, + /* WINED3D_CS_OP_TEXTURE_PRELOAD */ wined3d_cs_exec_texture_preload, ++ /* WINED3D_CS_OP_SURFACE_PRELOAD */ wined3d_cs_exec_surface_preload, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 9dadb6d..b2a5d22 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -1771,15 +1771,16 @@ ULONG CDECL wined3d_surface_decref(struct wined3d_surface *surface) + + void CDECL wined3d_surface_preload(struct wined3d_surface *surface) + { ++ const struct wined3d_device *device = surface->resource.device; + TRACE("surface %p.\n", surface); + +- if (!surface->resource.device->d3d_initialized) ++ if (!device->d3d_initialized) + { + ERR("D3D not initialized.\n"); + return; + } + +- wined3d_texture_preload(surface->container); ++ wined3d_cs_emit_surface_preload(device->cs, surface); + } + + void * CDECL wined3d_surface_get_parent(const struct wined3d_surface *surface) +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index de82b46..409f395 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2654,6 +2654,7 @@ void wined3d_cs_emit_query_destroy(struct wined3d_cs *cs, struct wined3d_query * + void wined3d_cs_emit_update_surface(struct wined3d_cs *cs, struct wined3d_surface *src, + const RECT *src_rect, struct wined3d_surface *dst, const POINT *dst_point) DECLSPEC_HIDDEN; + void wined3d_cs_emit_texture_preload(struct wined3d_cs *cs, struct wined3d_texture *texture) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_surface_preload(struct wined3d_cs *cs, struct wined3d_surface *surface) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0098-wined3d-Send-update_texture-calls-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0098-wined3d-Send-update_texture-calls-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0098-wined3d-Send-update_texture-calls-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0098-wined3d-Send-update_texture-calls-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,310 @@ +From ece46da9666f1f33930351ffe5ba81d346db164a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 1 Aug 2013 00:33:48 +0200 +Subject: wined3d: Send update_texture calls through the CS + +--- + dlls/wined3d/cs.c | 33 ++++++++++ + dlls/wined3d/device.c | 134 ++++++++++++++++++----------------------- + dlls/wined3d/wined3d_private.h | 4 ++ + 3 files changed, 97 insertions(+), 74 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 4834dd4..aeba50f 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -72,6 +72,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_UPDATE_SURFACE, + WINED3D_CS_OP_TEXTURE_PRELOAD, + WINED3D_CS_OP_SURFACE_PRELOAD, ++ WINED3D_CS_OP_UPDATE_TEXTURE, + WINED3D_CS_OP_STOP, + }; + +@@ -403,6 +404,12 @@ struct wined3d_cs_surface_preload + struct wined3d_surface *surface; + }; + ++struct wined3d_cs_update_texture ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_texture *src, *dst; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -1888,6 +1895,31 @@ void wined3d_cs_emit_surface_preload(struct wined3d_cs *cs, struct wined3d_surfa + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_update_texture(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_update_texture *op = data; ++ struct wined3d_context *context; ++ ++ context = context_acquire(cs->device, NULL); ++ device_exec_update_texture(context, op->src, op->dst); ++ context_release(context); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_update_texture(struct wined3d_cs *cs, struct wined3d_texture *src, ++ struct wined3d_texture *dst) ++{ ++ struct wined3d_cs_update_texture *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_UPDATE_TEXTURE; ++ op->src = src; ++ op->dst = dst; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -1938,6 +1970,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_UPDATE_SURFACE */ wined3d_cs_exec_update_surface, + /* WINED3D_CS_OP_TEXTURE_PRELOAD */ wined3d_cs_exec_texture_preload, + /* WINED3D_CS_OP_SURFACE_PRELOAD */ wined3d_cs_exec_surface_preload, ++ /* WINED3D_CS_OP_UPDATE_TEXTURE */ wined3d_cs_exec_update_texture, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index ed055f8..f1c284a 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -3398,16 +3398,15 @@ void CDECL wined3d_device_draw_indexed_primitive_instanced(struct wined3d_device + } + + /* This is a helper function for UpdateTexture, there is no UpdateVolume method in D3D. */ +-static HRESULT device_update_volume(struct wined3d_device *device, ++static HRESULT device_update_volume(struct wined3d_context *context, + struct wined3d_volume *src_volume, struct wined3d_volume *dst_volume) + { + struct wined3d_map_desc src; + HRESULT hr; + struct wined3d_bo_address data; +- struct wined3d_context *context; + +- TRACE("device %p, src_volume %p, dst_volume %p.\n", +- device, src_volume, dst_volume); ++ TRACE("src_volume %p, dst_volume %p.\n", ++ src_volume, dst_volume); + + if (src_volume->resource.format != dst_volume->resource.format) + { +@@ -3425,8 +3424,6 @@ static HRESULT device_update_volume(struct wined3d_device *device, + if (FAILED(hr = wined3d_volume_map(src_volume, &src, NULL, WINED3D_MAP_READONLY))) + return hr; + +- context = context_acquire(device, NULL); +- + /* Only a prepare, since we're uploading the entire volume. */ + wined3d_texture_prepare_texture(dst_volume->container, context, FALSE); + +@@ -3435,68 +3432,21 @@ static HRESULT device_update_volume(struct wined3d_device *device, + wined3d_volume_upload_data(dst_volume, context, &data); + wined3d_resource_invalidate_location(&dst_volume->resource, ~WINED3D_LOCATION_TEXTURE_RGB); + +- context_release(context); +- + hr = wined3d_volume_unmap(src_volume); + + return hr; + } + +-HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device, +- struct wined3d_texture *src_texture, struct wined3d_texture *dst_texture) ++/* Context activation is done by the caller */ ++void device_exec_update_texture(struct wined3d_context *context, struct wined3d_texture *src_texture, ++ struct wined3d_texture *dst_texture) + { +- enum wined3d_resource_type type; +- unsigned int level_count, i; +- HRESULT hr; +- struct wined3d_context *context; +- +- TRACE("device %p, src_texture %p, dst_texture %p.\n", device, src_texture, dst_texture); +- +- /* Verify that the source and destination textures are non-NULL. */ +- if (!src_texture || !dst_texture) +- { +- WARN("Source and destination textures must be non-NULL, returning WINED3DERR_INVALIDCALL.\n"); +- return WINED3DERR_INVALIDCALL; +- } +- +- if (src_texture->resource.pool != WINED3D_POOL_SYSTEM_MEM) +- { +- WARN("Source texture not in WINED3D_POOL_SYSTEM_MEM, returning WINED3DERR_INVALIDCALL.\n"); +- return WINED3DERR_INVALIDCALL; +- } +- if (dst_texture->resource.pool != WINED3D_POOL_DEFAULT) +- { +- WARN("Destination texture not in WINED3D_POOL_DEFAULT, returning WINED3DERR_INVALIDCALL.\n"); +- return WINED3DERR_INVALIDCALL; +- } +- +- /* Verify that the source and destination textures are the same type. */ +- type = src_texture->resource.type; +- if (dst_texture->resource.type != type) +- { +- WARN("Source and destination have different types, returning WINED3DERR_INVALIDCALL.\n"); +- return WINED3DERR_INVALIDCALL; +- } +- +- /* Check that both textures have the identical numbers of levels. */ +- level_count = wined3d_texture_get_level_count(src_texture); +- if (wined3d_texture_get_level_count(dst_texture) != level_count) +- { +- WARN("Source and destination have different level counts, returning WINED3DERR_INVALIDCALL.\n"); +- return WINED3DERR_INVALIDCALL; +- } +- +- if (wined3d_settings.cs_multithreaded) +- { +- FIXME("Waiting for cs.\n"); +- wined3d_cs_emit_glfinish(device->cs); +- device->cs->ops->finish(device->cs); +- } ++ enum wined3d_resource_type type = src_texture->resource.type; ++ unsigned int level_count = wined3d_texture_get_level_count(src_texture); ++ unsigned int i; + + /* Make sure that the destination texture is loaded. */ +- context = context_acquire(device, NULL); + wined3d_texture_load(dst_texture, context, FALSE); +- context_release(context); + + /* Update every surface level of the texture. */ + switch (type) +@@ -3510,12 +3460,7 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device, + { + src_surface = surface_from_resource(wined3d_texture_get_sub_resource(src_texture, i)); + dst_surface = surface_from_resource(wined3d_texture_get_sub_resource(dst_texture, i)); +- hr = wined3d_device_update_surface(device, src_surface, NULL, dst_surface, NULL); +- if (FAILED(hr)) +- { +- WARN("Failed to update surface, hr %#x.\n", hr); +- return hr; +- } ++ surface_upload_from_surface(dst_surface, NULL, src_surface, NULL); + } + break; + } +@@ -3529,12 +3474,7 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device, + { + src_surface = surface_from_resource(wined3d_texture_get_sub_resource(src_texture, i)); + dst_surface = surface_from_resource(wined3d_texture_get_sub_resource(dst_texture, i)); +- hr = wined3d_device_update_surface(device, src_surface, NULL, dst_surface, NULL); +- if (FAILED(hr)) +- { +- WARN("Failed to update surface, hr %#x.\n", hr); +- return hr; +- } ++ surface_upload_from_surface(dst_surface, NULL, src_surface, NULL); + } + break; + } +@@ -3543,13 +3483,14 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device, + { + for (i = 0; i < level_count; ++i) + { +- hr = device_update_volume(device, ++ HRESULT hr; ++ hr = device_update_volume(context, + volume_from_resource(wined3d_texture_get_sub_resource(src_texture, i)), + volume_from_resource(wined3d_texture_get_sub_resource(dst_texture, i))); + if (FAILED(hr)) + { + WARN("Failed to update volume, hr %#x.\n", hr); +- return hr; ++ return; + } + } + break; +@@ -3557,9 +3498,54 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device, + + default: + FIXME("Unsupported texture type %#x.\n", type); +- return WINED3DERR_INVALIDCALL; ++ return; ++ } ++} ++ ++HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device, ++ struct wined3d_texture *src_texture, struct wined3d_texture *dst_texture) ++{ ++ enum wined3d_resource_type type; ++ unsigned int level_count; ++ ++ TRACE("device %p, src_texture %p, dst_texture %p.\n", device, src_texture, dst_texture); ++ ++ /* Verify that the source and destination textures are non-NULL. */ ++ if (!src_texture || !dst_texture) ++ { ++ WARN("Source and destination textures must be non-NULL, returning WINED3DERR_INVALIDCALL.\n"); ++ return WINED3DERR_INVALIDCALL; + } + ++ if (src_texture->resource.pool != WINED3D_POOL_SYSTEM_MEM) ++ { ++ WARN("Source texture not in WINED3D_POOL_SYSTEM_MEM, returning WINED3DERR_INVALIDCALL.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ if (dst_texture->resource.pool != WINED3D_POOL_DEFAULT) ++ { ++ WARN("Destination texture not in WINED3D_POOL_DEFAULT, returning WINED3DERR_INVALIDCALL.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ /* Verify that the source and destination textures are the same type. */ ++ type = src_texture->resource.type; ++ if (dst_texture->resource.type != type) ++ { ++ WARN("Source and destination have different types, returning WINED3DERR_INVALIDCALL.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ /* Check that both textures have the identical numbers of levels. */ ++ level_count = wined3d_texture_get_level_count(src_texture); ++ if (wined3d_texture_get_level_count(dst_texture) != level_count) ++ { ++ WARN("Source and destination have different level counts, returning WINED3DERR_INVALIDCALL.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ wined3d_cs_emit_update_texture(device->cs, src_texture, dst_texture); ++ + return WINED3D_OK; + } + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 409f395..25fce7f 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2063,6 +2063,8 @@ void device_resource_add(struct wined3d_device *device, struct wined3d_resource + void device_resource_released(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void device_invalidate_state(const struct wined3d_device *device, DWORD state) DECLSPEC_HIDDEN; + void device_invalidate_shader_constants(const struct wined3d_device *device, DWORD mask) DECLSPEC_HIDDEN; ++void device_exec_update_texture(struct wined3d_context *context, struct wined3d_texture *src_texture, ++ struct wined3d_texture *dst_texture) DECLSPEC_HIDDEN; + + static inline BOOL isStateDirty(const struct wined3d_context *context, DWORD state) + { +@@ -2655,6 +2657,8 @@ void wined3d_cs_emit_update_surface(struct wined3d_cs *cs, struct wined3d_surfac + const RECT *src_rect, struct wined3d_surface *dst, const POINT *dst_point) DECLSPEC_HIDDEN; + void wined3d_cs_emit_texture_preload(struct wined3d_cs *cs, struct wined3d_texture *texture) DECLSPEC_HIDDEN; + void wined3d_cs_emit_surface_preload(struct wined3d_cs *cs, struct wined3d_surface *surface) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_update_texture(struct wined3d_cs *cs, struct wined3d_texture *src, ++ struct wined3d_texture *dst) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0099-wined3d-Get-rid-of-the-surface_upload_data-glFinish.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0099-wined3d-Get-rid-of-the-surface_upload_data-glFinish.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0099-wined3d-Get-rid-of-the-surface_upload_data-glFinish.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0099-wined3d-Get-rid-of-the-surface_upload_data-glFinish.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,27 @@ +From 37bbd4699a2266175bd1344b006d8bd5f352b8b5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 1 Aug 2013 01:43:35 +0200 +Subject: wined3d: Get rid of the surface_upload_data glFinish + +--- + dlls/wined3d/surface.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index b2a5d22..b19355c 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -1403,9 +1403,7 @@ static void surface_upload_data(struct wined3d_surface *surface, const struct wi + checkGLcall("glBindBufferARB"); + } + +- if (wined3d_settings.cs_multithreaded) +- gl_info->gl_ops.gl.p_glFinish(); +- else if (wined3d_settings.strict_draw_ordering) ++ if (wined3d_settings.strict_draw_ordering) + gl_info->gl_ops.gl.p_glFlush(); + + if (gl_info->quirks & WINED3D_QUIRK_FBO_TEX_UPDATE) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0100-wined3d-Don-t-lock-the-src-volume-in-device_update_v.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0100-wined3d-Don-t-lock-the-src-volume-in-device_update_v.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0100-wined3d-Don-t-lock-the-src-volume-in-device_update_v.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0100-wined3d-Don-t-lock-the-src-volume-in-device_update_v.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,50 @@ +From b78bd76d80ff1d2edf5a9789e117ae003ec2c842 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 29 Aug 2013 22:25:14 +0200 +Subject: wined3d: Don't lock the src volume in device_update_volume + +This will attempt to wait for the CS, but this code is executed by the CS, so +it will, among other problems, break the single producer, single consumer +assumption of the work queue. + +FIXME: Maybe merge this with the previous patch or change their order. +--- + dlls/wined3d/device.c | 10 +--------- + 1 file changed, 1 insertion(+), 9 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index f1c284a..ae7ad31 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -3401,7 +3401,6 @@ void CDECL wined3d_device_draw_indexed_primitive_instanced(struct wined3d_device + static HRESULT device_update_volume(struct wined3d_context *context, + struct wined3d_volume *src_volume, struct wined3d_volume *dst_volume) + { +- struct wined3d_map_desc src; + HRESULT hr; + struct wined3d_bo_address data; + +@@ -3421,19 +3420,12 @@ static HRESULT device_update_volume(struct wined3d_context *context, + return WINED3DERR_INVALIDCALL; + } + +- if (FAILED(hr = wined3d_volume_map(src_volume, &src, NULL, WINED3D_MAP_READONLY))) +- return hr; +- + /* Only a prepare, since we're uploading the entire volume. */ + wined3d_texture_prepare_texture(dst_volume->container, context, FALSE); +- +- data.buffer_object = 0; +- data.addr = src.data; ++ wined3d_resource_get_memory(&src_volume->resource, src_volume->resource.map_binding, &data); + wined3d_volume_upload_data(dst_volume, context, &data); + wined3d_resource_invalidate_location(&dst_volume->resource, ~WINED3D_LOCATION_TEXTURE_RGB); + +- hr = wined3d_volume_unmap(src_volume); +- + return hr; + } + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0101-wined3d-Handle-evit_managed_resources-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0101-wined3d-Handle-evit_managed_resources-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0101-wined3d-Handle-evit_managed_resources-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0101-wined3d-Handle-evit_managed_resources-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,129 @@ +From 87f659571c4214fcc73a42a1e112d6bda34950a3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 6 Aug 2013 13:50:31 +0200 +Subject: wined3d: Handle evit_managed_resources through the CS + +--- + dlls/wined3d/cs.c | 37 +++++++++++++++++++++++++++++++++++++ + dlls/wined3d/device.c | 14 +++----------- + dlls/wined3d/wined3d_private.h | 1 + + 3 files changed, 41 insertions(+), 11 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index aeba50f..11aa133 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -73,6 +73,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_TEXTURE_PRELOAD, + WINED3D_CS_OP_SURFACE_PRELOAD, + WINED3D_CS_OP_UPDATE_TEXTURE, ++ WINED3D_CS_OP_EVICT_RESOURCE, + WINED3D_CS_OP_STOP, + }; + +@@ -410,6 +411,12 @@ struct wined3d_cs_update_texture + struct wined3d_texture *src, *dst; + }; + ++struct wined3d_cs_evict_resource ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_resource *resource; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -1920,6 +1927,35 @@ void wined3d_cs_emit_update_texture(struct wined3d_cs *cs, struct wined3d_textur + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_evict_resource(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_evict_resource *op = data; ++ struct wined3d_resource *resource = op->resource; ++ ++ resource->resource_ops->resource_unload(resource); ++ ++ /* FIXME: Is this necessary? Bound buffers are preloaded anyway, and in theory ++ * PreLoad should take care of invalidating the state if the VBO changes */ ++ if (resource->bind_count && resource->type == WINED3D_RTYPE_BUFFER) ++ { ++ device_invalidate_state(cs->device, STATE_STREAMSRC); ++ device_invalidate_state(cs->device, STATE_INDEXBUFFER); ++ } ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_evict_resource(struct wined3d_cs *cs, struct wined3d_resource *resource) ++{ ++ struct wined3d_cs_evict_resource *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_EVICT_RESOURCE; ++ op->resource = resource; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -1971,6 +2007,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_TEXTURE_PRELOAD */ wined3d_cs_exec_texture_preload, + /* WINED3D_CS_OP_SURFACE_PRELOAD */ wined3d_cs_exec_surface_preload, + /* WINED3D_CS_OP_UPDATE_TEXTURE */ wined3d_cs_exec_update_texture, ++ /* WINED3D_CS_OP_EVICT_RESOURCE */ wined3d_cs_exec_evict_resource, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index ae7ad31..f062e84 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -4207,13 +4207,8 @@ void CDECL wined3d_device_evict_managed_resources(struct wined3d_device *device) + + TRACE("device %p.\n", device); + +- if (wined3d_settings.cs_multithreaded) +- { +- FIXME("Waiting for cs.\n"); +- wined3d_cs_emit_glfinish(device->cs); +- device->cs->ops->finish(device->cs); +- } +- ++ /* The resource list is manged by the main thread, iterate here and emit commands for ++ * each resource */ + LIST_FOR_EACH_ENTRY_SAFE(resource, cursor, &device->resources, struct wined3d_resource, resource_list_entry) + { + TRACE("Checking resource %p for eviction.\n", resource); +@@ -4221,12 +4216,9 @@ void CDECL wined3d_device_evict_managed_resources(struct wined3d_device *device) + if (resource->pool == WINED3D_POOL_MANAGED && !resource->map_count) + { + TRACE("Evicting %p.\n", resource); +- resource->resource_ops->resource_unload(resource); ++ wined3d_cs_emit_evict_resource(device->cs, resource); + } + } +- +- /* Invalidate stream sources, the buffer(s) may have been evicted. */ +- device_invalidate_state(device, STATE_STREAMSRC); + } + + static void delete_opengl_contexts(struct wined3d_device *device, struct wined3d_swapchain *swapchain) +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 25fce7f..b9eee2c 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2659,6 +2659,7 @@ void wined3d_cs_emit_texture_preload(struct wined3d_cs *cs, struct wined3d_textu + void wined3d_cs_emit_surface_preload(struct wined3d_cs *cs, struct wined3d_surface *surface) DECLSPEC_HIDDEN; + void wined3d_cs_emit_update_texture(struct wined3d_cs *cs, struct wined3d_texture *src, + struct wined3d_texture *dst) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_evict_resource(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0102-wined3d-Send-flips-through-the-command-stream.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0102-wined3d-Send-flips-through-the-command-stream.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0102-wined3d-Send-flips-through-the-command-stream.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0102-wined3d-Send-flips-through-the-command-stream.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,115 @@ +From 883b523131797cfb6e3c715ff8018850d48734a6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 6 Aug 2013 17:39:26 +0200 +Subject: wined3d: Send flips through the command stream + +TODO: This remove this patch and flip_surface / surface_flip. +--- + dlls/wined3d/surface.c | 77 ------------------------------------------ + dlls/wined3d/wined3d_private.h | 2 +- + 2 files changed, 1 insertion(+), 78 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index b19355c..0c3313d 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -2758,83 +2758,6 @@ void surface_prepare_rb(struct wined3d_surface *surface, const struct wined3d_gl + } + } + +-void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) +-{ +- if (front->container->level_count != 1 || front->container->layer_count != 1 +- || back->container->level_count != 1 || back->container->layer_count != 1) +- ERR("Flip between surfaces %p and %p not supported.\n", front, back); +- +- /* Flip the surface contents */ +- /* Flip the DC */ +- { +- HDC tmp; +- tmp = front->hDC; +- front->hDC = back->hDC; +- back->hDC = tmp; +- } +- +- /* Flip the DIBsection */ +- { +- HBITMAP tmp = front->dib.DIBsection; +- front->dib.DIBsection = back->dib.DIBsection; +- back->dib.DIBsection = tmp; +- } +- +- /* Flip the surface data */ +- { +- void* tmp; +- +- tmp = front->resource.bitmap_data; +- front->resource.bitmap_data = back->resource.bitmap_data; +- back->resource.bitmap_data = tmp; +- +- tmp = front->resource.heap_memory; +- front->resource.heap_memory = back->resource.heap_memory; +- back->resource.heap_memory = tmp; +- } +- +- /* Flip the PBO */ +- { +- GLuint tmp_pbo = front->resource.buffer_object; +- front->resource.buffer_object = back->resource.buffer_object; +- back->resource.buffer_object = tmp_pbo; +- } +- +- /* Flip the opengl texture */ +- { +- GLuint tmp; +- +- tmp = back->container->texture_rgb.name; +- back->container->texture_rgb.name = front->container->texture_rgb.name; +- front->container->texture_rgb.name = tmp; +- +- tmp = back->container->texture_srgb.name; +- back->container->texture_srgb.name = front->container->texture_srgb.name; +- front->container->texture_srgb.name = tmp; +- +- tmp = back->rb_multisample; +- back->rb_multisample = front->rb_multisample; +- front->rb_multisample = tmp; +- +- tmp = back->rb_resolved; +- back->rb_resolved = front->rb_resolved; +- front->rb_resolved = tmp; +- +- resource_unload(&back->resource); +- resource_unload(&front->resource); +- } +- +- { +- DWORD tmp_flags = back->flags; +- back->flags = front->flags; +- front->flags = tmp_flags; +- +- tmp_flags = back->resource.locations; +- back->resource.locations = front->resource.locations; +- front->resource.locations = tmp_flags; +- } +-} +- + /* Does a direct frame buffer -> texture copy. Stretching is done with single + * pixel copy calls. */ + static void fb_copy_to_texture_direct(struct wined3d_surface *dst_surface, struct wined3d_surface *src_surface, +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index b9eee2c..a2bee4d 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2424,7 +2424,7 @@ BOOL surface_check_block_align(struct wined3d_surface *surface, const RECT *rect + + void draw_textured_quad(const struct wined3d_surface *src_surface, struct wined3d_context *context, + const RECT *src_rect, const RECT *dst_rect, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; +-void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) DECLSPEC_HIDDEN; ++void surface_flip(struct wined3d_surface *front, struct wined3d_surface *back) DECLSPEC_HIDDEN; + + /* Surface flags: */ + #define SFLAG_DIBSECTION 0x00000001 /* Has a DIB section attached for GetDC. */ +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0103-wined3d-Introduce-resource-fencing.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0103-wined3d-Introduce-resource-fencing.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0103-wined3d-Introduce-resource-fencing.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0103-wined3d-Introduce-resource-fencing.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,99 @@ +From 7c8966629ab3faabae68c46d1cf63e3d42c89c99 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 20 Aug 2014 18:01:36 +0200 +Subject: wined3d: Introduce resource fencing. + +FIXME: The buffer part doesn't really make sense without dynamic buffer maps. +--- + dlls/wined3d/cs.c | 19 +++++++++++++++++++ + dlls/wined3d/wined3d_private.h | 16 ++++++++++++++++ + 2 files changed, 35 insertions(+) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 11aa133..1197eef 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -575,6 +575,7 @@ static UINT wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_draw *op = data; + const struct wined3d_gl_info *gl_info = &cs->device->adapter->gl_info; ++ unsigned int i; + + if (op->indexed && !gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX]) + { +@@ -593,6 +594,14 @@ static UINT wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data) + draw_primitive(cs->device, &cs->state, op->start_idx, op->index_count, + op->start_instance, op->instance_count, op->indexed); + ++ if (op->indexed) ++ wined3d_resource_dec_fence(&cs->state.index_buffer->resource); ++ for (i = 0; i < sizeof(cs->state.streams) / sizeof(*cs->state.streams); i++) ++ { ++ if (cs->state.streams[i].buffer) ++ wined3d_resource_dec_fence(&cs->state.streams[i].buffer->resource); ++ } ++ + return sizeof(*op); + } + +@@ -600,6 +609,8 @@ void wined3d_cs_emit_draw(struct wined3d_cs *cs, UINT start_idx, UINT index_coun + UINT start_instance, UINT instance_count, BOOL indexed) + { + struct wined3d_cs_draw *op; ++ unsigned int i; ++ const struct wined3d_state *state = &cs->device->state; + + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_DRAW; +@@ -609,6 +620,14 @@ void wined3d_cs_emit_draw(struct wined3d_cs *cs, UINT start_idx, UINT index_coun + op->instance_count = instance_count; + op->indexed = indexed; + ++ if (indexed) ++ wined3d_resource_inc_fence(&state->index_buffer->resource); ++ for (i = 0; i < sizeof(state->streams) / sizeof(*state->streams); i++) ++ { ++ if (state->streams[i].buffer) ++ wined3d_resource_inc_fence(&state->streams[i].buffer->resource); ++ } ++ + cs->ops->submit(cs, sizeof(*op)); + } + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index a2bee4d..b4e5679 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2118,6 +2118,7 @@ struct wined3d_resource + UINT custom_row_pitch, custom_slice_pitch; + struct list resource_list_entry; + DWORD locations; ++ LONG access_fence; + + void *parent; + const struct wined3d_parent_ops *parent_ops; +@@ -2171,6 +2172,21 @@ void wined3d_resource_unmap_internal(struct wined3d_resource *resource) DECLSPEC + void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_validate_location(struct wined3d_resource *resource, DWORD location) DECLSPEC_HIDDEN; + ++static inline void wined3d_resource_inc_fence(struct wined3d_resource *resource) ++{ ++ InterlockedIncrement(&resource->access_fence); ++} ++ ++static inline void wined3d_resource_dec_fence(struct wined3d_resource *resource) ++{ ++ InterlockedDecrement(&resource->access_fence); ++} ++ ++static inline void wined3d_resource_wait_fence(struct wined3d_resource *resource) ++{ ++ while(InterlockedCompareExchange(&resource->access_fence, 0, 0)); ++} ++ + /* Tests show that the start address of resources is 32 byte aligned */ + #define RESOURCE_ALIGNMENT 16 + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0104-wined3d-Fence-update_texture-and-update_surface-call.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0104-wined3d-Fence-update_texture-and-update_surface-call.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0104-wined3d-Fence-update_texture-and-update_surface-call.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0104-wined3d-Fence-update_texture-and-update_surface-call.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,117 @@ +From a83b0e8543213b11848897ea954412ac0f06083a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 30 Aug 2013 10:41:42 +0200 +Subject: wined3d: Fence update_texture and update_surface calls + +--- + dlls/wined3d/cs.c | 26 ++++++++++++++++++++++++++ + dlls/wined3d/resource.c | 28 ++++++++++++++++++++++++++++ + 2 files changed, 54 insertions(+) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 1197eef..9a7e6df 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -1844,6 +1844,16 @@ static UINT wined3d_cs_exec_update_surface(struct wined3d_cs *cs, const void *da + surface_upload_from_surface(op->dst, op->has_dst_point ? &op->dst_point : NULL, + op->src, op->has_src_rect ? &op->src_rect : NULL); + ++ if (op->src->container) ++ wined3d_resource_dec_fence(&op->src->container->resource); ++ else ++ wined3d_resource_inc_fence(&op->src->resource); ++ ++ if (op->dst->container) ++ wined3d_resource_dec_fence(&op->dst->container->resource); ++ else ++ wined3d_resource_inc_fence(&op->dst->resource); ++ + return sizeof(*op); + } + +@@ -1871,6 +1881,16 @@ void wined3d_cs_emit_update_surface(struct wined3d_cs *cs, struct wined3d_surfac + op->dst_point = *dst_point; + } + ++ if (src->container) ++ wined3d_resource_inc_fence(&src->container->resource); ++ else ++ wined3d_resource_inc_fence(&src->resource); ++ ++ if (dst->container) ++ wined3d_resource_inc_fence(&dst->container->resource); ++ else ++ wined3d_resource_inc_fence(&dst->resource); ++ + cs->ops->submit(cs, sizeof(*op)); + } + +@@ -1930,6 +1950,9 @@ static UINT wined3d_cs_exec_update_texture(struct wined3d_cs *cs, const void *da + device_exec_update_texture(context, op->src, op->dst); + context_release(context); + ++ wined3d_resource_dec_fence(&op->src->resource); ++ wined3d_resource_dec_fence(&op->dst->resource); ++ + return sizeof(*op); + } + +@@ -1943,6 +1966,9 @@ void wined3d_cs_emit_update_texture(struct wined3d_cs *cs, struct wined3d_textur + op->src = src; + op->dst = dst; + ++ wined3d_resource_inc_fence(&op->src->resource); ++ wined3d_resource_inc_fence(&op->dst->resource); ++ + cs->ops->submit(cs, sizeof(*op)); + } + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index af60d51..708b080 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -712,6 +712,32 @@ void *wined3d_resource_map_internal(struct wined3d_resource *resource, DWORD fla + return mem; + } + ++static void wined3d_resource_sync(struct wined3d_resource *resource) ++{ ++ struct wined3d_resource *real_res = resource; ++ struct wined3d_surface *surface; ++ struct wined3d_volume *volume; ++ ++ switch (resource->type) ++ { ++ case WINED3D_RTYPE_SURFACE: ++ surface = surface_from_resource(resource); ++ if (surface->container) ++ real_res = &surface->container->resource; ++ break; ++ ++ case WINED3D_RTYPE_VOLUME: ++ volume = volume_from_resource(resource); ++ real_res = &volume->container->resource; ++ break; ++ ++ default: ++ break; ++ } ++ if (!real_res->access_fence) ++ FIXME("Waiting for CS even though resource %p is idle.\n", resource); ++} ++ + HRESULT wined3d_resource_map(struct wined3d_resource *resource, + struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags) + { +@@ -730,6 +756,8 @@ HRESULT wined3d_resource_map(struct wined3d_resource *resource, + + flags = wined3d_resource_sanitize_map_flags(resource, flags); + ++ wined3d_resource_sync(resource); ++ + base_memory = wined3d_cs_emit_resource_map(device->cs, resource, flags); + if (!base_memory) + { +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0105-wined3d-Dirtify-resources-on-unmap.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0105-wined3d-Dirtify-resources-on-unmap.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0105-wined3d-Dirtify-resources-on-unmap.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0105-wined3d-Dirtify-resources-on-unmap.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,81 @@ +From 440a516b0908c7282e89fe73a788ca461d90d81e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 26 Sep 2013 17:25:01 +0200 +Subject: wined3d: Dirtify resources on unmap + +--- + dlls/wined3d/resource.c | 7 ++++++- + dlls/wined3d/surface.c | 4 ++++ + dlls/wined3d/volume.c | 3 +++ + dlls/wined3d/wined3d_private.h | 1 + + 4 files changed, 14 insertions(+), 1 deletion(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 708b080..73011f8 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -806,7 +806,7 @@ HRESULT wined3d_resource_map(struct wined3d_resource *resource, + } + + if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY))) +- wined3d_resource_invalidate_location(resource, ~resource->map_binding); ++ resource->unmap_dirtify = TRUE; + + resource->map_count++; + +@@ -826,6 +826,11 @@ void wined3d_resource_unmap_internal(struct wined3d_resource *resource) + wined3d_resource_release_map_ptr(resource, context); + if (context) + context_release(context); ++ ++ if (resource->unmap_dirtify) ++ wined3d_resource_invalidate_location(resource, ~resource->map_binding); ++ resource->unmap_dirtify = FALSE; ++ + } + + HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 0c3313d..e661494 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -2405,6 +2405,10 @@ HRESULT CDECL wined3d_surface_unmap(struct wined3d_surface *surface) + HRESULT hr; + TRACE("surface %p.\n", surface); + ++ if (surface->resource.unmap_dirtify && surface->container) ++ wined3d_texture_set_dirty(surface->container); ++ ++ + hr = wined3d_resource_unmap(&surface->resource); + if (FAILED(hr)) + return hr; +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index 7ce5331..faadea1 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -424,6 +424,9 @@ HRESULT CDECL wined3d_volume_unmap(struct wined3d_volume *volume) + { + HRESULT hr; + ++ if (volume->resource.unmap_dirtify) ++ wined3d_texture_set_dirty(volume->container); ++ + hr = wined3d_resource_unmap(&volume->resource); + if (hr == WINEDDERR_NOTLOCKED) + return WINED3DERR_INVALIDCALL; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index b4e5679..d670fe1 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2119,6 +2119,7 @@ struct wined3d_resource + struct list resource_list_entry; + DWORD locations; + LONG access_fence; ++ BOOL unmap_dirtify; + + void *parent; + const struct wined3d_parent_ops *parent_ops; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0106-wined3d-Fence-texture-reads-in-draws.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0106-wined3d-Fence-texture-reads-in-draws.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0106-wined3d-Fence-texture-reads-in-draws.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0106-wined3d-Fence-texture-reads-in-draws.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,53 @@ +From 2d87f930869bcd32273e722a50a13a9330ce6a30 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 30 Aug 2013 22:42:33 +0200 +Subject: wined3d: Fence texture reads in draws + +This is probably stricter than necessary. GL BOs and allocated sysmem +are just staging resources. After they have been uploaded into the GL +texture, it's in theory OK to write new data buffer without interfering +with old draws. However, it is impossible to tell when if data has been +transfered into the texture because texture loads are delayed until draw +time. Specifically, it is difficult to separate two consecutive maps +from a map, draw, map sequence, where the draw hasn't been executed by +the time the second map occurs. + +The other problem is that sRGB may cause a texture load from +buffer/sysmem even though the GL texture is thought to be loaded. This +is limited to situations where sRGB textures are supported, but +sRGB_decode isn't. +--- + dlls/wined3d/cs.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 9a7e6df..0277a1e 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -601,6 +601,11 @@ static UINT wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data) + if (cs->state.streams[i].buffer) + wined3d_resource_dec_fence(&cs->state.streams[i].buffer->resource); + } ++ for (i = 0; i < sizeof(cs->state.textures) / sizeof(*cs->state.textures); i++) ++ { ++ if (cs->state.textures[i]) ++ wined3d_resource_dec_fence(&cs->state.textures[i]->resource); ++ } + + return sizeof(*op); + } +@@ -627,6 +632,11 @@ void wined3d_cs_emit_draw(struct wined3d_cs *cs, UINT start_idx, UINT index_coun + if (state->streams[i].buffer) + wined3d_resource_inc_fence(&state->streams[i].buffer->resource); + } ++ for (i = 0; i < sizeof(state->textures) / sizeof(*state->textures); i++) ++ { ++ if (state->textures[i]) ++ wined3d_resource_inc_fence(&state->textures[i]->resource); ++ } + + cs->ops->submit(cs, sizeof(*op)); + } +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0107-wined3d-Fence-render-targets-and-depth-stencils.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0107-wined3d-Fence-render-targets-and-depth-stencils.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0107-wined3d-Fence-render-targets-and-depth-stencils.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0107-wined3d-Fence-render-targets-and-depth-stencils.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,75 @@ +From 093a05f4ff44d45e81e9e0f3dada8fb6551cf382 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 27 Sep 2013 16:55:58 +0200 +Subject: wined3d: Fence render targets and depth stencils + +--- + dlls/wined3d/cs.c | 38 ++++++++++++++++++++++++++++++++++++++ + 1 file changed, 38 insertions(+) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 0277a1e..a4b996e 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -571,6 +571,30 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT * + cs->ops->submit(cs, size); + } + ++static inline BOOL wined3d_cs_colorwrite_enabled(const struct wined3d_state *state, unsigned int i) ++{ ++ switch (i) ++ { ++ case 0: ++ return !!state->render_states[WINED3D_RS_COLORWRITEENABLE]; ++ case 1: ++ return !!state->render_states[WINED3D_RS_COLORWRITEENABLE1]; ++ case 2: ++ return !!state->render_states[WINED3D_RS_COLORWRITEENABLE2]; ++ case 3: ++ return !!state->render_states[WINED3D_RS_COLORWRITEENABLE3]; ++ default: ++ ERR("Unexpected color target %u.\n", i); ++ return TRUE; ++ } ++} ++ ++static inline BOOL wined3d_cs_depth_stencil_enabled(const struct wined3d_state *state) ++{ ++ return state->render_states[WINED3D_RS_ZENABLE] ++ || state->render_states[WINED3D_RS_STENCILENABLE]; ++} ++ + static UINT wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_draw *op = data; +@@ -606,6 +630,13 @@ static UINT wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data) + if (cs->state.textures[i]) + wined3d_resource_dec_fence(&cs->state.textures[i]->resource); + } ++ for (i = 0; i < sizeof(cs->state.fb.render_targets) / sizeof(*cs->state.fb.render_targets); i++) ++ { ++ if (cs->state.fb.render_targets[i] && wined3d_cs_colorwrite_enabled(&cs->state, i)) ++ wined3d_resource_dec_fence(cs->state.fb.render_targets[i]->resource); ++ } ++ if (cs->state.fb.depth_stencil && wined3d_cs_depth_stencil_enabled(&cs->state)) ++ wined3d_resource_dec_fence(cs->state.fb.depth_stencil->resource); + + return sizeof(*op); + } +@@ -637,6 +668,13 @@ void wined3d_cs_emit_draw(struct wined3d_cs *cs, UINT start_idx, UINT index_coun + if (state->textures[i]) + wined3d_resource_inc_fence(&state->textures[i]->resource); + } ++ for (i = 0; i < sizeof(state->fb.render_targets) / sizeof(*state->fb.render_targets); i++) ++ { ++ if (state->fb.render_targets[i] && wined3d_cs_colorwrite_enabled(state, i)) ++ wined3d_resource_inc_fence(state->fb.render_targets[i]->resource); ++ } ++ if (state->fb.depth_stencil && wined3d_cs_depth_stencil_enabled(state)) ++ wined3d_resource_inc_fence(state->fb.depth_stencil->resource); + + cs->ops->submit(cs, sizeof(*op)); + } +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0108-wined3d-Fence-blit-operations.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0108-wined3d-Fence-blit-operations.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0108-wined3d-Fence-blit-operations.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0108-wined3d-Fence-blit-operations.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,38 @@ +From 5903d5d7db4ffbfb87d1b9616d13ea05d19dd171 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 27 Sep 2013 16:57:01 +0200 +Subject: wined3d: Fence blit operations. + +--- + dlls/wined3d/cs.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index a4b996e..5603a37 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -1709,6 +1709,10 @@ static UINT wined3d_cs_exec_blt(struct wined3d_cs *cs, const void *data) + op->src_surface, &op->src_rect, + op->flags, &op->fx, op->filter); + ++ wined3d_resource_dec_fence(&op->dst_surface->container->resource); ++ if (op->src_surface && op->src_surface != op->dst_surface) ++ wined3d_resource_dec_fence(&op->src_surface->container->resource); ++ + return sizeof(*op); + } + +@@ -1730,6 +1734,10 @@ void wined3d_cs_emit_blt(struct wined3d_cs *cs, struct wined3d_surface *dst_surf + if (fx) + op->fx = *fx; + ++ wined3d_resource_inc_fence(&dst_surface->container->resource); ++ if (src_surface && src_surface != dst_surface) ++ wined3d_resource_inc_fence(&src_surface->container->resource); ++ + cs->ops->submit(cs, sizeof(*op)); + } + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0109-wined3d-Fence-color_fill-operations.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0109-wined3d-Fence-color_fill-operations.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0109-wined3d-Fence-color_fill-operations.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0109-wined3d-Fence-color_fill-operations.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,34 @@ +From 97f6ef9c0d1d05efc640183d3b045296bca762a0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 27 Sep 2013 16:58:13 +0200 +Subject: wined3d: Fence color_fill operations. + +--- + dlls/wined3d/cs.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 5603a37..fb92286 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -1750,6 +1750,8 @@ static UINT wined3d_cs_exec_clear_rtv(struct wined3d_cs *cs, const void *data) + + surface_color_fill(surface_from_resource(resource), &op->rect, &op->color); + ++ wined3d_resource_dec_fence(op->view->resource); ++ + return sizeof(*op); + } + +@@ -1764,6 +1766,8 @@ void wined3d_cs_emit_clear_rtv(struct wined3d_cs *cs, struct wined3d_rendertarge + op->rect = *rect; + op->color = *color; + ++ wined3d_resource_inc_fence(view->resource); ++ + cs->ops->submit(cs, sizeof(*op)); + } + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0110-wined3d-Fence-clear-calls.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0110-wined3d-Fence-clear-calls.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0110-wined3d-Fence-clear-calls.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0110-wined3d-Fence-clear-calls.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,72 @@ +From d95011df395938acfe6f6c7a33f7c5c094e7df83 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 27 Sep 2013 17:04:47 +0200 +Subject: wined3d: Fence clear calls. + +--- + dlls/wined3d/cs.c | 27 +++++++++++++++++++++++++-- + 1 file changed, 25 insertions(+), 2 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index fb92286..bdb9279 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -540,7 +540,7 @@ static UINT wined3d_cs_exec_clear(struct wined3d_cs *cs, const void *data) + const struct wined3d_cs_clear *op = data; + struct wined3d_device *device; + RECT draw_rect; +- unsigned int extra_rects = op->rect_count ? op->rect_count - 1 : 0; ++ unsigned int extra_rects = op->rect_count ? op->rect_count - 1 : 0, i; + + device = cs->device; + wined3d_get_draw_rect(&cs->state, &draw_rect); +@@ -548,6 +548,17 @@ static UINT wined3d_cs_exec_clear(struct wined3d_cs *cs, const void *data) + &cs->state.fb, op->rect_count, op->rect_count ? op->rects : NULL, &draw_rect, op->flags, + &op->color, op->depth, op->stencil); + ++ if (op->flags & WINED3DCLEAR_TARGET) ++ { ++ for (i = 0; i < sizeof(cs->state.fb.render_targets) / sizeof(*cs->state.fb.render_targets); i++) ++ { ++ if (cs->state.fb.render_targets[i]) ++ wined3d_resource_dec_fence(cs->state.fb.render_targets[i]->resource); ++ } ++ } ++ if (op->flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL)) ++ wined3d_resource_dec_fence(cs->state.fb.depth_stencil->resource); ++ + return sizeof(*op) + sizeof(*op->rects) * extra_rects; + } + +@@ -555,8 +566,9 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT * + DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil) + { + struct wined3d_cs_clear *op; +- unsigned int extra_rects = rect_count ? rect_count - 1 : 0; ++ unsigned int extra_rects = rect_count ? rect_count - 1 : 0, i; + size_t size = sizeof(*op) + sizeof(*op->rects) * extra_rects; ++ const struct wined3d_state *state = &cs->device->state; + + op = cs->ops->require_space(cs, size); + op->opcode = WINED3D_CS_OP_CLEAR; +@@ -568,6 +580,17 @@ void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT * + op->depth = depth; + op->stencil = stencil; + ++ if (flags & WINED3DCLEAR_TARGET) ++ { ++ for (i = 0; i < sizeof(state->fb.render_targets) / sizeof(*state->fb.render_targets); i++) ++ { ++ if (state->fb.render_targets[i]) ++ wined3d_resource_inc_fence(state->fb.render_targets[i]->resource); ++ } ++ } ++ if (flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL)) ++ wined3d_resource_inc_fence(state->fb.depth_stencil->resource); ++ + cs->ops->submit(cs, size); + } + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0111-wined3d-Fence-present-calls.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0111-wined3d-Fence-present-calls.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0111-wined3d-Fence-present-calls.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0111-wined3d-Fence-present-calls.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,54 @@ +From e485302fbcd610c34cf3e664d3d9a588fb7f3a32 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 27 Sep 2013 17:55:35 +0200 +Subject: wined3d: Fence present calls. + +--- + dlls/wined3d/cs.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index bdb9279..45dc5ce 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -485,6 +485,7 @@ static UINT wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data) + const RECT *src_rect = op->set_data & CS_PRESENT_SRC_RECT ? &op->src_rect : NULL; + const RECT *dst_rect = op->set_data & CS_PRESENT_DST_RECT ? &op->dst_rect : NULL; + const RGNDATA *dirty_region = op->set_data & CS_PRESENT_DIRTY_RGN ? &op->dirty_region : NULL; ++ unsigned int i; + + swapchain = op->swapchain; + wined3d_swapchain_set_window(swapchain, op->dst_window_override); +@@ -495,6 +496,10 @@ static UINT wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data) + + InterlockedDecrement(&cs->pending_presents); + ++ wined3d_resource_dec_fence(&swapchain->front_buffer->resource); ++ for (i = 0; i < swapchain->desc.backbuffer_count; i++) ++ wined3d_resource_dec_fence(&swapchain->back_buffers[i]->resource); ++ + return sizeof(*op); + } + +@@ -504,6 +509,7 @@ void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *sw + { + struct wined3d_cs_present *op; + LONG pending; ++ unsigned int i; + + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_PRESENT; +@@ -527,6 +533,10 @@ void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *sw + } + op->flags = flags; + ++ wined3d_resource_inc_fence(&swapchain->front_buffer->resource); ++ for (i = 0; i < swapchain->desc.backbuffer_count; i++) ++ wined3d_resource_inc_fence(&swapchain->back_buffers[i]->resource); ++ + pending = InterlockedIncrement(&cs->pending_presents); + + cs->ops->submit(cs, sizeof(*op)); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0112-wined3d-Make-resource-maps-and-unmaps-a-priority-com.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0112-wined3d-Make-resource-maps-and-unmaps-a-priority-com.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0112-wined3d-Make-resource-maps-and-unmaps-a-priority-com.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0112-wined3d-Make-resource-maps-and-unmaps-a-priority-com.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,80 @@ +From a14049c3703ec2f275f2ce21b45ba4bc32d6021d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 27 Sep 2013 17:58:25 +0200 +Subject: wined3d: Make resource maps and unmaps a priority command. + +--- + dlls/wined3d/cs.c | 14 +++++--------- + dlls/wined3d/resource.c | 8 ++++++-- + 2 files changed, 11 insertions(+), 11 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 45dc5ce..054c000 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -1819,19 +1819,15 @@ void *wined3d_cs_emit_resource_map(struct wined3d_cs *cs, struct wined3d_resourc + struct wined3d_cs_resource_map *op; + void *ret; + +- op = cs->ops->require_space(cs, sizeof(*op)); ++ op = cs->ops->require_space_prio(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_RESOURCE_MAP; + op->resource = resource; + op->flags = flags; + op->mem = &ret; + +- cs->ops->submit(cs, sizeof(*op)); ++ cs->ops->submit_prio(cs, sizeof(*op)); + +- if (flags & (WINED3D_MAP_NOOVERWRITE | WINED3D_MAP_DISCARD)) +- { +- FIXME("Dynamic resource map is inefficient\n"); +- } +- cs->ops->finish(cs); ++ cs->ops->finish_prio(cs); + + return ret; + } +@@ -1850,11 +1846,11 @@ void wined3d_cs_emit_resource_unmap(struct wined3d_cs *cs, struct wined3d_resour + { + struct wined3d_cs_resource_unmap *op; + +- op = cs->ops->require_space(cs, sizeof(*op)); ++ op = cs->ops->require_space_prio(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_RESOURCE_UNMAP; + op->resource = resource; + +- cs->ops->submit(cs, sizeof(*op)); ++ cs->ops->submit_prio(cs, sizeof(*op)); + } + + static UINT wined3d_cs_exec_query_issue(struct wined3d_cs *cs, const void *data) +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 73011f8..d2407a1 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -734,8 +734,7 @@ static void wined3d_resource_sync(struct wined3d_resource *resource) + default: + break; + } +- if (!real_res->access_fence) +- FIXME("Waiting for CS even though resource %p is idle.\n", resource); ++ wined3d_resource_wait_fence(real_res); + } + + HRESULT wined3d_resource_map(struct wined3d_resource *resource, +@@ -756,6 +755,11 @@ HRESULT wined3d_resource_map(struct wined3d_resource *resource, + + flags = wined3d_resource_sanitize_map_flags(resource, flags); + ++ if (flags & (WINED3D_MAP_NOOVERWRITE | WINED3D_MAP_DISCARD)) ++ { ++ FIXME("Dynamic resource map is inefficient\n"); ++ } ++ + wined3d_resource_sync(resource); + + base_memory = wined3d_cs_emit_resource_map(device->cs, resource, flags); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0113-wined3d-Dirtify-changed-textures-through-the-command.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0113-wined3d-Dirtify-changed-textures-through-the-command.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0113-wined3d-Dirtify-changed-textures-through-the-command.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0113-wined3d-Dirtify-changed-textures-through-the-command.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,176 @@ +From eb59e53d03f032fe4e04a6e7843ac06e9dddbbdd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 27 Sep 2013 18:46:19 +0200 +Subject: wined3d: Dirtify changed textures through the command stream. + +This makes sure unsynchronized maps (NOOVERWRITE /DISCARD) are reflected +in the volume's location flags at the right time. +--- + dlls/wined3d/cs.c | 31 ++++++++++++++++++++++++++++++- + dlls/wined3d/resource.c | 15 ++++++++++----- + dlls/wined3d/surface.c | 9 +++------ + dlls/wined3d/wined3d_private.h | 2 ++ + 4 files changed, 45 insertions(+), 12 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 054c000..f5c10dd 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -65,6 +65,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_SET_LIGHT_ENABLE, + WINED3D_CS_OP_BLT, + WINED3D_CS_OP_CLEAR_RTV, ++ WINED3D_CS_OP_RESOURCE_CHANGED, + WINED3D_CS_OP_RESOURCE_MAP, + WINED3D_CS_OP_RESOURCE_UNMAP, + WINED3D_CS_OP_QUERY_ISSUE, +@@ -365,6 +366,12 @@ struct wined3d_cs_resource_unmap + struct wined3d_resource *resource; + }; + ++struct wined3d_cs_resource_changed ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_resource *resource; ++}; ++ + struct wined3d_cs_skip + { + enum wined3d_cs_op opcode; +@@ -1804,6 +1811,27 @@ void wined3d_cs_emit_clear_rtv(struct wined3d_cs *cs, struct wined3d_rendertarge + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_resource_changed(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_resource_changed *op = data; ++ struct wined3d_resource *resource = op->resource; ++ ++ wined3d_resource_changed(resource); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_resource_changed(struct wined3d_cs *cs, struct wined3d_resource *resource) ++{ ++ struct wined3d_cs_resource_changed *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_RESOURCE_CHANGED; ++ op->resource = resource; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT wined3d_cs_exec_resource_map(struct wined3d_cs *cs, const void *data) + { + const struct wined3d_cs_resource_map *op = data; +@@ -2110,11 +2138,11 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_SET_INDEX_BUFFER */ wined3d_cs_exec_set_index_buffer, + /* WINED3D_CS_OP_SET_CONSTANT_BUFFER */ wined3d_cs_exec_set_constant_buffer, + /* WINED3D_CS_OP_SET_TEXTURE */ wined3d_cs_exec_set_texture, +- /* WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEW */ wined3d_cs_exec_set_shader_resource_view, + /* WINED3D_CS_OP_SET_SAMPLER */ wined3d_cs_exec_set_sampler, + /* WINED3D_CS_OP_SET_SHADER */ wined3d_cs_exec_set_shader, + /* WINED3D_CS_OP_SET_RENDER_STATE */ wined3d_cs_exec_set_render_state, + /* WINED3D_CS_OP_SET_TEXTURE_STATE */ wined3d_cs_exec_set_texture_state, ++ /* WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEW */ wined3d_cs_exec_set_shader_resource_view, + /* WINED3D_CS_OP_SET_SAMPLER_STATE */ wined3d_cs_exec_set_sampler_state, + /* WINED3D_CS_OP_SET_TRANSFORM */ wined3d_cs_exec_set_transform, + /* WINED3D_CS_OP_SET_CLIP_PLANE */ wined3d_cs_exec_set_clip_plane, +@@ -2133,6 +2161,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_SET_LIGHT_ENABLE */ wined3d_cs_exec_set_light_enable, + /* WINED3D_CS_OP_BLT */ wined3d_cs_exec_blt, + /* WINED3D_CS_OP_CLEAR_RTV */ wined3d_cs_exec_clear_rtv, ++ /* WINED3D_CS_OP_RESOURCE_CHANGED */ wined3d_cs_exec_resource_changed, + /* WINED3D_CS_OP_RESOURCE_MAP */ wined3d_cs_exec_resource_map, + /* WINED3D_CS_OP_RESOURCE_UNMAP */ wined3d_cs_exec_resource_unmap, + /* WINED3D_CS_OP_QUERY_ISSUE */ wined3d_cs_exec_query_issue, +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index d2407a1..7cafdc6 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -830,11 +830,6 @@ void wined3d_resource_unmap_internal(struct wined3d_resource *resource) + wined3d_resource_release_map_ptr(resource, context); + if (context) + context_release(context); +- +- if (resource->unmap_dirtify) +- wined3d_resource_invalidate_location(resource, ~resource->map_binding); +- resource->unmap_dirtify = FALSE; +- + } + + HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) +@@ -849,7 +844,17 @@ HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) + } + + wined3d_cs_emit_resource_unmap(device->cs, resource); ++ ++ if (resource->unmap_dirtify) ++ wined3d_cs_emit_resource_changed(device->cs, resource); ++ resource->unmap_dirtify = FALSE; ++ + resource->map_count--; + + return WINED3D_OK; + } ++ ++void wined3d_resource_changed(struct wined3d_resource *resource) ++{ ++ wined3d_resource_invalidate_location(resource, ~resource->map_binding); ++} +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index e661494..535e21a 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -1093,6 +1093,9 @@ static void wined3d_surface_location_invalidated(struct wined3d_resource *resour + + if (location & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) + wined3d_texture_set_dirty(surface->container); ++ ++ if (surface->container->swapchain && surface->container == surface->container->swapchain->front_buffer) ++ surface->surface_ops->surface_frontbuffer_updated(surface); + } + + static const struct wined3d_surface_ops surface_ops = +@@ -2405,16 +2408,10 @@ HRESULT CDECL wined3d_surface_unmap(struct wined3d_surface *surface) + HRESULT hr; + TRACE("surface %p.\n", surface); + +- if (surface->resource.unmap_dirtify && surface->container) +- wined3d_texture_set_dirty(surface->container); +- +- + hr = wined3d_resource_unmap(&surface->resource); + if (FAILED(hr)) + return hr; + +- if (surface->container->swapchain && surface->container == surface->container->swapchain->front_buffer) +- surface->surface_ops->surface_frontbuffer_updated(surface); + memset(&surface->lockedRect, 0, sizeof(surface->lockedRect)); + + return hr; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index d670fe1..b9831fd 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2146,6 +2146,7 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device * + void resource_unload(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + DWORD wined3d_resource_access_from_location(DWORD location) DECLSPEC_HIDDEN; + BOOL wined3d_resource_allocate_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++void wined3d_resource_changed(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + BOOL wined3d_resource_check_block_align(const struct wined3d_resource *resource, + const struct wined3d_box *box) DECLSPEC_HIDDEN; + void wined3d_resource_free_bo(struct wined3d_resource *resource) DECLSPEC_HIDDEN; +@@ -2662,6 +2663,7 @@ void wined3d_cs_emit_blt(struct wined3d_cs *cs, struct wined3d_surface *dst_surf + enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; + void wined3d_cs_emit_clear_rtv(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view, + const RECT *rect, const struct wined3d_color *color) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_resource_changed(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void *wined3d_cs_emit_resource_map(struct wined3d_cs *cs, struct wined3d_resource *resource, + DWORD flags) DECLSPEC_HIDDEN; + void wined3d_cs_emit_resource_unmap(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0114-wined3d-Wrap-GL-BOs-in-a-structure.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0114-wined3d-Wrap-GL-BOs-in-a-structure.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0114-wined3d-Wrap-GL-BOs-in-a-structure.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0114-wined3d-Wrap-GL-BOs-in-a-structure.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,269 @@ +From 496e24cd5a0649042e456adc2b4e512e15463974 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 30 Aug 2013 17:00:35 +0200 +Subject: wined3d: Wrap GL BOs in a structure + +The idea is to use those structures for mapping through the command stream and caching +them for DISCARD maps. +--- + dlls/wined3d/device.c | 53 ++++++++++++++++++++++++++++++++++++++++++ + dlls/wined3d/resource.c | 34 +++++++++++---------------- + dlls/wined3d/surface.c | 6 ++--- + dlls/wined3d/volume.c | 6 ++--- + dlls/wined3d/wined3d_private.h | 15 +++++++++++- + 5 files changed, 86 insertions(+), 28 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index f062e84..6f82385 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -5007,3 +5007,56 @@ LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL + else + return CallWindowProcA(proc, window, message, wparam, lparam); + } ++ ++/* Context activation is done by the caller */ ++struct wined3d_gl_bo *wined3d_device_get_bo(struct wined3d_device *device, UINT size, GLenum gl_usage, ++ GLenum type_hint, struct wined3d_context *context) ++{ ++ struct wined3d_gl_bo *ret; ++ const struct wined3d_gl_info *gl_info; ++ ++ TRACE("device %p, size %u, gl_usage %u, type_hint %u\n", device, size, gl_usage, ++ type_hint); ++ ++ ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret)); ++ if(!ret) ++ return NULL; ++ ret->type_hint = type_hint; ++ ret->size = size; ++ ret->usage = gl_usage; ++ ++ gl_info = context->gl_info; ++ ++ GL_EXTCALL(glGenBuffersARB(1, &ret->name)); ++ if (type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB) ++ context_invalidate_state(context, STATE_INDEXBUFFER); ++ GL_EXTCALL(glBindBufferARB(type_hint, ret->name)); ++ GL_EXTCALL(glBufferDataARB(type_hint, size, NULL, gl_usage)); ++ GL_EXTCALL(glBindBufferARB(type_hint, 0)); ++ checkGLcall("Create buffer object"); ++ ++ TRACE("Successfully created and set up buffer %u\n", ret->name); ++ return ret; ++} ++ ++/* Context activation is done by the caller */ ++static void wined3d_device_destroy_bo(struct wined3d_device *device, const struct wined3d_context *context, ++ struct wined3d_gl_bo *bo) ++{ ++ const struct wined3d_gl_info *gl_info = context->gl_info; ++ TRACE("device %p, bo %p, GL bo %u\n", device, bo, bo->name); ++ ++ GL_EXTCALL(glDeleteBuffersARB(1, &bo->name)); ++ checkGLcall("glDeleteBuffersARB"); ++ ++ HeapFree(GetProcessHeap(), 0, bo); ++} ++ ++/* Context activation is done by the caller */ ++void wined3d_device_release_bo(struct wined3d_device *device, struct wined3d_gl_bo *bo, ++ const struct wined3d_context *context) ++{ ++ TRACE("device %p, bo %p, GL bo %u\n", device, bo, bo->name); ++ ++ wined3d_device_destroy_bo(device, context, bo); ++} +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 7cafdc6..4fc4ce9 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -145,12 +145,10 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device * + void wined3d_resource_free_bo(struct wined3d_resource *resource) + { + struct wined3d_context *context = context_acquire(resource->device, NULL); +- const struct wined3d_gl_info *gl_info = context->gl_info; + +- TRACE("Deleting GL buffer %u belonging to resource %p.\n", resource->buffer_object, resource); +- GL_EXTCALL(glDeleteBuffersARB(1, &resource->buffer_object)); +- checkGLcall("glDeleteBuffersARB"); +- resource->buffer_object = 0; ++ wined3d_device_release_bo(resource->device, resource->buffer, context); ++ resource->buffer = NULL; ++ + context_release(context); + } + +@@ -166,7 +164,7 @@ void resource_cleanup(struct wined3d_resource *resource) + adapter_adjust_memory(resource->device->adapter, (INT64)0 - resource->size); + } + +- if (resource->buffer_object) ++ if (resource->buffer) + wined3d_resource_free_bo(resource); + + wined3d_resource_free_sysmem(resource); +@@ -179,7 +177,7 @@ void resource_unload(struct wined3d_resource *resource) + if (resource->map_count) + ERR("Resource %p is being unloaded while mapped.\n", resource); + +- if (resource->buffer_object) ++ if (resource->buffer) + wined3d_resource_free_bo(resource); + + context_resource_unloaded(resource->device, +@@ -397,7 +395,7 @@ void wined3d_resource_get_memory(const struct wined3d_resource *resource, + { + if (location & WINED3D_LOCATION_BUFFER) + { +- data->buffer_object = resource->buffer_object; ++ data->buffer_object = resource->buffer->name; + data->addr = NULL; + return; + } +@@ -506,7 +504,7 @@ BYTE *wined3d_resource_get_map_ptr(const struct wined3d_resource *resource, + { + case WINED3D_LOCATION_BUFFER: + gl_info = context->gl_info; +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, resource->buffer_object)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, resource->buffer->name)); + + if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) + { +@@ -549,7 +547,7 @@ void wined3d_resource_release_map_ptr(const struct wined3d_resource *resource, + { + case WINED3D_LOCATION_BUFFER: + gl_info = context->gl_info; +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, resource->buffer_object)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, resource->buffer->name)); + GL_EXTCALL(glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB)); + GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); + checkGLcall("Unmap GL buffer"); +@@ -567,20 +565,14 @@ void wined3d_resource_release_map_ptr(const struct wined3d_resource *resource, + } + + /* Context activation is done by the caller. */ +-static void wined3d_resource_prepare_bo(struct wined3d_resource *resource, const struct wined3d_context *context) ++static void wined3d_resource_prepare_bo(struct wined3d_resource *resource, struct wined3d_context *context) + { +- const struct wined3d_gl_info *gl_info = context->gl_info; +- +- if (resource->buffer_object) ++ if (resource->buffer) + return; + +- GL_EXTCALL(glGenBuffersARB(1, &resource->buffer_object)); +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, resource->buffer_object)); +- GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, resource->size, NULL, GL_STREAM_DRAW_ARB)); +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); +- checkGLcall("Create GL buffer"); +- +- TRACE("Created GL buffer %u for resource %p.\n", resource->buffer_object, resource); ++ resource->buffer = wined3d_device_get_bo(resource->device, resource->size, ++ GL_STREAM_DRAW_ARB, GL_PIXEL_UNPACK_BUFFER_ARB, context); ++ TRACE("Created GL buffer %u for resource %p.\n", resource->buffer->name, resource); + } + + BOOL wined3d_resource_prepare_system_memory(struct wined3d_resource *resource) +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 535e21a..7c532f0 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -48,7 +48,7 @@ static void surface_cleanup(struct wined3d_surface *surface) + surface->resource.device->cs->ops->finish(surface->resource.device->cs); + } + +- if (surface->resource.buffer_object || surface->rb_multisample ++ if (surface->resource.buffer || surface->rb_multisample + || surface->rb_resolved || !list_empty(&surface->renderbuffers)) + { + struct wined3d_renderbuffer_entry *entry, *entry2; +@@ -2515,7 +2515,7 @@ HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc) + } + if (!(surface->resource.map_binding == WINED3D_LOCATION_USER_MEMORY + || surface->container->flags & WINED3D_TEXTURE_PIN_SYSMEM +- || surface->resource.buffer_object)) ++ || surface->resource.buffer)) + surface->resource.map_binding = WINED3D_LOCATION_DIB; + } + +@@ -3880,7 +3880,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface, + /* Don't use PBOs for converted surfaces. During PBO conversion we look at + * WINED3D_TEXTURE_CONVERTED but it isn't set (yet) in all cases it is + * getting called. */ +- if ((format.convert || conversion) && surface->resource.buffer_object) ++ if ((format.convert || conversion) && surface->resource.buffer) + { + TRACE("Removing the pbo attached to surface %p.\n", surface); + +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index faadea1..467169f 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -202,7 +202,7 @@ static void wined3d_volume_load_location(struct wined3d_resource *resource, + } + else if (volume->resource.locations & WINED3D_LOCATION_BUFFER) + { +- struct wined3d_bo_address data = {volume->resource.buffer_object, NULL}; ++ struct wined3d_bo_address data = {volume->resource.buffer->name, NULL}; + wined3d_volume_upload_data(volume, context, &data); + } + else if (volume->resource.locations & WINED3D_LOCATION_TEXTURE_RGB) +@@ -251,12 +251,12 @@ static void wined3d_volume_load_location(struct wined3d_resource *resource, + break; + + case WINED3D_LOCATION_BUFFER: +- if (!volume->resource.buffer_object) ++ if (!volume->resource.buffer) + ERR("Trying to load WINED3D_LOCATION_BUFFER without setting it up first.\n"); + + if (volume->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) + { +- struct wined3d_bo_address data = {volume->resource.buffer_object, NULL}; ++ struct wined3d_bo_address data = {volume->resource.buffer->name, NULL}; + + if (volume->resource.locations & WINED3D_LOCATION_TEXTURE_RGB) + wined3d_texture_bind_and_dirtify(volume->container, context, FALSE); +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index b9831fd..8477d0c 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -1960,6 +1960,14 @@ struct wined3d_state + DWORD render_states[WINEHIGHEST_RENDER_STATE + 1]; + }; + ++struct wined3d_gl_bo ++{ ++ GLuint name; ++ GLenum usage; ++ GLenum type_hint; ++ UINT size; ++}; ++ + #define WINED3D_UNMAPPED_STAGE ~0U + + /* Multithreaded flag. Removed from the public header to signal that +@@ -2065,6 +2073,11 @@ void device_invalidate_state(const struct wined3d_device *device, DWORD state) D + void device_invalidate_shader_constants(const struct wined3d_device *device, DWORD mask) DECLSPEC_HIDDEN; + void device_exec_update_texture(struct wined3d_context *context, struct wined3d_texture *src_texture, + struct wined3d_texture *dst_texture) DECLSPEC_HIDDEN; ++struct wined3d_gl_bo *wined3d_device_get_bo(struct wined3d_device *device, UINT size, GLenum gl_usage, ++ GLenum type_hint, struct wined3d_context *context) DECLSPEC_HIDDEN; ++void wined3d_device_release_bo(struct wined3d_device *device, struct wined3d_gl_bo *bo, ++ const struct wined3d_context *context) DECLSPEC_HIDDEN; ++ + + static inline BOOL isStateDirty(const struct wined3d_context *context, DWORD state) + { +@@ -2114,7 +2127,7 @@ struct wined3d_resource + UINT size; + DWORD priority; + void *heap_memory, *user_memory, *bitmap_data; +- GLuint buffer_object; ++ struct wined3d_gl_bo *buffer; + UINT custom_row_pitch, custom_slice_pitch; + struct list resource_list_entry; + DWORD locations; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0115-wined3d-Separate-resource-map-and-draw-buffers.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0115-wined3d-Separate-resource-map-and-draw-buffers.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0115-wined3d-Separate-resource-map-and-draw-buffers.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0115-wined3d-Separate-resource-map-and-draw-buffers.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,69 @@ +From 71bd4bdb1014498b5877d04834bf58413220c408 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 30 Aug 2013 17:06:29 +0200 +Subject: wined3d: Separate resource map and draw buffers + +--- + dlls/wined3d/resource.c | 9 +++++++-- + dlls/wined3d/wined3d_private.h | 2 +- + 2 files changed, 8 insertions(+), 3 deletions(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 4fc4ce9..65e8f55 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -146,8 +146,12 @@ void wined3d_resource_free_bo(struct wined3d_resource *resource) + { + struct wined3d_context *context = context_acquire(resource->device, NULL); + ++ if (resource->buffer != resource->map_buffer) ++ ERR("Releasing resource buffer with buffer != map_buffer.\n"); ++ + wined3d_device_release_bo(resource->device, resource->buffer, context); + resource->buffer = NULL; ++ resource->map_buffer = NULL; + + context_release(context); + } +@@ -504,7 +508,7 @@ BYTE *wined3d_resource_get_map_ptr(const struct wined3d_resource *resource, + { + case WINED3D_LOCATION_BUFFER: + gl_info = context->gl_info; +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, resource->buffer->name)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, resource->map_buffer->name)); + + if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) + { +@@ -547,7 +551,7 @@ void wined3d_resource_release_map_ptr(const struct wined3d_resource *resource, + { + case WINED3D_LOCATION_BUFFER: + gl_info = context->gl_info; +- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, resource->buffer->name)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, resource->map_buffer->name)); + GL_EXTCALL(glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB)); + GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); + checkGLcall("Unmap GL buffer"); +@@ -572,6 +576,7 @@ static void wined3d_resource_prepare_bo(struct wined3d_resource *resource, struc + + resource->buffer = wined3d_device_get_bo(resource->device, resource->size, + GL_STREAM_DRAW_ARB, GL_PIXEL_UNPACK_BUFFER_ARB, context); ++ resource->map_buffer = resource->buffer; + TRACE("Created GL buffer %u for resource %p.\n", resource->buffer->name, resource); + } + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 8477d0c..eb84cbc 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2127,7 +2127,7 @@ struct wined3d_resource + UINT size; + DWORD priority; + void *heap_memory, *user_memory, *bitmap_data; +- struct wined3d_gl_bo *buffer; ++ struct wined3d_gl_bo *buffer, *map_buffer; + UINT custom_row_pitch, custom_slice_pitch; + struct list resource_list_entry; + DWORD locations; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0116-wined3d-Implement-DISCARD-resource-maps-with-buffers.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0116-wined3d-Implement-DISCARD-resource-maps-with-buffers.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0116-wined3d-Implement-DISCARD-resource-maps-with-buffers.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0116-wined3d-Implement-DISCARD-resource-maps-with-buffers.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,150 @@ +From fe033b6524bc09e86116176d015a14214735439d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 27 Sep 2013 19:06:41 +0200 +Subject: wined3d: Implement DISCARD resource maps with buffers. + +--- + dlls/wined3d/cs.c | 7 +++++-- + dlls/wined3d/resource.c | 41 ++++++++++++++++++++++++++++++++++------- + dlls/wined3d/wined3d_private.h | 6 ++++-- + 3 files changed, 43 insertions(+), 11 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index f5c10dd..d86aa59 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -370,6 +370,7 @@ struct wined3d_cs_resource_changed + { + enum wined3d_cs_op opcode; + struct wined3d_resource *resource; ++ struct wined3d_gl_bo *swap_buffer; + }; + + struct wined3d_cs_skip +@@ -1816,18 +1817,20 @@ static UINT wined3d_cs_exec_resource_changed(struct wined3d_cs *cs, const void * + const struct wined3d_cs_resource_changed *op = data; + struct wined3d_resource *resource = op->resource; + +- wined3d_resource_changed(resource); ++ wined3d_resource_changed(resource, op->swap_buffer); + + return sizeof(*op); + } + +-void wined3d_cs_emit_resource_changed(struct wined3d_cs *cs, struct wined3d_resource *resource) ++void wined3d_cs_emit_resource_changed(struct wined3d_cs *cs, struct wined3d_resource *resource, ++ struct wined3d_gl_bo *swap_buffer) + { + struct wined3d_cs_resource_changed *op; + + op = cs->ops->require_space(cs, sizeof(*op)); + op->opcode = WINED3D_CS_OP_RESOURCE_CHANGED; + op->resource = resource; ++ op->swap_buffer = swap_buffer; + + cs->ops->submit(cs, sizeof(*op)); + } +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 65e8f55..8d9757c 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -697,9 +697,27 @@ void *wined3d_resource_map_internal(struct wined3d_resource *resource, DWORD fla + } + + if (flags & WINED3D_MAP_DISCARD) ++ { ++ switch (resource->map_binding) ++ { ++ case WINED3D_LOCATION_BUFFER: ++ resource->map_buffer = wined3d_device_get_bo(device, resource->size, ++ GL_STREAM_DRAW_ARB, GL_PIXEL_UNPACK_BUFFER_ARB, context); ++ break; ++ ++ default: ++ if (resource->access_fence) ++ ERR("Location %s does not support DISCARD maps.\n", ++ wined3d_debug_location(resource->map_binding)); ++ if (resource->pool != WINED3D_POOL_DEFAULT) ++ FIXME("Discard used on %s pool resource.\n", debug_d3dpool(resource->pool)); ++ } + wined3d_resource_validate_location(resource, resource->map_binding); ++ } + else ++ { + wined3d_resource_load_location(resource, context, resource->map_binding); ++ } + + mem = wined3d_resource_get_map_ptr(resource, context, flags); + +@@ -752,12 +770,11 @@ HRESULT wined3d_resource_map(struct wined3d_resource *resource, + + flags = wined3d_resource_sanitize_map_flags(resource, flags); + +- if (flags & (WINED3D_MAP_NOOVERWRITE | WINED3D_MAP_DISCARD)) +- { +- FIXME("Dynamic resource map is inefficient\n"); +- } ++ if (flags & WINED3D_MAP_NOOVERWRITE) ++ FIXME("WINED3D_MAP_NOOVERWRITE are not implemented yet.\n"); + +- wined3d_resource_sync(resource); ++ if (!(flags & WINED3D_MAP_DISCARD) || resource->map_binding != WINED3D_LOCATION_BUFFER) ++ wined3d_resource_sync(resource); + + base_memory = wined3d_cs_emit_resource_map(device->cs, resource, flags); + if (!base_memory) +@@ -843,7 +860,7 @@ HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) + wined3d_cs_emit_resource_unmap(device->cs, resource); + + if (resource->unmap_dirtify) +- wined3d_cs_emit_resource_changed(device->cs, resource); ++ wined3d_cs_emit_resource_changed(device->cs, resource, resource->map_buffer); + resource->unmap_dirtify = FALSE; + + resource->map_count--; +@@ -851,7 +868,17 @@ HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) + return WINED3D_OK; + } + +-void wined3d_resource_changed(struct wined3d_resource *resource) ++void wined3d_resource_changed(struct wined3d_resource *resource, struct wined3d_gl_bo *swap_buffer) + { ++ struct wined3d_device *device = resource->device; ++ ++ if (swap_buffer && swap_buffer != resource->buffer) ++ { ++ struct wined3d_context *context = context_acquire(device, NULL); ++ wined3d_device_release_bo(device, resource->buffer, context); ++ context_release(context); ++ resource->buffer = swap_buffer; ++ } ++ + wined3d_resource_invalidate_location(resource, ~resource->map_binding); + } +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index eb84cbc..15d63e2 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2159,7 +2159,8 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device * + void resource_unload(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + DWORD wined3d_resource_access_from_location(DWORD location) DECLSPEC_HIDDEN; + BOOL wined3d_resource_allocate_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; +-void wined3d_resource_changed(struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++void wined3d_resource_changed(struct wined3d_resource *resource, ++ struct wined3d_gl_bo *swap_buffer) DECLSPEC_HIDDEN; + BOOL wined3d_resource_check_block_align(const struct wined3d_resource *resource, + const struct wined3d_box *box) DECLSPEC_HIDDEN; + void wined3d_resource_free_bo(struct wined3d_resource *resource) DECLSPEC_HIDDEN; +@@ -2676,7 +2677,8 @@ void wined3d_cs_emit_blt(struct wined3d_cs *cs, struct wined3d_surface *dst_surf + enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; + void wined3d_cs_emit_clear_rtv(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view, + const RECT *rect, const struct wined3d_color *color) DECLSPEC_HIDDEN; +-void wined3d_cs_emit_resource_changed(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_resource_changed(struct wined3d_cs *cs, struct wined3d_resource *resource, ++ struct wined3d_gl_bo *swap_buffer) DECLSPEC_HIDDEN; + void *wined3d_cs_emit_resource_map(struct wined3d_cs *cs, struct wined3d_resource *resource, + DWORD flags) DECLSPEC_HIDDEN; + void wined3d_cs_emit_resource_unmap(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0117-wined3d-Implement-DISCARD-resource-maps-with-heap-me.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0117-wined3d-Implement-DISCARD-resource-maps-with-heap-me.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0117-wined3d-Implement-DISCARD-resource-maps-with-heap-me.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0117-wined3d-Implement-DISCARD-resource-maps-with-heap-me.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,258 @@ +From 2483911906a4adfe52afe00f061cd473a2b7ec5b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 27 Sep 2013 19:24:21 +0200 +Subject: wined3d: Implement DISCARD resource maps with heap memory. + +--- + dlls/wined3d/buffer.c | 1 + + dlls/wined3d/cs.c | 6 ++++-- + dlls/wined3d/resource.c | 40 +++++++++++++++++++++++++++++++++++----- + dlls/wined3d/surface.c | 3 +++ + dlls/wined3d/volume.c | 2 ++ + dlls/wined3d/wined3d_private.h | 6 +++--- + 6 files changed, 48 insertions(+), 10 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index b76a07d..3ca1143 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -493,6 +493,7 @@ BYTE *buffer_get_sysmem(struct wined3d_buffer *This, struct wined3d_context *con + + if (!wined3d_resource_allocate_sysmem(&This->resource)) + ERR("Failed to allocate system memory.\n"); ++ This->resource.heap_memory = This->resource.map_heap_memory; + + if (This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB) + context_invalidate_state(context, STATE_INDEXBUFFER); +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index d86aa59..9307246 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -371,6 +371,7 @@ struct wined3d_cs_resource_changed + enum wined3d_cs_op opcode; + struct wined3d_resource *resource; + struct wined3d_gl_bo *swap_buffer; ++ void *swap_heap_memory; + }; + + struct wined3d_cs_skip +@@ -1817,13 +1818,13 @@ static UINT wined3d_cs_exec_resource_changed(struct wined3d_cs *cs, const void * + const struct wined3d_cs_resource_changed *op = data; + struct wined3d_resource *resource = op->resource; + +- wined3d_resource_changed(resource, op->swap_buffer); ++ wined3d_resource_changed(resource, op->swap_buffer, op->swap_heap_memory); + + return sizeof(*op); + } + + void wined3d_cs_emit_resource_changed(struct wined3d_cs *cs, struct wined3d_resource *resource, +- struct wined3d_gl_bo *swap_buffer) ++ struct wined3d_gl_bo *swap_buffer, void *swap_heap_memory) + { + struct wined3d_cs_resource_changed *op; + +@@ -1831,6 +1832,7 @@ void wined3d_cs_emit_resource_changed(struct wined3d_cs *cs, struct wined3d_reso + op->opcode = WINED3D_CS_OP_RESOURCE_CHANGED; + op->resource = resource; + op->swap_buffer = swap_buffer; ++ op->swap_heap_memory = swap_heap_memory; + + cs->ops->submit(cs, sizeof(*op)); + } +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 8d9757c..ef0b213 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -119,6 +119,7 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device * + ERR("Failed to allocate system memory.\n"); + return E_OUTOFMEMORY; + } ++ resource->heap_memory = resource->map_heap_memory; + } + else + { +@@ -172,6 +173,7 @@ void resource_cleanup(struct wined3d_resource *resource) + wined3d_resource_free_bo(resource); + + wined3d_resource_free_sysmem(resource); ++ resource->map_heap_memory = NULL; + + device_resource_released(resource->device, resource); + } +@@ -246,7 +248,7 @@ BOOL wined3d_resource_allocate_sysmem(struct wined3d_resource *resource) + p = (void **)(((ULONG_PTR)mem + align) & ~(RESOURCE_ALIGNMENT - 1)) - 1; + *p = mem; + +- resource->heap_memory = ++p; ++ resource->map_heap_memory = ++p; + + return TRUE; + } +@@ -528,7 +530,7 @@ BYTE *wined3d_resource_get_map_ptr(const struct wined3d_resource *resource, + return ptr; + + case WINED3D_LOCATION_SYSMEM: +- return resource->heap_memory; ++ return resource->map_heap_memory; + + case WINED3D_LOCATION_DIB: + return resource->bitmap_data; +@@ -590,6 +592,7 @@ BOOL wined3d_resource_prepare_system_memory(struct wined3d_resource *resource) + ERR("Failed to allocate system memory.\n"); + return FALSE; + } ++ resource->heap_memory = resource->map_heap_memory; + return TRUE; + } + +@@ -705,6 +708,10 @@ void *wined3d_resource_map_internal(struct wined3d_resource *resource, DWORD fla + GL_STREAM_DRAW_ARB, GL_PIXEL_UNPACK_BUFFER_ARB, context); + break; + ++ case WINED3D_LOCATION_SYSMEM: ++ wined3d_resource_allocate_sysmem(resource); ++ break; ++ + default: + if (resource->access_fence) + ERR("Location %s does not support DISCARD maps.\n", +@@ -773,7 +780,21 @@ HRESULT wined3d_resource_map(struct wined3d_resource *resource, + if (flags & WINED3D_MAP_NOOVERWRITE) + FIXME("WINED3D_MAP_NOOVERWRITE are not implemented yet.\n"); + +- if (!(flags & WINED3D_MAP_DISCARD) || resource->map_binding != WINED3D_LOCATION_BUFFER) ++ if (flags & WINED3D_MAP_DISCARD) ++ { ++ switch (resource->map_binding) ++ { ++ case WINED3D_LOCATION_BUFFER: ++ case WINED3D_LOCATION_SYSMEM: ++ break; ++ ++ default: ++ FIXME("Implement discard maps with %s map binding.\n", ++ wined3d_debug_location(resource->map_binding)); ++ wined3d_resource_sync(resource); ++ } ++ } ++ else + wined3d_resource_sync(resource); + + base_memory = wined3d_cs_emit_resource_map(device->cs, resource, flags); +@@ -860,7 +881,10 @@ HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) + wined3d_cs_emit_resource_unmap(device->cs, resource); + + if (resource->unmap_dirtify) +- wined3d_cs_emit_resource_changed(device->cs, resource, resource->map_buffer); ++ { ++ wined3d_cs_emit_resource_changed(device->cs, resource, ++ resource->map_buffer, resource->map_heap_memory); ++ } + resource->unmap_dirtify = FALSE; + + resource->map_count--; +@@ -868,7 +892,8 @@ HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) + return WINED3D_OK; + } + +-void wined3d_resource_changed(struct wined3d_resource *resource, struct wined3d_gl_bo *swap_buffer) ++void wined3d_resource_changed(struct wined3d_resource *resource, struct wined3d_gl_bo *swap_buffer, ++ void *swap_heap_memory) + { + struct wined3d_device *device = resource->device; + +@@ -879,6 +904,11 @@ void wined3d_resource_changed(struct wined3d_resource *resource, struct wined3d_ + context_release(context); + resource->buffer = swap_buffer; + } ++ if (swap_heap_memory && swap_heap_memory != resource->heap_memory) ++ { ++ wined3d_resource_free_sysmem(resource); ++ resource->heap_memory = swap_heap_memory; ++ } + + wined3d_resource_invalidate_location(resource, ~resource->map_binding); + } +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 7c532f0..73160ff 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -487,6 +487,7 @@ static void surface_evict_sysmem(struct wined3d_surface *surface) + return; + + wined3d_resource_free_sysmem(&surface->resource); ++ surface->resource.map_heap_memory = NULL; + wined3d_resource_invalidate_location(&surface->resource, WINED3D_LOCATION_SYSMEM); + } + +@@ -1996,6 +1997,7 @@ HRESULT wined3d_surface_update_desc(struct wined3d_surface *surface, + + surface->resource.locations = 0; + wined3d_resource_free_sysmem(&surface->resource); ++ surface->resource.map_heap_memory = NULL; + + width = texture_resource->width; + height = texture_resource->height; +@@ -5334,6 +5336,7 @@ static HRESULT surface_init(struct wined3d_surface *surface, struct wined3d_text + if (surface->resource.map_binding == WINED3D_LOCATION_DIB) + { + wined3d_resource_free_sysmem(&surface->resource); ++ surface->resource.map_heap_memory = NULL; + wined3d_resource_validate_location(&surface->resource, WINED3D_LOCATION_DIB); + wined3d_resource_invalidate_location(&surface->resource, WINED3D_LOCATION_SYSMEM); + } +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index 467169f..34b72d1 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -120,6 +120,7 @@ static void wined3d_volume_download_data(struct wined3d_volume *volume, + static void wined3d_volume_evict_sysmem(struct wined3d_volume *volume) + { + wined3d_resource_free_sysmem(&volume->resource); ++ volume->resource.map_heap_memory = NULL; + wined3d_resource_invalidate_location(&volume->resource, WINED3D_LOCATION_SYSMEM); + } + +@@ -502,6 +503,7 @@ static HRESULT volume_init(struct wined3d_volume *volume, struct wined3d_texture + { + wined3d_resource_free_sysmem(&volume->resource); + volume->resource.map_binding = WINED3D_LOCATION_BUFFER; ++ volume->resource.map_heap_memory = NULL; + } + + volume->container = container; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 15d63e2..270162f 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2126,7 +2126,7 @@ struct wined3d_resource + UINT depth; + UINT size; + DWORD priority; +- void *heap_memory, *user_memory, *bitmap_data; ++ void *heap_memory, *map_heap_memory, *user_memory, *bitmap_data; + struct wined3d_gl_bo *buffer, *map_buffer; + UINT custom_row_pitch, custom_slice_pitch; + struct list resource_list_entry; +@@ -2160,7 +2160,7 @@ void resource_unload(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + DWORD wined3d_resource_access_from_location(DWORD location) DECLSPEC_HIDDEN; + BOOL wined3d_resource_allocate_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_changed(struct wined3d_resource *resource, +- struct wined3d_gl_bo *swap_buffer) DECLSPEC_HIDDEN; ++ struct wined3d_gl_bo *swap_buffer, void *swap_heap_memory) DECLSPEC_HIDDEN; + BOOL wined3d_resource_check_block_align(const struct wined3d_resource *resource, + const struct wined3d_box *box) DECLSPEC_HIDDEN; + void wined3d_resource_free_bo(struct wined3d_resource *resource) DECLSPEC_HIDDEN; +@@ -2678,7 +2678,7 @@ void wined3d_cs_emit_blt(struct wined3d_cs *cs, struct wined3d_surface *dst_surf + void wined3d_cs_emit_clear_rtv(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view, + const RECT *rect, const struct wined3d_color *color) DECLSPEC_HIDDEN; + void wined3d_cs_emit_resource_changed(struct wined3d_cs *cs, struct wined3d_resource *resource, +- struct wined3d_gl_bo *swap_buffer) DECLSPEC_HIDDEN; ++ struct wined3d_gl_bo *swap_buffer, void *swap_heap_memory) DECLSPEC_HIDDEN; + void *wined3d_cs_emit_resource_map(struct wined3d_cs *cs, struct wined3d_resource *resource, + DWORD flags) DECLSPEC_HIDDEN; + void wined3d_cs_emit_resource_unmap(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0118-wined3d-Unset-some-objects-in-state_init_default.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0118-wined3d-Unset-some-objects-in-state_init_default.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0118-wined3d-Unset-some-objects-in-state_init_default.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0118-wined3d-Unset-some-objects-in-state_init_default.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,34 @@ +From 09ff7fca62f88791ece6e95f287579687418ba24 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 1 Oct 2013 21:30:07 +0200 +Subject: wined3d: Unset some objects in state_init_default. + +FIXME: Many more are needed. +FIXME2: Is this still needed? +--- + dlls/wined3d/stateblock.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c +index 606134c..690bcc7 100644 +--- a/dlls/wined3d/stateblock.c ++++ b/dlls/wined3d/stateblock.c +@@ -1339,7 +1339,15 @@ static void state_init_default(struct wined3d_state *state, const struct wined3d + state->sampler_states[i][WINED3D_SAMP_ELEMENT_INDEX] = 0; + /* TODO: Vertex offset in the presampled displacement map. */ + state->sampler_states[i][WINED3D_SAMP_DMAP_OFFSET] = 0; ++ state->textures[i] = NULL; + } ++ ++ state->index_buffer = NULL; ++ for (i = 0; i < sizeof(state->streams) / sizeof(*state->streams); i++) ++ memset(&state->streams[i], 0, sizeof(state->streams[i])); ++ ++ state->shader[WINED3D_SHADER_TYPE_VERTEX] = NULL; ++ state->shader[WINED3D_SHADER_TYPE_PIXEL] = NULL; + } + + HRESULT state_init(struct wined3d_state *state, const struct wined3d_gl_info *gl_info, +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0119-wined3d-Don-t-request-the-frontbuffer-to-create-dumm.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0119-wined3d-Don-t-request-the-frontbuffer-to-create-dumm.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0119-wined3d-Don-t-request-the-frontbuffer-to-create-dumm.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0119-wined3d-Don-t-request-the-frontbuffer-to-create-dumm.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,26 @@ +From 55240026af497ef2d4e3d8edc456e65b989bf59e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 2 Oct 2013 12:36:02 +0200 +Subject: wined3d: Don't request the frontbuffer to create dummy textures. + +--- + dlls/wined3d/device.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 6f82385..f5cb7bd 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -905,8 +905,7 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device, + device->swapchains[0] = swapchain; + device_init_swapchain_state(device, swapchain); + +- context = context_acquire(device, +- surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0))); ++ context = context_acquire(device, NULL); + + create_dummy_textures(device, context); + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0120-wined3d-Use-double-buffered-buffers-for-multithreade.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0120-wined3d-Use-double-buffered-buffers-for-multithreade.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0120-wined3d-Use-double-buffered-buffers-for-multithreade.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0120-wined3d-Use-double-buffered-buffers-for-multithreade.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,26 @@ +From e54d3de255928108db07a5f3367213a24d8bf959 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Jul 2013 23:44:11 +0200 +Subject: wined3d: Use double-buffered buffers for multithreaded CS + +--- + dlls/wined3d/buffer.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index 3ca1143..de0eaec 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -1254,6 +1254,9 @@ static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device + } + buffer->maps_size = 1; + ++ if (wined3d_settings.cs_multithreaded) ++ buffer->flags |= WINED3D_BUFFER_DOUBLEBUFFER; ++ + return WINED3D_OK; + } + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0121-wined3d-Don-t-synchronize-NOOVERWRITE-buffer-maps.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0121-wined3d-Don-t-synchronize-NOOVERWRITE-buffer-maps.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0121-wined3d-Don-t-synchronize-NOOVERWRITE-buffer-maps.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0121-wined3d-Don-t-synchronize-NOOVERWRITE-buffer-maps.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,58 @@ +From 4dab2b426c1d4eb918dda550a547b33858617395 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 4 Jul 2013 23:49:26 +0200 +Subject: wined3d: Don't synchronize NOOVERWRITE buffer maps + +TODO: Put the patch that makes PreLoad ignore the mapped state here. +--- + dlls/wined3d/buffer.c | 20 +++++++++++++------- + 1 file changed, 13 insertions(+), 7 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index de0eaec..fd03fb5 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -958,13 +958,6 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + + TRACE("buffer %p, offset %u, size %u, data %p, flags %#x\n", buffer, offset, size, data, flags); + +- if (wined3d_settings.cs_multithreaded) +- { +- FIXME("Waiting for cs.\n"); +- wined3d_cs_emit_glfinish(device->cs); +- device->cs->ops->finish(device->cs); +- } +- + flags = wined3d_resource_sanitize_map_flags(&buffer->resource, flags); + /* Filter redundant WINED3D_MAP_DISCARD maps. The 3DMark2001 multitexture + * fill rate test seems to depend on this. When we map a buffer with +@@ -995,6 +988,13 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + struct wined3d_context *context; + const struct wined3d_gl_info *gl_info; + ++ if (wined3d_settings.cs_multithreaded) ++ { ++ FIXME("waiting for cs\n"); ++ wined3d_cs_emit_glfinish(device->cs); ++ device->cs->ops->finish(device->cs); ++ } ++ + context = context_acquire(device, NULL); + gl_info = context->gl_info; + +@@ -1056,6 +1056,12 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + buffer->flags |= WINED3D_BUFFER_SYNC; + } + ++ if (!(flags & WINED3D_MAP_NOOVERWRITE) && wined3d_settings.cs_multithreaded) ++ { ++ FIXME("waiting for cs.\n"); ++ device->cs->ops->finish(device->cs); ++ } ++ + base = buffer->map_ptr ? buffer->map_ptr : buffer->resource.heap_memory; + *data = base + offset; + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0122-wined3d-Separate-buffer-map-write-and-draw-read-memo.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0122-wined3d-Separate-buffer-map-write-and-draw-read-memo.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0122-wined3d-Separate-buffer-map-write-and-draw-read-memo.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0122-wined3d-Separate-buffer-map-write-and-draw-read-memo.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,47 @@ +From eaad769483668455de518d4bea0013ddef6d5f6a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 6 Jul 2013 15:59:11 +0200 +Subject: wined3d: Separate buffer map write and draw read memory pointers + +TODO: Think about making this generic for all resources. +TODO 2: This is rather pointless on its own, merge this with the +patch that introduces this for all resources. +--- + dlls/wined3d/buffer.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index fd03fb5..2a814c6 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -191,7 +191,10 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This, struct wine + if (This->flags & WINED3D_BUFFER_DOUBLEBUFFER) + buffer_invalidate_bo_range(This, 0, 0); + else ++ { + wined3d_resource_free_sysmem(&This->resource); ++ This->resource.map_heap_memory = NULL; ++ } + + return; + +@@ -1044,7 +1047,6 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + buffer_get_sysmem(buffer, context); + } + TRACE("New pointer is %p.\n", buffer->resource.heap_memory); +- buffer->map_ptr = NULL; + } + context_release(context); + } +@@ -1062,7 +1064,7 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + device->cs->ops->finish(device->cs); + } + +- base = buffer->map_ptr ? buffer->map_ptr : buffer->resource.heap_memory; ++ base = buffer->map_ptr ? buffer->map_ptr : buffer->resource.map_heap_memory; + *data = base + offset; + + TRACE("Returning memory at %p (base %p, offset %u).\n", *data, base, offset); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0123-wined3d-Accelerate-DISCARD-buffer-maps.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0123-wined3d-Accelerate-DISCARD-buffer-maps.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0123-wined3d-Accelerate-DISCARD-buffer-maps.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0123-wined3d-Accelerate-DISCARD-buffer-maps.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,139 @@ +From 46ed74a72057957b7046b45b4cdfb4b34ad4016e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 6 Jul 2013 16:14:16 +0200 +Subject: wined3d: Accelerate DISCARD buffer maps + +TODO: Make this generic for all resources. +TODO2: Merge this with the patch that controlls BUFFER_DISCARD in the CS thread +TODO3: Clean up the map_mem allocation mess. +--- + dlls/wined3d/buffer.c | 15 ++++++++++++--- + dlls/wined3d/cs.c | 39 ++++++++++++++++++++++++++++++++++++++- + dlls/wined3d/wined3d_private.h | 2 ++ + 3 files changed, 52 insertions(+), 4 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index 2a814c6..5c6d36e 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -1058,10 +1058,19 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + buffer->flags |= WINED3D_BUFFER_SYNC; + } + +- if (!(flags & WINED3D_MAP_NOOVERWRITE) && wined3d_settings.cs_multithreaded) ++ if (wined3d_settings.cs_multithreaded && count == 1) + { +- FIXME("waiting for cs.\n"); +- device->cs->ops->finish(device->cs); ++ BOOL swvp = device->create_parms.flags & WINED3DCREATE_SOFTWARE_VERTEXPROCESSING; ++ if (flags & WINED3D_MAP_DISCARD && !swvp) ++ { ++ wined3d_resource_allocate_sysmem(&buffer->resource); ++ wined3d_cs_emit_buffer_swap_mem(device->cs, buffer, buffer->resource.map_heap_memory); ++ } ++ else if(!(flags & WINED3D_MAP_NOOVERWRITE)) ++ { ++ FIXME("waiting for cs.\n"); ++ device->cs->ops->finish(device->cs); ++ } + } + + base = buffer->map_ptr ? buffer->map_ptr : buffer->resource.map_heap_memory; +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 9307246..341b51c 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -68,6 +68,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_RESOURCE_CHANGED, + WINED3D_CS_OP_RESOURCE_MAP, + WINED3D_CS_OP_RESOURCE_UNMAP, ++ WINED3D_CS_OP_BUFFER_SWAP_MEM, + WINED3D_CS_OP_QUERY_ISSUE, + WINED3D_CS_OP_QUERY_DESTROY, + WINED3D_CS_OP_UPDATE_SURFACE, +@@ -374,6 +375,13 @@ struct wined3d_cs_resource_changed + void *swap_heap_memory; + }; + ++struct wined3d_cs_buffer_swap_mem ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_buffer *buffer; ++ BYTE *mem; ++}; ++ + struct wined3d_cs_skip + { + enum wined3d_cs_op opcode; +@@ -2123,6 +2131,34 @@ void wined3d_cs_emit_evict_resource(struct wined3d_cs *cs, struct wined3d_resour + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_buffer_swap_mem(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_buffer_swap_mem *op = data; ++ struct wined3d_buffer *buffer = op->buffer; ++ ++ wined3d_resource_free_sysmem(&buffer->resource); ++ buffer->resource.heap_memory = op->mem; ++ ++ if (!buffer->buffer_object && buffer->resource.bind_count) ++ { ++ device_invalidate_state(cs->device, STATE_STREAMSRC); ++ device_invalidate_state(cs->device, STATE_INDEXBUFFER); ++ } ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_buffer_swap_mem(struct wined3d_cs *cs, struct wined3d_buffer *buffer, BYTE *mem) ++{ ++ struct wined3d_cs_buffer_swap_mem *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_BUFFER_SWAP_MEM; ++ op->buffer = buffer; ++ op->mem = mem; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2143,11 +2179,11 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_SET_INDEX_BUFFER */ wined3d_cs_exec_set_index_buffer, + /* WINED3D_CS_OP_SET_CONSTANT_BUFFER */ wined3d_cs_exec_set_constant_buffer, + /* WINED3D_CS_OP_SET_TEXTURE */ wined3d_cs_exec_set_texture, ++ /* WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEW */ wined3d_cs_exec_set_shader_resource_view, + /* WINED3D_CS_OP_SET_SAMPLER */ wined3d_cs_exec_set_sampler, + /* WINED3D_CS_OP_SET_SHADER */ wined3d_cs_exec_set_shader, + /* WINED3D_CS_OP_SET_RENDER_STATE */ wined3d_cs_exec_set_render_state, + /* WINED3D_CS_OP_SET_TEXTURE_STATE */ wined3d_cs_exec_set_texture_state, +- /* WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEW */ wined3d_cs_exec_set_shader_resource_view, + /* WINED3D_CS_OP_SET_SAMPLER_STATE */ wined3d_cs_exec_set_sampler_state, + /* WINED3D_CS_OP_SET_TRANSFORM */ wined3d_cs_exec_set_transform, + /* WINED3D_CS_OP_SET_CLIP_PLANE */ wined3d_cs_exec_set_clip_plane, +@@ -2169,6 +2205,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_RESOURCE_CHANGED */ wined3d_cs_exec_resource_changed, + /* WINED3D_CS_OP_RESOURCE_MAP */ wined3d_cs_exec_resource_map, + /* WINED3D_CS_OP_RESOURCE_UNMAP */ wined3d_cs_exec_resource_unmap, ++ /* WINED3D_CS_OP_BUFFER_SWAP_MEM */ wined3d_cs_exec_buffer_swap_mem, + /* WINED3D_CS_OP_QUERY_ISSUE */ wined3d_cs_exec_query_issue, + /* WINED3D_CS_OP_QUERY_DESTROY */ wined3d_cs_exec_query_destroy, + /* WINED3D_CS_OP_UPDATE_SURFACE */ wined3d_cs_exec_update_surface, +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 270162f..7d12df9 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2694,6 +2694,8 @@ void wined3d_cs_emit_surface_preload(struct wined3d_cs *cs, struct wined3d_surfa + void wined3d_cs_emit_update_texture(struct wined3d_cs *cs, struct wined3d_texture *src, + struct wined3d_texture *dst) DECLSPEC_HIDDEN; + void wined3d_cs_emit_evict_resource(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_buffer_swap_mem(struct wined3d_cs *cs, struct wined3d_buffer *buffer, ++ BYTE *mem) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0124-wined3d-Accelerate-READONLY-buffer-maps.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0124-wined3d-Accelerate-READONLY-buffer-maps.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0124-wined3d-Accelerate-READONLY-buffer-maps.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0124-wined3d-Accelerate-READONLY-buffer-maps.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,29 @@ +From 14090e86e52e7fcc475ae83c3a25039a313a6d32 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 6 Jul 2013 16:44:35 +0200 +Subject: wined3d: Accelerate READONLY buffer maps + +FIXME: ProcessVertices can write to buffers +--- + dlls/wined3d/buffer.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index 5c6d36e..f4c0d07 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -1066,9 +1066,9 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + wined3d_resource_allocate_sysmem(&buffer->resource); + wined3d_cs_emit_buffer_swap_mem(device->cs, buffer, buffer->resource.map_heap_memory); + } +- else if(!(flags & WINED3D_MAP_NOOVERWRITE)) ++ else if(!(flags & (WINED3D_MAP_NOOVERWRITE | WINED3D_MAP_READONLY))) + { +- FIXME("waiting for cs.\n"); ++ FIXME("waiting for cs, flags 0x%04x.\n", flags); + device->cs->ops->finish(device->cs); + } + } +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0125-wined3d-Access-the-buffer-dirty-areas-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0125-wined3d-Access-the-buffer-dirty-areas-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0125-wined3d-Access-the-buffer-dirty-areas-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0125-wined3d-Access-the-buffer-dirty-areas-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,140 @@ +From b2574fe8833075c9f1c7fab68bf04dc73b749a42 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 6 Jul 2013 17:05:12 +0200 +Subject: wined3d: Access the buffer dirty areas through the CS + +This avoids the following issues: + +1) The worker thread uploading a dirtified area before the application +unlocks the buffer and marking it clean + +2) The worker thread uploading data from the old memory and marking the +area clean although the data was written to a new block of memory. + +However, this adds more synchronization than necessary. The first +problem could be solved by moving dirtification to unmap, e.g. via a +flag in each dirty area. The second problem can be fixed by not +dirtifying in map if map_mem != resource.allocatedMemory and dirtifying +the entire buffer in buffer_swap_memory (DISCARD dirtifies the entire +buffer anyway, and this could be the reason why). + +If one of those ideas is used, access to the dirty area array needs to +be protected by locks. +--- + dlls/wined3d/buffer.c | 6 +++--- + dlls/wined3d/cs.c | 31 +++++++++++++++++++++++++++++++ + dlls/wined3d/wined3d_private.h | 3 +++ + 3 files changed, 37 insertions(+), 3 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index f4c0d07..551cc7a 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -41,7 +41,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); + #define VB_MAXFULLCONVERSIONS 5 /* Number of full conversions before we stop converting */ + #define VB_RESETFULLCONVS 20 /* Reset full conversion counts after that number of draws */ + +-static void buffer_invalidate_bo_range(struct wined3d_buffer *buffer, UINT offset, UINT size) ++void buffer_invalidate_bo_range(struct wined3d_buffer *buffer, UINT offset, UINT size) + { + if (!offset && !size) + goto invalidate_all; +@@ -979,9 +979,9 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + * being uploaded in that case. Two such applications are Port Royale + * and Darkstar One. */ + if (flags & WINED3D_MAP_DISCARD) +- buffer_invalidate_bo_range(buffer, 0, 0); ++ wined3d_cs_emit_buffer_invalidate_bo_range(device->cs, buffer, 0, 0); + else if (!(flags & WINED3D_MAP_READONLY)) +- buffer_invalidate_bo_range(buffer, offset, size); ++ wined3d_cs_emit_buffer_invalidate_bo_range(device->cs, buffer, offset, size); + + if (!(buffer->flags & WINED3D_BUFFER_DOUBLEBUFFER)) + { +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 341b51c..179f2e6 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -69,6 +69,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_RESOURCE_MAP, + WINED3D_CS_OP_RESOURCE_UNMAP, + WINED3D_CS_OP_BUFFER_SWAP_MEM, ++ WINED3D_CS_OP_BUFFER_INVALIDATE_RANGE, + WINED3D_CS_OP_QUERY_ISSUE, + WINED3D_CS_OP_QUERY_DESTROY, + WINED3D_CS_OP_UPDATE_SURFACE, +@@ -382,6 +383,13 @@ struct wined3d_cs_buffer_swap_mem + BYTE *mem; + }; + ++struct wined3d_cs_buffer_invalidate_bo_range ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_buffer *buffer; ++ UINT offset, size; ++}; ++ + struct wined3d_cs_skip + { + enum wined3d_cs_op opcode; +@@ -2159,6 +2167,28 @@ void wined3d_cs_emit_buffer_swap_mem(struct wined3d_cs *cs, struct wined3d_buffe + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_buffer_invalidate_bo_range(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_buffer_invalidate_bo_range *op = data; ++ ++ buffer_invalidate_bo_range(op->buffer, op->offset, op->size); ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_buffer_invalidate_bo_range(struct wined3d_cs *cs, ++ struct wined3d_buffer *buffer, UINT offset, UINT size) ++{ ++ struct wined3d_cs_buffer_invalidate_bo_range *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_BUFFER_INVALIDATE_RANGE; ++ op->buffer = buffer; ++ op->offset = offset; ++ op->size = size; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2206,6 +2236,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_RESOURCE_MAP */ wined3d_cs_exec_resource_map, + /* WINED3D_CS_OP_RESOURCE_UNMAP */ wined3d_cs_exec_resource_unmap, + /* WINED3D_CS_OP_BUFFER_SWAP_MEM */ wined3d_cs_exec_buffer_swap_mem, ++ /* WINED3D_CS_OP_BUFFER_INVALIDATE_RANGE */ wined3d_cs_exec_buffer_invalidate_bo_range, + /* WINED3D_CS_OP_QUERY_ISSUE */ wined3d_cs_exec_query_issue, + /* WINED3D_CS_OP_QUERY_DESTROY */ wined3d_cs_exec_query_destroy, + /* WINED3D_CS_OP_UPDATE_SURFACE */ wined3d_cs_exec_update_surface, +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 7d12df9..c683880 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2696,6 +2696,8 @@ void wined3d_cs_emit_update_texture(struct wined3d_cs *cs, struct wined3d_textur + void wined3d_cs_emit_evict_resource(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_cs_emit_buffer_swap_mem(struct wined3d_cs *cs, struct wined3d_buffer *buffer, + BYTE *mem) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_buffer_invalidate_bo_range(struct wined3d_cs *cs, ++ struct wined3d_buffer *buffer, UINT offset, UINT size) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +@@ -2781,6 +2783,7 @@ void buffer_get_memory(struct wined3d_buffer *buffer, struct wined3d_context *co + BYTE *buffer_get_sysmem(struct wined3d_buffer *This, struct wined3d_context *context) DECLSPEC_HIDDEN; + void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_context *context, + const struct wined3d_state *state) DECLSPEC_HIDDEN; ++void buffer_invalidate_bo_range(struct wined3d_buffer *This, UINT offset, UINT size) DECLSPEC_HIDDEN; + + struct wined3d_rendertarget_view + { +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0126-wined3d-Ignore-buffer-resource.map_count-in-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0126-wined3d-Ignore-buffer-resource.map_count-in-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0126-wined3d-Ignore-buffer-resource.map_count-in-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0126-wined3d-Ignore-buffer-resource.map_count-in-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,58 @@ +From e7637b3b410855296289ec8ebe199b80b5a7a2b0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 6 Jul 2013 22:52:06 +0200 +Subject: wined3d: Ignore buffer->resource.map_count in the CS + +This fixes sporadic test failures caused by preload refusing to load +data into the GL buffer. + +It's fine to preload or create a VBO if a DISCARD or NOOVERWRITE map is +happening at the same time. A non-dynamic map will finish the CS before +incrementing map_count. +--- + dlls/wined3d/buffer.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index 551cc7a..3ac45c6 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -457,7 +457,8 @@ void buffer_get_memory(struct wined3d_buffer *buffer, struct wined3d_context *co + data->buffer_object = buffer->buffer_object; + if (!buffer->buffer_object) + { +- if ((buffer->flags & WINED3D_BUFFER_CREATEBO) && !buffer->resource.map_count) ++ if ((!buffer->resource.map_count || buffer->flags & WINED3D_BUFFER_DOUBLEBUFFER) ++ && buffer->flags & WINED3D_BUFFER_CREATEBO) + { + buffer_create_buffer_object(buffer, context); + buffer->flags &= ~WINED3D_BUFFER_CREATEBO; +@@ -737,12 +738,6 @@ void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_conte + + TRACE("buffer %p.\n", buffer); + +- if (buffer->resource.map_count) +- { +- WARN("Buffer is mapped, skipping preload.\n"); +- return; +- } +- + buffer_mark_used(buffer); + + if (!buffer->buffer_object) +@@ -934,6 +929,12 @@ void CDECL wined3d_buffer_preload(struct wined3d_buffer *buffer) + struct wined3d_context *context; + struct wined3d_device *device = buffer->resource.device; + ++ if (buffer->resource.map_count) ++ { ++ WARN("Buffer is mapped, skipping preload.\n"); ++ return; ++ } ++ + if (wined3d_settings.cs_multithreaded) + { + FIXME("Waiting for cs.\n"); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0127-wined3d-Send-buffer-preloads-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0127-wined3d-Send-buffer-preloads-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0127-wined3d-Send-buffer-preloads-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0127-wined3d-Send-buffer-preloads-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,122 @@ +From f0608f8a5916eea7e342db36ffe49427e40a4b49 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 7 Jul 2013 12:02:59 +0200 +Subject: wined3d: Send buffer preloads through the CS + +Think about making this a fast command. Might help if the driver +supports async data transfer, but synchronization side effects, esp. wrt +the dirty area list, have to be considered. +--- + dlls/wined3d/buffer.c | 12 +----------- + dlls/wined3d/cs.c | 31 +++++++++++++++++++++++++++++++ + dlls/wined3d/wined3d_private.h | 1 + + 3 files changed, 33 insertions(+), 11 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index 3ac45c6..a09ca90 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -926,7 +926,6 @@ void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_conte + + void CDECL wined3d_buffer_preload(struct wined3d_buffer *buffer) + { +- struct wined3d_context *context; + struct wined3d_device *device = buffer->resource.device; + + if (buffer->resource.map_count) +@@ -935,16 +934,7 @@ void CDECL wined3d_buffer_preload(struct wined3d_buffer *buffer) + return; + } + +- if (wined3d_settings.cs_multithreaded) +- { +- FIXME("Waiting for cs.\n"); +- wined3d_cs_emit_glfinish(device->cs); +- device->cs->ops->finish(device->cs); +- } +- +- context = context_acquire(buffer->resource.device, NULL); +- buffer_internal_preload(buffer, context, NULL); +- context_release(context); ++ wined3d_cs_emit_buffer_preload(device->cs, buffer); + } + + struct wined3d_resource * CDECL wined3d_buffer_get_resource(struct wined3d_buffer *buffer) +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 179f2e6..6b16d51 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -70,6 +70,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_RESOURCE_UNMAP, + WINED3D_CS_OP_BUFFER_SWAP_MEM, + WINED3D_CS_OP_BUFFER_INVALIDATE_RANGE, ++ WINED3D_CS_OP_BUFFER_PRELOAD, + WINED3D_CS_OP_QUERY_ISSUE, + WINED3D_CS_OP_QUERY_DESTROY, + WINED3D_CS_OP_UPDATE_SURFACE, +@@ -442,6 +443,12 @@ struct wined3d_cs_evict_resource + struct wined3d_resource *resource; + }; + ++struct wined3d_cs_buffer_preload ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_buffer *buffer; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -2189,6 +2196,29 @@ void wined3d_cs_emit_buffer_invalidate_bo_range(struct wined3d_cs *cs, + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_buffer_preload(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_buffer_preload *op = data; ++ struct wined3d_context *context; ++ ++ context = context_acquire(cs->device, NULL); ++ buffer_internal_preload(op->buffer, context, NULL); ++ context_release(context); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_buffer_preload(struct wined3d_cs *cs, struct wined3d_buffer *buffer) ++{ ++ struct wined3d_cs_buffer_preload *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_BUFFER_PRELOAD; ++ op->buffer = buffer; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2237,6 +2267,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_RESOURCE_UNMAP */ wined3d_cs_exec_resource_unmap, + /* WINED3D_CS_OP_BUFFER_SWAP_MEM */ wined3d_cs_exec_buffer_swap_mem, + /* WINED3D_CS_OP_BUFFER_INVALIDATE_RANGE */ wined3d_cs_exec_buffer_invalidate_bo_range, ++ /* WINED3D_CS_OP_BUFFER_PRELOAD */ wined3d_cs_exec_buffer_preload, + /* WINED3D_CS_OP_QUERY_ISSUE */ wined3d_cs_exec_query_issue, + /* WINED3D_CS_OP_QUERY_DESTROY */ wined3d_cs_exec_query_destroy, + /* WINED3D_CS_OP_UPDATE_SURFACE */ wined3d_cs_exec_update_surface, +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index c683880..4070e1d 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2698,6 +2698,7 @@ void wined3d_cs_emit_buffer_swap_mem(struct wined3d_cs *cs, struct wined3d_buffe + BYTE *mem) DECLSPEC_HIDDEN; + void wined3d_cs_emit_buffer_invalidate_bo_range(struct wined3d_cs *cs, + struct wined3d_buffer *buffer, UINT offset, UINT size) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_buffer_preload(struct wined3d_cs *cs, struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0128-wined3d-Use-glBufferSubData-instead-of-glMapBufferRa.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0128-wined3d-Use-glBufferSubData-instead-of-glMapBufferRa.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0128-wined3d-Use-glBufferSubData-instead-of-glMapBufferRa.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0128-wined3d-Use-glBufferSubData-instead-of-glMapBufferRa.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,91 @@ +From bca1f6b098077f30abc3d86ea3e7c3be17dc35f4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 24 Jul 2013 13:02:06 +0200 +Subject: wined3d: Use glBufferSubData instead of glMapBufferRange + +This is faster on Nvidia once we're stuck in double-buffer mode for some +reason (e.g. using threaded cs). For other cards, we want to be able to +do mapbuffer through the CS. +--- + dlls/wined3d/buffer.c | 50 ++++++-------------------------------------------- + 1 file changed, 6 insertions(+), 44 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index a09ca90..675dbec 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -657,43 +657,17 @@ drop_query: + /* The caller provides a GL context */ + static void buffer_direct_upload(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info, DWORD flags) + { +- BYTE *map; + UINT start = 0, len = 0; + + /* This potentially invalidates the element array buffer binding, but the + * caller always takes care of this. */ + GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object)); + checkGLcall("glBindBufferARB"); +- if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) +- { +- GLbitfield mapflags; +- mapflags = GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT; +- if (flags & WINED3D_BUFFER_DISCARD) +- mapflags |= GL_MAP_INVALIDATE_BUFFER_BIT; +- else if (!(flags & WINED3D_BUFFER_SYNC)) +- mapflags |= GL_MAP_UNSYNCHRONIZED_BIT; +- map = GL_EXTCALL(glMapBufferRange(This->buffer_type_hint, 0, +- This->resource.size, mapflags)); +- checkGLcall("glMapBufferRange"); +- } +- else +- { +- if (This->flags & WINED3D_BUFFER_APPLESYNC) +- { +- DWORD syncflags = 0; +- if (flags & WINED3D_BUFFER_DISCARD) +- syncflags |= WINED3D_MAP_DISCARD; +- else if (!(flags & WINED3D_BUFFER_SYNC)) +- syncflags |= WINED3D_MAP_NOOVERWRITE; +- buffer_sync_apple(This, syncflags, gl_info); +- } +- map = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_WRITE_ONLY_ARB)); +- checkGLcall("glMapBufferARB"); +- } +- if (!map) ++ ++ if (flags & WINED3D_BUFFER_DISCARD) + { +- ERR("Failed to map opengl buffer\n"); +- return; ++ GL_EXTCALL(glBufferDataARB(This->buffer_type_hint, This->resource.size, NULL, GL_STREAM_DRAW_ARB)); ++ checkGLcall("glBufferDataARB"); + } + + while (This->modified_areas) +@@ -702,21 +676,9 @@ static void buffer_direct_upload(struct wined3d_buffer *This, const struct wined + start = This->maps[This->modified_areas].offset; + len = This->maps[This->modified_areas].size; + +- memcpy(map + start, (BYTE *)This->resource.heap_memory + start, len); +- +- if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) +- { +- GL_EXTCALL(glFlushMappedBufferRange(This->buffer_type_hint, start, len)); +- checkGLcall("glFlushMappedBufferRange"); +- } +- else if (This->flags & WINED3D_BUFFER_APPLESYNC) +- { +- GL_EXTCALL(glFlushMappedBufferRangeAPPLE(This->buffer_type_hint, start, len)); +- checkGLcall("glFlushMappedBufferRangeAPPLE"); +- } ++ GL_EXTCALL(glBufferSubDataARB(This->buffer_type_hint, start, len, (BYTE *)This->resource.heap_memory + start)); ++ checkGLcall("glBufferSubDataARB"); + } +- GL_EXTCALL(glUnmapBufferARB(This->buffer_type_hint)); +- checkGLcall("glUnmapBufferARB"); + } + + static void buffer_mark_used(struct wined3d_buffer *buffer) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0129-wined3d-Separate-GL-buffer-discard-control-from-igno.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0129-wined3d-Separate-GL-buffer-discard-control-from-igno.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0129-wined3d-Separate-GL-buffer-discard-control-from-igno.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0129-wined3d-Separate-GL-buffer-discard-control-from-igno.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,135 @@ +From fd33771329457adaba5a2fb8006991e7ad756ec7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 30 Jul 2013 22:17:10 +0200 +Subject: wined3d: Separate GL buffer discard control from ignoring + MAP_DISCARD. + +Ignoring WINED3D_MAP_DISCARD is controlled purely in the main thread, +whereas the other one is controlled in the worker thread. Store them in +separate fields for synchronization purposes. + +There are some problems left: +* buffer->flags is still accessed by both threads without sync. +* CSMT=off has a separate codepath that is untested. +--- + dlls/wined3d/buffer.c | 25 +++++++++++++++++++------ + dlls/wined3d/cs.c | 9 +++++++-- + dlls/wined3d/wined3d_private.h | 2 ++ + 3 files changed, 28 insertions(+), 8 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index 675dbec..8b09aee 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -32,7 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); + #define WINED3D_BUFFER_HASDESC 0x01 /* A vertex description has been found. */ + #define WINED3D_BUFFER_CREATEBO 0x02 /* Create a buffer object for this buffer. */ + #define WINED3D_BUFFER_DOUBLEBUFFER 0x04 /* Keep both a buffer object and a system memory copy for this buffer. */ +-#define WINED3D_BUFFER_DISCARD 0x08 /* A DISCARD lock has occurred since the last preload. */ ++#define WINED3D_BUFFER_DISCARD 0x08 /* The next PreLoad may discard the buffer contents. */ + #define WINED3D_BUFFER_SYNC 0x10 /* There has been at least one synchronized map since the last preload. */ + #define WINED3D_BUFFER_APPLESYNC 0x20 /* Using sync as in GL_APPLE_flush_buffer_range. */ + +@@ -921,7 +921,7 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + * previous contents of the buffer. The r600g driver only does this when + * the buffer is currently in use, while the proprietary NVIDIA driver + * appears to do this unconditionally. */ +- if (buffer->flags & WINED3D_BUFFER_DISCARD) ++ if (buffer->ignore_discard) + flags &= ~WINED3D_MAP_DISCARD; + count = ++buffer->resource.map_count; + +@@ -1004,10 +1004,15 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + context_release(context); + } + } +- +- if (flags & WINED3D_MAP_DISCARD) +- buffer->flags |= WINED3D_BUFFER_DISCARD; +- else if (!(flags & WINED3D_MAP_NOOVERWRITE)) ++ else if(!wined3d_settings.cs_multithreaded) ++ { ++ if (flags & WINED3D_MAP_DISCARD) ++ { ++ buffer->flags |= WINED3D_BUFFER_DISCARD; ++ buffer->ignore_discard = TRUE; ++ } ++ } ++ if (!(flags & (WINED3D_MAP_NOOVERWRITE | WINED3D_MAP_DISCARD))) + buffer->flags |= WINED3D_BUFFER_SYNC; + } + +@@ -1016,6 +1021,7 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + BOOL swvp = device->create_parms.flags & WINED3DCREATE_SOFTWARE_VERTEXPROCESSING; + if (flags & WINED3D_MAP_DISCARD && !swvp) + { ++ buffer->ignore_discard = TRUE; + wined3d_resource_allocate_sysmem(&buffer->resource); + wined3d_cs_emit_buffer_swap_mem(device->cs, buffer, buffer->resource.map_heap_memory); + } +@@ -1332,3 +1338,10 @@ HRESULT CDECL wined3d_buffer_create_ib(struct wined3d_device *device, UINT size, + + return WINED3D_OK; + } ++ ++void buffer_swap_mem(struct wined3d_buffer *buffer, BYTE *mem) ++{ ++ wined3d_resource_free_sysmem(&buffer->resource); ++ buffer->resource.heap_memory = mem; ++ buffer->flags |= WINED3D_BUFFER_DISCARD; ++} +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 6b16d51..4b9af57 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -722,11 +722,17 @@ void wined3d_cs_emit_draw(struct wined3d_cs *cs, UINT start_idx, UINT index_coun + op->indexed = indexed; + + if (indexed) ++ { + wined3d_resource_inc_fence(&state->index_buffer->resource); ++ state->index_buffer->ignore_discard = FALSE; ++ } + for (i = 0; i < sizeof(state->streams) / sizeof(*state->streams); i++) + { + if (state->streams[i].buffer) ++ { + wined3d_resource_inc_fence(&state->streams[i].buffer->resource); ++ state->streams[i].buffer->ignore_discard = FALSE; ++ } + } + for (i = 0; i < sizeof(state->textures) / sizeof(*state->textures); i++) + { +@@ -2151,8 +2157,7 @@ static UINT wined3d_cs_exec_buffer_swap_mem(struct wined3d_cs *cs, const void *d + const struct wined3d_cs_buffer_swap_mem *op = data; + struct wined3d_buffer *buffer = op->buffer; + +- wined3d_resource_free_sysmem(&buffer->resource); +- buffer->resource.heap_memory = op->mem; ++ buffer_swap_mem(buffer, op->mem); + + if (!buffer->buffer_object && buffer->resource.bind_count) + { +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 4070e1d..0f88961 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2760,6 +2760,7 @@ struct wined3d_buffer + GLenum buffer_object_usage; + GLenum buffer_type_hint; + DWORD flags; ++ BOOL ignore_discard; + void *map_ptr; + + struct wined3d_map_range *maps; +@@ -2785,6 +2786,7 @@ BYTE *buffer_get_sysmem(struct wined3d_buffer *This, struct wined3d_context *con + void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_context *context, + const struct wined3d_state *state) DECLSPEC_HIDDEN; + void buffer_invalidate_bo_range(struct wined3d_buffer *This, UINT offset, UINT size) DECLSPEC_HIDDEN; ++void buffer_swap_mem(struct wined3d_buffer *buffer, BYTE *mem) DECLSPEC_HIDDEN; + + struct wined3d_rendertarget_view + { +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0130-wined3d-Create-buffers-before-mapping-them.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0130-wined3d-Create-buffers-before-mapping-them.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0130-wined3d-Create-buffers-before-mapping-them.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0130-wined3d-Create-buffers-before-mapping-them.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,66 @@ +From f11244b08c7979837fb685d1406f17d9630c6c98 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 29 Aug 2013 17:35:53 +0200 +Subject: wined3d: Create buffers before mapping them. + +--- + dlls/wined3d/buffer.c | 26 +++++++++++++++++++++++++- + 1 file changed, 25 insertions(+), 1 deletion(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index 8b09aee..81c607d 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -185,6 +185,8 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This, struct wine + ERR("glBufferDataARB failed with error %s (%#x)\n", debug_glerror(error), error); + goto fail; + } ++ if (wined3d_settings.strict_draw_ordering || wined3d_settings.cs_multithreaded) ++ gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + + This->buffer_object_usage = gl_usage; + +@@ -911,9 +913,32 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + LONG count; + BYTE *base; + struct wined3d_device *device = buffer->resource.device; ++ struct wined3d_context *context; + + TRACE("buffer %p, offset %u, size %u, data %p, flags %#x\n", buffer, offset, size, data, flags); + ++ /* FIXME: There is a race condition with the same code in ++ * buffer_internal_preload and buffer_get_memory. ++ * ++ * This deals with a race condition concering buffer creation and buffer maps. ++ * If a VBO is created by the worker thread while the buffer is mapped, outdated ++ * data may be uploaded, and the BO range is not properly invaliated. Keep in ++ * mind that a broken application might draw from a buffer before mapping it. ++ * ++ * Don't try to solve this by going back to always invalidating changed areas. ++ * This won't work if we ever want to support glMapBufferRange mapping with ++ * GL_ARB_buffer_storage in the CS. ++ * ++ * Also keep in mind that UnLoad can destroy the VBO, so simply creating it ++ * on buffer creation won't work either. */ ++ if (buffer->flags & WINED3D_BUFFER_CREATEBO) ++ { ++ context = context_acquire(device, NULL); ++ buffer_create_buffer_object(buffer, context); ++ context_release(context); ++ buffer->flags &= ~WINED3D_BUFFER_CREATEBO; ++ } ++ + flags = wined3d_resource_sanitize_map_flags(&buffer->resource, flags); + /* Filter redundant WINED3D_MAP_DISCARD maps. The 3DMark2001 multitexture + * fill rate test seems to depend on this. When we map a buffer with +@@ -941,7 +966,6 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + if (count == 1) + { + struct wined3d_device *device = buffer->resource.device; +- struct wined3d_context *context; + const struct wined3d_gl_info *gl_info; + + if (wined3d_settings.cs_multithreaded) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0131-wined3d-Destroy-views-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0131-wined3d-Destroy-views-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0131-wined3d-Destroy-views-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0131-wined3d-Destroy-views-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,173 @@ +From a31fb6ca1b9379028340024e2bd7e97e894b0532 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 21 Aug 2014 22:47:58 +0200 +Subject: wined3d: Destroy views through the CS. + +Move this ahead. This has caused sporadic test failures ever since blits were moved to the CS. + +Also contains an ugly hack for ffp_blit_depth_fill. +--- + dlls/wined3d/cs.c | 28 ++++++++++++++++++++++++++++ + dlls/wined3d/surface.c | 4 ++-- + dlls/wined3d/view.c | 29 ++++++++++++++++++++++++++++- + dlls/wined3d/wined3d_private.h | 4 ++++ + 4 files changed, 62 insertions(+), 3 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 4b9af57..8e48c55 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -78,6 +78,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_SURFACE_PRELOAD, + WINED3D_CS_OP_UPDATE_TEXTURE, + WINED3D_CS_OP_EVICT_RESOURCE, ++ WINED3D_CS_OP_VIEW_DESTROY, + WINED3D_CS_OP_STOP, + }; + +@@ -449,6 +450,12 @@ struct wined3d_cs_buffer_preload + struct wined3d_buffer *buffer; + }; + ++struct wined3d_cs_view_destroy ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_rendertarget_view *view; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -2224,6 +2231,26 @@ void wined3d_cs_emit_buffer_preload(struct wined3d_cs *cs, struct wined3d_buffer + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_view_destroy(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_view_destroy *op = data; ++ ++ wined3d_rendertarget_view_destroy(op->view); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_view_destroy(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view) ++{ ++ struct wined3d_cs_view_destroy *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_VIEW_DESTROY; ++ op->view = view; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2280,6 +2307,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_SURFACE_PRELOAD */ wined3d_cs_exec_surface_preload, + /* WINED3D_CS_OP_UPDATE_TEXTURE */ wined3d_cs_exec_update_texture, + /* WINED3D_CS_OP_EVICT_RESOURCE */ wined3d_cs_exec_evict_resource, ++ /* WINED3D_CS_OP_VIEW_DESTROY */ wined3d_cs_exec_view_destroy, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 73160ff..43f68c6 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -4140,7 +4140,7 @@ static HRESULT ffp_blit_color_fill(struct wined3d_device *device, struct wined3d + } + + device_clear_render_targets(device, 1, &fb, 1, dst_rect, &draw_rect, WINED3DCLEAR_TARGET, color, 0.0f, 0); +- wined3d_rendertarget_view_decref(view); ++ wined3d_rendertarget_view_decref_worker(view); + + return WINED3D_OK; + } +@@ -4160,7 +4160,7 @@ static HRESULT ffp_blit_depth_fill(struct wined3d_device *device, struct wined3d + } + + device_clear_render_targets(device, 0, &fb, 1, dst_rect, &draw_rect, WINED3DCLEAR_ZBUFFER, 0, depth, 0); +- wined3d_rendertarget_view_decref(fb.depth_stencil); ++ wined3d_rendertarget_view_decref_worker(fb.depth_stencil); + + return WINED3D_OK; + } +diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c +index 9cda64d..56eb7b3 100644 +--- a/dlls/wined3d/view.c ++++ b/dlls/wined3d/view.c +@@ -33,6 +33,11 @@ ULONG CDECL wined3d_rendertarget_view_incref(struct wined3d_rendertarget_view *v + return refcount; + } + ++void wined3d_rendertarget_view_destroy(struct wined3d_rendertarget_view *view) ++{ ++ HeapFree(GetProcessHeap(), 0, view); ++} ++ + ULONG CDECL wined3d_rendertarget_view_decref(struct wined3d_rendertarget_view *view) + { + ULONG refcount = InterlockedDecrement(&view->refcount); +@@ -41,11 +46,33 @@ ULONG CDECL wined3d_rendertarget_view_decref(struct wined3d_rendertarget_view *v + + if (!refcount) + { ++ struct wined3d_device *device = view->resource->device; ++ + /* Call wined3d_object_destroyed() before releasing the resource, + * since releasing the resource may end up destroying the parent. */ + view->parent_ops->wined3d_object_destroyed(view->parent); + wined3d_resource_decref(view->resource); +- HeapFree(GetProcessHeap(), 0, view); ++ wined3d_cs_emit_view_destroy(device->cs, view); ++ } ++ ++ return refcount; ++} ++ ++/* Ugly hack for ffp_blit_depth_fill that allows destroying a view from inside the ++ * worker thread. */ ++ULONG wined3d_rendertarget_view_decref_worker(struct wined3d_rendertarget_view *view) ++{ ++ ULONG refcount = InterlockedDecrement(&view->refcount); ++ ++ TRACE("%p decreasing refcount to %u.\n", view, refcount); ++ ++ if (!refcount) ++ { ++ /* Call wined3d_object_destroyed() before releasing the resource, ++ * since releasing the resource may end up destroying the parent. */ ++ view->parent_ops->wined3d_object_destroyed(view->parent); ++ wined3d_resource_decref(view->resource); ++ wined3d_rendertarget_view_destroy(view); + } + + return refcount; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 0f88961..7d68448 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2699,6 +2699,7 @@ void wined3d_cs_emit_buffer_swap_mem(struct wined3d_cs *cs, struct wined3d_buffe + void wined3d_cs_emit_buffer_invalidate_bo_range(struct wined3d_cs *cs, + struct wined3d_buffer *buffer, UINT offset, UINT size) DECLSPEC_HIDDEN; + void wined3d_cs_emit_buffer_preload(struct wined3d_cs *cs, struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_view_destroy(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +@@ -2824,6 +2825,9 @@ static inline struct wined3d_surface *wined3d_rendertarget_view_get_surface( + return surface_from_resource(resource); + } + ++ULONG wined3d_rendertarget_view_decref_worker(struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN; ++void wined3d_rendertarget_view_destroy(struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN; ++ + struct wined3d_shader_resource_view + { + LONG refcount; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0132-wined3d-Remove-another-glFinish.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0132-wined3d-Remove-another-glFinish.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0132-wined3d-Remove-another-glFinish.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0132-wined3d-Remove-another-glFinish.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,28 @@ +From 8a0e110ba10657b84aa33a1cd51fe46128062d4d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sat, 6 Jul 2013 22:08:39 +0200 +Subject: wined3d: Remove another glFinish + +I don't think this is needed any more. +--- + dlls/wined3d/surface.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 43f68c6..1d777e2 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -825,9 +825,7 @@ static void surface_blt_fbo(const struct wined3d_device *device, + dst_rect.left, dst_rect.top, dst_rect.right, dst_rect.bottom, GL_COLOR_BUFFER_BIT, gl_filter); + checkGLcall("glBlitFramebuffer()"); + +- if (wined3d_settings.cs_multithreaded) +- gl_info->gl_ops.gl.p_glFinish(); +- else if (wined3d_settings.strict_draw_ordering ++ if (wined3d_settings.strict_draw_ordering + || (dst_location == WINED3D_LOCATION_DRAWABLE + && dst_surface->container->swapchain->front_buffer == dst_surface->container)) + gl_info->gl_ops.gl.p_glFlush(); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0133-wined3d-Destroy-vertex-declarations-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0133-wined3d-Destroy-vertex-declarations-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0133-wined3d-Destroy-vertex-declarations-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0133-wined3d-Destroy-vertex-declarations-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,131 @@ +From a26808a39c226fc0f168336becc97ed512029d52 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 31 Jul 2013 23:06:27 +0200 +Subject: wined3d: Destroy vertex declarations through the CS + +--- + dlls/wined3d/cs.c | 29 +++++++++++++++++++++++++++++ + dlls/wined3d/vertexdeclaration.c | 15 ++++++++------- + dlls/wined3d/wined3d_private.h | 4 ++++ + 3 files changed, 41 insertions(+), 7 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 8e48c55..38063d7 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -79,6 +79,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_UPDATE_TEXTURE, + WINED3D_CS_OP_EVICT_RESOURCE, + WINED3D_CS_OP_VIEW_DESTROY, ++ WINED3D_CS_OP_VDECL_DESTROY, + WINED3D_CS_OP_STOP, + }; + +@@ -456,6 +457,12 @@ struct wined3d_cs_view_destroy + struct wined3d_rendertarget_view *view; + }; + ++struct wined3d_cs_vertex_declaration_destroy ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_vertex_declaration *declaration; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -2251,6 +2258,27 @@ void wined3d_cs_emit_view_destroy(struct wined3d_cs *cs, struct wined3d_renderta + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_vertex_declaration_destroy(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_vertex_declaration_destroy *op = data; ++ ++ wined3d_vertex_declaration_destroy(op->declaration); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_vertex_declaration_destroy(struct wined3d_cs *cs, ++ struct wined3d_vertex_declaration *declaration) ++{ ++ struct wined3d_cs_vertex_declaration_destroy *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_VDECL_DESTROY; ++ op->declaration = declaration; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2308,6 +2336,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_UPDATE_TEXTURE */ wined3d_cs_exec_update_texture, + /* WINED3D_CS_OP_EVICT_RESOURCE */ wined3d_cs_exec_evict_resource, + /* WINED3D_CS_OP_VIEW_DESTROY */ wined3d_cs_exec_view_destroy, ++ /* WINED3D_CS_OP_VDECL_DESTROY */ wined3d_cs_exec_vertex_declaration_destroy, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/vertexdeclaration.c b/dlls/wined3d/vertexdeclaration.c +index 3f4d5e4..fc7a110 100644 +--- a/dlls/wined3d/vertexdeclaration.c ++++ b/dlls/wined3d/vertexdeclaration.c +@@ -48,6 +48,12 @@ ULONG CDECL wined3d_vertex_declaration_incref(struct wined3d_vertex_declaration + return refcount; + } + ++void wined3d_vertex_declaration_destroy(struct wined3d_vertex_declaration *declaration) ++{ ++ HeapFree(GetProcessHeap(), 0, declaration->elements); ++ HeapFree(GetProcessHeap(), 0, declaration); ++} ++ + ULONG CDECL wined3d_vertex_declaration_decref(struct wined3d_vertex_declaration *declaration) + { + ULONG refcount = InterlockedDecrement(&declaration->ref); +@@ -56,14 +62,9 @@ ULONG CDECL wined3d_vertex_declaration_decref(struct wined3d_vertex_declaration + + if (!refcount) + { +- if (wined3d_settings.cs_multithreaded) +- { +- FIXME("Waiting for cs.\n"); +- declaration->device->cs->ops->finish(declaration->device->cs); +- } +- HeapFree(GetProcessHeap(), 0, declaration->elements); ++ const struct wined3d_device *device = declaration->device; + declaration->parent_ops->wined3d_object_destroyed(declaration->parent); +- HeapFree(GetProcessHeap(), 0, declaration); ++ wined3d_cs_emit_vertex_declaration_destroy(device->cs, declaration); + } + + return refcount; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 7d68448..5d3393c 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2499,6 +2499,8 @@ struct wined3d_vertex_declaration + BOOL half_float_conv_needed; + }; + ++void wined3d_vertex_declaration_destroy(struct wined3d_vertex_declaration *declaration) DECLSPEC_HIDDEN; ++ + struct wined3d_saved_states + { + DWORD transform[(HIGHEST_TRANSFORMSTATE >> 5) + 1]; +@@ -2700,6 +2702,8 @@ void wined3d_cs_emit_buffer_invalidate_bo_range(struct wined3d_cs *cs, + struct wined3d_buffer *buffer, UINT offset, UINT size) DECLSPEC_HIDDEN; + void wined3d_cs_emit_buffer_preload(struct wined3d_cs *cs, struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; + void wined3d_cs_emit_view_destroy(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_vertex_declaration_destroy(struct wined3d_cs *cs, ++ struct wined3d_vertex_declaration *declaration) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0134-wined3d-Destroy-shaders-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0134-wined3d-Destroy-shaders-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0134-wined3d-Destroy-shaders-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0134-wined3d-Destroy-shaders-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,126 @@ +From 30ad009ccd9e681bab8813c09847c62bd9367916 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 31 Jul 2013 23:18:28 +0200 +Subject: wined3d: Destroy shaders through the CS + +--- + dlls/wined3d/cs.c | 29 +++++++++++++++++++++++++++++ + dlls/wined3d/shader.c | 12 ++++-------- + dlls/wined3d/wined3d_private.h | 2 ++ + 3 files changed, 35 insertions(+), 8 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 38063d7..21d5b74 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -80,6 +80,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_EVICT_RESOURCE, + WINED3D_CS_OP_VIEW_DESTROY, + WINED3D_CS_OP_VDECL_DESTROY, ++ WINED3D_CS_OP_SHADER_CLEANUP, + WINED3D_CS_OP_STOP, + }; + +@@ -463,6 +464,12 @@ struct wined3d_cs_vertex_declaration_destroy + struct wined3d_vertex_declaration *declaration; + }; + ++struct wined3d_cs_shader_cleanup ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_shader *shader; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -2279,6 +2286,27 @@ void wined3d_cs_emit_vertex_declaration_destroy(struct wined3d_cs *cs, + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_shader_cleanup(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_shader_cleanup *op = data; ++ ++ shader_cleanup(op->shader); ++ HeapFree(GetProcessHeap(), 0, op->shader); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_shader_cleanup(struct wined3d_cs *cs, struct wined3d_shader *shader) ++{ ++ struct wined3d_cs_shader_cleanup *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SHADER_CLEANUP; ++ op->shader = shader; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2337,6 +2365,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_EVICT_RESOURCE */ wined3d_cs_exec_evict_resource, + /* WINED3D_CS_OP_VIEW_DESTROY */ wined3d_cs_exec_view_destroy, + /* WINED3D_CS_OP_VDECL_DESTROY */ wined3d_cs_exec_vertex_declaration_destroy, ++ /* WINED3D_CS_OP_SHADER_CLEANUP */ wined3d_cs_exec_shader_cleanup, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c +index 0faabaa..8c9be69 100644 +--- a/dlls/wined3d/shader.c ++++ b/dlls/wined3d/shader.c +@@ -1702,7 +1702,7 @@ static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe + } + } + +-static void shader_cleanup(struct wined3d_shader *shader) ++void shader_cleanup(struct wined3d_shader *shader) + { + HeapFree(GetProcessHeap(), 0, shader->signature_strings); + shader->device->shader_backend->shader_destroy(shader); +@@ -1957,14 +1957,10 @@ ULONG CDECL wined3d_shader_decref(struct wined3d_shader *shader) + + if (!refcount) + { +- if (wined3d_settings.cs_multithreaded) +- { +- FIXME("Waiting for cs.\n"); +- shader->device->cs->ops->finish(shader->device->cs); +- } +- shader_cleanup(shader); ++ const struct wined3d_device *device = shader->device; ++ + shader->parent_ops->wined3d_object_destroyed(shader->parent); +- HeapFree(GetProcessHeap(), 0, shader); ++ wined3d_cs_emit_shader_cleanup(device->cs, shader); + } + + return refcount; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 5d3393c..86ee114 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2704,6 +2704,7 @@ void wined3d_cs_emit_buffer_preload(struct wined3d_cs *cs, struct wined3d_buffer + void wined3d_cs_emit_view_destroy(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN; + void wined3d_cs_emit_vertex_declaration_destroy(struct wined3d_cs *cs, + struct wined3d_vertex_declaration *declaration) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_shader_cleanup(struct wined3d_cs *cs, struct wined3d_shader *shader) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +@@ -3103,6 +3104,7 @@ unsigned int shader_find_free_input_register(const struct wined3d_shader_reg_map + void shader_generate_main(const struct wined3d_shader *shader, struct wined3d_shader_buffer *buffer, + const struct wined3d_shader_reg_maps *reg_maps, const DWORD *byte_code, void *backend_ctx) DECLSPEC_HIDDEN; + BOOL shader_match_semantic(const char *semantic_name, enum wined3d_decl_usage usage) DECLSPEC_HIDDEN; ++void shader_cleanup(struct wined3d_shader *shader) DECLSPEC_HIDDEN; + + static inline BOOL shader_is_scalar(const struct wined3d_shader_register *reg) + { +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0135-wined3d-Create-VBOs-through-the-command-stream.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0135-wined3d-Create-VBOs-through-the-command-stream.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0135-wined3d-Create-VBOs-through-the-command-stream.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0135-wined3d-Create-VBOs-through-the-command-stream.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,133 @@ +From 551886caadf25e70d783f9d4584054b7a4fed39d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 2 Oct 2013 21:47:08 +0200 +Subject: wined3d: Create VBOs through the command stream. + +A stop-gap solution to make fglrx happier until buffers are updated. +--- + dlls/wined3d/buffer.c | 8 ++------ + dlls/wined3d/cs.c | 32 ++++++++++++++++++++++++++++++++ + dlls/wined3d/wined3d_private.h | 3 +++ + 3 files changed, 37 insertions(+), 6 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index 81c607d..fc65d3a 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -117,7 +117,7 @@ static void delete_gl_buffer(struct wined3d_buffer *This, const struct wined3d_g + } + + /* Context activation is done by the caller. */ +-static void buffer_create_buffer_object(struct wined3d_buffer *This, struct wined3d_context *context) ++void buffer_create_buffer_object(struct wined3d_buffer *This, struct wined3d_context *context) + { + GLenum gl_usage = GL_STATIC_DRAW_ARB; + GLenum error; +@@ -185,8 +185,6 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This, struct wine + ERR("glBufferDataARB failed with error %s (%#x)\n", debug_glerror(error), error); + goto fail; + } +- if (wined3d_settings.strict_draw_ordering || wined3d_settings.cs_multithreaded) +- gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + + This->buffer_object_usage = gl_usage; + +@@ -933,9 +931,7 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + * on buffer creation won't work either. */ + if (buffer->flags & WINED3D_BUFFER_CREATEBO) + { +- context = context_acquire(device, NULL); +- buffer_create_buffer_object(buffer, context); +- context_release(context); ++ wined3d_cs_emit_create_vbo(device->cs, buffer); + buffer->flags &= ~WINED3D_BUFFER_CREATEBO; + } + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 21d5b74..c00d1d3 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -81,6 +81,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_VIEW_DESTROY, + WINED3D_CS_OP_VDECL_DESTROY, + WINED3D_CS_OP_SHADER_CLEANUP, ++ WINED3D_CS_OP_CREATE_VBO, + WINED3D_CS_OP_STOP, + }; + +@@ -470,6 +471,12 @@ struct wined3d_cs_shader_cleanup + struct wined3d_shader *shader; + }; + ++struct wined3d_cs_create_vbo ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_buffer *buffer; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -2307,6 +2314,30 @@ void wined3d_cs_emit_shader_cleanup(struct wined3d_cs *cs, struct wined3d_shader + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_create_vbo(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_create_vbo *op = data; ++ struct wined3d_context *context = context_acquire(cs->device, NULL); ++ ++ buffer_create_buffer_object(op->buffer, context); ++ ++ context_release(context); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_create_vbo(struct wined3d_cs *cs, struct wined3d_buffer *buffer) ++{ ++ struct wined3d_cs_create_vbo *op; ++ ++ op = cs->ops->require_space_prio(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_CREATE_VBO; ++ op->buffer = buffer; ++ ++ cs->ops->submit_prio(cs, sizeof(*op)); ++ cs->ops->finish_prio(cs); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2366,6 +2397,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_VIEW_DESTROY */ wined3d_cs_exec_view_destroy, + /* WINED3D_CS_OP_VDECL_DESTROY */ wined3d_cs_exec_vertex_declaration_destroy, + /* WINED3D_CS_OP_SHADER_CLEANUP */ wined3d_cs_exec_shader_cleanup, ++ /* WINED3D_CS_OP_CREATE_VBO */ wined3d_cs_exec_create_vbo, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 86ee114..74e059c 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2705,6 +2705,7 @@ void wined3d_cs_emit_view_destroy(struct wined3d_cs *cs, struct wined3d_renderta + void wined3d_cs_emit_vertex_declaration_destroy(struct wined3d_cs *cs, + struct wined3d_vertex_declaration *declaration) DECLSPEC_HIDDEN; + void wined3d_cs_emit_shader_cleanup(struct wined3d_cs *cs, struct wined3d_shader *shader) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_create_vbo(struct wined3d_cs *cs, struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +@@ -2793,6 +2794,8 @@ void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_conte + const struct wined3d_state *state) DECLSPEC_HIDDEN; + void buffer_invalidate_bo_range(struct wined3d_buffer *This, UINT offset, UINT size) DECLSPEC_HIDDEN; + void buffer_swap_mem(struct wined3d_buffer *buffer, BYTE *mem) DECLSPEC_HIDDEN; ++void buffer_create_buffer_object(struct wined3d_buffer *This, ++ struct wined3d_context *context) DECLSPEC_HIDDEN; + + struct wined3d_rendertarget_view + { +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0136-wined3d-Clean-up-resource-data-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0136-wined3d-Clean-up-resource-data-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0136-wined3d-Clean-up-resource-data-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0136-wined3d-Clean-up-resource-data-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,211 @@ +From 9109cd39e2867e3e9061d1720bde4598111b3d3b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 2 Oct 2013 22:38:51 +0200 +Subject: wined3d: Clean up resource data through the CS. + +--- + dlls/wined3d/buffer.c | 3 +++ + dlls/wined3d/cs.c | 28 ++++++++++++++++++++++++++++ + dlls/wined3d/resource.c | 15 ++++++++++----- + dlls/wined3d/surface.c | 5 +++++ + dlls/wined3d/texture.c | 4 ++++ + dlls/wined3d/volume.c | 3 +++ + dlls/wined3d/wined3d_private.h | 3 +++ + 7 files changed, 56 insertions(+), 5 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index fc65d3a..d968dcb 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -570,6 +570,9 @@ ULONG CDECL wined3d_buffer_decref(struct wined3d_buffer *buffer) + } + + resource_cleanup(&buffer->resource); ++ if (wined3d_settings.cs_multithreaded) ++ buffer->resource.device->cs->ops->finish(buffer->resource.device->cs); ++ + buffer->resource.parent_ops->wined3d_object_destroyed(buffer->resource.parent); + HeapFree(GetProcessHeap(), 0, buffer->maps); + HeapFree(GetProcessHeap(), 0, buffer); +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index c00d1d3..6edd5e3 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -82,6 +82,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_VDECL_DESTROY, + WINED3D_CS_OP_SHADER_CLEANUP, + WINED3D_CS_OP_CREATE_VBO, ++ WINED3D_CS_OP_RESOURCE_CLEANUP, + WINED3D_CS_OP_STOP, + }; + +@@ -477,6 +478,12 @@ struct wined3d_cs_create_vbo + struct wined3d_buffer *buffer; + }; + ++struct wined3d_cs_resource_cleanup ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_resource *resource; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -2338,6 +2345,26 @@ void wined3d_cs_emit_create_vbo(struct wined3d_cs *cs, struct wined3d_buffer *bu + cs->ops->finish_prio(cs); + } + ++static UINT wined3d_cs_exec_resource_cleanup(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_resource_cleanup *op = data; ++ ++ wined3d_resource_cleanup_cs(op->resource); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_resource_cleanup(struct wined3d_cs *cs, struct wined3d_resource *resource) ++{ ++ struct wined3d_cs_resource_cleanup *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_RESOURCE_CLEANUP; ++ op->resource = resource; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2398,6 +2425,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_VDECL_DESTROY */ wined3d_cs_exec_vertex_declaration_destroy, + /* WINED3D_CS_OP_SHADER_CLEANUP */ wined3d_cs_exec_shader_cleanup, + /* WINED3D_CS_OP_CREATE_VBO */ wined3d_cs_exec_create_vbo, ++ /* WINED3D_CS_OP_RESOURCE_CLEANUP */ wined3d_cs_exec_resource_cleanup, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index ef0b213..dd21986 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -157,6 +157,15 @@ void wined3d_resource_free_bo(struct wined3d_resource *resource) + context_release(context); + } + ++void wined3d_resource_cleanup_cs(struct wined3d_resource *resource) ++{ ++ if (resource->buffer) ++ wined3d_resource_free_bo(resource); ++ ++ wined3d_resource_free_sysmem(resource); ++ resource->map_heap_memory = NULL; ++} ++ + void resource_cleanup(struct wined3d_resource *resource) + { + const struct wined3d *d3d = resource->device->wined3d; +@@ -169,11 +178,7 @@ void resource_cleanup(struct wined3d_resource *resource) + adapter_adjust_memory(resource->device->adapter, (INT64)0 - resource->size); + } + +- if (resource->buffer) +- wined3d_resource_free_bo(resource); +- +- wined3d_resource_free_sysmem(resource); +- resource->map_heap_memory = NULL; ++ wined3d_cs_emit_resource_cleanup(resource->device->cs, resource); + + device_resource_released(resource->device, resource); + } +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 1d777e2..4a1cf30 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -101,9 +101,12 @@ static void surface_cleanup(struct wined3d_surface *surface) + + void wined3d_surface_destroy(struct wined3d_surface *surface) + { ++ struct wined3d_device *device = surface->resource.device; + TRACE("surface %p.\n", surface); + + surface_cleanup(surface); ++ if (wined3d_settings.cs_multithreaded) ++ device->cs->ops->finish(device->cs); + surface->resource.parent_ops->wined3d_object_destroyed(surface->resource.parent); + HeapFree(GetProcessHeap(), 0, surface); + } +@@ -5321,6 +5324,8 @@ static HRESULT surface_init(struct wined3d_surface *surface, struct wined3d_text + { + ERR("Private setup failed, hr %#x.\n", hr); + surface_cleanup(surface); ++ if (wined3d_settings.cs_multithreaded) ++ surface->resource.device->cs->ops->finish(surface->resource.device->cs); + return hr; + } + +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index ea8589a..f7988e5 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -74,6 +74,8 @@ static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struc + { + ERR("Failed to allocate sub-resource array.\n"); + resource_cleanup(&texture->resource); ++ if (wined3d_settings.cs_multithreaded) ++ texture->resource.device->cs->ops->finish(texture->resource.device->cs); + return E_OUTOFMEMORY; + } + +@@ -153,6 +155,8 @@ static void wined3d_texture_cleanup(struct wined3d_texture *texture) + wined3d_texture_unload_gl_texture(texture); + HeapFree(GetProcessHeap(), 0, texture->sub_resources); + resource_cleanup(&texture->resource); ++ if (wined3d_settings.cs_multithreaded) ++ texture->resource.device->cs->ops->finish(texture->resource.device->cs); + } + + void wined3d_texture_set_swapchain(struct wined3d_texture *texture, struct wined3d_swapchain *swapchain) +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index 34b72d1..218118d 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -291,9 +291,12 @@ void wined3d_volume_load(struct wined3d_volume *volume, struct wined3d_context * + + void wined3d_volume_destroy(struct wined3d_volume *volume) + { ++ struct wined3d_device *device = volume->resource.device; + TRACE("volume %p.\n", volume); + + resource_cleanup(&volume->resource); ++ if (wined3d_settings.cs_multithreaded) ++ device->cs->ops->finish(device->cs); + volume->resource.parent_ops->wined3d_object_destroyed(volume->resource.parent); + HeapFree(GetProcessHeap(), 0, volume); + } +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 74e059c..f4c269c 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2163,6 +2163,7 @@ void wined3d_resource_changed(struct wined3d_resource *resource, + struct wined3d_gl_bo *swap_buffer, void *swap_heap_memory) DECLSPEC_HIDDEN; + BOOL wined3d_resource_check_block_align(const struct wined3d_resource *resource, + const struct wined3d_box *box) DECLSPEC_HIDDEN; ++void wined3d_resource_cleanup_cs(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_free_bo(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_free_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + BYTE *wined3d_resource_get_map_ptr(const struct wined3d_resource *resource, +@@ -2706,6 +2707,8 @@ void wined3d_cs_emit_vertex_declaration_destroy(struct wined3d_cs *cs, + struct wined3d_vertex_declaration *declaration) DECLSPEC_HIDDEN; + void wined3d_cs_emit_shader_cleanup(struct wined3d_cs *cs, struct wined3d_shader *shader) DECLSPEC_HIDDEN; + void wined3d_cs_emit_create_vbo(struct wined3d_cs *cs, struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_resource_cleanup(struct wined3d_cs *cs, ++ struct wined3d_resource *resource) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0137-wined3d-Clean-up-buffer-resource-data-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0137-wined3d-Clean-up-buffer-resource-data-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0137-wined3d-Clean-up-buffer-resource-data-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0137-wined3d-Clean-up-buffer-resource-data-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,156 @@ +From 6462e66d6d2229b1755e7689e2b01eee97696676 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 2 Oct 2013 22:50:08 +0200 +Subject: wined3d: Clean up buffer resource data through the CS. + +--- + dlls/wined3d/buffer.c | 39 ++++++++++++++++++++------------------- + dlls/wined3d/cs.c | 28 ++++++++++++++++++++++++++++ + dlls/wined3d/wined3d_private.h | 2 ++ + 3 files changed, 50 insertions(+), 19 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index d968dcb..15ed760 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -545,37 +545,38 @@ static void buffer_unload(struct wined3d_resource *resource) + resource_unload(resource); + } + ++void wined3d_buffer_cleanup_cs(struct wined3d_buffer *buffer) ++{ ++ struct wined3d_context *context; ++ struct wined3d_device *device = buffer->resource.device; ++ ++ if (buffer->buffer_object) ++ { ++ context = context_acquire(device, NULL); ++ delete_gl_buffer(buffer, context->gl_info); ++ context_release(context); ++ ++ HeapFree(GetProcessHeap(), 0, buffer->conversion_map); ++ } ++ ++ HeapFree(GetProcessHeap(), 0, buffer->maps); ++ HeapFree(GetProcessHeap(), 0, buffer); ++} ++ + ULONG CDECL wined3d_buffer_decref(struct wined3d_buffer *buffer) + { + ULONG refcount = InterlockedDecrement(&buffer->resource.ref); +- struct wined3d_context *context; + + TRACE("%p decreasing refcount to %u.\n", buffer, refcount); + + if (!refcount) + { +- if (wined3d_settings.cs_multithreaded) +- { +- FIXME("Waiting for cs.\n"); +- buffer->resource.device->cs->ops->finish(buffer->resource.device->cs); +- } +- +- if (buffer->buffer_object) +- { +- context = context_acquire(buffer->resource.device, NULL); +- delete_gl_buffer(buffer, context->gl_info); +- context_release(context); +- +- HeapFree(GetProcessHeap(), 0, buffer->conversion_map); +- } ++ struct wined3d_device *device = buffer->resource.device; + + resource_cleanup(&buffer->resource); +- if (wined3d_settings.cs_multithreaded) +- buffer->resource.device->cs->ops->finish(buffer->resource.device->cs); + + buffer->resource.parent_ops->wined3d_object_destroyed(buffer->resource.parent); +- HeapFree(GetProcessHeap(), 0, buffer->maps); +- HeapFree(GetProcessHeap(), 0, buffer); ++ wined3d_cs_emit_buffer_cleanup(device->cs, buffer); + } + + return refcount; +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 6edd5e3..40cd85d 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -83,6 +83,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_SHADER_CLEANUP, + WINED3D_CS_OP_CREATE_VBO, + WINED3D_CS_OP_RESOURCE_CLEANUP, ++ WINED3D_CS_OP_BUFFER_CLEANUP, + WINED3D_CS_OP_STOP, + }; + +@@ -484,6 +485,12 @@ struct wined3d_cs_resource_cleanup + struct wined3d_resource *resource; + }; + ++struct wined3d_cs_buffer_cleanup ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_buffer *buffer; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -2365,6 +2372,26 @@ void wined3d_cs_emit_resource_cleanup(struct wined3d_cs *cs, struct wined3d_reso + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_buffer_cleanup(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_buffer_cleanup *op = data; ++ ++ wined3d_buffer_cleanup_cs(op->buffer); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_buffer_cleanup(struct wined3d_cs *cs, struct wined3d_buffer *buffer) ++{ ++ struct wined3d_cs_buffer_cleanup *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_BUFFER_CLEANUP; ++ op->buffer = buffer; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2426,6 +2453,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_SHADER_CLEANUP */ wined3d_cs_exec_shader_cleanup, + /* WINED3D_CS_OP_CREATE_VBO */ wined3d_cs_exec_create_vbo, + /* WINED3D_CS_OP_RESOURCE_CLEANUP */ wined3d_cs_exec_resource_cleanup, ++ /* WINED3D_CS_OP_BUFFER_CLEANUP */ wined3d_cs_exec_buffer_cleanup, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index f4c269c..76c0708 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2709,6 +2709,7 @@ void wined3d_cs_emit_shader_cleanup(struct wined3d_cs *cs, struct wined3d_shader + void wined3d_cs_emit_create_vbo(struct wined3d_cs *cs, struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; + void wined3d_cs_emit_resource_cleanup(struct wined3d_cs *cs, + struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_buffer_cleanup(struct wined3d_cs *cs, struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +@@ -2799,6 +2800,7 @@ void buffer_invalidate_bo_range(struct wined3d_buffer *This, UINT offset, UINT s + void buffer_swap_mem(struct wined3d_buffer *buffer, BYTE *mem) DECLSPEC_HIDDEN; + void buffer_create_buffer_object(struct wined3d_buffer *This, + struct wined3d_context *context) DECLSPEC_HIDDEN; ++void wined3d_buffer_cleanup_cs(struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; + + struct wined3d_rendertarget_view + { +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0138-wined3d-Clean-up-volume-resource-data-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0138-wined3d-Clean-up-volume-resource-data-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0138-wined3d-Clean-up-volume-resource-data-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0138-wined3d-Clean-up-volume-resource-data-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,122 @@ +From 6237370d85227ef7db8888705128156918fcafc3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 2 Oct 2013 22:54:57 +0200 +Subject: wined3d: Clean up volume resource data through the CS. + +--- + dlls/wined3d/cs.c | 28 ++++++++++++++++++++++++++++ + dlls/wined3d/volume.c | 9 ++++++--- + dlls/wined3d/wined3d_private.h | 2 ++ + 3 files changed, 36 insertions(+), 3 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 40cd85d..9cba57b 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -84,6 +84,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_CREATE_VBO, + WINED3D_CS_OP_RESOURCE_CLEANUP, + WINED3D_CS_OP_BUFFER_CLEANUP, ++ WINED3D_CS_OP_VOLUME_CLEANUP, + WINED3D_CS_OP_STOP, + }; + +@@ -491,6 +492,12 @@ struct wined3d_cs_buffer_cleanup + struct wined3d_buffer *buffer; + }; + ++struct wined3d_cs_volume_cleanup ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_volume *volume; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -2392,6 +2399,26 @@ void wined3d_cs_emit_buffer_cleanup(struct wined3d_cs *cs, struct wined3d_buffer + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_volume_cleanup(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_volume_cleanup *op = data; ++ ++ wined3d_volume_cleanup_cs(op->volume); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_volume_cleanup(struct wined3d_cs *cs, struct wined3d_volume *volume) ++{ ++ struct wined3d_cs_volume_cleanup *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_VOLUME_CLEANUP; ++ op->volume = volume; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2454,6 +2481,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_CREATE_VBO */ wined3d_cs_exec_create_vbo, + /* WINED3D_CS_OP_RESOURCE_CLEANUP */ wined3d_cs_exec_resource_cleanup, + /* WINED3D_CS_OP_BUFFER_CLEANUP */ wined3d_cs_exec_buffer_cleanup, ++ /* WINED3D_CS_OP_VOLUME_CLEANUP */ wined3d_cs_exec_volume_cleanup, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +index 218118d..a30acab 100644 +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -295,10 +295,8 @@ void wined3d_volume_destroy(struct wined3d_volume *volume) + TRACE("volume %p.\n", volume); + + resource_cleanup(&volume->resource); +- if (wined3d_settings.cs_multithreaded) +- device->cs->ops->finish(device->cs); + volume->resource.parent_ops->wined3d_object_destroyed(volume->resource.parent); +- HeapFree(GetProcessHeap(), 0, volume); ++ wined3d_cs_emit_volume_cleanup(device->cs, volume); + } + + static void volume_unload(struct wined3d_resource *resource) +@@ -339,6 +337,11 @@ ULONG CDECL wined3d_volume_incref(struct wined3d_volume *volume) + return wined3d_texture_incref(volume->container); + } + ++void wined3d_volume_cleanup_cs(struct wined3d_volume *volume) ++{ ++ HeapFree(GetProcessHeap(), 0, volume); ++} ++ + ULONG CDECL wined3d_volume_decref(struct wined3d_volume *volume) + { + TRACE("Forwarding to container %p.\n", volume->container); +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 76c0708..2b808dd 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2343,6 +2343,7 @@ void wined3d_volume_load(struct wined3d_volume *volume, struct wined3d_context * + BOOL srgb_mode) DECLSPEC_HIDDEN; + void wined3d_volume_upload_data(struct wined3d_volume *volume, const struct wined3d_context *context, + const struct wined3d_bo_address *data) DECLSPEC_HIDDEN; ++void wined3d_volume_cleanup_cs(struct wined3d_volume *volume) DECLSPEC_HIDDEN; + + struct wined3d_surface_dib + { +@@ -2710,6 +2711,7 @@ void wined3d_cs_emit_create_vbo(struct wined3d_cs *cs, struct wined3d_buffer *bu + void wined3d_cs_emit_resource_cleanup(struct wined3d_cs *cs, + struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_cs_emit_buffer_cleanup(struct wined3d_cs *cs, struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_volume_cleanup(struct wined3d_cs *cs, struct wined3d_volume *volume) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0139-wined3d-Clean-up-surfaces-through-the-cs.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0139-wined3d-Clean-up-surfaces-through-the-cs.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0139-wined3d-Clean-up-surfaces-through-the-cs.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0139-wined3d-Clean-up-surfaces-through-the-cs.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,178 @@ +From ffa89bb6de1ecc4769b6aae7f0c66b1c18296c21 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 6 Oct 2013 16:12:24 +0200 +Subject: wined3d: Clean up surfaces through the cs. + +--- + dlls/wined3d/cs.c | 28 ++++++++++++++++++++++++++++ + dlls/wined3d/surface.c | 37 ++++++++++++++++--------------------- + dlls/wined3d/wined3d_private.h | 2 ++ + 3 files changed, 46 insertions(+), 21 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 9cba57b..7675214 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -85,6 +85,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_RESOURCE_CLEANUP, + WINED3D_CS_OP_BUFFER_CLEANUP, + WINED3D_CS_OP_VOLUME_CLEANUP, ++ WINED3D_CS_OP_SURFACE_CLEANUP, + WINED3D_CS_OP_STOP, + }; + +@@ -498,6 +499,12 @@ struct wined3d_cs_volume_cleanup + struct wined3d_volume *volume; + }; + ++struct wined3d_cs_surface_cleanup ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_surface *surface; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -2419,6 +2426,26 @@ void wined3d_cs_emit_volume_cleanup(struct wined3d_cs *cs, struct wined3d_volume + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_surface_cleanup(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_surface_cleanup *op = data; ++ ++ wined3d_surface_cleanup_cs(op->surface); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_surface_cleanup(struct wined3d_cs *cs, struct wined3d_surface *surface) ++{ ++ struct wined3d_cs_surface_cleanup *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SURFACE_CLEANUP; ++ op->surface = surface; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2482,6 +2509,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_RESOURCE_CLEANUP */ wined3d_cs_exec_resource_cleanup, + /* WINED3D_CS_OP_BUFFER_CLEANUP */ wined3d_cs_exec_buffer_cleanup, + /* WINED3D_CS_OP_VOLUME_CLEANUP */ wined3d_cs_exec_volume_cleanup, ++ /* WINED3D_CS_OP_SURFACE_CLEANUP */ wined3d_cs_exec_surface_cleanup, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 4a1cf30..4d8bd1c 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -36,20 +36,10 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d); + + #define MAXLOCKCOUNT 50 /* After this amount of locks do not free the sysmem copy. */ + +-static void surface_cleanup(struct wined3d_surface *surface) +-{ +- struct wined3d_surface *overlay, *cur; +- +- TRACE("surface %p.\n", surface); +- +- if (wined3d_settings.cs_multithreaded) +- { +- FIXME("Waiting for cs.\n"); +- surface->resource.device->cs->ops->finish(surface->resource.device->cs); +- } + +- if (surface->resource.buffer || surface->rb_multisample +- || surface->rb_resolved || !list_empty(&surface->renderbuffers)) ++void wined3d_surface_cleanup_cs(struct wined3d_surface *surface) ++{ ++ if (surface->rb_multisample || surface->rb_resolved || !list_empty(&surface->renderbuffers)) + { + struct wined3d_renderbuffer_entry *entry, *entry2; + const struct wined3d_gl_info *gl_info; +@@ -87,6 +77,16 @@ static void surface_cleanup(struct wined3d_surface *surface) + surface->resource.bitmap_data = NULL; + } + ++ TRACE("Destroyed surface %p.\n", surface); ++ HeapFree(GetProcessHeap(), 0, surface); ++} ++ ++static void surface_cleanup(struct wined3d_surface *surface) ++{ ++ struct wined3d_surface *overlay, *cur; ++ ++ TRACE("surface %p.\n", surface); ++ + if (surface->overlay_dest) + list_remove(&surface->overlay_entry); + +@@ -97,18 +97,15 @@ static void surface_cleanup(struct wined3d_surface *surface) + } + + resource_cleanup(&surface->resource); ++ wined3d_cs_emit_surface_cleanup(surface->resource.device->cs, surface); + } + + void wined3d_surface_destroy(struct wined3d_surface *surface) + { +- struct wined3d_device *device = surface->resource.device; + TRACE("surface %p.\n", surface); + +- surface_cleanup(surface); +- if (wined3d_settings.cs_multithreaded) +- device->cs->ops->finish(device->cs); + surface->resource.parent_ops->wined3d_object_destroyed(surface->resource.parent); +- HeapFree(GetProcessHeap(), 0, surface); ++ surface_cleanup(surface); + } + + void surface_get_drawable_size(const struct wined3d_surface *surface, const struct wined3d_context *context, +@@ -5324,8 +5321,6 @@ static HRESULT surface_init(struct wined3d_surface *surface, struct wined3d_text + { + ERR("Private setup failed, hr %#x.\n", hr); + surface_cleanup(surface); +- if (wined3d_settings.cs_multithreaded) +- surface->resource.device->cs->ops->finish(surface->resource.device->cs); + return hr; + } + +@@ -5368,7 +5363,7 @@ HRESULT wined3d_surface_create(struct wined3d_texture *container, const struct w + if (FAILED(hr = surface_init(object, container, desc, target, level, layer, flags))) + { + WARN("Failed to initialize surface, returning %#x.\n", hr); +- HeapFree(GetProcessHeap(), 0, object); ++ /* The command stream takes care of freeing the memory. */ + return hr; + } + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 2b808dd..afb31c2 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2455,6 +2455,7 @@ void surface_blt_ugly(struct wined3d_surface *dst_surface, const RECT *dst_rect_ + struct wined3d_surface *src_surface, const RECT *src_rect_in, DWORD flags, + const WINEDDBLTFX *fx, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; + BOOL surface_check_block_align(struct wined3d_surface *surface, const RECT *rect) DECLSPEC_HIDDEN; ++void wined3d_surface_cleanup_cs(struct wined3d_surface *surface) DECLSPEC_HIDDEN; + + void draw_textured_quad(const struct wined3d_surface *src_surface, struct wined3d_context *context, + const RECT *src_rect, const RECT *dst_rect, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; +@@ -2712,6 +2713,7 @@ void wined3d_cs_emit_resource_cleanup(struct wined3d_cs *cs, + struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_cs_emit_buffer_cleanup(struct wined3d_cs *cs, struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; + void wined3d_cs_emit_volume_cleanup(struct wined3d_cs *cs, struct wined3d_volume *volume) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_surface_cleanup(struct wined3d_cs *cs, struct wined3d_surface *surface) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0140-wined3d-Clean-up-texture-resources-through-the-cs.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0140-wined3d-Clean-up-texture-resources-through-the-cs.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0140-wined3d-Clean-up-texture-resources-through-the-cs.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0140-wined3d-Clean-up-texture-resources-through-the-cs.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,291 @@ +From 92b80eca71961fa3669d9da8cb64a62e6f556184 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 6 Oct 2013 16:20:32 +0200 +Subject: wined3d: Clean up texture resources through the cs. + +--- + dlls/wined3d/cs.c | 28 ++++++++++++++++++++++++++++ + dlls/wined3d/texture.c | 39 +++++++++++++++++++++++++++++++-------- + dlls/wined3d/wined3d_private.h | 2 ++ + 3 files changed, 61 insertions(+), 8 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 7675214..5e4aa53 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -86,6 +86,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_BUFFER_CLEANUP, + WINED3D_CS_OP_VOLUME_CLEANUP, + WINED3D_CS_OP_SURFACE_CLEANUP, ++ WINED3D_CS_OP_TEXTURE_CLEANUP, + WINED3D_CS_OP_STOP, + }; + +@@ -505,6 +506,12 @@ struct wined3d_cs_surface_cleanup + struct wined3d_surface *surface; + }; + ++struct wined3d_cs_texture_cleanup ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_texture *texture; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -2446,6 +2453,26 @@ void wined3d_cs_emit_surface_cleanup(struct wined3d_cs *cs, struct wined3d_surfa + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_texture_cleanup(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_texture_cleanup *op = data; ++ ++ wined3d_texture_cleanup_cs(op->texture); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_texture_cleanup(struct wined3d_cs *cs, struct wined3d_texture *texture) ++{ ++ struct wined3d_cs_texture_cleanup *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_TEXTURE_CLEANUP; ++ op->texture = texture; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2510,6 +2537,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_BUFFER_CLEANUP */ wined3d_cs_exec_buffer_cleanup, + /* WINED3D_CS_OP_VOLUME_CLEANUP */ wined3d_cs_exec_volume_cleanup, + /* WINED3D_CS_OP_SURFACE_CLEANUP */ wined3d_cs_exec_surface_cleanup, ++ /* WINED3D_CS_OP_TEXTURE_CLEANUP */ wined3d_cs_exec_texture_cleanup, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index f7988e5..f055d5e 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -131,17 +131,26 @@ static void wined3d_texture_unload_gl_texture(struct wined3d_texture *texture) + resource_unload(&texture->resource); + } + ++void wined3d_texture_cleanup_cs(struct wined3d_texture *texture) ++{ ++ wined3d_texture_unload_gl_texture(texture); ++ HeapFree(GetProcessHeap(), 0, texture->sub_resources); ++ HeapFree(GetProcessHeap(), 0, texture); ++} ++ + static void wined3d_texture_cleanup(struct wined3d_texture *texture) + { + UINT sub_count = texture->level_count * texture->layer_count; + UINT i; ++ struct wined3d_device *device = texture->resource.device; + + TRACE("texture %p.\n", texture); + ++ /* Because sub_resource_cleanup interferes with GL resources */ + if (wined3d_settings.cs_multithreaded) + { + FIXME("Waiting for cs.\n"); +- texture->resource.device->cs->ops->finish(texture->resource.device->cs); ++ device->cs->ops->finish(device->cs); + } + + for (i = 0; i < sub_count; ++i) +@@ -152,11 +161,8 @@ static void wined3d_texture_cleanup(struct wined3d_texture *texture) + texture->texture_ops->texture_sub_resource_cleanup(sub_resource); + } + +- wined3d_texture_unload_gl_texture(texture); +- HeapFree(GetProcessHeap(), 0, texture->sub_resources); + resource_cleanup(&texture->resource); +- if (wined3d_settings.cs_multithreaded) +- texture->resource.device->cs->ops->finish(texture->resource.device->cs); ++ wined3d_cs_emit_texture_cleanup(device->cs, texture); + } + + void wined3d_texture_set_swapchain(struct wined3d_texture *texture, struct wined3d_swapchain *swapchain) +@@ -523,9 +529,10 @@ ULONG CDECL wined3d_texture_decref(struct wined3d_texture *texture) + + if (!refcount) + { ++ void *parent = texture->resource.parent; ++ const struct wined3d_parent_ops *parent_ops = texture->resource.parent_ops; + wined3d_texture_cleanup(texture); +- texture->resource.parent_ops->wined3d_object_destroyed(texture->resource.parent); +- HeapFree(GetProcessHeap(), 0, texture); ++ parent_ops->wined3d_object_destroyed(parent); + } + + return refcount; +@@ -1040,12 +1047,14 @@ static HRESULT cubetexture_init(struct wined3d_texture *texture, const struct wi + if (WINED3DFMT_UNKNOWN >= desc->format) + { + WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); ++ HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } + + if (!gl_info->supported[ARB_TEXTURE_CUBE_MAP] && desc->pool != WINED3D_POOL_SCRATCH) + { + WARN("(%p) : Tried to create not supported cube texture.\n", texture); ++ HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } + +@@ -1055,12 +1064,14 @@ static HRESULT cubetexture_init(struct wined3d_texture *texture, const struct wi + if (!gl_info->supported[SGIS_GENERATE_MIPMAP]) + { + WARN("No mipmap generation support, returning D3DERR_INVALIDCALL.\n"); ++ HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } + + if (levels > 1) + { + WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL.\n"); ++ HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } + +@@ -1088,6 +1099,7 @@ static HRESULT cubetexture_init(struct wined3d_texture *texture, const struct wi + else + { + WARN("Attempted to create a NPOT cube texture (edge length %u) without GL support.\n", desc->width); ++ HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } + } +@@ -1097,6 +1109,7 @@ static HRESULT cubetexture_init(struct wined3d_texture *texture, const struct wi + surface_flags, device, parent, parent_ops, &texture_resource_ops))) + { + WARN("Failed to initialize texture, returning %#x\n", hr); ++ HeapFree(GetProcessHeap(), 0, texture); + return hr; + } + +@@ -1159,6 +1172,7 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3 + if (WINED3DFMT_UNKNOWN >= desc->format) + { + WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); ++ HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } + +@@ -1189,6 +1203,7 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3 + else + { + WARN("Attempted to create a mipmapped NPOT texture without unconditional NPOT support.\n"); ++ HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } + } +@@ -1201,12 +1216,14 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3 + if (!gl_info->supported[SGIS_GENERATE_MIPMAP]) + { + WARN("No mipmap generation support, returning WINED3DERR_INVALIDCALL.\n"); ++ HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } + + if (levels > 1) + { + WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning WINED3DERR_INVALIDCALL.\n"); ++ HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } + +@@ -1222,6 +1239,7 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3 + surface_flags, device, parent, parent_ops, &texture_resource_ops))) + { + WARN("Failed to initialize texture, returning %#x.\n", hr); ++ HeapFree(GetProcessHeap(), 0, texture); + return hr; + } + +@@ -1382,12 +1400,14 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, const struct + if (WINED3DFMT_UNKNOWN >= desc->format) + { + WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); ++ HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } + + if (!gl_info->supported[EXT_TEXTURE3D]) + { + WARN("(%p) : Texture cannot be created - no volume texture support.\n", texture); ++ HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } + +@@ -1397,12 +1417,14 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, const struct + if (!gl_info->supported[SGIS_GENERATE_MIPMAP]) + { + WARN("No mipmap generation support, returning D3DERR_INVALIDCALL.\n"); ++ HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } + + if (levels > 1) + { + WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL.\n"); ++ HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } + +@@ -1437,6 +1459,7 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, const struct + { + WARN("Attempted to create a NPOT volume texture (%u, %u, %u) without GL support.\n", + desc->width, desc->height, desc->depth); ++ HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } + } +@@ -1446,6 +1469,7 @@ static HRESULT volumetexture_init(struct wined3d_texture *texture, const struct + 0, device, parent, parent_ops, &texture_resource_ops))) + { + WARN("Failed to initialize texture, returning %#x.\n", hr); ++ HeapFree(GetProcessHeap(), 0, texture); + return hr; + } + +@@ -1516,7 +1540,6 @@ HRESULT CDECL wined3d_texture_create(struct wined3d_device *device, const struct + if (FAILED(hr)) + { + WARN("Failed to initialize texture, returning %#x.\n", hr); +- HeapFree(GetProcessHeap(), 0, object); + return hr; + } + +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index afb31c2..6382375 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2293,6 +2293,7 @@ static inline struct gl_texture *wined3d_texture_get_gl_texture(struct wined3d_t + void wined3d_texture_apply_state_changes(struct wined3d_texture *texture, + const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1], + const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; ++void wined3d_texture_cleanup_cs(struct wined3d_texture *texture) DECLSPEC_HIDDEN; + void wined3d_texture_bind(struct wined3d_texture *texture, + struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN; + void wined3d_texture_bind_and_dirtify(struct wined3d_texture *texture, +@@ -2714,6 +2715,7 @@ void wined3d_cs_emit_resource_cleanup(struct wined3d_cs *cs, + void wined3d_cs_emit_buffer_cleanup(struct wined3d_cs *cs, struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; + void wined3d_cs_emit_volume_cleanup(struct wined3d_cs *cs, struct wined3d_volume *volume) DECLSPEC_HIDDEN; + void wined3d_cs_emit_surface_cleanup(struct wined3d_cs *cs, struct wined3d_surface *surface) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_texture_cleanup(struct wined3d_cs *cs, struct wined3d_texture *texture) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0141-wined3d-Unload-resources-through-the-CS-in-uninit_3d.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0141-wined3d-Unload-resources-through-the-CS-in-uninit_3d.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0141-wined3d-Unload-resources-through-the-CS-in-uninit_3d.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0141-wined3d-Unload-resources-through-the-CS-in-uninit_3d.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,29 @@ +From a2b1d967f8c0ee199803ba6e7ebb0b07c26a65f0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 2 Oct 2013 23:28:56 +0200 +Subject: wined3d: Unload resources through the CS in uninit_3d. + +--- + dlls/wined3d/device.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index f5cb7bd..28819af 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -1050,9 +1050,10 @@ HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device) + LIST_FOR_EACH_ENTRY_SAFE(resource, cursor, &device->resources, struct wined3d_resource, resource_list_entry) + { + TRACE("Unloading resource %p.\n", resource); +- +- resource->resource_ops->resource_unload(resource); ++ wined3d_cs_emit_evict_resource(device->cs, resource); + } ++ if (wined3d_settings.cs_multithreaded) ++ device->cs->ops->finish(device->cs); + + /* Destroy the depth blt resources, they will be invalid after the reset. Also free shader + * private data, it might contain opengl pointers +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0142-wined3d-Unload-resources-through-the-CS-in-device_re.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0142-wined3d-Unload-resources-through-the-CS-in-device_re.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0142-wined3d-Unload-resources-through-the-CS-in-device_re.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0142-wined3d-Unload-resources-through-the-CS-in-device_re.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,44 @@ +From d2b010c4c1c08d71ed6e2e4257db236535c20deb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 2 Oct 2013 23:40:20 +0200 +Subject: wined3d: Unload resources through the CS in device_reset. + +--- + dlls/wined3d/device.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 28819af..2410547 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -4228,21 +4228,23 @@ static void delete_opengl_contexts(struct wined3d_device *device, struct wined3d + struct wined3d_context *context; + struct wined3d_shader *shader; + +- context = context_acquire(device, NULL); +- gl_info = context->gl_info; +- + LIST_FOR_EACH_ENTRY_SAFE(resource, cursor, &device->resources, struct wined3d_resource, resource_list_entry) + { + TRACE("Unloading resource %p.\n", resource); + +- resource->resource_ops->resource_unload(resource); ++ wined3d_cs_emit_evict_resource(device->cs, resource); + } ++ if (wined3d_settings.cs_multithreaded) ++ device->cs->ops->finish(device->cs); + + LIST_FOR_EACH_ENTRY(shader, &device->shaders, struct wined3d_shader, shader_list_entry) + { + device->shader_backend->shader_destroy(shader); + } + ++ context = context_acquire(device, NULL); ++ gl_info = context->gl_info; ++ + if (device->depth_blt_texture) + { + gl_info->gl_ops.gl.p_glDeleteTextures(1, &device->depth_blt_texture); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0143-wined3d-Don-t-glFinish-after-a-depth-buffer-blit.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0143-wined3d-Don-t-glFinish-after-a-depth-buffer-blit.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0143-wined3d-Don-t-glFinish-after-a-depth-buffer-blit.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0143-wined3d-Don-t-glFinish-after-a-depth-buffer-blit.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,27 @@ +From 81f901210e683ac2a2193957849497031f424545 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 3 Oct 2013 17:39:08 +0200 +Subject: wined3d: Don't glFinish after a depth buffer blit. + +--- + dlls/wined3d/surface.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 4d8bd1c..3c5489f 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -694,9 +694,7 @@ static void surface_depth_blt_fbo(const struct wined3d_device *device, + dst_rect->left, dst_rect->top, dst_rect->right, dst_rect->bottom, gl_mask, GL_NEAREST); + checkGLcall("glBlitFramebuffer()"); + +- if (wined3d_settings.cs_multithreaded) +- gl_info->gl_ops.gl.p_glFinish(); +- else if (wined3d_settings.strict_draw_ordering) ++ if (wined3d_settings.strict_draw_ordering) + gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + + context_release(context); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0144-wined3d-Remove-software-cursor-support.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0144-wined3d-Remove-software-cursor-support.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0144-wined3d-Remove-software-cursor-support.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0144-wined3d-Remove-software-cursor-support.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,190 @@ +From 3eb3def034aaacfd9f65b3f6f5f750cccbbf6c42 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 3 Oct 2013 19:23:24 +0200 +Subject: wined3d: Remove software cursor support. + +This has been broken since quite some time and only serves to crash fglrx by acquiring a context +in the main thread. + +FIXME: Make sure wined3d_device_show_cursor returns the correct value if a software cursor is set. +--- + dlls/wined3d/device.c | 83 +----------------------------------------- + dlls/wined3d/swapchain.c | 21 ----------- + dlls/wined3d/wined3d_private.h | 1 - + 3 files changed, 2 insertions(+), 103 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 2410547..b3f75ba 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -1023,8 +1023,6 @@ HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device) + + if (device->logo_texture) + wined3d_texture_decref(device->logo_texture); +- if (device->cursor_texture) +- wined3d_texture_decref(device->cursor_texture); + + /* Release the buffers (with sanity checks). + * FIXME: Move this move into a separate patch. I think the idea +@@ -3984,77 +3982,12 @@ void CDECL wined3d_device_set_depth_stencil_view(struct wined3d_device *device, + wined3d_rendertarget_view_decref(prev); + } + +-static struct wined3d_texture *wined3d_device_create_cursor_texture(struct wined3d_device *device, +- struct wined3d_surface *cursor_image) +-{ +- struct wined3d_resource_desc desc; +- struct wined3d_map_desc map_desc; +- struct wined3d_texture *texture; +- struct wined3d_surface *surface; +- BYTE *src_data, *dst_data; +- unsigned int src_pitch; +- unsigned int i; +- +- if (FAILED(wined3d_surface_map(cursor_image, &map_desc, NULL, WINED3D_MAP_READONLY))) +- { +- ERR("Failed to map source surface.\n"); +- return NULL; +- } +- +- src_pitch = map_desc.row_pitch; +- src_data = map_desc.data; +- +- desc.resource_type = WINED3D_RTYPE_TEXTURE; +- desc.format = WINED3DFMT_B8G8R8A8_UNORM; +- desc.multisample_type = WINED3D_MULTISAMPLE_NONE; +- desc.multisample_quality = 0; +- desc.usage = WINED3DUSAGE_DYNAMIC; +- desc.pool = WINED3D_POOL_DEFAULT; +- desc.width = cursor_image->resource.width; +- desc.height = cursor_image->resource.height; +- desc.depth = 1; +- desc.size = 0; +- +- if (FAILED(wined3d_texture_create(device, &desc, 1, WINED3D_SURFACE_MAPPABLE, +- NULL, &wined3d_null_parent_ops, &texture))) +- { +- ERR("Failed to create cursor texture.\n"); +- wined3d_surface_unmap(cursor_image); +- return NULL; +- } +- +- surface = surface_from_resource(wined3d_texture_get_sub_resource(texture, 0)); +- if (FAILED(wined3d_surface_map(surface, &map_desc, NULL, WINED3D_MAP_DISCARD))) +- { +- ERR("Failed to map destination surface.\n"); +- wined3d_texture_decref(texture); +- wined3d_surface_unmap(cursor_image); +- return NULL; +- } +- +- dst_data = map_desc.data; +- +- for (i = 0; i < desc.height; ++i) +- memcpy(&dst_data[map_desc.row_pitch * i], &src_data[src_pitch * i], desc.width * 4); +- +- wined3d_surface_unmap(surface); +- wined3d_surface_unmap(cursor_image); +- +- return texture; +-} +- + HRESULT CDECL wined3d_device_set_cursor_properties(struct wined3d_device *device, + UINT x_hotspot, UINT y_hotspot, struct wined3d_surface *cursor_image) + { + TRACE("device %p, x_hotspot %u, y_hotspot %u, cursor_image %p.\n", + device, x_hotspot, y_hotspot, cursor_image); + +- if (device->cursor_texture) +- { +- wined3d_texture_decref(device->cursor_texture); +- device->cursor_texture = NULL; +- } +- + if (cursor_image) + { + struct wined3d_display_mode mode; +@@ -4089,11 +4022,8 @@ HRESULT CDECL wined3d_device_set_cursor_properties(struct wined3d_device *device + * release it after setting the cursor image. Windows doesn't + * addref the set surface, so we can't do this either without + * creating circular refcount dependencies. */ +- if (!(device->cursor_texture = wined3d_device_create_cursor_texture(device, cursor_image))) +- { +- ERR("Failed to create cursor texture.\n"); +- return WINED3DERR_INVALIDCALL; +- } ++ device->cursorWidth = cursor_image->resource.width; ++ device->cursorHeight = cursor_image->resource.height; + + device->cursorWidth = cursor_image->resource.width; + device->cursorHeight = cursor_image->resource.height; +@@ -4193,10 +4123,6 @@ BOOL CDECL wined3d_device_show_cursor(struct wined3d_device *device, BOOL show) + else + SetCursor(NULL); + } +- else if (device->cursor_texture) +- { +- device->bCursorVisible = show; +- } + + return oldVisible; + } +@@ -4353,11 +4279,6 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, + wined3d_texture_decref(device->logo_texture); + device->logo_texture = NULL; + } +- if (device->cursor_texture) +- { +- wined3d_texture_decref(device->cursor_texture); +- device->cursor_texture = NULL; +- } + } + + if (device->state.fb.render_targets) +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index 7ebdd1b..0a7b68d 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -449,27 +449,6 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT + NULL, WINED3D_TEXF_POINT); + } + +- if (swapchain->device->bCursorVisible && swapchain->device->cursor_texture +- && !swapchain->device->hardwareCursor) +- { +- struct wined3d_surface *cursor = surface_from_resource( +- wined3d_texture_get_sub_resource(swapchain->device->cursor_texture, 0)); +- RECT destRect = +- { +- swapchain->device->xScreenSpace - swapchain->device->xHotSpot, +- swapchain->device->yScreenSpace - swapchain->device->yHotSpot, +- swapchain->device->xScreenSpace + swapchain->device->cursorWidth - swapchain->device->xHotSpot, +- swapchain->device->yScreenSpace + swapchain->device->cursorHeight - swapchain->device->yHotSpot, +- }; +- +- TRACE("Rendering the software cursor.\n"); +- +- if (swapchain->desc.windowed) +- MapWindowPoints(NULL, swapchain->win_handle, (POINT *)&destRect, 2); +- wined3d_surface_blt(back_buffer, &destRect, cursor, NULL, WINEDDBLT_ALPHATEST, +- NULL, WINED3D_TEXF_POINT); +- } +- + TRACE("Presenting HDC %p.\n", context->hdc); + + render_to_fbo = swapchain->render_to_fbo; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 6382375..2f8cab4 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2037,7 +2037,6 @@ struct wined3d_device + UINT xScreenSpace; + UINT yScreenSpace; + UINT cursorWidth, cursorHeight; +- struct wined3d_texture *cursor_texture; + HCURSOR hardwareCursor; + + /* The Wine logo texture */ +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0145-wined3d-Create-dummy-textures-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0145-wined3d-Create-dummy-textures-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0145-wined3d-Create-dummy-textures-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0145-wined3d-Create-dummy-textures-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,157 @@ +From c91b5281332e1879e25088efeee24bc1a337ca30 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 10 Oct 2013 16:29:42 +0200 +Subject: wined3d: Create dummy textures through the CS. + +Hacky version. Just good enough to see if the double context during init is what makes fglrx +crash. +--- + dlls/wined3d/cs.c | 29 +++++++++++++++++++++++++++++ + dlls/wined3d/device.c | 13 ++++--------- + dlls/wined3d/wined3d_private.h | 3 ++- + 3 files changed, 35 insertions(+), 10 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 5e4aa53..fb1d1aa 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -87,6 +87,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_VOLUME_CLEANUP, + WINED3D_CS_OP_SURFACE_CLEANUP, + WINED3D_CS_OP_TEXTURE_CLEANUP, ++ WINED3D_CS_OP_CREATE_DUMMY_TEXTURES, + WINED3D_CS_OP_STOP, + }; + +@@ -512,6 +513,11 @@ struct wined3d_cs_texture_cleanup + struct wined3d_texture *texture; + }; + ++struct wined3d_cs_create_dummy_textures ++{ ++ enum wined3d_cs_op opcode; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -2473,6 +2479,28 @@ void wined3d_cs_emit_texture_cleanup(struct wined3d_cs *cs, struct wined3d_textu + cs->ops->submit(cs, sizeof(*op)); + } + ++static UINT wined3d_cs_exec_create_dummy_textures(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_create_dummy_textures *op = data; ++ struct wined3d_context *context = context_acquire(cs->device, NULL); ++ ++ device_create_dummy_textures(cs->device, context); ++ ++ context_release(context); ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_create_dummy_textures(struct wined3d_cs *cs) ++{ ++ struct wined3d_cs_create_dummy_textures *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_CREATE_DUMMY_TEXTURES; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++ cs->ops->finish(cs); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2538,6 +2566,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_VOLUME_CLEANUP */ wined3d_cs_exec_volume_cleanup, + /* WINED3D_CS_OP_SURFACE_CLEANUP */ wined3d_cs_exec_surface_cleanup, + /* WINED3D_CS_OP_TEXTURE_CLEANUP */ wined3d_cs_exec_texture_cleanup, ++ /* WINED3D_CS_OP_CREATE_DUMMY_TEXTURES */ wined3d_cs_exec_create_dummy_textures, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index b3f75ba..28b1c81 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -608,7 +608,7 @@ out: + } + + /* Context activation is done by the caller. */ +-static void create_dummy_textures(struct wined3d_device *device, struct wined3d_context *context) ++void device_create_dummy_textures(struct wined3d_device *device, struct wined3d_context *context) + { + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + unsigned int i, j, count; +@@ -854,7 +854,6 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device, + { + static const struct wined3d_color black = {0.0f, 0.0f, 0.0f, 0.0f}; + struct wined3d_swapchain *swapchain = NULL; +- struct wined3d_context *context; + DWORD clear_flags = 0; + HRESULT hr; + +@@ -905,9 +904,7 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device, + device->swapchains[0] = swapchain; + device_init_swapchain_state(device, swapchain); + +- context = context_acquire(device, NULL); +- +- create_dummy_textures(device, context); ++ wined3d_cs_emit_create_dummy_textures(device->cs); + + device->contexts[0]->last_was_rhw = 0; + +@@ -919,7 +916,7 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device, + + case ORM_BACKBUFFER: + { +- if (context_get_current()->aux_buffers > 0) ++ if (device->contexts[0]->aux_buffers > 0) + { + TRACE("Using auxiliary buffer for offscreen rendering\n"); + device->offscreenBuffer = GL_AUX0; +@@ -935,8 +932,6 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device, + + TRACE("All defaults now set up, leaving 3D init.\n"); + +- context_release(context); +- + /* Clear the screen */ + if (swapchain->back_buffers && swapchain->back_buffers[0]) + clear_flags |= WINED3DCLEAR_TARGET; +@@ -4236,7 +4231,7 @@ static HRESULT create_primary_opengl_context(struct wined3d_device *device, stru + + swapchain->context[0] = context; + swapchain->num_contexts = 1; +- create_dummy_textures(device, context); ++ device_create_dummy_textures(device, context); + context_release(context); + + return WINED3D_OK; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 2f8cab4..a4e1886 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2076,7 +2076,7 @@ struct wined3d_gl_bo *wined3d_device_get_bo(struct wined3d_device *device, UINT + GLenum type_hint, struct wined3d_context *context) DECLSPEC_HIDDEN; + void wined3d_device_release_bo(struct wined3d_device *device, struct wined3d_gl_bo *bo, + const struct wined3d_context *context) DECLSPEC_HIDDEN; +- ++void device_create_dummy_textures(struct wined3d_device *device, struct wined3d_context *context) DECLSPEC_HIDDEN; + + static inline BOOL isStateDirty(const struct wined3d_context *context, DWORD state) + { +@@ -2715,6 +2715,7 @@ void wined3d_cs_emit_buffer_cleanup(struct wined3d_cs *cs, struct wined3d_buffer + void wined3d_cs_emit_volume_cleanup(struct wined3d_cs *cs, struct wined3d_volume *volume) DECLSPEC_HIDDEN; + void wined3d_cs_emit_surface_cleanup(struct wined3d_cs *cs, struct wined3d_surface *surface) DECLSPEC_HIDDEN; + void wined3d_cs_emit_texture_cleanup(struct wined3d_cs *cs, struct wined3d_texture *texture) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_create_dummy_textures(struct wined3d_cs *cs) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0146-wined3d-Create-the-initial-context-through-the-CS.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0146-wined3d-Create-the-initial-context-through-the-CS.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0146-wined3d-Create-the-initial-context-through-the-CS.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0146-wined3d-Create-the-initial-context-through-the-CS.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,240 @@ +From f53a2f40f946d8e6c9d36de24010dc9d2f324de1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 10 Oct 2013 16:43:19 +0200 +Subject: wined3d: Create the initial context through the CS. + +Very hacky. +--- + dlls/wined3d/cs.c | 34 ++++++++++++ + dlls/wined3d/swapchain.c | 118 +++++++++++++++++++++++------------------ + dlls/wined3d/wined3d_private.h | 4 ++ + 3 files changed, 103 insertions(+), 53 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index fb1d1aa..3662432 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -88,6 +88,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_SURFACE_CLEANUP, + WINED3D_CS_OP_TEXTURE_CLEANUP, + WINED3D_CS_OP_CREATE_DUMMY_TEXTURES, ++ WINED3D_CS_OP_CREATE_SWAPCHAIN_CONTEXT, + WINED3D_CS_OP_STOP, + }; + +@@ -518,6 +519,13 @@ struct wined3d_cs_create_dummy_textures + enum wined3d_cs_op opcode; + }; + ++struct wined3d_cs_create_swapchain_context ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_swapchain *swapchain; ++ HRESULT *ret; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -2501,6 +2509,31 @@ void wined3d_cs_emit_create_dummy_textures(struct wined3d_cs *cs) + cs->ops->finish(cs); + } + ++static UINT wined3d_cs_exec_create_swapchain_context(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_create_swapchain_context *op = data; ++ ++ *op->ret = swapchain_create_context_cs(cs->device, op->swapchain); ++ ++ return sizeof(*op); ++} ++ ++HRESULT wined3d_cs_emit_create_swapchain_context(struct wined3d_cs *cs, struct wined3d_swapchain *swapchain) ++{ ++ HRESULT ret; ++ struct wined3d_cs_create_swapchain_context *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_CREATE_SWAPCHAIN_CONTEXT; ++ op->swapchain = swapchain; ++ op->ret = &ret; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++ cs->ops->finish(cs); ++ ++ return ret; ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2567,6 +2600,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_SURFACE_CLEANUP */ wined3d_cs_exec_surface_cleanup, + /* WINED3D_CS_OP_TEXTURE_CLEANUP */ wined3d_cs_exec_texture_cleanup, + /* WINED3D_CS_OP_CREATE_DUMMY_TEXTURES */ wined3d_cs_exec_create_dummy_textures, ++ /* WINED3D_CS_OP_CREATE_SWAPCHAIN_CONTEXT */ wined3d_cs_exec_create_swapchain_context, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +index 0a7b68d..8b9b13c 100644 +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -723,6 +723,69 @@ void swapchain_update_render_to_fbo(struct wined3d_swapchain *swapchain) + swapchain->render_to_fbo = TRUE; + } + ++HRESULT swapchain_create_context_cs(struct wined3d_device *device, struct wined3d_swapchain *swapchain) ++{ ++ const struct wined3d_adapter *adapter = device->adapter; ++ unsigned int i; ++ static const enum wined3d_format_id formats[] = ++ { ++ WINED3DFMT_D24_UNORM_S8_UINT, ++ WINED3DFMT_D32_UNORM, ++ WINED3DFMT_R24_UNORM_X8_TYPELESS, ++ WINED3DFMT_D16_UNORM, ++ WINED3DFMT_S1_UINT_D15_UNORM ++ }; ++ struct wined3d_surface *front_buffer; ++ const struct wined3d_gl_info *gl_info = &adapter->gl_info; ++ ++ swapchain->context = HeapAlloc(GetProcessHeap(), 0, sizeof(*swapchain->context)); ++ if (!swapchain->context) ++ { ++ ERR("Failed to create the context array.\n"); ++ return E_OUTOFMEMORY; ++ } ++ swapchain->num_contexts = 1; ++ ++ /* In WGL both color, depth and stencil are features of a pixel format. In case of D3D they are separate. ++ * You are able to add a depth + stencil surface at a later stage when you need it. ++ * In order to support this properly in WineD3D we need the ability to recreate the opengl context and ++ * drawable when this is required. This is very tricky as we need to reapply ALL opengl states for the new ++ * context, need torecreate shaders, textures and other resources. ++ * ++ * The context manager already takes care of the state problem and for the other tasks code from Reset ++ * can be used. These changes are way to risky during the 1.0 code freeze which is taking place right now. ++ * Likely a lot of other new bugs will be exposed. For that reason request a depth stencil surface all the ++ * time. It can cause a slight performance hit but fixes a lot of regressions. A fixme reminds of that this ++ * issue needs to be fixed. */ ++ front_buffer = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0)); ++ for (i = 0; i < (sizeof(formats) / sizeof(*formats)); i++) ++ { ++ swapchain->ds_format = wined3d_get_format(gl_info, formats[i]); ++ swapchain->context[0] = context_create(swapchain, front_buffer, swapchain->ds_format); ++ if (swapchain->context[0]) break; ++ TRACE("Depth stencil format %s is not supported, trying next format\n", ++ debug_d3dformat(formats[i])); ++ } ++ ++ if (!swapchain->context[0]) ++ { ++ WARN("Failed to create context.\n"); ++ HeapFree(GetProcessHeap(), 0, swapchain->context); ++ swapchain->context = NULL; ++ return WINED3DERR_NOTAVAILABLE; ++ } ++ ++ if (wined3d_settings.offscreen_rendering_mode != ORM_FBO ++ && (!swapchain->desc.enable_auto_depth_stencil ++ || swapchain->desc.auto_depth_stencil_format != swapchain->ds_format->id)) ++ { ++ FIXME("Add OpenGL context recreation support to context_validate_onscreen_formats\n"); ++ } ++ context_release(swapchain->context[0]); ++ ++ return WINED3D_OK; ++} ++ + static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3d_device *device, + struct wined3d_swapchain_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops) + { +@@ -847,60 +910,9 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3 + + if (!(device->wined3d->flags & WINED3D_NO3D)) + { +- static const enum wined3d_format_id formats[] = +- { +- WINED3DFMT_D24_UNORM_S8_UINT, +- WINED3DFMT_D32_UNORM, +- WINED3DFMT_R24_UNORM_X8_TYPELESS, +- WINED3DFMT_D16_UNORM, +- WINED3DFMT_S1_UINT_D15_UNORM +- }; +- +- const struct wined3d_gl_info *gl_info = &adapter->gl_info; +- +- swapchain->context = HeapAlloc(GetProcessHeap(), 0, sizeof(*swapchain->context)); +- if (!swapchain->context) +- { +- ERR("Failed to create the context array.\n"); +- hr = E_OUTOFMEMORY; +- goto err; +- } +- swapchain->num_contexts = 1; +- +- /* In WGL both color, depth and stencil are features of a pixel format. In case of D3D they are separate. +- * You are able to add a depth + stencil surface at a later stage when you need it. +- * In order to support this properly in WineD3D we need the ability to recreate the opengl context and +- * drawable when this is required. This is very tricky as we need to reapply ALL opengl states for the new +- * context, need torecreate shaders, textures and other resources. +- * +- * The context manager already takes care of the state problem and for the other tasks code from Reset +- * can be used. These changes are way to risky during the 1.0 code freeze which is taking place right now. +- * Likely a lot of other new bugs will be exposed. For that reason request a depth stencil surface all the +- * time. It can cause a slight performance hit but fixes a lot of regressions. A fixme reminds of that this +- * issue needs to be fixed. */ +- for (i = 0; i < (sizeof(formats) / sizeof(*formats)); i++) +- { +- swapchain->ds_format = wined3d_get_format(gl_info, formats[i]); +- swapchain->context[0] = context_create(swapchain, front_buffer, swapchain->ds_format); +- if (swapchain->context[0]) break; +- TRACE("Depth stencil format %s is not supported, trying next format\n", +- debug_d3dformat(formats[i])); +- } +- +- if (!swapchain->context[0]) +- { +- WARN("Failed to create context.\n"); +- hr = WINED3DERR_NOTAVAILABLE; ++ hr = wined3d_cs_emit_create_swapchain_context(device->cs, swapchain); ++ if (FAILED(hr)) + goto err; +- } +- +- if (wined3d_settings.offscreen_rendering_mode != ORM_FBO +- && (!desc->enable_auto_depth_stencil +- || swapchain->desc.auto_depth_stencil_format != swapchain->ds_format->id)) +- { +- FIXME("Add OpenGL context recreation support to context_validate_onscreen_formats\n"); +- } +- context_release(swapchain->context[0]); + } + + if (swapchain->desc.backbuffer_count > 0) +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index a4e1886..ab38f0e 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2716,6 +2716,8 @@ void wined3d_cs_emit_volume_cleanup(struct wined3d_cs *cs, struct wined3d_volume + void wined3d_cs_emit_surface_cleanup(struct wined3d_cs *cs, struct wined3d_surface *surface) DECLSPEC_HIDDEN; + void wined3d_cs_emit_texture_cleanup(struct wined3d_cs *cs, struct wined3d_texture *texture) DECLSPEC_HIDDEN; + void wined3d_cs_emit_create_dummy_textures(struct wined3d_cs *cs) DECLSPEC_HIDDEN; ++HRESULT wined3d_cs_emit_create_swapchain_context(struct wined3d_cs *cs, ++ struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +@@ -2900,6 +2902,8 @@ void swapchain_destroy_contexts(struct wined3d_swapchain *swapchain) DECLSPEC_HI + HDC swapchain_get_backup_dc(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; + void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; + void swapchain_update_render_to_fbo(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; ++HRESULT swapchain_create_context_cs(struct wined3d_device *device, ++ struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; + + /***************************************************************************** + * Utility function prototypes +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0147-wined3d-Recreate-ctx-and-dummy-textures-through-the-.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0147-wined3d-Recreate-ctx-and-dummy-textures-through-the-.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0147-wined3d-Recreate-ctx-and-dummy-textures-through-the-.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0147-wined3d-Recreate-ctx-and-dummy-textures-through-the-.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,62 @@ +From bc64eef6fb48de707d8d19cb604e748e207742e4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 10 Oct 2013 18:40:04 +0200 +Subject: wined3d: Recreate ctx and dummy textures through the CS after resets. + +--- + dlls/wined3d/device.c | 26 ++++---------------------- + 1 file changed, 4 insertions(+), 22 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 28b1c81..a113e21 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -4189,8 +4189,6 @@ static void delete_opengl_contexts(struct wined3d_device *device, struct wined3d + + static HRESULT create_primary_opengl_context(struct wined3d_device *device, struct wined3d_swapchain *swapchain) + { +- struct wined3d_context *context; +- struct wined3d_surface *target; + HRESULT hr; + + if (FAILED(hr = device->shader_backend->shader_alloc_private(device, +@@ -4207,32 +4205,16 @@ static HRESULT create_primary_opengl_context(struct wined3d_device *device, stru + return hr; + } + +- /* Recreate the primary swapchain's context */ +- swapchain->context = HeapAlloc(GetProcessHeap(), 0, sizeof(*swapchain->context)); +- if (!swapchain->context) +- { +- ERR("Failed to allocate memory for swapchain context array.\n"); +- device->blitter->free_private(device); +- device->shader_backend->shader_free_private(device); +- return E_OUTOFMEMORY; +- } +- +- target = swapchain->back_buffers +- ? surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)) +- : surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0)); +- if (!(context = context_create(swapchain, target, swapchain->ds_format))) ++ hr = wined3d_cs_emit_create_swapchain_context(device->cs, swapchain); ++ if (FAILED(hr)) + { + WARN("Failed to create context.\n"); + device->blitter->free_private(device); + device->shader_backend->shader_free_private(device); +- HeapFree(GetProcessHeap(), 0, swapchain->context); +- return E_FAIL; ++ return hr; + } + +- swapchain->context[0] = context; +- swapchain->num_contexts = 1; +- device_create_dummy_textures(device, context); +- context_release(context); ++ wined3d_cs_emit_create_dummy_textures(device->cs); + + return WINED3D_OK; + } +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0148-wined3d-Ignore-WINED3D_MAP_NO_DIRTY_UPDATE-in-resour.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0148-wined3d-Ignore-WINED3D_MAP_NO_DIRTY_UPDATE-in-resour.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0148-wined3d-Ignore-WINED3D_MAP_NO_DIRTY_UPDATE-in-resour.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0148-wined3d-Ignore-WINED3D_MAP_NO_DIRTY_UPDATE-in-resour.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,37 @@ +From 00632c0c269b313ecf484bf7aff6d61666d27ff9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 10 Oct 2013 19:18:06 +0200 +Subject: wined3d: Ignore WINED3D_MAP_NO_DIRTY_UPDATE in resource_map. + +TODO: This flag and add_dirty_rect need tests. + +The primary purpose of this patch is to fix a memory leak in World of +Warcraft. WoW uses WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_DISCARD on +sysmem surfaces. A new block of memory is allocated, but never assigned +to heap_mem because wined3d_cs_emit_resource_changed is not called. + +The bigger picture is that we don't know how this flag and AddDirtyRect +/ AddDirtyBox are supposed to work. Msdn mentions some interaction with +update_surface and update_texture, but personally I think it is more +likely that this functionality is used to update separate rectangles in +a texture, similar to what can be achieved by mapping a buffer twice. +--- + dlls/wined3d/resource.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index dd21986..805c6da 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -849,7 +849,7 @@ HRESULT wined3d_resource_map(struct wined3d_resource *resource, + } + } + +- if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY))) ++ if (!(flags & WINED3D_MAP_READONLY)) + resource->unmap_dirtify = TRUE; + + resource->map_count++; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0149-wined3d-Delete-GL-contexts-through-the-CS-in-reset.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0149-wined3d-Delete-GL-contexts-through-the-CS-in-reset.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0149-wined3d-Delete-GL-contexts-through-the-CS-in-reset.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0149-wined3d-Delete-GL-contexts-through-the-CS-in-reset.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,147 @@ +From 2fa4aafc16726b74a32cfcfae23d68749545114f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 11 Oct 2013 10:11:13 +0200 +Subject: wined3d: Delete GL contexts through the CS in reset. + +Let's see if this fixes the remaining fglrx crashes... +--- + dlls/wined3d/cs.c | 29 +++++++++++++++++++++++++++++ + dlls/wined3d/device.c | 26 +++++++++++++++----------- + dlls/wined3d/wined3d_private.h | 4 ++++ + 3 files changed, 48 insertions(+), 11 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 3662432..489fad0 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -89,6 +89,7 @@ enum wined3d_cs_op + WINED3D_CS_OP_TEXTURE_CLEANUP, + WINED3D_CS_OP_CREATE_DUMMY_TEXTURES, + WINED3D_CS_OP_CREATE_SWAPCHAIN_CONTEXT, ++ WINED3D_CS_OP_DELETE_GL_CONTEXTS, + WINED3D_CS_OP_STOP, + }; + +@@ -526,6 +527,12 @@ struct wined3d_cs_create_swapchain_context + HRESULT *ret; + }; + ++struct wined3d_cs_delete_gl_contexts ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_swapchain *swapchain; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -2534,6 +2541,27 @@ HRESULT wined3d_cs_emit_create_swapchain_context(struct wined3d_cs *cs, struct w + return ret; + } + ++static UINT wined3d_cs_exec_delete_gl_contexts(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_delete_gl_contexts *op = data; ++ ++ device_delete_opengl_contexts_cs(cs->device, op->swapchain); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_delete_opengl_contexts(struct wined3d_cs *cs, struct wined3d_swapchain *swapchain) ++{ ++ struct wined3d_cs_delete_gl_contexts *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_DELETE_GL_CONTEXTS; ++ op->swapchain = swapchain; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++ cs->ops->finish(cs); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2601,6 +2629,7 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_TEXTURE_CLEANUP */ wined3d_cs_exec_texture_cleanup, + /* WINED3D_CS_OP_CREATE_DUMMY_TEXTURES */ wined3d_cs_exec_create_dummy_textures, + /* WINED3D_CS_OP_CREATE_SWAPCHAIN_CONTEXT */ wined3d_cs_exec_create_swapchain_context, ++ /* WINED3D_CS_OP_DELETE_GL_CONTEXTS */ wined3d_cs_exec_delete_gl_contexts, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index a113e21..b96f20f 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -4142,22 +4142,12 @@ void CDECL wined3d_device_evict_managed_resources(struct wined3d_device *device) + } + } + +-static void delete_opengl_contexts(struct wined3d_device *device, struct wined3d_swapchain *swapchain) ++void device_delete_opengl_contexts_cs(struct wined3d_device *device, struct wined3d_swapchain *swapchain) + { +- struct wined3d_resource *resource, *cursor; + const struct wined3d_gl_info *gl_info; + struct wined3d_context *context; + struct wined3d_shader *shader; + +- LIST_FOR_EACH_ENTRY_SAFE(resource, cursor, &device->resources, struct wined3d_resource, resource_list_entry) +- { +- TRACE("Unloading resource %p.\n", resource); +- +- wined3d_cs_emit_evict_resource(device->cs, resource); +- } +- if (wined3d_settings.cs_multithreaded) +- device->cs->ops->finish(device->cs); +- + LIST_FOR_EACH_ENTRY(shader, &device->shaders, struct wined3d_shader, shader_list_entry) + { + device->shader_backend->shader_destroy(shader); +@@ -4187,6 +4177,20 @@ static void delete_opengl_contexts(struct wined3d_device *device, struct wined3d + swapchain->context = NULL; + } + ++static void delete_opengl_contexts(struct wined3d_device *device, struct wined3d_swapchain *swapchain) ++{ ++ struct wined3d_resource *resource, *cursor; ++ ++ LIST_FOR_EACH_ENTRY_SAFE(resource, cursor, &device->resources, struct wined3d_resource, resource_list_entry) ++ { ++ TRACE("Unloading resource %p.\n", resource); ++ ++ wined3d_cs_emit_evict_resource(device->cs, resource); ++ } ++ ++ wined3d_cs_emit_delete_opengl_contexts(device->cs, swapchain); ++} ++ + static HRESULT create_primary_opengl_context(struct wined3d_device *device, struct wined3d_swapchain *swapchain) + { + HRESULT hr; +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index ab38f0e..2f7dd75 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2077,6 +2077,8 @@ struct wined3d_gl_bo *wined3d_device_get_bo(struct wined3d_device *device, UINT + void wined3d_device_release_bo(struct wined3d_device *device, struct wined3d_gl_bo *bo, + const struct wined3d_context *context) DECLSPEC_HIDDEN; + void device_create_dummy_textures(struct wined3d_device *device, struct wined3d_context *context) DECLSPEC_HIDDEN; ++void device_delete_opengl_contexts_cs(struct wined3d_device *device, ++ struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; + + static inline BOOL isStateDirty(const struct wined3d_context *context, DWORD state) + { +@@ -2718,6 +2720,8 @@ void wined3d_cs_emit_texture_cleanup(struct wined3d_cs *cs, struct wined3d_textu + void wined3d_cs_emit_create_dummy_textures(struct wined3d_cs *cs) DECLSPEC_HIDDEN; + HRESULT wined3d_cs_emit_create_swapchain_context(struct wined3d_cs *cs, + struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_delete_opengl_contexts(struct wined3d_cs *cs, ++ struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0150-wined3d-Delete-GL-contexts-through-the-CS-in-uninit_.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0150-wined3d-Delete-GL-contexts-through-the-CS-in-uninit_.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0150-wined3d-Delete-GL-contexts-through-the-CS-in-uninit_.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0150-wined3d-Delete-GL-contexts-through-the-CS-in-uninit_.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,79 @@ +From cdfd2659beba10a60a6535bb489c976b97f28ec5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 11 Oct 2013 10:17:42 +0200 +Subject: wined3d: Delete GL contexts through the CS in uninit_3d. + +--- + dlls/wined3d/device.c | 27 ++------------------------- + 1 file changed, 2 insertions(+), 25 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index b96f20f..278bbdc 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -997,8 +997,6 @@ err_out: + HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device) + { + struct wined3d_resource *resource, *cursor; +- const struct wined3d_gl_info *gl_info; +- struct wined3d_context *context; + struct wined3d_surface *surface; + UINT i; + +@@ -1010,12 +1008,6 @@ HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device) + if (wined3d_settings.cs_multithreaded) + device->cs->ops->finish(device->cs); + +- /* I don't think that the interface guarantees that the device is destroyed from the same thread +- * it was created. Thus make sure a context is active for the glDelete* calls +- */ +- context = context_acquire(device, NULL); +- gl_info = context->gl_info; +- + if (device->logo_texture) + wined3d_texture_decref(device->logo_texture); + +@@ -1045,22 +1037,8 @@ HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device) + TRACE("Unloading resource %p.\n", resource); + wined3d_cs_emit_evict_resource(device->cs, resource); + } +- if (wined3d_settings.cs_multithreaded) +- device->cs->ops->finish(device->cs); +- +- /* Destroy the depth blt resources, they will be invalid after the reset. Also free shader +- * private data, it might contain opengl pointers +- */ +- if (device->depth_blt_texture) +- { +- gl_info->gl_ops.gl.p_glDeleteTextures(1, &device->depth_blt_texture); +- device->depth_blt_texture = 0; +- } + +- /* Destroy the shader backend. Note that this has to happen after all shaders are destroyed. */ +- device->blitter->free_private(device); +- device->shader_backend->shader_free_private(device); +- destroy_dummy_textures(device, gl_info); ++ wined3d_cs_emit_delete_opengl_contexts(device->cs, device->swapchains[0]); + + if (device->back_buffer_view) + { +@@ -1068,8 +1046,6 @@ HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device) + device->back_buffer_view = NULL; + } + +- context_release(context); +- + for (i = 0; i < device->swapchain_count; ++i) + { + TRACE("Releasing the implicit swapchain %u.\n", i); +@@ -4175,6 +4151,7 @@ void device_delete_opengl_contexts_cs(struct wined3d_device *device, struct wine + + HeapFree(GetProcessHeap(), 0, swapchain->context); + swapchain->context = NULL; ++ swapchain->num_contexts = 0; + } + + static void delete_opengl_contexts(struct wined3d_device *device, struct wined3d_swapchain *swapchain) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0151-wined3d-Invoke-surface_unload-through-the-CS-in-wine.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0151-wined3d-Invoke-surface_unload-through-the-CS-in-wine.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0151-wined3d-Invoke-surface_unload-through-the-CS-in-wine.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0151-wined3d-Invoke-surface_unload-through-the-CS-in-wine.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,31 @@ +From 210ed15c0132830fe2a6b4bf422fdc794982cf9c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 11 Oct 2013 12:09:37 +0200 +Subject: wined3d: Invoke surface_unload through the CS in + wined3d_surface_update_desc. + +This fixes another case where we use a GL context in the main thread and +crash fglrx in doing so. +--- + dlls/wined3d/texture.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index f055d5e..09ac38f 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -769,7 +769,10 @@ HRESULT CDECL wined3d_texture_update_desc(struct wined3d_texture *texture, UINT + } + + if (device->d3d_initialized) +- texture->resource.resource_ops->resource_unload(&texture->resource); ++ { ++ wined3d_cs_emit_evict_resource(device->cs, &surface->resource); ++ device->cs->ops->finish(device->cs); ++ } + + texture->resource.format = format; + texture->resource.multisample_type = multisample_type; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0152-wined3d-Use-an-event-to-block-the-worker-thread-when.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0152-wined3d-Use-an-event-to-block-the-worker-thread-when.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0152-wined3d-Use-an-event-to-block-the-worker-thread-when.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0152-wined3d-Use-an-event-to-block-the-worker-thread-when.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,177 @@ +From e18809d8ea1a9d47a592c91d3bfb703a5df08ac2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 24 Oct 2013 18:56:13 +0200 +Subject: wined3d: Use an event to block the worker thread when it is idle. + +I could not find a canonical implementation for this. Suggestions are +welcome. + +The main goal was to avoid SetEvent / WaitForSingleObject / ResetEvent +calls at all costs. They go straight to wineserver, bringing it to 25% +CPU time and cutting framerates in half. Hence the extra BOOL to tell +cs_submit when to set the event. + +Finding the correct spin count is tricky. The value I set is high enough +to prevent 3DMark2001 car chase high detail from waiting. This benchmark +maps a lot of in-use managed buffers and thus waits for the CS. But what +the ideal number is depends a lot on the game and CPU. + +A better heuristic is needed. E.g. we could tell the worker thread when +the main thread is waiting for a resource to become idle and avoid +waiting for the event in that case. We may have to use POSIX +synchronization primitives for efficiency. On the other hand, the +current implementation probably still spins way too much for an +application that throttles the framerate to 30 fps by waiting in its own +code. So it is probably only good enough for Microsoft Powerpoint. + +We should also think about blocking the main thread with events if it is +waiting for the worker thread when waiting for resources, the swap +counter or space in the command Stream. This should preserve power when +vsync is turned on. +--- + dlls/wined3d/cs.c | 51 +++++++++++++++++++++++++++++++++++++++--- + dlls/wined3d/wined3d_private.h | 5 +++++ + 2 files changed, 53 insertions(+), 3 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 489fad0..8cbca6c 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -539,6 +539,9 @@ static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + /* There is only one thread writing to queue.head, InterlockedExchange + * is used for the memory barrier. */ + InterlockedExchange(&cs->queue.head, new_val); ++ ++ if (InterlockedCompareExchange(&cs->waiting_for_event, FALSE, TRUE)) ++ SetEvent(cs->event); + } + + static void wined3d_cs_mt_submit_prio(struct wined3d_cs *cs, size_t size) +@@ -547,6 +550,9 @@ static void wined3d_cs_mt_submit_prio(struct wined3d_cs *cs, size_t size) + /* There is only one thread writing to queue.head, InterlockedExchange + * is used for the memory barrier. */ + InterlockedExchange(&cs->prio_queue.head, new_val); ++ ++ if (InterlockedCompareExchange(&cs->waiting_for_event, FALSE, TRUE)) ++ SetEvent(cs->event); + } + + static UINT wined3d_cs_exec_nop(struct wined3d_cs *cs, const void *data) +@@ -2826,6 +2832,34 @@ static inline void poll_queries(struct wined3d_cs *cs) + } + } + ++static inline BOOL queue_is_empty(const struct wined3d_cs_queue *queue) ++{ ++ return *((volatile LONG *)&queue->head) == queue->tail; ++} ++ ++static void wined3d_cs_wait_event(struct wined3d_cs *cs) ++{ ++ InterlockedExchange(&cs->waiting_for_event, TRUE); ++ ++ /* The main thread might enqueue a finish command and block on it ++ * after the worker thread decided to enter wined3d_cs_wait_event ++ * and before waiting_for_event was set to TRUE. Check again if ++ * the queues are empty */ ++ if (!queue_is_empty(&cs->prio_queue) || !queue_is_empty(&cs->queue)) ++ { ++ /* The main thread might have signalled the event, or be in the process ++ * of doing so. Wait for the event to reset it. ResetEvent is not good ++ * because the main thread might be beween the waiting_for_event reset ++ * and SignalEvent call. */ ++ if (!InterlockedCompareExchange(&cs->waiting_for_event, FALSE, FALSE)) ++ WaitForSingleObject(cs->event, INFINITE); ++ } ++ else ++ { ++ WaitForSingleObject(cs->event, INFINITE); ++ } ++} ++ + static DWORD WINAPI wined3d_cs_run(void *thread_param) + { + struct wined3d_cs *cs = thread_param; +@@ -2833,6 +2867,7 @@ static DWORD WINAPI wined3d_cs_run(void *thread_param) + LONG tail; + char poll = 0; + struct wined3d_cs_queue *queue; ++ unsigned int spin_count = 0; + + TRACE("Started.\n"); + +@@ -2848,21 +2883,27 @@ static DWORD WINAPI wined3d_cs_run(void *thread_param) + else + poll++; + +- if (*((volatile LONG *)&cs->prio_queue.head) != cs->prio_queue.tail) ++ if (!queue_is_empty(&cs->prio_queue)) + { + queue = &cs->prio_queue; + } +- else if (*((volatile LONG *)&cs->queue.head) != cs->queue.tail) ++ else if (!queue_is_empty(&cs->queue)) + { + queue = &cs->queue; +- if (*((volatile LONG *)&cs->prio_queue.head) != cs->prio_queue.tail) ++ if (!queue_is_empty(&cs->prio_queue)) + queue = &cs->prio_queue; + } + else + { ++ spin_count++; ++ if (spin_count >= WINED3D_CS_SPIN_COUNT && list_empty(&cs->query_poll_list)) ++ wined3d_cs_wait_event(cs); ++ + continue; + } + ++ spin_count = 0; ++ + tail = queue->tail; + opcode = *(const enum wined3d_cs_op *)&queue->data[tail]; + +@@ -2904,6 +2945,8 @@ struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) + { + cs->ops = &wined3d_cs_mt_ops; + ++ cs->event = CreateEventW(NULL, FALSE, FALSE, NULL); ++ + if (!(cs->thread = CreateThread(NULL, 0, wined3d_cs_run, cs, 0, NULL))) + { + ERR("Failed to create wined3d command stream thread.\n"); +@@ -2934,6 +2977,8 @@ void wined3d_cs_destroy(struct wined3d_cs *cs) + CloseHandle(cs->thread); + if (ret != WAIT_OBJECT_0) + ERR("Wait failed (%#x).\n", ret); ++ if (!CloseHandle(cs->event)) ++ ERR("Closing event failed.\n"); + } + + HeapFree(GetProcessHeap(), 0, cs); +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 2f7dd75..63b67da 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2583,6 +2583,8 @@ struct wined3d_cs_list + }; + + #define WINED3D_CS_QUEUE_SIZE 0x100000 ++#define WINED3D_CS_SPIN_COUNT 10000000 ++ + struct wined3d_cs_queue + { + LONG head, tail; +@@ -2612,6 +2614,9 @@ struct wined3d_cs + + LONG pending_presents; + struct list query_poll_list; ++ ++ HANDLE event; ++ BOOL waiting_for_event; + }; + + struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0153-wined3d-Fence-preload-operations.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0153-wined3d-Fence-preload-operations.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0153-wined3d-Fence-preload-operations.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0153-wined3d-Fence-preload-operations.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,89 @@ +From 4a770e26268a89e0f211b42dfdd857f3180bb73e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 24 Oct 2013 22:38:26 +0200 +Subject: wined3d: Fence preload operations. + +Otherwise texture data might get lost, thanks to surface/volume_evict_sysmem: + +1) preload(texture) +2) map(texture) + -> Loads sysmem / sets it with discard map. +3) unmap(texture) + -> enqueues a resource_changed operation +4) preload is executed. + -> Uploads data written in 3. Discards sysmem. Questionable if + DISCARD was passed, but without it, no harm done. + -> texture is only up to date location. +5) resource_changed executed. + -> Discards texture. + +And data is lost. This patch prevents that by stalling the map until the +PreLoad is done. + +What's left open is finding out why anyone (I'm looking at you EVE +online) preloads a texture right before mapping it... +--- + dlls/wined3d/cs.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 8cbca6c..b152a0d 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -2145,6 +2145,8 @@ static UINT wined3d_cs_exec_texture_preload(struct wined3d_cs *cs, const void *d + wined3d_texture_load(texture, context, texture->flags & WINED3D_TEXTURE_IS_SRGB); + context_release(context); + ++ wined3d_resource_dec_fence(&texture->resource); ++ + return sizeof(*op); + } + +@@ -2156,6 +2158,8 @@ void wined3d_cs_emit_texture_preload(struct wined3d_cs *cs, struct wined3d_textu + op->opcode = WINED3D_CS_OP_TEXTURE_PRELOAD; + op->texture = texture; + ++ wined3d_resource_inc_fence(&texture->resource); ++ + cs->ops->submit(cs, sizeof(*op)); + } + +@@ -2168,6 +2172,8 @@ static UINT wined3d_cs_exec_surface_preload(struct wined3d_cs *cs, const void *d + wined3d_texture_preload(op->surface->container); + context_release(context); + ++ wined3d_resource_dec_fence(&op->surface->container->resource); ++ + return sizeof(*op); + } + +@@ -2179,6 +2185,8 @@ void wined3d_cs_emit_surface_preload(struct wined3d_cs *cs, struct wined3d_surfa + op->opcode = WINED3D_CS_OP_SURFACE_PRELOAD; + op->surface = surface; + ++ wined3d_resource_inc_fence(&op->surface->container->resource); ++ + cs->ops->submit(cs, sizeof(*op)); + } + +@@ -2300,6 +2308,8 @@ static UINT wined3d_cs_exec_buffer_preload(struct wined3d_cs *cs, const void *da + buffer_internal_preload(op->buffer, context, NULL); + context_release(context); + ++ wined3d_resource_dec_fence(&op->buffer->resource); ++ + return sizeof(*op); + } + +@@ -2311,6 +2321,8 @@ void wined3d_cs_emit_buffer_preload(struct wined3d_cs *cs, struct wined3d_buffer + op->opcode = WINED3D_CS_OP_BUFFER_PRELOAD; + op->buffer = buffer; + ++ wined3d_resource_inc_fence(&buffer->resource); ++ + cs->ops->submit(cs, sizeof(*op)); + } + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0154-d3d8-tests-D3DLOCK_NO_DIRTY_UPDATE-on-managed-textur.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0154-d3d8-tests-D3DLOCK_NO_DIRTY_UPDATE-on-managed-textur.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0154-d3d8-tests-D3DLOCK_NO_DIRTY_UPDATE-on-managed-textur.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0154-d3d8-tests-D3DLOCK_NO_DIRTY_UPDATE-on-managed-textur.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,26 @@ +From c8083ad9f76ddba995df169c8b2f3486e81bbe02 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 20 Nov 2013 18:04:50 +0100 +Subject: d3d8/tests: D3DLOCK_NO_DIRTY_UPDATE on managed textures is + temporarily broken. + +--- + dlls/d3d8/tests/visual.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/dlls/d3d8/tests/visual.c b/dlls/d3d8/tests/visual.c +index a8a771e..9535b69 100644 +--- a/dlls/d3d8/tests/visual.c ++++ b/dlls/d3d8/tests/visual.c +@@ -4998,7 +4998,7 @@ static void add_dirty_rect_test(void) + fill_surface(surface_managed, 0x0000ff00, D3DLOCK_NO_DIRTY_UPDATE); + add_dirty_rect_test_draw(device); + color = getPixelColor(device, 320, 240); +- ok(color_match(color, 0x00ff0000, 1), ++ todo_wine ok(color_match(color, 0x00ff0000, 1), + "Expected color 0x00ff0000, got 0x%08x.\n", color); + hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL); + ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0155-d3d9-tests-D3DLOCK_NO_DIRTY_UPDATE-on-managed-textur.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0155-d3d9-tests-D3DLOCK_NO_DIRTY_UPDATE-on-managed-textur.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0155-d3d9-tests-D3DLOCK_NO_DIRTY_UPDATE-on-managed-textur.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0155-d3d9-tests-D3DLOCK_NO_DIRTY_UPDATE-on-managed-textur.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,26 @@ +From 1bdcaa3e831f627806a00a07fb92ef28502c4f7a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 20 Nov 2013 18:06:02 +0100 +Subject: d3d9/tests: D3DLOCK_NO_DIRTY_UPDATE on managed textures is + temporarily broken. + +--- + dlls/d3d9/tests/visual.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c +index d1aa3d4..6b28d14 100644 +--- a/dlls/d3d9/tests/visual.c ++++ b/dlls/d3d9/tests/visual.c +@@ -16457,7 +16457,7 @@ static void add_dirty_rect_test(void) + fill_surface(surface_managed, 0x0000ff00, D3DLOCK_NO_DIRTY_UPDATE); + add_dirty_rect_test_draw(device); + color = getPixelColor(device, 320, 240); +- ok(color_match(color, 0x00ff0000, 1), ++ todo_wine ok(color_match(color, 0x00ff0000, 1), + "Expected color 0x00ff0000, got 0x%08x.\n", color); + hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); + ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0156-wined3d-Completely-reset-the-state-on-reset.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0156-wined3d-Completely-reset-the-state-on-reset.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0156-wined3d-Completely-reset-the-state-on-reset.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0156-wined3d-Completely-reset-the-state-on-reset.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,24 @@ +From eb14a8f5c8dc07cda57b588e11f4b3381a340dcb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 10 Jan 2014 17:57:03 +0100 +Subject: wined3d: Completely reset the state on reset. + +--- + dlls/wined3d/device.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 278bbdc..62b0625 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -4531,6 +4531,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, + } + wined3d_cs_emit_reset_state(device->cs); + state_cleanup(&device->state); ++ memset(&device->state, 0, sizeof(device->state)); + + if (device->d3d_initialized) + delete_opengl_contexts(device, swapchain); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0157-wined3d-Send-getdc-and-releasedc-through-the-command.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0157-wined3d-Send-getdc-and-releasedc-through-the-command.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0157-wined3d-Send-getdc-and-releasedc-through-the-command.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0157-wined3d-Send-getdc-and-releasedc-through-the-command.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,274 @@ +From 09b215acf85da6b34638c3454ff3d8e00d29ab07 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Sun, 16 Mar 2014 14:13:42 +0100 +Subject: wined3d: Send getdc and releasedc through the command stream. + +As with the palette patch just a cheap workaround for a context +activation bug I just regret that I didn't describe more verbously +earlier. I forgot what it was about exactly and can't be bothered to +investigate atm. +--- + dlls/wined3d/cs.c | 58 +++++++++++++++++++++++++ + dlls/wined3d/surface.c | 96 +++++++++++++++++++++--------------------- + dlls/wined3d/wined3d_private.h | 4 ++ + 3 files changed, 110 insertions(+), 48 deletions(-) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index b152a0d..44930c1 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -90,6 +90,8 @@ enum wined3d_cs_op + WINED3D_CS_OP_CREATE_DUMMY_TEXTURES, + WINED3D_CS_OP_CREATE_SWAPCHAIN_CONTEXT, + WINED3D_CS_OP_DELETE_GL_CONTEXTS, ++ WINED3D_CS_OP_GETDC, ++ WINED3D_CS_OP_RELEASEDC, + WINED3D_CS_OP_STOP, + }; + +@@ -533,6 +535,18 @@ struct wined3d_cs_delete_gl_contexts + struct wined3d_swapchain *swapchain; + }; + ++struct wined3d_cs_getdc ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_surface *surface; ++}; ++ ++struct wined3d_cs_releasedc ++{ ++ enum wined3d_cs_op opcode; ++ struct wined3d_surface *surface; ++}; ++ + static void wined3d_cs_mt_submit(struct wined3d_cs *cs, size_t size) + { + LONG new_val = (cs->queue.head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +@@ -2580,6 +2594,48 @@ void wined3d_cs_emit_delete_opengl_contexts(struct wined3d_cs *cs, struct wined3 + cs->ops->finish(cs); + } + ++static UINT wined3d_cs_exec_getdc(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_getdc *op = data; ++ ++ wined3d_surface_getdc_cs(op->surface); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_getdc(struct wined3d_cs *cs, struct wined3d_surface *surface) ++{ ++ struct wined3d_cs_getdc *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_GETDC; ++ op->surface = surface; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++ cs->ops->finish(cs); ++} ++ ++static UINT wined3d_cs_exec_releasedc(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_releasedc *op = data; ++ ++ wined3d_surface_releasedc_cs(op->surface); ++ ++ return sizeof(*op); ++} ++ ++void wined3d_cs_emit_releasedc(struct wined3d_cs *cs, struct wined3d_surface *surface) ++{ ++ struct wined3d_cs_releasedc *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_RELEASEDC; ++ op->surface = surface; ++ ++ cs->ops->submit(cs, sizeof(*op)); ++ cs->ops->finish(cs); ++} ++ + static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = + { + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, +@@ -2648,6 +2704,8 @@ static UINT (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void + /* WINED3D_CS_OP_CREATE_DUMMY_TEXTURES */ wined3d_cs_exec_create_dummy_textures, + /* WINED3D_CS_OP_CREATE_SWAPCHAIN_CONTEXT */ wined3d_cs_exec_create_swapchain_context, + /* WINED3D_CS_OP_DELETE_GL_CONTEXTS */ wined3d_cs_exec_delete_gl_contexts, ++ /* WINED3D_CS_OP_GETDC */ wined3d_cs_exec_getdc, ++ /* WINED3D_CS_OP_RELEASEDC */ wined3d_cs_exec_releasedc, + }; + + static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 3c5489f..1ccbe35 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -2468,48 +2468,23 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, + return wined3d_resource_map(&surface->resource, map_desc, rect ? &box : NULL, flags); + } + +-HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc) ++void wined3d_surface_getdc_cs(struct wined3d_surface *surface) + { +- HRESULT hr; + struct wined3d_device *device = surface->resource.device; + struct wined3d_context *context = NULL; + +- TRACE("surface %p, dc %p.\n", surface, dc); +- +- if (!(surface->resource.format->flags & WINED3DFMT_FLAG_GETDC)) +- { +- WARN("Cannot use GetDC on a %s surface.\n", debug_d3dformat(surface->resource.format->id)); +- return WINED3DERR_INVALIDCALL; +- } +- +- if (wined3d_settings.cs_multithreaded) +- { +- struct wined3d_device *device = surface->resource.device; +- FIXME("Waiting for cs.\n"); +- wined3d_cs_emit_glfinish(device->cs); +- device->cs->ops->finish(device->cs); +- } +- +- /* Give more detailed info for ddraw. */ +- if (surface->flags & SFLAG_DCINUSE) +- return WINEDDERR_DCALREADYCREATED; +- +- /* Can't GetDC if the surface is locked. */ +- if (surface->resource.map_count) +- return WINED3DERR_INVALIDCALL; +- + if (device->d3d_initialized) + context = context_acquire(surface->resource.device, NULL); + + /* Create a DIB section if there isn't a dc yet. */ + if (!surface->hDC) + { +- hr = surface_create_dib_section(surface); ++ HRESULT hr = surface_create_dib_section(surface); + if (FAILED(hr)) + { + if (context) + context_release(context); +- return WINED3DERR_INVALIDCALL; ++ return; + } + if (!(surface->resource.map_binding == WINED3D_LOCATION_USER_MEMORY + || surface->container->flags & WINED3D_TEXTURE_PIN_SYSMEM +@@ -2522,35 +2497,40 @@ HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc) + + if (context) + context_release(context); +- +- surface->flags |= SFLAG_DCINUSE; +- surface->resource.map_count++; +- +- *dc = surface->hDC; +- TRACE("Returning dc %p.\n", *dc); +- +- return WINED3D_OK; + } + +-HRESULT CDECL wined3d_surface_releasedc(struct wined3d_surface *surface, HDC dc) ++HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc) + { +- TRACE("surface %p, dc %p.\n", surface, dc); ++ struct wined3d_device *device = surface->resource.device; + +- if (!(surface->flags & SFLAG_DCINUSE)) +- return WINEDDERR_NODC; ++ TRACE("surface %p, dc %p.\n", surface, dc); + +- if (surface->hDC != dc) ++ if (!(surface->resource.format->flags & WINED3DFMT_FLAG_GETDC)) + { +- WARN("Application tries to release invalid DC %p, surface DC is %p.\n", +- dc, surface->hDC); +- return WINEDDERR_NODC; ++ WARN("Cannot use GetDC on a %s surface.\n", debug_d3dformat(surface->resource.format->id)); ++ return WINED3DERR_INVALIDCALL; + } + +- surface->resource.map_count--; +- surface->flags &= ~SFLAG_DCINUSE; ++ /* Give more detailed info for ddraw. */ ++ if (surface->flags & SFLAG_DCINUSE) ++ return WINEDDERR_DCALREADYCREATED; ++ ++ /* Can't GetDC if the surface is locked. */ ++ if (surface->resource.map_count) ++ return WINED3DERR_INVALIDCALL; ++ ++ surface->flags |= SFLAG_DCINUSE; ++ surface->resource.map_count++; ++ wined3d_cs_emit_getdc(device->cs, surface); ++ *dc = surface->hDC; ++ TRACE("Returning dc %p.\n", *dc); ++ ++ return *dc ? WINED3D_OK : WINED3DERR_INVALIDCALL; ++} + +- if (surface->resource.map_binding == WINED3D_LOCATION_USER_MEMORY +- || (surface->container->flags & WINED3D_TEXTURE_PIN_SYSMEM ++void wined3d_surface_releasedc_cs(struct wined3d_surface *surface) ++{ ++ if (surface->resource.map_binding == WINED3D_LOCATION_USER_MEMORY || (surface->container->flags & WINED3D_TEXTURE_PIN_SYSMEM + && surface->resource.map_binding != WINED3D_LOCATION_DIB)) + { + /* The game Salammbo modifies the surface contents without mapping the surface between +@@ -2571,6 +2551,26 @@ HRESULT CDECL wined3d_surface_releasedc(struct wined3d_surface *surface, HDC dc) + if (context) + context_release(context); + } ++} ++ ++HRESULT CDECL wined3d_surface_releasedc(struct wined3d_surface *surface, HDC dc) ++{ ++ TRACE("surface %p, dc %p.\n", surface, dc); ++ ++ if (!(surface->flags & SFLAG_DCINUSE)) ++ return WINEDDERR_NODC; ++ ++ if (surface->hDC != dc) ++ { ++ WARN("Application tries to release invalid DC %p, surface DC is %p.\n", ++ dc, surface->hDC); ++ return WINEDDERR_NODC; ++ } ++ ++ surface->resource.map_count--; ++ surface->flags &= ~SFLAG_DCINUSE; ++ ++ wined3d_cs_emit_releasedc(surface->resource.device->cs, surface); + + return WINED3D_OK; + } +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 63b67da..3abd0a8 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2458,6 +2458,8 @@ void surface_blt_ugly(struct wined3d_surface *dst_surface, const RECT *dst_rect_ + const WINEDDBLTFX *fx, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; + BOOL surface_check_block_align(struct wined3d_surface *surface, const RECT *rect) DECLSPEC_HIDDEN; + void wined3d_surface_cleanup_cs(struct wined3d_surface *surface) DECLSPEC_HIDDEN; ++void wined3d_surface_getdc_cs(struct wined3d_surface *surface) DECLSPEC_HIDDEN; ++void wined3d_surface_releasedc_cs(struct wined3d_surface *surface) DECLSPEC_HIDDEN; + + void draw_textured_quad(const struct wined3d_surface *src_surface, struct wined3d_context *context, + const RECT *src_rect, const RECT *dst_rect, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; +@@ -2727,6 +2729,8 @@ HRESULT wined3d_cs_emit_create_swapchain_context(struct wined3d_cs *cs, + struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; + void wined3d_cs_emit_delete_opengl_contexts(struct wined3d_cs *cs, + struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_getdc(struct wined3d_cs *cs, struct wined3d_surface *surface) DECLSPEC_HIDDEN; ++void wined3d_cs_emit_releasedc(struct wined3d_cs *cs, struct wined3d_surface *surface) DECLSPEC_HIDDEN; + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0158-wined3d-Set-map_heap_memory-NULL-when-allocating-a-P.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0158-wined3d-Set-map_heap_memory-NULL-when-allocating-a-P.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0158-wined3d-Set-map_heap_memory-NULL-when-allocating-a-P.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0158-wined3d-Set-map_heap_memory-NULL-when-allocating-a-P.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,31 @@ +From 95b883bf187904f5cdd00dbf360ebd444b455a63 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 5 Jun 2014 13:07:27 +0200 +Subject: wined3d: Set map_heap_memory = NULL when allocating a PBO. + +Otherwise the next unmap will re-assign it with the resource_changed +message. Freeing the actual memory and setting the read pointer to 0 is +the task of the worker thread. + +Wined3d_resource_prepare_bo is only called if the map binding is +LOCATION_BUFFER, and map_heap_memory is only used if the map binding is +LOCATION_SYSMEM. +--- + dlls/wined3d/resource.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 805c6da..8069160 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -585,6 +585,7 @@ static void wined3d_resource_prepare_bo(struct wined3d_resource *resource, struc + GL_STREAM_DRAW_ARB, GL_PIXEL_UNPACK_BUFFER_ARB, context); + resource->map_buffer = resource->buffer; + TRACE("Created GL buffer %u for resource %p.\n", resource->buffer->name, resource); ++ resource->map_heap_memory = NULL; + } + + BOOL wined3d_resource_prepare_system_memory(struct wined3d_resource *resource) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0159-wined3d-Wait-only-for-the-buffer-to-be-idle.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0159-wined3d-Wait-only-for-the-buffer-to-be-idle.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0159-wined3d-Wait-only-for-the-buffer-to-be-idle.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0159-wined3d-Wait-only-for-the-buffer-to-be-idle.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,27 @@ +From 82ec316a058cc2e1894fb64eee1249ff663f112e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 22 Aug 2014 15:52:50 +0200 +Subject: wined3d: Wait only for the buffer to be idle. + +This got lost somewhere during the patch reordering. +--- + dlls/wined3d/buffer.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index 15ed760..c0f96e3 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -1051,8 +1051,7 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + } + else if(!(flags & (WINED3D_MAP_NOOVERWRITE | WINED3D_MAP_READONLY))) + { +- FIXME("waiting for cs, flags 0x%04x.\n", flags); +- device->cs->ops->finish(device->cs); ++ wined3d_resource_wait_fence(&buffer->resource); + } + } + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0160-wined3d-Add-a-comment-about-worker-thread-lag.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0160-wined3d-Add-a-comment-about-worker-thread-lag.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0160-wined3d-Add-a-comment-about-worker-thread-lag.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0160-wined3d-Add-a-comment-about-worker-thread-lag.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,31 @@ +From 7cfd19b8d052ed99f3060d5cab1349ec33e162ad Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Mon, 25 Aug 2014 19:57:42 +0200 +Subject: wined3d: Add a comment about worker thread lag. + +--- + dlls/wined3d/cs.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +index 44930c1..9b890ae 100644 +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -677,6 +677,14 @@ void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *sw + + cs->ops->submit(cs, sizeof(*op)); + ++ /* D3D10 documentation suggests that Windows allows the game to run ++ * 3 frames ahead of the GPU. Increasing this above 1 causes uneven ++ * animation in some games, most notably StarCraft II. The framerates ++ * don't show this problem. The issue is more noticable with vsync ++ * on, but also happens with vsync off. ++ * ++ * In Counter-Strike: Source a frame difference of 3 causes noticable ++ * input delay that makes the game unplayable. */ + while (pending > 1) + pending = InterlockedCompareExchange(&cs->pending_presents, 0, 0); + } +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0161-wined3d-Remove-the-texture-destroy-glFinish.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0161-wined3d-Remove-the-texture-destroy-glFinish.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0161-wined3d-Remove-the-texture-destroy-glFinish.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0161-wined3d-Remove-the-texture-destroy-glFinish.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,32 @@ +From c064211d94884f2c131c5496e60f591511c5462d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 28 Aug 2014 15:02:12 +0200 +Subject: wined3d: Remove the texture destroy glFinish. + +This should work now that surface_decref is essentially gone and the +container is never unset. +--- + dlls/wined3d/texture.c | 7 ------- + 1 file changed, 7 deletions(-) + +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +index 09ac38f..6f78292 100644 +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -146,13 +146,6 @@ static void wined3d_texture_cleanup(struct wined3d_texture *texture) + + TRACE("texture %p.\n", texture); + +- /* Because sub_resource_cleanup interferes with GL resources */ +- if (wined3d_settings.cs_multithreaded) +- { +- FIXME("Waiting for cs.\n"); +- device->cs->ops->finish(device->cs); +- } +- + for (i = 0; i < sub_count; ++i) + { + struct wined3d_resource *sub_resource = texture->sub_resources[i]; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0162-wined3d-Move-FBO-destruction-into-the-worker-thread.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0162-wined3d-Move-FBO-destruction-into-the-worker-thread.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0162-wined3d-Move-FBO-destruction-into-the-worker-thread.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0162-wined3d-Move-FBO-destruction-into-the-worker-thread.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,40 @@ +From 05b16589d0f658e929eaafb416d4b19bd88bb47d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 28 Aug 2014 16:09:45 +0200 +Subject: wined3d: Move FBO destruction into the worker thread. + +This protects the context array against races. +--- + dlls/wined3d/device.c | 2 -- + dlls/wined3d/resource.c | 2 ++ + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 62b0625..b5ce2c3 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -4638,8 +4638,6 @@ void device_resource_released(struct wined3d_device *device, struct wined3d_reso + + TRACE("device %p, resource %p, type %s.\n", device, resource, debug_d3dresourcetype(type)); + +- context_resource_released(device, resource, type); +- + switch (type) + { + case WINED3D_RTYPE_SURFACE: +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index 8069160..cd60356 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -159,6 +159,8 @@ void wined3d_resource_free_bo(struct wined3d_resource *resource) + + void wined3d_resource_cleanup_cs(struct wined3d_resource *resource) + { ++ context_resource_released(resource->device, resource, resource->type); ++ + if (resource->buffer) + wined3d_resource_free_bo(resource); + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0163-wined3d-Don-t-incref-decref-textures-in-color-depth-.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0163-wined3d-Don-t-incref-decref-textures-in-color-depth-.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0163-wined3d-Don-t-incref-decref-textures-in-color-depth-.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0163-wined3d-Don-t-incref-decref-textures-in-color-depth-.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,134 @@ +From 54eb3e212afc243fef25a46017ae3d822014f336 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Thu, 28 Aug 2014 16:10:09 +0200 +Subject: wined3d: Don't incref / decref textures in color / depth fill blits. + +See comment in the code. The solution is not particularly nice. A better +approach may be to handle them in ddraw, where we have a permanent view +for the surface. +--- + dlls/wined3d/surface.c | 52 +++++++++++++++++++++++++----------------- + dlls/wined3d/view.c | 20 ---------------- + dlls/wined3d/wined3d_private.h | 1 - + 3 files changed, 31 insertions(+), 42 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 1ccbe35..82485f3 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -4124,19 +4124,26 @@ static HRESULT ffp_blit_color_fill(struct wined3d_device *device, struct wined3d + const RECT *dst_rect, const struct wined3d_color *color) + { + const RECT draw_rect = {0, 0, dst_surface->resource.width, dst_surface->resource.height}; +- struct wined3d_rendertarget_view *view; +- struct wined3d_fb_state fb = {&view, NULL}; +- HRESULT hr; +- +- if (FAILED(hr = wined3d_rendertarget_view_create_from_surface(dst_surface, +- NULL, &wined3d_null_parent_ops, &view))) +- { +- ERR("Failed to create rendertarget view, hr %#x.\n", hr); +- return hr; +- } ++ struct wined3d_rendertarget_view view, *view_ptr = &view; ++ struct wined3d_fb_state fb = {&view_ptr, NULL, 1}; ++ struct wined3d_texture *texture = dst_surface->container; ++ ++ /* Can't incref / decref the resource here. This is executed inside the worker ++ * thread. Playing with the refcount here makes the worker thread visible to ++ * the client lib. Problems occur when the worker thread happens to hold the ++ * last reference and the resource destruction callbacks are called from the ++ * wrong thread. */ ++ view.resource = &texture->resource; ++ view.parent = NULL; ++ view.parent_ops = &wined3d_null_parent_ops; ++ view.format = dst_surface->resource.format; ++ view.buffer_offset = 0; ++ view.width = dst_surface->resource.width; ++ view.height = dst_surface->resource.height; ++ view.depth = 1; ++ view.sub_resource_idx = dst_surface->texture_layer * texture->level_count + dst_surface->texture_level; + + device_clear_render_targets(device, 1, &fb, 1, dst_rect, &draw_rect, WINED3DCLEAR_TARGET, color, 0.0f, 0); +- wined3d_rendertarget_view_decref_worker(view); + + return WINED3D_OK; + } +@@ -4145,18 +4152,21 @@ static HRESULT ffp_blit_depth_fill(struct wined3d_device *device, struct wined3d + const RECT *dst_rect, float depth) + { + const RECT draw_rect = {0, 0, dst_surface->resource.width, dst_surface->resource.height}; +- struct wined3d_fb_state fb = {NULL, NULL}; +- HRESULT hr; +- +- if (FAILED(hr = wined3d_rendertarget_view_create_from_surface(dst_surface, +- NULL, &wined3d_null_parent_ops, &fb.depth_stencil))) +- { +- ERR("Failed to create rendertarget view, hr %#x.\n", hr); +- return hr; +- } ++ struct wined3d_rendertarget_view view; ++ struct wined3d_fb_state fb = {NULL, &view}; ++ struct wined3d_texture *texture = dst_surface->container; ++ ++ view.resource = &dst_surface->container->resource; ++ view.parent = NULL; ++ view.parent_ops = &wined3d_null_parent_ops; ++ view.format = dst_surface->resource.format; ++ view.buffer_offset = 0; ++ view.width = dst_surface->resource.width; ++ view.height = dst_surface->resource.height; ++ view.depth = 1; ++ view.sub_resource_idx = dst_surface->texture_layer * texture->level_count + dst_surface->texture_level; + + device_clear_render_targets(device, 0, &fb, 1, dst_rect, &draw_rect, WINED3DCLEAR_ZBUFFER, 0, depth, 0); +- wined3d_rendertarget_view_decref_worker(fb.depth_stencil); + + return WINED3D_OK; + } +diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c +index 56eb7b3..870f1df 100644 +--- a/dlls/wined3d/view.c ++++ b/dlls/wined3d/view.c +@@ -58,26 +58,6 @@ ULONG CDECL wined3d_rendertarget_view_decref(struct wined3d_rendertarget_view *v + return refcount; + } + +-/* Ugly hack for ffp_blit_depth_fill that allows destroying a view from inside the +- * worker thread. */ +-ULONG wined3d_rendertarget_view_decref_worker(struct wined3d_rendertarget_view *view) +-{ +- ULONG refcount = InterlockedDecrement(&view->refcount); +- +- TRACE("%p decreasing refcount to %u.\n", view, refcount); +- +- if (!refcount) +- { +- /* Call wined3d_object_destroyed() before releasing the resource, +- * since releasing the resource may end up destroying the parent. */ +- view->parent_ops->wined3d_object_destroyed(view->parent); +- wined3d_resource_decref(view->resource); +- wined3d_rendertarget_view_destroy(view); +- } +- +- return refcount; +-} +- + void * CDECL wined3d_rendertarget_view_get_parent(const struct wined3d_rendertarget_view *view) + { + TRACE("view %p.\n", view); +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 3abd0a8..88329e5 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -2859,7 +2859,6 @@ static inline struct wined3d_surface *wined3d_rendertarget_view_get_surface( + return surface_from_resource(resource); + } + +-ULONG wined3d_rendertarget_view_decref_worker(struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN; + void wined3d_rendertarget_view_destroy(struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN; + + struct wined3d_shader_resource_view +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0164-Winex11-complain-about-glfinish.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0164-Winex11-complain-about-glfinish.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0164-Winex11-complain-about-glfinish.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0164-Winex11-complain-about-glfinish.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,32 @@ +From 422cdfa68ac69e3bbbc08a70b13fdc2afc8fd505 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 29 Aug 2014 12:12:11 +0200 +Subject: Winex11: complain about glfinish + +--- + dlls/winex11.drv/opengl.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c +index 7b8ba82..42a7498 100644 +--- a/dlls/winex11.drv/opengl.c ++++ b/dlls/winex11.drv/opengl.c +@@ -1983,6 +1983,7 @@ static void wglFinish(void) + escape.code = X11DRV_FLUSH_GL_DRAWABLE; + escape.gl_drawable = 0; + ++ ERR("glFinish\n"); + if ((gl = get_gl_drawable( WindowFromDC( ctx->hdc ), 0 ))) + { + switch (gl->type) +@@ -2008,6 +2009,7 @@ static void wglFlush(void) + escape.code = X11DRV_FLUSH_GL_DRAWABLE; + escape.gl_drawable = 0; + ++ ERR("glFlush\n"); + if ((gl = get_gl_drawable( WindowFromDC( ctx->hdc ), 0 ))) + { + switch (gl->type) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0165-wined3d-Make-sure-the-new-window-is-set-up-before-se.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0165-wined3d-Make-sure-the-new-window-is-set-up-before-se.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0165-wined3d-Make-sure-the-new-window-is-set-up-before-se.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0165-wined3d-Make-sure-the-new-window-is-set-up-before-se.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,69 @@ +From 08dd8c4b88837bd88c112f831b589d81339cd286 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 29 Aug 2014 14:46:19 +0200 +Subject: wined3d: Make sure the new window is set up before setting up a + context. + +--- + dlls/wined3d/device.c | 31 +++++++++++++++++++++---------- + 1 file changed, 21 insertions(+), 10 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index b5ce2c3..63eb87e 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -4269,6 +4269,27 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, + } + } + ++ /* Free implicit resources and wait for the command stream before modifying ++ * swapchain parameters. After modifying the swapchain parameters a new GL ++ * context may be acquired by the worker thread. This causes problems in the ++ * d3d8/9 test that passes a hidden window as the new device window. ++ * SetPixelFormat will call SetWindowPos inside the X11 driver, which sends ++ * a message to the window to query the icon. Since the worker thread is ++ * not the thread that created the window and the d3d8 test does not run ++ * an event loop this deadlocks. Set up the window first from the main thread ++ * before calling SetPixelFormat from the worker thread to avoid this. */ ++ if (device->auto_depth_stencil_view) ++ { ++ wined3d_rendertarget_view_decref(device->auto_depth_stencil_view); ++ device->auto_depth_stencil_view = NULL; ++ } ++ if (device->back_buffer_view) ++ { ++ wined3d_rendertarget_view_decref(device->back_buffer_view); ++ device->back_buffer_view = NULL; ++ } ++ device->cs->ops->finish(device->cs); ++ + /* Is it necessary to recreate the gl context? Actually every setting can be changed + * on an existing gl context, so there's no real need for recreation. + * +@@ -4404,11 +4425,6 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, + } + } + +- if (device->auto_depth_stencil_view) +- { +- wined3d_rendertarget_view_decref(device->auto_depth_stencil_view); +- device->auto_depth_stencil_view = NULL; +- } + if (swapchain->desc.enable_auto_depth_stencil) + { + struct wined3d_resource_desc surface_desc; +@@ -4446,11 +4462,6 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, + wined3d_device_set_depth_stencil_view(device, device->auto_depth_stencil_view); + } + +- if (device->back_buffer_view) +- { +- wined3d_rendertarget_view_decref(device->back_buffer_view); +- device->back_buffer_view = NULL; +- } + if (swapchain->desc.backbuffer_count && FAILED(hr = wined3d_rendertarget_view_create_from_surface( + surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)), + NULL, &wined3d_null_parent_ops, &device->back_buffer_view))) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0166-wined3d-Remove-the-device_reset-CS-sync-fixme.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0166-wined3d-Remove-the-device_reset-CS-sync-fixme.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0166-wined3d-Remove-the-device_reset-CS-sync-fixme.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0166-wined3d-Remove-the-device_reset-CS-sync-fixme.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,32 @@ +From 0dafdc38e8dd712f59666224ed22ffe91cc72a76 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 29 Aug 2014 14:46:55 +0200 +Subject: wined3d: Remove the device_reset CS sync fixme. + +--- + dlls/wined3d/device.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 63eb87e..7bc6aeb 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -4215,13 +4215,8 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, + unsigned int i; + + TRACE("device %p, swapchain_desc %p, mode %p, callback %p.\n", device, swapchain_desc, mode, callback); +- +- if (wined3d_settings.cs_multithreaded) +- { +- FIXME("Waiting for cs.\n"); +- wined3d_cs_emit_glfinish(device->cs); +- device->cs->ops->finish(device->cs); +- } ++ wined3d_cs_emit_glfinish(device->cs); ++ device->cs->ops->finish(device->cs); + + if (!(swapchain = wined3d_device_get_swapchain(device, 0))) + { +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0167-wined3d-Put-GL_APPLE_flush_buffer_range-syncing-back.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0167-wined3d-Put-GL_APPLE_flush_buffer_range-syncing-back.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0167-wined3d-Put-GL_APPLE_flush_buffer_range-syncing-back.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0167-wined3d-Put-GL_APPLE_flush_buffer_range-syncing-back.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,52 @@ +From ee64ddd005a7f0677b34b30b37469d587ae6fc76 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Fri, 29 Aug 2014 18:52:22 +0200 +Subject: wined3d: Put GL_APPLE_flush_buffer_range syncing back in place. + +--- + dlls/wined3d/buffer.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index c0f96e3..d743f0a 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -673,6 +673,12 @@ static void buffer_direct_upload(struct wined3d_buffer *This, const struct wined + GL_EXTCALL(glBufferDataARB(This->buffer_type_hint, This->resource.size, NULL, GL_STREAM_DRAW_ARB)); + checkGLcall("glBufferDataARB"); + } ++ else if (flags & WINED3D_BUFFER_SYNC && This->flags & WINED3D_BUFFER_APPLESYNC) ++ { ++ /* OSX doesn't do non-blocking asynchonous glBufferSubData like Linux drivers do, so we want to set ++ * GL_BUFFER_FLUSHING_UNMAP_APPLE to GL_FALSE. This means we have to do synchonization ourselves. */ ++ buffer_sync_apple(This, 0, gl_info); ++ } + + while (This->modified_areas) + { +@@ -1035,9 +1041,9 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + buffer->flags |= WINED3D_BUFFER_DISCARD; + buffer->ignore_discard = TRUE; + } ++ else if (!(flags & WINED3D_MAP_NOOVERWRITE)) ++ buffer->flags |= WINED3D_BUFFER_SYNC; + } +- if (!(flags & (WINED3D_MAP_NOOVERWRITE | WINED3D_MAP_DISCARD))) +- buffer->flags |= WINED3D_BUFFER_SYNC; + } + + if (wined3d_settings.cs_multithreaded && count == 1) +@@ -1052,6 +1058,10 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + else if(!(flags & (WINED3D_MAP_NOOVERWRITE | WINED3D_MAP_READONLY))) + { + wined3d_resource_wait_fence(&buffer->resource); ++ /* Writing to the (otherwise worker thread controlled) ++ * flags field is OK here since the wait_fence call made ++ * sure the buffer is idle. */ ++ buffer->flags |= WINED3D_BUFFER_SYNC; + } + } + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0168-wined3d-Wait-for-the-resource-to-be-idle-when-destro.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0168-wined3d-Wait-for-the-resource-to-be-idle-when-destro.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0168-wined3d-Wait-for-the-resource-to-be-idle-when-destro.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0168-wined3d-Wait-for-the-resource-to-be-idle-when-destro.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,41 @@ +From ba0d7248f185c8d6024f0d92b8c87b2d7153317c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Wed, 3 Sep 2014 20:20:39 +0200 +Subject: wined3d: Wait for the resource to be idle when destroying user memory + surfaces. + +--- + dlls/wined3d/surface.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 82485f3..3557c00 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -84,6 +84,8 @@ void wined3d_surface_cleanup_cs(struct wined3d_surface *surface) + static void surface_cleanup(struct wined3d_surface *surface) + { + struct wined3d_surface *overlay, *cur; ++ struct wined3d_cs *cs = surface->resource.device->cs; ++ BOOL user_mem = surface->resource.map_binding == WINED3D_LOCATION_USER_MEMORY; + + TRACE("surface %p.\n", surface); + +@@ -97,7 +99,13 @@ static void surface_cleanup(struct wined3d_surface *surface) + } + + resource_cleanup(&surface->resource); +- wined3d_cs_emit_surface_cleanup(surface->resource.device->cs, surface); ++ wined3d_cs_emit_surface_cleanup(cs, surface); ++ ++ /* Wait for the CS to finish operations on this surface when user memory was in use. ++ * The application is allowed to free the memory after texture / surface destruction ++ * returns. */ ++ if (user_mem) ++ wined3d_resource_wait_fence(&surface->container->resource); + } + + void wined3d_surface_destroy(struct wined3d_surface *surface) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0169-wined3d-Don-t-sync-on-redundant-discard-calls.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0169-wined3d-Don-t-sync-on-redundant-discard-calls.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0169-wined3d-Don-t-sync-on-redundant-discard-calls.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0169-wined3d-Don-t-sync-on-redundant-discard-calls.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,25 @@ +From 4e89934c223fd43aab2679042c7c808c8200aa68 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Mon, 8 Sep 2014 14:53:57 +0200 +Subject: wined3d: Don't sync on redundant discard calls. + +--- + dlls/wined3d/buffer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index d743f0a..1081247 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -1055,7 +1055,7 @@ HRESULT CDECL wined3d_buffer_map(struct wined3d_buffer *buffer, UINT offset, UIN + wined3d_resource_allocate_sysmem(&buffer->resource); + wined3d_cs_emit_buffer_swap_mem(device->cs, buffer, buffer->resource.map_heap_memory); + } +- else if(!(flags & (WINED3D_MAP_NOOVERWRITE | WINED3D_MAP_READONLY))) ++ else if(!(flags & (WINED3D_MAP_NOOVERWRITE | WINED3D_MAP_READONLY)) && !buffer->ignore_discard) + { + wined3d_resource_wait_fence(&buffer->resource); + /* Writing to the (otherwise worker thread controlled) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0170-wined3d-Don-t-discard-new-buffers.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0170-wined3d-Don-t-discard-new-buffers.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0170-wined3d-Don-t-discard-new-buffers.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0170-wined3d-Don-t-discard-new-buffers.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,24 @@ +From 6f08171470d477868721be4e6a1f1178856340d4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Mon, 8 Sep 2014 14:57:37 +0200 +Subject: wined3d: Don't discard new buffers. + +--- + dlls/wined3d/buffer.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index 1081247..e6e56bb 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -1196,6 +1196,7 @@ static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device + return hr; + } + buffer->buffer_type_hint = bind_hint; ++ buffer->ignore_discard = TRUE; + + TRACE("size %#x, usage %#x, format %s, memory @ %p, iface @ %p.\n", buffer->resource.size, buffer->resource.usage, + debug_d3dformat(buffer->resource.format->id), buffer->resource.heap_memory, buffer); +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0171-wined3d-Don-t-try-to-sync-VBOs-manually-on-OSX-with-.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0171-wined3d-Don-t-try-to-sync-VBOs-manually-on-OSX-with-.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0171-wined3d-Don-t-try-to-sync-VBOs-manually-on-OSX-with-.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0171-wined3d-Don-t-try-to-sync-VBOs-manually-on-OSX-with-.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,52 @@ +From 180d8cf49a4f4481b08e373e8c8a75c116094e63 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Mon, 8 Sep 2014 15:09:44 +0200 +Subject: wined3d: Don't try to sync VBOs manually on OSX with CSMT. + +This fixes a performance regression in some games caused by +aaf4849718c3c3a763c460a24a51dd6c6b55524a. + +GL_ARB_sync and GL_APPLE_fence seem to be fairly slow on OSX. Putting the +buffer back into synchonized mode and synchronizing all future uploads +is about twice as fast. This was benchmarked with 3DMark2001. Gunpoint, +another game that depends on synchronized dynamic buffer maps, feels +smoother, although the lack of a benchmark mode makes testing this difficult. + +This assumes that if a game maps a dynamic buffer without NOOVERWRITE or +DISCARD once it will always do so. I have not seen a game yet that mixes +async and sync maps. If the game mixes them, the wined3d-side CS will still +update the buffer asynchronously. Only the worker thread -> GL copy is +synchronized, as it used to be for all buffers in cx13. + +This patch only changes the double-buffered (used for CSMT) codepath. Making +the same change to the glMapBuffer codepath improves 3DMark2001 performance +as well, but the difference is much smaller. I will leave the manual sync +code in place until we have a game that clearly profits from this change. +--- + dlls/wined3d/buffer.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +index e6e56bb..b33dd5a 100644 +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -676,8 +676,14 @@ static void buffer_direct_upload(struct wined3d_buffer *This, const struct wined + else if (flags & WINED3D_BUFFER_SYNC && This->flags & WINED3D_BUFFER_APPLESYNC) + { + /* OSX doesn't do non-blocking asynchonous glBufferSubData like Linux drivers do, so we want to set +- * GL_BUFFER_FLUSHING_UNMAP_APPLE to GL_FALSE. This means we have to do synchonization ourselves. */ +- buffer_sync_apple(This, 0, gl_info); ++ * GL_BUFFER_SERIALIZED_MODIFY_APPLE to GL_FALSE. Unfortunately ARB_sync and APPLE_fence are pretty ++ * slow on OSX. Putting the buffer back into synchronized mode for future maps is a lot faster. ++ * (GeForce 650M, Mavericks). The difference between ARB_sync and normal buffer operation is small ++ * in the glMapBuffer codepath without CSMT. */ ++ glFinish(); ++ GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE)); ++ checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE)"); ++ This->flags &= ~WINED3D_BUFFER_APPLESYNC; + } + + while (This->modified_areas) +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0172-wined3d-Render-target-lock-hack.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0172-wined3d-Render-target-lock-hack.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0172-wined3d-Render-target-lock-hack.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0172-wined3d-Render-target-lock-hack.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,86 @@ +From f23d42ca6a96a3d257fc57dbae8d5ebd3620e4b7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20D=C3=B6singer?= +Date: Tue, 23 Sep 2014 22:18:56 +0200 +Subject: wined3d: Render target lock hack + +--- + dlls/wined3d/resource.c | 17 +++++++++++++++++ + dlls/wined3d/wined3d_main.c | 7 +++++++ + dlls/wined3d/wined3d_private.h | 1 + + 3 files changed, 25 insertions(+) + +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +index cd60356..dc36dd5 100644 +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -777,6 +777,17 @@ HRESULT wined3d_resource_map(struct wined3d_resource *resource, + TRACE("resource %p, map_desc %p, box %p, flags %#x.\n", + resource, map_desc, box, flags); + ++ if (resource->usage & WINED3DUSAGE_RENDERTARGET && wined3d_settings.ignore_rt_map) ++ { ++ WARN("Ignoring render target map, only finishing CS.\n"); ++ wined3d_cs_emit_glfinish(device->cs); ++ map_desc->row_pitch = 0; ++ map_desc->slice_pitch = 0; ++ map_desc->data = NULL; ++ device->cs->ops->finish(device->cs); ++ return WINED3D_OK; ++ } ++ + if (resource->map_count) + { + WARN("Volume is already mapped.\n"); +@@ -880,6 +891,12 @@ HRESULT wined3d_resource_unmap(struct wined3d_resource *resource) + struct wined3d_device *device = resource->device; + TRACE("resource %p.\n", resource); + ++ if (resource->usage & WINED3DUSAGE_RENDERTARGET && wined3d_settings.ignore_rt_map) ++ { ++ WARN("Ignoring render target unmap.\n"); ++ return WINED3D_OK; ++ } ++ + if (!resource->map_count) + { + WARN("Trying to unlock an unlocked resource %p.\n", resource); +diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c +index e6dc444..a1e4e6c 100644 +--- a/dlls/wined3d/wined3d_main.c ++++ b/dlls/wined3d/wined3d_main.c +@@ -86,6 +86,7 @@ struct wined3d_settings wined3d_settings = + ~0U, /* No PS shader model limit by default. */ + FALSE, /* 3D support enabled by default. */ + FALSE, /* No multithreaded CS by default. */ ++ FALSE, /* Do not ignore render target maps. */ + }; + + struct wined3d * CDECL wined3d_create(DWORD flags) +@@ -311,6 +312,12 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL) + TRACE("Enabling multithreaded command stream.\n"); + wined3d_settings.cs_multithreaded = TRUE; + } ++ if (!get_config_key(hkey, appkey, "ignore_rt_map", buffer, size) ++ && !strcmp(buffer,"enabled")) ++ { ++ TRACE("Ignoring render target maps.\n"); ++ wined3d_settings.ignore_rt_map = TRUE; ++ } + } + + if (appkey) RegCloseKey( appkey ); +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +index 88329e5..dd06525 100644 +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -281,6 +281,7 @@ struct wined3d_settings + unsigned int max_sm_ps; + BOOL no_3d; + BOOL cs_multithreaded; ++ BOOL ignore_rt_map; + }; + + extern struct wined3d_settings wined3d_settings DECLSPEC_HIDDEN; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0173-wined3d-Avoid-calling-wined3d_surface_blt-from-surfa.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0173-wined3d-Avoid-calling-wined3d_surface_blt-from-surfa.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0173-wined3d-Avoid-calling-wined3d_surface_blt-from-surfa.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0173-wined3d-Avoid-calling-wined3d_surface_blt-from-surfa.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,42 @@ +From a2aa05486b1b77425b94657483334a1dd5763048 Mon Sep 17 00:00:00 2001 +From: Matteo Bruni +Date: Fri, 12 Sep 2014 19:03:05 +0200 +Subject: wined3d: Avoid calling wined3d_surface_blt() from + surface_upload_from_surface(). + +--- + dlls/wined3d/surface.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 3557c00..9ab0738 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -37,6 +37,10 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d); + #define MAXLOCKCOUNT 50 /* After this amount of locks do not free the sysmem copy. */ + + ++static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT *dst_rect, ++ struct wined3d_surface *src_surface, const RECT *src_rect, DWORD flags, ++ const WINEDDBLTFX *fx, enum wined3d_texture_filter_type filter); ++ + void wined3d_surface_cleanup_cs(struct wined3d_surface *surface) + { + if (surface->rb_multisample || surface->rb_resolved || !list_empty(&surface->renderbuffers)) +@@ -1522,9 +1526,11 @@ HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const P + return WINED3DERR_INVALIDCALL; + } + +- /* Use wined3d_surface_blt() instead of uploading directly if we need conversion. */ ++ /* Use surface_cpu_blt() instead of uploading directly if we need ++ * conversion. Avoid calling wined3d_surface_blt() since that goes ++ * through the CS. */ + if (dst_format->convert || wined3d_format_get_color_key_conversion(dst_surface->container, FALSE)) +- return wined3d_surface_blt(dst_surface, &dst_rect, src_surface, src_rect, 0, NULL, WINED3D_TEXF_POINT); ++ return surface_cpu_blt(dst_surface, &dst_rect, src_surface, src_rect, 0, NULL, WINED3D_TEXF_POINT); + + context = context_acquire(dst_surface->resource.device, NULL); + gl_info = context->gl_info; +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0174-wined3d-Fix-some-uninitialized-memory-accesses.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0174-wined3d-Fix-some-uninitialized-memory-accesses.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0174-wined3d-Fix-some-uninitialized-memory-accesses.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0174-wined3d-Fix-some-uninitialized-memory-accesses.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,47 @@ +From a8a191d592e1c7202929d272b37afe5a2a347f40 Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +Date: Sun, 14 Dec 2014 15:24:44 +0100 +Subject: wined3d: Fix some uninitialized memory accesses. + +--- + dlls/wined3d/device.c | 3 +-- + dlls/wined3d/surface.c | 2 +- + 2 files changed, 2 insertions(+), 3 deletions(-) + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +index 7bc6aeb..50376f7 100644 +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -3370,7 +3370,6 @@ void CDECL wined3d_device_draw_indexed_primitive_instanced(struct wined3d_device + static HRESULT device_update_volume(struct wined3d_context *context, + struct wined3d_volume *src_volume, struct wined3d_volume *dst_volume) + { +- HRESULT hr; + struct wined3d_bo_address data; + + TRACE("src_volume %p, dst_volume %p.\n", +@@ -3395,7 +3394,7 @@ static HRESULT device_update_volume(struct wined3d_context *context, + wined3d_volume_upload_data(dst_volume, context, &data); + wined3d_resource_invalidate_location(&dst_volume->resource, ~WINED3D_LOCATION_TEXTURE_RGB); + +- return hr; ++ return WINED3D_OK; + } + + /* Context activation is done by the caller */ +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +index 9ab0738..9a2bcf7 100644 +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -770,7 +770,7 @@ static void surface_blt_fbo(const struct wined3d_device *device, + + if (required_rt && required_rt != old_ctx->current_rt) + { +- restore_rt = context->current_rt; ++ restore_rt = old_ctx->current_rt; + context = context_acquire(device, required_rt); + } + else +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0175-wined3d-Enable-CSMT-by-default-print-a-winediag-mess.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0175-wined3d-Enable-CSMT-by-default-print-a-winediag-mess.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/0175-wined3d-Enable-CSMT-by-default-print-a-winediag-mess.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/0175-wined3d-Enable-CSMT-by-default-print-a-winediag-mess.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,50 @@ +From f5af340900500fbff08b1fb4f3dca8f0c5171d0d Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +Date: Sun, 14 Dec 2014 20:15:44 +0100 +Subject: wined3d: Enable CSMT by default, print a winediag message informing + about this patchset. + +--- + dlls/wined3d/wined3d_main.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c +index a1e4e6c..30b1ff5 100644 +--- a/dlls/wined3d/wined3d_main.c ++++ b/dlls/wined3d/wined3d_main.c +@@ -85,7 +85,7 @@ struct wined3d_settings wined3d_settings = + ~0U, /* No GS shader model limit by default. */ + ~0U, /* No PS shader model limit by default. */ + FALSE, /* 3D support enabled by default. */ +- FALSE, /* No multithreaded CS by default. */ ++ TRUE, /* Multithreaded CS by default. */ + FALSE, /* Do not ignore render target maps. */ + }; + +@@ -307,10 +307,10 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL) + wined3d_settings.no_3d = TRUE; + } + if (!get_config_key(hkey, appkey, "CSMT", buffer, size) +- && !strcmp(buffer,"enabled")) ++ && !strcmp(buffer,"disabled")) + { +- TRACE("Enabling multithreaded command stream.\n"); +- wined3d_settings.cs_multithreaded = TRUE; ++ TRACE("Disabling multithreaded command stream.\n"); ++ wined3d_settings.cs_multithreaded = FALSE; + } + if (!get_config_key(hkey, appkey, "ignore_rt_map", buffer, size) + && !strcmp(buffer,"enabled")) +@@ -320,6 +320,9 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL) + } + } + ++ FIXME_(winediag)("Experimental wined3d CSMT feature is currently %s.\n", ++ wined3d_settings.cs_multithreaded ? "enabled" : "disabled"); ++ + if (appkey) RegCloseKey( appkey ); + if (hkey) RegCloseKey( hkey ); + +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/9999-IfDefined.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/9999-IfDefined.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/9999-IfDefined.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/9999-IfDefined.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,9662 @@ +From: Wine Staging Team +Subject: Autogenerated #ifdef patch for wined3d-CSMT_Main. + +diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c +--- a/dlls/wined3d/swapchain.c ++++ b/dlls/wined3d/swapchain.c +@@ -309,7 +309,11 @@ + if (backbuffer->resource.multisample_type) + { + location = WINED3D_LOCATION_RB_RESOLVED; ++#if defined(STAGING_CSMT) + wined3d_resource_load_location(&backbuffer->resource, context, location); ++#else /* STAGING_CSMT */ ++ surface_load_location(backbuffer, location); ++#endif /* STAGING_CSMT */ + } + + context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, backbuffer, NULL, location); +@@ -417,11 +421,19 @@ + } + + static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT *src_rect_in, ++#if defined(STAGING_CSMT) + const RECT *dst_rect_in, const RGNDATA *dirty_region, DWORD flags, + struct wined3d_surface *depth_stencil) + { + struct wined3d_surface *back_buffer = surface_from_resource( + wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)); ++#else /* STAGING_CSMT */ ++ const RECT *dst_rect_in, const RGNDATA *dirty_region, DWORD flags) ++{ ++ struct wined3d_surface *back_buffer = surface_from_resource( ++ wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)); ++ const struct wined3d_fb_state *fb = &swapchain->device->fb; ++#endif /* STAGING_CSMT */ + const struct wined3d_gl_info *gl_info; + struct wined3d_context *context; + struct wined3d_surface *front; +@@ -449,6 +461,29 @@ + NULL, WINED3D_TEXF_POINT); + } + ++#if !defined(STAGING_CSMT) ++ if (swapchain->device->bCursorVisible && swapchain->device->cursor_texture ++ && !swapchain->device->hardwareCursor) ++ { ++ struct wined3d_surface *cursor = surface_from_resource( ++ wined3d_texture_get_sub_resource(swapchain->device->cursor_texture, 0)); ++ RECT destRect = ++ { ++ swapchain->device->xScreenSpace - swapchain->device->xHotSpot, ++ swapchain->device->yScreenSpace - swapchain->device->yHotSpot, ++ swapchain->device->xScreenSpace + swapchain->device->cursorWidth - swapchain->device->xHotSpot, ++ swapchain->device->yScreenSpace + swapchain->device->cursorHeight - swapchain->device->yHotSpot, ++ }; ++ ++ TRACE("Rendering the software cursor.\n"); ++ ++ if (swapchain->desc.windowed) ++ MapWindowPoints(NULL, swapchain->win_handle, (POINT *)&destRect, 2); ++ wined3d_surface_blt(back_buffer, &destRect, cursor, NULL, WINEDDBLT_ALPHATEST, ++ NULL, WINED3D_TEXF_POINT); ++ } ++ ++#endif /* STAGING_CSMT */ + TRACE("Presenting HDC %p.\n", context->hdc); + + render_to_fbo = swapchain->render_to_fbo; +@@ -490,6 +525,7 @@ + */ + if (!swapchain->render_to_fbo && render_to_fbo && wined3d_settings.offscreen_rendering_mode == ORM_FBO) + { ++#if defined(STAGING_CSMT) + wined3d_resource_load_location(&back_buffer->resource, context, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_resource_invalidate_location(&back_buffer->resource, WINED3D_LOCATION_DRAWABLE); + swapchain->render_to_fbo = TRUE; +@@ -498,6 +534,16 @@ + else + { + wined3d_resource_load_location(&back_buffer->resource, context, back_buffer->container->resource.draw_binding); ++#else /* STAGING_CSMT */ ++ surface_load_location(back_buffer, WINED3D_LOCATION_TEXTURE_RGB); ++ surface_invalidate_location(back_buffer, WINED3D_LOCATION_DRAWABLE); ++ swapchain->render_to_fbo = TRUE; ++ swapchain_update_draw_bindings(swapchain); ++ } ++ else ++ { ++ surface_load_location(back_buffer, back_buffer->container->resource.draw_binding); ++#endif /* STAGING_CSMT */ + } + + if (swapchain->render_to_fbo) +@@ -510,8 +556,13 @@ + swapchain_blit(swapchain, context, &src_rect, &dst_rect); + } + ++#if defined(STAGING_CSMT) + if (swapchain->num_contexts > 1 && !wined3d_settings.cs_multithreaded) + gl_info->gl_ops.gl.p_glFlush(); ++#else /* STAGING_CSMT */ ++ if (swapchain->num_contexts > 1) ++ gl_info->gl_ops.gl.p_glFinish(); ++#endif /* STAGING_CSMT */ + + /* call wglSwapBuffers through the gl table to avoid confusing the Steam overlay */ + gl_info->gl_ops.wgl.p_wglSwapBuffers(context->hdc); /* TODO: cycle through the swapchain buffers */ +@@ -534,6 +585,7 @@ + } + + front = surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0)); ++#if defined(STAGING_CSMT) + wined3d_resource_validate_location(&front->resource, WINED3D_LOCATION_DRAWABLE); + wined3d_resource_invalidate_location(&front->resource, ~WINED3D_LOCATION_DRAWABLE); + switch (swapchain->desc.swap_effect) +@@ -562,6 +614,61 @@ + { + wined3d_surface_decref(swapchain->device->cs->onscreen_depth_stencil); + swapchain->device->cs->onscreen_depth_stencil = NULL; ++#else /* STAGING_CSMT */ ++ if (!swapchain->render_to_fbo && ((front->locations & WINED3D_LOCATION_SYSMEM) ++ || (back_buffer->locations & WINED3D_LOCATION_SYSMEM))) ++ { ++ /* Both memory copies of the surfaces are ok, flip them around too instead of dirtifying ++ * Doesn't work with render_to_fbo because we're not flipping ++ */ ++ ++ if (front->resource.size == back_buffer->resource.size) ++ { ++ flip_surface(front, back_buffer); ++ ++ /* Tell the front buffer surface that is has been modified. However, ++ * the other locations were preserved during that, so keep the flags. ++ * This serves to update the emulated overlay, if any. */ ++ surface_validate_location(front, WINED3D_LOCATION_DRAWABLE); ++ } ++ else ++ { ++ surface_validate_location(front, WINED3D_LOCATION_DRAWABLE); ++ surface_invalidate_location(front, ~WINED3D_LOCATION_DRAWABLE); ++ surface_validate_location(back_buffer, WINED3D_LOCATION_DRAWABLE); ++ surface_invalidate_location(back_buffer, ~WINED3D_LOCATION_DRAWABLE); ++ } ++ } ++ else ++ { ++ surface_validate_location(front, WINED3D_LOCATION_DRAWABLE); ++ surface_invalidate_location(front, ~WINED3D_LOCATION_DRAWABLE); ++ /* If the swapeffect is DISCARD, the back buffer is undefined. That means the SYSMEM ++ * and INTEXTURE copies can keep their old content if they have any defined content. ++ * If the swapeffect is COPY, the content remains the same. If it is FLIP however, ++ * the texture / sysmem copy needs to be reloaded from the drawable ++ */ ++ if (swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_FLIP) ++ { ++ surface_validate_location(back_buffer, back_buffer->container->resource.draw_binding); ++ surface_invalidate_location(back_buffer, ~back_buffer->container->resource.draw_binding); ++ } ++ } ++ ++ if (fb->depth_stencil) ++ { ++ struct wined3d_surface *ds = wined3d_rendertarget_view_get_surface(fb->depth_stencil); ++ ++ if (ds && (swapchain->desc.flags & WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL ++ || ds->flags & SFLAG_DISCARD)) ++ { ++ surface_modify_ds_location(ds, WINED3D_LOCATION_DISCARDED, ++ fb->depth_stencil->width, fb->depth_stencil->height); ++ if (ds == swapchain->device->onscreen_depth_stencil) ++ { ++ wined3d_surface_decref(swapchain->device->onscreen_depth_stencil); ++ swapchain->device->onscreen_depth_stencil = NULL; ++#endif /* STAGING_CSMT */ + } + } + } +@@ -594,7 +701,11 @@ + + TRACE("Copying surface %p to screen.\n", front); + ++#if defined(STAGING_CSMT) + wined3d_resource_load_location(&front->resource, NULL, WINED3D_LOCATION_DIB); ++#else /* STAGING_CSMT */ ++ surface_load_location(front, WINED3D_LOCATION_DIB); ++#endif /* STAGING_CSMT */ + + src_dc = front->hDC; + window = swapchain->win_handle; +@@ -622,8 +733,12 @@ + } + + static void swapchain_gdi_present(struct wined3d_swapchain *swapchain, const RECT *src_rect_in, ++#if defined(STAGING_CSMT) + const RECT *dst_rect_in, const RGNDATA *dirty_region, DWORD flags, + struct wined3d_surface *depth_stencil) ++#else /* STAGING_CSMT */ ++ const RECT *dst_rect_in, const RGNDATA *dirty_region, DWORD flags) ++#endif /* STAGING_CSMT */ + { + struct wined3d_surface *front, *back; + +@@ -650,9 +765,15 @@ + { + void *tmp; + ++#if defined(STAGING_CSMT) + tmp = front->resource.bitmap_data; + front->resource.bitmap_data = back->resource.bitmap_data; + back->resource.bitmap_data = tmp; ++#else /* STAGING_CSMT */ ++ tmp = front->dib.bitmap_data; ++ front->dib.bitmap_data = back->dib.bitmap_data; ++ back->dib.bitmap_data = tmp; ++#endif /* STAGING_CSMT */ + + if (front->resource.heap_memory) + ERR("GDI Surface %p has heap memory allocated.\n", front); +@@ -723,6 +844,7 @@ + swapchain->render_to_fbo = TRUE; + } + ++#if defined(STAGING_CSMT) + HRESULT swapchain_create_context_cs(struct wined3d_device *device, struct wined3d_swapchain *swapchain) + { + const struct wined3d_adapter *adapter = device->adapter; +@@ -786,6 +908,7 @@ + return WINED3D_OK; + } + ++#endif /* STAGING_CSMT */ + static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3d_device *device, + struct wined3d_swapchain_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops) + { +@@ -883,8 +1006,13 @@ + wined3d_texture_set_swapchain(swapchain->front_buffer, swapchain); + if (!(device->wined3d->flags & WINED3D_NO3D)) + { ++#if defined(STAGING_CSMT) + wined3d_resource_validate_location(&front_buffer->resource, WINED3D_LOCATION_DRAWABLE); + wined3d_resource_invalidate_location(&front_buffer->resource, ~WINED3D_LOCATION_DRAWABLE); ++#else /* STAGING_CSMT */ ++ surface_validate_location(front_buffer, WINED3D_LOCATION_DRAWABLE); ++ surface_invalidate_location(front_buffer, ~WINED3D_LOCATION_DRAWABLE); ++#endif /* STAGING_CSMT */ + } + + /* MSDN says we're only allowed a single fullscreen swapchain per device, +@@ -910,9 +1038,66 @@ + + if (!(device->wined3d->flags & WINED3D_NO3D)) + { ++#if defined(STAGING_CSMT) + hr = wined3d_cs_emit_create_swapchain_context(device->cs, swapchain); + if (FAILED(hr)) + goto err; ++#else /* STAGING_CSMT */ ++ static const enum wined3d_format_id formats[] = ++ { ++ WINED3DFMT_D24_UNORM_S8_UINT, ++ WINED3DFMT_D32_UNORM, ++ WINED3DFMT_R24_UNORM_X8_TYPELESS, ++ WINED3DFMT_D16_UNORM, ++ WINED3DFMT_S1_UINT_D15_UNORM ++ }; ++ ++ const struct wined3d_gl_info *gl_info = &adapter->gl_info; ++ ++ swapchain->context = HeapAlloc(GetProcessHeap(), 0, sizeof(*swapchain->context)); ++ if (!swapchain->context) ++ { ++ ERR("Failed to create the context array.\n"); ++ hr = E_OUTOFMEMORY; ++ goto err; ++ } ++ swapchain->num_contexts = 1; ++ ++ /* In WGL both color, depth and stencil are features of a pixel format. In case of D3D they are separate. ++ * You are able to add a depth + stencil surface at a later stage when you need it. ++ * In order to support this properly in WineD3D we need the ability to recreate the opengl context and ++ * drawable when this is required. This is very tricky as we need to reapply ALL opengl states for the new ++ * context, need torecreate shaders, textures and other resources. ++ * ++ * The context manager already takes care of the state problem and for the other tasks code from Reset ++ * can be used. These changes are way to risky during the 1.0 code freeze which is taking place right now. ++ * Likely a lot of other new bugs will be exposed. For that reason request a depth stencil surface all the ++ * time. It can cause a slight performance hit but fixes a lot of regressions. A fixme reminds of that this ++ * issue needs to be fixed. */ ++ for (i = 0; i < (sizeof(formats) / sizeof(*formats)); i++) ++ { ++ swapchain->ds_format = wined3d_get_format(gl_info, formats[i]); ++ swapchain->context[0] = context_create(swapchain, front_buffer, swapchain->ds_format); ++ if (swapchain->context[0]) break; ++ TRACE("Depth stencil format %s is not supported, trying next format\n", ++ debug_d3dformat(formats[i])); ++ } ++ ++ if (!swapchain->context[0]) ++ { ++ WARN("Failed to create context.\n"); ++ hr = WINED3DERR_NOTAVAILABLE; ++ goto err; ++ } ++ ++ if (wined3d_settings.offscreen_rendering_mode != ORM_FBO ++ && (!desc->enable_auto_depth_stencil ++ || swapchain->desc.auto_depth_stencil_format != swapchain->ds_format->id)) ++ { ++ FIXME("Add OpenGL context recreation support to context_validate_onscreen_formats\n"); ++ } ++ context_release(swapchain->context[0]); ++#endif /* STAGING_CSMT */ + } + + if (swapchain->desc.backbuffer_count > 0) +diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c +--- a/dlls/wined3d/state.c ++++ b/dlls/wined3d/state.c +@@ -106,7 +106,11 @@ + static UINT once; + + /* No z test without depth stencil buffers */ ++#if defined(STAGING_CSMT) + if (!state->fb.depth_stencil) ++#else /* STAGING_CSMT */ ++ if (!state->fb->depth_stencil) ++#endif /* STAGING_CSMT */ + { + TRACE("No Z buffer - disabling depth test\n"); + zenable = WINED3D_ZB_FALSE; +@@ -381,7 +385,11 @@ + + static void state_blend(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { ++#if defined(STAGING_CSMT) + const struct wined3d_format *rt_format = state->fb.render_targets[0]->format; ++#else /* STAGING_CSMT */ ++ const struct wined3d_format *rt_format = state->fb->render_targets[0]->format; ++#endif /* STAGING_CSMT */ + const struct wined3d_gl_info *gl_info = context->gl_info; + GLenum srcBlend, dstBlend; + enum wined3d_blend d3d_blend; +@@ -826,7 +834,11 @@ + GLint depthFail_ccw; + + /* No stencil test without a stencil buffer. */ ++#if defined(STAGING_CSMT) + if (!state->fb.depth_stencil) ++#else /* STAGING_CSMT */ ++ if (!state->fb->depth_stencil) ++#endif /* STAGING_CSMT */ + { + gl_info->gl_ops.gl.p_glDisable(GL_STENCIL_TEST); + checkGLcall("glDisable GL_STENCIL_TEST"); +@@ -912,7 +924,11 @@ + + static void state_stencilwrite2s(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { ++#if defined(STAGING_CSMT) + DWORD mask = state->fb.depth_stencil ? state->render_states[WINED3D_RS_STENCILWRITEMASK] : 0; ++#else /* STAGING_CSMT */ ++ DWORD mask = state->fb->depth_stencil ? state->render_states[WINED3D_RS_STENCILWRITEMASK] : 0; ++#endif /* STAGING_CSMT */ + const struct wined3d_gl_info *gl_info = context->gl_info; + + GL_EXTCALL(glActiveStencilFaceEXT(GL_BACK)); +@@ -926,7 +942,11 @@ + + static void state_stencilwrite(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { ++#if defined(STAGING_CSMT) + DWORD mask = state->fb.depth_stencil ? state->render_states[WINED3D_RS_STENCILWRITEMASK] : 0; ++#else /* STAGING_CSMT */ ++ DWORD mask = state->fb->depth_stencil ? state->render_states[WINED3D_RS_STENCILWRITEMASK] : 0; ++#endif /* STAGING_CSMT */ + const struct wined3d_gl_info *gl_info = context->gl_info; + + gl_info->gl_ops.gl.p_glStencilMask(mask); +@@ -1167,10 +1187,17 @@ + /* drop through */ + + case WINED3D_FOG_NONE: ++#if defined(STAGING_CSMT) + /* Both are none? According to msdn the alpha channel of the specular + * color contains a fog factor. Set it in draw_strided_slow. + * Same happens with Vertexfog on transformed vertices + */ ++#else /* STAGING_CSMT */ ++ /* Both are none? According to msdn the alpha channel of the specular ++ * color contains a fog factor. Set it in drawStridedSlow. ++ * Same happens with Vertexfog on transformed vertices ++ */ ++#endif /* STAGING_CSMT */ + new_source = FOGSOURCE_COORD; + gl_info->gl_ops.gl.p_glFogi(GL_FOG_MODE, GL_LINEAR); + checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR)"); +@@ -1765,7 +1792,11 @@ + if (state->render_states[WINED3D_RS_SLOPESCALEDEPTHBIAS] + || state->render_states[WINED3D_RS_DEPTHBIAS]) + { ++#if defined(STAGING_CSMT) + const struct wined3d_rendertarget_view *depth = state->fb.depth_stencil; ++#else /* STAGING_CSMT */ ++ const struct wined3d_rendertarget_view *depth = state->fb->depth_stencil; ++#endif /* STAGING_CSMT */ + float scale; + + union +@@ -4296,9 +4327,15 @@ + } + } + } else { ++#if defined(STAGING_CSMT) + /* TODO: support blends in draw_strided_slow + * No need to write a FIXME here, this is done after the general vertex decl decoding + */ ++#else /* STAGING_CSMT */ ++ /* TODO: support blends in drawStridedSlow ++ * No need to write a FIXME here, this is done after the general vertex decl decoding ++ */ ++#endif /* STAGING_CSMT */ + WARN("unsupported blending in openGl\n"); + } + } +@@ -4653,7 +4690,11 @@ + + static void viewport_miscpart(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { ++#if defined(STAGING_CSMT) + const struct wined3d_rendertarget_view *target = state->fb.render_targets[0]; ++#else /* STAGING_CSMT */ ++ const struct wined3d_rendertarget_view *target = state->fb->render_targets[0]; ++#endif /* STAGING_CSMT */ + const struct wined3d_gl_info *gl_info = context->gl_info; + struct wined3d_viewport vp = state->viewport; + +@@ -4833,7 +4874,11 @@ + } + else + { ++#if defined(STAGING_CSMT) + const struct wined3d_rendertarget_view *target = state->fb.render_targets[0]; ++#else /* STAGING_CSMT */ ++ const struct wined3d_rendertarget_view *target = state->fb->render_targets[0]; ++#endif /* STAGING_CSMT */ + UINT height; + UINT width; + +@@ -4900,7 +4945,11 @@ + + void state_srgbwrite(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { ++#if defined(STAGING_CSMT) + const struct wined3d_format *rt_format = state->fb.render_targets[0]->format; ++#else /* STAGING_CSMT */ ++ const struct wined3d_format *rt_format = state->fb->render_targets[0]->format; ++#endif /* STAGING_CSMT */ + const struct wined3d_gl_info *gl_info = context->gl_info; + + TRACE("context %p, state %p, state_id %#x.\n", context, state, state_id); +diff --git a/dlls/d3d8/tests/visual.c b/dlls/d3d8/tests/visual.c +--- a/dlls/d3d8/tests/visual.c ++++ b/dlls/d3d8/tests/visual.c +@@ -4998,7 +4998,11 @@ + fill_surface(surface_managed, 0x0000ff00, D3DLOCK_NO_DIRTY_UPDATE); + add_dirty_rect_test_draw(device); + color = getPixelColor(device, 320, 240); ++#if defined(STAGING_CSMT) + todo_wine ok(color_match(color, 0x00ff0000, 1), ++#else /* STAGING_CSMT */ ++ ok(color_match(color, 0x00ff0000, 1), ++#endif /* STAGING_CSMT */ + "Expected color 0x00ff0000, got 0x%08x.\n", color); + hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL); + ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr); +diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c +--- a/dlls/wined3d/volume.c ++++ b/dlls/wined3d/volume.c +@@ -27,6 +27,21 @@ + WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface); + WINE_DECLARE_DEBUG_CHANNEL(d3d_perf); + ++#if !defined(STAGING_CSMT) ++BOOL volume_prepare_system_memory(struct wined3d_volume *volume) ++{ ++ if (volume->resource.heap_memory) ++ return TRUE; ++ ++ if (!wined3d_resource_allocate_sysmem(&volume->resource)) ++ { ++ ERR("Failed to allocate system memory.\n"); ++ return FALSE; ++ } ++ return TRUE; ++} ++ ++#endif /* STAGING_CSMT */ + /* Context activation is done by the caller. */ + void wined3d_volume_upload_data(struct wined3d_volume *volume, const struct wined3d_context *context, + const struct wined3d_bo_address *data) +@@ -85,6 +100,22 @@ + HeapFree(GetProcessHeap(), 0, mem); + } + ++#if !defined(STAGING_CSMT) ++static void wined3d_volume_validate_location(struct wined3d_volume *volume, DWORD location) ++{ ++ TRACE("Volume %p, setting %s.\n", volume, wined3d_debug_location(location)); ++ volume->locations |= location; ++ TRACE("new location flags are %s.\n", wined3d_debug_location(volume->locations)); ++} ++ ++void wined3d_volume_invalidate_location(struct wined3d_volume *volume, DWORD location) ++{ ++ TRACE("Volume %p, clearing %s.\n", volume, wined3d_debug_location(location)); ++ volume->locations &= ~location; ++ TRACE("new location flags are %s.\n", wined3d_debug_location(volume->locations)); ++} ++ ++#endif /* STAGING_CSMT */ + /* Context activation is done by the caller. */ + static void wined3d_volume_download_data(struct wined3d_volume *volume, + const struct wined3d_context *context, const struct wined3d_bo_address *data) +@@ -120,8 +151,33 @@ + static void wined3d_volume_evict_sysmem(struct wined3d_volume *volume) + { + wined3d_resource_free_sysmem(&volume->resource); ++#if defined(STAGING_CSMT) + volume->resource.map_heap_memory = NULL; + wined3d_resource_invalidate_location(&volume->resource, WINED3D_LOCATION_SYSMEM); ++#else /* STAGING_CSMT */ ++ wined3d_volume_invalidate_location(volume, WINED3D_LOCATION_SYSMEM); ++} ++ ++static DWORD volume_access_from_location(DWORD location) ++{ ++ switch (location) ++ { ++ case WINED3D_LOCATION_DISCARDED: ++ return 0; ++ ++ case WINED3D_LOCATION_SYSMEM: ++ return WINED3D_RESOURCE_ACCESS_CPU; ++ ++ case WINED3D_LOCATION_BUFFER: ++ case WINED3D_LOCATION_TEXTURE_RGB: ++ case WINED3D_LOCATION_TEXTURE_SRGB: ++ return WINED3D_RESOURCE_ACCESS_GPU; ++ ++ default: ++ FIXME("Unhandled location %#x.\n", location); ++ return 0; ++ } ++#endif /* STAGING_CSMT */ + } + + /* Context activation is done by the caller. */ +@@ -163,6 +219,7 @@ + + return TRUE; + } ++#if defined(STAGING_CSMT) + + /* Context activation is done by the caller. */ + static void wined3d_volume_load_location(struct wined3d_resource *resource, +@@ -173,6 +230,22 @@ + + TRACE("Volume %p, loading %s, have %s.\n", volume, wined3d_debug_location(location), + wined3d_debug_location(volume->resource.locations)); ++#else /* STAGING_CSMT */ ++/* Context activation is done by the caller. */ ++static void wined3d_volume_load_location(struct wined3d_volume *volume, ++ struct wined3d_context *context, DWORD location) ++{ ++ DWORD required_access = volume_access_from_location(location); ++ ++ TRACE("Volume %p, loading %s, have %s.\n", volume, wined3d_debug_location(location), ++ wined3d_debug_location(volume->locations)); ++ ++ if ((volume->locations & location) == location) ++ { ++ TRACE("Location(s) already up to date.\n"); ++ return; ++ } ++#endif /* STAGING_CSMT */ + + if ((volume->resource.access_flags & required_access) != required_access) + { +@@ -191,6 +264,7 @@ + && !(volume->container->flags & WINED3D_TEXTURE_SRGB_ALLOCATED))) + ERR("Trying to load (s)RGB texture without prior allocation.\n"); + ++#if defined(STAGING_CSMT) + if (volume->resource.locations & WINED3D_LOCATION_DISCARDED) + { + TRACE("Volume previously discarded, nothing to do.\n"); +@@ -220,6 +294,37 @@ + return; + } + wined3d_resource_validate_location(&volume->resource, location); ++#else /* STAGING_CSMT */ ++ if (volume->locations & WINED3D_LOCATION_DISCARDED) ++ { ++ TRACE("Volume previously discarded, nothing to do.\n"); ++ wined3d_volume_invalidate_location(volume, WINED3D_LOCATION_DISCARDED); ++ } ++ else if (volume->locations & WINED3D_LOCATION_SYSMEM) ++ { ++ struct wined3d_bo_address data = {0, volume->resource.heap_memory}; ++ wined3d_volume_upload_data(volume, context, &data); ++ } ++ else if (volume->locations & WINED3D_LOCATION_BUFFER) ++ { ++ struct wined3d_bo_address data = {volume->pbo, NULL}; ++ wined3d_volume_upload_data(volume, context, &data); ++ } ++ else if (volume->locations & WINED3D_LOCATION_TEXTURE_RGB) ++ { ++ wined3d_volume_srgb_transfer(volume, context, TRUE); ++ } ++ else if (volume->locations & WINED3D_LOCATION_TEXTURE_SRGB) ++ { ++ wined3d_volume_srgb_transfer(volume, context, FALSE); ++ } ++ else ++ { ++ FIXME("Implement texture loading from %s.\n", wined3d_debug_location(volume->locations)); ++ return; ++ } ++ wined3d_volume_validate_location(volume, location); ++#endif /* STAGING_CSMT */ + + if (wined3d_volume_can_evict(volume)) + wined3d_volume_evict_sysmem(volume); +@@ -230,11 +335,24 @@ + if (!volume->resource.heap_memory) + ERR("Trying to load WINED3D_LOCATION_SYSMEM without setting it up first.\n"); + ++#if defined(STAGING_CSMT) + if (volume->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) + { + struct wined3d_bo_address data = {0, volume->resource.heap_memory}; + + if (volume->resource.locations & WINED3D_LOCATION_TEXTURE_RGB) ++#else /* STAGING_CSMT */ ++ if (volume->locations & WINED3D_LOCATION_DISCARDED) ++ { ++ TRACE("Volume previously discarded, nothing to do.\n"); ++ wined3d_volume_invalidate_location(volume, WINED3D_LOCATION_DISCARDED); ++ } ++ else if (volume->locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) ++ { ++ struct wined3d_bo_address data = {0, volume->resource.heap_memory}; ++ ++ if (volume->locations & WINED3D_LOCATION_TEXTURE_RGB) ++#endif /* STAGING_CSMT */ + wined3d_texture_bind_and_dirtify(volume->container, context, FALSE); + else + wined3d_texture_bind_and_dirtify(volume->container, context, TRUE); +@@ -245,6 +363,7 @@ + else + { + FIXME("Implement WINED3D_LOCATION_SYSMEM loading from %s.\n", ++#if defined(STAGING_CSMT) + wined3d_debug_location(volume->resource.locations)); + return; + } +@@ -260,6 +379,28 @@ + struct wined3d_bo_address data = {volume->resource.buffer->name, NULL}; + + if (volume->resource.locations & WINED3D_LOCATION_TEXTURE_RGB) ++#else /* STAGING_CSMT */ ++ wined3d_debug_location(volume->locations)); ++ return; ++ } ++ wined3d_volume_validate_location(volume, WINED3D_LOCATION_SYSMEM); ++ break; ++ ++ case WINED3D_LOCATION_BUFFER: ++ if (!volume->pbo) ++ ERR("Trying to load WINED3D_LOCATION_BUFFER without setting it up first.\n"); ++ ++ if (volume->locations & WINED3D_LOCATION_DISCARDED) ++ { ++ TRACE("Volume previously discarded, nothing to do.\n"); ++ wined3d_volume_invalidate_location(volume, WINED3D_LOCATION_DISCARDED); ++ } ++ else if (volume->locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) ++ { ++ struct wined3d_bo_address data = {volume->pbo, NULL}; ++ ++ if (volume->locations & WINED3D_LOCATION_TEXTURE_RGB) ++#endif /* STAGING_CSMT */ + wined3d_texture_bind_and_dirtify(volume->container, context, FALSE); + else + wined3d_texture_bind_and_dirtify(volume->container, context, TRUE); +@@ -269,6 +410,7 @@ + else + { + FIXME("Implement WINED3D_LOCATION_BUFFER loading from %s.\n", ++#if defined(STAGING_CSMT) + wined3d_debug_location(volume->resource.locations)); + return; + } +@@ -278,6 +420,17 @@ + default: + FIXME("Implement %s loading from %s.\n", wined3d_debug_location(location), + wined3d_debug_location(volume->resource.locations)); ++#else /* STAGING_CSMT */ ++ wined3d_debug_location(volume->locations)); ++ return; ++ } ++ wined3d_volume_validate_location(volume, WINED3D_LOCATION_BUFFER); ++ break; ++ ++ default: ++ FIXME("Implement %s loading from %s.\n", wined3d_debug_location(location), ++ wined3d_debug_location(volume->locations)); ++#endif /* STAGING_CSMT */ + } + } + +@@ -285,6 +438,7 @@ + void wined3d_volume_load(struct wined3d_volume *volume, struct wined3d_context *context, BOOL srgb_mode) + { + wined3d_texture_prepare_texture(volume->container, context, srgb_mode); ++#if defined(STAGING_CSMT) + wined3d_resource_load_location(&volume->resource, context, + srgb_mode ? WINED3D_LOCATION_TEXTURE_SRGB : WINED3D_LOCATION_TEXTURE_RGB); + } +@@ -297,6 +451,51 @@ + resource_cleanup(&volume->resource); + volume->resource.parent_ops->wined3d_object_destroyed(volume->resource.parent); + wined3d_cs_emit_volume_cleanup(device->cs, volume); ++#else /* STAGING_CSMT */ ++ wined3d_volume_load_location(volume, context, ++ srgb_mode ? WINED3D_LOCATION_TEXTURE_SRGB : WINED3D_LOCATION_TEXTURE_RGB); ++} ++ ++/* Context activation is done by the caller. */ ++static void wined3d_volume_prepare_pbo(struct wined3d_volume *volume, struct wined3d_context *context) ++{ ++ const struct wined3d_gl_info *gl_info = context->gl_info; ++ ++ if (volume->pbo) ++ return; ++ ++ GL_EXTCALL(glGenBuffersARB(1, &volume->pbo)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->pbo)); ++ GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->resource.size, NULL, GL_STREAM_DRAW_ARB)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); ++ checkGLcall("Create PBO"); ++ ++ TRACE("Created PBO %u for volume %p.\n", volume->pbo, volume); ++} ++ ++static void wined3d_volume_free_pbo(struct wined3d_volume *volume) ++{ ++ struct wined3d_context *context = context_acquire(volume->resource.device, NULL); ++ const struct wined3d_gl_info *gl_info = context->gl_info; ++ ++ TRACE("Deleting PBO %u belonging to volume %p.\n", volume->pbo, volume); ++ GL_EXTCALL(glDeleteBuffersARB(1, &volume->pbo)); ++ checkGLcall("glDeleteBuffersARB"); ++ volume->pbo = 0; ++ context_release(context); ++} ++ ++void wined3d_volume_destroy(struct wined3d_volume *volume) ++{ ++ TRACE("volume %p.\n", volume); ++ ++ if (volume->pbo) ++ wined3d_volume_free_pbo(volume); ++ ++ resource_cleanup(&volume->resource); ++ volume->resource.parent_ops->wined3d_object_destroyed(volume->resource.parent); ++ HeapFree(GetProcessHeap(), 0, volume); ++#endif /* STAGING_CSMT */ + } + + static void volume_unload(struct wined3d_resource *resource) +@@ -310,6 +509,7 @@ + + TRACE("texture %p.\n", resource); + ++#if defined(STAGING_CSMT) + if (wined3d_resource_prepare_system_memory(&volume->resource)) + { + context = context_acquire(device, NULL); +@@ -322,6 +522,29 @@ + ERR("Out of memory when unloading volume %p.\n", volume); + wined3d_resource_validate_location(&volume->resource, WINED3D_LOCATION_DISCARDED); + wined3d_resource_invalidate_location(&volume->resource, ~WINED3D_LOCATION_DISCARDED); ++#else /* STAGING_CSMT */ ++ if (volume_prepare_system_memory(volume)) ++ { ++ context = context_acquire(device, NULL); ++ wined3d_volume_load_location(volume, context, WINED3D_LOCATION_SYSMEM); ++ context_release(context); ++ wined3d_volume_invalidate_location(volume, ~WINED3D_LOCATION_SYSMEM); ++ } ++ else ++ { ++ ERR("Out of memory when unloading volume %p.\n", volume); ++ wined3d_volume_validate_location(volume, WINED3D_LOCATION_DISCARDED); ++ wined3d_volume_invalidate_location(volume, ~WINED3D_LOCATION_DISCARDED); ++ } ++ ++ if (volume->pbo) ++ { ++ /* Should not happen because only dynamic default pool volumes ++ * have a buffer, and those are not evicted by device_evit_managed_resources ++ * and must be freed before a non-ex device reset. */ ++ ERR("Unloading a volume with a buffer\n"); ++ wined3d_volume_free_pbo(volume); ++#endif /* STAGING_CSMT */ + } + + /* The texture name is managed by the container. */ +@@ -337,11 +560,13 @@ + return wined3d_texture_incref(volume->container); + } + ++#if defined(STAGING_CSMT) + void wined3d_volume_cleanup_cs(struct wined3d_volume *volume) + { + HeapFree(GetProcessHeap(), 0, volume); + } + ++#endif /* STAGING_CSMT */ + ULONG CDECL wined3d_volume_decref(struct wined3d_volume *volume) + { + TRACE("Forwarding to container %p.\n", volume->container); +@@ -368,6 +593,36 @@ + return &volume->resource; + } + ++#if !defined(STAGING_CSMT) ++static BOOL volume_check_block_align(const struct wined3d_volume *volume, ++ const struct wined3d_box *box) ++{ ++ UINT width_mask, height_mask; ++ const struct wined3d_format *format = volume->resource.format; ++ ++ if (!box) ++ return TRUE; ++ ++ /* This assumes power of two block sizes, but NPOT block sizes would be ++ * silly anyway. ++ * ++ * This also assumes that the format's block depth is 1. */ ++ width_mask = format->block_width - 1; ++ height_mask = format->block_height - 1; ++ ++ if (box->left & width_mask) ++ return FALSE; ++ if (box->top & height_mask) ++ return FALSE; ++ if (box->right & width_mask && box->right != volume->resource.width) ++ return FALSE; ++ if (box->bottom & height_mask && box->bottom != volume->resource.height) ++ return FALSE; ++ ++ return TRUE; ++} ++ ++#endif /* STAGING_CSMT */ + static BOOL wined3d_volume_check_box_dimensions(const struct wined3d_volume *volume, + const struct wined3d_box *box) + { +@@ -393,6 +648,7 @@ + HRESULT CDECL wined3d_volume_map(struct wined3d_volume *volume, + struct wined3d_map_desc *map_desc, const struct wined3d_box *box, DWORD flags) + { ++#if defined(STAGING_CSMT) + HRESULT hr; + const struct wined3d_format *format = volume->resource.format; + +@@ -420,6 +676,147 @@ + return hr; + + return hr; ++#else /* STAGING_CSMT */ ++ struct wined3d_device *device = volume->resource.device; ++ struct wined3d_context *context; ++ const struct wined3d_gl_info *gl_info; ++ BYTE *base_memory; ++ const struct wined3d_format *format = volume->resource.format; ++ ++ TRACE("volume %p, map_desc %p, box %p, flags %#x.\n", ++ volume, map_desc, box, flags); ++ ++ map_desc->data = NULL; ++ if (!(volume->resource.access_flags & WINED3D_RESOURCE_ACCESS_CPU)) ++ { ++ WARN("Volume %p is not CPU accessible.\n", volume); ++ return WINED3DERR_INVALIDCALL; ++ } ++ if (volume->resource.map_count) ++ { ++ WARN("Volume is already mapped.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ if (!wined3d_volume_check_box_dimensions(volume, box)) ++ { ++ WARN("Map box is invalid.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ if ((format->flags & WINED3DFMT_FLAG_BLOCKS) && !volume_check_block_align(volume, box)) ++ { ++ WARN("Map box is misaligned for %ux%u blocks.\n", ++ format->block_width, format->block_height); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ flags = wined3d_resource_sanitize_map_flags(&volume->resource, flags); ++ ++ if (volume->resource.map_binding == WINED3D_LOCATION_BUFFER) ++ { ++ context = context_acquire(device, NULL); ++ gl_info = context->gl_info; ++ ++ wined3d_volume_prepare_pbo(volume, context); ++ if (flags & WINED3D_MAP_DISCARD) ++ wined3d_volume_validate_location(volume, WINED3D_LOCATION_BUFFER); ++ else ++ wined3d_volume_load_location(volume, context, WINED3D_LOCATION_BUFFER); ++ ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->pbo)); ++ ++ if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) ++ { ++ GLbitfield mapflags = wined3d_resource_gl_map_flags(flags); ++ mapflags &= ~GL_MAP_FLUSH_EXPLICIT_BIT; ++ base_memory = GL_EXTCALL(glMapBufferRange(GL_PIXEL_UNPACK_BUFFER_ARB, ++ 0, volume->resource.size, mapflags)); ++ } ++ else ++ { ++ GLenum access = wined3d_resource_gl_legacy_map_flags(flags); ++ base_memory = GL_EXTCALL(glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, access)); ++ } ++ ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); ++ checkGLcall("Map PBO"); ++ ++ context_release(context); ++ } ++ else ++ { ++ if (!volume_prepare_system_memory(volume)) ++ { ++ WARN("Out of memory.\n"); ++ map_desc->data = NULL; ++ return E_OUTOFMEMORY; ++ } ++ ++ if (flags & WINED3D_MAP_DISCARD) ++ { ++ wined3d_volume_validate_location(volume, WINED3D_LOCATION_SYSMEM); ++ } ++ else if (!(volume->locations & WINED3D_LOCATION_SYSMEM)) ++ { ++ context = context_acquire(device, NULL); ++ wined3d_volume_load_location(volume, context, WINED3D_LOCATION_SYSMEM); ++ context_release(context); ++ } ++ base_memory = volume->resource.heap_memory; ++ } ++ ++ TRACE("Base memory pointer %p.\n", base_memory); ++ ++ if (format->flags & WINED3DFMT_FLAG_BROKEN_PITCH) ++ { ++ map_desc->row_pitch = volume->resource.width * format->byte_count; ++ map_desc->slice_pitch = map_desc->row_pitch * volume->resource.height; ++ } ++ else ++ { ++ wined3d_resource_get_pitch(&volume->resource, &map_desc->row_pitch, &map_desc->slice_pitch); ++ } ++ ++ if (!box) ++ { ++ TRACE("No box supplied - all is ok\n"); ++ map_desc->data = base_memory; ++ } ++ else ++ { ++ TRACE("Lock Box (%p) = l %u, t %u, r %u, b %u, fr %u, ba %u\n", ++ box, box->left, box->top, box->right, box->bottom, box->front, box->back); ++ ++ if ((format->flags & (WINED3DFMT_FLAG_BLOCKS | WINED3DFMT_FLAG_BROKEN_PITCH)) == WINED3DFMT_FLAG_BLOCKS) ++ { ++ /* Compressed textures are block based, so calculate the offset of ++ * the block that contains the top-left pixel of the locked rectangle. */ ++ map_desc->data = base_memory ++ + (box->front * map_desc->slice_pitch) ++ + ((box->top / format->block_height) * map_desc->row_pitch) ++ + ((box->left / format->block_width) * format->block_byte_count); ++ } ++ else ++ { ++ map_desc->data = base_memory ++ + (map_desc->slice_pitch * box->front) ++ + (map_desc->row_pitch * box->top) ++ + (box->left * volume->resource.format->byte_count); ++ } ++ } ++ ++ if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY))) ++ { ++ wined3d_texture_set_dirty(volume->container); ++ wined3d_volume_invalidate_location(volume, ~volume->resource.map_binding); ++ } ++ ++ volume->resource.map_count++; ++ ++ TRACE("Returning memory %p, row pitch %d, slice pitch %d.\n", ++ map_desc->data, map_desc->row_pitch, map_desc->slice_pitch); ++ ++ return WINED3D_OK; ++#endif /* STAGING_CSMT */ + } + + struct wined3d_volume * CDECL wined3d_volume_from_resource(struct wined3d_resource *resource) +@@ -429,6 +826,7 @@ + + HRESULT CDECL wined3d_volume_unmap(struct wined3d_volume *volume) + { ++#if defined(STAGING_CSMT) + HRESULT hr; + + if (volume->resource.unmap_dirtify) +@@ -438,6 +836,33 @@ + if (hr == WINEDDERR_NOTLOCKED) + return WINED3DERR_INVALIDCALL; + return hr; ++#else /* STAGING_CSMT */ ++ TRACE("volume %p.\n", volume); ++ ++ if (!volume->resource.map_count) ++ { ++ WARN("Trying to unlock an unlocked volume %p.\n", volume); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ if (volume->resource.map_binding == WINED3D_LOCATION_BUFFER) ++ { ++ struct wined3d_device *device = volume->resource.device; ++ struct wined3d_context *context = context_acquire(device, NULL); ++ const struct wined3d_gl_info *gl_info = context->gl_info; ++ ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, volume->pbo)); ++ GL_EXTCALL(glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); ++ checkGLcall("Unmap PBO"); ++ ++ context_release(context); ++ } ++ ++ volume->resource.map_count--; ++ ++ return WINED3D_OK; ++#endif /* STAGING_CSMT */ + } + + static ULONG volume_resource_incref(struct wined3d_resource *resource) +@@ -450,6 +875,7 @@ + return wined3d_volume_decref(volume_from_resource(resource)); + } + ++#if defined(STAGING_CSMT) + static void wined3d_volume_location_invalidated(struct wined3d_resource *resource, DWORD location) + { + struct wined3d_volume *volume = volume_from_resource(resource); +@@ -465,6 +891,13 @@ + volume_unload, + wined3d_volume_location_invalidated, + wined3d_volume_load_location, ++#else /* STAGING_CSMT */ ++static const struct wined3d_resource_ops volume_resource_ops = ++{ ++ volume_resource_incref, ++ volume_resource_decref, ++ volume_unload, ++#endif /* STAGING_CSMT */ + }; + + static HRESULT volume_init(struct wined3d_volume *volume, struct wined3d_texture *container, +@@ -501,7 +934,11 @@ + } + + volume->texture_level = level; ++#if defined(STAGING_CSMT) + volume->resource.locations = WINED3D_LOCATION_DISCARDED; ++#else /* STAGING_CSMT */ ++ volume->locations = WINED3D_LOCATION_DISCARDED; ++#endif /* STAGING_CSMT */ + + if (desc->pool == WINED3D_POOL_DEFAULT && desc->usage & WINED3DUSAGE_DYNAMIC + && gl_info->supported[ARB_PIXEL_BUFFER_OBJECT] +@@ -509,7 +946,9 @@ + { + wined3d_resource_free_sysmem(&volume->resource); + volume->resource.map_binding = WINED3D_LOCATION_BUFFER; ++#if defined(STAGING_CSMT) + volume->resource.map_heap_memory = NULL; ++#endif /* STAGING_CSMT */ + } + + volume->container = container; +diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c +--- a/dlls/wined3d/utils.c ++++ b/dlls/wined3d/utils.c +@@ -3150,6 +3150,7 @@ + /* case WINED3D_TTFF_COUNT1: Won't ever get here. */ + case WINED3D_TTFF_COUNT2: + mat[2] = mat[6] = mat[10] = mat[14] = 0; ++#if defined(STAGING_CSMT) + /* OpenGL divides the first 3 vertex coord by the 4th by default, + * which is essentially the same as D3DTTFF_PROJECTED. Make sure that + * the 4th coord evaluates to 1.0 to eliminate that. +@@ -3162,6 +3163,20 @@ + * A more serious problem occurs if the app passes 4 coordinates in, and the + * 4th is != 1.0(opengl default). This would have to be fixed in draw_strided_slow + * or a replacement shader. */ ++#else /* STAGING_CSMT */ ++ /* OpenGL divides the first 3 vertex coord by the 4th by default, ++ * which is essentially the same as D3DTTFF_PROJECTED. Make sure that ++ * the 4th coord evaluates to 1.0 to eliminate that. ++ * ++ * If the fixed function pipeline is used, the 4th value remains unused, ++ * so there is no danger in doing this. With vertex shaders we have a ++ * problem. Should an app hit that problem, the code here would have to ++ * check for pixel shaders, and the shader has to undo the default gl divide. ++ * ++ * A more serious problem occurs if the app passes 4 coordinates in, and the ++ * 4th is != 1.0(opengl default). This would have to be fixed in drawStridedSlow ++ * or a replacement shader. */ ++#endif /* STAGING_CSMT */ + default: + mat[3] = mat[7] = mat[11] = 0; mat[15] = 1; + } +@@ -3428,7 +3443,11 @@ + unsigned int i; + DWORD ttff; + DWORD cop, aop, carg0, carg1, carg2, aarg0, aarg1, aarg2; ++#if defined(STAGING_CSMT) + const struct wined3d_format *rt_format = state->fb.render_targets[0]->format; ++#else /* STAGING_CSMT */ ++ const struct wined3d_format *rt_format = state->fb->render_targets[0]->format; ++#endif /* STAGING_CSMT */ + const struct wined3d_gl_info *gl_info = context->gl_info; + const struct wined3d_d3d_info *d3d_info = context->d3d_info; + +diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c +--- a/dlls/wined3d/wined3d_main.c ++++ b/dlls/wined3d/wined3d_main.c +@@ -85,8 +85,10 @@ + ~0U, /* No GS shader model limit by default. */ + ~0U, /* No PS shader model limit by default. */ + FALSE, /* 3D support enabled by default. */ ++#if defined(STAGING_CSMT) + TRUE, /* Multithreaded CS by default. */ + FALSE, /* Do not ignore render target maps. */ ++#endif /* STAGING_CSMT */ + }; + + struct wined3d * CDECL wined3d_create(DWORD flags) +@@ -306,6 +308,7 @@ + TRACE("Disabling 3D support.\n"); + wined3d_settings.no_3d = TRUE; + } ++#if defined(STAGING_CSMT) + if (!get_config_key(hkey, appkey, "CSMT", buffer, size) + && !strcmp(buffer,"disabled")) + { +@@ -322,6 +325,9 @@ + + FIXME_(winediag)("Experimental wined3d CSMT feature is currently %s.\n", + wined3d_settings.cs_multithreaded ? "enabled" : "disabled"); ++#else /* STAGING_CSMT */ ++ } ++#endif /* STAGING_CSMT */ + + if (appkey) RegCloseKey( appkey ); + if (hkey) RegCloseKey( hkey ); +diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c +--- a/dlls/wined3d/arb_program_shader.c ++++ b/dlls/wined3d/arb_program_shader.c +@@ -706,7 +706,11 @@ + { + const struct wined3d_shader *pshader = state->shader[WINED3D_SHADER_TYPE_PIXEL]; + const struct arb_ps_compiled_shader *gl_shader = priv->compiled_fprog; ++#if defined(STAGING_CSMT) + UINT rt_height = state->fb.render_targets[0]->height; ++#else /* STAGING_CSMT */ ++ UINT rt_height = state->fb->render_targets[0]->height; ++#endif /* STAGING_CSMT */ + + /* Load DirectX 9 float constants for pixel shader */ + priv->highest_dirty_ps_const = shader_arb_load_constantsF(pshader, gl_info, GL_FRAGMENT_PROGRAM_ARB, +@@ -4674,7 +4678,11 @@ + } + else + { ++#if defined(STAGING_CSMT) + UINT rt_height = state->fb.render_targets[0]->height; ++#else /* STAGING_CSMT */ ++ UINT rt_height = state->fb->render_targets[0]->height; ++#endif /* STAGING_CSMT */ + shader_arb_ps_local_constants(compiled, context, state, rt_height); + } + +@@ -7649,7 +7657,11 @@ + + /* Now load the surface */ + if (wined3d_settings.offscreen_rendering_mode != ORM_FBO ++#if defined(STAGING_CSMT) + && (src_surface->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_DRAWABLE)) ++#else /* STAGING_CSMT */ ++ && (src_surface->locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_DRAWABLE)) ++#endif /* STAGING_CSMT */ + == WINED3D_LOCATION_DRAWABLE + && !wined3d_resource_is_offscreen(&src_surface->container->resource)) + { +@@ -7679,6 +7691,7 @@ + /* Leave the opengl state valid for blitting */ + arbfp_blit_unset(context->gl_info); + ++#if defined(STAGING_CSMT) + if (wined3d_settings.cs_multithreaded) + context->gl_info->gl_ops.gl.p_glFinish(); + else if (wined3d_settings.strict_draw_ordering +@@ -7690,6 +7703,17 @@ + + wined3d_resource_validate_location(&dst_surface->resource, dst_surface->container->resource.draw_binding); + wined3d_resource_invalidate_location(&dst_surface->resource, ~dst_surface->container->resource.draw_binding); ++#else /* STAGING_CSMT */ ++ if (wined3d_settings.strict_draw_ordering ++ || (dst_surface->container->swapchain ++ && (dst_surface->container->swapchain->front_buffer == dst_surface->container))) ++ context->gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ ++ ++ context_release(context); ++ ++ surface_validate_location(dst_surface, dst_surface->container->resource.draw_binding); ++ surface_invalidate_location(dst_surface, ~dst_surface->container->resource.draw_binding); ++#endif /* STAGING_CSMT */ + + return WINED3D_OK; + } +diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c +--- a/dlls/wined3d/view.c ++++ b/dlls/wined3d/view.c +@@ -33,11 +33,13 @@ + return refcount; + } + ++#if defined(STAGING_CSMT) + void wined3d_rendertarget_view_destroy(struct wined3d_rendertarget_view *view) + { + HeapFree(GetProcessHeap(), 0, view); + } + ++#endif /* STAGING_CSMT */ + ULONG CDECL wined3d_rendertarget_view_decref(struct wined3d_rendertarget_view *view) + { + ULONG refcount = InterlockedDecrement(&view->refcount); +@@ -46,6 +48,7 @@ + + if (!refcount) + { ++#if defined(STAGING_CSMT) + struct wined3d_device *device = view->resource->device; + + /* Call wined3d_object_destroyed() before releasing the resource, +@@ -53,6 +56,13 @@ + view->parent_ops->wined3d_object_destroyed(view->parent); + wined3d_resource_decref(view->resource); + wined3d_cs_emit_view_destroy(device->cs, view); ++#else /* STAGING_CSMT */ ++ /* Call wined3d_object_destroyed() before releasing the resource, ++ * since releasing the resource may end up destroying the parent. */ ++ view->parent_ops->wined3d_object_destroyed(view->parent); ++ wined3d_resource_decref(view->resource); ++ HeapFree(GetProcessHeap(), 0, view); ++#endif /* STAGING_CSMT */ + } + + return refcount; +diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c +--- a/dlls/wined3d/context.c ++++ b/dlls/wined3d/context.c +@@ -1448,6 +1448,7 @@ + goto out; + } + ++#if defined(STAGING_CSMT) + ret->current_fb.render_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + sizeof(*ret->current_fb.render_targets) * gl_info->limits.buffers); + ret->current_fb.rt_size = gl_info->limits.buffers; +@@ -1456,6 +1457,7 @@ + if (device->context_count) + ret->offscreenBuffer = device->contexts[0]->offscreenBuffer; + ++#endif /* STAGING_CSMT */ + /* Initialize the texture unit mapping to a 1:1 mapping */ + for (s = 0; s < MAX_COMBINED_SAMPLERS; ++s) + { +@@ -1772,7 +1774,9 @@ + + out: + device->shader_backend->shader_free_context_data(ret); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, ret->current_fb.render_targets); ++#endif /* STAGING_CSMT */ + HeapFree(GetProcessHeap(), 0, ret->free_event_queries); + HeapFree(GetProcessHeap(), 0, ret->free_occlusion_queries); + HeapFree(GetProcessHeap(), 0, ret->free_timestamp_queries); +@@ -1806,7 +1810,9 @@ + } + + device->shader_backend->shader_free_context_data(context); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, context->current_fb.render_targets); ++#endif /* STAGING_CSMT */ + HeapFree(GetProcessHeap(), 0, context->draw_buffers); + HeapFree(GetProcessHeap(), 0, context->blit_targets); + device_context_remove(device, context); +@@ -2209,7 +2215,11 @@ + return TRUE; + } + ++#if defined(STAGING_CSMT) + /* Context activation is done by the caller. */ ++#else /* STAGING_CSMT */ ++/* The caller provides a context */ ++#endif /* STAGING_CSMT */ + static void context_validate_onscreen_formats(struct wined3d_context *context, + const struct wined3d_rendertarget_view *depth_stencil) + { +@@ -2225,6 +2235,7 @@ + WARN("Depth stencil format is not supported by WGL, rendering the backbuffer in an FBO\n"); + + /* The currently active context is the necessary context to access the swapchain's onscreen buffers */ ++#if defined(STAGING_CSMT) + wined3d_resource_load_location(&context->current_rt->resource, context, WINED3D_LOCATION_TEXTURE_RGB); + swapchain->render_to_fbo = TRUE; + swapchain_update_draw_bindings(swapchain); +@@ -2239,6 +2250,22 @@ + return context_generate_rt_mask_from_surface(rt); + else + return context_generate_rt_mask(context->offscreenBuffer); ++#else /* STAGING_CSMT */ ++ surface_load_location(context->current_rt, WINED3D_LOCATION_TEXTURE_RGB); ++ swapchain->render_to_fbo = TRUE; ++ swapchain_update_draw_bindings(swapchain); ++ context_set_render_offscreen(context, TRUE); ++} ++ ++static DWORD context_generate_rt_mask_no_fbo(const struct wined3d_device *device, const struct wined3d_surface *rt) ++{ ++ if (!rt || rt->resource.format->id == WINED3DFMT_NULL) ++ return 0; ++ else if (rt->container->swapchain) ++ return context_generate_rt_mask_from_surface(rt); ++ else ++ return context_generate_rt_mask(device->offscreenBuffer); ++#endif /* STAGING_CSMT */ + } + + /* Context activation is done by the caller. */ +@@ -2270,7 +2297,11 @@ + } + else + { ++#if defined(STAGING_CSMT) + rt_mask = context_generate_rt_mask_no_fbo(context, rt); ++#else /* STAGING_CSMT */ ++ rt_mask = context_generate_rt_mask_no_fbo(device, rt); ++#endif /* STAGING_CSMT */ + } + + cur_mask = context->current_fbo ? &context->current_fbo->rt_mask : &context->draw_buffers_mask; +@@ -2316,7 +2347,11 @@ + DWORD rt_mask = 0, *cur_mask; + UINT i; + ++#if defined(STAGING_CSMT) + if (isStateDirty(context, STATE_FRAMEBUFFER) || !wined3d_fb_equal(fb, &context->current_fb) ++#else /* STAGING_CSMT */ ++ if (isStateDirty(context, STATE_FRAMEBUFFER) || fb != &device->fb ++#endif /* STAGING_CSMT */ + || rt_count != context->gl_info->limits.buffers) + { + if (!context_validate_rt_config(rt_count, rts, fb->depth_stencil)) +@@ -2356,11 +2391,17 @@ + } + else + { ++#if defined(STAGING_CSMT) + rt_mask = context_generate_rt_mask_no_fbo(context, + rt_count ? wined3d_rendertarget_view_get_surface(rts[0]) : NULL); + } + + wined3d_fb_copy(&context->current_fb, fb); ++#else /* STAGING_CSMT */ ++ rt_mask = context_generate_rt_mask_no_fbo(device, ++ rt_count ? wined3d_rendertarget_view_get_surface(rts[0]) : NULL); ++ } ++#endif /* STAGING_CSMT */ + } + else if (wined3d_settings.offscreen_rendering_mode == ORM_FBO + && (!rt_count || wined3d_resource_is_offscreen(rts[0]->resource))) +@@ -2373,7 +2414,11 @@ + } + else + { ++#if defined(STAGING_CSMT) + rt_mask = context_generate_rt_mask_no_fbo(context, ++#else /* STAGING_CSMT */ ++ rt_mask = context_generate_rt_mask_no_fbo(device, ++#endif /* STAGING_CSMT */ + rt_count ? wined3d_rendertarget_view_get_surface(rts[0]) : NULL); + } + +@@ -2408,6 +2453,7 @@ + return TRUE; + } + ++#if defined(STAGING_CSMT) + static DWORD find_draw_buffers_mask(const struct wined3d_context *context, const struct wined3d_state *state) + { + struct wined3d_rendertarget_view **rts = state->fb.render_targets; +@@ -2417,6 +2463,18 @@ + + if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) + return context_generate_rt_mask_no_fbo(context, wined3d_rendertarget_view_get_surface(rts[0])); ++#else /* STAGING_CSMT */ ++static DWORD find_draw_buffers_mask(const struct wined3d_context *context, const struct wined3d_device *device) ++{ ++ const struct wined3d_state *state = &device->state; ++ struct wined3d_rendertarget_view **rts = state->fb->render_targets; ++ struct wined3d_shader *ps = state->shader[WINED3D_SHADER_TYPE_PIXEL]; ++ DWORD rt_mask, rt_mask_bits; ++ unsigned int i; ++ ++ if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) ++ return context_generate_rt_mask_no_fbo(device, wined3d_rendertarget_view_get_surface(rts[0])); ++#endif /* STAGING_CSMT */ + else if (!context->render_offscreen) + return context_generate_rt_mask_from_surface(wined3d_rendertarget_view_get_surface(rts[0])); + +@@ -2439,8 +2497,14 @@ + /* Context activation is done by the caller. */ + void context_state_fb(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { ++#if defined(STAGING_CSMT) + const struct wined3d_fb_state *fb = &state->fb; + DWORD rt_mask = find_draw_buffers_mask(context, state); ++#else /* STAGING_CSMT */ ++ const struct wined3d_device *device = context->swapchain->device; ++ const struct wined3d_fb_state *fb = state->fb; ++ DWORD rt_mask = find_draw_buffers_mask(context, device); ++#endif /* STAGING_CSMT */ + DWORD *cur_mask; + + if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) +@@ -2469,8 +2533,10 @@ + context_apply_draw_buffers(context, rt_mask); + *cur_mask = rt_mask; + } ++#if defined(STAGING_CSMT) + + wined3d_fb_copy(&context->current_fb, &state->fb); ++#endif /* STAGING_CSMT */ + } + + static void context_map_stage(struct wined3d_context *context, DWORD stage, DWORD unit) +@@ -2708,12 +2774,22 @@ + /* Context activation is done by the caller. */ + void context_state_drawbuf(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) + { ++#if defined(STAGING_CSMT) + DWORD rt_mask, *cur_mask; + + if (isStateDirty(context, STATE_FRAMEBUFFER)) return; + + cur_mask = context->current_fbo ? &context->current_fbo->rt_mask : &context->draw_buffers_mask; + rt_mask = find_draw_buffers_mask(context, state); ++#else /* STAGING_CSMT */ ++ const struct wined3d_device *device = context->swapchain->device; ++ DWORD rt_mask, *cur_mask; ++ ++ if (isStateDirty(context, STATE_FRAMEBUFFER)) return; ++ ++ cur_mask = context->current_fbo ? &context->current_fbo->rt_mask : &context->draw_buffers_mask; ++ rt_mask = find_draw_buffers_mask(context, device); ++#endif /* STAGING_CSMT */ + if (rt_mask != *cur_mask) + { + context_apply_draw_buffers(context, rt_mask); +@@ -2895,7 +2971,11 @@ + { + if (state->vertex_declaration->half_float_conv_needed && !stream_info->all_vbo) + { ++#if defined(STAGING_CSMT) + TRACE("Using draw_strided_slow with vertex shaders for FLOAT16 conversion.\n"); ++#else /* STAGING_CSMT */ ++ TRACE("Using drawStridedSlow with vertex shaders for FLOAT16 conversion.\n"); ++#endif /* STAGING_CSMT */ + context->use_immediate_mode_draw = TRUE; + } + else +@@ -2967,11 +3047,19 @@ + } + + /* Context activation is done by the caller. */ ++#if defined(STAGING_CSMT) + BOOL context_apply_draw_state(struct wined3d_context *context, const struct wined3d_device *device, + const struct wined3d_state *state) + { + const struct StateEntry *state_table = context->state_table; + const struct wined3d_fb_state *fb = &state->fb; ++#else /* STAGING_CSMT */ ++BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_device *device) ++{ ++ const struct wined3d_state *state = &device->state; ++ const struct StateEntry *state_table = context->state_table; ++ const struct wined3d_fb_state *fb = state->fb; ++#endif /* STAGING_CSMT */ + unsigned int i, j; + WORD map; + +@@ -2998,12 +3086,17 @@ + for (i = 0, map = context->stream_info.use_map; map; map >>= 1, ++i) + { + if (map & 1) ++#if defined(STAGING_CSMT) + buffer_internal_preload(state->streams[context->stream_info.elements[i].stream_idx].buffer, + context, state); + } + /* PreLoad may kick buffers out of vram. */ + if (isStateDirty(context, STATE_STREAMSRC)) + context_update_stream_info(context, state); ++#else /* STAGING_CSMT */ ++ buffer_mark_used(state->streams[context->stream_info.elements[i].stream_idx].buffer); ++ } ++#endif /* STAGING_CSMT */ + } + if (state->index_buffer) + { +@@ -3100,7 +3193,11 @@ + if (texture->texture_srgb.name) + wined3d_texture_load(texture, context, TRUE); + wined3d_texture_load(texture, context, FALSE); ++#if defined(STAGING_CSMT) + wined3d_resource_invalidate_location(&context->current_rt->resource, WINED3D_LOCATION_DRAWABLE); ++#else /* STAGING_CSMT */ ++ surface_invalidate_location(context->current_rt, WINED3D_LOCATION_DRAWABLE); ++#endif /* STAGING_CSMT */ + } + } + +diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c +--- a/dlls/wined3d/stateblock.c ++++ b/dlls/wined3d/stateblock.c +@@ -464,7 +464,9 @@ + struct wined3d_texture *texture; + struct wined3d_buffer *buffer; + struct wined3d_shader *shader; ++#if defined(STAGING_CSMT) + struct wined3d_rendertarget_view *view; ++#endif /* STAGING_CSMT */ + unsigned int i, j; + + if ((decl = state->vertex_declaration)) +@@ -541,6 +543,7 @@ + } + } + } ++#if defined(STAGING_CSMT) + + if (state->fb.depth_stencil) + { +@@ -566,6 +569,7 @@ + } + } + } ++#endif /* STAGING_CSMT */ + } + + void state_cleanup(struct wined3d_state *state) +@@ -593,7 +597,9 @@ + + HeapFree(GetProcessHeap(), 0, state->vs_consts_f); + HeapFree(GetProcessHeap(), 0, state->ps_consts_f); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, state->fb.render_targets); ++#endif /* STAGING_CSMT */ + } + + ULONG CDECL wined3d_stateblock_decref(struct wined3d_stateblock *stateblock) +@@ -1075,8 +1081,13 @@ + gl_primitive_type = stateblock->state.gl_primitive_type; + prev = device->update_state->gl_primitive_type; + device->update_state->gl_primitive_type = gl_primitive_type; ++#if defined(STAGING_CSMT) + if (gl_primitive_type != prev) + wined3d_cs_emit_set_primitive_type(device->cs, gl_primitive_type); ++#else /* STAGING_CSMT */ ++ if (gl_primitive_type != prev && (gl_primitive_type == GL_POINTS || prev == GL_POINTS)) ++ device_invalidate_state(device, STATE_POINT_SIZE_ENABLE); ++#endif /* STAGING_CSMT */ + } + + if (stateblock->changed.indices) +@@ -1339,6 +1350,7 @@ + state->sampler_states[i][WINED3D_SAMP_ELEMENT_INDEX] = 0; + /* TODO: Vertex offset in the presampled displacement map. */ + state->sampler_states[i][WINED3D_SAMP_DMAP_OFFSET] = 0; ++#if defined(STAGING_CSMT) + state->textures[i] = NULL; + } + +@@ -1356,6 +1368,19 @@ + unsigned int i; + + state->flags = flags; ++#else /* STAGING_CSMT */ ++ } ++} ++ ++HRESULT state_init(struct wined3d_state *state, struct wined3d_fb_state *fb, ++ const struct wined3d_gl_info *gl_info, const struct wined3d_d3d_info *d3d_info, ++ DWORD flags) ++{ ++ unsigned int i; ++ ++ state->flags = flags; ++ state->fb = fb; ++#endif /* STAGING_CSMT */ + + for (i = 0; i < LIGHTMAP_SIZE; i++) + { +@@ -1373,6 +1398,7 @@ + return E_OUTOFMEMORY; + } + ++#if defined(STAGING_CSMT) + if (!(state->fb.render_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + sizeof(*state->fb.render_targets) * gl_info->limits.buffers))) + { +@@ -1382,6 +1408,7 @@ + } + state->fb.rt_size = gl_info->limits.buffers; + ++#endif /* STAGING_CSMT */ + if (flags & WINED3D_STATE_INIT_DEFAULT) + state_init_default(state, gl_info); + +@@ -1392,6 +1419,7 @@ + struct wined3d_device *device, enum wined3d_stateblock_type type) + { + HRESULT hr; ++#if defined(STAGING_CSMT) + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + const struct wined3d_d3d_info *d3d_info = &device->adapter->d3d_info; + +@@ -1399,6 +1427,14 @@ + stateblock->device = device; + + if (FAILED(hr = state_init(&stateblock->state, gl_info, d3d_info, 0))) ++#else /* STAGING_CSMT */ ++ const struct wined3d_d3d_info *d3d_info = &device->adapter->d3d_info; ++ ++ stateblock->ref = 1; ++ stateblock->device = device; ++ ++ if (FAILED(hr = state_init(&stateblock->state, NULL, &device->adapter->gl_info, d3d_info, 0))) ++#endif /* STAGING_CSMT */ + return hr; + + if (FAILED(hr = stateblock_allocate_shader_constants(stateblock))) +diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c +--- a/dlls/d3d9/tests/visual.c ++++ b/dlls/d3d9/tests/visual.c +@@ -16457,7 +16457,11 @@ + fill_surface(surface_managed, 0x0000ff00, D3DLOCK_NO_DIRTY_UPDATE); + add_dirty_rect_test_draw(device); + color = getPixelColor(device, 320, 240); ++#if defined(STAGING_CSMT) + todo_wine ok(color_match(color, 0x00ff0000, 1), ++#else /* STAGING_CSMT */ ++ ok(color_match(color, 0x00ff0000, 1), ++#endif /* STAGING_CSMT */ + "Expected color 0x00ff0000, got 0x%08x.\n", color); + hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); + ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr); +diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h +--- a/dlls/wined3d/wined3d_private.h ++++ b/dlls/wined3d/wined3d_private.h +@@ -1,3 +1,4 @@ ++#if defined(STAGING_CSMT) + /* + * Direct3D wine internal private include file + * +@@ -21,6 +22,31 @@ + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ ++#else /* STAGING_CSMT */ ++/* ++ * Direct3D wine internal private include file ++ * ++ * Copyright 2002-2003 The wine-d3d team ++ * Copyright 2002-2003 Raphael Junqueira ++ * Copyright 2002-2003, 2004 Jason Edmeades ++ * Copyright 2005 Oliver Stieber ++ * Copyright 2006-2011, 2013 Stefan Dösinger for CodeWeavers ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA ++ */ ++#endif /* STAGING_CSMT */ + + #ifndef __WINE_WINED3D_PRIVATE_H + #define __WINE_WINED3D_PRIVATE_H +@@ -31,7 +57,9 @@ + #define WINE_GLAPI + #endif + ++#if defined(STAGING_CSMT) + #include ++#endif /* STAGING_CSMT */ + #include + #include + #include +@@ -280,8 +308,10 @@ + unsigned int max_sm_gs; + unsigned int max_sm_ps; + BOOL no_3d; ++#if defined(STAGING_CSMT) + BOOL cs_multithreaded; + BOOL ignore_rt_map; ++#endif /* STAGING_CSMT */ + }; + + extern struct wined3d_settings wined3d_settings DECLSPEC_HIDDEN; +@@ -968,9 +998,14 @@ + WORD use_map; /* MAX_ATTRIBS, 16 */ + }; + ++#if defined(STAGING_CSMT) + void draw_primitive(struct wined3d_device *device, const struct wined3d_state *state, + UINT start_idx, UINT index_count, UINT start_instance, UINT instance_count, + BOOL indexed) DECLSPEC_HIDDEN; ++#else /* STAGING_CSMT */ ++void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_count, ++ UINT start_instance, UINT instance_count, BOOL indexed) DECLSPEC_HIDDEN; ++#endif /* STAGING_CSMT */ + DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) DECLSPEC_HIDDEN; + + #define eps 1e-8f +@@ -1052,8 +1087,10 @@ + struct list entry; + GLuint id; + struct wined3d_context *context; ++#if defined(STAGING_CSMT) + DWORD samples; + BOOL started; ++#endif /* STAGING_CSMT */ + }; + + union wined3d_gl_query_object +@@ -1089,6 +1126,7 @@ + struct list entry; + GLuint id; + struct wined3d_context *context; ++#if defined(STAGING_CSMT) + UINT64 timestamp; + }; + +@@ -1124,6 +1162,12 @@ + for (i = 0; i < min(dst->rt_size, src->rt_size); i++) + dst->render_targets[i] = src->render_targets[i]; + } ++#else /* STAGING_CSMT */ ++}; ++ ++void context_alloc_timestamp_query(struct wined3d_context *context, struct wined3d_timestamp_query *query) DECLSPEC_HIDDEN; ++void context_free_timestamp_query(struct wined3d_timestamp_query *query) DECLSPEC_HIDDEN; ++#endif /* STAGING_CSMT */ + + struct wined3d_context + { +@@ -1139,7 +1183,9 @@ + DWORD dirtyArray[STATE_HIGHEST + 1]; /* Won't get bigger than that, a state is never marked dirty 2 times */ + DWORD numDirtyEntries; + DWORD isStateDirty[STATE_HIGHEST / (sizeof(DWORD) * CHAR_BIT) + 1]; /* Bitmap to find out quickly if a state is dirty */ ++#if defined(STAGING_CSMT) + struct wined3d_fb_state current_fb; ++#endif /* STAGING_CSMT */ + + struct wined3d_swapchain *swapchain; + struct wined3d_surface *current_rt; +@@ -1237,8 +1283,17 @@ + GLfloat fog_coord_value; + GLfloat color[4], fogstart, fogend, fogcolor[4]; + GLuint dummy_arbfp_prog; ++#if defined(STAGING_CSMT) + + GLenum offscreenBuffer; ++#else /* STAGING_CSMT */ ++}; ++ ++struct wined3d_fb_state ++{ ++ struct wined3d_rendertarget_view **render_targets; ++ struct wined3d_rendertarget_view *depth_stencil; ++#endif /* STAGING_CSMT */ + }; + + typedef void (*APPLYSTATEFUNC)(struct wined3d_context *ctx, const struct wined3d_state *state, DWORD state_id); +@@ -1366,8 +1421,12 @@ + void context_apply_blit_state(struct wined3d_context *context, const struct wined3d_device *device) DECLSPEC_HIDDEN; + BOOL context_apply_clear_state(struct wined3d_context *context, const struct wined3d_device *device, + UINT rt_count, const struct wined3d_fb_state *fb) DECLSPEC_HIDDEN; ++#if defined(STAGING_CSMT) + BOOL context_apply_draw_state(struct wined3d_context *context, const struct wined3d_device *device, + const struct wined3d_state *state) DECLSPEC_HIDDEN; ++#else /* STAGING_CSMT */ ++BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_device *device) DECLSPEC_HIDDEN; ++#endif /* STAGING_CSMT */ + void context_apply_fbo_state_blit(struct wined3d_context *context, GLenum target, + struct wined3d_surface *render_target, struct wined3d_surface *depth_stencil, DWORD location) DECLSPEC_HIDDEN; + void context_active_texture(struct wined3d_context *context, const struct wined3d_gl_info *gl_info, +@@ -1916,7 +1975,11 @@ + struct wined3d_state + { + DWORD flags; ++#if defined(STAGING_CSMT) + struct wined3d_fb_state fb; ++#else /* STAGING_CSMT */ ++ const struct wined3d_fb_state *fb; ++#endif /* STAGING_CSMT */ + + struct wined3d_vertex_declaration *vertex_declaration; + struct wined3d_stream_output stream_output[MAX_STREAM_OUT]; +@@ -1961,6 +2024,7 @@ + DWORD render_states[WINEHIGHEST_RENDER_STATE + 1]; + }; + ++#if defined(STAGING_CSMT) + struct wined3d_gl_bo + { + GLuint name; +@@ -1969,6 +2033,7 @@ + UINT size; + }; + ++#endif /* STAGING_CSMT */ + #define WINED3D_UNMAPPED_STAGE ~0U + + /* Multithreaded flag. Removed from the public header to signal that +@@ -2024,10 +2089,21 @@ + struct wined3d_rendertarget_view *back_buffer_view; + struct wined3d_swapchain **swapchains; + UINT swapchain_count; ++#if defined(STAGING_CSMT) + struct wined3d_rendertarget_view *auto_depth_stencil_view; + + struct list resources; /* a linked list to track resources created by the device */ + struct list shaders; /* a linked list to track shaders (pixel and vertex) */ ++#else /* STAGING_CSMT */ ++ ++ struct list resources; /* a linked list to track resources created by the device */ ++ struct list shaders; /* a linked list to track shaders (pixel and vertex) */ ++ ++ /* Render Target Support */ ++ struct wined3d_fb_state fb; ++ struct wined3d_surface *onscreen_depth_stencil; ++ struct wined3d_rendertarget_view *auto_depth_stencil_view; ++#endif /* STAGING_CSMT */ + + /* For rendering to a texture using glCopyTexImage */ + GLuint depth_blt_texture; +@@ -2038,6 +2114,9 @@ + UINT xScreenSpace; + UINT yScreenSpace; + UINT cursorWidth, cursorHeight; ++#if !defined(STAGING_CSMT) ++ struct wined3d_texture *cursor_texture; ++#endif /* STAGING_CSMT */ + HCURSOR hardwareCursor; + + /* The Wine logo texture */ +@@ -2069,6 +2148,7 @@ + UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc) DECLSPEC_HIDDEN; + void device_resource_add(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void device_resource_released(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++#if defined(STAGING_CSMT) + void device_invalidate_state(const struct wined3d_device *device, DWORD state) DECLSPEC_HIDDEN; + void device_invalidate_shader_constants(const struct wined3d_device *device, DWORD mask) DECLSPEC_HIDDEN; + void device_exec_update_texture(struct wined3d_context *context, struct wined3d_texture *src_texture, +@@ -2080,6 +2160,11 @@ + void device_create_dummy_textures(struct wined3d_device *device, struct wined3d_context *context) DECLSPEC_HIDDEN; + void device_delete_opengl_contexts_cs(struct wined3d_device *device, + struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; ++#else /* STAGING_CSMT */ ++void device_switch_onscreen_ds(struct wined3d_device *device, struct wined3d_context *context, ++ struct wined3d_surface *depth_stencil) DECLSPEC_HIDDEN; ++void device_invalidate_state(const struct wined3d_device *device, DWORD state) DECLSPEC_HIDDEN; ++#endif /* STAGING_CSMT */ + + static inline BOOL isStateDirty(const struct wined3d_context *context, DWORD state) + { +@@ -2103,9 +2188,11 @@ + ULONG (*resource_incref)(struct wined3d_resource *resource); + ULONG (*resource_decref)(struct wined3d_resource *resource); + void (*resource_unload)(struct wined3d_resource *resource); ++#if defined(STAGING_CSMT) + void (*resource_location_invalidated)(struct wined3d_resource *resource, DWORD location); + void (*resource_load_location)(struct wined3d_resource *resource, + struct wined3d_context *context, DWORD location); ++#endif /* STAGING_CSMT */ + }; + + struct wined3d_resource +@@ -2128,6 +2215,7 @@ + UINT depth; + UINT size; + DWORD priority; ++#if defined(STAGING_CSMT) + void *heap_memory, *map_heap_memory, *user_memory, *bitmap_data; + struct wined3d_gl_bo *buffer, *map_buffer; + UINT custom_row_pitch, custom_slice_pitch; +@@ -2135,6 +2223,11 @@ + DWORD locations; + LONG access_fence; + BOOL unmap_dirtify; ++#else /* STAGING_CSMT */ ++ void *heap_memory; ++ UINT custom_row_pitch, custom_slice_pitch; ++ struct list resource_list_entry; ++#endif /* STAGING_CSMT */ + + void *parent; + const struct wined3d_parent_ops *parent_ops; +@@ -2159,6 +2252,7 @@ + void *parent, const struct wined3d_parent_ops *parent_ops, + const struct wined3d_resource_ops *resource_ops) DECLSPEC_HIDDEN; + void resource_unload(struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++#if defined(STAGING_CSMT) + DWORD wined3d_resource_access_from_location(DWORD location) DECLSPEC_HIDDEN; + BOOL wined3d_resource_allocate_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; + void wined3d_resource_changed(struct wined3d_resource *resource, +@@ -2205,6 +2299,15 @@ + { + while(InterlockedCompareExchange(&resource->access_fence, 0, 0)); + } ++#else /* STAGING_CSMT */ ++BOOL wined3d_resource_allocate_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++void wined3d_resource_free_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++GLbitfield wined3d_resource_gl_map_flags(DWORD d3d_flags) DECLSPEC_HIDDEN; ++GLenum wined3d_resource_gl_legacy_map_flags(DWORD d3d_flags) DECLSPEC_HIDDEN; ++BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++DWORD wined3d_resource_sanitize_map_flags(const struct wined3d_resource *resource, DWORD flags) DECLSPEC_HIDDEN; ++void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) DECLSPEC_HIDDEN; ++#endif /* STAGING_CSMT */ + + /* Tests show that the start address of resources is 32 byte aligned */ + #define RESOURCE_ALIGNMENT 16 +@@ -2295,7 +2398,9 @@ + void wined3d_texture_apply_state_changes(struct wined3d_texture *texture, + const DWORD samplerStates[WINED3D_HIGHEST_SAMPLER_STATE + 1], + const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; ++#if defined(STAGING_CSMT) + void wined3d_texture_cleanup_cs(struct wined3d_texture *texture) DECLSPEC_HIDDEN; ++#endif /* STAGING_CSMT */ + void wined3d_texture_bind(struct wined3d_texture *texture, + struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN; + void wined3d_texture_bind_and_dirtify(struct wined3d_texture *texture, +@@ -2329,9 +2434,16 @@ + struct wined3d_resource resource; + struct wined3d_texture *container; + ++#if defined(STAGING_CSMT) + DWORD flags; + GLint texture_level; + DWORD download_count; ++#else /* STAGING_CSMT */ ++ DWORD flags, locations; ++ GLint texture_level; ++ DWORD download_count; ++ GLuint pbo; ++#endif /* STAGING_CSMT */ + }; + + static inline struct wined3d_volume *volume_from_resource(struct wined3d_resource *resource) +@@ -2339,6 +2451,7 @@ + return CONTAINING_RECORD(resource, struct wined3d_volume, resource); + } + ++#if defined(STAGING_CSMT) + HRESULT wined3d_volume_create(struct wined3d_texture *container, const struct wined3d_resource_desc *desc, + unsigned int level, struct wined3d_volume **volume) DECLSPEC_HIDDEN; + void wined3d_volume_destroy(struct wined3d_volume *volume) DECLSPEC_HIDDEN; +@@ -2351,6 +2464,22 @@ + struct wined3d_surface_dib + { + HBITMAP DIBsection; ++#else /* STAGING_CSMT */ ++BOOL volume_prepare_system_memory(struct wined3d_volume *volume) DECLSPEC_HIDDEN; ++HRESULT wined3d_volume_create(struct wined3d_texture *container, const struct wined3d_resource_desc *desc, ++ unsigned int level, struct wined3d_volume **volume) DECLSPEC_HIDDEN; ++void wined3d_volume_destroy(struct wined3d_volume *volume) DECLSPEC_HIDDEN; ++void wined3d_volume_load(struct wined3d_volume *volume, struct wined3d_context *context, ++ BOOL srgb_mode) DECLSPEC_HIDDEN; ++void wined3d_volume_invalidate_location(struct wined3d_volume *volume, DWORD location) DECLSPEC_HIDDEN; ++void wined3d_volume_upload_data(struct wined3d_volume *volume, const struct wined3d_context *context, ++ const struct wined3d_bo_address *data) DECLSPEC_HIDDEN; ++ ++struct wined3d_surface_dib ++{ ++ HBITMAP DIBsection; ++ void *bitmap_data; ++#endif /* STAGING_CSMT */ + UINT bitmap_size; + }; + +@@ -2376,7 +2505,11 @@ + struct wined3d_surface_ops + { + HRESULT (*surface_private_setup)(struct wined3d_surface *surface); ++#if defined(STAGING_CSMT) + void (*surface_frontbuffer_updated)(struct wined3d_surface *surface); ++#else /* STAGING_CSMT */ ++ void (*surface_unmap)(struct wined3d_surface *surface); ++#endif /* STAGING_CSMT */ + }; + + struct wined3d_surface +@@ -2384,12 +2517,25 @@ + struct wined3d_resource resource; + const struct wined3d_surface_ops *surface_ops; + struct wined3d_texture *container; ++#if defined(STAGING_CSMT) + + DWORD flags; + + UINT pow2Width; + UINT pow2Height; + ++#else /* STAGING_CSMT */ ++ void *user_memory; ++ DWORD locations; ++ ++ DWORD flags; ++ ++ UINT pow2Width; ++ UINT pow2Height; ++ ++ /* PBO */ ++ GLuint pbo; ++#endif /* STAGING_CSMT */ + GLuint rb_multisample; + GLuint rb_resolved; + GLenum texture_target; +@@ -2435,10 +2581,19 @@ + GLenum surface_get_gl_buffer(const struct wined3d_surface *surface) DECLSPEC_HIDDEN; + void surface_get_drawable_size(const struct wined3d_surface *surface, const struct wined3d_context *context, + unsigned int *width, unsigned int *height) DECLSPEC_HIDDEN; ++#if defined(STAGING_CSMT) + void surface_load(struct wined3d_surface *surface, struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN; + void surface_load_ds_location(struct wined3d_surface *surface, + struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; + void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb) DECLSPEC_HIDDEN; ++#else /* STAGING_CSMT */ ++void surface_invalidate_location(struct wined3d_surface *surface, DWORD location) DECLSPEC_HIDDEN; ++void surface_load(struct wined3d_surface *surface, BOOL srgb) DECLSPEC_HIDDEN; ++void surface_load_ds_location(struct wined3d_surface *surface, ++ struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN; ++void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb) DECLSPEC_HIDDEN; ++HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) DECLSPEC_HIDDEN; ++#endif /* STAGING_CSMT */ + void surface_modify_ds_location(struct wined3d_surface *surface, DWORD location, UINT w, UINT h) DECLSPEC_HIDDEN; + void surface_prepare_rb(struct wined3d_surface *surface, + const struct wined3d_gl_info *gl_info, BOOL multisample) DECLSPEC_HIDDEN; +@@ -2450,6 +2605,7 @@ + const struct wined3d_gl_info *gl_info, void *mem, unsigned int pitch) DECLSPEC_HIDDEN; + HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const POINT *dst_point, + struct wined3d_surface *src_surface, const RECT *src_rect) DECLSPEC_HIDDEN; ++#if defined(STAGING_CSMT) + HRESULT wined3d_surface_create(struct wined3d_texture *container, const struct wined3d_resource_desc *desc, + GLenum target, unsigned int level, unsigned int layer, DWORD flags, + struct wined3d_surface **surface) DECLSPEC_HIDDEN; +@@ -2465,6 +2621,18 @@ + void draw_textured_quad(const struct wined3d_surface *src_surface, struct wined3d_context *context, + const RECT *src_rect, const RECT *dst_rect, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; + void surface_flip(struct wined3d_surface *front, struct wined3d_surface *back) DECLSPEC_HIDDEN; ++#else /* STAGING_CSMT */ ++void surface_validate_location(struct wined3d_surface *surface, DWORD location) DECLSPEC_HIDDEN; ++HRESULT wined3d_surface_create(struct wined3d_texture *container, const struct wined3d_resource_desc *desc, ++ GLenum target, unsigned int level, unsigned int layer, DWORD flags, ++ struct wined3d_surface **surface) DECLSPEC_HIDDEN; ++void wined3d_surface_destroy(struct wined3d_surface *surface) DECLSPEC_HIDDEN; ++void surface_prepare_map_memory(struct wined3d_surface *surface) DECLSPEC_HIDDEN; ++ ++void draw_textured_quad(const struct wined3d_surface *src_surface, struct wined3d_context *context, ++ const RECT *src_rect, const RECT *dst_rect, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN; ++void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) DECLSPEC_HIDDEN; ++#endif /* STAGING_CSMT */ + + /* Surface flags: */ + #define SFLAG_DIBSECTION 0x00000001 /* Has a DIB section attached for GetDC. */ +@@ -2507,8 +2675,10 @@ + BOOL half_float_conv_needed; + }; + ++#if defined(STAGING_CSMT) + void wined3d_vertex_declaration_destroy(struct wined3d_vertex_declaration *declaration) DECLSPEC_HIDDEN; + ++#endif /* STAGING_CSMT */ + struct wined3d_saved_states + { + DWORD transform[(HIGHEST_TRANSFORMSTATE >> 5) + 1]; +@@ -2576,6 +2746,7 @@ + void stateblock_init_contained_states(struct wined3d_stateblock *stateblock) DECLSPEC_HIDDEN; + + void state_cleanup(struct wined3d_state *state) DECLSPEC_HIDDEN; ++#if defined(STAGING_CSMT) + HRESULT state_init(struct wined3d_state *state, const struct wined3d_gl_info *gl_info, + const struct wined3d_d3d_info *d3d_info, DWORD flags) DECLSPEC_HIDDEN; + void state_unbind_resources(struct wined3d_state *state) DECLSPEC_HIDDEN; +@@ -2626,6 +2797,32 @@ + void wined3d_cs_destroy(struct wined3d_cs *cs) DECLSPEC_HIDDEN; + void wined3d_cs_switch_onscreen_ds(struct wined3d_cs *cs, struct wined3d_context *context, + struct wined3d_surface *depth_stencil) DECLSPEC_HIDDEN; ++#else /* STAGING_CSMT */ ++HRESULT state_init(struct wined3d_state *state, struct wined3d_fb_state *fb, ++ const struct wined3d_gl_info *gl_info, const struct wined3d_d3d_info *d3d_info, ++ DWORD flags) DECLSPEC_HIDDEN; ++void state_unbind_resources(struct wined3d_state *state) DECLSPEC_HIDDEN; ++ ++struct wined3d_cs_ops ++{ ++ void *(*require_space)(struct wined3d_cs *cs, size_t size); ++ void (*submit)(struct wined3d_cs *cs); ++}; ++ ++struct wined3d_cs ++{ ++ const struct wined3d_cs_ops *ops; ++ struct wined3d_device *device; ++ struct wined3d_fb_state fb; ++ struct wined3d_state state; ++ ++ size_t data_size; ++ void *data; ++}; ++ ++struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) DECLSPEC_HIDDEN; ++void wined3d_cs_destroy(struct wined3d_cs *cs) DECLSPEC_HIDDEN; ++#endif /* STAGING_CSMT */ + + void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *rects, + DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil) DECLSPEC_HIDDEN; +@@ -2673,6 +2870,7 @@ + void wined3d_cs_emit_set_vertex_declaration(struct wined3d_cs *cs, + struct wined3d_vertex_declaration *declaration) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_viewport(struct wined3d_cs *cs, const struct wined3d_viewport *viewport) DECLSPEC_HIDDEN; ++#if defined(STAGING_CSMT) + void wined3d_cs_emit_set_consts_f(struct wined3d_cs *cs, UINT start_register, const float *constants, + UINT vector4f_count, enum wined3d_shader_type type) DECLSPEC_HIDDEN; + void wined3d_cs_emit_set_consts_b(struct wined3d_cs *cs, UINT start_register, +@@ -2732,6 +2930,7 @@ + struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; + void wined3d_cs_emit_getdc(struct wined3d_cs *cs, struct wined3d_surface *surface) DECLSPEC_HIDDEN; + void wined3d_cs_emit_releasedc(struct wined3d_cs *cs, struct wined3d_surface *surface) DECLSPEC_HIDDEN; ++#endif /* STAGING_CSMT */ + + /* Direct3D terminology with little modifications. We do not have an issued state + * because only the driver knows about it, but we have a created state because d3d +@@ -2746,8 +2945,12 @@ + struct wined3d_query_ops + { + HRESULT (*query_get_data)(struct wined3d_query *query, void *data, DWORD data_size, DWORD flags); ++#if defined(STAGING_CSMT) + BOOL (*query_poll)(struct wined3d_query *query); + BOOL (*query_issue)(struct wined3d_query *query, DWORD flags); ++#else /* STAGING_CSMT */ ++ HRESULT (*query_issue)(struct wined3d_query *query, DWORD flags); ++#endif /* STAGING_CSMT */ + }; + + struct wined3d_query +@@ -2761,12 +2964,16 @@ + enum wined3d_query_type type; + DWORD data_size; + void *extendedData; ++#if defined(STAGING_CSMT) + + LONG counter_main, counter_retrieved; + struct list poll_list_entry; + }; + + void wined3d_query_destroy(struct wined3d_query *query) DECLSPEC_HIDDEN; ++#else /* STAGING_CSMT */ ++}; ++#endif /* STAGING_CSMT */ + + /* TODO: Add tests and support for FLOAT16_4 POSITIONT, D3DCOLOR position, other + * fixed function semantics as D3DCOLOR or FLOAT16 */ +@@ -2793,7 +3000,9 @@ + GLenum buffer_object_usage; + GLenum buffer_type_hint; + DWORD flags; ++#if defined(STAGING_CSMT) + BOOL ignore_discard; ++#endif /* STAGING_CSMT */ + void *map_ptr; + + struct wined3d_map_range *maps; +@@ -2818,11 +3027,15 @@ + BYTE *buffer_get_sysmem(struct wined3d_buffer *This, struct wined3d_context *context) DECLSPEC_HIDDEN; + void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_context *context, + const struct wined3d_state *state) DECLSPEC_HIDDEN; ++#if defined(STAGING_CSMT) + void buffer_invalidate_bo_range(struct wined3d_buffer *This, UINT offset, UINT size) DECLSPEC_HIDDEN; + void buffer_swap_mem(struct wined3d_buffer *buffer, BYTE *mem) DECLSPEC_HIDDEN; + void buffer_create_buffer_object(struct wined3d_buffer *This, + struct wined3d_context *context) DECLSPEC_HIDDEN; + void wined3d_buffer_cleanup_cs(struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; ++#else /* STAGING_CSMT */ ++void buffer_mark_used(struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; ++#endif /* STAGING_CSMT */ + + struct wined3d_rendertarget_view + { +@@ -2860,8 +3073,10 @@ + return surface_from_resource(resource); + } + ++#if defined(STAGING_CSMT) + void wined3d_rendertarget_view_destroy(struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN; + ++#endif /* STAGING_CSMT */ + struct wined3d_shader_resource_view + { + LONG refcount; +@@ -2874,8 +3089,12 @@ + struct wined3d_swapchain_ops + { + void (*swapchain_present)(struct wined3d_swapchain *swapchain, const RECT *src_rect, ++#if defined(STAGING_CSMT) + const RECT *dst_rect, const RGNDATA *dirty_region, DWORD flags, + struct wined3d_surface *depth_stencil); ++#else /* STAGING_CSMT */ ++ const RECT *dst_rect, const RGNDATA *dirty_region, DWORD flags); ++#endif /* STAGING_CSMT */ + }; + + struct wined3d_swapchain +@@ -2915,8 +3134,10 @@ + HDC swapchain_get_backup_dc(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; + void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; + void swapchain_update_render_to_fbo(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; ++#if defined(STAGING_CSMT) + HRESULT swapchain_create_context_cs(struct wined3d_device *device, + struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; ++#endif /* STAGING_CSMT */ + + /***************************************************************************** + * Utility function prototypes +@@ -3135,7 +3356,9 @@ + void shader_generate_main(const struct wined3d_shader *shader, struct wined3d_shader_buffer *buffer, + const struct wined3d_shader_reg_maps *reg_maps, const DWORD *byte_code, void *backend_ctx) DECLSPEC_HIDDEN; + BOOL shader_match_semantic(const char *semantic_name, enum wined3d_decl_usage usage) DECLSPEC_HIDDEN; ++#if defined(STAGING_CSMT) + void shader_cleanup(struct wined3d_shader *shader) DECLSPEC_HIDDEN; ++#endif /* STAGING_CSMT */ + + static inline BOOL shader_is_scalar(const struct wined3d_shader_register *reg) + { +diff --git a/dlls/wined3d/vertexdeclaration.c b/dlls/wined3d/vertexdeclaration.c +--- a/dlls/wined3d/vertexdeclaration.c ++++ b/dlls/wined3d/vertexdeclaration.c +@@ -48,12 +48,14 @@ + return refcount; + } + ++#if defined(STAGING_CSMT) + void wined3d_vertex_declaration_destroy(struct wined3d_vertex_declaration *declaration) + { + HeapFree(GetProcessHeap(), 0, declaration->elements); + HeapFree(GetProcessHeap(), 0, declaration); + } + ++#endif /* STAGING_CSMT */ + ULONG CDECL wined3d_vertex_declaration_decref(struct wined3d_vertex_declaration *declaration) + { + ULONG refcount = InterlockedDecrement(&declaration->ref); +@@ -62,9 +64,15 @@ + + if (!refcount) + { ++#if defined(STAGING_CSMT) + const struct wined3d_device *device = declaration->device; + declaration->parent_ops->wined3d_object_destroyed(declaration->parent); + wined3d_cs_emit_vertex_declaration_destroy(device->cs, declaration); ++#else /* STAGING_CSMT */ ++ HeapFree(GetProcessHeap(), 0, declaration->elements); ++ declaration->parent_ops->wined3d_object_destroyed(declaration->parent); ++ HeapFree(GetProcessHeap(), 0, declaration); ++#endif /* STAGING_CSMT */ + } + + return refcount; +diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c +--- a/dlls/winex11.drv/opengl.c ++++ b/dlls/winex11.drv/opengl.c +@@ -1983,7 +1983,9 @@ + escape.code = X11DRV_FLUSH_GL_DRAWABLE; + escape.gl_drawable = 0; + ++#if defined(STAGING_CSMT) + ERR("glFinish\n"); ++#endif /* STAGING_CSMT */ + if ((gl = get_gl_drawable( WindowFromDC( ctx->hdc ), 0 ))) + { + switch (gl->type) +@@ -2009,7 +2011,9 @@ + escape.code = X11DRV_FLUSH_GL_DRAWABLE; + escape.gl_drawable = 0; + ++#if defined(STAGING_CSMT) + ERR("glFlush\n"); ++#endif /* STAGING_CSMT */ + if ((gl = get_gl_drawable( WindowFromDC( ctx->hdc ), 0 ))) + { + switch (gl->type) +diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c +--- a/dlls/wined3d/query.c ++++ b/dlls/wined3d/query.c +@@ -233,6 +233,7 @@ + return refcount; + } + ++#if defined(STAGING_CSMT) + void wined3d_query_destroy(struct wined3d_query *query) + { + /* Queries are specific to the GL context that created them. Not +@@ -263,6 +264,7 @@ + HeapFree(GetProcessHeap(), 0, query); + } + ++#endif /* STAGING_CSMT */ + ULONG CDECL wined3d_query_decref(struct wined3d_query *query) + { + ULONG refcount = InterlockedDecrement(&query->ref); +@@ -270,7 +272,38 @@ + TRACE("%p decreasing refcount to %u.\n", query, refcount); + + if (!refcount) ++#if defined(STAGING_CSMT) + wined3d_cs_emit_query_destroy(query->device->cs, query); ++#else /* STAGING_CSMT */ ++ { ++ /* Queries are specific to the GL context that created them. Not ++ * deleting the query will obviously leak it, but that's still better ++ * than potentially deleting a different query with the same id in this ++ * context, and (still) leaking the actual query. */ ++ if (query->type == WINED3D_QUERY_TYPE_EVENT) ++ { ++ struct wined3d_event_query *event_query = query->extendedData; ++ if (event_query) wined3d_event_query_destroy(event_query); ++ } ++ else if (query->type == WINED3D_QUERY_TYPE_OCCLUSION) ++ { ++ struct wined3d_occlusion_query *oq = query->extendedData; ++ ++ if (oq->context) context_free_occlusion_query(oq); ++ HeapFree(GetProcessHeap(), 0, query->extendedData); ++ } ++ else if (query->type == WINED3D_QUERY_TYPE_TIMESTAMP) ++ { ++ struct wined3d_timestamp_query *tq = query->extendedData; ++ ++ if (tq->context) ++ context_free_timestamp_query(tq); ++ HeapFree(GetProcessHeap(), 0, query->extendedData); ++ } ++ ++ HeapFree(GetProcessHeap(), 0, query); ++ } ++#endif /* STAGING_CSMT */ + + return refcount; + } +@@ -295,6 +328,7 @@ + { + TRACE("query %p, flags %#x.\n", query, flags); + ++#if defined(STAGING_CSMT) + if (flags & WINED3DISSUE_END) + query->counter_main++; + +@@ -306,6 +340,9 @@ + query->state = QUERY_SIGNALLED; + + return WINED3D_OK; ++#else /* STAGING_CSMT */ ++ return query->query_ops->query_issue(query, flags); ++#endif /* STAGING_CSMT */ + } + + static void fill_query_data(void *out, unsigned int out_size, const void *result, unsigned int result_size) +@@ -316,10 +353,25 @@ + static HRESULT wined3d_occlusion_query_ops_get_data(struct wined3d_query *query, + void *data, DWORD size, DWORD flags) + { ++#if defined(STAGING_CSMT) + struct wined3d_device *device = query->device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + struct wined3d_occlusion_query *oq = query->extendedData; + GLuint samples; ++#else /* STAGING_CSMT */ ++ struct wined3d_occlusion_query *oq = query->extendedData; ++ struct wined3d_device *device = query->device; ++ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; ++ struct wined3d_context *context; ++ GLuint available; ++ GLuint samples; ++ HRESULT res; ++ ++ TRACE("query %p, data %p, size %#x, flags %#x.\n", query, data, size, flags); ++ ++ if (!oq->context) ++ query->state = QUERY_CREATED; ++#endif /* STAGING_CSMT */ + + if (query->state == QUERY_CREATED) + { +@@ -330,8 +382,10 @@ + return S_OK; + } + ++#if defined(STAGING_CSMT) + TRACE("(%p) : type D3DQUERY_OCCLUSION, data %p, size %#x, flags %#x.\n", query, data, size, flags); + ++#endif /* STAGING_CSMT */ + if (query->state == QUERY_BUILDING) + { + /* Msdn says this returns an error, but our tests show that S_FALSE is returned */ +@@ -347,6 +401,7 @@ + return S_OK; + } + ++#if defined(STAGING_CSMT) + if (!wined3d_settings.cs_multithreaded) + { + if (!query->query_ops->query_poll(query)) +@@ -378,6 +433,14 @@ + FIXME("%p Wrong thread, returning 1.\n", query); + oq->samples = 1; + return TRUE; ++#else /* STAGING_CSMT */ ++ if (oq->context->tid != GetCurrentThreadId()) ++ { ++ FIXME("%p Wrong thread, returning 1.\n", query); ++ samples = 1; ++ fill_query_data(data, size, &samples, sizeof(samples)); ++ return S_OK; ++#endif /* STAGING_CSMT */ + } + + context = context_acquire(query->device, oq->context->current_rt); +@@ -388,6 +451,7 @@ + + if (available) + { ++#if defined(STAGING_CSMT) + GL_EXTCALL(glGetQueryObjectuivARB(oq->id, GL_QUERY_RESULT_ARB, &samples)); + checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT)"); + TRACE("Returning %d samples.\n", samples); +@@ -459,6 +523,69 @@ + + if (data) + fill_query_data(data, dwSize, &ret, sizeof(ret)); ++#else /* STAGING_CSMT */ ++ if (size) ++ { ++ GL_EXTCALL(glGetQueryObjectuivARB(oq->id, GL_QUERY_RESULT_ARB, &samples)); ++ checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT)"); ++ TRACE("Returning %d samples.\n", samples); ++ fill_query_data(data, size, &samples, sizeof(samples)); ++ } ++ res = S_OK; ++ } ++ else ++ { ++ res = S_FALSE; ++ } ++ ++ context_release(context); ++ ++ return res; ++} ++ ++static HRESULT wined3d_event_query_ops_get_data(struct wined3d_query *query, ++ void *data, DWORD size, DWORD flags) ++{ ++ struct wined3d_event_query *event_query = query->extendedData; ++ BOOL signaled; ++ enum wined3d_event_query_result ret; ++ ++ TRACE("query %p, data %p, size %#x, flags %#x.\n", query, data, size, flags); ++ ++ if (!data || !size) return S_OK; ++ if (!event_query) ++ { ++ WARN("Event query not supported by GL, reporting GPU idle.\n"); ++ signaled = TRUE; ++ fill_query_data(data, size, &signaled, sizeof(signaled)); ++ return S_OK; ++ } ++ ++ ret = wined3d_event_query_test(event_query, query->device); ++ switch(ret) ++ { ++ case WINED3D_EVENT_QUERY_OK: ++ case WINED3D_EVENT_QUERY_NOT_STARTED: ++ signaled = TRUE; ++ fill_query_data(data, size, &signaled, sizeof(signaled)); ++ break; ++ ++ case WINED3D_EVENT_QUERY_WAITING: ++ signaled = FALSE; ++ fill_query_data(data, size, &signaled, sizeof(signaled)); ++ break; ++ ++ case WINED3D_EVENT_QUERY_WRONG_THREAD: ++ FIXME("(%p) Wrong thread, reporting GPU idle.\n", query); ++ signaled = TRUE; ++ fill_query_data(data, size, &signaled, sizeof(signaled)); ++ break; ++ ++ case WINED3D_EVENT_QUERY_ERROR: ++ ERR("The GL event query failed, returning D3DERR_INVALIDCALL\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++#endif /* STAGING_CSMT */ + + return S_OK; + } +@@ -477,7 +604,11 @@ + return query->type; + } + ++#if defined(STAGING_CSMT) + static BOOL wined3d_event_query_ops_issue(struct wined3d_query *query, DWORD flags) ++#else /* STAGING_CSMT */ ++static HRESULT wined3d_event_query_ops_issue(struct wined3d_query *query, DWORD flags) ++#endif /* STAGING_CSMT */ + { + TRACE("query %p, flags %#x.\n", query, flags); + +@@ -487,6 +618,7 @@ + struct wined3d_event_query *event_query = query->extendedData; + + /* Faked event query support */ ++#if defined(STAGING_CSMT) + if (!event_query) return FALSE; + + wined3d_event_query_issue(event_query, query->device); +@@ -505,6 +637,30 @@ + struct wined3d_device *device = query->device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + BOOL poll = FALSE; ++#else /* STAGING_CSMT */ ++ if (!event_query) return WINED3D_OK; ++ ++ wined3d_event_query_issue(event_query, query->device); ++ } ++ else if (flags & WINED3DISSUE_BEGIN) ++ { ++ /* Started implicitly at device creation */ ++ ERR("Event query issued with START flag - what to do?\n"); ++ } ++ ++ if (flags & WINED3DISSUE_BEGIN) ++ query->state = QUERY_BUILDING; ++ else ++ query->state = QUERY_SIGNALLED; ++ ++ return WINED3D_OK; ++} ++ ++static HRESULT wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD flags) ++{ ++ struct wined3d_device *device = query->device; ++ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; ++#endif /* STAGING_CSMT */ + + TRACE("query %p, flags %#x.\n", query, flags); + +@@ -516,7 +672,11 @@ + /* This is allowed according to msdn and our tests. Reset the query and restart */ + if (flags & WINED3DISSUE_BEGIN) + { ++#if defined(STAGING_CSMT) + if (oq->started) ++#else /* STAGING_CSMT */ ++ if (query->state == QUERY_BUILDING) ++#endif /* STAGING_CSMT */ + { + if (oq->context->tid != GetCurrentThreadId()) + { +@@ -545,7 +705,9 @@ + checkGLcall("glBeginQuery()"); + + context_release(context); ++#if defined(STAGING_CSMT) + oq->started = TRUE; ++#endif /* STAGING_CSMT */ + } + if (flags & WINED3DISSUE_END) + { +@@ -553,7 +715,11 @@ + * our tests show that it returns OK. But OpenGL doesn't like it, so avoid + * generating an error + */ ++#if defined(STAGING_CSMT) + if (oq->started) ++#else /* STAGING_CSMT */ ++ if (query->state == QUERY_BUILDING) ++#endif /* STAGING_CSMT */ + { + if (oq->context->tid != GetCurrentThreadId()) + { +@@ -567,10 +733,15 @@ + checkGLcall("glEndQuery()"); + + context_release(context); ++#if defined(STAGING_CSMT) + poll = TRUE; + } + } + oq->started = FALSE; ++#else /* STAGING_CSMT */ ++ } ++ } ++#endif /* STAGING_CSMT */ + } + } + else +@@ -578,6 +749,7 @@ + FIXME("%p Occlusion queries not supported.\n", query); + } + ++#if defined(STAGING_CSMT) + return poll; + } + +@@ -636,6 +808,47 @@ + FIXME("%p Wrong thread, returning 1.\n", query); + tq->timestamp = 1; + return TRUE; ++#else /* STAGING_CSMT */ ++ if (flags & WINED3DISSUE_BEGIN) ++ query->state = QUERY_BUILDING; ++ else ++ query->state = QUERY_SIGNALLED; ++ ++ return WINED3D_OK; /* can be WINED3DERR_INVALIDCALL. */ ++} ++ ++static HRESULT wined3d_timestamp_query_ops_get_data(struct wined3d_query *query, ++ void *data, DWORD size, DWORD flags) ++{ ++ struct wined3d_timestamp_query *tq = query->extendedData; ++ struct wined3d_device *device = query->device; ++ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; ++ struct wined3d_context *context; ++ GLuint available; ++ GLuint64 timestamp; ++ HRESULT res; ++ ++ TRACE("query %p, data %p, size %#x, flags %#x.\n", query, data, size, flags); ++ ++ if (!tq->context) ++ query->state = QUERY_CREATED; ++ ++ if (query->state == QUERY_CREATED) ++ { ++ /* D3D allows GetData on a new query, OpenGL doesn't. So just invent the data ourselves. */ ++ TRACE("Query wasn't yet started, returning S_OK.\n"); ++ timestamp = 0; ++ fill_query_data(data, size, ×tamp, sizeof(timestamp)); ++ return S_OK; ++ } ++ ++ if (tq->context->tid != GetCurrentThreadId()) ++ { ++ FIXME("%p Wrong thread, returning 1.\n", query); ++ timestamp = 1; ++ fill_query_data(data, size, ×tamp, sizeof(timestamp)); ++ return S_OK; ++#endif /* STAGING_CSMT */ + } + + context = context_acquire(query->device, tq->context->current_rt); +@@ -646,6 +859,7 @@ + + if (available) + { ++#if defined(STAGING_CSMT) + GL_EXTCALL(glGetQueryObjectui64v(tq->id, GL_QUERY_RESULT_ARB, ×tamp)); + checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT)"); + TRACE("Returning timestamp %s.\n", wine_dbgstr_longlong(timestamp)); +@@ -663,6 +877,28 @@ + } + + static BOOL wined3d_timestamp_query_ops_issue(struct wined3d_query *query, DWORD flags) ++#else /* STAGING_CSMT */ ++ if (size) ++ { ++ GL_EXTCALL(glGetQueryObjectui64v(tq->id, GL_QUERY_RESULT_ARB, ×tamp)); ++ checkGLcall("glGetQueryObjectuivARB(GL_QUERY_RESULT)"); ++ TRACE("Returning timestamp %s.\n", wine_dbgstr_longlong(timestamp)); ++ fill_query_data(data, size, ×tamp, sizeof(timestamp)); ++ } ++ res = S_OK; ++ } ++ else ++ { ++ res = S_FALSE; ++ } ++ ++ context_release(context); ++ ++ return res; ++} ++ ++static HRESULT wined3d_timestamp_query_ops_issue(struct wined3d_query *query, DWORD flags) ++#endif /* STAGING_CSMT */ + { + struct wined3d_device *device = query->device; + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; +@@ -695,6 +931,7 @@ + } + + if (flags & WINED3DISSUE_END) ++#if defined(STAGING_CSMT) + return TRUE; + return FALSE; + } +@@ -711,6 +948,26 @@ + { + TRACE("Query is building, returning S_FALSE.\n"); + return S_FALSE; ++#else /* STAGING_CSMT */ ++ query->state = QUERY_SIGNALLED; ++ ++ return WINED3D_OK; ++} ++ ++static HRESULT wined3d_timestamp_disjoint_query_ops_get_data(struct wined3d_query *query, ++ void *data, DWORD size, DWORD flags) ++{ ++ TRACE("query %p, data %p, size %#x, flags %#x.\n", query, data, size, flags); ++ ++ if (query->type == WINED3D_QUERY_TYPE_TIMESTAMP_DISJOINT) ++ { ++ static const struct wined3d_query_data_timestamp_disjoint disjoint_data = {FALSE, 1000 * 1000 * 1000}; ++ ++ if (query->state == QUERY_BUILDING) ++ { ++ TRACE("Query is building, returning S_FALSE.\n"); ++ return S_FALSE; ++#endif /* STAGING_CSMT */ + } + + fill_query_data(data, size, &disjoint_data, sizeof(disjoint_data)); +@@ -724,6 +981,7 @@ + return S_OK; + } + ++#if defined(STAGING_CSMT) + static BOOL wined3d_timestamp_disjoint_query_ops_poll(struct wined3d_query *query) + { + return TRUE; +@@ -760,6 +1018,41 @@ + { + wined3d_timestamp_disjoint_query_ops_get_data, + wined3d_timestamp_disjoint_query_ops_poll, ++#else /* STAGING_CSMT */ ++static HRESULT wined3d_timestamp_disjoint_query_ops_issue(struct wined3d_query *query, DWORD flags) ++{ ++ TRACE("query %p, flags %#x.\n", query, flags); ++ ++ if (flags & WINED3DISSUE_BEGIN) ++ query->state = QUERY_BUILDING; ++ if (flags & WINED3DISSUE_END) ++ query->state = QUERY_SIGNALLED; ++ ++ return WINED3D_OK; ++} ++ ++static const struct wined3d_query_ops event_query_ops = ++{ ++ wined3d_event_query_ops_get_data, ++ wined3d_event_query_ops_issue, ++}; ++ ++static const struct wined3d_query_ops occlusion_query_ops = ++{ ++ wined3d_occlusion_query_ops_get_data, ++ wined3d_occlusion_query_ops_issue, ++}; ++ ++static const struct wined3d_query_ops timestamp_query_ops = ++{ ++ wined3d_timestamp_query_ops_get_data, ++ wined3d_timestamp_query_ops_issue, ++}; ++ ++static const struct wined3d_query_ops timestamp_disjoint_query_ops = ++{ ++ wined3d_timestamp_disjoint_query_ops_get_data, ++#endif /* STAGING_CSMT */ + wined3d_timestamp_disjoint_query_ops_issue, + }; + +@@ -781,6 +1074,7 @@ + } + query->query_ops = &occlusion_query_ops; + query->data_size = sizeof(DWORD); ++#if defined(STAGING_CSMT) + query->extendedData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + sizeof(struct wined3d_occlusion_query)); + if (!query->extendedData) +@@ -788,6 +1082,15 @@ + ERR("Failed to allocate occlusion query extended data.\n"); + return E_OUTOFMEMORY; + } ++#else /* STAGING_CSMT */ ++ query->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_occlusion_query)); ++ if (!query->extendedData) ++ { ++ ERR("Failed to allocate occlusion query extended data.\n"); ++ return E_OUTOFMEMORY; ++ } ++ ((struct wined3d_occlusion_query *)query->extendedData)->context = NULL; ++#endif /* STAGING_CSMT */ + break; + + case WINED3D_QUERY_TYPE_EVENT: +@@ -860,7 +1163,9 @@ + query->state = QUERY_CREATED; + query->device = device; + query->ref = 1; ++#if defined(STAGING_CSMT) + list_init(&query->poll_list_entry); ++#endif /* STAGING_CSMT */ + + return WINED3D_OK; + } +diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c +--- a/dlls/wined3d/drawprim.c ++++ b/dlls/wined3d/drawprim.c +@@ -36,7 +36,11 @@ + #include + + /* Context activation is done by the caller. */ ++#if defined(STAGING_CSMT) + static void draw_strided_fast(const struct wined3d_gl_info *gl_info, GLenum primitive_type, UINT count, UINT idx_size, ++#else /* STAGING_CSMT */ ++static void drawStridedFast(const struct wined3d_gl_info *gl_info, GLenum primitive_type, UINT count, UINT idx_size, ++#endif /* STAGING_CSMT */ + const void *idx_data, UINT start_idx, INT base_vertex_index, UINT start_instance, UINT instance_count) + { + if (idx_size) +@@ -92,7 +96,11 @@ + */ + + /* Context activation is done by the caller. */ ++#if defined(STAGING_CSMT) + static void draw_strided_slow(const struct wined3d_state *state, struct wined3d_context *context, ++#else /* STAGING_CSMT */ ++static void drawStridedSlow(const struct wined3d_device *device, struct wined3d_context *context, ++#endif /* STAGING_CSMT */ + const struct wined3d_stream_info *si, UINT NumVertexes, GLenum glPrimType, + const void *idxData, UINT idxSize, UINT startIdx) + { +@@ -100,6 +108,9 @@ + const WORD *pIdxBufS = NULL; + const DWORD *pIdxBufL = NULL; + UINT vx_index; ++#if !defined(STAGING_CSMT) ++ const struct wined3d_state *state = &device->state; ++#endif /* STAGING_CSMT */ + LONG SkipnStrides = startIdx; + BOOL pixelShader = use_ps(state); + BOOL specular_fog = FALSE; +@@ -449,7 +460,11 @@ + } + + /* Context activation is done by the caller. */ ++#if defined(STAGING_CSMT) + static void draw_strided_slow_vs(struct wined3d_context *context, const struct wined3d_state *state, ++#else /* STAGING_CSMT */ ++static void drawStridedSlowVs(struct wined3d_context *context, const struct wined3d_state *state, ++#endif /* STAGING_CSMT */ + const struct wined3d_stream_info *si, UINT numberOfVertices, GLenum glPrimitiveType, + const void *idxData, UINT idxSize, UINT startIdx) + { +@@ -506,7 +521,11 @@ + } + + /* Context activation is done by the caller. */ ++#if defined(STAGING_CSMT) + static void draw_strided_instanced(struct wined3d_context *context, const struct wined3d_state *state, ++#else /* STAGING_CSMT */ ++static void drawStridedInstanced(struct wined3d_context *context, const struct wined3d_state *state, ++#endif /* STAGING_CSMT */ + const struct wined3d_stream_info *si, UINT numberOfVertices, GLenum glPrimitiveType, + const void *idxData, UINT idxSize, UINT startIdx, UINT base_vertex_index, UINT instance_count) + { +@@ -591,10 +610,17 @@ + } + + /* Routine common to the draw primitive and draw indexed primitive routines */ ++#if defined(STAGING_CSMT) + void draw_primitive(struct wined3d_device *device, const struct wined3d_state *state, + UINT start_idx, UINT index_count, UINT start_instance, UINT instance_count, + BOOL indexed) + { ++#else /* STAGING_CSMT */ ++void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_count, ++ UINT start_instance, UINT instance_count, BOOL indexed) ++{ ++ const struct wined3d_state *state = &device->state; ++#endif /* STAGING_CSMT */ + const struct wined3d_stream_info *stream_info; + struct wined3d_event_query *ib_query = NULL; + struct wined3d_stream_info si_emulated; +@@ -607,6 +633,7 @@ + + if (!index_count) return; + ++#if defined(STAGING_CSMT) + context = context_acquire(device, wined3d_rendertarget_view_get_surface(state->fb.render_targets[0])); + if (!context->valid) + { +@@ -648,6 +675,49 @@ + wined3d_cs_switch_onscreen_ds(device->cs, context, ds); + + if (ds->resource.locations & location) ++#else /* STAGING_CSMT */ ++ if (state->render_states[WINED3D_RS_COLORWRITEENABLE]) ++ { ++ /* Invalidate the back buffer memory so LockRect will read it the next time */ ++ for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i) ++ { ++ struct wined3d_surface *target = wined3d_rendertarget_view_get_surface(device->fb.render_targets[i]); ++ if (target) ++ { ++ surface_load_location(target, target->container->resource.draw_binding); ++ surface_invalidate_location(target, ~target->container->resource.draw_binding); ++ } ++ } ++ } ++ ++ context = context_acquire(device, wined3d_rendertarget_view_get_surface(device->fb.render_targets[0])); ++ if (!context->valid) ++ { ++ context_release(context); ++ WARN("Invalid context, skipping draw.\n"); ++ return; ++ } ++ gl_info = context->gl_info; ++ ++ if (device->fb.depth_stencil) ++ { ++ /* Note that this depends on the context_acquire() call above to set ++ * context->render_offscreen properly. We don't currently take the ++ * Z-compare function into account, but we could skip loading the ++ * depthstencil for D3DCMP_NEVER and D3DCMP_ALWAYS as well. Also note ++ * that we never copy the stencil data.*/ ++ DWORD location = context->render_offscreen ? device->fb.depth_stencil->resource->draw_binding ++ : WINED3D_LOCATION_DRAWABLE; ++ if (state->render_states[WINED3D_RS_ZWRITEENABLE] || state->render_states[WINED3D_RS_ZENABLE]) ++ { ++ struct wined3d_surface *ds = wined3d_rendertarget_view_get_surface(device->fb.depth_stencil); ++ RECT current_rect, draw_rect, r; ++ ++ if (!context->render_offscreen && ds != device->onscreen_depth_stencil) ++ device_switch_onscreen_ds(device, context, ds); ++ ++ if (ds->locations & location) ++#endif /* STAGING_CSMT */ + SetRect(¤t_rect, 0, 0, ds->ds_current_size.cx, ds->ds_current_size.cy); + else + SetRectEmpty(¤t_rect); +@@ -660,6 +730,7 @@ + } + } + ++#if defined(STAGING_CSMT) + if (!context_apply_draw_state(context, device, state)) + { + context_release(context); +@@ -670,6 +741,18 @@ + if (state->fb.depth_stencil && state->render_states[WINED3D_RS_ZWRITEENABLE]) + { + struct wined3d_surface *ds = wined3d_rendertarget_view_get_surface(state->fb.depth_stencil); ++#else /* STAGING_CSMT */ ++ if (!context_apply_draw_state(context, device)) ++ { ++ context_release(context); ++ WARN("Unable to apply draw state, skipping draw.\n"); ++ return; ++ } ++ ++ if (device->fb.depth_stencil && state->render_states[WINED3D_RS_ZWRITEENABLE]) ++ { ++ struct wined3d_surface *ds = wined3d_rendertarget_view_get_surface(device->fb.depth_stencil); ++#endif /* STAGING_CSMT */ + DWORD location = context->render_offscreen ? ds->container->resource.draw_binding : WINED3D_LOCATION_DRAWABLE; + + surface_modify_ds_location(ds, location, ds->ds_current_size.cx, ds->ds_current_size.cy); +@@ -752,6 +835,7 @@ + else + WARN_(d3d_perf)("Using immediate mode with vertex shaders for half float emulation.\n"); + ++#if defined(STAGING_CSMT) + draw_strided_slow_vs(context, state, stream_info, index_count, + state->gl_primitive_type, idx_data, idx_size, start_idx); + } +@@ -770,6 +854,26 @@ + else + { + draw_strided_fast(gl_info, state->gl_primitive_type, index_count, idx_size, idx_data, ++#else /* STAGING_CSMT */ ++ drawStridedSlowVs(context, state, stream_info, index_count, ++ state->gl_primitive_type, idx_data, idx_size, start_idx); ++ } ++ else ++ { ++ drawStridedSlow(device, context, stream_info, index_count, ++ state->gl_primitive_type, idx_data, idx_size, start_idx); ++ } ++ } ++ else if (!gl_info->supported[ARB_INSTANCED_ARRAYS] && instance_count) ++ { ++ /* Instancing emulation by mixing immediate mode and arrays. */ ++ drawStridedInstanced(context, state, stream_info, index_count, state->gl_primitive_type, ++ idx_data, idx_size, start_idx, state->base_vertex_index, instance_count); ++ } ++ else ++ { ++ drawStridedFast(gl_info, state->gl_primitive_type, index_count, idx_size, idx_data, ++#endif /* STAGING_CSMT */ + start_idx, state->base_vertex_index, start_instance, instance_count); + } + +diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c +--- a/dlls/wined3d/device.c ++++ b/dlls/wined3d/device.c +@@ -198,6 +198,24 @@ + device->contexts = new_array; + } + ++#if !defined(STAGING_CSMT) ++void device_switch_onscreen_ds(struct wined3d_device *device, ++ struct wined3d_context *context, struct wined3d_surface *depth_stencil) ++{ ++ if (device->onscreen_depth_stencil) ++ { ++ surface_load_ds_location(device->onscreen_depth_stencil, context, WINED3D_LOCATION_TEXTURE_RGB); ++ ++ surface_modify_ds_location(device->onscreen_depth_stencil, WINED3D_LOCATION_TEXTURE_RGB, ++ device->onscreen_depth_stencil->ds_current_size.cx, ++ device->onscreen_depth_stencil->ds_current_size.cy); ++ wined3d_surface_decref(device->onscreen_depth_stencil); ++ } ++ device->onscreen_depth_stencil = depth_stencil; ++ wined3d_surface_incref(device->onscreen_depth_stencil); ++} ++ ++#endif /* STAGING_CSMT */ + static BOOL is_full_clear(const struct wined3d_surface *target, const RECT *draw_rect, const RECT *clear_rect) + { + /* partial draw rect */ +@@ -220,7 +238,11 @@ + { + RECT current_rect, r; + ++#if defined(STAGING_CSMT) + if (ds->resource.locations & WINED3D_LOCATION_DISCARDED) ++#else /* STAGING_CSMT */ ++ if (ds->locations & WINED3D_LOCATION_DISCARDED) ++#endif /* STAGING_CSMT */ + { + /* Depth buffer was discarded, make it entirely current in its new location since + * there is no other place where we would get data anyway. */ +@@ -228,7 +250,11 @@ + return; + } + ++#if defined(STAGING_CSMT) + if (ds->resource.locations & location) ++#else /* STAGING_CSMT */ ++ if (ds->locations & location) ++#endif /* STAGING_CSMT */ + SetRect(¤t_rect, 0, 0, + ds->ds_current_size.cx, + ds->ds_current_size.cy); +@@ -284,6 +310,7 @@ + unsigned int i; + RECT ds_rect; + ++#if defined(STAGING_CSMT) + context = context_acquire(device, target); + if (!context->valid) + { +@@ -293,6 +320,7 @@ + } + gl_info = context->gl_info; + ++#endif /* STAGING_CSMT */ + /* When we're clearing parts of the drawable, make sure that the target surface is well up to date in the + * drawable. After the clear we'll mark the drawable up to date, so we have to make sure that this is true + * for the cleared parts, and the untouched parts. +@@ -307,9 +335,24 @@ + { + struct wined3d_surface *rt = wined3d_rendertarget_view_get_surface(fb->render_targets[i]); + if (rt) ++#if defined(STAGING_CSMT) + wined3d_resource_load_location(&rt->resource, context, rt->container->resource.draw_binding); + } + } ++#else /* STAGING_CSMT */ ++ surface_load_location(rt, rt->container->resource.draw_binding); ++ } ++ } ++ ++ context = context_acquire(device, target); ++ if (!context->valid) ++ { ++ context_release(context); ++ WARN("Invalid context, skipping clear.\n"); ++ return; ++ } ++ gl_info = context->gl_info; ++#endif /* STAGING_CSMT */ + + if (target) + { +@@ -327,8 +370,13 @@ + { + DWORD location = render_offscreen ? fb->depth_stencil->resource->draw_binding : WINED3D_LOCATION_DRAWABLE; + ++#if defined(STAGING_CSMT) + if (!render_offscreen && depth_stencil != device->cs->onscreen_depth_stencil) + wined3d_cs_switch_onscreen_ds(device->cs, context, depth_stencil); ++#else /* STAGING_CSMT */ ++ if (!render_offscreen && depth_stencil != device->onscreen_depth_stencil) ++ device_switch_onscreen_ds(device, context, depth_stencil); ++#endif /* STAGING_CSMT */ + prepare_ds_clear(depth_stencil, context, location, + draw_rect, rect_count, clear_rect, &ds_rect); + } +@@ -376,8 +424,13 @@ + + if (rt) + { ++#if defined(STAGING_CSMT) + wined3d_resource_validate_location(&rt->resource, rt->container->resource.draw_binding); + wined3d_resource_invalidate_location(&rt->resource, ~rt->container->resource.draw_binding); ++#else /* STAGING_CSMT */ ++ surface_validate_location(rt, rt->container->resource.draw_binding); ++ surface_invalidate_location(rt, ~rt->container->resource.draw_binding); ++#endif /* STAGING_CSMT */ + } + } + +@@ -608,7 +661,11 @@ + } + + /* Context activation is done by the caller. */ ++#if defined(STAGING_CSMT) + void device_create_dummy_textures(struct wined3d_device *device, struct wined3d_context *context) ++#else /* STAGING_CSMT */ ++static void create_dummy_textures(struct wined3d_device *device, struct wined3d_context *context) ++#endif /* STAGING_CSMT */ + { + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + unsigned int i, j, count; +@@ -835,7 +892,11 @@ + BOOL ds_enable = !!swapchain->desc.enable_auto_depth_stencil; + unsigned int i; + ++#if defined(STAGING_CSMT) + if (device->state.fb.render_targets) ++#else /* STAGING_CSMT */ ++ if (device->fb.render_targets) ++#endif /* STAGING_CSMT */ + { + for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i) + { +@@ -853,7 +914,13 @@ + struct wined3d_swapchain_desc *swapchain_desc) + { + static const struct wined3d_color black = {0.0f, 0.0f, 0.0f, 0.0f}; ++#if defined(STAGING_CSMT) + struct wined3d_swapchain *swapchain = NULL; ++#else /* STAGING_CSMT */ ++ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; ++ struct wined3d_swapchain *swapchain = NULL; ++ struct wined3d_context *context; ++#endif /* STAGING_CSMT */ + DWORD clear_flags = 0; + HRESULT hr; + +@@ -864,6 +931,11 @@ + if (device->wined3d->flags & WINED3D_NO3D) + return WINED3DERR_INVALIDCALL; + ++#if !defined(STAGING_CSMT) ++ device->fb.render_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ++ sizeof(*device->fb.render_targets) * gl_info->limits.buffers); ++ ++#endif /* STAGING_CSMT */ + if (FAILED(hr = device->shader_backend->shader_alloc_private(device, + device->adapter->vertex_pipe, device->adapter->fragment_pipe))) + { +@@ -904,7 +976,14 @@ + device->swapchains[0] = swapchain; + device_init_swapchain_state(device, swapchain); + ++#if defined(STAGING_CSMT) + wined3d_cs_emit_create_dummy_textures(device->cs); ++#else /* STAGING_CSMT */ ++ context = context_acquire(device, ++ surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0))); ++ ++ create_dummy_textures(device, context); ++#endif /* STAGING_CSMT */ + + device->contexts[0]->last_was_rhw = 0; + +@@ -916,7 +995,11 @@ + + case ORM_BACKBUFFER: + { ++#if defined(STAGING_CSMT) + if (device->contexts[0]->aux_buffers > 0) ++#else /* STAGING_CSMT */ ++ if (context_get_current()->aux_buffers > 0) ++#endif /* STAGING_CSMT */ + { + TRACE("Using auxiliary buffer for offscreen rendering\n"); + device->offscreenBuffer = GL_AUX0; +@@ -928,9 +1011,16 @@ + } + } + } ++#if defined(STAGING_CSMT) + device->contexts[0]->offscreenBuffer = device->offscreenBuffer; + + TRACE("All defaults now set up, leaving 3D init.\n"); ++#else /* STAGING_CSMT */ ++ ++ TRACE("All defaults now set up, leaving 3D init.\n"); ++ ++ context_release(context); ++#endif /* STAGING_CSMT */ + + /* Clear the screen */ + if (swapchain->back_buffers && swapchain->back_buffers[0]) +@@ -947,6 +1037,9 @@ + return WINED3D_OK; + + err_out: ++#if !defined(STAGING_CSMT) ++ HeapFree(GetProcessHeap(), 0, device->fb.render_targets); ++#endif /* STAGING_CSMT */ + HeapFree(GetProcessHeap(), 0, device->swapchains); + device->swapchain_count = 0; + if (device->back_buffer_view) +@@ -997,6 +1090,10 @@ + HRESULT CDECL wined3d_device_uninit_3d(struct wined3d_device *device) + { + struct wined3d_resource *resource, *cursor; ++#if !defined(STAGING_CSMT) ++ const struct wined3d_gl_info *gl_info; ++ struct wined3d_context *context; ++#endif /* STAGING_CSMT */ + struct wined3d_surface *surface; + UINT i; + +@@ -1005,6 +1102,7 @@ + if (!device->d3d_initialized) + return WINED3DERR_INVALIDCALL; + ++#if defined(STAGING_CSMT) + if (wined3d_settings.cs_multithreaded) + device->cs->ops->finish(device->cs); + +@@ -1045,6 +1143,81 @@ + wined3d_rendertarget_view_decref(device->back_buffer_view); + device->back_buffer_view = NULL; + } ++#else /* STAGING_CSMT */ ++ /* I don't think that the interface guarantees that the device is destroyed from the same thread ++ * it was created. Thus make sure a context is active for the glDelete* calls ++ */ ++ context = context_acquire(device, NULL); ++ gl_info = context->gl_info; ++ ++ if (device->logo_texture) ++ wined3d_texture_decref(device->logo_texture); ++ if (device->cursor_texture) ++ wined3d_texture_decref(device->cursor_texture); ++ ++ state_unbind_resources(&device->state); ++ ++ /* Unload resources */ ++ LIST_FOR_EACH_ENTRY_SAFE(resource, cursor, &device->resources, struct wined3d_resource, resource_list_entry) ++ { ++ TRACE("Unloading resource %p.\n", resource); ++ ++ resource->resource_ops->resource_unload(resource); ++ } ++ ++ /* Destroy the depth blt resources, they will be invalid after the reset. Also free shader ++ * private data, it might contain opengl pointers ++ */ ++ if (device->depth_blt_texture) ++ { ++ gl_info->gl_ops.gl.p_glDeleteTextures(1, &device->depth_blt_texture); ++ device->depth_blt_texture = 0; ++ } ++ ++ /* Destroy the shader backend. Note that this has to happen after all shaders are destroyed. */ ++ device->blitter->free_private(device); ++ device->shader_backend->shader_free_private(device); ++ destroy_dummy_textures(device, gl_info); ++ ++ /* Release the buffers (with sanity checks)*/ ++ if (device->onscreen_depth_stencil) ++ { ++ surface = device->onscreen_depth_stencil; ++ device->onscreen_depth_stencil = NULL; ++ wined3d_surface_decref(surface); ++ } ++ ++ if (device->fb.depth_stencil) ++ { ++ struct wined3d_rendertarget_view *view = device->fb.depth_stencil; ++ ++ TRACE("Releasing depth/stencil view %p.\n", view); ++ ++ device->fb.depth_stencil = NULL; ++ wined3d_rendertarget_view_decref(view); ++ } ++ ++ if (device->auto_depth_stencil_view) ++ { ++ struct wined3d_rendertarget_view *view = device->auto_depth_stencil_view; ++ ++ device->auto_depth_stencil_view = NULL; ++ if (wined3d_rendertarget_view_decref(view)) ++ ERR("Something's still holding the auto depth/stencil view (%p).\n", view); ++ } ++ ++ for (i = 0; i < gl_info->limits.buffers; ++i) ++ { ++ wined3d_device_set_rendertarget_view(device, i, NULL, FALSE); ++ } ++ if (device->back_buffer_view) ++ { ++ wined3d_rendertarget_view_decref(device->back_buffer_view); ++ device->back_buffer_view = NULL; ++ } ++ ++ context_release(context); ++#endif /* STAGING_CSMT */ + + for (i = 0; i < device->swapchain_count; ++i) + { +@@ -1057,6 +1230,11 @@ + device->swapchains = NULL; + device->swapchain_count = 0; + ++#if !defined(STAGING_CSMT) ++ HeapFree(GetProcessHeap(), 0, device->fb.render_targets); ++ device->fb.render_targets = NULL; ++ ++#endif /* STAGING_CSMT */ + device->d3d_initialized = FALSE; + + return WINED3D_OK; +@@ -1420,6 +1598,16 @@ + TRACE("... Range(%f), Falloff(%f), Theta(%f), Phi(%f)\n", + light->range, light->falloff, light->theta, light->phi); + ++#if !defined(STAGING_CSMT) ++ /* Update the live definitions if the light is currently assigned a glIndex. */ ++ if (object->glIndex != -1 && !device->recording) ++ { ++ if (object->OriginalParms.type != light->type) ++ device_invalidate_state(device, STATE_LIGHT_TYPE); ++ device_invalidate_state(device, STATE_ACTIVELIGHT(object->glIndex)); ++ } ++ ++#endif /* STAGING_CSMT */ + /* Save away the information. */ + object->OriginalParms = *light; + +@@ -1492,9 +1680,11 @@ + FIXME("Unrecognized light type %#x.\n", light->type); + } + ++#if defined(STAGING_CSMT) + if (!device->recording) + wined3d_cs_emit_set_light(device->cs, object); + ++#endif /* STAGING_CSMT */ + return WINED3D_OK; + } + +@@ -1567,6 +1757,14 @@ + { + if (light_info->glIndex != -1) + { ++#if !defined(STAGING_CSMT) ++ if (!device->recording) ++ { ++ device_invalidate_state(device, STATE_LIGHT_TYPE); ++ device_invalidate_state(device, STATE_ACTIVELIGHT(light_info->glIndex)); ++ } ++ ++#endif /* STAGING_CSMT */ + device->update_state->lights[light_info->glIndex] = NULL; + light_info->glIndex = -1; + } +@@ -1608,11 +1806,23 @@ + WARN("Too many concurrently active lights\n"); + return WINED3D_OK; + } ++#if defined(STAGING_CSMT) + } + } + + if (!device->recording) + wined3d_cs_emit_set_light_enable(device->cs, light_idx, enable); ++#else /* STAGING_CSMT */ ++ ++ /* i == light_info->glIndex */ ++ if (!device->recording) ++ { ++ device_invalidate_state(device, STATE_LIGHT_TYPE); ++ device_invalidate_state(device, STATE_ACTIVELIGHT(i)); ++ } ++ } ++ } ++#endif /* STAGING_CSMT */ + + return WINED3D_OK; + } +@@ -1787,9 +1997,11 @@ + TRACE("device %p, base_index %d.\n", device, base_index); + + device->update_state->base_vertex_index = base_index; ++#if defined(STAGING_CSMT) + + if (!device->recording) + wined3d_cs_emit_set_base_vertex_index(device->cs, base_index); ++#endif /* STAGING_CSMT */ + } + + INT CDECL wined3d_device_get_base_vertex_index(const struct wined3d_device *device) +@@ -1834,7 +2046,11 @@ + || !(texture->resource.format->flags & WINED3DFMT_FLAG_DEPTH)) + return; + surface = surface_from_resource(texture->sub_resources[0]); ++#if defined(STAGING_CSMT) + if (!(depth_stencil = wined3d_rendertarget_view_get_surface(state->fb.depth_stencil))) ++#else /* STAGING_CSMT */ ++ if (!(depth_stencil = wined3d_rendertarget_view_get_surface(state->fb->depth_stencil))) ++#endif /* STAGING_CSMT */ + return; + + wined3d_surface_blt(surface, NULL, depth_stencil, NULL, 0, NULL, WINED3D_TEXF_POINT); +@@ -2154,7 +2370,11 @@ + return device->state.sampler[WINED3D_SHADER_TYPE_VERTEX][idx]; + } + ++#if defined(STAGING_CSMT) + void device_invalidate_shader_constants(const struct wined3d_device *device, DWORD mask) ++#else /* STAGING_CSMT */ ++static void device_invalidate_shader_constants(const struct wined3d_device *device, DWORD mask) ++#endif /* STAGING_CSMT */ + { + UINT i; + +@@ -2187,8 +2407,12 @@ + } + else + { ++#if defined(STAGING_CSMT) + wined3d_cs_emit_set_consts_b(device->cs, start_register, constants, + bool_count, WINED3D_SHADER_TYPE_VERTEX); ++#else /* STAGING_CSMT */ ++ device_invalidate_shader_constants(device, WINED3D_SHADER_CONST_VS_B); ++#endif /* STAGING_CSMT */ + } + + return WINED3D_OK; +@@ -2235,8 +2459,12 @@ + } + else + { ++#if defined(STAGING_CSMT) + wined3d_cs_emit_set_consts_i(device->cs, start_register, constants, + vector4i_count, WINED3D_SHADER_TYPE_VERTEX); ++#else /* STAGING_CSMT */ ++ device_invalidate_shader_constants(device, WINED3D_SHADER_CONST_VS_I); ++#endif /* STAGING_CSMT */ + } + + return WINED3D_OK; +@@ -2287,8 +2515,13 @@ + memset(device->recording->changed.vertexShaderConstantsF + start_register, 1, + sizeof(*device->recording->changed.vertexShaderConstantsF) * vector4f_count); + else ++#if defined(STAGING_CSMT) + wined3d_cs_emit_set_consts_f(device->cs, start_register, constants, vector4f_count, + WINED3D_SHADER_TYPE_VERTEX); ++#else /* STAGING_CSMT */ ++ device->shader_backend->shader_update_float_vertex_constants(device, start_register, vector4f_count); ++ ++#endif /* STAGING_CSMT */ + + return WINED3D_OK; + } +@@ -2423,8 +2656,12 @@ + } + else + { ++#if defined(STAGING_CSMT) + wined3d_cs_emit_set_consts_b(device->cs, start_register, constants, + bool_count, WINED3D_SHADER_TYPE_PIXEL); ++#else /* STAGING_CSMT */ ++ device_invalidate_shader_constants(device, WINED3D_SHADER_CONST_PS_B); ++#endif /* STAGING_CSMT */ + } + + return WINED3D_OK; +@@ -2471,8 +2708,12 @@ + } + else + { ++#if defined(STAGING_CSMT) + wined3d_cs_emit_set_consts_i(device->cs, start_register, constants, + vector4i_count, WINED3D_SHADER_TYPE_PIXEL); ++#else /* STAGING_CSMT */ ++ device_invalidate_shader_constants(device, WINED3D_SHADER_CONST_PS_I); ++#endif /* STAGING_CSMT */ + } + + return WINED3D_OK; +@@ -2524,8 +2765,12 @@ + memset(device->recording->changed.pixelShaderConstantsF + start_register, 1, + sizeof(*device->recording->changed.pixelShaderConstantsF) * vector4f_count); + else ++#if defined(STAGING_CSMT) + wined3d_cs_emit_set_consts_f(device->cs, start_register, constants, vector4f_count, + WINED3D_SHADER_TYPE_PIXEL); ++#else /* STAGING_CSMT */ ++ device->shader_backend->shader_update_float_pixel_constants(device, start_register, vector4f_count); ++#endif /* STAGING_CSMT */ + + return WINED3D_OK; + } +@@ -2685,6 +2930,7 @@ + return hr; + } + ++#if defined(STAGING_CSMT) + if (wined3d_settings.cs_multithreaded) + { + FIXME("Waiting for cs.\n"); +@@ -2692,6 +2938,7 @@ + device->cs->ops->finish(device->cs); + } + ++#endif /* STAGING_CSMT */ + wined3d_device_get_transform(device, WINED3D_TS_VIEW, &view_mat); + wined3d_device_get_transform(device, WINED3D_TS_PROJECTION, &proj_mat); + wined3d_device_get_transform(device, WINED3D_TS_WORLD_MATRIX(0), &world_mat); +@@ -3193,6 +3440,10 @@ + + HRESULT CDECL wined3d_device_end_scene(struct wined3d_device *device) + { ++#if !defined(STAGING_CSMT) ++ struct wined3d_context *context; ++ ++#endif /* STAGING_CSMT */ + TRACE("device %p.\n", device); + + if (!device->inScene) +@@ -3201,6 +3452,15 @@ + return WINED3DERR_INVALIDCALL; + } + ++#if !defined(STAGING_CSMT) ++ context = context_acquire(device, NULL); ++ /* We only have to do this if we need to read the, swapbuffers performs a flush for us */ ++ context->gl_info->gl_ops.gl.p_glFlush(); ++ /* No checkGLcall here to avoid locking the lock just for checking a call that hardly ever ++ * fails. */ ++ context_release(context); ++ ++#endif /* STAGING_CSMT */ + device->inScene = FALSE; + return WINED3D_OK; + } +@@ -3226,8 +3486,10 @@ + HRESULT CDECL wined3d_device_clear(struct wined3d_device *device, DWORD rect_count, + const RECT *rects, DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil) + { ++#if defined(STAGING_CSMT) + const struct wined3d_fb_state *fb = &device->state.fb; + ++#endif /* STAGING_CSMT */ + TRACE("device %p, rect_count %u, rects %p, flags %#x, color {%.8e, %.8e, %.8e, %.8e}, depth %.8e, stencil %u.\n", + device, rect_count, rects, flags, color->r, color->g, color->b, color->a, depth, stencil); + +@@ -3236,12 +3498,19 @@ + WARN("Rects is %p, but rect_count is 0, ignoring clear\n", rects); + return WINED3D_OK; + } ++#if defined(STAGING_CSMT) + if (rect_count && !rects) + rect_count = 0; + + if (flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL)) + { + struct wined3d_rendertarget_view *ds = fb->depth_stencil; ++#else /* STAGING_CSMT */ ++ ++ if (flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL)) ++ { ++ struct wined3d_rendertarget_view *ds = device->fb.depth_stencil; ++#endif /* STAGING_CSMT */ + if (!ds) + { + WARN("Clearing depth and/or stencil without a depth stencil buffer attached, returning WINED3DERR_INVALIDCALL\n"); +@@ -3250,8 +3519,13 @@ + } + else if (flags & WINED3DCLEAR_TARGET) + { ++#if defined(STAGING_CSMT) + if (ds->width < fb->render_targets[0]->width + || ds->height < fb->render_targets[0]->height) ++#else /* STAGING_CSMT */ ++ if (ds->width < device->fb.render_targets[0]->width ++ || ds->height < device->fb.render_targets[0]->height) ++#endif /* STAGING_CSMT */ + { + WARN("Silently ignoring depth and target clear with mismatching sizes\n"); + return WINED3D_OK; +@@ -3297,6 +3571,9 @@ + enum wined3d_primitive_type primitive_type) + { + GLenum gl_primitive_type, prev; ++#if !defined(STAGING_CSMT) ++ ++#endif /* STAGING_CSMT */ + TRACE("device %p, primitive_type %s\n", device, debug_d3dprimitivetype(primitive_type)); + + gl_primitive_type = gl_primitive_type_from_d3d(primitive_type); +@@ -3304,8 +3581,13 @@ + device->update_state->gl_primitive_type = gl_primitive_type; + if (device->recording) + device->recording->changed.primitive_type = TRUE; ++#if defined(STAGING_CSMT) + else if (gl_primitive_type != prev) + wined3d_cs_emit_set_primitive_type(device->cs, gl_primitive_type); ++#else /* STAGING_CSMT */ ++ else if (gl_primitive_type != prev && (gl_primitive_type == GL_POINTS || prev == GL_POINTS)) ++ device_invalidate_state(device, STATE_POINT_SIZE_ENABLE); ++#endif /* STAGING_CSMT */ + } + + void CDECL wined3d_device_get_primitive_type(const struct wined3d_device *device, +@@ -3328,6 +3610,14 @@ + return WINED3DERR_INVALIDCALL; + } + ++#if !defined(STAGING_CSMT) ++ if (device->state.load_base_vertex_index) ++ { ++ device->state.load_base_vertex_index = 0; ++ device_invalidate_state(device, STATE_BASEVERTEXINDEX); ++ } ++ ++#endif /* STAGING_CSMT */ + wined3d_cs_emit_draw(device->cs, start_vertex, vertex_count, 0, 0, FALSE); + + return WINED3D_OK; +@@ -3335,6 +3625,10 @@ + + HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *device, UINT start_idx, UINT index_count) + { ++#if !defined(STAGING_CSMT) ++ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; ++ ++#endif /* STAGING_CSMT */ + TRACE("device %p, start_idx %u, index_count %u.\n", device, start_idx, index_count); + + if (!device->state.index_buffer) +@@ -3353,6 +3647,15 @@ + return WINED3DERR_INVALIDCALL; + } + ++#if !defined(STAGING_CSMT) ++ if (!gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX] && ++ device->state.load_base_vertex_index != device->state.base_vertex_index) ++ { ++ device->state.load_base_vertex_index = device->state.base_vertex_index; ++ device_invalidate_state(device, STATE_BASEVERTEXINDEX); ++ } ++ ++#endif /* STAGING_CSMT */ + wined3d_cs_emit_draw(device->cs, start_idx, index_count, 0, 0, TRUE); + + return WINED3D_OK; +@@ -3367,6 +3670,7 @@ + } + + /* This is a helper function for UpdateTexture, there is no UpdateVolume method in D3D. */ ++#if defined(STAGING_CSMT) + static HRESULT device_update_volume(struct wined3d_context *context, + struct wined3d_volume *src_volume, struct wined3d_volume *dst_volume) + { +@@ -3374,6 +3678,18 @@ + + TRACE("src_volume %p, dst_volume %p.\n", + src_volume, dst_volume); ++#else /* STAGING_CSMT */ ++static HRESULT device_update_volume(struct wined3d_device *device, ++ struct wined3d_volume *src_volume, struct wined3d_volume *dst_volume) ++{ ++ struct wined3d_map_desc src; ++ HRESULT hr; ++ struct wined3d_bo_address data; ++ struct wined3d_context *context; ++ ++ TRACE("device %p, src_volume %p, dst_volume %p.\n", ++ device, src_volume, dst_volume); ++#endif /* STAGING_CSMT */ + + if (src_volume->resource.format != dst_volume->resource.format) + { +@@ -3388,6 +3704,7 @@ + return WINED3DERR_INVALIDCALL; + } + ++#if defined(STAGING_CSMT) + /* Only a prepare, since we're uploading the entire volume. */ + wined3d_texture_prepare_texture(dst_volume->container, context, FALSE); + wined3d_resource_get_memory(&src_volume->resource, src_volume->resource.map_binding, &data); +@@ -3407,6 +3724,76 @@ + + /* Make sure that the destination texture is loaded. */ + wined3d_texture_load(dst_texture, context, FALSE); ++#else /* STAGING_CSMT */ ++ if (FAILED(hr = wined3d_volume_map(src_volume, &src, NULL, WINED3D_MAP_READONLY))) ++ return hr; ++ ++ context = context_acquire(device, NULL); ++ ++ /* Only a prepare, since we're uploading the entire volume. */ ++ wined3d_texture_prepare_texture(dst_volume->container, context, FALSE); ++ ++ data.buffer_object = 0; ++ data.addr = src.data; ++ wined3d_volume_upload_data(dst_volume, context, &data); ++ wined3d_volume_invalidate_location(dst_volume, ~WINED3D_LOCATION_TEXTURE_RGB); ++ ++ context_release(context); ++ ++ hr = wined3d_volume_unmap(src_volume); ++ ++ return hr; ++} ++ ++HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device, ++ struct wined3d_texture *src_texture, struct wined3d_texture *dst_texture) ++{ ++ enum wined3d_resource_type type; ++ unsigned int level_count, i; ++ HRESULT hr; ++ struct wined3d_context *context; ++ ++ TRACE("device %p, src_texture %p, dst_texture %p.\n", device, src_texture, dst_texture); ++ ++ /* Verify that the source and destination textures are non-NULL. */ ++ if (!src_texture || !dst_texture) ++ { ++ WARN("Source and destination textures must be non-NULL, returning WINED3DERR_INVALIDCALL.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ if (src_texture->resource.pool != WINED3D_POOL_SYSTEM_MEM) ++ { ++ WARN("Source texture not in WINED3D_POOL_SYSTEM_MEM, returning WINED3DERR_INVALIDCALL.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ if (dst_texture->resource.pool != WINED3D_POOL_DEFAULT) ++ { ++ WARN("Destination texture not in WINED3D_POOL_DEFAULT, returning WINED3DERR_INVALIDCALL.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ /* Verify that the source and destination textures are the same type. */ ++ type = src_texture->resource.type; ++ if (dst_texture->resource.type != type) ++ { ++ WARN("Source and destination have different types, returning WINED3DERR_INVALIDCALL.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ /* Check that both textures have the identical numbers of levels. */ ++ level_count = wined3d_texture_get_level_count(src_texture); ++ if (wined3d_texture_get_level_count(dst_texture) != level_count) ++ { ++ WARN("Source and destination have different level counts, returning WINED3DERR_INVALIDCALL.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ /* Make sure that the destination texture is loaded. */ ++ context = context_acquire(device, NULL); ++ wined3d_texture_load(dst_texture, context, FALSE); ++ context_release(context); ++#endif /* STAGING_CSMT */ + + /* Update every surface level of the texture. */ + switch (type) +@@ -3420,7 +3807,16 @@ + { + src_surface = surface_from_resource(wined3d_texture_get_sub_resource(src_texture, i)); + dst_surface = surface_from_resource(wined3d_texture_get_sub_resource(dst_texture, i)); ++#if defined(STAGING_CSMT) + surface_upload_from_surface(dst_surface, NULL, src_surface, NULL); ++#else /* STAGING_CSMT */ ++ hr = wined3d_device_update_surface(device, src_surface, NULL, dst_surface, NULL); ++ if (FAILED(hr)) ++ { ++ WARN("Failed to update surface, hr %#x.\n", hr); ++ return hr; ++ } ++#endif /* STAGING_CSMT */ + } + break; + } +@@ -3434,7 +3830,16 @@ + { + src_surface = surface_from_resource(wined3d_texture_get_sub_resource(src_texture, i)); + dst_surface = surface_from_resource(wined3d_texture_get_sub_resource(dst_texture, i)); ++#if defined(STAGING_CSMT) + surface_upload_from_surface(dst_surface, NULL, src_surface, NULL); ++#else /* STAGING_CSMT */ ++ hr = wined3d_device_update_surface(device, src_surface, NULL, dst_surface, NULL); ++ if (FAILED(hr)) ++ { ++ WARN("Failed to update surface, hr %#x.\n", hr); ++ return hr; ++ } ++#endif /* STAGING_CSMT */ + } + break; + } +@@ -3443,6 +3848,7 @@ + { + for (i = 0; i < level_count; ++i) + { ++#if defined(STAGING_CSMT) + HRESULT hr; + hr = device_update_volume(context, + volume_from_resource(wined3d_texture_get_sub_resource(src_texture, i)), +@@ -3451,6 +3857,15 @@ + { + WARN("Failed to update volume, hr %#x.\n", hr); + return; ++#else /* STAGING_CSMT */ ++ hr = device_update_volume(device, ++ volume_from_resource(wined3d_texture_get_sub_resource(src_texture, i)), ++ volume_from_resource(wined3d_texture_get_sub_resource(dst_texture, i))); ++ if (FAILED(hr)) ++ { ++ WARN("Failed to update volume, hr %#x.\n", hr); ++ return hr; ++#endif /* STAGING_CSMT */ + } + } + break; +@@ -3458,6 +3873,7 @@ + + default: + FIXME("Unsupported texture type %#x.\n", type); ++#if defined(STAGING_CSMT) + return; + } + } +@@ -3505,6 +3921,10 @@ + } + + wined3d_cs_emit_update_texture(device->cs, src_texture, dst_texture); ++#else /* STAGING_CSMT */ ++ return WINED3DERR_INVALIDCALL; ++ } ++#endif /* STAGING_CSMT */ + + return WINED3D_OK; + } +@@ -3567,8 +3987,13 @@ + if (state->render_states[WINED3D_RS_ZENABLE] || state->render_states[WINED3D_RS_ZWRITEENABLE] + || state->render_states[WINED3D_RS_STENCILENABLE]) + { ++#if defined(STAGING_CSMT) + struct wined3d_rendertarget_view *rt = state->fb.render_targets[0]; + struct wined3d_rendertarget_view *ds = state->fb.depth_stencil; ++#else /* STAGING_CSMT */ ++ struct wined3d_rendertarget_view *rt = device->fb.render_targets[0]; ++ struct wined3d_rendertarget_view *ds = device->fb.depth_stencil; ++#endif /* STAGING_CSMT */ + + if (ds && rt && (ds->width < rt->width || ds->height < rt->height)) + { +@@ -3665,6 +4090,7 @@ + struct wined3d_surface *src_surface, const RECT *src_rect, + struct wined3d_surface *dst_surface, const POINT *dst_point) + { ++#if defined(STAGING_CSMT) + const struct wined3d_format *src_format = src_surface->resource.format; + const struct wined3d_format *dst_format = dst_surface->resource.format; + UINT update_w, update_h; +@@ -3672,6 +4098,7 @@ + RECT r, dst_rect; + POINT p; + ++#endif /* STAGING_CSMT */ + TRACE("device %p, src_surface %p, src_rect %s, dst_surface %p, dst_point %s.\n", + device, src_surface, wine_dbgstr_rect(src_rect), + dst_surface, wine_dbgstr_point(dst_point)); +@@ -3683,6 +4110,7 @@ + return WINED3DERR_INVALIDCALL; + } + ++#if defined(STAGING_CSMT) + if (src_format->id != dst_format->id) + { + WARN("Source and destination surfaces should have the same format.\n"); +@@ -3745,6 +4173,9 @@ + wined3d_cs_emit_update_surface(device->cs, src_surface, src_rect, dst_surface, dst_point); + + return WINED3D_OK; ++#else /* STAGING_CSMT */ ++ return surface_upload_from_surface(dst_surface, dst_point, src_surface, src_rect); ++#endif /* STAGING_CSMT */ + } + + void CDECL wined3d_device_copy_resource(struct wined3d_device *device, +@@ -3846,8 +4277,14 @@ + rect = &r; + } + ++#if defined(STAGING_CSMT) + wined3d_cs_emit_clear_rtv(device->cs, view, rect, color); + return WINED3D_OK; ++#else /* STAGING_CSMT */ ++ resource = wined3d_texture_get_sub_resource(wined3d_texture_from_resource(resource), view->sub_resource_idx); ++ ++ return surface_color_fill(surface_from_resource(resource), rect, color); ++#endif /* STAGING_CSMT */ + } + + struct wined3d_rendertarget_view * CDECL wined3d_device_get_rendertarget_view(const struct wined3d_device *device, +@@ -3861,6 +4298,7 @@ + return NULL; + } + ++#if defined(STAGING_CSMT) + return device->state.fb.render_targets[view_idx]; + } + +@@ -3876,6 +4314,22 @@ + { + struct wined3d_rendertarget_view *prev; + struct wined3d_fb_state *fb = &device->state.fb; ++#else /* STAGING_CSMT */ ++ return device->fb.render_targets[view_idx]; ++} ++ ++struct wined3d_rendertarget_view * CDECL wined3d_device_get_depth_stencil_view(const struct wined3d_device *device) ++{ ++ TRACE("device %p.\n", device); ++ ++ return device->fb.depth_stencil; ++} ++ ++HRESULT CDECL wined3d_device_set_rendertarget_view(struct wined3d_device *device, ++ unsigned int view_idx, struct wined3d_rendertarget_view *view, BOOL set_viewport) ++{ ++ struct wined3d_rendertarget_view *prev; ++#endif /* STAGING_CSMT */ + + TRACE("device %p, view_idx %u, view %p, set_viewport %#x.\n", + device, view_idx, view, set_viewport); +@@ -3915,6 +4369,7 @@ + } + + ++#if defined(STAGING_CSMT) + prev = fb->render_targets[view_idx]; + if (view == prev) + return WINED3D_OK; +@@ -3922,6 +4377,15 @@ + if (view) + wined3d_rendertarget_view_incref(view); + fb->render_targets[view_idx] = view; ++#else /* STAGING_CSMT */ ++ prev = device->fb.render_targets[view_idx]; ++ if (view == prev) ++ return WINED3D_OK; ++ ++ if (view) ++ wined3d_rendertarget_view_incref(view); ++ device->fb.render_targets[view_idx] = view; ++#endif /* STAGING_CSMT */ + wined3d_cs_emit_set_rendertarget_view(device->cs, view_idx, view); + /* Release after the assignment, to prevent device_resource_released() + * from seeing the surface as still in use. */ +@@ -3933,6 +4397,7 @@ + + void CDECL wined3d_device_set_depth_stencil_view(struct wined3d_device *device, struct wined3d_rendertarget_view *view) + { ++#if defined(STAGING_CSMT) + struct wined3d_fb_state *fb = &device->state.fb; + struct wined3d_rendertarget_view *prev; + +@@ -3957,6 +4422,96 @@ + { + TRACE("device %p, x_hotspot %u, y_hotspot %u, cursor_image %p.\n", + device, x_hotspot, y_hotspot, cursor_image); ++#else /* STAGING_CSMT */ ++ struct wined3d_rendertarget_view *prev; ++ ++ TRACE("device %p, view %p.\n", device, view); ++ ++ prev = device->fb.depth_stencil; ++ if (prev == view) ++ { ++ TRACE("Trying to do a NOP SetRenderTarget operation.\n"); ++ return; ++ } ++ ++ if ((device->fb.depth_stencil = view)) ++ wined3d_rendertarget_view_incref(view); ++ wined3d_cs_emit_set_depth_stencil_view(device->cs, view); ++ if (prev) ++ wined3d_rendertarget_view_decref(prev); ++} ++ ++static struct wined3d_texture *wined3d_device_create_cursor_texture(struct wined3d_device *device, ++ struct wined3d_surface *cursor_image) ++{ ++ struct wined3d_resource_desc desc; ++ struct wined3d_map_desc map_desc; ++ struct wined3d_texture *texture; ++ struct wined3d_surface *surface; ++ BYTE *src_data, *dst_data; ++ unsigned int src_pitch; ++ unsigned int i; ++ ++ if (FAILED(wined3d_surface_map(cursor_image, &map_desc, NULL, WINED3D_MAP_READONLY))) ++ { ++ ERR("Failed to map source surface.\n"); ++ return NULL; ++ } ++ ++ src_pitch = map_desc.row_pitch; ++ src_data = map_desc.data; ++ ++ desc.resource_type = WINED3D_RTYPE_TEXTURE; ++ desc.format = WINED3DFMT_B8G8R8A8_UNORM; ++ desc.multisample_type = WINED3D_MULTISAMPLE_NONE; ++ desc.multisample_quality = 0; ++ desc.usage = WINED3DUSAGE_DYNAMIC; ++ desc.pool = WINED3D_POOL_DEFAULT; ++ desc.width = cursor_image->resource.width; ++ desc.height = cursor_image->resource.height; ++ desc.depth = 1; ++ desc.size = 0; ++ ++ if (FAILED(wined3d_texture_create(device, &desc, 1, WINED3D_SURFACE_MAPPABLE, ++ NULL, &wined3d_null_parent_ops, &texture))) ++ { ++ ERR("Failed to create cursor texture.\n"); ++ wined3d_surface_unmap(cursor_image); ++ return NULL; ++ } ++ ++ surface = surface_from_resource(wined3d_texture_get_sub_resource(texture, 0)); ++ if (FAILED(wined3d_surface_map(surface, &map_desc, NULL, WINED3D_MAP_DISCARD))) ++ { ++ ERR("Failed to map destination surface.\n"); ++ wined3d_texture_decref(texture); ++ wined3d_surface_unmap(cursor_image); ++ return NULL; ++ } ++ ++ dst_data = map_desc.data; ++ ++ for (i = 0; i < desc.height; ++i) ++ memcpy(&dst_data[map_desc.row_pitch * i], &src_data[src_pitch * i], desc.width * 4); ++ ++ wined3d_surface_unmap(surface); ++ wined3d_surface_unmap(cursor_image); ++ ++ return texture; ++} ++ ++HRESULT CDECL wined3d_device_set_cursor_properties(struct wined3d_device *device, ++ UINT x_hotspot, UINT y_hotspot, struct wined3d_surface *cursor_image) ++{ ++ TRACE("device %p, x_hotspot %u, y_hotspot %u, cursor_image %p.\n", ++ device, x_hotspot, y_hotspot, cursor_image); ++ ++ if (device->cursor_texture) ++ { ++ wined3d_texture_decref(device->cursor_texture); ++ device->cursor_texture = NULL; ++ } ++#endif /* STAGING_CSMT */ + + if (cursor_image) + { +@@ -3992,8 +4547,16 @@ + * release it after setting the cursor image. Windows doesn't + * addref the set surface, so we can't do this either without + * creating circular refcount dependencies. */ ++#if defined(STAGING_CSMT) + device->cursorWidth = cursor_image->resource.width; + device->cursorHeight = cursor_image->resource.height; ++#else /* STAGING_CSMT */ ++ if (!(device->cursor_texture = wined3d_device_create_cursor_texture(device, cursor_image))) ++ { ++ ERR("Failed to create cursor texture.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++#endif /* STAGING_CSMT */ + + device->cursorWidth = cursor_image->resource.width; + device->cursorHeight = cursor_image->resource.height; +@@ -4093,6 +4656,12 @@ + else + SetCursor(NULL); + } ++#if !defined(STAGING_CSMT) ++ else if (device->cursor_texture) ++ { ++ device->bCursorVisible = show; ++ } ++#endif /* STAGING_CSMT */ + + return oldVisible; + } +@@ -4103,8 +4672,10 @@ + + TRACE("device %p.\n", device); + ++#if defined(STAGING_CSMT) + /* The resource list is manged by the main thread, iterate here and emit commands for + * each resource */ ++#endif /* STAGING_CSMT */ + LIST_FOR_EACH_ENTRY_SAFE(resource, cursor, &device->resources, struct wined3d_resource, resource_list_entry) + { + TRACE("Checking resource %p for eviction.\n", resource); +@@ -4112,6 +4683,7 @@ + if (resource->pool == WINED3D_POOL_MANAGED && !resource->map_count) + { + TRACE("Evicting %p.\n", resource); ++#if defined(STAGING_CSMT) + wined3d_cs_emit_evict_resource(device->cs, resource); + } + } +@@ -4130,6 +4702,37 @@ + + context = context_acquire(device, NULL); + gl_info = context->gl_info; ++#else /* STAGING_CSMT */ ++ resource->resource_ops->resource_unload(resource); ++ } ++ } ++ ++ /* Invalidate stream sources, the buffer(s) may have been evicted. */ ++ device_invalidate_state(device, STATE_STREAMSRC); ++} ++ ++static void delete_opengl_contexts(struct wined3d_device *device, struct wined3d_swapchain *swapchain) ++{ ++ struct wined3d_resource *resource, *cursor; ++ const struct wined3d_gl_info *gl_info; ++ struct wined3d_context *context; ++ struct wined3d_shader *shader; ++ ++ context = context_acquire(device, NULL); ++ gl_info = context->gl_info; ++ ++ LIST_FOR_EACH_ENTRY_SAFE(resource, cursor, &device->resources, struct wined3d_resource, resource_list_entry) ++ { ++ TRACE("Unloading resource %p.\n", resource); ++ ++ resource->resource_ops->resource_unload(resource); ++ } ++ ++ LIST_FOR_EACH_ENTRY(shader, &device->shaders, struct wined3d_shader, shader_list_entry) ++ { ++ device->shader_backend->shader_destroy(shader); ++ } ++#endif /* STAGING_CSMT */ + + if (device->depth_blt_texture) + { +@@ -4150,6 +4753,7 @@ + + HeapFree(GetProcessHeap(), 0, swapchain->context); + swapchain->context = NULL; ++#if defined(STAGING_CSMT) + swapchain->num_contexts = 0; + } + +@@ -4169,6 +4773,14 @@ + + static HRESULT create_primary_opengl_context(struct wined3d_device *device, struct wined3d_swapchain *swapchain) + { ++#else /* STAGING_CSMT */ ++} ++ ++static HRESULT create_primary_opengl_context(struct wined3d_device *device, struct wined3d_swapchain *swapchain) ++{ ++ struct wined3d_context *context; ++ struct wined3d_surface *target; ++#endif /* STAGING_CSMT */ + HRESULT hr; + + if (FAILED(hr = device->shader_backend->shader_alloc_private(device, +@@ -4185,6 +4797,7 @@ + return hr; + } + ++#if defined(STAGING_CSMT) + hr = wined3d_cs_emit_create_swapchain_context(device->cs, swapchain); + if (FAILED(hr)) + { +@@ -4195,6 +4808,34 @@ + } + + wined3d_cs_emit_create_dummy_textures(device->cs); ++#else /* STAGING_CSMT */ ++ /* Recreate the primary swapchain's context */ ++ swapchain->context = HeapAlloc(GetProcessHeap(), 0, sizeof(*swapchain->context)); ++ if (!swapchain->context) ++ { ++ ERR("Failed to allocate memory for swapchain context array.\n"); ++ device->blitter->free_private(device); ++ device->shader_backend->shader_free_private(device); ++ return E_OUTOFMEMORY; ++ } ++ ++ target = swapchain->back_buffers ++ ? surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)) ++ : surface_from_resource(wined3d_texture_get_sub_resource(swapchain->front_buffer, 0)); ++ if (!(context = context_create(swapchain, target, swapchain->ds_format))) ++ { ++ WARN("Failed to create context.\n"); ++ device->blitter->free_private(device); ++ device->shader_backend->shader_free_private(device); ++ HeapFree(GetProcessHeap(), 0, swapchain->context); ++ return E_FAIL; ++ } ++ ++ swapchain->context[0] = context; ++ swapchain->num_contexts = 1; ++ create_dummy_textures(device, context); ++ context_release(context); ++#endif /* STAGING_CSMT */ + + return WINED3D_OK; + } +@@ -4214,8 +4855,10 @@ + unsigned int i; + + TRACE("device %p, swapchain_desc %p, mode %p, callback %p.\n", device, swapchain_desc, mode, callback); ++#if defined(STAGING_CSMT) + wined3d_cs_emit_glfinish(device->cs); + device->cs->ops->finish(device->cs); ++#endif /* STAGING_CSMT */ + + if (!(swapchain = wined3d_device_get_swapchain(device, 0))) + { +@@ -4231,9 +4874,21 @@ + wined3d_texture_decref(device->logo_texture); + device->logo_texture = NULL; + } ++#if defined(STAGING_CSMT) + } + + if (device->state.fb.render_targets) ++#else /* STAGING_CSMT */ ++ if (device->cursor_texture) ++ { ++ wined3d_texture_decref(device->cursor_texture); ++ device->cursor_texture = NULL; ++ } ++ state_unbind_resources(&device->state); ++ } ++ ++ if (device->fb.render_targets) ++#endif /* STAGING_CSMT */ + { + for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i) + { +@@ -4242,6 +4897,7 @@ + } + wined3d_device_set_depth_stencil_view(device, NULL); + ++#if defined(STAGING_CSMT) + if (reset_state) + { + state_unbind_resources(&device->state); +@@ -4251,6 +4907,12 @@ + { + wined3d_surface_decref(device->cs->onscreen_depth_stencil); + device->cs->onscreen_depth_stencil = NULL; ++#else /* STAGING_CSMT */ ++ if (device->onscreen_depth_stencil) ++ { ++ wined3d_surface_decref(device->onscreen_depth_stencil); ++ device->onscreen_depth_stencil = NULL; ++#endif /* STAGING_CSMT */ + } + + if (reset_state) +@@ -4263,6 +4925,7 @@ + } + } + ++#if defined(STAGING_CSMT) + /* Free implicit resources and wait for the command stream before modifying + * swapchain parameters. After modifying the swapchain parameters a new GL + * context may be acquired by the worker thread. This causes problems in the +@@ -4284,6 +4947,7 @@ + } + device->cs->ops->finish(device->cs); + ++#endif /* STAGING_CSMT */ + /* Is it necessary to recreate the gl context? Actually every setting can be changed + * on an existing gl context, so there's no real need for recreation. + * +@@ -4419,6 +5083,13 @@ + } + } + ++#if !defined(STAGING_CSMT) ++ if (device->auto_depth_stencil_view) ++ { ++ wined3d_rendertarget_view_decref(device->auto_depth_stencil_view); ++ device->auto_depth_stencil_view = NULL; ++ } ++#endif /* STAGING_CSMT */ + if (swapchain->desc.enable_auto_depth_stencil) + { + struct wined3d_resource_desc surface_desc; +@@ -4456,6 +5127,13 @@ + wined3d_device_set_depth_stencil_view(device, device->auto_depth_stencil_view); + } + ++#if !defined(STAGING_CSMT) ++ if (device->back_buffer_view) ++ { ++ wined3d_rendertarget_view_decref(device->back_buffer_view); ++ device->back_buffer_view = NULL; ++ } ++#endif /* STAGING_CSMT */ + if (swapchain->desc.backbuffer_count && FAILED(hr = wined3d_rendertarget_view_create_from_surface( + surface_from_resource(wined3d_texture_get_sub_resource(swapchain->back_buffers[0], 0)), + NULL, &wined3d_null_parent_ops, &device->back_buffer_view))) +@@ -4536,12 +5214,20 @@ + } + wined3d_cs_emit_reset_state(device->cs); + state_cleanup(&device->state); ++#if defined(STAGING_CSMT) + memset(&device->state, 0, sizeof(device->state)); + + if (device->d3d_initialized) + delete_opengl_contexts(device, swapchain); + + if (FAILED(hr = state_init(&device->state, &device->adapter->gl_info, ++#else /* STAGING_CSMT */ ++ ++ if (device->d3d_initialized) ++ delete_opengl_contexts(device, swapchain); ++ ++ if (FAILED(hr = state_init(&device->state, &device->fb, &device->adapter->gl_info, ++#endif /* STAGING_CSMT */ + &device->adapter->d3d_info, WINED3D_STATE_INIT_DEFAULT))) + ERR("Failed to initialize device state, hr %#x.\n", hr); + device->update_state = &device->state; +@@ -4550,6 +5236,7 @@ + } + else if (device->back_buffer_view) + { ++#if defined(STAGING_CSMT) + struct wined3d_state *state = &device->state; + + wined3d_device_set_rendertarget_view(device, 0, device->back_buffer_view, FALSE); +@@ -4565,6 +5252,24 @@ + state->scissor_rect.left = 0; + state->scissor_rect.right = swapchain->desc.backbuffer_width; + state->scissor_rect.bottom = swapchain->desc.backbuffer_height; ++#else /* STAGING_CSMT */ ++ struct wined3d_rendertarget_view *view = device->back_buffer_view; ++ struct wined3d_state *state = &device->state; ++ ++ wined3d_device_set_rendertarget_view(device, 0, view, FALSE); ++ ++ /* Note the min_z / max_z is not reset. */ ++ state->viewport.x = 0; ++ state->viewport.y = 0; ++ state->viewport.width = view->width; ++ state->viewport.height = view->height; ++ wined3d_cs_emit_set_viewport(device->cs, &state->viewport); ++ ++ state->scissor_rect.top = 0; ++ state->scissor_rect.left = 0; ++ state->scissor_rect.right = view->width; ++ state->scissor_rect.bottom = view->height; ++#endif /* STAGING_CSMT */ + wined3d_cs_emit_set_scissor_rect(device->cs, &state->scissor_rect); + } + +@@ -4643,6 +5348,10 @@ + + TRACE("device %p, resource %p, type %s.\n", device, resource, debug_d3dresourcetype(type)); + ++#if !defined(STAGING_CSMT) ++ context_resource_released(device, resource, type); ++ ++#endif /* STAGING_CSMT */ + switch (type) + { + case WINED3D_RTYPE_SURFACE: +@@ -4653,6 +5362,7 @@ + + for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i) + { ++#if defined(STAGING_CSMT) + if (wined3d_rendertarget_view_get_surface(device->state.fb.render_targets[i]) == surface) + { + ERR("Surface %p is still in use as render target %u.\n", surface, i); +@@ -4664,6 +5374,19 @@ + { + ERR("Surface %p is still in use as depth/stencil buffer.\n", surface); + device->state.fb.depth_stencil = NULL; ++#else /* STAGING_CSMT */ ++ if (wined3d_rendertarget_view_get_surface(device->fb.render_targets[i]) == surface) ++ { ++ ERR("Surface %p is still in use as render target %u.\n", surface, i); ++ device->fb.render_targets[i] = NULL; ++ } ++ } ++ ++ if (wined3d_rendertarget_view_get_surface(device->fb.depth_stencil) == surface) ++ { ++ ERR("Surface %p is still in use as depth/stencil buffer.\n", surface); ++ device->fb.depth_stencil = NULL; ++#endif /* STAGING_CSMT */ + } + } + break; +@@ -4804,7 +5527,11 @@ + + device->blitter = adapter->blitter; + ++#if defined(STAGING_CSMT) + if (FAILED(hr = state_init(&device->state, &adapter->gl_info, ++#else /* STAGING_CSMT */ ++ if (FAILED(hr = state_init(&device->state, &device->fb, &adapter->gl_info, ++#endif /* STAGING_CSMT */ + &adapter->d3d_info, WINED3D_STATE_INIT_DEFAULT))) + { + ERR("Failed to initialize device state, hr %#x.\n", hr); +@@ -4892,6 +5619,7 @@ + else + return CallWindowProcA(proc, window, message, wparam, lparam); + } ++#if defined(STAGING_CSMT) + + /* Context activation is done by the caller */ + struct wined3d_gl_bo *wined3d_device_get_bo(struct wined3d_device *device, UINT size, GLenum gl_usage, +@@ -4945,3 +5673,4 @@ + + wined3d_device_destroy_bo(device, context, bo); + } ++#endif /* STAGING_CSMT */ +diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c +--- a/dlls/wined3d/glsl_shader.c ++++ b/dlls/wined3d/glsl_shader.c +@@ -954,8 +954,15 @@ + const struct wined3d_shader_reg_maps *reg_maps, const struct shader_glsl_ctx_priv *ctx_priv) + { + const struct wined3d_shader_version *version = ®_maps->shader_version; ++#if defined(STAGING_CSMT) + const struct ps_compile_args *ps_args = ctx_priv->cur_ps_args; + const struct wined3d_gl_info *gl_info = context->gl_info; ++#else /* STAGING_CSMT */ ++ const struct wined3d_state *state = &shader->device->state; ++ const struct ps_compile_args *ps_args = ctx_priv->cur_ps_args; ++ const struct wined3d_gl_info *gl_info = context->gl_info; ++ const struct wined3d_fb_state *fb = &shader->device->fb; ++#endif /* STAGING_CSMT */ + unsigned int i, extra_constants_needed = 0; + const struct wined3d_shader_lconst *lconst; + const char *prefix; +@@ -1184,7 +1191,11 @@ + { + UINT in_count = min(vec4_varyings(version->major, gl_info), shader->limits->packed_input); + ++#if defined(STAGING_CSMT) + if (ps_args->vp_mode == vertexshader) ++#else /* STAGING_CSMT */ ++ if (use_vs(state)) ++#endif /* STAGING_CSMT */ + shader_addline(buffer, "varying vec4 %s_in[%u];\n", prefix, in_count); + else + /* TODO: Write a replacement shader for the fixed function +@@ -1231,6 +1242,7 @@ + } + else + { ++#if defined(STAGING_CSMT) + /* This happens because we do not have proper tracking of the + * constant registers that are actually used, only the max + * limit of the shader version. +@@ -1239,6 +1251,23 @@ + * it and just create the uniform. + */ + FIXME("Cannot find a free uniform for vpos correction params\n"); ++#else /* STAGING_CSMT */ ++ float ycorrection[] = ++ { ++ context->render_offscreen ? 0.0f : fb->render_targets[0]->height, ++ context->render_offscreen ? 1.0f : -1.0f, ++ 0.0f, ++ 0.0f, ++ }; ++ ++ /* This happens because we do not have proper tracking of the ++ * constant registers that are actually used, only the max ++ * limit of the shader version. */ ++ FIXME("Cannot find a free uniform for vpos correction params\n"); ++ shader_addline(buffer, "const vec4 ycorrection = "); ++ shader_glsl_append_imm_vec4(buffer, ycorrection); ++ shader_addline(buffer, ";\n"); ++#endif /* STAGING_CSMT */ + } + shader_addline(buffer, "vec4 vpos;\n"); + } +diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c +--- a/dlls/wined3d/cs.c ++++ b/dlls/wined3d/cs.c +@@ -22,11 +22,18 @@ + + WINE_DEFAULT_DEBUG_CHANNEL(d3d); + ++#if defined(STAGING_CSMT) + enum wined3d_cs_op + { + WINED3D_CS_OP_NOP, + WINED3D_CS_OP_SKIP, + WINED3D_CS_OP_FENCE, ++#else /* STAGING_CSMT */ ++#define WINED3D_INITIAL_CS_SIZE 4096 ++ ++enum wined3d_cs_op ++{ ++#endif /* STAGING_CSMT */ + WINED3D_CS_OP_PRESENT, + WINED3D_CS_OP_CLEAR, + WINED3D_CS_OP_DRAW, +@@ -52,6 +59,7 @@ + WINED3D_CS_OP_SET_CLIP_PLANE, + WINED3D_CS_OP_SET_MATERIAL, + WINED3D_CS_OP_RESET_STATE, ++#if defined(STAGING_CSMT) + WINED3D_CS_OP_SET_VS_CONSTS_F, + WINED3D_CS_OP_SET_VS_CONSTS_B, + WINED3D_CS_OP_SET_VS_CONSTS_I, +@@ -130,6 +138,30 @@ + float depth; + DWORD stencil; + RECT rects[1]; ++#else /* STAGING_CSMT */ ++}; ++ ++struct wined3d_cs_present ++{ ++ enum wined3d_cs_op opcode; ++ HWND dst_window_override; ++ struct wined3d_swapchain *swapchain; ++ const RECT *src_rect; ++ const RECT *dst_rect; ++ const RGNDATA *dirty_region; ++ DWORD flags; ++}; ++ ++struct wined3d_cs_clear ++{ ++ enum wined3d_cs_op opcode; ++ DWORD rect_count; ++ const RECT *rects; ++ DWORD flags; ++ const struct wined3d_color *color; ++ float depth; ++ DWORD stencil; ++#endif /* STAGING_CSMT */ + }; + + struct wined3d_cs_draw +@@ -152,6 +184,7 @@ + struct wined3d_cs_set_viewport + { + enum wined3d_cs_op opcode; ++#if defined(STAGING_CSMT) + struct wined3d_viewport viewport; + }; + +@@ -159,6 +192,15 @@ + { + enum wined3d_cs_op opcode; + RECT rect; ++#else /* STAGING_CSMT */ ++ const struct wined3d_viewport *viewport; ++}; ++ ++struct wined3d_cs_set_scissor_rect ++{ ++ enum wined3d_cs_op opcode; ++ const RECT *rect; ++#endif /* STAGING_CSMT */ + }; + + struct wined3d_cs_set_rendertarget_view +@@ -277,6 +319,7 @@ + { + enum wined3d_cs_op opcode; + enum wined3d_transform_state state; ++#if defined(STAGING_CSMT) + struct wined3d_matrix matrix; + }; + +@@ -291,6 +334,22 @@ + { + enum wined3d_cs_op opcode; + struct wined3d_material material; ++#else /* STAGING_CSMT */ ++ const struct wined3d_matrix *matrix; ++}; ++ ++struct wined3d_cs_set_clip_plane ++{ ++ enum wined3d_cs_op opcode; ++ UINT plane_idx; ++ const struct wined3d_vec4 *plane; ++}; ++ ++struct wined3d_cs_set_material ++{ ++ enum wined3d_cs_op opcode; ++ const struct wined3d_material *material; ++#endif /* STAGING_CSMT */ + }; + + struct wined3d_cs_reset_state +@@ -298,6 +357,7 @@ + enum wined3d_cs_op opcode; + }; + ++#if defined(STAGING_CSMT) + struct wined3d_cs_set_consts_f + { + enum wined3d_cs_op opcode; +@@ -2649,192 +2709,864 @@ + /* WINED3D_CS_OP_NOP */ wined3d_cs_exec_nop, + /* WINED3D_CS_OP_SKIP */ wined3d_cs_exec_skip, + /* WINED3D_CS_OP_FENCE */ wined3d_cs_exec_fence, +- /* WINED3D_CS_OP_PRESENT */ wined3d_cs_exec_present, +- /* WINED3D_CS_OP_CLEAR */ wined3d_cs_exec_clear, +- /* WINED3D_CS_OP_DRAW */ wined3d_cs_exec_draw, +- /* WINED3D_CS_OP_SET_PREDICATION */ wined3d_cs_exec_set_predication, +- /* WINED3D_CS_OP_SET_VIEWPORT */ wined3d_cs_exec_set_viewport, +- /* WINED3D_CS_OP_SET_SCISSOR_RECT */ wined3d_cs_exec_set_scissor_rect, +- /* WINED3D_CS_OP_SET_RENDERTARGET_VIEW */ wined3d_cs_exec_set_rendertarget_view, +- /* WINED3D_CS_OP_SET_DEPTH_STENCIL_VIEW */ wined3d_cs_exec_set_depth_stencil_view, +- /* WINED3D_CS_OP_SET_VERTEX_DECLARATION */ wined3d_cs_exec_set_vertex_declaration, +- /* WINED3D_CS_OP_SET_STREAM_SOURCE */ wined3d_cs_exec_set_stream_source, +- /* WINED3D_CS_OP_SET_STREAM_SOURCE_FREQ */ wined3d_cs_exec_set_stream_source_freq, +- /* WINED3D_CS_OP_SET_STREAM_OUTPUT */ wined3d_cs_exec_set_stream_output, +- /* WINED3D_CS_OP_SET_INDEX_BUFFER */ wined3d_cs_exec_set_index_buffer, +- /* WINED3D_CS_OP_SET_CONSTANT_BUFFER */ wined3d_cs_exec_set_constant_buffer, +- /* WINED3D_CS_OP_SET_TEXTURE */ wined3d_cs_exec_set_texture, +- /* WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEW */ wined3d_cs_exec_set_shader_resource_view, +- /* WINED3D_CS_OP_SET_SAMPLER */ wined3d_cs_exec_set_sampler, +- /* WINED3D_CS_OP_SET_SHADER */ wined3d_cs_exec_set_shader, +- /* WINED3D_CS_OP_SET_RENDER_STATE */ wined3d_cs_exec_set_render_state, +- /* WINED3D_CS_OP_SET_TEXTURE_STATE */ wined3d_cs_exec_set_texture_state, +- /* WINED3D_CS_OP_SET_SAMPLER_STATE */ wined3d_cs_exec_set_sampler_state, +- /* WINED3D_CS_OP_SET_TRANSFORM */ wined3d_cs_exec_set_transform, +- /* WINED3D_CS_OP_SET_CLIP_PLANE */ wined3d_cs_exec_set_clip_plane, +- /* WINED3D_CS_OP_SET_MATERIAL */ wined3d_cs_exec_set_material, +- /* WINED3D_CS_OP_RESET_STATE */ wined3d_cs_exec_reset_state, +- /* WINED3D_CS_OP_SET_VS_CONSTS_F */ wined3d_cs_exec_set_vs_consts_f, +- /* WINED3D_CS_OP_SET_VS_CONSTS_B */ wined3d_cs_exec_set_vs_consts_b, +- /* WINED3D_CS_OP_SET_VS_CONSTS_I */ wined3d_cs_exec_set_vs_consts_i, +- /* WINED3D_CS_OP_SET_PS_CONSTS_F */ wined3d_cs_exec_set_ps_consts_f, +- /* WINED3D_CS_OP_SET_PS_CONSTS_B */ wined3d_cs_exec_set_ps_consts_b, +- /* WINED3D_CS_OP_SET_PS_CONSTS_I */ wined3d_cs_exec_set_ps_consts_i, +- /* WINED3D_CS_OP_GLFINISH */ wined3d_cs_exec_glfinish, +- /* WINED3D_CS_OP_SET_BASE_VERTEX_INDEX */ wined3d_cs_exec_set_base_vertex_index, +- /* WINED3D_CS_OP_SET_PRIMITIVE_TYPE */ wined3d_cs_exec_set_primitive_type, +- /* WINED3D_CS_OP_SET_LIGHT */ wined3d_cs_exec_set_light, +- /* WINED3D_CS_OP_SET_LIGHT_ENABLE */ wined3d_cs_exec_set_light_enable, +- /* WINED3D_CS_OP_BLT */ wined3d_cs_exec_blt, +- /* WINED3D_CS_OP_CLEAR_RTV */ wined3d_cs_exec_clear_rtv, +- /* WINED3D_CS_OP_RESOURCE_CHANGED */ wined3d_cs_exec_resource_changed, +- /* WINED3D_CS_OP_RESOURCE_MAP */ wined3d_cs_exec_resource_map, +- /* WINED3D_CS_OP_RESOURCE_UNMAP */ wined3d_cs_exec_resource_unmap, +- /* WINED3D_CS_OP_BUFFER_SWAP_MEM */ wined3d_cs_exec_buffer_swap_mem, +- /* WINED3D_CS_OP_BUFFER_INVALIDATE_RANGE */ wined3d_cs_exec_buffer_invalidate_bo_range, +- /* WINED3D_CS_OP_BUFFER_PRELOAD */ wined3d_cs_exec_buffer_preload, +- /* WINED3D_CS_OP_QUERY_ISSUE */ wined3d_cs_exec_query_issue, +- /* WINED3D_CS_OP_QUERY_DESTROY */ wined3d_cs_exec_query_destroy, +- /* WINED3D_CS_OP_UPDATE_SURFACE */ wined3d_cs_exec_update_surface, +- /* WINED3D_CS_OP_TEXTURE_PRELOAD */ wined3d_cs_exec_texture_preload, +- /* WINED3D_CS_OP_SURFACE_PRELOAD */ wined3d_cs_exec_surface_preload, +- /* WINED3D_CS_OP_UPDATE_TEXTURE */ wined3d_cs_exec_update_texture, +- /* WINED3D_CS_OP_EVICT_RESOURCE */ wined3d_cs_exec_evict_resource, +- /* WINED3D_CS_OP_VIEW_DESTROY */ wined3d_cs_exec_view_destroy, +- /* WINED3D_CS_OP_VDECL_DESTROY */ wined3d_cs_exec_vertex_declaration_destroy, +- /* WINED3D_CS_OP_SHADER_CLEANUP */ wined3d_cs_exec_shader_cleanup, +- /* WINED3D_CS_OP_CREATE_VBO */ wined3d_cs_exec_create_vbo, +- /* WINED3D_CS_OP_RESOURCE_CLEANUP */ wined3d_cs_exec_resource_cleanup, +- /* WINED3D_CS_OP_BUFFER_CLEANUP */ wined3d_cs_exec_buffer_cleanup, +- /* WINED3D_CS_OP_VOLUME_CLEANUP */ wined3d_cs_exec_volume_cleanup, +- /* WINED3D_CS_OP_SURFACE_CLEANUP */ wined3d_cs_exec_surface_cleanup, +- /* WINED3D_CS_OP_TEXTURE_CLEANUP */ wined3d_cs_exec_texture_cleanup, +- /* WINED3D_CS_OP_CREATE_DUMMY_TEXTURES */ wined3d_cs_exec_create_dummy_textures, +- /* WINED3D_CS_OP_CREATE_SWAPCHAIN_CONTEXT */ wined3d_cs_exec_create_swapchain_context, +- /* WINED3D_CS_OP_DELETE_GL_CONTEXTS */ wined3d_cs_exec_delete_gl_contexts, +- /* WINED3D_CS_OP_GETDC */ wined3d_cs_exec_getdc, +- /* WINED3D_CS_OP_RELEASEDC */ wined3d_cs_exec_releasedc, +-}; +- +-static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) ++#else /* STAGING_CSMT */ ++static void wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data) + { +- struct wined3d_cs_queue *queue = prio ? &cs->prio_queue : &cs->queue; +- size_t queue_size = sizeof(queue->data) / sizeof(*queue->data); ++ const struct wined3d_cs_present *op = data; ++ struct wined3d_swapchain *swapchain; + +- if (queue_size - size < queue->head) +- { +- struct wined3d_cs_skip *skip; +- size_t nop_size = queue_size - queue->head; ++ swapchain = op->swapchain; ++ wined3d_swapchain_set_window(swapchain, op->dst_window_override); + +- skip = _wined3d_cs_mt_require_space(cs, nop_size, prio); +- if (nop_size < sizeof(*skip)) +- { +- skip->opcode = WINED3D_CS_OP_NOP; +- } +- else +- { +- skip->opcode = WINED3D_CS_OP_SKIP; +- skip->size = nop_size; +- } ++ swapchain->swapchain_ops->swapchain_present(swapchain, ++ op->src_rect, op->dst_rect, op->dirty_region, op->flags); ++} + +- if (prio) +- cs->ops->submit_prio(cs, nop_size); +- else +- cs->ops->submit(cs, nop_size); ++void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *swapchain, ++ const RECT *src_rect, const RECT *dst_rect, HWND dst_window_override, ++ const RGNDATA *dirty_region, DWORD flags) ++{ ++ struct wined3d_cs_present *op; + +- assert(!queue->head); +- } ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_PRESENT; ++ op->dst_window_override = dst_window_override; ++ op->swapchain = swapchain; ++ op->src_rect = src_rect; ++ op->dst_rect = dst_rect; ++ op->dirty_region = dirty_region; ++ op->flags = flags; + +- while(1) +- { +- LONG head = queue->head; +- LONG tail = *((volatile LONG *)&queue->tail); +- LONG new_pos; +- /* Empty */ +- if (head == tail) +- break; +- /* Head ahead of tail, take care of wrap-around */ +- new_pos = (head + size) & (WINED3D_CS_QUEUE_SIZE - 1); +- if (head > tail && (new_pos || tail)) +- break; +- /* Tail ahead of head, but still enough space */ +- if (new_pos < tail && new_pos) +- break; ++ cs->ops->submit(cs); ++} + +- TRACE("Waiting for free space. Head %u, tail %u, want %u\n", head, tail, +- (unsigned int) size); +- } ++static void wined3d_cs_exec_clear(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_clear *op = data; ++ struct wined3d_device *device; ++ RECT draw_rect; + +- return &queue->data[queue->head]; ++ device = cs->device; ++ wined3d_get_draw_rect(&device->state, &draw_rect); ++ device_clear_render_targets(device, device->adapter->gl_info.limits.buffers, ++ &device->fb, op->rect_count, op->rects, &draw_rect, op->flags, ++ op->color, op->depth, op->stencil); + } + +-static inline void *wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size) ++void wined3d_cs_emit_clear(struct wined3d_cs *cs, DWORD rect_count, const RECT *rects, ++ DWORD flags, const struct wined3d_color *color, float depth, DWORD stencil) + { +- return _wined3d_cs_mt_require_space(cs, size, FALSE); ++ struct wined3d_cs_clear *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_CLEAR; ++ op->rect_count = rect_count; ++ op->rects = rects; ++ op->flags = flags; ++ op->color = color; ++ op->depth = depth; ++ op->stencil = stencil; ++ ++ cs->ops->submit(cs); + } + +-static inline void *wined3d_cs_mt_require_space_prio(struct wined3d_cs *cs, size_t size) ++static void wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data) + { +- return _wined3d_cs_mt_require_space(cs, size, TRUE); ++ const struct wined3d_cs_draw *op = data; ++ ++ draw_primitive(cs->device, op->start_idx, op->index_count, ++ op->start_instance, op->instance_count, op->indexed); + } + +-/* FIXME: wined3d_device_uninit_3d() should either flush and wait, or be an +- * OP itself. */ +-static void wined3d_cs_emit_stop(struct wined3d_cs *cs) ++void wined3d_cs_emit_draw(struct wined3d_cs *cs, UINT start_idx, UINT index_count, ++ UINT start_instance, UINT instance_count, BOOL indexed) + { +- struct wined3d_cs_stop *op; ++ struct wined3d_cs_draw *op; + +- op = wined3d_cs_mt_require_space(cs, sizeof(*op)); +- op->opcode = WINED3D_CS_OP_STOP; ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_DRAW; ++ op->start_idx = start_idx; ++ op->index_count = index_count; ++ op->start_instance = start_instance; ++ op->instance_count = instance_count; ++ op->indexed = indexed; + +- wined3d_cs_mt_submit(cs, sizeof(*op)); ++ cs->ops->submit(cs); + } + +-static void wined3d_cs_mt_finish(struct wined3d_cs *cs) ++static void wined3d_cs_exec_set_predication(struct wined3d_cs *cs, const void *data) + { +- BOOL fence; ++ const struct wined3d_cs_set_predication *op = data; + +- if (cs->thread_id == GetCurrentThreadId()) +- { +- static BOOL once; +- if (!once) +- { +- FIXME("flush_and_wait called from cs thread\n"); +- once = TRUE; +- } +- return; +- } ++ cs->state.predicate = op->predicate; ++ cs->state.predicate_value = op->value; ++} + +- wined3d_cs_emit_fence(cs, &fence); ++void wined3d_cs_emit_set_predication(struct wined3d_cs *cs, struct wined3d_query *predicate, BOOL value) ++{ ++ struct wined3d_cs_set_predication *op; + +- /* A busy wait should be fine, we're not supposed to have to wait very +- * long. */ +- while (!InterlockedCompareExchange(&fence, TRUE, TRUE)); ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_PREDICATION; ++ op->predicate = predicate; ++ op->value = value; ++ ++ cs->ops->submit(cs); + } + +-static void wined3d_cs_mt_finish_prio(struct wined3d_cs *cs) ++static void wined3d_cs_exec_set_viewport(struct wined3d_cs *cs, const void *data) + { +- BOOL fence; ++ const struct wined3d_cs_set_viewport *op = data; + +- if (cs->thread_id == GetCurrentThreadId()) +- { +- static BOOL once; +- if (!once) +- { +- FIXME("flush_and_wait called from cs thread\n"); +- once = TRUE; +- } +- return; +- } ++ cs->state.viewport = *op->viewport; ++ device_invalidate_state(cs->device, STATE_VIEWPORT); ++} + +- wined3d_cs_emit_fence_prio(cs, &fence); ++void wined3d_cs_emit_set_viewport(struct wined3d_cs *cs, const struct wined3d_viewport *viewport) ++{ ++ struct wined3d_cs_set_viewport *op; + +- /* A busy wait should be fine, we're not supposed to have to wait very +- * long. */ +- while (!InterlockedCompareExchange(&fence, TRUE, TRUE)); ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_VIEWPORT; ++ op->viewport = viewport; ++ ++ cs->ops->submit(cs); + } + +-static const struct wined3d_cs_ops wined3d_cs_mt_ops = ++static void wined3d_cs_exec_set_scissor_rect(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_scissor_rect *op = data; ++ ++ cs->state.scissor_rect = *op->rect; ++ device_invalidate_state(cs->device, STATE_SCISSORRECT); ++} ++ ++void wined3d_cs_emit_set_scissor_rect(struct wined3d_cs *cs, const RECT *rect) ++{ ++ struct wined3d_cs_set_scissor_rect *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_SCISSOR_RECT; ++ op->rect = rect; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_rendertarget_view(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_rendertarget_view *op = data; ++ ++ cs->state.fb->render_targets[op->view_idx] = op->view; ++ device_invalidate_state(cs->device, STATE_FRAMEBUFFER); ++} ++ ++void wined3d_cs_emit_set_rendertarget_view(struct wined3d_cs *cs, unsigned int view_idx, ++ struct wined3d_rendertarget_view *view) ++{ ++ struct wined3d_cs_set_rendertarget_view *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_RENDERTARGET_VIEW; ++ op->view_idx = view_idx; ++ op->view = view; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_depth_stencil_view *op = data; ++ struct wined3d_device *device = cs->device; ++ struct wined3d_rendertarget_view *prev; ++ ++ if ((prev = cs->state.fb->depth_stencil)) ++ { ++ struct wined3d_surface *prev_surface = wined3d_rendertarget_view_get_surface(prev); ++ ++ if (prev_surface && (device->swapchains[0]->desc.flags & WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL ++ || prev_surface->flags & SFLAG_DISCARD)) ++ { ++ surface_modify_ds_location(prev_surface, WINED3D_LOCATION_DISCARDED, prev->width, prev->height); ++ if (prev_surface == device->onscreen_depth_stencil) ++ { ++ wined3d_surface_decref(device->onscreen_depth_stencil); ++ device->onscreen_depth_stencil = NULL; ++ } ++ } ++ } ++ ++ cs->fb.depth_stencil = op->view; ++ ++ if (!prev != !op->view) ++ { ++ /* Swapping NULL / non NULL depth stencil affects the depth and tests */ ++ device_invalidate_state(device, STATE_RENDER(WINED3D_RS_ZENABLE)); ++ device_invalidate_state(device, STATE_RENDER(WINED3D_RS_STENCILENABLE)); ++ device_invalidate_state(device, STATE_RENDER(WINED3D_RS_STENCILWRITEMASK)); ++ device_invalidate_state(device, STATE_RENDER(WINED3D_RS_DEPTHBIAS)); ++ } ++ else if (prev && prev->format->depth_size != op->view->format->depth_size) ++ { ++ device_invalidate_state(device, STATE_RENDER(WINED3D_RS_DEPTHBIAS)); ++ } ++ ++ device_invalidate_state(device, STATE_FRAMEBUFFER); ++} ++ ++void wined3d_cs_emit_set_depth_stencil_view(struct wined3d_cs *cs, struct wined3d_rendertarget_view *view) ++{ ++ struct wined3d_cs_set_depth_stencil_view *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_DEPTH_STENCIL_VIEW; ++ op->view = view; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_vertex_declaration(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_vertex_declaration *op = data; ++ ++ cs->state.vertex_declaration = op->declaration; ++ device_invalidate_state(cs->device, STATE_VDECL); ++} ++ ++void wined3d_cs_emit_set_vertex_declaration(struct wined3d_cs *cs, struct wined3d_vertex_declaration *declaration) ++{ ++ struct wined3d_cs_set_vertex_declaration *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_VERTEX_DECLARATION; ++ op->declaration = declaration; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_stream_source(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_stream_source *op = data; ++ struct wined3d_stream_state *stream; ++ struct wined3d_buffer *prev; ++ ++ stream = &cs->state.streams[op->stream_idx]; ++ prev = stream->buffer; ++ stream->buffer = op->buffer; ++ stream->offset = op->offset; ++ stream->stride = op->stride; ++ ++ if (op->buffer) ++ InterlockedIncrement(&op->buffer->resource.bind_count); ++ if (prev) ++ InterlockedDecrement(&prev->resource.bind_count); ++ ++ device_invalidate_state(cs->device, STATE_STREAMSRC); ++} ++ ++void wined3d_cs_emit_set_stream_source(struct wined3d_cs *cs, UINT stream_idx, ++ struct wined3d_buffer *buffer, UINT offset, UINT stride) ++{ ++ struct wined3d_cs_set_stream_source *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_STREAM_SOURCE; ++ op->stream_idx = stream_idx; ++ op->buffer = buffer; ++ op->offset = offset; ++ op->stride = stride; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_stream_source_freq(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_stream_source_freq *op = data; ++ struct wined3d_stream_state *stream; ++ ++ stream = &cs->state.streams[op->stream_idx]; ++ stream->frequency = op->frequency; ++ stream->flags = op->flags; ++ ++ device_invalidate_state(cs->device, STATE_STREAMSRC); ++} ++ ++void wined3d_cs_emit_set_stream_source_freq(struct wined3d_cs *cs, UINT stream_idx, UINT frequency, UINT flags) ++{ ++ struct wined3d_cs_set_stream_source_freq *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_STREAM_SOURCE_FREQ; ++ op->stream_idx = stream_idx; ++ op->frequency = frequency; ++ op->flags = flags; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_stream_output(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_stream_output *op = data; ++ struct wined3d_stream_output *stream; ++ struct wined3d_buffer *prev; ++ ++ stream = &cs->state.stream_output[op->stream_idx]; ++ prev = stream->buffer; ++ stream->buffer = op->buffer; ++ stream->offset = op->offset; ++ ++ if (op->buffer) ++ InterlockedIncrement(&op->buffer->resource.bind_count); ++ if (prev) ++ InterlockedDecrement(&prev->resource.bind_count); ++} ++ ++void wined3d_cs_emit_set_stream_output(struct wined3d_cs *cs, UINT stream_idx, ++ struct wined3d_buffer *buffer, UINT offset) ++{ ++ struct wined3d_cs_set_stream_output *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_STREAM_OUTPUT; ++ op->stream_idx = stream_idx; ++ op->buffer = buffer; ++ op->offset = offset; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_index_buffer(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_index_buffer *op = data; ++ struct wined3d_buffer *prev; ++ ++ prev = cs->state.index_buffer; ++ cs->state.index_buffer = op->buffer; ++ cs->state.index_format = op->format_id; ++ ++ if (op->buffer) ++ InterlockedIncrement(&op->buffer->resource.bind_count); ++ if (prev) ++ InterlockedDecrement(&prev->resource.bind_count); ++ ++ device_invalidate_state(cs->device, STATE_INDEXBUFFER); ++} ++ ++void wined3d_cs_emit_set_index_buffer(struct wined3d_cs *cs, struct wined3d_buffer *buffer, ++ enum wined3d_format_id format_id) ++{ ++ struct wined3d_cs_set_index_buffer *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_INDEX_BUFFER; ++ op->buffer = buffer; ++ op->format_id = format_id; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_constant_buffer(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_constant_buffer *op = data; ++ struct wined3d_buffer *prev; ++ ++ prev = cs->state.cb[op->type][op->cb_idx]; ++ cs->state.cb[op->type][op->cb_idx] = op->buffer; ++ ++ if (op->buffer) ++ InterlockedIncrement(&op->buffer->resource.bind_count); ++ if (prev) ++ InterlockedDecrement(&prev->resource.bind_count); ++ ++ device_invalidate_state(cs->device, STATE_CONSTANT_BUFFER(op->type)); ++} ++ ++void wined3d_cs_emit_set_constant_buffer(struct wined3d_cs *cs, enum wined3d_shader_type type, ++ UINT cb_idx, struct wined3d_buffer *buffer) ++{ ++ struct wined3d_cs_set_constant_buffer *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_CONSTANT_BUFFER; ++ op->type = type; ++ op->cb_idx = cb_idx; ++ op->buffer = buffer; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_texture(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_d3d_info *d3d_info = &cs->device->adapter->d3d_info; ++ const struct wined3d_cs_set_texture *op = data; ++ struct wined3d_texture *prev; ++ ++ prev = cs->state.textures[op->stage]; ++ cs->state.textures[op->stage] = op->texture; ++ ++ if (op->texture) ++ { ++ const struct wined3d_format *new_format = op->texture->resource.format; ++ const struct wined3d_format *old_format = prev ? prev->resource.format : NULL; ++ ++ if (InterlockedIncrement(&op->texture->resource.bind_count) == 1) ++ op->texture->sampler = op->stage; ++ ++ if (!prev || op->texture->target != prev->target ++ || !is_same_fixup(new_format->color_fixup, old_format->color_fixup) ++ || (new_format->flags & WINED3DFMT_FLAG_SHADOW) != (old_format->flags & WINED3DFMT_FLAG_SHADOW)) ++ device_invalidate_state(cs->device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL)); ++ ++ if (!prev && op->stage < d3d_info->limits.ffp_blend_stages) ++ { ++ /* The source arguments for color and alpha ops have different ++ * meanings when a NULL texture is bound, so the COLOR_OP and ++ * ALPHA_OP have to be dirtified. */ ++ device_invalidate_state(cs->device, STATE_TEXTURESTAGE(op->stage, WINED3D_TSS_COLOR_OP)); ++ device_invalidate_state(cs->device, STATE_TEXTURESTAGE(op->stage, WINED3D_TSS_ALPHA_OP)); ++ } ++ } ++ ++ if (prev) ++ { ++ if (InterlockedDecrement(&prev->resource.bind_count) && prev->sampler == op->stage) ++ { ++ unsigned int i; ++ ++ /* Search for other stages the texture is bound to. Shouldn't ++ * happen if applications bind textures to a single stage only. */ ++ TRACE("Searching for other stages the texture is bound to.\n"); ++ for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i) ++ { ++ if (cs->state.textures[i] == prev) ++ { ++ TRACE("Texture is also bound to stage %u.\n", i); ++ prev->sampler = i; ++ break; ++ } ++ } ++ } ++ ++ if (!op->texture && op->stage < d3d_info->limits.ffp_blend_stages) ++ { ++ device_invalidate_state(cs->device, STATE_TEXTURESTAGE(op->stage, WINED3D_TSS_COLOR_OP)); ++ device_invalidate_state(cs->device, STATE_TEXTURESTAGE(op->stage, WINED3D_TSS_ALPHA_OP)); ++ } ++ } ++ ++ device_invalidate_state(cs->device, STATE_SAMPLER(op->stage)); ++} ++ ++void wined3d_cs_emit_set_texture(struct wined3d_cs *cs, UINT stage, struct wined3d_texture *texture) ++{ ++ struct wined3d_cs_set_texture *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_TEXTURE; ++ op->stage = stage; ++ op->texture = texture; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_shader_resource_view(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_shader_resource_view *op = data; ++ ++ cs->state.shader_resource_view[op->type][op->view_idx] = op->view; ++} ++ ++void wined3d_cs_emit_set_shader_resource_view(struct wined3d_cs *cs, enum wined3d_shader_type type, ++ UINT view_idx, struct wined3d_shader_resource_view *view) ++{ ++ struct wined3d_cs_set_shader_resource_view *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEW; ++ op->type = type; ++ op->view_idx = view_idx; ++ op->view = view; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_sampler(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_sampler *op = data; ++ ++ cs->state.sampler[op->type][op->sampler_idx] = op->sampler; ++} ++ ++void wined3d_cs_emit_set_sampler(struct wined3d_cs *cs, enum wined3d_shader_type type, ++ UINT sampler_idx, struct wined3d_sampler *sampler) ++{ ++ struct wined3d_cs_set_sampler *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_SAMPLER; ++ op->type = type; ++ op->sampler_idx = sampler_idx; ++ op->sampler = sampler; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_shader(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_shader *op = data; ++ ++ cs->state.shader[op->type] = op->shader; ++ device_invalidate_state(cs->device, STATE_SHADER(op->type)); ++} ++ ++void wined3d_cs_emit_set_shader(struct wined3d_cs *cs, enum wined3d_shader_type type, struct wined3d_shader *shader) ++{ ++ struct wined3d_cs_set_shader *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_SHADER; ++ op->type = type; ++ op->shader = shader; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_render_state(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_render_state *op = data; ++ ++ cs->state.render_states[op->state] = op->value; ++ device_invalidate_state(cs->device, STATE_RENDER(op->state)); ++} ++ ++void wined3d_cs_emit_set_render_state(struct wined3d_cs *cs, enum wined3d_render_state state, DWORD value) ++{ ++ struct wined3d_cs_set_render_state *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_RENDER_STATE; ++ op->state = state; ++ op->value = value; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_texture_state(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_texture_state *op = data; ++ ++ cs->state.texture_states[op->stage][op->state] = op->value; ++ device_invalidate_state(cs->device, STATE_TEXTURESTAGE(op->stage, op->state)); ++} ++ ++void wined3d_cs_emit_set_texture_state(struct wined3d_cs *cs, UINT stage, ++ enum wined3d_texture_stage_state state, DWORD value) ++{ ++ struct wined3d_cs_set_texture_state *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_TEXTURE_STATE; ++ op->stage = stage; ++ op->state = state; ++ op->value = value; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_sampler_state(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_sampler_state *op = data; ++ ++ cs->state.sampler_states[op->sampler_idx][op->state] = op->value; ++ device_invalidate_state(cs->device, STATE_SAMPLER(op->sampler_idx)); ++} ++ ++void wined3d_cs_emit_set_sampler_state(struct wined3d_cs *cs, UINT sampler_idx, ++ enum wined3d_sampler_state state, DWORD value) ++{ ++ struct wined3d_cs_set_sampler_state *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_SAMPLER_STATE; ++ op->sampler_idx = sampler_idx; ++ op->state = state; ++ op->value = value; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_transform(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_transform *op = data; ++ ++ cs->state.transforms[op->state] = *op->matrix; ++ if (op->state < WINED3D_TS_WORLD_MATRIX(cs->device->adapter->gl_info.limits.blends)) ++ device_invalidate_state(cs->device, STATE_TRANSFORM(op->state)); ++} ++ ++void wined3d_cs_emit_set_transform(struct wined3d_cs *cs, enum wined3d_transform_state state, ++ const struct wined3d_matrix *matrix) ++{ ++ struct wined3d_cs_set_transform *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_TRANSFORM; ++ op->state = state; ++ op->matrix = matrix; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_clip_plane(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_clip_plane *op = data; ++ ++ cs->state.clip_planes[op->plane_idx] = *op->plane; ++ device_invalidate_state(cs->device, STATE_CLIPPLANE(op->plane_idx)); ++} ++ ++void wined3d_cs_emit_set_clip_plane(struct wined3d_cs *cs, UINT plane_idx, const struct wined3d_vec4 *plane) ++{ ++ struct wined3d_cs_set_clip_plane *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_CLIP_PLANE; ++ op->plane_idx = plane_idx; ++ op->plane = plane; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_set_material(struct wined3d_cs *cs, const void *data) ++{ ++ const struct wined3d_cs_set_material *op = data; ++ ++ cs->state.material = *op->material; ++ device_invalidate_state(cs->device, STATE_MATERIAL); ++} ++ ++void wined3d_cs_emit_set_material(struct wined3d_cs *cs, const struct wined3d_material *material) ++{ ++ struct wined3d_cs_set_material *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_SET_MATERIAL; ++ op->material = material; ++ ++ cs->ops->submit(cs); ++} ++ ++static void wined3d_cs_exec_reset_state(struct wined3d_cs *cs, const void *data) ++{ ++ struct wined3d_adapter *adapter = cs->device->adapter; ++ HRESULT hr; ++ ++ state_cleanup(&cs->state); ++ memset(&cs->state, 0, sizeof(cs->state)); ++ if (FAILED(hr = state_init(&cs->state, &cs->fb, &adapter->gl_info, &adapter->d3d_info, ++ WINED3D_STATE_NO_REF | WINED3D_STATE_INIT_DEFAULT))) ++ ERR("Failed to initialize CS state, hr %#x.\n", hr); ++} ++ ++void wined3d_cs_emit_reset_state(struct wined3d_cs *cs) ++{ ++ struct wined3d_cs_reset_state *op; ++ ++ op = cs->ops->require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_RESET_STATE; ++ ++ cs->ops->submit(cs); ++} ++ ++static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void *data) = ++{ ++#endif /* STAGING_CSMT */ ++ /* WINED3D_CS_OP_PRESENT */ wined3d_cs_exec_present, ++ /* WINED3D_CS_OP_CLEAR */ wined3d_cs_exec_clear, ++ /* WINED3D_CS_OP_DRAW */ wined3d_cs_exec_draw, ++ /* WINED3D_CS_OP_SET_PREDICATION */ wined3d_cs_exec_set_predication, ++ /* WINED3D_CS_OP_SET_VIEWPORT */ wined3d_cs_exec_set_viewport, ++ /* WINED3D_CS_OP_SET_SCISSOR_RECT */ wined3d_cs_exec_set_scissor_rect, ++ /* WINED3D_CS_OP_SET_RENDERTARGET_VIEW */ wined3d_cs_exec_set_rendertarget_view, ++ /* WINED3D_CS_OP_SET_DEPTH_STENCIL_VIEW */ wined3d_cs_exec_set_depth_stencil_view, ++ /* WINED3D_CS_OP_SET_VERTEX_DECLARATION */ wined3d_cs_exec_set_vertex_declaration, ++ /* WINED3D_CS_OP_SET_STREAM_SOURCE */ wined3d_cs_exec_set_stream_source, ++ /* WINED3D_CS_OP_SET_STREAM_SOURCE_FREQ */ wined3d_cs_exec_set_stream_source_freq, ++ /* WINED3D_CS_OP_SET_STREAM_OUTPUT */ wined3d_cs_exec_set_stream_output, ++ /* WINED3D_CS_OP_SET_INDEX_BUFFER */ wined3d_cs_exec_set_index_buffer, ++ /* WINED3D_CS_OP_SET_CONSTANT_BUFFER */ wined3d_cs_exec_set_constant_buffer, ++ /* WINED3D_CS_OP_SET_TEXTURE */ wined3d_cs_exec_set_texture, ++ /* WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEW */ wined3d_cs_exec_set_shader_resource_view, ++ /* WINED3D_CS_OP_SET_SAMPLER */ wined3d_cs_exec_set_sampler, ++ /* WINED3D_CS_OP_SET_SHADER */ wined3d_cs_exec_set_shader, ++ /* WINED3D_CS_OP_SET_RENDER_STATE */ wined3d_cs_exec_set_render_state, ++ /* WINED3D_CS_OP_SET_TEXTURE_STATE */ wined3d_cs_exec_set_texture_state, ++ /* WINED3D_CS_OP_SET_SAMPLER_STATE */ wined3d_cs_exec_set_sampler_state, ++ /* WINED3D_CS_OP_SET_TRANSFORM */ wined3d_cs_exec_set_transform, ++ /* WINED3D_CS_OP_SET_CLIP_PLANE */ wined3d_cs_exec_set_clip_plane, ++ /* WINED3D_CS_OP_SET_MATERIAL */ wined3d_cs_exec_set_material, ++ /* WINED3D_CS_OP_RESET_STATE */ wined3d_cs_exec_reset_state, ++#if defined(STAGING_CSMT) ++ /* WINED3D_CS_OP_SET_VS_CONSTS_F */ wined3d_cs_exec_set_vs_consts_f, ++ /* WINED3D_CS_OP_SET_VS_CONSTS_B */ wined3d_cs_exec_set_vs_consts_b, ++ /* WINED3D_CS_OP_SET_VS_CONSTS_I */ wined3d_cs_exec_set_vs_consts_i, ++ /* WINED3D_CS_OP_SET_PS_CONSTS_F */ wined3d_cs_exec_set_ps_consts_f, ++ /* WINED3D_CS_OP_SET_PS_CONSTS_B */ wined3d_cs_exec_set_ps_consts_b, ++ /* WINED3D_CS_OP_SET_PS_CONSTS_I */ wined3d_cs_exec_set_ps_consts_i, ++ /* WINED3D_CS_OP_GLFINISH */ wined3d_cs_exec_glfinish, ++ /* WINED3D_CS_OP_SET_BASE_VERTEX_INDEX */ wined3d_cs_exec_set_base_vertex_index, ++ /* WINED3D_CS_OP_SET_PRIMITIVE_TYPE */ wined3d_cs_exec_set_primitive_type, ++ /* WINED3D_CS_OP_SET_LIGHT */ wined3d_cs_exec_set_light, ++ /* WINED3D_CS_OP_SET_LIGHT_ENABLE */ wined3d_cs_exec_set_light_enable, ++ /* WINED3D_CS_OP_BLT */ wined3d_cs_exec_blt, ++ /* WINED3D_CS_OP_CLEAR_RTV */ wined3d_cs_exec_clear_rtv, ++ /* WINED3D_CS_OP_RESOURCE_CHANGED */ wined3d_cs_exec_resource_changed, ++ /* WINED3D_CS_OP_RESOURCE_MAP */ wined3d_cs_exec_resource_map, ++ /* WINED3D_CS_OP_RESOURCE_UNMAP */ wined3d_cs_exec_resource_unmap, ++ /* WINED3D_CS_OP_BUFFER_SWAP_MEM */ wined3d_cs_exec_buffer_swap_mem, ++ /* WINED3D_CS_OP_BUFFER_INVALIDATE_RANGE */ wined3d_cs_exec_buffer_invalidate_bo_range, ++ /* WINED3D_CS_OP_BUFFER_PRELOAD */ wined3d_cs_exec_buffer_preload, ++ /* WINED3D_CS_OP_QUERY_ISSUE */ wined3d_cs_exec_query_issue, ++ /* WINED3D_CS_OP_QUERY_DESTROY */ wined3d_cs_exec_query_destroy, ++ /* WINED3D_CS_OP_UPDATE_SURFACE */ wined3d_cs_exec_update_surface, ++ /* WINED3D_CS_OP_TEXTURE_PRELOAD */ wined3d_cs_exec_texture_preload, ++ /* WINED3D_CS_OP_SURFACE_PRELOAD */ wined3d_cs_exec_surface_preload, ++ /* WINED3D_CS_OP_UPDATE_TEXTURE */ wined3d_cs_exec_update_texture, ++ /* WINED3D_CS_OP_EVICT_RESOURCE */ wined3d_cs_exec_evict_resource, ++ /* WINED3D_CS_OP_VIEW_DESTROY */ wined3d_cs_exec_view_destroy, ++ /* WINED3D_CS_OP_VDECL_DESTROY */ wined3d_cs_exec_vertex_declaration_destroy, ++ /* WINED3D_CS_OP_SHADER_CLEANUP */ wined3d_cs_exec_shader_cleanup, ++ /* WINED3D_CS_OP_CREATE_VBO */ wined3d_cs_exec_create_vbo, ++ /* WINED3D_CS_OP_RESOURCE_CLEANUP */ wined3d_cs_exec_resource_cleanup, ++ /* WINED3D_CS_OP_BUFFER_CLEANUP */ wined3d_cs_exec_buffer_cleanup, ++ /* WINED3D_CS_OP_VOLUME_CLEANUP */ wined3d_cs_exec_volume_cleanup, ++ /* WINED3D_CS_OP_SURFACE_CLEANUP */ wined3d_cs_exec_surface_cleanup, ++ /* WINED3D_CS_OP_TEXTURE_CLEANUP */ wined3d_cs_exec_texture_cleanup, ++ /* WINED3D_CS_OP_CREATE_DUMMY_TEXTURES */ wined3d_cs_exec_create_dummy_textures, ++ /* WINED3D_CS_OP_CREATE_SWAPCHAIN_CONTEXT */ wined3d_cs_exec_create_swapchain_context, ++ /* WINED3D_CS_OP_DELETE_GL_CONTEXTS */ wined3d_cs_exec_delete_gl_contexts, ++ /* WINED3D_CS_OP_GETDC */ wined3d_cs_exec_getdc, ++ /* WINED3D_CS_OP_RELEASEDC */ wined3d_cs_exec_releasedc, ++}; ++ ++static inline void *_wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size, BOOL prio) ++{ ++ struct wined3d_cs_queue *queue = prio ? &cs->prio_queue : &cs->queue; ++ size_t queue_size = sizeof(queue->data) / sizeof(*queue->data); ++ ++ if (queue_size - size < queue->head) ++ { ++ struct wined3d_cs_skip *skip; ++ size_t nop_size = queue_size - queue->head; ++ ++ skip = _wined3d_cs_mt_require_space(cs, nop_size, prio); ++ if (nop_size < sizeof(*skip)) ++ { ++ skip->opcode = WINED3D_CS_OP_NOP; ++ } ++ else ++ { ++ skip->opcode = WINED3D_CS_OP_SKIP; ++ skip->size = nop_size; ++ } ++ ++ if (prio) ++ cs->ops->submit_prio(cs, nop_size); ++ else ++ cs->ops->submit(cs, nop_size); ++ ++ assert(!queue->head); ++ } ++ ++ while(1) ++ { ++ LONG head = queue->head; ++ LONG tail = *((volatile LONG *)&queue->tail); ++ LONG new_pos; ++ /* Empty */ ++ if (head == tail) ++ break; ++ /* Head ahead of tail, take care of wrap-around */ ++ new_pos = (head + size) & (WINED3D_CS_QUEUE_SIZE - 1); ++ if (head > tail && (new_pos || tail)) ++ break; ++ /* Tail ahead of head, but still enough space */ ++ if (new_pos < tail && new_pos) ++ break; ++ ++ TRACE("Waiting for free space. Head %u, tail %u, want %u\n", head, tail, ++ (unsigned int) size); ++ } ++ ++ return &queue->data[queue->head]; ++} ++ ++static inline void *wined3d_cs_mt_require_space(struct wined3d_cs *cs, size_t size) ++{ ++ return _wined3d_cs_mt_require_space(cs, size, FALSE); ++} ++ ++static inline void *wined3d_cs_mt_require_space_prio(struct wined3d_cs *cs, size_t size) ++{ ++ return _wined3d_cs_mt_require_space(cs, size, TRUE); ++} ++ ++/* FIXME: wined3d_device_uninit_3d() should either flush and wait, or be an ++ * OP itself. */ ++static void wined3d_cs_emit_stop(struct wined3d_cs *cs) ++{ ++ struct wined3d_cs_stop *op; ++ ++ op = wined3d_cs_mt_require_space(cs, sizeof(*op)); ++ op->opcode = WINED3D_CS_OP_STOP; ++ ++ wined3d_cs_mt_submit(cs, sizeof(*op)); ++} ++ ++static void wined3d_cs_mt_finish(struct wined3d_cs *cs) ++{ ++ BOOL fence; ++ ++ if (cs->thread_id == GetCurrentThreadId()) ++ { ++ static BOOL once; ++ if (!once) ++ { ++ FIXME("flush_and_wait called from cs thread\n"); ++ once = TRUE; ++ } ++ return; ++ } ++ ++ wined3d_cs_emit_fence(cs, &fence); ++ ++ /* A busy wait should be fine, we're not supposed to have to wait very ++ * long. */ ++ while (!InterlockedCompareExchange(&fence, TRUE, TRUE)); ++} ++ ++static void wined3d_cs_mt_finish_prio(struct wined3d_cs *cs) ++{ ++ BOOL fence; ++ ++ if (cs->thread_id == GetCurrentThreadId()) ++ { ++ static BOOL once; ++ if (!once) ++ { ++ FIXME("flush_and_wait called from cs thread\n"); ++ once = TRUE; ++ } ++ return; ++ } ++ ++ wined3d_cs_emit_fence_prio(cs, &fence); ++ ++ /* A busy wait should be fine, we're not supposed to have to wait very ++ * long. */ ++ while (!InterlockedCompareExchange(&fence, TRUE, TRUE)); ++} ++ ++static const struct wined3d_cs_ops wined3d_cs_mt_ops = + { + wined3d_cs_mt_require_space, + wined3d_cs_mt_require_space_prio, +@@ -3059,5 +3791,80 @@ + ERR("Closing event failed.\n"); + } + ++#else /* STAGING_CSMT */ ++}; ++ ++static void *wined3d_cs_st_require_space(struct wined3d_cs *cs, size_t size) ++{ ++ if (size > cs->data_size) ++ { ++ void *new_data; ++ ++ size = max( size, cs->data_size * 2 ); ++ if (!(new_data = HeapReAlloc(GetProcessHeap(), 0, cs->data, size))) ++ return NULL; ++ ++ cs->data_size = size; ++ cs->data = new_data; ++ } ++ ++ return cs->data; ++} ++ ++static void wined3d_cs_st_submit(struct wined3d_cs *cs) ++{ ++ enum wined3d_cs_op opcode = *(const enum wined3d_cs_op *)cs->data; ++ ++ wined3d_cs_op_handlers[opcode](cs, cs->data); ++} ++ ++static const struct wined3d_cs_ops wined3d_cs_st_ops = ++{ ++ wined3d_cs_st_require_space, ++ wined3d_cs_st_submit, ++}; ++ ++struct wined3d_cs *wined3d_cs_create(struct wined3d_device *device) ++{ ++ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; ++ struct wined3d_cs *cs; ++ ++ if (!(cs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*cs)))) ++ return NULL; ++ ++ if (!(cs->fb.render_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ++ sizeof(*cs->fb.render_targets) * gl_info->limits.buffers))) ++ { ++ HeapFree(GetProcessHeap(), 0, cs); ++ return NULL; ++ } ++ ++ if (FAILED(state_init(&cs->state, &cs->fb, gl_info, &device->adapter->d3d_info, ++ WINED3D_STATE_NO_REF | WINED3D_STATE_INIT_DEFAULT))) ++ { ++ HeapFree(GetProcessHeap(), 0, cs->fb.render_targets); ++ HeapFree(GetProcessHeap(), 0, cs); ++ return NULL; ++ } ++ ++ cs->ops = &wined3d_cs_st_ops; ++ cs->device = device; ++ ++ cs->data_size = WINED3D_INITIAL_CS_SIZE; ++ if (!(cs->data = HeapAlloc(GetProcessHeap(), 0, cs->data_size))) ++ { ++ HeapFree(GetProcessHeap(), 0, cs); ++ return NULL; ++ } ++ ++ return cs; ++} ++ ++void wined3d_cs_destroy(struct wined3d_cs *cs) ++{ ++ state_cleanup(&cs->state); ++ HeapFree(GetProcessHeap(), 0, cs->fb.render_targets); ++ HeapFree(GetProcessHeap(), 0, cs->data); ++#endif /* STAGING_CSMT */ + HeapFree(GetProcessHeap(), 0, cs); + } +diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c +--- a/dlls/wined3d/texture.c ++++ b/dlls/wined3d/texture.c +@@ -74,8 +74,10 @@ + { + ERR("Failed to allocate sub-resource array.\n"); + resource_cleanup(&texture->resource); ++#if defined(STAGING_CSMT) + if (wined3d_settings.cs_multithreaded) + texture->resource.device->cs->ops->finish(texture->resource.device->cs); ++#endif /* STAGING_CSMT */ + return E_OUTOFMEMORY; + } + +@@ -131,6 +133,7 @@ + resource_unload(&texture->resource); + } + ++#if defined(STAGING_CSMT) + void wined3d_texture_cleanup_cs(struct wined3d_texture *texture) + { + wined3d_texture_unload_gl_texture(texture); +@@ -143,6 +146,12 @@ + UINT sub_count = texture->level_count * texture->layer_count; + UINT i; + struct wined3d_device *device = texture->resource.device; ++#else /* STAGING_CSMT */ ++static void wined3d_texture_cleanup(struct wined3d_texture *texture) ++{ ++ UINT sub_count = texture->level_count * texture->layer_count; ++ UINT i; ++#endif /* STAGING_CSMT */ + + TRACE("texture %p.\n", texture); + +@@ -154,8 +163,14 @@ + texture->texture_ops->texture_sub_resource_cleanup(sub_resource); + } + ++#if defined(STAGING_CSMT) + resource_cleanup(&texture->resource); + wined3d_cs_emit_texture_cleanup(device->cs, texture); ++#else /* STAGING_CSMT */ ++ wined3d_texture_unload_gl_texture(texture); ++ HeapFree(GetProcessHeap(), 0, texture->sub_resources); ++ resource_cleanup(&texture->resource); ++#endif /* STAGING_CSMT */ + } + + void wined3d_texture_set_swapchain(struct wined3d_texture *texture, struct wined3d_swapchain *swapchain) +@@ -522,10 +537,16 @@ + + if (!refcount) + { ++#if defined(STAGING_CSMT) + void *parent = texture->resource.parent; + const struct wined3d_parent_ops *parent_ops = texture->resource.parent_ops; + wined3d_texture_cleanup(texture); + parent_ops->wined3d_object_destroyed(parent); ++#else /* STAGING_CSMT */ ++ wined3d_texture_cleanup(texture); ++ texture->resource.parent_ops->wined3d_object_destroyed(texture->resource.parent); ++ HeapFree(GetProcessHeap(), 0, texture); ++#endif /* STAGING_CSMT */ + } + + return refcount; +@@ -573,8 +594,15 @@ + + void CDECL wined3d_texture_preload(struct wined3d_texture *texture) + { ++#if defined(STAGING_CSMT) + const struct wined3d_device *device = texture->resource.device; + wined3d_cs_emit_texture_preload(device->cs, texture); ++#else /* STAGING_CSMT */ ++ struct wined3d_context *context; ++ context = context_acquire(texture->resource.device, NULL); ++ wined3d_texture_load(texture, context, texture->flags & WINED3D_TEXTURE_IS_SRGB); ++ context_release(context); ++#endif /* STAGING_CSMT */ + } + + void * CDECL wined3d_texture_get_parent(const struct wined3d_texture *texture) +@@ -603,6 +631,7 @@ + + if (texture->lod != lod) + { ++#if defined(STAGING_CSMT) + if (wined3d_settings.cs_multithreaded) + { + struct wined3d_device *device = texture->resource.device; +@@ -610,6 +639,7 @@ + device->cs->ops->finish(device->cs); + } + ++#endif /* STAGING_CSMT */ + texture->lod = lod; + + texture->texture_rgb.states[WINED3DTEXSTA_MAXMIPLEVEL] = ~0U; +@@ -669,12 +699,14 @@ + return WINED3DERR_INVALIDCALL; + } + ++#if defined(STAGING_CSMT) + if (wined3d_settings.cs_multithreaded) + { + FIXME("waiting for cs\n"); + texture->resource.device->cs->ops->finish(texture->resource.device->cs); + } + ++#endif /* STAGING_CSMT */ + if (color_key) + { + switch (flags & ~WINEDDCKEY_COLORSPACE) +@@ -762,10 +794,14 @@ + } + + if (device->d3d_initialized) ++#if defined(STAGING_CSMT) + { + wined3d_cs_emit_evict_resource(device->cs, &surface->resource); + device->cs->ops->finish(device->cs); + } ++#else /* STAGING_CSMT */ ++ texture->resource.resource_ops->resource_unload(&texture->resource); ++#endif /* STAGING_CSMT */ + + texture->resource.format = format; + texture->resource.multisample_type = multisample_type; +@@ -843,6 +879,7 @@ + static void texture2d_sub_resource_load(struct wined3d_resource *sub_resource, + struct wined3d_context *context, BOOL srgb) + { ++#if defined(STAGING_CSMT) + surface_load(surface_from_resource(sub_resource), context, srgb); + } + +@@ -857,6 +894,19 @@ + wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + context_release(context); + wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); ++#else /* STAGING_CSMT */ ++ surface_load(surface_from_resource(sub_resource), srgb); ++} ++ ++static void texture2d_sub_resource_add_dirty_region(struct wined3d_resource *sub_resource, ++ const struct wined3d_box *dirty_region) ++{ ++ struct wined3d_surface *surface = surface_from_resource(sub_resource); ++ ++ surface_prepare_map_memory(surface); ++ surface_load_location(surface, surface->resource.map_binding); ++ surface_invalidate_location(surface, ~surface->resource.map_binding); ++#endif /* STAGING_CSMT */ + } + + static void texture2d_sub_resource_cleanup(struct wined3d_resource *sub_resource) +@@ -868,7 +918,13 @@ + + static void texture2d_sub_resource_invalidate_location(struct wined3d_resource *sub_resource, DWORD location) + { ++#if defined(STAGING_CSMT) + wined3d_resource_invalidate_location(sub_resource, location); ++#else /* STAGING_CSMT */ ++ struct wined3d_surface *surface = surface_from_resource(sub_resource); ++ ++ surface_invalidate_location(surface, location); ++#endif /* STAGING_CSMT */ + } + + /* Context activation is done by the caller. */ +@@ -927,6 +983,7 @@ + + if (gl_info->supported[APPLE_CLIENT_STORAGE]) + { ++#if defined(STAGING_CSMT) + if (surface->flags & (SFLAG_NONPOW2) + || texture->flags & WINED3D_TEXTURE_CONVERTED) + { +@@ -935,12 +992,26 @@ + * WINED3D_TEXTURE_CONVERTED: The conversion destination memory is freed after loading the surface + * heap_memory == NULL: Not defined in the extension. Seems to disable client storage effectively + */ ++#else /* STAGING_CSMT */ ++ if (surface->flags & (SFLAG_NONPOW2 | SFLAG_DIBSECTION) ++ || texture->flags & WINED3D_TEXTURE_CONVERTED ++ || !surface->resource.heap_memory) ++ { ++ /* In some cases we want to disable client storage. ++ * SFLAG_NONPOW2 has a bigger opengl texture than the client memory, and different pitches ++ * SFLAG_DIBSECTION: Dibsections may have read / write protections on the memory. Avoid issues... ++ * WINED3D_TEXTURE_CONVERTED: The conversion destination memory is freed after loading the surface ++ * heap_memory == NULL: Not defined in the extension. Seems to disable client storage effectively ++ */ ++#endif /* STAGING_CSMT */ + surface->flags &= ~SFLAG_CLIENT; + } + else + { ++#if defined(STAGING_CSMT) + wined3d_resource_prepare_system_memory(&surface->resource); + ++#endif /* STAGING_CSMT */ + surface->flags |= SFLAG_CLIENT; + mem = surface->resource.heap_memory; + +@@ -1008,6 +1079,7 @@ + wined3d_texture_unload_gl_texture(texture); + } + ++#if defined(STAGING_CSMT) + static void wined3d_texture_load_location_invalidated(struct wined3d_resource *resource, DWORD location) + { + ERR("Should not be called on textures.\n"); +@@ -1027,6 +1099,13 @@ + wined3d_texture_unload, + wined3d_texture_load_location_invalidated, + wined3d_texture_load_location, ++#else /* STAGING_CSMT */ ++static const struct wined3d_resource_ops texture_resource_ops = ++{ ++ texture_resource_incref, ++ texture_resource_decref, ++ wined3d_texture_unload, ++#endif /* STAGING_CSMT */ + }; + + static HRESULT cubetexture_init(struct wined3d_texture *texture, const struct wined3d_resource_desc *desc, +@@ -1043,6 +1122,7 @@ + if (WINED3DFMT_UNKNOWN >= desc->format) + { + WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } +@@ -1051,6 +1131,14 @@ + { + WARN("(%p) : Tried to create not supported cube texture.\n", texture); + HeapFree(GetProcessHeap(), 0, texture); ++#else /* STAGING_CSMT */ ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ if (!gl_info->supported[ARB_TEXTURE_CUBE_MAP] && desc->pool != WINED3D_POOL_SCRATCH) ++ { ++ WARN("(%p) : Tried to create not supported cube texture.\n", texture); ++#endif /* STAGING_CSMT */ + return WINED3DERR_INVALIDCALL; + } + +@@ -1060,6 +1148,7 @@ + if (!gl_info->supported[SGIS_GENERATE_MIPMAP]) + { + WARN("No mipmap generation support, returning D3DERR_INVALIDCALL.\n"); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } +@@ -1068,6 +1157,14 @@ + { + WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL.\n"); + HeapFree(GetProcessHeap(), 0, texture); ++#else /* STAGING_CSMT */ ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ if (levels > 1) ++ { ++ WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL.\n"); ++#endif /* STAGING_CSMT */ + return WINED3DERR_INVALIDCALL; + } + +@@ -1095,7 +1192,9 @@ + else + { + WARN("Attempted to create a NPOT cube texture (edge length %u) without GL support.\n", desc->width); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, texture); ++#endif /* STAGING_CSMT */ + return WINED3DERR_INVALIDCALL; + } + } +@@ -1105,7 +1204,9 @@ + surface_flags, device, parent, parent_ops, &texture_resource_ops))) + { + WARN("Failed to initialize texture, returning %#x\n", hr); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, texture); ++#endif /* STAGING_CSMT */ + return hr; + } + +@@ -1168,7 +1269,9 @@ + if (WINED3DFMT_UNKNOWN >= desc->format) + { + WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, texture); ++#endif /* STAGING_CSMT */ + return WINED3DERR_INVALIDCALL; + } + +@@ -1199,7 +1302,9 @@ + else + { + WARN("Attempted to create a mipmapped NPOT texture without unconditional NPOT support.\n"); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, texture); ++#endif /* STAGING_CSMT */ + return WINED3DERR_INVALIDCALL; + } + } +@@ -1212,6 +1317,7 @@ + if (!gl_info->supported[SGIS_GENERATE_MIPMAP]) + { + WARN("No mipmap generation support, returning WINED3DERR_INVALIDCALL.\n"); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } +@@ -1220,6 +1326,14 @@ + { + WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning WINED3DERR_INVALIDCALL.\n"); + HeapFree(GetProcessHeap(), 0, texture); ++#else /* STAGING_CSMT */ ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ if (levels > 1) ++ { ++ WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning WINED3DERR_INVALIDCALL.\n"); ++#endif /* STAGING_CSMT */ + return WINED3DERR_INVALIDCALL; + } + +@@ -1235,7 +1349,9 @@ + surface_flags, device, parent, parent_ops, &texture_resource_ops))) + { + WARN("Failed to initialize texture, returning %#x.\n", hr); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, texture); ++#endif /* STAGING_CSMT */ + return hr; + } + +@@ -1333,7 +1449,13 @@ + + static void texture3d_sub_resource_invalidate_location(struct wined3d_resource *sub_resource, DWORD location) + { ++#if defined(STAGING_CSMT) + wined3d_resource_invalidate_location(sub_resource, location); ++#else /* STAGING_CSMT */ ++ struct wined3d_volume *volume = volume_from_resource(sub_resource); ++ ++ wined3d_volume_invalidate_location(volume, location); ++#endif /* STAGING_CSMT */ + } + + static void texture3d_prepare_texture(struct wined3d_texture *texture, struct wined3d_context *context, BOOL srgb) +@@ -1351,7 +1473,11 @@ + void *mem = NULL; + + if (gl_info->supported[APPLE_CLIENT_STORAGE] && !format->convert ++#if defined(STAGING_CSMT) + && wined3d_resource_prepare_system_memory(&volume->resource)) ++#else /* STAGING_CSMT */ ++ && volume_prepare_system_memory(volume)) ++#endif /* STAGING_CSMT */ + { + TRACE("Enabling GL_UNPACK_CLIENT_STORAGE_APPLE for volume %p\n", volume); + gl_info->gl_ops.gl.p_glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE); +@@ -1396,6 +1522,7 @@ + if (WINED3DFMT_UNKNOWN >= desc->format) + { + WARN("(%p) : Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n", texture); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } +@@ -1404,6 +1531,14 @@ + { + WARN("(%p) : Texture cannot be created - no volume texture support.\n", texture); + HeapFree(GetProcessHeap(), 0, texture); ++#else /* STAGING_CSMT */ ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ if (!gl_info->supported[EXT_TEXTURE3D]) ++ { ++ WARN("(%p) : Texture cannot be created - no volume texture support.\n", texture); ++#endif /* STAGING_CSMT */ + return WINED3DERR_INVALIDCALL; + } + +@@ -1413,6 +1548,7 @@ + if (!gl_info->supported[SGIS_GENERATE_MIPMAP]) + { + WARN("No mipmap generation support, returning D3DERR_INVALIDCALL.\n"); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, texture); + return WINED3DERR_INVALIDCALL; + } +@@ -1421,6 +1557,14 @@ + { + WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL.\n"); + HeapFree(GetProcessHeap(), 0, texture); ++#else /* STAGING_CSMT */ ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ if (levels > 1) ++ { ++ WARN("D3DUSAGE_AUTOGENMIPMAP is set, and level count > 1, returning D3DERR_INVALIDCALL.\n"); ++#endif /* STAGING_CSMT */ + return WINED3DERR_INVALIDCALL; + } + +@@ -1455,7 +1599,9 @@ + { + WARN("Attempted to create a NPOT volume texture (%u, %u, %u) without GL support.\n", + desc->width, desc->height, desc->depth); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, texture); ++#endif /* STAGING_CSMT */ + return WINED3DERR_INVALIDCALL; + } + } +@@ -1465,7 +1611,9 @@ + 0, device, parent, parent_ops, &texture_resource_ops))) + { + WARN("Failed to initialize texture, returning %#x.\n", hr); ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, texture); ++#endif /* STAGING_CSMT */ + return hr; + } + +@@ -1536,6 +1684,9 @@ + if (FAILED(hr)) + { + WARN("Failed to initialize texture, returning %#x.\n", hr); ++#if !defined(STAGING_CSMT) ++ HeapFree(GetProcessHeap(), 0, object); ++#endif /* STAGING_CSMT */ + return hr; + } + +diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c +--- a/dlls/wined3d/surface.c ++++ b/dlls/wined3d/surface.c +@@ -36,6 +36,7 @@ + + #define MAXLOCKCOUNT 50 /* After this amount of locks do not free the sysmem copy. */ + ++#if defined(STAGING_CSMT) + + static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT *dst_rect, + struct wined3d_surface *src_surface, const RECT *src_rect, DWORD flags, +@@ -44,6 +45,20 @@ + void wined3d_surface_cleanup_cs(struct wined3d_surface *surface) + { + if (surface->rb_multisample || surface->rb_resolved || !list_empty(&surface->renderbuffers)) ++#else /* STAGING_CSMT */ ++static const DWORD surface_simple_locations = ++ WINED3D_LOCATION_SYSMEM | WINED3D_LOCATION_USER_MEMORY ++ | WINED3D_LOCATION_DIB | WINED3D_LOCATION_BUFFER; ++ ++static void surface_cleanup(struct wined3d_surface *surface) ++{ ++ struct wined3d_surface *overlay, *cur; ++ ++ TRACE("surface %p.\n", surface); ++ ++ if (surface->pbo || surface->rb_multisample ++ || surface->rb_resolved || !list_empty(&surface->renderbuffers)) ++#endif /* STAGING_CSMT */ + { + struct wined3d_renderbuffer_entry *entry, *entry2; + const struct wined3d_gl_info *gl_info; +@@ -52,6 +67,14 @@ + context = context_acquire(surface->resource.device, NULL); + gl_info = context->gl_info; + ++#if !defined(STAGING_CSMT) ++ if (surface->pbo) ++ { ++ TRACE("Deleting PBO %u.\n", surface->pbo); ++ GL_EXTCALL(glDeleteBuffersARB(1, &surface->pbo)); ++ } ++ ++#endif /* STAGING_CSMT */ + if (surface->rb_multisample) + { + TRACE("Deleting multisample renderbuffer %u.\n", surface->rb_multisample); +@@ -78,6 +101,7 @@ + { + DeleteDC(surface->hDC); + DeleteObject(surface->dib.DIBsection); ++#if defined(STAGING_CSMT) + surface->resource.bitmap_data = NULL; + } + +@@ -92,6 +116,10 @@ + BOOL user_mem = surface->resource.map_binding == WINED3D_LOCATION_USER_MEMORY; + + TRACE("surface %p.\n", surface); ++#else /* STAGING_CSMT */ ++ surface->dib.bitmap_data = NULL; ++ } ++#endif /* STAGING_CSMT */ + + if (surface->overlay_dest) + list_remove(&surface->overlay_entry); +@@ -103,6 +131,7 @@ + } + + resource_cleanup(&surface->resource); ++#if defined(STAGING_CSMT) + wined3d_cs_emit_surface_cleanup(cs, surface); + + /* Wait for the CS to finish operations on this surface when user memory was in use. +@@ -118,6 +147,17 @@ + + surface->resource.parent_ops->wined3d_object_destroyed(surface->resource.parent); + surface_cleanup(surface); ++#else /* STAGING_CSMT */ ++} ++ ++void wined3d_surface_destroy(struct wined3d_surface *surface) ++{ ++ TRACE("surface %p.\n", surface); ++ ++ surface_cleanup(surface); ++ surface->resource.parent_ops->wined3d_object_destroyed(surface->resource.parent); ++ HeapFree(GetProcessHeap(), 0, surface); ++#endif /* STAGING_CSMT */ + } + + void surface_get_drawable_size(const struct wined3d_surface *surface, const struct wined3d_context *context, +@@ -464,7 +504,11 @@ + TRACE("Creating a DIB section with size %dx%dx%d, size=%d.\n", + b_info->bmiHeader.biWidth, b_info->bmiHeader.biHeight, + b_info->bmiHeader.biBitCount, b_info->bmiHeader.biSizeImage); ++#if defined(STAGING_CSMT) + surface->dib.DIBsection = CreateDIBSection(0, b_info, DIB_RGB_COLORS, &surface->resource.bitmap_data, 0, 0); ++#else /* STAGING_CSMT */ ++ surface->dib.DIBsection = CreateDIBSection(0, b_info, DIB_RGB_COLORS, &surface->dib.bitmap_data, 0, 0); ++#endif /* STAGING_CSMT */ + + if (!surface->dib.DIBsection) + { +@@ -473,7 +517,11 @@ + return HRESULT_FROM_WIN32(GetLastError()); + } + ++#if defined(STAGING_CSMT) + TRACE("DIBSection at %p.\n", surface->resource.bitmap_data); ++#else /* STAGING_CSMT */ ++ TRACE("DIBSection at %p.\n", surface->dib.bitmap_data); ++#endif /* STAGING_CSMT */ + surface->dib.bitmap_size = b_info->bmiHeader.biSizeImage; + + HeapFree(GetProcessHeap(), 0, b_info); +@@ -487,6 +535,116 @@ + return WINED3D_OK; + } + ++#if !defined(STAGING_CSMT) ++static void surface_get_memory(const struct wined3d_surface *surface, struct wined3d_bo_address *data, ++ DWORD location) ++{ ++ if (location & WINED3D_LOCATION_BUFFER) ++ { ++ data->addr = NULL; ++ data->buffer_object = surface->pbo; ++ return; ++ } ++ if (location & WINED3D_LOCATION_USER_MEMORY) ++ { ++ data->addr = surface->user_memory; ++ data->buffer_object = 0; ++ return; ++ } ++ if (location & WINED3D_LOCATION_DIB) ++ { ++ data->addr = surface->dib.bitmap_data; ++ data->buffer_object = 0; ++ return; ++ } ++ if (location & WINED3D_LOCATION_SYSMEM) ++ { ++ data->addr = surface->resource.heap_memory; ++ data->buffer_object = 0; ++ return; ++ } ++ ++ ERR("Unexpected locations %s.\n", wined3d_debug_location(location)); ++ data->addr = NULL; ++ data->buffer_object = 0; ++} ++ ++static void surface_prepare_buffer(struct wined3d_surface *surface) ++{ ++ struct wined3d_context *context; ++ GLenum error; ++ const struct wined3d_gl_info *gl_info; ++ ++ if (surface->pbo) ++ return; ++ ++ context = context_acquire(surface->resource.device, NULL); ++ gl_info = context->gl_info; ++ ++ GL_EXTCALL(glGenBuffersARB(1, &surface->pbo)); ++ error = gl_info->gl_ops.gl.p_glGetError(); ++ if (!surface->pbo || error != GL_NO_ERROR) ++ ERR("Failed to create a PBO with error %s (%#x).\n", debug_glerror(error), error); ++ ++ TRACE("Binding PBO %u.\n", surface->pbo); ++ ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->pbo)); ++ checkGLcall("glBindBufferARB"); ++ ++ GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->resource.size + 4, ++ NULL, GL_STREAM_DRAW_ARB)); ++ checkGLcall("glBufferDataARB"); ++ ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); ++ checkGLcall("glBindBufferARB"); ++ ++ context_release(context); ++} ++ ++static void surface_prepare_system_memory(struct wined3d_surface *surface) ++{ ++ TRACE("surface %p.\n", surface); ++ ++ if (surface->resource.heap_memory) ++ return; ++ ++ /* Whatever surface we have, make sure that there is memory allocated ++ * for the downloaded copy, or a PBO to map. */ ++ if (!wined3d_resource_allocate_sysmem(&surface->resource)) ++ ERR("Failed to allocate system memory.\n"); ++ ++ if (surface->locations & WINED3D_LOCATION_SYSMEM) ++ ERR("Surface without system memory has WINED3D_LOCATION_SYSMEM set.\n"); ++} ++ ++void surface_prepare_map_memory(struct wined3d_surface *surface) ++{ ++ switch (surface->resource.map_binding) ++ { ++ case WINED3D_LOCATION_SYSMEM: ++ surface_prepare_system_memory(surface); ++ break; ++ ++ case WINED3D_LOCATION_USER_MEMORY: ++ if (!surface->user_memory) ++ ERR("Map binding is set to WINED3D_LOCATION_USER_MEMORY but surface->user_memory is NULL.\n"); ++ break; ++ ++ case WINED3D_LOCATION_DIB: ++ if (!surface->dib.bitmap_data) ++ ERR("Map binding is set to WINED3D_LOCATION_DIB but surface->dib.bitmap_data is NULL.\n"); ++ break; ++ ++ case WINED3D_LOCATION_BUFFER: ++ surface_prepare_buffer(surface); ++ break; ++ ++ default: ++ ERR("Unexpected map binding %s.\n", wined3d_debug_location(surface->resource.map_binding)); ++ } ++} ++ ++#endif /* STAGING_CSMT */ + static void surface_evict_sysmem(struct wined3d_surface *surface) + { + /* In some conditions the surface memory must not be freed: +@@ -499,8 +657,34 @@ + return; + + wined3d_resource_free_sysmem(&surface->resource); ++#if defined(STAGING_CSMT) + surface->resource.map_heap_memory = NULL; + wined3d_resource_invalidate_location(&surface->resource, WINED3D_LOCATION_SYSMEM); ++#else /* STAGING_CSMT */ ++ surface_invalidate_location(surface, WINED3D_LOCATION_SYSMEM); ++} ++ ++static void surface_release_client_storage(struct wined3d_surface *surface) ++{ ++ struct wined3d_context *context = context_acquire(surface->resource.device, NULL); ++ const struct wined3d_gl_info *gl_info = context->gl_info; ++ ++ if (surface->container->texture_rgb.name) ++ { ++ wined3d_texture_bind_and_dirtify(surface->container, context, FALSE); ++ gl_info->gl_ops.gl.p_glTexImage2D(surface->texture_target, surface->texture_level, ++ GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); ++ } ++ if (surface->container->texture_srgb.name) ++ { ++ wined3d_texture_bind_and_dirtify(surface->container, context, TRUE); ++ gl_info->gl_ops.gl.p_glTexImage2D(surface->texture_target, surface->texture_level, ++ GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); ++ } ++ wined3d_texture_force_reload(surface->container); ++ ++ context_release(context); ++#endif /* STAGING_CSMT */ + } + + static BOOL surface_use_pbo(const struct wined3d_surface *surface) +@@ -585,7 +769,11 @@ + } + + if (surface->resource.usage & WINED3DUSAGE_DEPTHSTENCIL) ++#if defined(STAGING_CSMT) + surface->resource.locations = WINED3D_LOCATION_DISCARDED; ++#else /* STAGING_CSMT */ ++ surface->locations = WINED3D_LOCATION_DISCARDED; ++#endif /* STAGING_CSMT */ + + if (surface_use_pbo(surface)) + surface->resource.map_binding = WINED3D_LOCATION_BUFFER; +@@ -593,6 +781,7 @@ + return WINED3D_OK; + } + ++#if defined(STAGING_CSMT) + static void surface_frontbuffer_updated(struct wined3d_surface *surface) + { + struct wined3d_context *context = NULL; +@@ -609,6 +798,50 @@ + wined3d_resource_load_location(&surface->resource, context, surface->container->resource.draw_binding); + if (context) + context_release(context); ++#else /* STAGING_CSMT */ ++static void surface_unmap(struct wined3d_surface *surface) ++{ ++ struct wined3d_device *device = surface->resource.device; ++ const struct wined3d_gl_info *gl_info; ++ struct wined3d_context *context; ++ ++ TRACE("surface %p.\n", surface); ++ ++ memset(&surface->lockedRect, 0, sizeof(surface->lockedRect)); ++ ++ switch (surface->resource.map_binding) ++ { ++ case WINED3D_LOCATION_SYSMEM: ++ case WINED3D_LOCATION_USER_MEMORY: ++ case WINED3D_LOCATION_DIB: ++ break; ++ ++ case WINED3D_LOCATION_BUFFER: ++ context = context_acquire(device, NULL); ++ gl_info = context->gl_info; ++ ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->pbo)); ++ GL_EXTCALL(glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); ++ checkGLcall("glUnmapBufferARB"); ++ context_release(context); ++ break; ++ ++ default: ++ ERR("Unexpected map binding %s.\n", wined3d_debug_location(surface->resource.map_binding)); ++ } ++ ++ if (surface->locations & (WINED3D_LOCATION_DRAWABLE | WINED3D_LOCATION_TEXTURE_RGB)) ++ { ++ TRACE("Not dirtified, nothing to do.\n"); ++ return; ++ } ++ ++ if (surface->container->swapchain && surface->container->swapchain->front_buffer == surface->container) ++ surface_load_location(surface, surface->container->resource.draw_binding); ++ else if (surface->resource.format->flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) ++ FIXME("Depth / stencil buffer locking is not implemented.\n"); ++#endif /* STAGING_CSMT */ + } + + static BOOL surface_is_full_rect(const struct wined3d_surface *surface, const RECT *r) +@@ -659,6 +892,14 @@ + if (src_mask & WINED3DFMT_FLAG_STENCIL) + gl_mask |= GL_STENCIL_BUFFER_BIT; + ++#if !defined(STAGING_CSMT) ++ /* Make sure the locations are up-to-date. Loading the destination ++ * surface isn't required if the entire surface is overwritten. */ ++ surface_load_location(src_surface, src_location); ++ if (!surface_is_full_rect(dst_surface, dst_rect)) ++ surface_load_location(dst_surface, dst_location); ++ ++#endif /* STAGING_CSMT */ + context = context_acquire(device, NULL); + if (!context->valid) + { +@@ -667,12 +908,14 @@ + return; + } + ++#if defined(STAGING_CSMT) + /* Make sure the locations are up-to-date. Loading the destination + * surface isn't required if the entire surface is overwritten. */ + wined3d_resource_load_location(&src_surface->resource, context, src_location); + if (!surface_is_full_rect(dst_surface, dst_rect)) + wined3d_resource_load_location(&dst_surface->resource, context, dst_location); + ++#endif /* STAGING_CSMT */ + gl_info = context->gl_info; + + context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, NULL, src_surface, src_location); +@@ -712,6 +955,7 @@ + context_release(context); + } + ++#if defined(STAGING_CSMT) + /* Blit between surface locations. Onscreen on different swapchains is not supported. + * Depth / stencil is not supported. Context activation is done by the caller. */ + static void surface_blt_fbo(const struct wined3d_device *device, +@@ -722,6 +966,16 @@ + const struct wined3d_gl_info *gl_info; + struct wined3d_context *context; + struct wined3d_surface *required_rt, *restore_rt; ++#else /* STAGING_CSMT */ ++/* Blit between surface locations. Onscreen on different swapchains is not supported. ++ * Depth / stencil is not supported. */ ++static void surface_blt_fbo(const struct wined3d_device *device, enum wined3d_texture_filter_type filter, ++ struct wined3d_surface *src_surface, DWORD src_location, const RECT *src_rect_in, ++ struct wined3d_surface *dst_surface, DWORD dst_location, const RECT *dst_rect_in) ++{ ++ const struct wined3d_gl_info *gl_info; ++ struct wined3d_context *context; ++#endif /* STAGING_CSMT */ + RECT src_rect, dst_rect; + GLenum gl_filter; + GLenum buffer; +@@ -760,6 +1014,7 @@ + * surface isn't required if the entire surface is overwritten. (And is + * in fact harmful if we're being called by surface_load_location() with + * the purpose of loading the destination surface.) */ ++#if defined(STAGING_CSMT) + wined3d_resource_load_location(&src_surface->resource, old_ctx, src_location); + if (!surface_is_full_rect(dst_surface, &dst_rect)) + wined3d_resource_load_location(&dst_surface->resource, old_ctx, dst_location); +@@ -778,6 +1033,15 @@ + restore_rt = NULL; + context = old_ctx; + } ++#else /* STAGING_CSMT */ ++ surface_load_location(src_surface, src_location); ++ if (!surface_is_full_rect(dst_surface, &dst_rect)) ++ surface_load_location(dst_surface, dst_location); ++ ++ if (src_location == WINED3D_LOCATION_DRAWABLE) context = context_acquire(device, src_surface); ++ else if (dst_location == WINED3D_LOCATION_DRAWABLE) context = context_acquire(device, dst_surface); ++ else context = context_acquire(device, NULL); ++#endif /* STAGING_CSMT */ + + if (!context->valid) + { +@@ -840,12 +1104,16 @@ + && dst_surface->container->swapchain->front_buffer == dst_surface->container)) + gl_info->gl_ops.gl.p_glFlush(); + ++#if defined(STAGING_CSMT) + if (restore_rt) + { + context_release(context); + context = context_acquire(device, restore_rt); + context_release(context); + } ++#else /* STAGING_CSMT */ ++ context_release(context); ++#endif /* STAGING_CSMT */ + } + + static BOOL fbo_blit_supported(const struct wined3d_gl_info *gl_info, enum wined3d_blit_op blit_op, +@@ -1022,6 +1290,18 @@ + return wined3d_surface_blt(surface, NULL, render_target, NULL, 0, NULL, WINED3D_TEXF_POINT); + } + ++#if !defined(STAGING_CSMT) ++/* Context activation is done by the caller. */ ++static void surface_remove_pbo(struct wined3d_surface *surface, const struct wined3d_gl_info *gl_info) ++{ ++ GL_EXTCALL(glDeleteBuffersARB(1, &surface->pbo)); ++ checkGLcall("glDeleteBuffersARB(1, &surface->pbo)"); ++ ++ surface->pbo = 0; ++ surface_invalidate_location(surface, WINED3D_LOCATION_BUFFER); ++} ++ ++#endif /* STAGING_CSMT */ + static ULONG surface_resource_incref(struct wined3d_resource *resource) + { + return wined3d_surface_incref(surface_from_resource(resource)); +@@ -1042,6 +1322,7 @@ + + TRACE("surface %p.\n", surface); + ++#if defined(STAGING_CSMT) + context = context_acquire(device, NULL); + gl_info = context->gl_info; + +@@ -1053,6 +1334,23 @@ + * opengl resources, so we cannot leave early. */ + wined3d_resource_validate_location(&surface->resource, WINED3D_LOCATION_DISCARDED); + wined3d_resource_invalidate_location(&surface->resource, ~WINED3D_LOCATION_DISCARDED); ++#else /* STAGING_CSMT */ ++ if (resource->pool == WINED3D_POOL_DEFAULT) ++ { ++ /* Default pool resources are supposed to be destroyed before Reset is called. ++ * Implicit resources stay however. So this means we have an implicit render target ++ * or depth stencil. The content may be destroyed, but we still have to tear down ++ * opengl resources, so we cannot leave early. ++ * ++ * Put the surfaces into sysmem, and reset the content. The D3D content is undefined, ++ * but we can't set the sysmem INDRAWABLE because when we're rendering the swapchain ++ * or the depth stencil into an FBO the texture or render buffer will be removed ++ * and all flags get lost */ ++ surface_prepare_system_memory(surface); ++ memset(surface->resource.heap_memory, 0, surface->resource.size); ++ surface_validate_location(surface, WINED3D_LOCATION_SYSMEM); ++ surface_invalidate_location(surface, ~WINED3D_LOCATION_SYSMEM); ++#endif /* STAGING_CSMT */ + + /* We also get here when the ddraw swapchain is destroyed, for example + * for a mode switch. In this case this surface won't necessarily be +@@ -1062,10 +1360,24 @@ + } + else + { ++#if defined(STAGING_CSMT) + wined3d_resource_prepare_map_memory(&surface->resource, context); + wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); + } ++#else /* STAGING_CSMT */ ++ surface_prepare_map_memory(surface); ++ surface_load_location(surface, surface->resource.map_binding); ++ surface_invalidate_location(surface, ~surface->resource.map_binding); ++ } ++ ++ context = context_acquire(device, NULL); ++ gl_info = context->gl_info; ++ ++ /* Destroy PBOs, but load them into real sysmem before */ ++ if (surface->pbo) ++ surface_remove_pbo(surface, gl_info); ++#endif /* STAGING_CSMT */ + + /* Destroy fbo render buffers. This is needed for implicit render targets, for + * all application-created targets the application has to release the surface +@@ -1096,6 +1408,7 @@ + resource_unload(resource); + } + ++#if defined(STAGING_CSMT) + static void wined3d_surface_location_invalidated(struct wined3d_resource *resource, DWORD location) + { + struct wined3d_surface *surface = surface_from_resource(resource); +@@ -1111,6 +1424,19 @@ + { + surface_private_setup, + surface_frontbuffer_updated, ++#else /* STAGING_CSMT */ ++static const struct wined3d_resource_ops surface_resource_ops = ++{ ++ surface_resource_incref, ++ surface_resource_decref, ++ surface_unload, ++}; ++ ++static const struct wined3d_surface_ops surface_ops = ++{ ++ surface_private_setup, ++ surface_unmap, ++#endif /* STAGING_CSMT */ + }; + + /***************************************************************************** +@@ -1154,6 +1480,7 @@ + return WINED3D_OK; + } + ++#if defined(STAGING_CSMT) + static void gdi_surface_frontbuffer_updated(struct wined3d_surface *surface) + { + x11_copy_to_screen(surface->container->swapchain, &surface->lockedRect); +@@ -1163,6 +1490,23 @@ + { + gdi_surface_private_setup, + gdi_surface_frontbuffer_updated, ++#else /* STAGING_CSMT */ ++static void gdi_surface_unmap(struct wined3d_surface *surface) ++{ ++ TRACE("surface %p.\n", surface); ++ ++ /* Tell the swapchain to update the screen. */ ++ if (surface->container->swapchain && surface->container == surface->container->swapchain->front_buffer) ++ x11_copy_to_screen(surface->container->swapchain, &surface->lockedRect); ++ ++ memset(&surface->lockedRect, 0, sizeof(RECT)); ++} ++ ++static const struct wined3d_surface_ops gdi_surface_ops = ++{ ++ gdi_surface_private_setup, ++ gdi_surface_unmap, ++#endif /* STAGING_CSMT */ + }; + + /* This call just downloads data, the caller is responsible for binding the +@@ -1181,7 +1525,11 @@ + return; + } + ++#if defined(STAGING_CSMT) + wined3d_resource_get_memory(&surface->resource, dst_location, &data); ++#else /* STAGING_CSMT */ ++ surface_get_memory(surface, &data, dst_location); ++#endif /* STAGING_CSMT */ + + if (format->flags & WINED3DFMT_FLAG_COMPRESSED) + { +@@ -1430,6 +1778,7 @@ + } + } + ++#if defined(STAGING_CSMT) + BOOL surface_check_block_align(struct wined3d_surface *surface, const RECT *rect) + { + struct wined3d_box box; +@@ -1444,6 +1793,27 @@ + box.bottom = rect->bottom; + box.back = 1; + return wined3d_resource_check_block_align(&surface->resource, &box); ++#else /* STAGING_CSMT */ ++static BOOL surface_check_block_align(struct wined3d_surface *surface, const RECT *rect) ++{ ++ UINT width_mask, height_mask; ++ ++ if (!rect->left && !rect->top ++ && rect->right == surface->resource.width ++ && rect->bottom == surface->resource.height) ++ return TRUE; ++ ++ /* This assumes power of two block sizes, but NPOT block sizes would be ++ * silly anyway. */ ++ width_mask = surface->resource.format->block_width - 1; ++ height_mask = surface->resource.format->block_height - 1; ++ ++ if (!(rect->left & width_mask) && !(rect->top & height_mask) ++ && !(rect->right & width_mask) && !(rect->bottom & height_mask)) ++ return TRUE; ++ ++ return FALSE; ++#endif /* STAGING_CSMT */ + } + + HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const POINT *dst_point, +@@ -1526,11 +1896,17 @@ + return WINED3DERR_INVALIDCALL; + } + ++#if defined(STAGING_CSMT) + /* Use surface_cpu_blt() instead of uploading directly if we need + * conversion. Avoid calling wined3d_surface_blt() since that goes + * through the CS. */ + if (dst_format->convert || wined3d_format_get_color_key_conversion(dst_surface->container, FALSE)) + return surface_cpu_blt(dst_surface, &dst_rect, src_surface, src_rect, 0, NULL, WINED3D_TEXF_POINT); ++#else /* STAGING_CSMT */ ++ /* Use wined3d_surface_blt() instead of uploading directly if we need conversion. */ ++ if (dst_format->convert || wined3d_format_get_color_key_conversion(dst_surface->container, FALSE)) ++ return wined3d_surface_blt(dst_surface, &dst_rect, src_surface, src_rect, 0, NULL, WINED3D_TEXF_POINT); ++#endif /* STAGING_CSMT */ + + context = context_acquire(dst_surface->resource.device, NULL); + gl_info = context->gl_info; +@@ -1541,10 +1917,17 @@ + if (update_w == dst_w && update_h == dst_h) + wined3d_texture_prepare_texture(dst_surface->container, context, FALSE); + else ++#if defined(STAGING_CSMT) + wined3d_resource_load_location(&dst_surface->resource, context, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_texture_bind(dst_surface->container, context, FALSE); + + wined3d_resource_get_memory(&src_surface->resource, src_surface->resource.locations, &data); ++#else /* STAGING_CSMT */ ++ surface_load_location(dst_surface, WINED3D_LOCATION_TEXTURE_RGB); ++ wined3d_texture_bind(dst_surface->container, context, FALSE); ++ ++ surface_get_memory(src_surface, &data, src_surface->locations); ++#endif /* STAGING_CSMT */ + wined3d_resource_get_pitch(&src_surface->resource, &src_row_pitch, &src_slice_pitch); + + surface_upload_data(dst_surface, gl_info, src_format, src_rect, src_row_pitch, dst_point, FALSE, &data); +@@ -1553,8 +1936,13 @@ + + context_release(context); + ++#if defined(STAGING_CSMT) + wined3d_resource_validate_location(&dst_surface->resource, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_resource_invalidate_location(&dst_surface->resource, ~WINED3D_LOCATION_TEXTURE_RGB); ++#else /* STAGING_CSMT */ ++ surface_validate_location(dst_surface, WINED3D_LOCATION_TEXTURE_RGB); ++ surface_invalidate_location(dst_surface, ~WINED3D_LOCATION_TEXTURE_RGB); ++#endif /* STAGING_CSMT */ + + return WINED3D_OK; + } +@@ -1658,8 +2046,12 @@ + return GL_BACK; + } + ++#if defined(STAGING_CSMT) + /* Context activation is done by the caller. */ + void surface_load(struct wined3d_surface *surface, struct wined3d_context *context, BOOL srgb) ++#else /* STAGING_CSMT */ ++void surface_load(struct wined3d_surface *surface, BOOL srgb) ++#endif /* STAGING_CSMT */ + { + DWORD location = srgb ? WINED3D_LOCATION_TEXTURE_SRGB : WINED3D_LOCATION_TEXTURE_RGB; + BOOL ck_changed; +@@ -1683,6 +2075,7 @@ + /* To perform the color key conversion we need a sysmem copy of + * the surface. Make sure we have it. */ + ++#if defined(STAGING_CSMT) + wined3d_resource_prepare_map_memory(&surface->resource, context); + wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + wined3d_resource_invalidate_location(&surface->resource, ~surface->resource.map_binding); +@@ -1691,6 +2084,16 @@ + wined3d_texture_force_reload(surface->container); + } + else if (!(surface->resource.locations & location)) ++#else /* STAGING_CSMT */ ++ surface_prepare_map_memory(surface); ++ surface_load_location(surface, surface->resource.map_binding); ++ surface_invalidate_location(surface, ~surface->resource.map_binding); ++ /* Switching color keying on / off may change the internal format. */ ++ if (ck_changed) ++ wined3d_texture_force_reload(surface->container); ++ } ++ else if (!(surface->locations & location)) ++#endif /* STAGING_CSMT */ + { + TRACE("Reloading because surface is dirty.\n"); + } +@@ -1700,7 +2103,11 @@ + return; + } + ++#if defined(STAGING_CSMT) + wined3d_resource_load_location(&surface->resource, context, location); ++#else /* STAGING_CSMT */ ++ surface_load_location(surface, location); ++#endif /* STAGING_CSMT */ + surface_evict_sysmem(surface); + } + +@@ -1783,6 +2190,7 @@ + + void CDECL wined3d_surface_preload(struct wined3d_surface *surface) + { ++#if defined(STAGING_CSMT) + const struct wined3d_device *device = surface->resource.device; + TRACE("surface %p.\n", surface); + +@@ -1793,6 +2201,17 @@ + } + + wined3d_cs_emit_surface_preload(device->cs, surface); ++#else /* STAGING_CSMT */ ++ TRACE("surface %p.\n", surface); ++ ++ if (!surface->resource.device->d3d_initialized) ++ { ++ ERR("D3D not initialized.\n"); ++ return; ++ } ++ ++ wined3d_texture_preload(surface->container); ++#endif /* STAGING_CSMT */ + } + + void * CDECL wined3d_surface_get_parent(const struct wined3d_surface *surface) +@@ -2000,6 +2419,7 @@ + { + DeleteDC(surface->hDC); + DeleteObject(surface->dib.DIBsection); ++#if defined(STAGING_CSMT) + surface->resource.bitmap_data = NULL; + surface->flags &= ~SFLAG_DIBSECTION; + create_dib = TRUE; +@@ -2008,6 +2428,15 @@ + surface->resource.locations = 0; + wined3d_resource_free_sysmem(&surface->resource); + surface->resource.map_heap_memory = NULL; ++#else /* STAGING_CSMT */ ++ surface->dib.bitmap_data = NULL; ++ surface->flags &= ~SFLAG_DIBSECTION; ++ create_dib = TRUE; ++ } ++ ++ surface->locations = 0; ++ wined3d_resource_free_sysmem(&surface->resource); ++#endif /* STAGING_CSMT */ + + width = texture_resource->width; + height = texture_resource->height; +@@ -2033,7 +2462,11 @@ + else + surface->flags &= ~SFLAG_NONPOW2; + ++#if defined(STAGING_CSMT) + if ((surface->resource.user_memory = mem)) ++#else /* STAGING_CSMT */ ++ if ((surface->user_memory = mem)) ++#endif /* STAGING_CSMT */ + { + surface->resource.map_binding = WINED3D_LOCATION_USER_MEMORY; + valid_location = WINED3D_LOCATION_USER_MEMORY; +@@ -2069,11 +2502,19 @@ + + if (!valid_location) + { ++#if defined(STAGING_CSMT) + wined3d_resource_prepare_system_memory(&surface->resource); + valid_location = WINED3D_LOCATION_SYSMEM; + } + + wined3d_resource_validate_location(&surface->resource, valid_location); ++#else /* STAGING_CSMT */ ++ surface_prepare_system_memory(surface); ++ valid_location = WINED3D_LOCATION_SYSMEM; ++ } ++ ++ surface_validate_location(surface, valid_location); ++#endif /* STAGING_CSMT */ + + return WINED3D_OK; + } +@@ -2423,6 +2864,7 @@ + + static struct wined3d_texture *surface_convert_format(struct wined3d_surface *source, enum wined3d_format_id to_fmt) + { ++#if defined(STAGING_CSMT) + void *dst_data = NULL, *src_data = NULL; + UINT src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch; + const struct d3dfmt_converter_desc *conv; +@@ -2431,6 +2873,13 @@ + struct wined3d_surface *dst; + struct wined3d_context *context = NULL; + struct wined3d_device *device = source->resource.device; ++#else /* STAGING_CSMT */ ++ struct wined3d_map_desc src_map, dst_map; ++ const struct d3dfmt_converter_desc *conv; ++ struct wined3d_texture *ret = NULL; ++ struct wined3d_resource_desc desc; ++ struct wined3d_surface *dst; ++#endif /* STAGING_CSMT */ + + conv = find_converter(source->resource.format->id, to_fmt); + if (!conv) +@@ -2454,6 +2903,7 @@ + } + dst = surface_from_resource(wined3d_texture_get_sub_resource(ret, 0)); + ++#if defined(STAGING_CSMT) + wined3d_resource_get_pitch(&source->resource, &src_row_pitch, &src_slice_pitch); + wined3d_resource_get_pitch(&ret->resource, &dst_row_pitch, &dst_slice_pitch); + +@@ -2494,6 +2944,32 @@ + if (context) + context_release(context); + return NULL; ++#else /* STAGING_CSMT */ ++ memset(&src_map, 0, sizeof(src_map)); ++ memset(&dst_map, 0, sizeof(dst_map)); ++ ++ if (FAILED(wined3d_surface_map(source, &src_map, NULL, WINED3D_MAP_READONLY))) ++ { ++ ERR("Failed to lock the source surface.\n"); ++ wined3d_texture_decref(ret); ++ return NULL; ++ } ++ if (FAILED(wined3d_surface_map(dst, &dst_map, NULL, 0))) ++ { ++ ERR("Failed to lock the destination surface.\n"); ++ wined3d_surface_unmap(source); ++ wined3d_texture_decref(ret); ++ return NULL; ++ } ++ ++ conv->convert(src_map.data, dst_map.data, src_map.row_pitch, dst_map.row_pitch, ++ source->resource.width, source->resource.height); ++ ++ wined3d_surface_unmap(dst); ++ wined3d_surface_unmap(source); ++ ++ return ret; ++#endif /* STAGING_CSMT */ + } + + static HRESULT _Blt_ColorFill(BYTE *buf, unsigned int width, unsigned int height, +@@ -2561,6 +3037,7 @@ + + HRESULT CDECL wined3d_surface_unmap(struct wined3d_surface *surface) + { ++#if defined(STAGING_CSMT) + HRESULT hr; + TRACE("surface %p.\n", surface); + +@@ -2578,6 +3055,39 @@ + { + struct wined3d_box box; + const struct wined3d_format *format = surface->resource.format; ++#else /* STAGING_CSMT */ ++ TRACE("surface %p.\n", surface); ++ ++ if (!surface->resource.map_count) ++ { ++ WARN("Trying to unmap unmapped surface.\n"); ++ return WINEDDERR_NOTLOCKED; ++ } ++ --surface->resource.map_count; ++ ++ surface->surface_ops->surface_unmap(surface); ++ ++ return WINED3D_OK; ++} ++ ++HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface, ++ struct wined3d_map_desc *map_desc, const RECT *rect, DWORD flags) ++{ ++ const struct wined3d_format *format = surface->resource.format; ++ struct wined3d_device *device = surface->resource.device; ++ struct wined3d_context *context; ++ const struct wined3d_gl_info *gl_info; ++ BYTE *base_memory; ++ ++ TRACE("surface %p, map_desc %p, rect %s, flags %#x.\n", ++ surface, map_desc, wine_dbgstr_rect(rect), flags); ++ ++ if (surface->resource.map_count) ++ { ++ WARN("Surface is already mapped.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++#endif /* STAGING_CSMT */ + + if ((format->flags & WINED3DFMT_FLAG_BLOCKS) && rect + && !surface_check_block_align(surface, rect)) +@@ -2589,6 +3099,13 @@ + return WINED3DERR_INVALIDCALL; + } + ++#if !defined(STAGING_CSMT) ++ ++surface->resource.map_count; ++ ++ if (!(surface->resource.access_flags & WINED3D_RESOURCE_ACCESS_CPU)) ++ WARN("Trying to lock unlockable surface.\n"); ++ ++#endif /* STAGING_CSMT */ + /* Performance optimization: Count how often a surface is mapped, if it is + * mapped regularly do not throw away the system memory copy. This avoids + * the need to download the surface from OpenGL all the time. The surface +@@ -2604,6 +3121,7 @@ + } + } + ++#if defined(STAGING_CSMT) + if (rect) + { + surface->lockedRect = *rect; +@@ -2668,22 +3186,121 @@ + WARN("Cannot use GetDC on a %s surface.\n", debug_d3dformat(surface->resource.format->id)); + return WINED3DERR_INVALIDCALL; + } ++#else /* STAGING_CSMT */ ++ surface_prepare_map_memory(surface); ++ if (flags & WINED3D_MAP_DISCARD) ++ { ++ TRACE("WINED3D_MAP_DISCARD flag passed, marking %s as up to date.\n", ++ wined3d_debug_location(surface->resource.map_binding)); ++ surface_validate_location(surface, surface->resource.map_binding); ++ } ++ else ++ { ++ if (surface->resource.usage & WINED3DUSAGE_DYNAMIC) ++ WARN_(d3d_perf)("Mapping a dynamic surface without WINED3D_MAP_DISCARD.\n"); + +- /* Give more detailed info for ddraw. */ +- if (surface->flags & SFLAG_DCINUSE) +- return WINEDDERR_DCALREADYCREATED; ++ surface_load_location(surface, surface->resource.map_binding); ++ } + +- /* Can't GetDC if the surface is locked. */ +- if (surface->resource.map_count) +- return WINED3DERR_INVALIDCALL; ++ if (!(flags & (WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READONLY))) ++ surface_invalidate_location(surface, ~surface->resource.map_binding); + +- surface->flags |= SFLAG_DCINUSE; +- surface->resource.map_count++; +- wined3d_cs_emit_getdc(device->cs, surface); +- *dc = surface->hDC; +- TRACE("Returning dc %p.\n", *dc); ++ switch (surface->resource.map_binding) ++ { ++ case WINED3D_LOCATION_SYSMEM: ++ base_memory = surface->resource.heap_memory; ++ break; + +- return *dc ? WINED3D_OK : WINED3DERR_INVALIDCALL; ++ case WINED3D_LOCATION_USER_MEMORY: ++ base_memory = surface->user_memory; ++ break; ++ ++ case WINED3D_LOCATION_DIB: ++ base_memory = surface->dib.bitmap_data; ++ break; ++ ++ case WINED3D_LOCATION_BUFFER: ++ context = context_acquire(device, NULL); ++ gl_info = context->gl_info; ++ ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->pbo)); ++ base_memory = GL_EXTCALL(glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_READ_WRITE_ARB)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); ++ checkGLcall("map PBO"); ++ ++ context_release(context); ++ break; ++ ++ default: ++ ERR("Unexpected map binding %s.\n", wined3d_debug_location(surface->resource.map_binding)); ++ base_memory = NULL; ++ } ++ ++ if (format->flags & WINED3DFMT_FLAG_BROKEN_PITCH) ++ map_desc->row_pitch = surface->resource.width * format->byte_count; ++ else ++ wined3d_resource_get_pitch(&surface->resource, &map_desc->row_pitch, &map_desc->slice_pitch); ++ map_desc->slice_pitch = 0; ++ ++ if (!rect) ++ { ++ map_desc->data = base_memory; ++ surface->lockedRect.left = 0; ++ surface->lockedRect.top = 0; ++ surface->lockedRect.right = surface->resource.width; ++ surface->lockedRect.bottom = surface->resource.height; ++ } ++ else ++ { ++ if ((format->flags & (WINED3DFMT_FLAG_BLOCKS | WINED3DFMT_FLAG_BROKEN_PITCH)) == WINED3DFMT_FLAG_BLOCKS) ++ { ++ /* Compressed textures are block based, so calculate the offset of ++ * the block that contains the top-left pixel of the locked rectangle. */ ++ map_desc->data = base_memory ++ + ((rect->top / format->block_height) * map_desc->row_pitch) ++ + ((rect->left / format->block_width) * format->block_byte_count); ++ } ++ else ++ { ++ map_desc->data = base_memory ++ + (map_desc->row_pitch * rect->top) ++ + (rect->left * format->byte_count); ++ } ++ surface->lockedRect.left = rect->left; ++ surface->lockedRect.top = rect->top; ++ surface->lockedRect.right = rect->right; ++ surface->lockedRect.bottom = rect->bottom; ++ } ++ ++ TRACE("Locked rect %s.\n", wine_dbgstr_rect(&surface->lockedRect)); ++ TRACE("Returning memory %p, pitch %u.\n", map_desc->data, map_desc->row_pitch); ++ ++ return WINED3D_OK; ++} ++ ++HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc) ++{ ++ HRESULT hr; ++ ++ TRACE("surface %p, dc %p.\n", surface, dc); ++#endif /* STAGING_CSMT */ ++ ++ /* Give more detailed info for ddraw. */ ++ if (surface->flags & SFLAG_DCINUSE) ++ return WINEDDERR_DCALREADYCREATED; ++ ++ /* Can't GetDC if the surface is locked. */ ++ if (surface->resource.map_count) ++ return WINED3DERR_INVALIDCALL; ++ ++#if defined(STAGING_CSMT) ++ surface->flags |= SFLAG_DCINUSE; ++ surface->resource.map_count++; ++ wined3d_cs_emit_getdc(device->cs, surface); ++ *dc = surface->hDC; ++ TRACE("Returning dc %p.\n", *dc); ++ ++ return *dc ? WINED3D_OK : WINED3DERR_INVALIDCALL; + } + + void wined3d_surface_releasedc_cs(struct wined3d_surface *surface) +@@ -2709,6 +3326,35 @@ + if (context) + context_release(context); + } ++#else /* STAGING_CSMT */ ++ /* Create a DIB section if there isn't a dc yet. */ ++ if (!surface->hDC) ++ { ++ if (surface->flags & SFLAG_CLIENT) ++ { ++ surface_load_location(surface, WINED3D_LOCATION_SYSMEM); ++ surface_release_client_storage(surface); ++ } ++ hr = surface_create_dib_section(surface); ++ if (FAILED(hr)) ++ return WINED3DERR_INVALIDCALL; ++ if (!(surface->resource.map_binding == WINED3D_LOCATION_USER_MEMORY ++ || surface->container->flags & WINED3D_TEXTURE_PIN_SYSMEM ++ || surface->pbo)) ++ surface->resource.map_binding = WINED3D_LOCATION_DIB; ++ } ++ ++ surface_load_location(surface, WINED3D_LOCATION_DIB); ++ surface_invalidate_location(surface, ~WINED3D_LOCATION_DIB); ++ ++ surface->flags |= SFLAG_DCINUSE; ++ surface->resource.map_count++; ++ ++ *dc = surface->hDC; ++ TRACE("Returning dc %p.\n", *dc); ++ ++ return WINED3D_OK; ++#endif /* STAGING_CSMT */ + } + + HRESULT CDECL wined3d_surface_releasedc(struct wined3d_surface *surface, HDC dc) +@@ -2728,6 +3374,7 @@ + surface->resource.map_count--; + surface->flags &= ~SFLAG_DCINUSE; + ++#if defined(STAGING_CSMT) + wined3d_cs_emit_releasedc(surface->resource.device->cs, surface); + + return WINED3D_OK; +@@ -2763,6 +3410,40 @@ + context = context_acquire(device, surface); + } + ++#else /* STAGING_CSMT */ ++ if (surface->resource.map_binding == WINED3D_LOCATION_USER_MEMORY ++ || (surface->container->flags & WINED3D_TEXTURE_PIN_SYSMEM ++ && surface->resource.map_binding != WINED3D_LOCATION_DIB)) ++ { ++ /* The game Salammbo modifies the surface contents without mapping the surface between ++ * a GetDC/ReleaseDC operation and flipping the surface. If the DIB remains the active ++ * copy and is copied to the screen, this update, which draws the mouse pointer, is lost. ++ * Do not only copy the DIB to the map location, but also make sure the map location is ++ * copied back to the DIB in the next getdc call. ++ * ++ * The same consideration applies to user memory surfaces. */ ++ surface_load_location(surface, surface->resource.map_binding); ++ surface_invalidate_location(surface, WINED3D_LOCATION_DIB); ++ } ++ ++ return WINED3D_OK; ++} ++ ++static void read_from_framebuffer(struct wined3d_surface *surface, DWORD dst_location) ++{ ++ struct wined3d_device *device = surface->resource.device; ++ const struct wined3d_gl_info *gl_info; ++ struct wined3d_context *context; ++ BYTE *mem; ++ BYTE *row, *top, *bottom; ++ int i; ++ BOOL srcIsUpsideDown; ++ struct wined3d_bo_address data; ++ ++ surface_get_memory(surface, &data, dst_location); ++ ++ context = context_acquire(device, surface); ++#endif /* STAGING_CSMT */ + context_apply_blit_state(context, device); + gl_info = context->gl_info; + +@@ -2850,12 +3531,16 @@ + checkGLcall("glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0)"); + } + ++#if defined(STAGING_CSMT) + if (restore_rt) + { + context_release(context); + context = context_acquire(device, restore_rt); + context_release(context); + } ++#else /* STAGING_CSMT */ ++ context_release(context); ++#endif /* STAGING_CSMT */ + } + + /* Read the framebuffer contents into a texture. Note that this function +@@ -2915,6 +3600,85 @@ + } + } + ++#if !defined(STAGING_CSMT) ++void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) ++{ ++ if (front->container->level_count != 1 || front->container->layer_count != 1 ++ || back->container->level_count != 1 || back->container->layer_count != 1) ++ ERR("Flip between surfaces %p and %p not supported.\n", front, back); ++ ++ /* Flip the surface contents */ ++ /* Flip the DC */ ++ { ++ HDC tmp; ++ tmp = front->hDC; ++ front->hDC = back->hDC; ++ back->hDC = tmp; ++ } ++ ++ /* Flip the DIBsection */ ++ { ++ HBITMAP tmp = front->dib.DIBsection; ++ front->dib.DIBsection = back->dib.DIBsection; ++ back->dib.DIBsection = tmp; ++ } ++ ++ /* Flip the surface data */ ++ { ++ void* tmp; ++ ++ tmp = front->dib.bitmap_data; ++ front->dib.bitmap_data = back->dib.bitmap_data; ++ back->dib.bitmap_data = tmp; ++ ++ tmp = front->resource.heap_memory; ++ front->resource.heap_memory = back->resource.heap_memory; ++ back->resource.heap_memory = tmp; ++ } ++ ++ /* Flip the PBO */ ++ { ++ GLuint tmp_pbo = front->pbo; ++ front->pbo = back->pbo; ++ back->pbo = tmp_pbo; ++ } ++ ++ /* Flip the opengl texture */ ++ { ++ GLuint tmp; ++ ++ tmp = back->container->texture_rgb.name; ++ back->container->texture_rgb.name = front->container->texture_rgb.name; ++ front->container->texture_rgb.name = tmp; ++ ++ tmp = back->container->texture_srgb.name; ++ back->container->texture_srgb.name = front->container->texture_srgb.name; ++ front->container->texture_srgb.name = tmp; ++ ++ tmp = back->rb_multisample; ++ back->rb_multisample = front->rb_multisample; ++ front->rb_multisample = tmp; ++ ++ tmp = back->rb_resolved; ++ back->rb_resolved = front->rb_resolved; ++ front->rb_resolved = tmp; ++ ++ resource_unload(&back->resource); ++ resource_unload(&front->resource); ++ } ++ ++ { ++ DWORD tmp_flags = back->flags; ++ back->flags = front->flags; ++ front->flags = tmp_flags; ++ ++ tmp_flags = back->locations; ++ back->locations = front->locations; ++ front->locations = tmp_flags; ++ } ++} ++ ++#endif /* STAGING_CSMT */ + /* Does a direct frame buffer -> texture copy. Stretching is done with single + * pixel copy calls. */ + static void fb_copy_to_texture_direct(struct wined3d_surface *dst_surface, struct wined3d_surface *src_surface, +@@ -3021,8 +3785,13 @@ + + /* The texture is now most up to date - If the surface is a render target + * and has a drawable, this path is never entered. */ ++#if defined(STAGING_CSMT) + wined3d_resource_validate_location(&dst_surface->resource, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_resource_invalidate_location(&dst_surface->resource, ~WINED3D_LOCATION_TEXTURE_RGB); ++#else /* STAGING_CSMT */ ++ surface_validate_location(dst_surface, WINED3D_LOCATION_TEXTURE_RGB); ++ surface_invalidate_location(dst_surface, ~WINED3D_LOCATION_TEXTURE_RGB); ++#endif /* STAGING_CSMT */ + } + + /* Uses the hardware to stretch and flip the image */ +@@ -3090,7 +3859,11 @@ + checkGLcall("glEnable(texture_target)"); + + /* For now invalidate the texture copy of the back buffer. Drawable and sysmem copy are untouched */ ++#if defined(STAGING_CSMT) + wined3d_resource_invalidate_location(&src_surface->resource, WINED3D_LOCATION_TEXTURE_RGB); ++#else /* STAGING_CSMT */ ++ src_surface->locations &= ~WINED3D_LOCATION_TEXTURE_RGB; ++#endif /* STAGING_CSMT */ + } + + /* Make sure that the top pixel is always above the bottom pixel, and keep a separate upside down flag +@@ -3288,6 +4061,7 @@ + checkGLcall("glDeleteTextures(1, &backup)"); + } + ++#if defined(STAGING_CSMT) + if (wined3d_settings.cs_multithreaded) + gl_info->gl_ops.gl.p_glFinish(); + else if (wined3d_settings.strict_draw_ordering) +@@ -3299,6 +4073,17 @@ + * and has a drawable, this path is never entered. */ + wined3d_resource_validate_location(&dst_surface->resource, WINED3D_LOCATION_TEXTURE_RGB); + wined3d_resource_invalidate_location(&dst_surface->resource, ~WINED3D_LOCATION_TEXTURE_RGB); ++#else /* STAGING_CSMT */ ++ if (wined3d_settings.strict_draw_ordering) ++ gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ ++ ++ context_release(context); ++ ++ /* The texture is now most up to date - If the surface is a render target ++ * and has a drawable, this path is never entered. */ ++ surface_validate_location(dst_surface, WINED3D_LOCATION_TEXTURE_RGB); ++ surface_invalidate_location(dst_surface, ~WINED3D_LOCATION_TEXTURE_RGB); ++#endif /* STAGING_CSMT */ + } + + /* Front buffer coordinates are always full screen coordinates, but our GL +@@ -3329,6 +4114,7 @@ + rect->bottom = drawable_height - rect->bottom; + } + ++#if defined(STAGING_CSMT) + /* Context activation is done by the caller. */ + static void surface_blt_to_drawable(const struct wined3d_device *device, + struct wined3d_context *old_ctx, +@@ -3363,6 +4149,26 @@ + /* Make sure the surface is up-to-date. This should probably use + * wined3d_resource_load_location() and worry about the destination + * surface too, unless we're overwriting it completely. */ ++#else /* STAGING_CSMT */ ++static void surface_blt_to_drawable(const struct wined3d_device *device, ++ enum wined3d_texture_filter_type filter, BOOL alpha_test, ++ struct wined3d_surface *src_surface, const RECT *src_rect_in, ++ struct wined3d_surface *dst_surface, const RECT *dst_rect_in) ++{ ++ const struct wined3d_gl_info *gl_info; ++ struct wined3d_context *context; ++ RECT src_rect, dst_rect; ++ ++ src_rect = *src_rect_in; ++ dst_rect = *dst_rect_in; ++ ++ context = context_acquire(device, dst_surface); ++ gl_info = context->gl_info; ++ ++ /* Make sure the surface is up-to-date. This should probably use ++ * surface_load_location() and worry about the destination surface too, ++ * unless we're overwriting it completely. */ ++#endif /* STAGING_CSMT */ + wined3d_texture_load(src_surface->container, context, FALSE); + + /* Activate the destination context, set it up for blitting */ +@@ -3405,6 +4211,7 @@ + /* Leave the opengl state valid for blitting */ + device->blitter->unset_shader(context->gl_info); + ++#if defined(STAGING_CSMT) + if (wined3d_settings.cs_multithreaded) + gl_info->gl_ops.gl.p_glFinish(); + else if (wined3d_settings.strict_draw_ordering +@@ -3418,6 +4225,14 @@ + context = context_acquire(device, restore_rt); + context_release(context); + } ++#else /* STAGING_CSMT */ ++ if (wined3d_settings.strict_draw_ordering ++ || (dst_surface->container->swapchain ++ && dst_surface->container->swapchain->front_buffer == dst_surface->container)) ++ gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ ++ ++ context_release(context); ++#endif /* STAGING_CSMT */ + } + + HRESULT surface_color_fill(struct wined3d_surface *s, const RECT *rect, const struct wined3d_color *color) +@@ -3441,9 +4256,15 @@ + enum wined3d_texture_filter_type filter) + { + struct wined3d_device *device = dst_surface->resource.device; ++#if defined(STAGING_CSMT) + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + struct wined3d_swapchain *src_swapchain, *dst_swapchain; + const struct wined3d_surface *rt = wined3d_rendertarget_view_get_surface(device->state.fb.render_targets[0]); ++#else /* STAGING_CSMT */ ++ const struct wined3d_surface *rt = wined3d_rendertarget_view_get_surface(device->fb.render_targets[0]); ++ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; ++ struct wined3d_swapchain *src_swapchain, *dst_swapchain; ++#endif /* STAGING_CSMT */ + + TRACE("dst_surface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, blt_fx %p, filter %s.\n", + dst_surface, wine_dbgstr_rect(dst_rect), src_surface, wine_dbgstr_rect(src_rect), +@@ -3568,7 +4389,9 @@ + /* Blit from offscreen surface to render target */ + struct wined3d_color_key old_blt_key = src_surface->container->src_blt_color_key; + DWORD old_color_key_flags = src_surface->container->color_key_flags; ++#if defined(STAGING_CSMT) + struct wined3d_context *context; ++#endif /* STAGING_CSMT */ + + TRACE("Blt from surface %p to rendertarget %p\n", src_surface, dst_surface); + +@@ -3602,6 +4425,7 @@ + wined3d_texture_set_color_key(src_surface->container, WINEDDSD_CKSRCBLT, NULL); + } + ++#if defined(STAGING_CSMT) + context = context_acquire(device, dst_surface); + surface_blt_to_drawable(device, context, filter, + flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE | WINEDDBLT_ALPHATEST), +@@ -3614,6 +4438,18 @@ + + wined3d_resource_validate_location(&dst_surface->resource, dst_surface->container->resource.draw_binding); + wined3d_resource_invalidate_location(&dst_surface->resource, ~dst_surface->container->resource.draw_binding); ++#else /* STAGING_CSMT */ ++ surface_blt_to_drawable(device, filter, ++ flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE | WINEDDBLT_ALPHATEST), ++ src_surface, src_rect, dst_surface, dst_rect); ++ ++ /* Restore the color key parameters */ ++ wined3d_texture_set_color_key(src_surface->container, WINEDDSD_CKSRCBLT, ++ (old_color_key_flags & WINEDDSD_CKSRCBLT) ? &old_blt_key : NULL); ++ ++ surface_validate_location(dst_surface, dst_surface->container->resource.draw_binding); ++ surface_invalidate_location(dst_surface, ~dst_surface->container->resource.draw_binding); ++#endif /* STAGING_CSMT */ + + return WINED3D_OK; + } +@@ -3688,6 +4524,7 @@ + { + TRACE("surface %p, new location %#x, w %u, h %u.\n", surface, location, w, h); + ++#if defined(STAGING_CSMT) + if (((surface->resource.locations & WINED3D_LOCATION_TEXTURE_RGB) && !(location & WINED3D_LOCATION_TEXTURE_RGB)) + || (!(surface->resource.locations & WINED3D_LOCATION_TEXTURE_RGB) + && (location & WINED3D_LOCATION_TEXTURE_RGB))) +@@ -3696,6 +4533,15 @@ + surface->ds_current_size.cx = w; + surface->ds_current_size.cy = h; + surface->resource.locations = location; ++#else /* STAGING_CSMT */ ++ if (((surface->locations & WINED3D_LOCATION_TEXTURE_RGB) && !(location & WINED3D_LOCATION_TEXTURE_RGB)) ++ || (!(surface->locations & WINED3D_LOCATION_TEXTURE_RGB) && (location & WINED3D_LOCATION_TEXTURE_RGB))) ++ wined3d_texture_set_dirty(surface->container); ++ ++ surface->ds_current_size.cx = w; ++ surface->ds_current_size.cy = h; ++ surface->locations = location; ++#endif /* STAGING_CSMT */ + } + + /* Context activation is done by the caller. */ +@@ -3710,7 +4556,11 @@ + /* TODO: Make this work for modes other than FBO */ + if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) return; + ++#if defined(STAGING_CSMT) + if (!(surface->resource.locations & location)) ++#else /* STAGING_CSMT */ ++ if (!(surface->locations & location)) ++#endif /* STAGING_CSMT */ + { + w = surface->ds_current_size.cx; + h = surface->ds_current_size.cy; +@@ -3736,7 +4586,11 @@ + return; + } + ++#if defined(STAGING_CSMT) + if (surface->resource.locations & WINED3D_LOCATION_DISCARDED) ++#else /* STAGING_CSMT */ ++ if (surface->locations & WINED3D_LOCATION_DISCARDED) ++#endif /* STAGING_CSMT */ + { + TRACE("Surface was discarded, no need copy data.\n"); + switch (location) +@@ -3753,6 +4607,7 @@ + default: + FIXME("Unhandled location %#x\n", location); + } ++#if defined(STAGING_CSMT) + surface->resource.locations &= ~WINED3D_LOCATION_DISCARDED; + surface->resource.locations |= location; + surface->ds_current_size.cx = surface->resource.width; +@@ -3764,6 +4619,19 @@ + { + FIXME("No up to date depth stencil location.\n"); + surface->resource.locations |= location; ++#else /* STAGING_CSMT */ ++ surface->locations &= ~WINED3D_LOCATION_DISCARDED; ++ surface->locations |= location; ++ surface->ds_current_size.cx = surface->resource.width; ++ surface->ds_current_size.cy = surface->resource.height; ++ return; ++ } ++ ++ if (!surface->locations) ++ { ++ FIXME("No up to date depth stencil location.\n"); ++ surface->locations |= location; ++#endif /* STAGING_CSMT */ + surface->ds_current_size.cx = surface->resource.width; + surface->ds_current_size.cy = surface->resource.height; + return; +@@ -3828,9 +4696,13 @@ + + context_invalidate_state(context, STATE_FRAMEBUFFER); + ++#if defined(STAGING_CSMT) + if (wined3d_settings.cs_multithreaded) + gl_info->gl_ops.gl.p_glFinish(); + else if (wined3d_settings.strict_draw_ordering) ++#else /* STAGING_CSMT */ ++ if (wined3d_settings.strict_draw_ordering) ++#endif /* STAGING_CSMT */ + gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + } + else if (location == WINED3D_LOCATION_DRAWABLE) +@@ -3846,9 +4718,13 @@ + + context_invalidate_state(context, STATE_FRAMEBUFFER); + ++#if defined(STAGING_CSMT) + if (wined3d_settings.cs_multithreaded) + gl_info->gl_ops.gl.p_glFinish(); + else if (wined3d_settings.strict_draw_ordering) ++#else /* STAGING_CSMT */ ++ if (wined3d_settings.strict_draw_ordering) ++#endif /* STAGING_CSMT */ + gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ + } + else +@@ -3856,6 +4732,7 @@ + ERR("Invalid location (%#x) specified.\n", location); + } + ++#if defined(STAGING_CSMT) + surface->resource.locations |= location; + surface->ds_current_size.cx = surface->resource.width; + surface->ds_current_size.cy = surface->resource.height; +@@ -3901,6 +4778,135 @@ + TRACE("Surface was discarded, nothing to do.\n"); + return WINED3D_OK; + } ++#else /* STAGING_CSMT */ ++ surface->locations |= location; ++ surface->ds_current_size.cx = surface->resource.width; ++ surface->ds_current_size.cy = surface->resource.height; ++} ++ ++void surface_validate_location(struct wined3d_surface *surface, DWORD location) ++{ ++ TRACE("surface %p, location %s.\n", surface, wined3d_debug_location(location)); ++ ++ surface->locations |= location; ++} ++ ++void surface_invalidate_location(struct wined3d_surface *surface, DWORD location) ++{ ++ TRACE("surface %p, location %s.\n", surface, wined3d_debug_location(location)); ++ ++ if (location & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) ++ wined3d_texture_set_dirty(surface->container); ++ surface->locations &= ~location; ++ ++ if (!surface->locations) ++ ERR("Surface %p does not have any up to date location.\n", surface); ++} ++ ++static DWORD resource_access_from_location(DWORD location) ++{ ++ switch (location) ++ { ++ case WINED3D_LOCATION_SYSMEM: ++ case WINED3D_LOCATION_USER_MEMORY: ++ case WINED3D_LOCATION_DIB: ++ case WINED3D_LOCATION_BUFFER: ++ return WINED3D_RESOURCE_ACCESS_CPU; ++ ++ case WINED3D_LOCATION_DRAWABLE: ++ case WINED3D_LOCATION_TEXTURE_SRGB: ++ case WINED3D_LOCATION_TEXTURE_RGB: ++ case WINED3D_LOCATION_RB_MULTISAMPLE: ++ case WINED3D_LOCATION_RB_RESOLVED: ++ return WINED3D_RESOURCE_ACCESS_GPU; ++ ++ default: ++ FIXME("Unhandled location %#x.\n", location); ++ return 0; ++ } ++} ++ ++static void surface_copy_simple_location(struct wined3d_surface *surface, DWORD location) ++{ ++ struct wined3d_device *device = surface->resource.device; ++ struct wined3d_context *context; ++ const struct wined3d_gl_info *gl_info; ++ struct wined3d_bo_address dst, src; ++ UINT size = surface->resource.size; ++ ++ surface_get_memory(surface, &dst, location); ++ surface_get_memory(surface, &src, surface->locations); ++ ++ if (dst.buffer_object) ++ { ++ context = context_acquire(device, NULL); ++ gl_info = context->gl_info; ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, dst.buffer_object)); ++ GL_EXTCALL(glBufferSubDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0, size, src.addr)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); ++ checkGLcall("Upload PBO"); ++ context_release(context); ++ return; ++ } ++ if (src.buffer_object) ++ { ++ context = context_acquire(device, NULL); ++ gl_info = context->gl_info; ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, src.buffer_object)); ++ GL_EXTCALL(glGetBufferSubDataARB(GL_PIXEL_PACK_BUFFER_ARB, 0, size, dst.addr)); ++ GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0)); ++ checkGLcall("Download PBO"); ++ context_release(context); ++ return; ++ } ++ memcpy(dst.addr, src.addr, size); ++} ++ ++static void surface_load_sysmem(struct wined3d_surface *surface, ++ const struct wined3d_gl_info *gl_info, DWORD dst_location) ++{ ++ if (surface->locations & surface_simple_locations) ++ { ++ surface_copy_simple_location(surface, dst_location); ++ return; ++ } ++ ++ if (surface->locations & (WINED3D_LOCATION_RB_MULTISAMPLE | WINED3D_LOCATION_RB_RESOLVED)) ++ surface_load_location(surface, WINED3D_LOCATION_TEXTURE_RGB); ++ ++ /* Download the surface to system memory. */ ++ if (surface->locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB)) ++ { ++ struct wined3d_device *device = surface->resource.device; ++ struct wined3d_context *context; ++ ++ /* TODO: Use already acquired context when possible. */ ++ context = context_acquire(device, NULL); ++ ++ wined3d_texture_bind_and_dirtify(surface->container, context, ++ !(surface->locations & WINED3D_LOCATION_TEXTURE_RGB)); ++ surface_download_data(surface, gl_info, dst_location); ++ ++ context_release(context); ++ ++ return; ++ } ++ ++ if (surface->locations & WINED3D_LOCATION_DRAWABLE) ++ { ++ read_from_framebuffer(surface, dst_location); ++ return; ++ } ++ ++ FIXME("Can't load surface %p with location flags %s into sysmem.\n", ++ surface, wined3d_debug_location(surface->locations)); ++} ++ ++static HRESULT surface_load_drawable(struct wined3d_surface *surface, ++ const struct wined3d_gl_info *gl_info) ++{ ++ RECT r; ++#endif /* STAGING_CSMT */ + + if (wined3d_settings.offscreen_rendering_mode == ORM_FBO + && wined3d_resource_is_offscreen(&surface->container->resource)) +@@ -3910,6 +4916,7 @@ + } + + surface_get_rect(surface, NULL, &r); ++#if defined(STAGING_CSMT) + wined3d_resource_load_location(&surface->resource, context, WINED3D_LOCATION_TEXTURE_RGB); + surface_blt_to_drawable(surface->resource.device, context, + WINED3D_TEXF_POINT, FALSE, surface, &r, surface, &r); +@@ -3978,6 +4985,66 @@ + RECT rect = {0, 0, surface->resource.width, surface->resource.height}; + + surface_blt_fbo(device, context, WINED3D_TEXF_POINT, surface, src_location, ++#else /* STAGING_CSMT */ ++ surface_load_location(surface, WINED3D_LOCATION_TEXTURE_RGB); ++ surface_blt_to_drawable(surface->resource.device, ++ WINED3D_TEXF_POINT, FALSE, surface, &r, surface, &r); ++ ++ return WINED3D_OK; ++} ++ ++static HRESULT surface_load_texture(struct wined3d_surface *surface, ++ const struct wined3d_gl_info *gl_info, BOOL srgb) ++{ ++ RECT src_rect = {0, 0, surface->resource.width, surface->resource.height}; ++ struct wined3d_device *device = surface->resource.device; ++ const struct wined3d_color_key_conversion *conversion; ++ struct wined3d_texture *texture = surface->container; ++ struct wined3d_context *context; ++ UINT width, src_row_pitch, src_slice_pitch, dst_pitch; ++ struct wined3d_bo_address data; ++ struct wined3d_format format; ++ POINT dst_point = {0, 0}; ++ BYTE *mem = NULL; ++ ++ if (wined3d_settings.offscreen_rendering_mode != ORM_FBO ++ && wined3d_resource_is_offscreen(&texture->resource) ++ && (surface->locations & WINED3D_LOCATION_DRAWABLE)) ++ { ++ surface_load_fb_texture(surface, srgb); ++ ++ return WINED3D_OK; ++ } ++ ++ if (surface->locations & (WINED3D_LOCATION_TEXTURE_SRGB | WINED3D_LOCATION_TEXTURE_RGB) ++ && (surface->resource.format->flags & WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB) ++ && fbo_blit_supported(gl_info, WINED3D_BLIT_OP_COLOR_BLIT, ++ NULL, surface->resource.usage, surface->resource.pool, surface->resource.format, ++ NULL, surface->resource.usage, surface->resource.pool, surface->resource.format)) ++ { ++ if (srgb) ++ surface_blt_fbo(device, WINED3D_TEXF_POINT, surface, WINED3D_LOCATION_TEXTURE_RGB, ++ &src_rect, surface, WINED3D_LOCATION_TEXTURE_SRGB, &src_rect); ++ else ++ surface_blt_fbo(device, WINED3D_TEXF_POINT, surface, WINED3D_LOCATION_TEXTURE_SRGB, ++ &src_rect, surface, WINED3D_LOCATION_TEXTURE_RGB, &src_rect); ++ ++ return WINED3D_OK; ++ } ++ ++ if (surface->locations & (WINED3D_LOCATION_RB_MULTISAMPLE | WINED3D_LOCATION_RB_RESOLVED) ++ && (!srgb || (surface->resource.format->flags & WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB)) ++ && fbo_blit_supported(gl_info, WINED3D_BLIT_OP_COLOR_BLIT, ++ NULL, surface->resource.usage, surface->resource.pool, surface->resource.format, ++ NULL, surface->resource.usage, surface->resource.pool, surface->resource.format)) ++ { ++ DWORD src_location = surface->locations & WINED3D_LOCATION_RB_RESOLVED ? ++ WINED3D_LOCATION_RB_RESOLVED : WINED3D_LOCATION_RB_MULTISAMPLE; ++ DWORD dst_location = srgb ? WINED3D_LOCATION_TEXTURE_SRGB : WINED3D_LOCATION_TEXTURE_RGB; ++ RECT rect = {0, 0, surface->resource.width, surface->resource.height}; ++ ++ surface_blt_fbo(device, WINED3D_TEXF_POINT, surface, src_location, ++#endif /* STAGING_CSMT */ + &rect, surface, dst_location, &rect); + + return WINED3D_OK; +@@ -3987,6 +5054,7 @@ + + if (srgb) + { ++#if defined(STAGING_CSMT) + if ((surface->resource.locations & (WINED3D_LOCATION_TEXTURE_RGB | surface->resource.map_binding)) + == WINED3D_LOCATION_TEXTURE_RGB) + { +@@ -4015,6 +5083,39 @@ + wined3d_resource_prepare_system_memory(&surface->resource); + wined3d_resource_load_location(&surface->resource, context, WINED3D_LOCATION_SYSMEM); + } ++#else /* STAGING_CSMT */ ++ if ((surface->locations & (WINED3D_LOCATION_TEXTURE_RGB | surface->resource.map_binding)) ++ == WINED3D_LOCATION_TEXTURE_RGB) ++ { ++ /* Performance warning... */ ++ FIXME("Downloading RGB surface %p to reload it as sRGB.\n", surface); ++ surface_prepare_map_memory(surface); ++ surface_load_location(surface, surface->resource.map_binding); ++ } ++ } ++ else ++ { ++ if ((surface->locations & (WINED3D_LOCATION_TEXTURE_SRGB | surface->resource.map_binding)) ++ == WINED3D_LOCATION_TEXTURE_SRGB) ++ { ++ /* Performance warning... */ ++ FIXME("Downloading sRGB surface %p to reload it as RGB.\n", surface); ++ surface_prepare_map_memory(surface); ++ surface_load_location(surface, surface->resource.map_binding); ++ } ++ } ++ ++ if (!(surface->locations & surface_simple_locations)) ++ { ++ WARN("Trying to load a texture from sysmem, but no simple location is valid.\n"); ++ /* Lets hope we get it from somewhere... */ ++ surface_prepare_system_memory(surface); ++ surface_load_location(surface, WINED3D_LOCATION_SYSMEM); ++ } ++ ++ /* TODO: Use already acquired context when possible. */ ++ context = context_acquire(device, NULL); ++#endif /* STAGING_CSMT */ + + wined3d_texture_prepare_texture(texture, context, srgb); + wined3d_texture_bind_and_dirtify(texture, context, srgb); +@@ -4036,7 +5137,11 @@ + /* Don't use PBOs for converted surfaces. During PBO conversion we look at + * WINED3D_TEXTURE_CONVERTED but it isn't set (yet) in all cases it is + * getting called. */ ++#if defined(STAGING_CSMT) + if ((format.convert || conversion) && surface->resource.buffer) ++#else /* STAGING_CSMT */ ++ if ((format.convert || conversion) && surface->pbo) ++#endif /* STAGING_CSMT */ + { + TRACE("Removing the pbo attached to surface %p.\n", surface); + +@@ -4045,6 +5150,7 @@ + else + surface->resource.map_binding = WINED3D_LOCATION_SYSMEM; + ++#if defined(STAGING_CSMT) + wined3d_resource_prepare_map_memory(&surface->resource, context); + wined3d_resource_load_location(&surface->resource, context, surface->resource.map_binding); + wined3d_resource_free_bo(&surface->resource); +@@ -4052,6 +5158,14 @@ + } + + wined3d_resource_get_memory(&surface->resource, surface->resource.locations, &data); ++#else /* STAGING_CSMT */ ++ surface_prepare_map_memory(surface); ++ surface_load_location(surface, surface->resource.map_binding); ++ surface_remove_pbo(surface, gl_info); ++ } ++ ++ surface_get_memory(surface, &data, surface->locations); ++#endif /* STAGING_CSMT */ + if (format.convert) + { + /* This code is entered for texture formats which need a fixup. */ +@@ -4097,6 +5211,7 @@ + + surface_upload_data(surface, gl_info, &format, &src_rect, src_row_pitch, &dst_point, srgb, &data); + ++#if defined(STAGING_CSMT) + HeapFree(GetProcessHeap(), 0, mem); + + return WINED3D_OK; +@@ -4120,6 +5235,31 @@ + struct wined3d_context *context, DWORD location) + { + struct wined3d_surface *surface = surface_from_resource(resource); ++#else /* STAGING_CSMT */ ++ context_release(context); ++ ++ HeapFree(GetProcessHeap(), 0, mem); ++ ++ return WINED3D_OK; ++} ++ ++static void surface_multisample_resolve(struct wined3d_surface *surface) ++{ ++ RECT rect = {0, 0, surface->resource.width, surface->resource.height}; ++ ++ if (!(surface->locations & WINED3D_LOCATION_RB_MULTISAMPLE)) ++ ERR("Trying to resolve multisampled surface %p, but location WINED3D_LOCATION_RB_MULTISAMPLE not current.\n", ++ surface); ++ ++ surface_blt_fbo(surface->resource.device, WINED3D_TEXF_POINT, ++ surface, WINED3D_LOCATION_RB_MULTISAMPLE, &rect, surface, WINED3D_LOCATION_RB_RESOLVED, &rect); ++} ++ ++HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location) ++{ ++ struct wined3d_device *device = surface->resource.device; ++ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; ++#endif /* STAGING_CSMT */ + HRESULT hr; + + TRACE("surface %p, location %s.\n", surface, wined3d_debug_location(location)); +@@ -4127,6 +5267,7 @@ + if (surface->resource.usage & WINED3DUSAGE_DEPTHSTENCIL) + { + if (location == WINED3D_LOCATION_TEXTURE_RGB ++#if defined(STAGING_CSMT) + && surface->resource.locations & (WINED3D_LOCATION_DRAWABLE | WINED3D_LOCATION_DISCARDED)) + { + surface_load_ds_location(surface, context, location); +@@ -4146,11 +5287,53 @@ + } + } + +- if (!surface->resource.locations) ++ if (!surface->resource.locations) ++ { ++ ERR("Surface %p does not have any up to date location.\n", surface); ++ surface->flags |= SFLAG_LOST; ++ return; ++#else /* STAGING_CSMT */ ++ && surface->locations & (WINED3D_LOCATION_DRAWABLE | WINED3D_LOCATION_DISCARDED)) ++ { ++ struct wined3d_context *context = context_acquire(device, NULL); ++ surface_load_ds_location(surface, context, location); ++ context_release(context); ++ return WINED3D_OK; ++ } ++ else if (location & surface->locations ++ && surface->container->resource.draw_binding != WINED3D_LOCATION_DRAWABLE) ++ { ++ /* Already up to date, nothing to do. */ ++ return WINED3D_OK; ++ } ++ else ++ { ++ FIXME("Unimplemented copy from %s to %s for depth/stencil buffers.\n", ++ wined3d_debug_location(surface->locations), wined3d_debug_location(location)); ++ return WINED3DERR_INVALIDCALL; ++ } ++ } ++ ++ if (surface->locations & location) ++ { ++ TRACE("Location already up to date.\n"); ++ return WINED3D_OK; ++ } ++ ++ if (WARN_ON(d3d_surface)) ++ { ++ DWORD required_access = resource_access_from_location(location); ++ if ((surface->resource.access_flags & required_access) != required_access) ++ WARN("Operation requires %#x access, but surface only has %#x.\n", ++ required_access, surface->resource.access_flags); ++ } ++ ++ if (!surface->locations) + { + ERR("Surface %p does not have any up to date location.\n", surface); + surface->flags |= SFLAG_LOST; +- return; ++ return WINED3DERR_DEVICELOST; ++#endif /* STAGING_CSMT */ + } + + switch (location) +@@ -4159,6 +5342,7 @@ + case WINED3D_LOCATION_USER_MEMORY: + case WINED3D_LOCATION_SYSMEM: + case WINED3D_LOCATION_BUFFER: ++#if defined(STAGING_CSMT) + surface_load_sysmem(surface, context, location); + break; + +@@ -4176,6 +5360,24 @@ + if (FAILED(hr = surface_load_texture(surface, context, + location == WINED3D_LOCATION_TEXTURE_SRGB))) + return; ++#else /* STAGING_CSMT */ ++ surface_load_sysmem(surface, gl_info, location); ++ break; ++ ++ case WINED3D_LOCATION_DRAWABLE: ++ if (FAILED(hr = surface_load_drawable(surface, gl_info))) ++ return hr; ++ break; ++ ++ case WINED3D_LOCATION_RB_RESOLVED: ++ surface_multisample_resolve(surface); ++ break; ++ ++ case WINED3D_LOCATION_TEXTURE_RGB: ++ case WINED3D_LOCATION_TEXTURE_SRGB: ++ if (FAILED(hr = surface_load_texture(surface, gl_info, location == WINED3D_LOCATION_TEXTURE_SRGB))) ++ return hr; ++#endif /* STAGING_CSMT */ + break; + + default: +@@ -4183,12 +5385,21 @@ + break; + } + ++#if defined(STAGING_CSMT) + wined3d_resource_validate_location(&surface->resource, location); + + if (location != WINED3D_LOCATION_SYSMEM && (surface->resource.locations & WINED3D_LOCATION_SYSMEM)) + surface_evict_sysmem(surface); + + return; ++#else /* STAGING_CSMT */ ++ surface_validate_location(surface, location); ++ ++ if (location != WINED3D_LOCATION_SYSMEM && (surface->locations & WINED3D_LOCATION_SYSMEM)) ++ surface_evict_sysmem(surface); ++ ++ return WINED3D_OK; ++#endif /* STAGING_CSMT */ + } + + static HRESULT ffp_blit_alloc(struct wined3d_device *device) { return WINED3D_OK; } +@@ -4282,6 +5493,7 @@ + const RECT *dst_rect, const struct wined3d_color *color) + { + const RECT draw_rect = {0, 0, dst_surface->resource.width, dst_surface->resource.height}; ++#if defined(STAGING_CSMT) + struct wined3d_rendertarget_view view, *view_ptr = &view; + struct wined3d_fb_state fb = {&view_ptr, NULL, 1}; + struct wined3d_texture *texture = dst_surface->container; +@@ -4302,6 +5514,21 @@ + view.sub_resource_idx = dst_surface->texture_layer * texture->level_count + dst_surface->texture_level; + + device_clear_render_targets(device, 1, &fb, 1, dst_rect, &draw_rect, WINED3DCLEAR_TARGET, color, 0.0f, 0); ++#else /* STAGING_CSMT */ ++ struct wined3d_rendertarget_view *view; ++ struct wined3d_fb_state fb = {&view, NULL}; ++ HRESULT hr; ++ ++ if (FAILED(hr = wined3d_rendertarget_view_create_from_surface(dst_surface, ++ NULL, &wined3d_null_parent_ops, &view))) ++ { ++ ERR("Failed to create rendertarget view, hr %#x.\n", hr); ++ return hr; ++ } ++ ++ device_clear_render_targets(device, 1, &fb, 1, dst_rect, &draw_rect, WINED3DCLEAR_TARGET, color, 0.0f, 0); ++ wined3d_rendertarget_view_decref(view); ++#endif /* STAGING_CSMT */ + + return WINED3D_OK; + } +@@ -4310,6 +5537,7 @@ + const RECT *dst_rect, float depth) + { + const RECT draw_rect = {0, 0, dst_surface->resource.width, dst_surface->resource.height}; ++#if defined(STAGING_CSMT) + struct wined3d_rendertarget_view view; + struct wined3d_fb_state fb = {NULL, &view}; + struct wined3d_texture *texture = dst_surface->container; +@@ -4325,6 +5553,20 @@ + view.sub_resource_idx = dst_surface->texture_layer * texture->level_count + dst_surface->texture_level; + + device_clear_render_targets(device, 0, &fb, 1, dst_rect, &draw_rect, WINED3DCLEAR_ZBUFFER, 0, depth, 0); ++#else /* STAGING_CSMT */ ++ struct wined3d_fb_state fb = {NULL, NULL}; ++ HRESULT hr; ++ ++ if (FAILED(hr = wined3d_rendertarget_view_create_from_surface(dst_surface, ++ NULL, &wined3d_null_parent_ops, &fb.depth_stencil))) ++ { ++ ERR("Failed to create rendertarget view, hr %#x.\n", hr); ++ return hr; ++ } ++ ++ device_clear_render_targets(device, 0, &fb, 1, dst_rect, &draw_rect, WINED3DCLEAR_ZBUFFER, 0, depth, 0); ++ wined3d_rendertarget_view_decref(fb.depth_stencil); ++#endif /* STAGING_CSMT */ + + return WINED3D_OK; + } +@@ -4482,6 +5724,7 @@ + int bpp, srcheight, srcwidth, dstheight, dstwidth, width; + const struct wined3d_format *src_format, *dst_format; + struct wined3d_texture *src_texture = NULL; ++#if defined(STAGING_CSMT) + void *src_data = NULL, *dst_data = NULL; + UINT src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch; + const BYTE *sbase = NULL; +@@ -4512,6 +5755,23 @@ + wined3d_resource_get_pitch(&dst_surface->resource, &dst_row_pitch, &dst_slice_pitch); + src_data = dst_data; + src_row_pitch = dst_row_pitch; ++#else /* STAGING_CSMT */ ++ struct wined3d_map_desc dst_map, src_map; ++ const BYTE *sbase = NULL; ++ HRESULT hr = WINED3D_OK; ++ const BYTE *sbuf; ++ BYTE *dbuf; ++ int x, y; ++ ++ TRACE("dst_surface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, fx %p, filter %s.\n", ++ dst_surface, wine_dbgstr_rect(dst_rect), src_surface, wine_dbgstr_rect(src_rect), ++ flags, fx, debug_d3dtexturefiltertype(filter)); ++ ++ if (src_surface == dst_surface) ++ { ++ wined3d_surface_map(dst_surface, &dst_map, NULL, 0); ++ src_map = dst_map; ++#endif /* STAGING_CSMT */ + src_format = dst_surface->resource.format; + dst_format = src_format; + } +@@ -4520,12 +5780,14 @@ + dst_format = dst_surface->resource.format; + if (src_surface) + { ++#if defined(STAGING_CSMT) + if (!wined3d_resource_prepare_map_memory(&src_surface->resource, context)) + { + hr = E_OUTOFMEMORY; + goto error; + } + ++#endif /* STAGING_CSMT */ + if (dst_surface->resource.format->id != src_surface->resource.format->id) + { + if (!(src_texture = surface_convert_format(src_surface, dst_format->id))) +@@ -4536,9 +5798,13 @@ + } + src_surface = surface_from_resource(wined3d_texture_get_sub_resource(src_texture, 0)); + } ++#if defined(STAGING_CSMT) + wined3d_resource_load_location(&src_surface->resource, context, src_surface->resource.map_binding); + wined3d_resource_get_pitch(&src_surface->resource, &src_row_pitch, &src_slice_pitch); + src_data = wined3d_resource_get_map_ptr(&src_surface->resource, context, 0); ++#else /* STAGING_CSMT */ ++ wined3d_surface_map(src_surface, &src_map, NULL, WINED3D_MAP_READONLY); ++#endif /* STAGING_CSMT */ + src_format = src_surface->resource.format; + } + else +@@ -4546,8 +5812,12 @@ + src_format = dst_format; + } + ++#if defined(STAGING_CSMT) + wined3d_resource_get_pitch(&dst_surface->resource, &dst_row_pitch, &dst_slice_pitch); + dst_data = wined3d_resource_get_map_ptr(&dst_surface->resource, context, 0); ++#else /* STAGING_CSMT */ ++ wined3d_surface_map(dst_surface, &dst_map, dst_rect, 0); ++#endif /* STAGING_CSMT */ + } + + bpp = dst_surface->resource.format->byte_count; +@@ -4558,12 +5828,24 @@ + width = (dst_rect->right - dst_rect->left) * bpp; + + if (src_surface) ++#if defined(STAGING_CSMT) + sbase = (BYTE *)src_data + + ((src_rect->top / src_format->block_height) * src_row_pitch) + + ((src_rect->left / src_format->block_width) * src_format->block_byte_count); + dbuf = (BYTE *)dst_data + + ((dst_rect->top / dst_format->block_height) * dst_row_pitch) + + ((dst_rect->left / dst_format->block_width) * dst_format->block_byte_count); ++#else /* STAGING_CSMT */ ++ sbase = (BYTE *)src_map.data ++ + ((src_rect->top / src_format->block_height) * src_map.row_pitch) ++ + ((src_rect->left / src_format->block_width) * src_format->block_byte_count); ++ if (src_surface != dst_surface) ++ dbuf = dst_map.data; ++ else ++ dbuf = (BYTE *)dst_map.data ++ + ((dst_rect->top / dst_format->block_height) * dst_map.row_pitch) ++ + ((dst_rect->left / dst_format->block_width) * dst_format->block_byte_count); ++#endif /* STAGING_CSMT */ + + if (src_format->flags & dst_format->flags & WINED3DFMT_FLAG_BLOCKS) + { +@@ -4598,7 +5880,11 @@ + } + + hr = surface_cpu_blt_compressed(sbase, dbuf, ++#if defined(STAGING_CSMT) + src_row_pitch, dst_row_pitch, dstwidth, dstheight, ++#else /* STAGING_CSMT */ ++ src_map.row_pitch, dst_map.row_pitch, dstwidth, dstheight, ++#endif /* STAGING_CSMT */ + src_format, flags, fx); + goto release; + } +@@ -4606,7 +5892,11 @@ + /* First, all the 'source-less' blits */ + if (flags & WINEDDBLT_COLORFILL) + { ++#if defined(STAGING_CSMT) + hr = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, dst_row_pitch, fx->u5.dwFillColor); ++#else /* STAGING_CSMT */ ++ hr = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, dst_map.row_pitch, fx->u5.dwFillColor); ++#endif /* STAGING_CSMT */ + flags &= ~WINEDDBLT_COLORFILL; + } + +@@ -4620,12 +5910,21 @@ + switch (fx->dwROP) + { + case BLACKNESS: ++#if defined(STAGING_CSMT) + hr = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, dst_row_pitch, 0); + break; + case 0xaa0029: /* No-op */ + break; + case WHITENESS: + hr = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, dst_row_pitch, ~0U); ++#else /* STAGING_CSMT */ ++ hr = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, dst_map.row_pitch, 0); ++ break; ++ case 0xaa0029: /* No-op */ ++ break; ++ case WHITENESS: ++ hr = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, dst_map.row_pitch, ~0U); ++#endif /* STAGING_CSMT */ + break; + case SRCCOPY: /* Well, we do that below? */ + break; +@@ -4676,6 +5975,7 @@ + for (y = 0; y < dstheight; ++y) + { + memcpy(dbuf, sbuf, width); ++#if defined(STAGING_CSMT) + sbuf += src_row_pitch; + dbuf += dst_row_pitch; + } +@@ -4689,6 +5989,21 @@ + { + sbuf -= src_row_pitch; + dbuf -= dst_row_pitch; ++#else /* STAGING_CSMT */ ++ sbuf += src_map.row_pitch; ++ dbuf += dst_map.row_pitch; ++ } ++ } ++ else if (dst_rect->top > src_rect->top) ++ { ++ /* Copy from bottom upwards. */ ++ sbuf += src_map.row_pitch * dstheight; ++ dbuf += dst_map.row_pitch * dstheight; ++ for (y = 0; y < dstheight; ++y) ++ { ++ sbuf -= src_map.row_pitch; ++ dbuf -= dst_map.row_pitch; ++#endif /* STAGING_CSMT */ + memcpy(dbuf, sbuf, width); + } + } +@@ -4698,8 +6013,13 @@ + for (y = 0; y < dstheight; ++y) + { + memmove(dbuf, sbuf, width); ++#if defined(STAGING_CSMT) + sbuf += src_row_pitch; + dbuf += dst_row_pitch; ++#else /* STAGING_CSMT */ ++ sbuf += src_map.row_pitch; ++ dbuf += dst_map.row_pitch; ++#endif /* STAGING_CSMT */ + } + } + } +@@ -4708,9 +6028,15 @@ + /* Stretching in y direction only. */ + for (y = sy = 0; y < dstheight; ++y, sy += yinc) + { ++#if defined(STAGING_CSMT) + sbuf = sbase + (sy >> 16) * src_row_pitch; + memcpy(dbuf, sbuf, width); + dbuf += dst_row_pitch; ++#else /* STAGING_CSMT */ ++ sbuf = sbase + (sy >> 16) * src_map.row_pitch; ++ memcpy(dbuf, sbuf, width); ++ dbuf += dst_map.row_pitch; ++#endif /* STAGING_CSMT */ + } + } + } +@@ -4720,6 +6046,7 @@ + int last_sy = -1; + for (y = sy = 0; y < dstheight; ++y, sy += yinc) + { ++#if defined(STAGING_CSMT) + sbuf = sbase + (sy >> 16) * src_row_pitch; + + if ((sy >> 16) == (last_sy >> 16)) +@@ -4727,6 +6054,15 @@ + /* This source row is the same as last source row - + * Copy the already stretched row. */ + memcpy(dbuf, dbuf - dst_row_pitch, width); ++#else /* STAGING_CSMT */ ++ sbuf = sbase + (sy >> 16) * src_map.row_pitch; ++ ++ if ((sy >> 16) == (last_sy >> 16)) ++ { ++ /* This source row is the same as last source row - ++ * Copy the already stretched row. */ ++ memcpy(dbuf, dbuf - dst_map.row_pitch, width); ++#endif /* STAGING_CSMT */ + } + else + { +@@ -4773,6 +6109,7 @@ + } + #undef STRETCH_ROW + } ++#if defined(STAGING_CSMT) + dbuf += dst_row_pitch; + last_sy = sy; + } +@@ -4781,6 +6118,16 @@ + else + { + LONG dstyinc = dst_row_pitch, dstxinc = bpp; ++#else /* STAGING_CSMT */ ++ dbuf += dst_map.row_pitch; ++ last_sy = sy; ++ } ++ } ++ } ++ else ++ { ++ LONG dstyinc = dst_map.row_pitch, dstxinc = bpp; ++#endif /* STAGING_CSMT */ + DWORD keylow = 0xffffffff, keyhigh = 0, keymask = 0xffffffff; + DWORD destkeylow = 0x0, destkeyhigh = 0xffffffff, destkeymask = 0xffffffff; + if (flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYDEST | WINEDDBLT_KEYSRCOVERRIDE | WINEDDBLT_KEYDESTOVERRIDE)) +@@ -4830,7 +6177,11 @@ + LONG tmpxy; + dTopLeft = dbuf; + dTopRight = dbuf + ((dstwidth - 1) * bpp); ++#if defined(STAGING_CSMT) + dBottomLeft = dTopLeft + ((dstheight - 1) * dst_row_pitch); ++#else /* STAGING_CSMT */ ++ dBottomLeft = dTopLeft + ((dstheight - 1) * dst_map.row_pitch); ++#endif /* STAGING_CSMT */ + dBottomRight = dBottomLeft + ((dstwidth - 1) * bpp); + + if (fx->dwDDFX & WINEDDBLTFX_ARITHSTRETCHY) +@@ -4907,6 +6258,7 @@ + flags &= ~(WINEDDBLT_DDFX); + } + ++#if defined(STAGING_CSMT) + #define COPY_COLORKEY_FX(type) \ + do { \ + const type *s; \ +@@ -4928,6 +6280,29 @@ + d = (type *)(((BYTE *)d) + dstyinc); \ + } \ + } while(0) ++#else /* STAGING_CSMT */ ++#define COPY_COLORKEY_FX(type) \ ++do { \ ++ const type *s; \ ++ type *d = (type *)dbuf, *dx, tmp; \ ++ for (y = sy = 0; y < dstheight; ++y, sy += yinc) \ ++ { \ ++ s = (const type *)(sbase + (sy >> 16) * src_map.row_pitch); \ ++ dx = d; \ ++ for (x = sx = 0; x < dstwidth; ++x, sx += xinc) \ ++ { \ ++ tmp = s[sx >> 16]; \ ++ if (((tmp & keymask) < keylow || (tmp & keymask) > keyhigh) \ ++ && ((dx[0] & destkeymask) >= destkeylow && (dx[0] & destkeymask) <= destkeyhigh)) \ ++ { \ ++ dx[0] = tmp; \ ++ } \ ++ dx = (type *)(((BYTE *)dx) + dstxinc); \ ++ } \ ++ d = (type *)(((BYTE *)d) + dstyinc); \ ++ } \ ++} while(0) ++#endif /* STAGING_CSMT */ + + switch (bpp) + { +@@ -4946,7 +6321,11 @@ + BYTE *d = dbuf, *dx; + for (y = sy = 0; y < dstheight; ++y, sy += yinc) + { ++#if defined(STAGING_CSMT) + sbuf = sbase + (sy >> 16) * src_row_pitch; ++#else /* STAGING_CSMT */ ++ sbuf = sbase + (sy >> 16) * src_map.row_pitch; ++#endif /* STAGING_CSMT */ + dx = d; + for (x = sx = 0; x < dstwidth; ++x, sx+= xinc) + { +@@ -4977,10 +6356,12 @@ + } + } + ++#if defined(STAGING_CSMT) + wined3d_resource_invalidate_location(&dst_surface->resource, ~dst_surface->resource.map_binding); + if (dst_surface->container) + wined3d_texture_set_dirty(dst_surface->container); + ++#endif /* STAGING_CSMT */ + error: + if (flags && FIXME_ON(d3d_surface)) + { +@@ -4988,6 +6369,7 @@ + } + + release: ++#if defined(STAGING_CSMT) + if (dst_data) + { + wined3d_resource_release_map_ptr(&dst_surface->resource, context); +@@ -5006,6 +6388,14 @@ + wined3d_texture_decref(src_texture); + if (context) + context_release(context); ++#else /* STAGING_CSMT */ ++ wined3d_surface_unmap(dst_surface); ++ if (src_surface && src_surface != dst_surface) ++ wined3d_surface_unmap(src_surface); ++ /* Release the converted surface, if any. */ ++ if (src_texture) ++ wined3d_texture_decref(src_texture); ++#endif /* STAGING_CSMT */ + + return hr; + } +@@ -5040,6 +6430,7 @@ + cpu_blit_depth_fill, + }; + ++#if defined(STAGING_CSMT) + void surface_blt_ugly(struct wined3d_surface *dst_surface, const RECT *dst_rect, + struct wined3d_surface *src_surface, const RECT *src_rect, DWORD flags, + const WINEDDBLTFX *fx, enum wined3d_texture_filter_type filter) +@@ -5047,6 +6438,16 @@ + struct wined3d_swapchain *src_swapchain, *dst_swapchain; + struct wined3d_device *device = dst_surface->resource.device; + DWORD src_ds_flags, dst_ds_flags; ++#else /* STAGING_CSMT */ ++HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const RECT *dst_rect_in, ++ struct wined3d_surface *src_surface, const RECT *src_rect_in, DWORD flags, ++ const WINEDDBLTFX *fx, enum wined3d_texture_filter_type filter) ++{ ++ struct wined3d_swapchain *src_swapchain, *dst_swapchain; ++ struct wined3d_device *device = dst_surface->resource.device; ++ DWORD src_ds_flags, dst_ds_flags; ++ RECT src_rect, dst_rect; ++#endif /* STAGING_CSMT */ + BOOL scale, convert; + + static const DWORD simple_blit = WINEDDBLT_ASYNC +@@ -5055,6 +6456,106 @@ + | WINEDDBLT_DEPTHFILL + | WINEDDBLT_DONOTWAIT; + ++#if !defined(STAGING_CSMT) ++ TRACE("dst_surface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, fx %p, filter %s.\n", ++ dst_surface, wine_dbgstr_rect(dst_rect_in), src_surface, wine_dbgstr_rect(src_rect_in), ++ flags, fx, debug_d3dtexturefiltertype(filter)); ++ TRACE("Usage is %s.\n", debug_d3dusage(dst_surface->resource.usage)); ++ ++ if (fx) ++ { ++ TRACE("dwSize %#x.\n", fx->dwSize); ++ TRACE("dwDDFX %#x.\n", fx->dwDDFX); ++ TRACE("dwROP %#x.\n", fx->dwROP); ++ TRACE("dwDDROP %#x.\n", fx->dwDDROP); ++ TRACE("dwRotationAngle %#x.\n", fx->dwRotationAngle); ++ TRACE("dwZBufferOpCode %#x.\n", fx->dwZBufferOpCode); ++ TRACE("dwZBufferLow %#x.\n", fx->dwZBufferLow); ++ TRACE("dwZBufferHigh %#x.\n", fx->dwZBufferHigh); ++ TRACE("dwZBufferBaseDest %#x.\n", fx->dwZBufferBaseDest); ++ TRACE("dwZDestConstBitDepth %#x.\n", fx->dwZDestConstBitDepth); ++ TRACE("lpDDSZBufferDest %p.\n", fx->u1.lpDDSZBufferDest); ++ TRACE("dwZSrcConstBitDepth %#x.\n", fx->dwZSrcConstBitDepth); ++ TRACE("lpDDSZBufferSrc %p.\n", fx->u2.lpDDSZBufferSrc); ++ TRACE("dwAlphaEdgeBlendBitDepth %#x.\n", fx->dwAlphaEdgeBlendBitDepth); ++ TRACE("dwAlphaEdgeBlend %#x.\n", fx->dwAlphaEdgeBlend); ++ TRACE("dwReserved %#x.\n", fx->dwReserved); ++ TRACE("dwAlphaDestConstBitDepth %#x.\n", fx->dwAlphaDestConstBitDepth); ++ TRACE("lpDDSAlphaDest %p.\n", fx->u3.lpDDSAlphaDest); ++ TRACE("dwAlphaSrcConstBitDepth %#x.\n", fx->dwAlphaSrcConstBitDepth); ++ TRACE("lpDDSAlphaSrc %p.\n", fx->u4.lpDDSAlphaSrc); ++ TRACE("lpDDSPattern %p.\n", fx->u5.lpDDSPattern); ++ TRACE("ddckDestColorkey {%#x, %#x}.\n", ++ fx->ddckDestColorkey.color_space_low_value, ++ fx->ddckDestColorkey.color_space_high_value); ++ TRACE("ddckSrcColorkey {%#x, %#x}.\n", ++ fx->ddckSrcColorkey.color_space_low_value, ++ fx->ddckSrcColorkey.color_space_high_value); ++ } ++ ++ if (dst_surface->resource.map_count || (src_surface && src_surface->resource.map_count)) ++ { ++ WARN("Surface is busy, returning WINEDDERR_SURFACEBUSY.\n"); ++ return WINEDDERR_SURFACEBUSY; ++ } ++ ++ surface_get_rect(dst_surface, dst_rect_in, &dst_rect); ++ ++ if (dst_rect.left >= dst_rect.right || dst_rect.top >= dst_rect.bottom ++ || dst_rect.left > dst_surface->resource.width || dst_rect.left < 0 ++ || dst_rect.top > dst_surface->resource.height || dst_rect.top < 0 ++ || dst_rect.right > dst_surface->resource.width || dst_rect.right < 0 ++ || dst_rect.bottom > dst_surface->resource.height || dst_rect.bottom < 0) ++ { ++ WARN("The application gave us a bad destination rectangle.\n"); ++ return WINEDDERR_INVALIDRECT; ++ } ++ ++ if (src_surface) ++ { ++ surface_get_rect(src_surface, src_rect_in, &src_rect); ++ ++ if (src_rect.left >= src_rect.right || src_rect.top >= src_rect.bottom ++ || src_rect.left > src_surface->resource.width || src_rect.left < 0 ++ || src_rect.top > src_surface->resource.height || src_rect.top < 0 ++ || src_rect.right > src_surface->resource.width || src_rect.right < 0 ++ || src_rect.bottom > src_surface->resource.height || src_rect.bottom < 0) ++ { ++ WARN("Application gave us bad source rectangle for Blt.\n"); ++ return WINEDDERR_INVALIDRECT; ++ } ++ } ++ else ++ { ++ memset(&src_rect, 0, sizeof(src_rect)); ++ } ++ ++ if (!fx || !(fx->dwDDFX)) ++ flags &= ~WINEDDBLT_DDFX; ++ ++ if (flags & WINEDDBLT_WAIT) ++ flags &= ~WINEDDBLT_WAIT; ++ ++ if (flags & WINEDDBLT_ASYNC) ++ { ++ static unsigned int once; ++ ++ if (!once++) ++ FIXME("Can't handle WINEDDBLT_ASYNC flag.\n"); ++ flags &= ~WINEDDBLT_ASYNC; ++ } ++ ++ /* WINEDDBLT_DONOTWAIT appeared in DX7. */ ++ if (flags & WINEDDBLT_DONOTWAIT) ++ { ++ static unsigned int once; ++ ++ if (!once++) ++ FIXME("Can't handle WINEDDBLT_DONOTWAIT flag.\n"); ++ flags &= ~WINEDDBLT_DONOTWAIT; ++ } ++ ++#endif /* STAGING_CSMT */ + if (!device->d3d_initialized) + { + WARN("D3D not initialized, using fallback.\n"); +@@ -5097,8 +6598,13 @@ + } + + scale = src_surface ++#if defined(STAGING_CSMT) + && (src_rect->right - src_rect->left != dst_rect->right - dst_rect->left + || src_rect->bottom - src_rect->top != dst_rect->bottom - dst_rect->top); ++#else /* STAGING_CSMT */ ++ && (src_rect.right - src_rect.left != dst_rect.right - dst_rect.left ++ || src_rect.bottom - src_rect.top != dst_rect.bottom - dst_rect.top); ++#endif /* STAGING_CSMT */ + convert = src_surface && src_surface->resource.format->id != dst_surface->resource.format->id; + + dst_ds_flags = dst_surface->resource.format->flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL); +@@ -5116,6 +6622,7 @@ + TRACE("Depth fill.\n"); + + if (!surface_convert_depth_to_float(dst_surface, fx->u5.dwFillDepth, &depth)) ++#if defined(STAGING_CSMT) + return; + + if (SUCCEEDED(wined3d_surface_depth_fill(dst_surface, dst_rect, depth))) +@@ -5134,6 +6641,32 @@ + * implement those in the CPU blitter at the moment. */ + if ((dst_surface->resource.locations & dst_surface->resource.map_binding) + && (!src_surface || (src_surface->resource.locations & src_surface->resource.map_binding))) ++#else /* STAGING_CSMT */ ++ return WINED3DERR_INVALIDCALL; ++ ++ if (SUCCEEDED(wined3d_surface_depth_fill(dst_surface, &dst_rect, depth))) ++ return WINED3D_OK; ++ } ++ else ++ { ++ if (src_ds_flags != dst_ds_flags) ++ { ++ WARN("Rejecting depth / stencil blit between incompatible formats.\n"); ++ return WINED3DERR_INVALIDCALL; ++ } ++ ++ if (SUCCEEDED(wined3d_surface_depth_blt(src_surface, src_surface->container->resource.draw_binding, ++ &src_rect, dst_surface, dst_surface->container->resource.draw_binding, &dst_rect))) ++ return WINED3D_OK; ++ } ++ } ++ else ++ { ++ /* In principle this would apply to depth blits as well, but we don't ++ * implement those in the CPU blitter at the moment. */ ++ if ((dst_surface->locations & dst_surface->resource.map_binding) ++ && (!src_surface || (src_surface->locations & src_surface->resource.map_binding))) ++#endif /* STAGING_CSMT */ + { + if (scale) + TRACE("Not doing sysmem blit because of scaling.\n"); +@@ -5152,6 +6685,7 @@ + if (!surface_convert_color_to_float(dst_surface, fx->u5.dwFillColor, &color)) + goto fallback; + ++#if defined(STAGING_CSMT) + if (SUCCEEDED(surface_color_fill(dst_surface, dst_rect, &color))) + return; + } +@@ -5162,6 +6696,18 @@ + /* Upload */ + if ((src_surface->resource.locations & WINED3D_LOCATION_SYSMEM) + && !(dst_surface->resource.locations & WINED3D_LOCATION_SYSMEM)) ++#else /* STAGING_CSMT */ ++ if (SUCCEEDED(surface_color_fill(dst_surface, &dst_rect, &color))) ++ return WINED3D_OK; ++ } ++ else ++ { ++ TRACE("Color blit.\n"); ++ ++ /* Upload */ ++ if ((src_surface->locations & WINED3D_LOCATION_SYSMEM) ++ && !(dst_surface->locations & WINED3D_LOCATION_SYSMEM)) ++#endif /* STAGING_CSMT */ + { + if (scale) + TRACE("Not doing upload because of scaling.\n"); +@@ -5169,6 +6715,7 @@ + TRACE("Not doing upload because of format conversion.\n"); + else + { ++#if defined(STAGING_CSMT) + POINT dst_point = {dst_rect->left, dst_rect->top}; + + if (SUCCEEDED(surface_upload_from_surface(dst_surface, &dst_point, src_surface, src_rect))) +@@ -5181,6 +6728,15 @@ + context_release(context); + } + return; ++#else /* STAGING_CSMT */ ++ POINT dst_point = {dst_rect.left, dst_rect.top}; ++ ++ if (SUCCEEDED(surface_upload_from_surface(dst_surface, &dst_point, src_surface, &src_rect))) ++ { ++ if (!wined3d_resource_is_offscreen(&dst_surface->container->resource)) ++ surface_load_location(dst_surface, dst_surface->container->resource.draw_binding); ++ return WINED3D_OK; ++#endif /* STAGING_CSMT */ + } + } + } +@@ -5205,6 +6761,7 @@ + wined3d_swapchain_present(dst_swapchain, NULL, NULL, dst_swapchain->win_handle, NULL, 0); + dst_swapchain->desc.swap_effect = swap_effect; + ++#if defined(STAGING_CSMT) + return; + } + +@@ -5401,6 +6958,50 @@ + wined3d_surface_location_invalidated, + wined3d_surface_load_location, + }; ++#else /* STAGING_CSMT */ ++ return WINED3D_OK; ++ } ++ ++ if (fbo_blit_supported(&device->adapter->gl_info, WINED3D_BLIT_OP_COLOR_BLIT, ++ &src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format, ++ &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format)) ++ { ++ TRACE("Using FBO blit.\n"); ++ ++ surface_blt_fbo(device, filter, ++ src_surface, src_surface->container->resource.draw_binding, &src_rect, ++ dst_surface, dst_surface->container->resource.draw_binding, &dst_rect); ++ surface_validate_location(dst_surface, dst_surface->container->resource.draw_binding); ++ surface_invalidate_location(dst_surface, ~dst_surface->container->resource.draw_binding); ++ ++ return WINED3D_OK; ++ } ++ ++ if (arbfp_blit.blit_supported(&device->adapter->gl_info, WINED3D_BLIT_OP_COLOR_BLIT, ++ &src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format, ++ &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format)) ++ { ++ TRACE("Using arbfp blit.\n"); ++ ++ if (SUCCEEDED(arbfp_blit_surface(device, filter, src_surface, &src_rect, dst_surface, &dst_rect))) ++ return WINED3D_OK; ++ } ++ } ++ } ++ ++fallback: ++ /* Special cases for render targets. */ ++ if (SUCCEEDED(surface_blt_special(dst_surface, &dst_rect, src_surface, &src_rect, flags, fx, filter))) ++ return WINED3D_OK; ++ ++cpu: ++ ++ /* For the rest call the X11 surface implementation. For render targets ++ * this should be implemented OpenGL accelerated in surface_blt_special(), ++ * other blits are rather rare. */ ++ return surface_cpu_blt(dst_surface, &dst_rect, src_surface, &src_rect, flags, fx, filter); ++} ++#endif /* STAGING_CSMT */ + + static HRESULT surface_init(struct wined3d_surface *surface, struct wined3d_texture *container, + const struct wined3d_resource_desc *desc, GLenum target, unsigned int level, unsigned int layer, DWORD flags) +@@ -5468,7 +7069,11 @@ + } + + surface->container = container; ++#if defined(STAGING_CSMT) + wined3d_resource_validate_location(&surface->resource, WINED3D_LOCATION_SYSMEM); ++#else /* STAGING_CSMT */ ++ surface_validate_location(surface, WINED3D_LOCATION_SYSMEM); ++#endif /* STAGING_CSMT */ + list_init(&surface->renderbuffers); + list_init(&surface->overlays); + +@@ -5500,9 +7105,14 @@ + if (surface->resource.map_binding == WINED3D_LOCATION_DIB) + { + wined3d_resource_free_sysmem(&surface->resource); ++#if defined(STAGING_CSMT) + surface->resource.map_heap_memory = NULL; + wined3d_resource_validate_location(&surface->resource, WINED3D_LOCATION_DIB); + wined3d_resource_invalidate_location(&surface->resource, WINED3D_LOCATION_SYSMEM); ++#else /* STAGING_CSMT */ ++ surface_validate_location(surface, WINED3D_LOCATION_DIB); ++ surface_invalidate_location(surface, WINED3D_LOCATION_SYSMEM); ++#endif /* STAGING_CSMT */ + } + + return hr; +@@ -5529,7 +7139,11 @@ + if (FAILED(hr = surface_init(object, container, desc, target, level, layer, flags))) + { + WARN("Failed to initialize surface, returning %#x.\n", hr); ++#if defined(STAGING_CSMT) + /* The command stream takes care of freeing the memory. */ ++#else /* STAGING_CSMT */ ++ HeapFree(GetProcessHeap(), 0, object); ++#endif /* STAGING_CSMT */ + return hr; + } + +diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c +--- a/dlls/wined3d/shader.c ++++ b/dlls/wined3d/shader.c +@@ -1702,7 +1702,11 @@ + } + } + ++#if defined(STAGING_CSMT) + void shader_cleanup(struct wined3d_shader *shader) ++#else /* STAGING_CSMT */ ++static void shader_cleanup(struct wined3d_shader *shader) ++#endif /* STAGING_CSMT */ + { + HeapFree(GetProcessHeap(), 0, shader->signature_strings); + shader->device->shader_backend->shader_destroy(shader); +@@ -1957,10 +1961,16 @@ + + if (!refcount) + { ++#if defined(STAGING_CSMT) + const struct wined3d_device *device = shader->device; + + shader->parent_ops->wined3d_object_destroyed(shader->parent); + wined3d_cs_emit_shader_cleanup(device->cs, shader); ++#else /* STAGING_CSMT */ ++ shader_cleanup(shader); ++ shader->parent_ops->wined3d_object_destroyed(shader->parent); ++ HeapFree(GetProcessHeap(), 0, shader); ++#endif /* STAGING_CSMT */ + } + + return refcount; +@@ -2185,7 +2195,11 @@ + memset(args, 0, sizeof(*args)); /* FIXME: Make sure all bits are set. */ + if (!gl_info->supported[ARB_FRAMEBUFFER_SRGB] && state->render_states[WINED3D_RS_SRGBWRITEENABLE]) + { ++#if defined(STAGING_CSMT) + const struct wined3d_format *rt_format = state->fb.render_targets[0]->format; ++#else /* STAGING_CSMT */ ++ const struct wined3d_format *rt_format = state->fb->render_targets[0]->format; ++#endif /* STAGING_CSMT */ + if (rt_format->flags & WINED3DFMT_FLAG_SRGB_WRITE) + { + static unsigned int warned = 0; +diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c +--- a/dlls/wined3d/buffer.c ++++ b/dlls/wined3d/buffer.c +@@ -32,6 +32,7 @@ + #define WINED3D_BUFFER_HASDESC 0x01 /* A vertex description has been found. */ + #define WINED3D_BUFFER_CREATEBO 0x02 /* Create a buffer object for this buffer. */ + #define WINED3D_BUFFER_DOUBLEBUFFER 0x04 /* Keep both a buffer object and a system memory copy for this buffer. */ ++#if defined(STAGING_CSMT) + #define WINED3D_BUFFER_DISCARD 0x08 /* The next PreLoad may discard the buffer contents. */ + #define WINED3D_BUFFER_SYNC 0x10 /* There has been at least one synchronized map since the last preload. */ + #define WINED3D_BUFFER_APPLESYNC 0x20 /* Using sync as in GL_APPLE_flush_buffer_range. */ +@@ -42,6 +43,19 @@ + #define VB_RESETFULLCONVS 20 /* Reset full conversion counts after that number of draws */ + + void buffer_invalidate_bo_range(struct wined3d_buffer *buffer, UINT offset, UINT size) ++#else /* STAGING_CSMT */ ++#define WINED3D_BUFFER_FLUSH 0x08 /* Manual unmap flushing. */ ++#define WINED3D_BUFFER_DISCARD 0x10 /* A DISCARD lock has occurred since the last preload. */ ++#define WINED3D_BUFFER_SYNC 0x20 /* There has been at least one synchronized map since the last preload. */ ++#define WINED3D_BUFFER_APPLESYNC 0x40 /* Using sync as in GL_APPLE_flush_buffer_range. */ ++ ++#define VB_MAXDECLCHANGES 100 /* After that number of decl changes we stop converting */ ++#define VB_RESETDECLCHANGE 1000 /* Reset the decl changecount after that number of draws */ ++#define VB_MAXFULLCONVERSIONS 5 /* Number of full conversions before we stop converting */ ++#define VB_RESETFULLCONVS 20 /* Reset full conversion counts after that number of draws */ ++ ++static void buffer_invalidate_bo_range(struct wined3d_buffer *buffer, UINT offset, UINT size) ++#endif /* STAGING_CSMT */ + { + if (!offset && !size) + goto invalidate_all; +@@ -117,7 +131,11 @@ + } + + /* Context activation is done by the caller. */ ++#if defined(STAGING_CSMT) + void buffer_create_buffer_object(struct wined3d_buffer *This, struct wined3d_context *context) ++#else /* STAGING_CSMT */ ++static void buffer_create_buffer_object(struct wined3d_buffer *This, struct wined3d_context *context) ++#endif /* STAGING_CSMT */ + { + GLenum gl_usage = GL_STATIC_DRAW_ARB; + GLenum error; +@@ -166,6 +184,10 @@ + { + GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE)); + checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE)"); ++#if !defined(STAGING_CSMT) ++ This->flags |= WINED3D_BUFFER_FLUSH; ++ ++#endif /* STAGING_CSMT */ + GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE)); + checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE)"); + This->flags |= WINED3D_BUFFER_APPLESYNC; +@@ -191,10 +213,14 @@ + if (This->flags & WINED3D_BUFFER_DOUBLEBUFFER) + buffer_invalidate_bo_range(This, 0, 0); + else ++#if defined(STAGING_CSMT) + { + wined3d_resource_free_sysmem(&This->resource); + This->resource.map_heap_memory = NULL; + } ++#else /* STAGING_CSMT */ ++ wined3d_resource_free_sysmem(&This->resource); ++#endif /* STAGING_CSMT */ + + return; + +@@ -423,6 +449,7 @@ + { + DWORD src_color = *dst_color; + ++#if defined(STAGING_CSMT) + /* Color conversion like in draw_strided_slow. watch out for little endianity + * If we want that stuff to work on big endian machines too we have to consider more things + * +@@ -431,6 +458,16 @@ + * 0x0000ff00: Green mask + * 0x000000ff: Red mask + */ ++#else /* STAGING_CSMT */ ++ /* Color conversion like in drawStridedSlow. watch out for little endianity ++ * If we want that stuff to work on big endian machines too we have to consider more things ++ * ++ * 0xff000000: Alpha mask ++ * 0x00ff0000: Blue mask ++ * 0x0000ff00: Green mask ++ * 0x000000ff: Red mask ++ */ ++#endif /* STAGING_CSMT */ + *dst_color = 0; + *dst_color |= (src_color & 0xff00ff00); /* Alpha Green */ + *dst_color |= (src_color & 0x00ff0000) >> 16; /* Red */ +@@ -457,8 +494,12 @@ + data->buffer_object = buffer->buffer_object; + if (!buffer->buffer_object) + { ++#if defined(STAGING_CSMT) + if ((!buffer->resource.map_count || buffer->flags & WINED3D_BUFFER_DOUBLEBUFFER) + && buffer->flags & WINED3D_BUFFER_CREATEBO) ++#else /* STAGING_CSMT */ ++ if ((buffer->flags & WINED3D_BUFFER_CREATEBO) && !buffer->resource.map_count) ++#endif /* STAGING_CSMT */ + { + buffer_create_buffer_object(buffer, context); + buffer->flags &= ~WINED3D_BUFFER_CREATEBO; +@@ -497,7 +538,9 @@ + + if (!wined3d_resource_allocate_sysmem(&This->resource)) + ERR("Failed to allocate system memory.\n"); ++#if defined(STAGING_CSMT) + This->resource.heap_memory = This->resource.map_heap_memory; ++#endif /* STAGING_CSMT */ + + if (This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB) + context_invalidate_state(context, STATE_INDEXBUFFER); +@@ -545,6 +588,7 @@ + resource_unload(resource); + } + ++#if defined(STAGING_CSMT) + void wined3d_buffer_cleanup_cs(struct wined3d_buffer *buffer) + { + struct wined3d_context *context; +@@ -577,6 +621,30 @@ + + buffer->resource.parent_ops->wined3d_object_destroyed(buffer->resource.parent); + wined3d_cs_emit_buffer_cleanup(device->cs, buffer); ++#else /* STAGING_CSMT */ ++ULONG CDECL wined3d_buffer_decref(struct wined3d_buffer *buffer) ++{ ++ ULONG refcount = InterlockedDecrement(&buffer->resource.ref); ++ struct wined3d_context *context; ++ ++ TRACE("%p decreasing refcount to %u.\n", buffer, refcount); ++ ++ if (!refcount) ++ { ++ if (buffer->buffer_object) ++ { ++ context = context_acquire(buffer->resource.device, NULL); ++ delete_gl_buffer(buffer, context->gl_info); ++ context_release(context); ++ ++ HeapFree(GetProcessHeap(), 0, buffer->conversion_map); ++ } ++ ++ resource_cleanup(&buffer->resource); ++ buffer->resource.parent_ops->wined3d_object_destroyed(buffer->resource.parent); ++ HeapFree(GetProcessHeap(), 0, buffer->maps); ++ HeapFree(GetProcessHeap(), 0, buffer); ++#endif /* STAGING_CSMT */ + } + + return refcount; +@@ -661,6 +729,7 @@ + /* The caller provides a GL context */ + static void buffer_direct_upload(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info, DWORD flags) + { ++#if defined(STAGING_CSMT) + UINT start = 0, len = 0; + + /* This potentially invalidates the element array buffer binding, but the +@@ -684,6 +753,45 @@ + GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE)); + checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE)"); + This->flags &= ~WINED3D_BUFFER_APPLESYNC; ++#else /* STAGING_CSMT */ ++ BYTE *map; ++ UINT start = 0, len = 0; ++ ++ /* This potentially invalidates the element array buffer binding, but the ++ * caller always takes care of this. */ ++ GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object)); ++ checkGLcall("glBindBufferARB"); ++ if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) ++ { ++ GLbitfield mapflags; ++ mapflags = GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT; ++ if (flags & WINED3D_BUFFER_DISCARD) ++ mapflags |= GL_MAP_INVALIDATE_BUFFER_BIT; ++ else if (!(flags & WINED3D_BUFFER_SYNC)) ++ mapflags |= GL_MAP_UNSYNCHRONIZED_BIT; ++ map = GL_EXTCALL(glMapBufferRange(This->buffer_type_hint, 0, ++ This->resource.size, mapflags)); ++ checkGLcall("glMapBufferRange"); ++ } ++ else ++ { ++ if (This->flags & WINED3D_BUFFER_APPLESYNC) ++ { ++ DWORD syncflags = 0; ++ if (flags & WINED3D_BUFFER_DISCARD) ++ syncflags |= WINED3D_MAP_DISCARD; ++ else if (!(flags & WINED3D_BUFFER_SYNC)) ++ syncflags |= WINED3D_MAP_NOOVERWRITE; ++ buffer_sync_apple(This, syncflags, gl_info); ++ } ++ map = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_WRITE_ONLY_ARB)); ++ checkGLcall("glMapBufferARB"); ++ } ++ if (!map) ++ { ++ ERR("Failed to map opengl buffer\n"); ++ return; ++#endif /* STAGING_CSMT */ + } + + while (This->modified_areas) +@@ -692,12 +800,33 @@ + start = This->maps[This->modified_areas].offset; + len = This->maps[This->modified_areas].size; + ++#if defined(STAGING_CSMT) + GL_EXTCALL(glBufferSubDataARB(This->buffer_type_hint, start, len, (BYTE *)This->resource.heap_memory + start)); + checkGLcall("glBufferSubDataARB"); + } + } + + static void buffer_mark_used(struct wined3d_buffer *buffer) ++#else /* STAGING_CSMT */ ++ memcpy(map + start, (BYTE *)This->resource.heap_memory + start, len); ++ ++ if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) ++ { ++ GL_EXTCALL(glFlushMappedBufferRange(This->buffer_type_hint, start, len)); ++ checkGLcall("glFlushMappedBufferRange"); ++ } ++ else if (This->flags & WINED3D_BUFFER_FLUSH) ++ { ++ GL_EXTCALL(glFlushMappedBufferRangeAPPLE(This->buffer_type_hint, start, len)); ++ checkGLcall("glFlushMappedBufferRangeAPPLE"); ++ } ++ } ++ GL_EXTCALL(glUnmapBufferARB(This->buffer_type_hint)); ++ checkGLcall("glUnmapBufferARB"); ++} ++ ++void buffer_mark_used(struct wined3d_buffer *buffer) ++#endif /* STAGING_CSMT */ + { + buffer->flags &= ~(WINED3D_BUFFER_SYNC | WINED3D_BUFFER_DISCARD); + } +@@ -716,6 +845,14 @@ + + TRACE("buffer %p.\n", buffer); + ++#if !defined(STAGING_CSMT) ++ if (buffer->resource.map_count) ++ { ++ WARN("Buffer is mapped, skipping preload.\n"); ++ return; ++ } ++ ++#endif /* STAGING_CSMT */ + buffer_mark_used(buffer); + + if (!buffer->buffer_object) +@@ -904,6 +1041,7 @@ + + void CDECL wined3d_buffer_preload(struct wined3d_buffer *buffer) + { ++#if defined(STAGING_CSMT) + struct wined3d_device *device = buffer->resource.device; + + if (buffer->resource.map_count) +@@ -913,6 +1051,12 @@ + } + + wined3d_cs_emit_buffer_preload(device->cs, buffer); ++#else /* STAGING_CSMT */ ++ struct wined3d_context *context; ++ context = context_acquire(buffer->resource.device, NULL); ++ buffer_internal_preload(buffer, context, NULL); ++ context_release(context); ++#endif /* STAGING_CSMT */ + } + + struct wined3d_resource * CDECL wined3d_buffer_get_resource(struct wined3d_buffer *buffer) +@@ -926,6 +1070,7 @@ + { + LONG count; + BYTE *base; ++#if defined(STAGING_CSMT) + struct wined3d_device *device = buffer->resource.device; + struct wined3d_context *context; + +@@ -950,6 +1095,10 @@ + wined3d_cs_emit_create_vbo(device->cs, buffer); + buffer->flags &= ~WINED3D_BUFFER_CREATEBO; + } ++#else /* STAGING_CSMT */ ++ ++ TRACE("buffer %p, offset %u, size %u, data %p, flags %#x\n", buffer, offset, size, data, flags); ++#endif /* STAGING_CSMT */ + + flags = wined3d_resource_sanitize_map_flags(&buffer->resource, flags); + /* Filter redundant WINED3D_MAP_DISCARD maps. The 3DMark2001 multitexture +@@ -958,7 +1107,11 @@ + * previous contents of the buffer. The r600g driver only does this when + * the buffer is currently in use, while the proprietary NVIDIA driver + * appears to do this unconditionally. */ ++#if defined(STAGING_CSMT) + if (buffer->ignore_discard) ++#else /* STAGING_CSMT */ ++ if (buffer->flags & WINED3D_BUFFER_DISCARD) ++#endif /* STAGING_CSMT */ + flags &= ~WINED3D_MAP_DISCARD; + count = ++buffer->resource.map_count; + +@@ -969,6 +1122,7 @@ + * being uploaded in that case. Two such applications are Port Royale + * and Darkstar One. */ + if (flags & WINED3D_MAP_DISCARD) ++#if defined(STAGING_CSMT) + wined3d_cs_emit_buffer_invalidate_bo_range(device->cs, buffer, 0, 0); + else if (!(flags & WINED3D_MAP_READONLY)) + wined3d_cs_emit_buffer_invalidate_bo_range(device->cs, buffer, offset, size); +@@ -986,6 +1140,19 @@ + wined3d_cs_emit_glfinish(device->cs); + device->cs->ops->finish(device->cs); + } ++#else /* STAGING_CSMT */ ++ buffer_invalidate_bo_range(buffer, 0, 0); ++ else if (!(flags & WINED3D_MAP_READONLY)) ++ buffer_invalidate_bo_range(buffer, offset, size); ++ ++ if (!(buffer->flags & WINED3D_BUFFER_DOUBLEBUFFER)) ++ { ++ if (count == 1) ++ { ++ struct wined3d_device *device = buffer->resource.device; ++ struct wined3d_context *context; ++ const struct wined3d_gl_info *gl_info; ++#endif /* STAGING_CSMT */ + + context = context_acquire(device, NULL); + gl_info = context->gl_info; +@@ -1036,6 +1203,7 @@ + buffer_get_sysmem(buffer, context); + } + TRACE("New pointer is %p.\n", buffer->resource.heap_memory); ++#if defined(STAGING_CSMT) + } + context_release(context); + } +@@ -1072,6 +1240,21 @@ + } + + base = buffer->map_ptr ? buffer->map_ptr : buffer->resource.map_heap_memory; ++#else /* STAGING_CSMT */ ++ buffer->map_ptr = NULL; ++ } ++ context_release(context); ++ } ++ } ++ ++ if (flags & WINED3D_MAP_DISCARD) ++ buffer->flags |= WINED3D_BUFFER_DISCARD; ++ else if (!(flags & WINED3D_MAP_NOOVERWRITE)) ++ buffer->flags |= WINED3D_BUFFER_SYNC; ++ } ++ ++ base = buffer->map_ptr ? buffer->map_ptr : buffer->resource.heap_memory; ++#endif /* STAGING_CSMT */ + *data = base + offset; + + TRACE("Returning memory at %p (base %p, offset %u).\n", *data, base, offset); +@@ -1125,7 +1308,11 @@ + checkGLcall("glFlushMappedBufferRange"); + } + } ++#if defined(STAGING_CSMT) + else if (buffer->flags & WINED3D_BUFFER_APPLESYNC) ++#else /* STAGING_CSMT */ ++ else if (buffer->flags & WINED3D_BUFFER_FLUSH) ++#endif /* STAGING_CSMT */ + { + for (i = 0; i < buffer->modified_areas; ++i) + { +@@ -1136,6 +1323,7 @@ + } + + GL_EXTCALL(glUnmapBufferARB(buffer->buffer_type_hint)); ++#if defined(STAGING_CSMT) + if (wined3d_settings.cs_multithreaded) + gl_info->gl_ops.gl.p_glFinish(); + else if (wined3d_settings.strict_draw_ordering) +@@ -1144,6 +1332,18 @@ + + buffer_clear_dirty_areas(buffer); + buffer->map_ptr = NULL; ++#else /* STAGING_CSMT */ ++ if (wined3d_settings.strict_draw_ordering) ++ gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */ ++ context_release(context); ++ ++ buffer_clear_dirty_areas(buffer); ++ buffer->map_ptr = NULL; ++ } ++ else if (buffer->flags & WINED3D_BUFFER_HASDESC) ++ { ++ wined3d_buffer_preload(buffer); ++#endif /* STAGING_CSMT */ + } + } + +@@ -1157,6 +1357,7 @@ + return wined3d_buffer_decref(buffer_from_resource(resource)); + } + ++#if defined(STAGING_CSMT) + static void wined3d_buffer_location_invalidated(struct wined3d_resource *resource, DWORD location) + { + ERR("Not yet implemented.\n"); +@@ -1176,6 +1377,13 @@ + buffer_unload, + wined3d_buffer_location_invalidated, + wined3d_buffer_load_location, ++#else /* STAGING_CSMT */ ++static const struct wined3d_resource_ops buffer_resource_ops = ++{ ++ buffer_resource_incref, ++ buffer_resource_decref, ++ buffer_unload, ++#endif /* STAGING_CSMT */ + }; + + static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device *device, +@@ -1202,7 +1410,9 @@ + return hr; + } + buffer->buffer_type_hint = bind_hint; ++#if defined(STAGING_CSMT) + buffer->ignore_discard = TRUE; ++#endif /* STAGING_CSMT */ + + TRACE("size %#x, usage %#x, format %s, memory @ %p, iface @ %p.\n", buffer->resource.size, buffer->resource.usage, + debug_d3dformat(buffer->resource.format->id), buffer->resource.heap_memory, buffer); +@@ -1218,6 +1428,7 @@ + + dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_BUFFER_RANGE] || gl_info->supported[ARB_MAP_BUFFER_RANGE]; + ++#if defined(STAGING_CSMT) + /* Observations show that draw_strided_slow is faster on dynamic VBs than converting + + * drawStridedFast (half-life 2 and others). + * +@@ -1225,6 +1436,15 @@ + * show that draw_strided_slow is faster than converting + uploading + drawStridedFast. + * Therefore do not create a VBO for WINED3DUSAGE_DYNAMIC buffers. + */ ++#else /* STAGING_CSMT */ ++ /* Observations show that drawStridedSlow is faster on dynamic VBs than converting + ++ * drawStridedFast (half-life 2 and others). ++ * ++ * Basically converting the vertices in the buffer is quite expensive, and observations ++ * show that drawStridedSlow is faster than converting + uploading + drawStridedFast. ++ * Therefore do not create a VBO for WINED3DUSAGE_DYNAMIC buffers. ++ */ ++#endif /* STAGING_CSMT */ + if (!gl_info->supported[ARB_VERTEX_BUFFER_OBJECT]) + { + TRACE("Not creating a vbo because GL_ARB_vertex_buffer is not supported\n"); +@@ -1270,9 +1490,11 @@ + } + buffer->maps_size = 1; + ++#if defined(STAGING_CSMT) + if (wined3d_settings.cs_multithreaded) + buffer->flags |= WINED3D_BUFFER_DOUBLEBUFFER; + ++#endif /* STAGING_CSMT */ + return WINED3D_OK; + } + +@@ -1378,6 +1600,7 @@ + + return WINED3D_OK; + } ++#if defined(STAGING_CSMT) + + void buffer_swap_mem(struct wined3d_buffer *buffer, BYTE *mem) + { +@@ -1385,3 +1608,4 @@ + buffer->resource.heap_memory = mem; + buffer->flags |= WINED3D_BUFFER_DISCARD; + } ++#endif /* STAGING_CSMT */ +diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c +--- a/dlls/wined3d/directx.c ++++ b/dlls/wined3d/directx.c +@@ -4731,9 +4731,15 @@ + DebugBreak(); + } + ++#if defined(STAGING_CSMT) + /* Helper functions for providing vertex data to opengl. The arrays are initialized based on + * the extension detection and are used in draw_strided_slow + */ ++#else /* STAGING_CSMT */ ++/* Helper functions for providing vertex data to opengl. The arrays are initialized based on ++ * the extension detection and are used in drawStridedSlow ++ */ ++#endif /* STAGING_CSMT */ + static void WINE_GLAPI position_d3dcolor(const void *data) + { + DWORD pos = *((const DWORD *)data); +diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c +--- a/dlls/wined3d/resource.c ++++ b/dlls/wined3d/resource.c +@@ -119,7 +119,9 @@ + ERR("Failed to allocate system memory.\n"); + return E_OUTOFMEMORY; + } ++#if defined(STAGING_CSMT) + resource->heap_memory = resource->map_heap_memory; ++#endif /* STAGING_CSMT */ + } + else + { +@@ -143,6 +145,7 @@ + return WINED3D_OK; + } + ++#if defined(STAGING_CSMT) + void wined3d_resource_free_bo(struct wined3d_resource *resource) + { + struct wined3d_context *context = context_acquire(resource->device, NULL); +@@ -168,6 +171,7 @@ + resource->map_heap_memory = NULL; + } + ++#endif /* STAGING_CSMT */ + void resource_cleanup(struct wined3d_resource *resource) + { + const struct wined3d *d3d = resource->device->wined3d; +@@ -180,7 +184,11 @@ + adapter_adjust_memory(resource->device->adapter, (INT64)0 - resource->size); + } + ++#if defined(STAGING_CSMT) + wined3d_cs_emit_resource_cleanup(resource->device->cs, resource); ++#else /* STAGING_CSMT */ ++ wined3d_resource_free_sysmem(resource); ++#endif /* STAGING_CSMT */ + + device_resource_released(resource->device, resource); + } +@@ -190,9 +198,11 @@ + if (resource->map_count) + ERR("Resource %p is being unloaded while mapped.\n", resource); + ++#if defined(STAGING_CSMT) + if (resource->buffer) + wined3d_resource_free_bo(resource); + ++#endif /* STAGING_CSMT */ + context_resource_unloaded(resource->device, + resource, resource->type); + } +@@ -255,7 +265,11 @@ + p = (void **)(((ULONG_PTR)mem + align) & ~(RESOURCE_ALIGNMENT - 1)) - 1; + *p = mem; + ++#if defined(STAGING_CSMT) + resource->map_heap_memory = ++p; ++#else /* STAGING_CSMT */ ++ resource->heap_memory = ++p; ++#endif /* STAGING_CSMT */ + + return TRUE; + } +@@ -321,7 +335,11 @@ + return ret; + } + ++#if defined(STAGING_CSMT) + static GLenum wined3d_resource_gl_legacy_map_flags(DWORD d3d_flags) ++#else /* STAGING_CSMT */ ++GLenum wined3d_resource_gl_legacy_map_flags(DWORD d3d_flags) ++#endif /* STAGING_CSMT */ + { + if (d3d_flags & WINED3D_MAP_READONLY) + return GL_READ_ONLY_ARB; +@@ -361,6 +379,7 @@ + resource->draw_binding = WINED3D_LOCATION_TEXTURE_RGB; + } + ++#if defined(STAGING_CSMT) + void wined3d_resource_validate_location(struct wined3d_resource *resource, DWORD location) + { + TRACE("Resource %p, setting %s.\n", resource, wined3d_debug_location(location)); +@@ -632,6 +651,7 @@ + } + } + ++#endif /* STAGING_CSMT */ + void CDECL wined3d_resource_get_pitch(const struct wined3d_resource *resource, UINT *row_pitch, + UINT *slice_pitch) + { +@@ -662,6 +682,7 @@ + + TRACE("Returning row pitch %u, slice pitch %u.\n", *row_pitch, *slice_pitch); + } ++#if defined(STAGING_CSMT) + + BOOL wined3d_resource_check_block_align(const struct wined3d_resource *resource, + const struct wined3d_box *box) +@@ -937,3 +958,4 @@ + + wined3d_resource_invalidate_location(resource, ~resource->map_binding); + } ++#endif /* STAGING_CSMT */ diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-CSMT_Main/definition 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-CSMT_Main/definition 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,3 @@ +Fixes: [11674] Support for CSMT (command stream) to increase graphic performance +Depends: wined3d-CSMT_Helper +IfDefined: STAGING_CSMT diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-DXTn/0002-wined3d-Improve-DXTn-support-and-export-conversion-f.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-DXTn/0002-wined3d-Improve-DXTn-support-and-export-conversion-f.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wined3d-DXTn/0002-wined3d-Improve-DXTn-support-and-export-conversion-f.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wined3d-DXTn/0002-wined3d-Improve-DXTn-support-and-export-conversion-f.patch 2014-12-15 01:08:14.000000000 +0000 @@ -1,4 +1,4 @@ -From eea72aef0b19779822191f8dc858fa282cc4bfb0 Mon Sep 17 00:00:00 2001 +From 4222334f4c1f6107fc323149456c8684ace91a86 Mon Sep 17 00:00:00 2001 From: Christian Costa Date: Tue, 4 Nov 2014 22:41:45 +0100 Subject: wined3d: Improve DXTn support and export conversion functions for @@ -254,10 +254,10 @@ +@ cdecl wined3d_dxt5_decode(ptr ptr long long long long long) +@ cdecl wined3d_dxt5_encode(ptr ptr long long long long long) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h -index 45c68b3..878ac3a 100644 +index e47f5ce..8112cbc 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h -@@ -3133,11 +3133,6 @@ static inline void context_apply_state(struct wined3d_context *context, +@@ -3151,11 +3151,6 @@ static inline void context_apply_state(struct wined3d_context *context, state_table[rep].apply(context, state, rep); } @@ -270,12 +270,12 @@ void wined3d_dxtn_free(void); diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h -index 8f563bb..1aa2446 100644 +index 0cf26e1..3e3ac86 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h -@@ -2547,4 +2547,11 @@ HRESULT __cdecl wined3d_volume_map(struct wined3d_volume *volume, - void __cdecl wined3d_volume_preload(struct wined3d_volume *volume); - HRESULT __cdecl wined3d_volume_unmap(struct wined3d_volume *volume); +@@ -2590,4 +2590,11 @@ static inline unsigned int wined3d_log2i(unsigned int x) + #endif + } +BOOL wined3d_dxt1_decode(const BYTE *src, BYTE *dst, DWORD pitch_in, DWORD pitch_out, enum wined3d_format_id format, unsigned int w, unsigned int h); +BOOL wined3d_dxt1_encode(const BYTE *src, BYTE *dst, DWORD pitch_in, DWORD pitch_out, enum wined3d_format_id format, unsigned int w, unsigned int h); @@ -286,5 +286,5 @@ + #endif /* __WINE_WINED3D_H */ -- -2.1.3 +1.9.1 diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/0030-winepulse-fix-segfault-in-pulse_rd_loop.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/0030-winepulse-fix-segfault-in-pulse_rd_loop.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/0030-winepulse-fix-segfault-in-pulse_rd_loop.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/0030-winepulse-fix-segfault-in-pulse_rd_loop.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,24 @@ +From a879d7aa33f4d182d0b60c6991b0eb9e3e0f34fa Mon Sep 17 00:00:00 2001 +From: Mark Harmstone +Date: Tue, 18 Nov 2014 18:39:58 +0000 +Subject: winepulse: fix segfault in pulse_rd_loop + +--- + dlls/winepulse.drv/mmdevdrv.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c +index 6134850..37ff7ee 100644 +--- a/dlls/winepulse.drv/mmdevdrv.c ++++ b/dlls/winepulse.drv/mmdevdrv.c +@@ -592,6 +592,7 @@ static void pulse_rd_loop(ACImpl *This, size_t bytes) + size_t src_len, copy, rem = This->capture_period; + if (!(p = (ACPacket*)list_head(&This->packet_free_head))) { + p = (ACPacket*)list_head(&This->packet_filled_head); ++ if (!p) return; + if (!p->discont) { + next = (ACPacket*)p->entry.next; + next->discont = 1; +-- +2.0.4 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/0031-winepulse-implement-GetPropValue.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/0031-winepulse-implement-GetPropValue.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/0031-winepulse-implement-GetPropValue.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/0031-winepulse-implement-GetPropValue.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,190 @@ +From b6c4b15d71542a567f6ca67fe4d0463b04c5fedc Mon Sep 17 00:00:00 2001 +From: Mark Harmstone +Date: Thu, 4 Dec 2014 21:36:42 +0000 +Subject: [PATCH] winepulse: implement GetPropValue + +--- + dlls/winepulse.drv/mmdevdrv.c | 153 ++++++++++++++++++++++++++++++++++ + dlls/winepulse.drv/winepulse.drv.spec | 1 + + 2 files changed, 154 insertions(+) + +diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c +index 37ff7ee..3acbca5 100644 +--- a/dlls/winepulse.drv/mmdevdrv.c ++++ b/dlls/winepulse.drv/mmdevdrv.c +@@ -52,6 +52,7 @@ + #include "initguid.h" + #include "ks.h" + #include "ksmedia.h" ++#include "propkey.h" + #include "mmdeviceapi.h" + #include "audioclient.h" + #include "endpointvolume.h" +@@ -3430,3 +3431,155 @@ HRESULT WINAPI AUDDRV_GetAudioSessionManager(IMMDevice *device, + *out = &This->IAudioSessionManager2_iface; + return S_OK; + } ++ ++enum AudioDeviceConnectionType { ++ AudioDeviceConnectionType_Unknown = 0, ++ AudioDeviceConnectionType_PCI, ++ AudioDeviceConnectionType_USB ++}; ++ ++static HRESULT pulse_set_device_path(pa_proplist *p, int index, GUID *guid, PROPVARIANT *pv) ++{ ++ const char *buffer; ++ enum AudioDeviceConnectionType connection; ++ USHORT vendor_id, product_id; ++ UINT serial_number; ++ ++ static const WCHAR usbformatW[] = { '{','1','}','.','U','S','B','\\','V','I','D','_', ++ '%','0','4','X','&','P','I','D','_','%','0','4','X','\\', ++ '%','u','&','%','0','8','X',0 }; /* "{1}.USB\VID_%04X&PID_%04X\%u&%08X" */ ++ static const WCHAR pciformatW[] = { '{','1','}','.','H','D','A','U','D','I','O','\\','F','U','N','C','_','0','1','&', ++ 'V','E','N','_','%','0','4','X','&','D','E','V','_', ++ '%','0','4','X','\\','%','u','&','%','0','8','X',0 }; /* "{1}.HDAUDIO\FUNC_01&VEN_%04X&DEV_%04X\%u&%08X" */ ++ ++ buffer = pa_proplist_gets(p, PA_PROP_DEVICE_BUS); ++ ++ connection = AudioDeviceConnectionType_Unknown; ++ if (buffer) { ++ if (!strcmp(buffer,"pci")) ++ connection = AudioDeviceConnectionType_PCI; ++ else if (!strcmp(buffer,"usb")) ++ connection = AudioDeviceConnectionType_USB; ++ } ++ ++ if (connection == AudioDeviceConnectionType_Unknown) ++ return E_FAIL; ++ ++ buffer = pa_proplist_gets(p, PA_PROP_DEVICE_VENDOR_ID); ++ if (buffer) ++ vendor_id = strtol(buffer, NULL, 16); ++ else ++ return E_FAIL; ++ ++ buffer = pa_proplist_gets(p, PA_PROP_DEVICE_PRODUCT_ID); ++ if (buffer) ++ product_id = strtol(buffer, NULL, 16); ++ else ++ return E_FAIL; ++ ++ /* As hardly any audio devices have serial numbers, Windows instead ++ appears to use a persistent random number. We emulate this here ++ by instead using the last 8 hex digits of the GUID. */ ++ serial_number = (guid->Data4[4] << 24) | (guid->Data4[5] << 16) | (guid->Data4[6] << 8) | guid->Data4[7]; ++ ++ pv->vt = VT_LPWSTR; ++ pv->u.pwszVal = CoTaskMemAlloc(128 * sizeof(WCHAR)); ++ ++ if (!pv->u.pwszVal) ++ return E_OUTOFMEMORY; ++ ++ if (connection == AudioDeviceConnectionType_USB) ++ sprintfW( pv->u.pwszVal, usbformatW, vendor_id, product_id, index, serial_number); ++ else if (connection == AudioDeviceConnectionType_PCI) ++ sprintfW( pv->u.pwszVal, pciformatW, vendor_id, product_id, index, serial_number); ++ ++ return S_OK; ++} ++ ++typedef struct { ++ const PROPERTYKEY *prop; ++ PROPVARIANT *pv; ++ GUID *guid; ++ HRESULT hr; ++} pulse_prop_values_info_cb_data; ++ ++static const PROPERTYKEY devicepath_key = { /* undocumented? - {b3f8fa53-0004-438e-9003-51a46e139bfc},2 */ ++ {0xb3f8fa53, 0x0004, 0x438e, {0x90, 0x03, 0x51, 0xa4, 0x6e, 0x13, 0x9b, 0xfc}}, 2 ++}; ++ ++static void pulse_prop_values_sink_info_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) ++{ ++ pulse_prop_values_info_cb_data *st = (pulse_prop_values_info_cb_data*)userdata; ++ ++ if (!i) ++ return; ++ ++ if (IsEqualPropertyKey(*st->prop, devicepath_key)) ++ st->hr = pulse_set_device_path(i->proplist, i->index, st->guid, st->pv); ++ else if (IsEqualPropertyKey(*st->prop, PKEY_AudioEndpoint_FormFactor)) { ++ st->pv->vt = VT_UI4; ++ st->pv->u.ulVal = Speakers; ++ ++ st->hr = S_OK; ++ } else ++ st->hr = E_NOTIMPL; ++} ++ ++static void pulse_prop_values_source_info_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) ++{ ++ pulse_prop_values_info_cb_data *st = (pulse_prop_values_info_cb_data*)userdata; ++ ++ if (!i) ++ return; ++ ++ if (IsEqualPropertyKey(*st->prop, devicepath_key)) { ++ st->hr = pulse_set_device_path(i->proplist, i->index, st->guid, st->pv); ++ } else if (IsEqualPropertyKey(*st->prop, PKEY_AudioEndpoint_FormFactor)) { ++ st->pv->vt = VT_UI4; ++ st->pv->u.ulVal = (i->monitor_of_sink == PA_INVALID_INDEX) ? Microphone : LineLevel; ++ ++ st->hr = S_OK; ++ } else ++ st->hr = E_NOTIMPL; ++} ++ ++HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out) ++{ ++ char name[256]; ++ EDataFlow flow; ++ pulse_prop_values_info_cb_data userdata; ++ pa_operation *o; ++ ++ TRACE("%s, (%s,%u), %p\n", wine_dbgstr_guid(guid), wine_dbgstr_guid(&prop->fmtid), prop->pid, out); ++ ++ if (IsEqualGUID(guid, &pulse_render_guid) || IsEqualGUID(guid, &pulse_capture_guid)) ++ return E_NOTIMPL; ++ ++ if (!get_pulse_name_by_guid(guid, name, sizeof(name), &flow)) { ++ WARN("Unknown interface %s\n", debugstr_guid(guid)); ++ return E_NOINTERFACE; ++ } ++ ++ if (!IsEqualPropertyKey(*prop, PKEY_AudioEndpoint_FormFactor) && ++ !IsEqualPropertyKey(*prop, devicepath_key)) { ++ return E_NOTIMPL; ++ } ++ ++ userdata.prop = prop; ++ userdata.pv = out; ++ userdata.guid = guid; ++ userdata.hr = E_FAIL; ++ ++ if (flow == eRender) ++ o = pa_context_get_sink_info_by_name(pulse_ctx, name, &pulse_prop_values_sink_info_cb, &userdata); ++ else ++ o = pa_context_get_source_info_by_name(pulse_ctx, name, &pulse_prop_values_source_info_cb, &userdata); ++ ++ if (!o) ++ return E_FAIL; ++ ++ while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { } ++ pa_operation_unref(o); ++ ++ return userdata.hr; ++} +diff --git a/dlls/winepulse.drv/winepulse.drv.spec b/dlls/winepulse.drv/winepulse.drv.spec +index 612bf46..adda949 100644 +--- a/dlls/winepulse.drv/winepulse.drv.spec ++++ b/dlls/winepulse.drv/winepulse.drv.spec +@@ -3,3 +3,4 @@ + @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs + @ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint + @ stdcall -private GetAudioSessionManager(ptr ptr) AUDDRV_GetAudioSessionManager ++@ stdcall -private GetPropValue(ptr ptr ptr) AUDDRV_GetPropValue +-- +2.0.4 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/0032-winepulse-Replace-busyloop-with-condition-variable-a.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/0032-winepulse-Replace-busyloop-with-condition-variable-a.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/0032-winepulse-Replace-busyloop-with-condition-variable-a.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/0032-winepulse-Replace-busyloop-with-condition-variable-a.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,229 @@ +From 50bcaa20cf33bd5518bdc90be72dd5dbc80fb2aa Mon Sep 17 00:00:00 2001 +From: Sebastian Lackner +Date: Sat, 6 Dec 2014 01:26:04 +0100 +Subject: winepulse: Replace busyloop with condition variable and minor style + fixes. + +--- + dlls/winepulse.drv/mmdevdrv.c | 108 +++++++++++++++++++++++------------------- + 1 file changed, 58 insertions(+), 50 deletions(-) + +diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c +index 146daad..986584c 100644 +--- a/dlls/winepulse.drv/mmdevdrv.c ++++ b/dlls/winepulse.drv/mmdevdrv.c +@@ -817,61 +817,65 @@ struct pulse_all_info_cb_data { + }; + + static void pulse_all_sink_info_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { +- struct pulse_all_info_cb_data *st = (struct pulse_all_info_cb_data*)userdata; ++ struct pulse_all_info_cb_data *st = userdata; + void *tmp; + DWORD len; + +- if (!i) +- return; ++ if (!i) goto out; + + tmp = HeapReAlloc(GetProcessHeap(), 0, st->ids, sizeof(WCHAR*) * (st->num + 1)); +- if (!tmp) return; ++ if (!tmp) goto out; + st->ids = tmp; + + tmp = HeapReAlloc(GetProcessHeap(), 0, st->keys, sizeof(GUID) * (st->num + 1)); +- if (!tmp) return; ++ if (!tmp) goto out; + st->keys = tmp; + + len = MultiByteToWideChar(CP_UTF8, 0, i->description, -1, NULL, 0); +- if (!len) return; ++ if (!len) goto out; + + st->ids[st->num] = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); +- if (!st->ids[st->num]) return; ++ if (!st->ids[st->num]) goto out; + + MultiByteToWideChar(CP_UTF8, 0, i->description, -1, st->ids[st->num], len); + if (!get_device_guid(st->flow, i->name, &(st->keys[st->num]))) + CoCreateGuid(&(st->keys[st->num])); + + st->num++; ++ ++out: ++ pthread_cond_signal(&pulse_cond); + } + + static void pulse_all_source_info_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { +- struct pulse_all_info_cb_data *st = (struct pulse_all_info_cb_data*)userdata; ++ struct pulse_all_info_cb_data *st = userdata; + void *tmp; + DWORD len; + +- if (!i) +- return; ++ if (!i) goto out; + + tmp = HeapReAlloc(GetProcessHeap(), 0, st->ids, sizeof(WCHAR*) * (st->num + 1)); +- if (!tmp) return; ++ if (!tmp) goto out; + st->ids = tmp; + + tmp = HeapReAlloc(GetProcessHeap(), 0, st->keys, sizeof(GUID) * (st->num + 1)); +- if (!tmp) return; ++ if (!tmp) goto out; + st->keys = tmp; + + len = MultiByteToWideChar(CP_UTF8, 0, i->description, -1, NULL, 0); +- if (!len) return; ++ if (!len) goto out; + + st->ids[st->num] = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); +- if (!st->ids[st->num]) return; ++ if (!st->ids[st->num]) goto out; + + MultiByteToWideChar(CP_UTF8, 0, i->description, -1, st->ids[st->num], len); + if (!get_device_guid(st->flow, i->name, &(st->keys[st->num]))) + CoCreateGuid(&(st->keys[st->num])); + + st->num++; ++ ++out: ++ pthread_cond_signal(&pulse_cond); + } + + HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, GUID **keys, +@@ -919,15 +923,17 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, GUID **keys, + st.keys = *keys; + st.num = *num; + ++ pthread_mutex_lock(&pulse_lock); + if (flow == eRender) + o = pa_context_get_sink_info_list(pulse_ctx, &pulse_all_sink_info_cb, &st); + else + o = pa_context_get_source_info_list(pulse_ctx, &pulse_all_source_info_cb, &st); +- +- if (o){ +- while (pa_operation_get_state(o) == PA_OPERATION_RUNNING){ } ++ if (o) { ++ while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); + pa_operation_unref(o); + } ++ pthread_mutex_unlock(&pulse_lock); + + *ids = st.ids; + *keys = st.keys; +@@ -3497,12 +3503,12 @@ static HRESULT pulse_set_device_path(pa_proplist *p, int index, GUID *guid, PROP + return S_OK; + } + +-typedef struct { ++struct pulse_prop_values_info_cb_data { + const PROPERTYKEY *prop; + PROPVARIANT *pv; + GUID *guid; + HRESULT hr; +-} pulse_prop_values_info_cb_data; ++}; + + static const PROPERTYKEY devicepath_key = { /* undocumented? - {b3f8fa53-0004-438e-9003-51a46e139bfc},2 */ + {0xb3f8fa53, 0x0004, 0x438e, {0x90, 0x03, 0x51, 0xa4, 0x6e, 0x13, 0x9b, 0xfc}}, 2 +@@ -3510,45 +3516,46 @@ static const PROPERTYKEY devicepath_key = { /* undocumented? - {b3f8fa53-0004-43 + + static void pulse_prop_values_sink_info_cb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) + { +- pulse_prop_values_info_cb_data *st = (pulse_prop_values_info_cb_data*)userdata; ++ struct pulse_prop_values_info_cb_data *st = userdata; + +- if (!i) +- return; +- +- if (IsEqualPropertyKey(*st->prop, devicepath_key)) +- st->hr = pulse_set_device_path(i->proplist, i->index, st->guid, st->pv); +- else if (IsEqualPropertyKey(*st->prop, PKEY_AudioEndpoint_FormFactor)) { +- st->pv->vt = VT_UI4; +- st->pv->u.ulVal = Speakers; ++ if (i) { ++ if (IsEqualPropertyKey(*st->prop, devicepath_key)) ++ st->hr = pulse_set_device_path(i->proplist, i->index, st->guid, st->pv); ++ else if (IsEqualPropertyKey(*st->prop, PKEY_AudioEndpoint_FormFactor)) { ++ st->pv->vt = VT_UI4; ++ st->pv->u.ulVal = Speakers; ++ st->hr = S_OK; ++ } else ++ st->hr = E_NOTIMPL; ++ } + +- st->hr = S_OK; +- } else +- st->hr = E_NOTIMPL; ++ pthread_cond_signal(&pulse_cond); + } + + static void pulse_prop_values_source_info_cb(pa_context *c, const pa_source_info *i, int eol, void *userdata) + { +- pulse_prop_values_info_cb_data *st = (pulse_prop_values_info_cb_data*)userdata; ++ struct pulse_prop_values_info_cb_data *st = userdata; + +- if (!i) +- return; +- +- if (IsEqualPropertyKey(*st->prop, devicepath_key)) { +- st->hr = pulse_set_device_path(i->proplist, i->index, st->guid, st->pv); +- } else if (IsEqualPropertyKey(*st->prop, PKEY_AudioEndpoint_FormFactor)) { +- st->pv->vt = VT_UI4; +- st->pv->u.ulVal = (i->monitor_of_sink == PA_INVALID_INDEX) ? Microphone : LineLevel; ++ if (i) ++ { ++ if (IsEqualPropertyKey(*st->prop, devicepath_key)) ++ st->hr = pulse_set_device_path(i->proplist, i->index, st->guid, st->pv); ++ else if (IsEqualPropertyKey(*st->prop, PKEY_AudioEndpoint_FormFactor)) { ++ st->pv->vt = VT_UI4; ++ st->pv->u.ulVal = (i->monitor_of_sink == PA_INVALID_INDEX) ? Microphone : LineLevel; ++ st->hr = S_OK; ++ } else ++ st->hr = E_NOTIMPL; ++ } + +- st->hr = S_OK; +- } else +- st->hr = E_NOTIMPL; ++ pthread_cond_signal(&pulse_cond); + } + + HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out) + { ++ struct pulse_prop_values_info_cb_data userdata; + char name[256]; + EDataFlow flow; +- pulse_prop_values_info_cb_data userdata; + pa_operation *o; + + TRACE("%s, (%s,%u), %p\n", wine_dbgstr_guid(guid), wine_dbgstr_guid(&prop->fmtid), prop->pid, out); +@@ -3571,16 +3578,17 @@ HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARI + userdata.guid = guid; + userdata.hr = E_FAIL; + ++ pthread_mutex_lock(&pulse_lock); + if (flow == eRender) + o = pa_context_get_sink_info_by_name(pulse_ctx, name, &pulse_prop_values_sink_info_cb, &userdata); + else + o = pa_context_get_source_info_by_name(pulse_ctx, name, &pulse_prop_values_source_info_cb, &userdata); +- +- if (!o) +- return E_FAIL; +- +- while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) { } +- pa_operation_unref(o); ++ if (o) { ++ while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) ++ pthread_cond_wait(&pulse_cond, &pulse_lock); ++ pa_operation_unref(o); ++ } ++ pthread_mutex_unlock(&pulse_lock); + + return userdata.hr; + } +-- +2.1.3 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/definition 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/winepulse-PulseAudio_Support/definition 2014-12-15 01:08:14.000000000 +0000 @@ -1,3 +1,5 @@ Fixes: [10495] Support for PulseAudio backend for audio Fixes: Allow selection of audio device for PulseAudio backend Fixes: [37042] Implement exclusive mode in PulseAudio backend +Fixes: Fix possible segfault in pulse_rd_loop of PulseAudio backend +Fixes: Add support for GetPropValue to PulseAudio backend diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wininet-encoding/0001-wininet-Allow-Accept-Encoding-for-HTTP-1.0-requests.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wininet-encoding/0001-wininet-Allow-Accept-Encoding-for-HTTP-1.0-requests.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wininet-encoding/0001-wininet-Allow-Accept-Encoding-for-HTTP-1.0-requests.patch 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wininet-encoding/0001-wininet-Allow-Accept-Encoding-for-HTTP-1.0-requests.patch 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1,131 @@ +From b8cd3a50b3b381828b3bc604a8cd6d7d69e8a9cc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michael=20M=C3=BCller?= +Date: Mon, 8 Dec 2014 02:51:30 +0100 +Subject: wininet: Allow Accept-Encoding for HTTP/1.0 requests. + +--- + dlls/wininet/http.c | 22 ++-------------------- + dlls/wininet/tests/http.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 47 insertions(+), 21 deletions(-) + +diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c +index cb30b26..3cda082 100644 +--- a/dlls/wininet/http.c ++++ b/dlls/wininet/http.c +@@ -219,7 +219,6 @@ static LPWSTR HTTP_build_req( LPCWSTR *list, int len ); + static DWORD HTTP_HttpQueryInfoW(http_request_t*, DWORD, LPVOID, LPDWORD, LPDWORD); + static LPWSTR HTTP_GetRedirectURL(http_request_t *req, LPCWSTR lpszUrl); + static UINT HTTP_DecodeBase64(LPCWSTR base64, LPSTR bin); +-static BOOL HTTP_VerifyValidHeader(http_request_t *req, LPCWSTR field); + static BOOL drain_content(http_request_t*,BOOL); + + static CRITICAL_SECTION connection_pool_cs; +@@ -1321,10 +1320,8 @@ static DWORD HTTP_HttpAddRequestHeadersW(http_request_t *request, + pFieldAndValue = HTTP_InterpretHttpHeader(lpszStart); + if (pFieldAndValue) + { +- res = HTTP_VerifyValidHeader(request, pFieldAndValue[0]); +- if (res == ERROR_SUCCESS) +- res = HTTP_ProcessHeader(request, pFieldAndValue[0], +- pFieldAndValue[1], dwModifier | HTTP_ADDHDR_FLAG_REQ); ++ res = HTTP_ProcessHeader(request, pFieldAndValue[0], ++ pFieldAndValue[1], dwModifier | HTTP_ADDHDR_FLAG_REQ); + HTTP_FreeTokens(pFieldAndValue); + } + +@@ -6345,21 +6342,6 @@ static BOOL HTTP_DeleteCustomHeader(http_request_t *request, DWORD index) + + + /*********************************************************************** +- * HTTP_VerifyValidHeader (internal) +- * +- * Verify the given header is not invalid for the given http request +- * +- */ +-static BOOL HTTP_VerifyValidHeader(http_request_t *request, LPCWSTR field) +-{ +- /* Accept-Encoding is stripped from HTTP/1.0 requests. It is invalid */ +- if (!strcmpW(request->version, g_szHttp1_0) && !strcmpiW(field, szAccept_Encoding)) +- return ERROR_HTTP_INVALID_HEADER; +- +- return ERROR_SUCCESS; +-} +- +-/*********************************************************************** + * IsHostInProxyBypassList (@) + * + * Undocumented +diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c +index 98c8d62..ac1b0ba 100644 +--- a/dlls/wininet/tests/http.c ++++ b/dlls/wininet/tests/http.c +@@ -2292,7 +2292,13 @@ static DWORD CALLBACK server_thread(LPVOID param) + } + if (strstr(buffer, "GET /test_premature_disconnect")) + trace("closing connection\n"); +- ++ if (strstr(buffer, "/test_accept_encoding_http10")) ++ { ++ if (strstr(buffer, "Accept-Encoding: gzip")) ++ send(c, okmsg, sizeof okmsg-1, 0); ++ else ++ send(c, notokmsg, sizeof notokmsg-1, 0); ++ } + shutdown(c, 2); + closesocket(c); + c = -1; +@@ -4111,6 +4117,43 @@ static void test_cache_control_verb(int port) + InternetCloseHandle(session); + } + ++static void test_accept_encoding(int port) ++{ ++ HINTERNET ses, con, req; ++ BOOL ret; ++ ++ ses = InternetOpenA("winetest", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); ++ ok(ses != NULL, "InternetOpen failed\n"); ++ ++ con = InternetConnectA(ses, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); ++ ok(con != NULL, "InternetConnect failed\n"); ++ ++ req = HttpOpenRequestA(con, "GET", "/test_accept_encoding_http10", "HTTP/1.0", NULL, NULL, 0, 0); ++ ok(req != NULL, "HttpOpenRequest failed\n"); ++ ++ ret = HttpAddRequestHeadersA(req, "Accept-Encoding: gzip\r\n", ~0u, HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD); ++ ok(ret, "HttpAddRequestHeaders failed\n"); ++ ++ ret = HttpSendRequestA(req, NULL, 0, NULL, 0); ++ ok(ret, "HttpSendRequestA failed\n"); ++ ++ test_status_code(req, 200); ++ ++ InternetCloseHandle(req); ++ ++ req = HttpOpenRequestA(con, "GET", "/test_accept_encoding_http10", "HTTP/1.0", NULL, NULL, 0, 0); ++ ok(req != NULL, "HttpOpenRequest failed\n"); ++ ++ ret = HttpSendRequestA(req, "Accept-Encoding: gzip", ~0u, NULL, 0); ++ ok(ret, "HttpSendRequestA failed\n"); ++ ++ test_status_code(req, 200); ++ ++ InternetCloseHandle(req); ++ InternetCloseHandle(con); ++ InternetCloseHandle(ses); ++} ++ + static void test_http_connection(void) + { + struct server_info si; +@@ -4156,6 +4199,7 @@ static void test_http_connection(void) + test_cache_control_verb(si.port); + test_successive_HttpSendRequest(si.port); + test_head_request(si.port); ++ test_accept_encoding(si.port); + + /* send the basic request again to shutdown the server thread */ + test_basic_request(si.port, "GET", "/quit"); +-- +1.9.1 + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wininet-encoding/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/wininet-encoding/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wininet-encoding/definition 1970-01-01 00:00:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wininet-encoding/definition 2014-12-15 01:08:14.000000000 +0000 @@ -0,0 +1 @@ +Fixes: [37046] wininet should allow Accept-Encoding header for HTTP/1.0 diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wintrust-Reset_hFile/0001-wintrust-Reset-data-pWintrustData-u.pFile-hFile-afte.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/wintrust-Reset_hFile/0001-wintrust-Reset-data-pWintrustData-u.pFile-hFile-afte.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wintrust-Reset_hFile/0001-wintrust-Reset-data-pWintrustData-u.pFile-hFile-afte.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wintrust-Reset_hFile/0001-wintrust-Reset-data-pWintrustData-u.pFile-hFile-afte.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -From 64e1f4ac26867d15c0957c0b0212c9b67a87cb5d Mon Sep 17 00:00:00 2001 -From: Sebastian Lackner -Date: Tue, 25 Nov 2014 21:26:54 +0100 -Subject: wintrust: Reset data->pWintrustData->u.pFile->hFile after closing - handle. - ---- - dlls/wintrust/softpub.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/dlls/wintrust/softpub.c b/dlls/wintrust/softpub.c -index 358ba01..4e8582e 100644 ---- a/dlls/wintrust/softpub.c -+++ b/dlls/wintrust/softpub.c -@@ -1209,7 +1209,11 @@ HRESULT WINAPI SoftpubCleanup(CRYPT_PROVIDER_DATA *data) - if (data->fOpenedFile && - data->pWintrustData->dwUnionChoice == WTD_CHOICE_FILE && - data->pWintrustData->u.pFile) -+ { - CloseHandle(data->pWintrustData->u.pFile->hFile); -+ data->pWintrustData->u.pFile->hFile = INVALID_HANDLE_VALUE; -+ data->fOpenedFile = FALSE; -+ } - - return S_OK; - } --- -2.1.3 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/wintrust-Reset_hFile/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/wintrust-Reset_hFile/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/wintrust-Reset_hFile/definition 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/wintrust-Reset_hFile/definition 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -Fixes: [36257] Wintrust doesn't reset data->pWintrustData->u.pFile->hFile after closing handle diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/ws2_32-IP_Ordering/0001-ws2_32-WS_get_local_ips-Fix-ordering-of-IP-addresses.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/ws2_32-IP_Ordering/0001-ws2_32-WS_get_local_ips-Fix-ordering-of-IP-addresses.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/ws2_32-IP_Ordering/0001-ws2_32-WS_get_local_ips-Fix-ordering-of-IP-addresses.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/ws2_32-IP_Ordering/0001-ws2_32-WS_get_local_ips-Fix-ordering-of-IP-addresses.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -From d35f6c60fc0b58a5a259b386ce7cad10d4ea2688 Mon Sep 17 00:00:00 2001 -From: Joachim Priesner -Date: Tue, 28 Oct 2014 10:20:31 +0100 -Subject: ws2_32: WS_get_local_ips: Fix ordering of IP addresses by metric if - two addresses have the same metric (try 2) - -The previous implementation required the metrics to be mutually inequal -(because of the "this_metric > last_metric" check). If the metrics were -not mutually inequal, it would write only one address per metric value to the list -and fill up the rest of the list with the magic loopback IP address 127.12.34.56. - -Try 2 that uses qsort() as suggested by Ken Thomases. ---- - dlls/ws2_32/socket.c | 38 +++++++++++++++++--------------------- - 1 file changed, 17 insertions(+), 21 deletions(-) - -diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c -index 29ac800..09c175a 100644 ---- a/dlls/ws2_32/socket.c -+++ b/dlls/ws2_32/socket.c -@@ -5167,6 +5167,17 @@ struct WS_hostent* WINAPI WS_gethostbyaddr(const char *addr, int len, int type) - } - - /*********************************************************************** -+ * WS_compare_routes_by_metric_asc (INTERNAL) -+ * -+ * Comparison function for qsort(), for sorting two routes (struct route) -+ * by metric in ascending order. -+ */ -+static int WS_compare_routes_by_metric_asc(const void *left, const void *right) -+{ -+ return ((const struct route*)left)->metric - ((const struct route*)right)->metric; -+} -+ -+/*********************************************************************** - * WS_get_local_ips (INTERNAL) - * - * Returns the list of local IP addresses by going through the network -@@ -5180,7 +5191,7 @@ struct WS_hostent* WINAPI WS_gethostbyaddr(const char *addr, int len, int type) - */ - static struct WS_hostent* WS_get_local_ips( char *hostname ) - { -- int last_metric, numroutes = 0, i, j; -+ int numroutes = 0, i, j; - DWORD n; - PIP_ADAPTER_INFO adapters = NULL, k; - struct WS_hostent *hostlist = NULL; -@@ -5260,30 +5271,15 @@ static struct WS_hostent* WS_get_local_ips( char *hostname ) - hostlist->h_aliases[0] = NULL; /* NULL-terminate the alias list */ - hostlist->h_addrtype = AF_INET; - hostlist->h_length = sizeof(struct in_addr); /* = 4 */ -- /* Reorder the entries when placing them in the host list, Windows expects -+ /* Reorder the entries before placing them in the host list. Windows expects - * the IP list in order from highest priority to lowest (the critical thing - * is that most applications expect the first IP to be the default route). - */ -- last_metric = -1; -- for (i = 0; i < numroutes; i++) -- { -- struct in_addr addr; -- int metric = 0xFFFF; -+ if (numroutes > 1) -+ qsort(route_addrs, numroutes, sizeof(*route_addrs), WS_compare_routes_by_metric_asc); - -- memcpy(&addr, magic_loopback_addr, 4); -- for (j = 0; j < numroutes; j++) -- { -- int this_metric = route_addrs[j].metric; -- -- if (this_metric > last_metric && this_metric < metric) -- { -- addr = route_addrs[j].addr; -- metric = this_metric; -- } -- } -- last_metric = metric; -- (*(struct in_addr *) hostlist->h_addr_list[i]) = addr; -- } -+ for (i = 0; i < numroutes; i++) -+ (*(struct in_addr *) hostlist->h_addr_list[i]) = route_addrs[i].addr; - - /* Cleanup all allocated memory except the address list, - * the address list is used by the calling app. --- -2.1.3 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/ws2_32-IP_Ordering/definition wine-compholio-1.7.33~ubuntu15.04.1/patches/ws2_32-IP_Ordering/definition --- wine-compholio-1.7.32~ubuntu15.04.1/patches/ws2_32-IP_Ordering/definition 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/ws2_32-IP_Ordering/definition 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -Fixes: Fix ordering of IP addresses by metric if two addresses have the same metric. diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/ws2_32-Overlapping_FDS/0001-ws2_32-tests-Fix-several-copy-and-paste-errors.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/ws2_32-Overlapping_FDS/0001-ws2_32-tests-Fix-several-copy-and-paste-errors.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/ws2_32-Overlapping_FDS/0001-ws2_32-tests-Fix-several-copy-and-paste-errors.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/ws2_32-Overlapping_FDS/0001-ws2_32-tests-Fix-several-copy-and-paste-errors.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -From 93eaea5931b6aa60b1d4edf9c39cfc7274c47e39 Mon Sep 17 00:00:00 2001 -From: Sebastian Lackner -Date: Sat, 29 Nov 2014 09:55:39 +0100 -Subject: ws2_32/tests: Fix several copy and paste errors. - ---- - dlls/ws2_32/tests/sock.c | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c -index 106588d..16f98c0 100644 ---- a/dlls/ws2_32/tests/sock.c -+++ b/dlls/ws2_32/tests/sock.c -@@ -3358,14 +3358,14 @@ static void test_select(void) - ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout); - ok(ret == 2, "select returned %d\n", ret); - ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n"); -- ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n"); -+ ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); - - ok(send(fdWrite, "test", 4, 0) == 4, "failed to send data\n"); - FD_ZERO(&readfds); - FD_SET(fdRead, &readfds); - ret = select(fdRead+1, &readfds, NULL, NULL, &select_timeout); - ok(ret == 1, "select returned %d\n", ret); -- ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n"); -+ ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); - - FD_ZERO(&readfds); - FD_SET(fdWrite, &readfds); -@@ -3373,7 +3373,7 @@ static void test_select(void) - ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout); - ok(ret == 2, "select returned %d\n", ret); - ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n"); -- ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n"); -+ ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); - - while(1) { - FD_ZERO(&writefds); -@@ -3388,7 +3388,7 @@ static void test_select(void) - ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout); - ok(ret == 1, "select returned %d\n", ret); - ok(!FD_ISSET(fdWrite, &readfds), "fdWrite socket is in the set\n"); -- ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n"); -+ ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); - - ok(send(fdRead, "test", 4, 0) == 4, "failed to send data\n"); - Sleep(100); -@@ -3398,7 +3398,7 @@ static void test_select(void) - ret = select(maxfd+1, &readfds, &readfds, NULL, &select_timeout); - ok(ret == 2, "select returned %d\n", ret); - ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n"); -- ok(FD_ISSET(fdRead, &readfds), "fdWrite socket is not in the set\n"); -+ ok(FD_ISSET(fdRead, &readfds), "fdRead socket is not in the set\n"); - - closesocket(fdRead); - closesocket(fdWrite); --- -2.1.3 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/patches/ws2_32-Overlapping_FDS/0002-ws2_32-Improve-implementation-of-get_poll_results.patch wine-compholio-1.7.33~ubuntu15.04.1/patches/ws2_32-Overlapping_FDS/0002-ws2_32-Improve-implementation-of-get_poll_results.patch --- wine-compholio-1.7.32~ubuntu15.04.1/patches/ws2_32-Overlapping_FDS/0002-ws2_32-Improve-implementation-of-get_poll_results.patch 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/patches/ws2_32-Overlapping_FDS/0002-ws2_32-Improve-implementation-of-get_poll_results.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -From f99ad6da713e01db0db819cad23c59e3d5ba2886 Mon Sep 17 00:00:00 2001 -From: Sebastian Lackner -Date: Sat, 29 Nov 2014 11:18:18 +0100 -Subject: ws2_32: Improve implementation of get_poll_results. - -The recent commit to allow overlapping fd sets made the implementation a bit ugly - -at some points elements in fds[...] are accessed with j, at other points its accessed -using other indices. By using pointers instead we can make that code look much simpler. ---- - dlls/ws2_32/socket.c | 29 +++++++++++++++-------------- - 1 file changed, 15 insertions(+), 14 deletions(-) - -diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c -index 29ac800..79c5a30 100644 ---- a/dlls/ws2_32/socket.c -+++ b/dlls/ws2_32/socket.c -@@ -4386,36 +4386,37 @@ static void release_poll_fds( const WS_fd_set *readfds, const WS_fd_set *writefd - static int get_poll_results( WS_fd_set *readfds, WS_fd_set *writefds, WS_fd_set *exceptfds, - const struct pollfd *fds ) - { -- unsigned int exceptfds_off = (readfds ? readfds->fd_count : 0) + (writefds ? writefds->fd_count : 0); -- unsigned int i, j = 0, k, total = 0; -+ const struct pollfd *poll_writefds = fds + (readfds ? readfds->fd_count : 0); -+ const struct pollfd *poll_exceptfds = poll_writefds + (writefds ? writefds->fd_count : 0); -+ unsigned int i, k, total = 0; - - if (readfds) - { -- for (i = k = 0; i < readfds->fd_count; i++, j++) -+ for (i = k = 0; i < readfds->fd_count; i++) - { -- -- if (fds[j].revents || -- (readfds==writefds && (fds[readfds->fd_count+i].revents & POLLOUT) && -- !(fds[readfds->fd_count+i].revents & POLLHUP)) || -- (readfds==exceptfds && fds[exceptfds_off+i].revents)) -+ if (fds[i].revents || -+ (readfds == writefds && (poll_writefds[i].revents & POLLOUT) && !(poll_writefds[i].revents & POLLHUP)) || -+ (readfds == exceptfds && poll_exceptfds[i].revents)) - readfds->fd_array[k++] = readfds->fd_array[i]; - } - readfds->fd_count = k; - total += k; - } -- if (writefds && writefds!=readfds) -+ if (writefds && writefds != readfds) - { -- for (i = k = 0; i < writefds->fd_count; i++, j++) -- if (((fds[j].revents & POLLOUT) && !(fds[j].revents & POLLHUP)) || -- (writefds==exceptfds && fds[exceptfds_off+i].revents)) -+ for (i = k = 0; i < writefds->fd_count; i++) -+ { -+ if (((poll_writefds[i].revents & POLLOUT) && !(poll_writefds[i].revents & POLLHUP)) || -+ (writefds == exceptfds && poll_exceptfds[i].revents)) - writefds->fd_array[k++] = writefds->fd_array[i]; -+ } - writefds->fd_count = k; - total += k; - } -- if (exceptfds && exceptfds!=readfds && exceptfds!=writefds) -+ if (exceptfds && exceptfds != readfds && exceptfds != writefds) - { - for (i = k = 0; i < exceptfds->fd_count; i++) -- if (fds[exceptfds_off+i].revents) exceptfds->fd_array[k++] = exceptfds->fd_array[i]; -+ if (poll_exceptfds[i].revents) exceptfds->fd_array[k++] = exceptfds->fd_array[i]; - exceptfds->fd_count = k; - total += k; - } --- -2.1.3 - diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/po/pl.po wine-compholio-1.7.33~ubuntu15.04.1/po/pl.po --- wine-compholio-1.7.32~ubuntu15.04.1/po/pl.po 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/po/pl.po 2014-12-15 00:45:34.000000000 +0000 @@ -1,12 +1,12 @@ # Polish translations for Wine # -# Łukasz Wojniłowicz , 2011, 2012, 2013. +# Łukasz Wojniłowicz , 2011, 2012, 2013, 2014. msgid "" msgstr "" "Project-Id-Version: Wine\n" "Report-Msgid-Bugs-To: http://bugs.winehq.org\n" "POT-Creation-Date: N/A\n" -"PO-Revision-Date: 2013-10-05 16:55+0200\n" +"PO-Revision-Date: 2014-11-29 07:31+0100\n" "Last-Translator: Łukasz Wojniłowicz \n" "Language-Team: Polish \n" "Language: Polish\n" @@ -31,7 +31,7 @@ #: appwiz.rc:62 msgid "&Install..." -msgstr "&Zainstaluj..." +msgstr "Za&instaluj..." #: appwiz.rc:65 msgid "" @@ -49,7 +49,7 @@ #: appwiz.rc:68 regedit.rc:45 regedit.rc:90 msgid "&Modify..." -msgstr "&Modyfikuj..." +msgstr "Z&mień..." #: appwiz.rc:69 appwiz.rc:45 cryptui.rc:346 msacm32.rc:40 winecfg.rc:194 #: winecfg.rc:231 wordpad.rc:248 @@ -110,7 +110,7 @@ #: appwiz.rc:86 msgid "Product Updates:" -msgstr "Aktualizacje produktu:" +msgstr "Uaktualnienia produktu:" #: appwiz.rc:87 msgid "Comments:" @@ -131,16 +131,15 @@ "details." msgstr "" "Nie znaleziono paczki Gecko potrzebnej do prawidłowego działania aplikacji " -"zawierających kod HTML. Wine może automatycznie pobrać i zainstalować tą " -"paczkę dla ciebie.\n" +"zawierających kod HTML. Wine może sam pobrać i zainstalować tą paczkę dla " +"ciebie.\n" "\n" -"Uwaga: Lepiej jednak użyć paczki z twojej dystrybucji. Po szczegóły zajrzyj " -"na http://wiki.winehq.org/Gecko " -"po szczegóły." +"Uwaga: Zalecamy użycie paczki z twojej dystrybucji. Po szczegóły zajrzyj na " +"http://wiki.winehq.org/Gecko." #: appwiz.rc:109 appwiz.rc:124 msgid "&Install" -msgstr "&Zainstaluj" +msgstr "Za&instaluj" #: appwiz.rc:110 appwiz.rc:125 avifil32.rc:55 browseui.rc:40 comctl32.rc:56 #: comctl32.rc:71 comdlg32.rc:170 comdlg32.rc:192 comdlg32.rc:210 @@ -175,12 +174,12 @@ "href=\"http://wiki.winehq.org/Mono\">http://wiki.winehq.org/Mono for " "details." msgstr "" -"Nie znaleziono paczki Mono potrzebnej do prawidłowego działania aplikacji ." -"NET. Wine może automatycznie pobrać i zainstalować tą paczkę dla ciebie.\n" +"Nie znaleziono paczki Mono potrzebnej do prawidłowego działania " +"aplikacjiNET. Wine może sam pobrać i zainstalować tę paczkę dla ciebie.\n" "\n" -"Uwaga: Lepiej jednak użyć paczki z twojej dystrybucji. Po szczegóły zajrzyj " -"na http://wiki.winehq.org/Mono " -"po szczegóły." +"Uwaga: Zalecamy użycie paczki z twojej dystrybucji. Po szczegóły zajrzyj na " +"stronę http://wiki.winehq.org/Mono." #: appwiz.rc:31 msgid "Add/Remove Programs" @@ -237,7 +236,7 @@ #: appwiz.rc:46 msgid "&Modify/Remove" -msgstr "&Zmień/Usuń" +msgstr "Z&mień/Usuń" #: appwiz.rc:51 msgid "Downloading..." @@ -305,7 +304,7 @@ #: avifil32.rc:37 msgid "uncompressed" -msgstr "nie skompresowany" +msgstr "nieskompresowany" #: browseui.rc:28 msgid "Canceling..." @@ -313,11 +312,11 @@ #: comctl32.rc:52 winefile.rc:160 msgid "Properties for %s" -msgstr "Właściwości: %s" +msgstr "Właściwości dla %s" #: comctl32.rc:57 comdlg32.rc:263 msgid "&Apply" -msgstr "&Zastosuj" +msgstr "Z&astosuj" #: comctl32.rc:58 comctl32.rc:72 comdlg32.rc:306 user32.rc:89 msgid "Help" @@ -333,7 +332,7 @@ #: comctl32.rc:69 msgid "&Next >" -msgstr "&Dalej >" +msgstr "&Naprzód >" #: comctl32.rc:70 msgid "Finish" @@ -468,7 +467,7 @@ #: comdlg32.rc:211 comdlg32.rc:233 msgid "&Setup" -msgstr "&Ustawienia" +msgstr "U&stawienia" #: comdlg32.rc:212 msgid "&From:" @@ -512,11 +511,11 @@ #: comdlg32.rc:234 comdlg32.rc:420 comdlg32.rc:439 wineps.rc:34 msgid "Orientation" -msgstr "Orientacja" +msgstr "Kierunek" #: comdlg32.rc:235 msgid "Po&rtrait" -msgstr "W p&ionie" +msgstr "P&ionowo" #: comdlg32.rc:236 comdlg32.rc:441 wineps.rc:37 msgid "&Landscape" @@ -528,7 +527,7 @@ #: comdlg32.rc:240 msgid "Si&ze" -msgstr "&Wielkość" +msgstr "Ro&zmiar" #: comdlg32.rc:241 msgid "&Source" @@ -544,7 +543,7 @@ #: comdlg32.rc:255 msgid "Font St&yle:" -msgstr "&Styl:" +msgstr "K&rój czcionki:" #: comdlg32.rc:258 comdlg32.rc:435 winecfg.rc:283 msgid "&Size:" @@ -618,7 +617,7 @@ #: comdlg32.rc:307 msgid "&Add to Custom Colors" -msgstr "&Dodaj do własnych kolorów" +msgstr "Dod&aj do własnych kolorów" #: comdlg32.rc:308 msgid "&Define Custom Colors >>" @@ -630,7 +629,7 @@ #: comdlg32.rc:318 comdlg32.rc:337 msgid "Fi&nd What:" -msgstr "&Znajdź:" +msgstr "Z&najdź:" #: comdlg32.rc:320 comdlg32.rc:341 msgid "Match &Whole Word Only" @@ -691,7 +690,7 @@ #: comdlg32.rc:369 comdlg32.rc:407 msgid "Type:" -msgstr "Typ:" +msgstr "Rodzaj:" #: comdlg32.rc:371 comdlg32.rc:409 msgid "Where:" @@ -855,7 +854,7 @@ #: comdlg32.rc:40 msgid "The selection contains a non-folder object" -msgstr "" +msgstr "Zaznaczenie zawiera obiekt, który nie jest katalogiem" #: comdlg32.rc:45 msgid "Up One Level" @@ -863,7 +862,7 @@ #: comdlg32.rc:46 msgid "Create New Folder" -msgstr "Utwórz nowy folder" +msgstr "Utwórz nowy katalog" #: comdlg32.rc:47 msgid "List" @@ -1032,11 +1031,11 @@ #: comdlg32.rc:142 ieframe.rc:35 msgid "&Save" -msgstr "&Zapisz" +msgstr "Zapi&sz" #: comdlg32.rc:143 msgid "Save &in:" -msgstr "Zapisz &w:" +msgstr "Zap&isz w:" #: comdlg32.rc:144 msgid "Save" @@ -1047,10 +1046,8 @@ msgstr "Otwórz plik" #: comdlg32.rc:147 -#, fuzzy -#| msgid "New Folder" msgid "Select Folder" -msgstr "Nowy Folder" +msgstr "Zaznacz katalog" #: comdlg32.rc:83 oleview.rc:98 msgid "Ready" @@ -2195,7 +2192,7 @@ "\n" "To continue, click Next." msgstr "" -"Asystent ten pomaga tobie importować certyfikaty, listy odwołania " +"Pomocnik ten pomaga tobie importować certyfikaty, listy odwołania " "certyfikatów, i listy zaufania certyfikatów z pliku do magazynu " "certyfikatów.\n" "\n" @@ -2333,7 +2330,7 @@ "\n" "To continue, click Next." msgstr "" -"Asystent ten pomaga tobie eksportować certyfikaty, listy odwołania " +"Pomocnik ten pomaga tobie eksportować certyfikaty, listy odwołania " "certyfikatów, i listy zaufania certyfikatów z magazynu certyfikatów do " "pliku.\n" "\n" @@ -2964,7 +2961,7 @@ #: dinput.rc:43 msgid "Configure Devices" -msgstr "Konfiguruj Urządzenia" +msgstr "Ustawienia urządzeń" #: dinput.rc:48 msgid "Reset" @@ -3424,9 +3421,7 @@ #: inetcpl.rc:32 msgid "Configure Wine Internet Browser and related settings" -msgstr "" -"Pozwala skonfigurować przeglądarkę internetową Wine i odpowiadające jej " -"ustawienia" +msgstr "Ustawianie przeglądarkę internetową Wine i związanych z nią opcji" #: inetcpl.rc:33 msgid "Security settings for zone: " @@ -3486,7 +3481,7 @@ #: joy.rc:50 msgid "Test Joystick" -msgstr "Testuj Joystick" +msgstr "Próba Joysticka" #: joy.rc:54 msgid "Buttons" @@ -3494,7 +3489,7 @@ #: joy.rc:63 msgid "Test Force Feedback" -msgstr "Testuj odczucie siły zwrotnej" +msgstr "Próba odczucia siły zwrotnej" #: joy.rc:67 msgid "Available Effects" @@ -3550,27 +3545,23 @@ #: jscript.rc:37 msgid "Expected ';'" -msgstr "Oczekiwane ';'" +msgstr "Oczekiwano ';'" #: jscript.rc:38 msgid "Expected '('" -msgstr "Oczekiwane '('" +msgstr "Oczekiwano '('" #: jscript.rc:39 msgid "Expected ')'" -msgstr "Oczekiwane ')'" +msgstr "Oczekiwano ')'" #: jscript.rc:40 -#, fuzzy -#| msgid "Subject Key Identifier" msgid "Expected identifier" -msgstr "Identyfikator klucza podmiotu" +msgstr "Oczekiwano identyfikatora" #: jscript.rc:41 -#, fuzzy -#| msgid "Expected ';'" msgid "Expected '='" -msgstr "Oczekiwane ';'" +msgstr "Oczekiwano ';'" #: jscript.rc:42 msgid "Invalid character" @@ -3601,20 +3592,16 @@ msgstr "Nie znaleziono etykiety" #: jscript.rc:49 -#, fuzzy -#| msgid "Expected ';'" msgid "Expected '@end'" -msgstr "Oczekiwane ';'" +msgstr "Oczekiwano '@end'" #: jscript.rc:50 msgid "Conditional compilation is turned off" msgstr "Warunkowa kompilacja jest wyłączona" #: jscript.rc:51 -#, fuzzy -#| msgid "Expected ';'" msgid "Expected '@'" -msgstr "Oczekiwane ';'" +msgstr "Oczekiwano '@'" #: jscript.rc:54 msgid "Number expected" @@ -3750,7 +3737,7 @@ #: winerror.mc:106 msgid "Can't delete current directory.\n" -msgstr "Nie można usunąć aktualnego folderu.\n" +msgstr "Nie można usunąć aktualnego katalogu.\n" #: winerror.mc:111 msgid "Not same device.\n" @@ -4126,11 +4113,11 @@ #: winerror.mc:586 msgid "Not top-level directory.\n" -msgstr "Folder nienadrzędny.\n" +msgstr "Katalog nienadrzędny.\n" #: winerror.mc:591 msgid "Directory is not empty.\n" -msgstr "Folder nie jest pusty.\n" +msgstr "Katalog nie jest pusty.\n" #: winerror.mc:596 msgid "Path is in use as a SUBST.\n" @@ -4386,7 +4373,7 @@ #: winerror.mc:911 msgid "Directory name invalid.\n" -msgstr "Niepoprawna nazwa folderu.\n" +msgstr "Niepoprawna nazwa katalogu.\n" #: winerror.mc:916 msgid "Extended attributes didn't fit.\n" @@ -4654,7 +4641,7 @@ #: winerror.mc:1246 msgid "System running last-known-good config.\n" -msgstr "System uruchomiony na ostatniej dobrej konfiguracji.\n" +msgstr "System uruchomiony na ostatnich dobrych ustawieniach.\n" #: winerror.mc:1251 msgid "Service dependency deleted.\n" @@ -4662,7 +4649,7 @@ #: winerror.mc:1256 msgid "Boot already accepted as last-good config.\n" -msgstr "Boot już zaakceptował jako ostatnią dobrą konfigurację.\n" +msgstr "Boot już przyjął jako ostatnie dobre ustawienia.\n" #: winerror.mc:1261 msgid "Service not started since last boot.\n" @@ -4749,10 +4736,8 @@ msgstr "Brak tłumaczenia Unicode.\n" #: winerror.mc:1366 -#, fuzzy -#| msgid "DLL init failed.\n" msgid "DLL initialization failed.\n" -msgstr "Nieudana inicjalizacja biblioteki DLL.\n" +msgstr "Nieudana inicjacja biblioteki DLL.\n" #: winerror.mc:1371 msgid "Shutdown in progress.\n" @@ -4760,7 +4745,7 @@ #: winerror.mc:1376 msgid "No shutdown in progress.\n" -msgstr "Zamykanie nie postępuje.\n" +msgstr "Brak zamykania w toku.\n" #: winerror.mc:1381 msgid "I/O device error.\n" @@ -5540,7 +5525,7 @@ #: winerror.mc:2361 msgid "File or directory corrupt.\n" -msgstr "Plik lub folder zepsuty.\n" +msgstr "Plik lub katalog zepsuty.\n" #: winerror.mc:2366 msgid "Disk is corrupt.\n" @@ -5868,7 +5853,7 @@ #: winerror.mc:2771 msgid "Bad configuration.\n" -msgstr "Zła konfiguracja.\n" +msgstr "Złe ustawienia.\n" #: winerror.mc:2776 msgid "Index is missing.\n" @@ -6060,7 +6045,7 @@ #: winerror.mc:3011 msgid "Unknown manager type.\n" -msgstr "Nieznany typ menedżera.\n" +msgstr "Nieznany rodzaj programu zarządzającego.\n" #: winerror.mc:3016 msgid "Unknown interface.\n" @@ -6639,16 +6624,12 @@ msgstr "Nie można było znaleźć użytkownika.\n" #: winerror.mc:3741 -#, fuzzy -#| msgid "The site does not exist.\n" msgid "This network connection does not exist.\n" -msgstr "Strona nie istnieje.\n" +msgstr "Połączenie sieciowe nie istnieje.\n" #: winerror.mc:3746 -#, fuzzy -#| msgid "Connection refused.\n" msgid "Connection reset by peer.\n" -msgstr "Połączenie odmówiło.\n" +msgstr "Połączenie wyzerowane przez uczestnika.\n" #: localspl.rc:31 localui.rc:31 winspool.rc:30 msgid "Local Port" @@ -6668,7 +6649,7 @@ #: localui.rc:51 msgid "Configure LPT Port" -msgstr "Konfiguracja portu LPT" +msgstr "Ustawienia portu LPT" #: localui.rc:54 msgid "Timeout (seconds)" @@ -6676,7 +6657,7 @@ #: localui.rc:55 msgid "&Transmission Retry:" -msgstr "&Ponowienie transmisji:" +msgstr "Ponowienie &transmisji:" #: localui.rc:32 msgid "'%s' is not a valid port name" @@ -6688,7 +6669,7 @@ #: localui.rc:34 msgid "This port has no options to configure" -msgstr "Ten port nie ma opcji do skonfigurowania" +msgstr "Ten port nie ma opcji do ustawienia" #: mapi32.rc:31 msgid "Mail sending failed as you do not have a MAPI mail client installed." @@ -6846,13 +6827,13 @@ "\t/y\n" "Wyrejestruj usługę MSI:\n" "\t/z\n" -"Wyświetl tą pomoc:\n" +"Wyświetl tę pomoc:\n" "\t/help\n" "\t/?\n" #: msi.rc:60 msgid "enter which folder contains %s" -msgstr "podaj, który folder zawiera '%s'" +msgstr "podaj, który katalog zawiera '%s'" #: msi.rc:61 msgid "install source for feature missing" @@ -6892,7 +6873,7 @@ #: msvfw32.rc:42 msgid "Con&figure..." -msgstr "Kon&figuruj..." +msgstr "U&stawienia..." #: msvfw32.rc:43 msgid "&About" @@ -7183,206 +7164,164 @@ msgstr "przycisk zarysu" #: oleacc.rc:97 -#, fuzzy -#| msgid "Normal" msgctxt "object state" msgid "normal" -msgstr "Normalne" +msgstr "normalny" #: oleacc.rc:98 -#, fuzzy -#| msgid "Unavailable" msgctxt "object state" msgid "unavailable" -msgstr "Niedostępny" +msgstr "niedostępny" #: oleacc.rc:99 -#, fuzzy -#| msgid "Select" msgctxt "object state" msgid "selected" -msgstr "Zaznacz" +msgstr "zaznaczony" #: oleacc.rc:100 -#, fuzzy -#| msgid "Paused" msgctxt "object state" msgid "focused" -msgstr "Wstrzymano" +msgstr "uaktywniony" #: oleacc.rc:101 -#, fuzzy -#| msgid "&Compressed" msgctxt "object state" msgid "pressed" -msgstr "S&kompresowany" +msgstr "naciśnięty" #: oleacc.rc:102 msgctxt "object state" msgid "checked" -msgstr "" +msgstr "sprawdzony" #: oleacc.rc:103 -#, fuzzy -#| msgid "Mixed" msgctxt "object state" msgid "mixed" -msgstr "Mieszane" +msgstr "mieszany" #: oleacc.rc:104 -#, fuzzy -#| msgid "&Read Only" msgctxt "object state" msgid "read only" -msgstr "Tylko do &odczytu" +msgstr "tylko-do-odczytu" #: oleacc.rc:105 -#, fuzzy -#| msgid "Hot Tracked Item" msgctxt "object state" msgid "hot tracked" -msgstr "Śledzony element" +msgstr "śledzony-na-gorąco" #: oleacc.rc:106 -#, fuzzy -#| msgid "Defaults" msgctxt "object state" msgid "default" -msgstr "Domyślne" +msgstr "domyślny" #: oleacc.rc:107 msgctxt "object state" msgid "expanded" -msgstr "" +msgstr "rozwinięty" #: oleacc.rc:108 msgctxt "object state" msgid "collapsed" -msgstr "" +msgstr "zwinięty" #: oleacc.rc:109 msgctxt "object state" msgid "busy" -msgstr "" +msgstr "zajęty" #: oleacc.rc:110 msgctxt "object state" msgid "floating" -msgstr "" +msgstr "pływający" #: oleacc.rc:111 msgctxt "object state" msgid "marqueed" -msgstr "" +msgstr "oznaczony" #: oleacc.rc:112 -#, fuzzy -#| msgid "animation" msgctxt "object state" msgid "animated" -msgstr "animacja" +msgstr "animowany" #: oleacc.rc:113 msgctxt "object state" msgid "invisible" -msgstr "" +msgstr "niewidoczny" #: oleacc.rc:114 msgctxt "object state" msgid "offscreen" -msgstr "" +msgstr "poza-ekranem" #: oleacc.rc:115 -#, fuzzy -#| msgid "&enable" msgctxt "object state" msgid "sizeable" -msgstr "&Udostępnij" +msgstr "do-skalowania" #: oleacc.rc:116 -#, fuzzy -#| msgid "&enable" msgctxt "object state" msgid "moveable" -msgstr "&Udostępnij" +msgstr "do-przesunięcia" #: oleacc.rc:117 msgctxt "object state" msgid "self voicing" -msgstr "" +msgstr "samo-mówiący" #: oleacc.rc:118 -#, fuzzy -#| msgid "Paused" msgctxt "object state" msgid "focusable" -msgstr "Wstrzymano" +msgstr "do-uaktywnienia" #: oleacc.rc:119 -#, fuzzy -#| msgid "table" msgctxt "object state" msgid "selectable" -msgstr "tabela" +msgstr "do-zaznaczenia" #: oleacc.rc:120 -#, fuzzy -#| msgid "link" msgctxt "object state" msgid "linked" -msgstr "dowiązanie" +msgstr "dowiązany" #: oleacc.rc:121 msgctxt "object state" msgid "traversed" -msgstr "" +msgstr "przestawiony" #: oleacc.rc:122 -#, fuzzy -#| msgid "table" msgctxt "object state" msgid "multi selectable" -msgstr "tabela" +msgstr "do-wielokrotnego-zaznaczenia" #: oleacc.rc:123 -#, fuzzy -#| msgid "Please select a file." msgctxt "object state" msgid "extended selectable" -msgstr "Proszę wybrać plik." +msgstr "do-zaznaczania-z-rozwijaniem" #: oleacc.rc:124 -#, fuzzy -#| msgid "alert" msgctxt "object state" msgid "alert low" -msgstr "ostrzeżenie" +msgstr "niskiej-czujności" #: oleacc.rc:125 -#, fuzzy -#| msgid "alert" msgctxt "object state" msgid "alert medium" -msgstr "ostrzeżenie" +msgstr "średniej-czujności" #: oleacc.rc:126 -#, fuzzy -#| msgid "alert" msgctxt "object state" msgid "alert high" -msgstr "ostrzeżenie" +msgstr "wysokiej-czujności" #: oleacc.rc:127 -#, fuzzy -#| msgid "Write protected.\n" msgctxt "object state" msgid "protected" -msgstr "Zapis chroniony.\n" +msgstr "chroniony" #: oleacc.rc:128 msgctxt "object state" msgid "has popup" -msgstr "" +msgstr "ma-okno-wysuwne" #: oleaut32.rc:30 oleview.rc:147 msgid "True" @@ -7406,7 +7345,7 @@ #: oledlg.rc:57 msgid "Object Type:" -msgstr "Typ obiektu:" +msgstr "Rodzaj obiektu:" #: oledlg.rc:60 oledlg.rc:98 msgid "Result" @@ -7845,11 +7784,11 @@ #: shdoclc.rc:202 msgid "Debug Break" -msgstr "Przerwanie debugowania" +msgstr "Przerwanie diagnozowania" #: shdoclc.rc:203 msgid "Debug View" -msgstr "Widok debugowania" +msgstr "Widok diagnostyczny" #: shdoclc.rc:204 msgid "Dump Tree" @@ -8008,7 +7947,7 @@ #: shell32.rc:69 msgid "New &Folder" -msgstr "Nowy &Folder" +msgstr "Nowy &Katalog" #: shell32.rc:70 msgid "New &Link" @@ -8054,15 +7993,15 @@ #: shell32.rc:273 shell32.rc:288 msgid "Browse for Folder" -msgstr "Wybierz folder" +msgstr "Wybierz katalog" #: shell32.rc:293 msgid "Folder:" -msgstr "Folder:" +msgstr "Katalog:" #: shell32.rc:299 msgid "&Make New Folder" -msgstr "&Utwórz nowy folder" +msgstr "&Utwórz nowy katalog" #: shell32.rc:306 msgid "Message" @@ -8122,7 +8061,7 @@ #: shell32.rc:140 msgid "Modified" -msgstr "Zmodyfikowany" +msgstr "Zmieniony" #: shell32.rc:141 winefile.rc:175 winefile.rc:114 msgid "Attributes" @@ -8364,7 +8303,7 @@ "\n" "Do you want to replace it?" msgstr "" -"Ten folder już zawiera plik o nazwie '%1'.\n" +"Ten katalog już zawiera plik o nazwie '%1'.\n" "\n" "Czy chcesz go zastąpić?" @@ -8376,7 +8315,7 @@ msgid "" "Are you sure that you want to send '%1' and all its content to the Trash?" msgstr "" -"Czy jesteś pewien, że chcesz umieścić folder '%1' i całą jego zawartość w " +"Czy jesteś pewien, że chcesz umieścić katalog '%1' i całą jego zawartość w " "koszu?" #: shell32.rc:176 @@ -8400,16 +8339,16 @@ "selected folder they will be replaced. Do you still want to move or copy\n" "the folder?" msgstr "" -"Ten folder już zawiera folder o nazwie '%1'.\n" +"Ten katalog już zawiera katalog o nazwie '%1'.\n" "\n" -"Jeżeli w docelowym folderze wystąpią pliki o takich samych nazwach jak\n" -"w wybranym folderze, to zostaną one zastąpione. Czy chcesz mimo to " +"Jeżeli w docelowym katalogu wystąpią pliki o takich samych nazwach jak\n" +"w wybranym katalogu, to zostaną one zastąpione. Czy chcesz mimo to " "przenieść\n" -"lub skopiować folder?" +"lub skopiować katalog?" #: shell32.rc:238 msgid "New Folder" -msgstr "Nowy Folder" +msgstr "Nowy Katalog" #: shell32.rc:240 msgid "Wine Control Panel" @@ -8484,12 +8423,11 @@ "along with Wine; if not, write to the Free Software Foundation, Inc., 51 " "Franklin St, Fifth Floor, Boston, MA 02110-1301, USA." msgstr "" -"Wine jest wolnym oprogramowaniem; wolno ci je rozpowszechniać i/lub " -"modyfikować zgodnie z warunkami zawartymi w GNU Lesser General Public " -"License (z ang. Mniejsza Powszechna Licencja Publiczna GNU) opublikowanej " -"przez Free Software Foundation (z ang. Fundacja Wolnego Oprogramowania); " -"albo w wersji 2.1 licencji, lub (do twojego wyboru) jakiejkolwiek " -"późniejszej wersji.\n" +"Wine jest wolnym oprogramowaniem; wolno ci je rozpowszechniać i/lub zmieniać " +"zgodnie z warunkami zawartymi w GNU Lesser General Public License (z ang. " +"Mniejsza Powszechna Licencja Publiczna GNU) opublikowanej przez Free " +"Software Foundation (z ang. Fundacja Wolnego Oprogramowania); albo w wersji " +"2.1 licencji, lub (do twojego wyboru) jakiejkolwiek późniejszej wersji.\n" "\n" "Wine jest rozpowszechniany w nadziei, że będzie użyteczny, ale BEZ ŻADNEJ " "GWARANCJI; nawet bez odpowiedzialności za dorozumianą gwarancję " @@ -9939,7 +9877,7 @@ "\n" "SET bez parametrów wyświetla wszystkie ustawione zmienne.\n" "\n" -"Składnia polecenia (by utworzyć lub zmodyfikować zmienną:\n" +"Składnia polecenia (by utworzyć lub zmienić zmienną:\n" "\n" "SET =\n" "\n" @@ -9949,7 +9887,7 @@ "\n" "Pod Wine'em zmienne środowiskowe systemu operacyjnego są dodawane do\n" "zmiennych środowiskowych Win32, z tego powodu jest więcej zmiennych niż\n" -"w implementacji Win32. Wine nie modyfikuje zmiennych środowiskowych\n" +"w implementacji Win32. Wine nie zmienia zmiennych środowiskowych\n" "systemu.\n" #: cmd.rc:211 @@ -10017,7 +9955,7 @@ "/unix Użyj nazwy pliku ze ścieżka z Uniksa i uruchom plik tak jak " "windows explorer.\n" "/ProgIDOpen Otwórz dokument używając podanego progID.\n" -"/? Wyświetl tą pomoc i wyjdź.\n" +"/? Wyświetl tę pomoc i wyjdź.\n" #: cmd.rc:213 msgid "TIME sets or shows the current system time.\n" @@ -10110,15 +10048,15 @@ "Specifying no file type after the equal sign removes the current " "association, if any.\n" msgstr "" -"ASSOC pokazuje lub modyfikuje skojarzenia rozszerzenia pliku\n" +"ASSOC pokazuje lub zmienia skojarzenia rozszerzenia pliku\n" "\n" "Składnia: ASSOC [.ext[=[typPliku]]]\n" "\n" "ASSOC bez parametrów wyświetla obecne skojarzenia pliku.\n" "Jeżeli użyte tylko z jednym rozszerzeniem pliku, to pokazuje obecne " "skojarzenie.\n" -"Nie określanie typu pliku po znaku równości usuwa obecne skojarzenie, jeśli " -"jakiekolwiek istnieje.\n" +"Nie określanie rodzaju pliku po znaku równości usuwa obecne skojarzenie, " +"jeśli jakiekolwiek istnieje.\n" #: cmd.rc:269 msgid "" @@ -10133,16 +10071,16 @@ "Specifying no open command after the equal sign removes the command string " "associated to the specified file type.\n" msgstr "" -"FTYPE pokazuje lub modyfikuje polecenia otwarcia skojarzone z typami plików\n" +"FTYPE pokazuje lub zmienia polecenia otwarcia skojarzone z typami plików\n" "\n" "Składnia: FTYPE [typPliku[=[polecenieOtwarcia]]]\n" "\n" -"Bez parametrów, pokazuje typy plików, dla który są obecnie określone " +"Bez parametrów, pokazuje rodzaje plików, dla których są obecnie określone " "polecenia otwarcia.\n" -"Jeżeli użyte tylko z jednym typem pliku, to pokazuje jego skojarzone " +"Jeżeli użyte tylko z jednym rodzajem pliku, to pokazuje jego skojarzone " "polecenie otwarcia, jeśli jakiekolwiek istnieje.\n" "Nie określanie polecenia otwarcia po znaku równości usuwa ciąg znaków " -"polecenia skojarzony z określonym typem pliku.\n" +"polecenia skojarzony z danym rodzajem pliku.\n" #: cmd.rc:271 msgid "MORE displays output of files or piped input in pages.\n" @@ -10208,7 +10146,7 @@ "Enter HELP for further information on any of the above commands.\n" msgstr "" "Wbudowane polecenia CMD to:\n" -"ASSOC\t\tPokazuje lub modyfikuje skojarzenia rozszerzeń plików\n" +"ASSOC\t\tPokazuje lub zmienia skojarzenia rozszerzeń plików\n" "ATTRIB\t\tPokazuje lub zmienia atrybuty pliku\n" "CALL\t\tWywołuje plik bat z innego pliku\n" "CD (CHDIR)\tZmienia bieżący katalog\n" @@ -10221,8 +10159,7 @@ "DIR\t\tWyświetla zawartość katalogu\n" "ECHO\t\tKopiuje tekst na wyjście konsoli\n" "ENDLOCAL\tKoniec zmiany ustawień regionalnych środowiska w pliku wsadowym\n" -"FTYPE\t\tPokazuje lub modyfikuje polecenia otwarcia skojarzone z typami " -"plików\n" +"FTYPE\t\tPokazuje lub zmienia polecenia otwarcia skojarzone z typami plików\n" "HELP\t\tWyświetla dokładniejszą pomoc o komendzie\n" "MD (MKDIR)\tTworzy katalog\n" "MORE\t\tWyświetla wyjście strona po stronie\n" @@ -10378,7 +10315,7 @@ #: cmd.rc:351 msgid "Microsoft Windows %1!S!\n" -msgstr "" +msgstr "Microsoft Windows %1!S!\n" #: cmd.rc:352 msgid "More? " @@ -10449,10 +10386,8 @@ msgstr "Wine Explorer" #: explorer.rc:33 -#, fuzzy -#| msgid "StartUp" msgid "Start" -msgstr "Autostart" +msgstr "Start" #: explorer.rc:34 winefile.rc:36 msgid "&Run..." @@ -10600,7 +10535,7 @@ #: net.rc:35 msgid "Could not get handle to service control manager.\n" -msgstr "Nie udało się otrzymać uchwytu do menedżera serwisów.\n" +msgstr "Nie udało się otrzymać uchwytu do zarządzania usługami.\n" #: net.rc:36 msgid "Could not get handle to service.\n" @@ -11030,7 +10965,7 @@ #: oleview.rc:35 msgid "&System Configuration" -msgstr "Konfiguracja &systemu" +msgstr "Ustawienia &systemu" #: oleview.rc:36 msgid "&Run the Registry Editor" @@ -11126,7 +11061,7 @@ #: oleview.rc:168 msgid "System Configuration" -msgstr "Konfiguracja systemu" +msgstr "Ustawienia systemu" #: oleview.rc:171 msgid "System Settings" @@ -11424,7 +11359,7 @@ #: progman.rc:57 msgid "&About Program Manager" -msgstr "Menedżer zadań - i&nformacje" +msgstr "Zarządzanie programami - i&nformacje" #: progman.rc:103 msgid "Program &group" @@ -11508,7 +11443,7 @@ #: progman.rc:63 msgid "Program Manager" -msgstr "Menedżer zadań" +msgstr "Zarządzanie programami" #: progman.rc:65 winhlp32.rc:83 msgid "WARNING" @@ -11693,7 +11628,7 @@ #: regedit.rc:91 msgid "Modify Binary Data..." -msgstr "Modyfikuj dane binarne..." +msgstr "Zmień dane binarne..." #: regedit.rc:218 msgid "Export registry" @@ -11887,7 +11822,7 @@ #: regedit.rc:147 msgid "Modifies the value's data" -msgstr "Pozwala zmodyfikować wartość danej" +msgstr "Umożliwia zmianę wartości danej" #: regedit.rc:148 msgid "Adds a new key" @@ -11927,7 +11862,7 @@ #: regedit.rc:182 msgid "Can't edit keys of this type (%u)" -msgstr "Nie da się modyfikować kluczy tego typu (%u)" +msgstr "Nie da się zmieniać kluczy tego rodzaju (%u)" #: regedit.rc:183 msgid "Value is too big (%u)" @@ -11976,6 +11911,10 @@ "Provides DLL registration services.\n" "\n" msgstr "" +"Narzędzie rejestrowania bibliotek DLL w Wine\n" +"\n" +"Dostarcza usług rejestrowania bibliotek DLL.\n" +"\n" #: regsvr32.rc:40 msgid "" @@ -11990,54 +11929,64 @@ " [/n] Do not call DllRegisterServer. This option must be used with [/i].\n" "\n" msgstr "" +"Użycie:\n" +" regsvr32 [/u] [/s] [/n] [/i[:cmdline]] NazwaDll\n" +"\n" +"Opcje:\n" +" [/u] Wyrejestruj serwer.\n" +" [/s] Cichy tryb (nie zostaną wyświetlone żadne wiadomości).\n" +" [/i] Wywołaj DllInstall, dostarczając opcjonalnego [cmdline].\n" +"\tGdy użyty z [/u] to wywoływany jest DllInstall w trybie odinstalowywania.\n" +" [/n] Nie wywołuj DllRegisterServer. Tej opcji należy używać z [/i].\n" +"\n" #: regsvr32.rc:41 msgid "" "regsvr32: Invalid or unrecognized switch [%1]\n" "\n" msgstr "" +"regsvr32: Nieprawidłowy lub nierozpoznany przełącznik [%1]\n" +"\n" #: regsvr32.rc:42 -#, fuzzy -#| msgid "Failed to open '%1'\n" msgid "regsvr32: Failed to load DLL '%1'\n" -msgstr "Nieudane otwarcie '%1'\n" +msgstr "regsvr32: Nieudane wczytywanie biblioteki DLL '%1'\n" #: regsvr32.rc:43 msgid "regsvr32: %1 not implemented in DLL '%2'\n" -msgstr "" +msgstr "regsvr32: %1 nie jest zaimplementowana w bibliotece DLL '%2'\n" #: regsvr32.rc:44 msgid "regsvr32: Failed to register DLL '%1'\n" -msgstr "" +msgstr "regsvr32: Nieudane rejestrowanie biblioteki DLL '%1'\n" #: regsvr32.rc:45 msgid "regsvr32: Successfully registered DLL '%1'\n" -msgstr "" +msgstr "regsvr32: Pomyślnie zarejestrowano bibliotekę DLL '%1'\n" #: regsvr32.rc:46 msgid "regsvr32: Failed to unregister DLL '%1'\n" -msgstr "" +msgstr "regsvr32: Nieudane wyrejestrowywanie biblioteki DLL '%1'\n" #: regsvr32.rc:47 msgid "regsvr32: Successfully unregistered DLL '%1'\n" -msgstr "" +msgstr "regsvr32: Pomyślnie wyrejestrowano bibliotekę DLL '%1'\n" #: regsvr32.rc:48 msgid "regsvr32: Failed to install DLL '%1'\n" -msgstr "" +msgstr "regsvr32: Nieudane instalowanie biblioteki DLL '%1'\n" #: regsvr32.rc:49 msgid "regsvr32: Successfully installed DLL '%1'\n" -msgstr "" +msgstr "regsvr32: Pomyślnie zainstalowano bibliotekę DLL '%1'\n" #: regsvr32.rc:50 msgid "regsvr32: Failed to uninstall DLL '%1'\n" -msgstr "" +msgstr "regsvr32: Nieudane odinstalowywanie biblioteki DLL '%1'\n" #: regsvr32.rc:51 msgid "regsvr32: Successfully uninstalled DLL '%1'\n" -msgstr "" +msgstr "regsvr32: Pomyślnie odinstalowano bibliotekę DLL '%1'\n" #: start.rc:55 msgid "" @@ -12120,7 +12069,7 @@ #: taskmgr.rc:39 msgid "E&xit Task Manager" -msgstr "&Zakończ Menedżera zadań" +msgstr "&Zakończ zarządzanie zadaniami" #: taskmgr.rc:45 msgid "&Minimize On Use" @@ -12200,7 +12149,7 @@ #: taskmgr.rc:90 msgid "&About Task Manager" -msgstr "Menedżer zadań - i&nformacje" +msgstr "Zarządzanie zadaniami - i&nformacje" #: taskmgr.rc:120 taskmgr.rc:352 msgid "&Switch To" @@ -12224,7 +12173,7 @@ #: taskmgr.rc:152 winedbg.rc:32 msgid "&Debug" -msgstr "De&buguj" +msgstr "&Diagnostyka" #: taskmgr.rc:154 msgid "Set &Priority" @@ -12248,11 +12197,11 @@ #: taskmgr.rc:170 msgid "Edit Debug &Channels..." -msgstr "Konfiguruj kanały &debugowania..." +msgstr "Zmiana kanałów diagnosty&cznych..." #: taskmgr.rc:338 taskmgr.rc:180 taskmgr.rc:181 msgid "Task Manager" -msgstr "Menedżer zadań" +msgstr "Zarządzanie zadaniami" #: taskmgr.rc:351 msgid "&New Task..." @@ -12332,7 +12281,7 @@ #: taskmgr.rc:428 taskmgr.rc:327 msgid "Debug Channels" -msgstr "Kanały debugowania" +msgstr "Kanały diagnostyczne" #: taskmgr.rc:439 msgid "Processor Affinity" @@ -12482,7 +12431,8 @@ msgid "" "Select the columns that will appear on the Process page of the Task Manager." msgstr "" -"Wybierz kolumny, które będą widoczne na zakładce Procesy Menedżera Procesów." +"Wybierz kolumny, które będą widoczne na zakładce Procesy w zarządzaniu " +"zadaniami." #: taskmgr.rc:521 msgid "&Image Name" @@ -12594,15 +12544,16 @@ #: taskmgr.rc:188 msgid "Task Manager remains in front of all other windows unless minimized" -msgstr "Menedżer zadań wyświetlany jest na wierzchu wszystkich okien" +msgstr "Zarządzanie zadaniami wyświetlane jest na wierzchu wszystkich okien" #: taskmgr.rc:190 msgid "Task Manager is minimized when a SwitchTo operation is performed" -msgstr "Menedżer zadań jest minimalizowany podczas operacji przełączania zadań" +msgstr "" +"Zarządzanie zadaniami jest minimalizowane podczas operacji przełączania zadań" #: taskmgr.rc:191 msgid "Hide the Task Manager when it is minimized" -msgstr "Ukrywa Menedżera zadań, gdy jest on zminimalizowany" +msgstr "Ukrywa zarządzanie zadaniami, gdy jest zminimalizowane" #: taskmgr.rc:192 msgid "Force Task Manager to update now, regardless of Update Speed setting" @@ -12663,7 +12614,7 @@ #: taskmgr.rc:211 msgid "Displays Task Manager help topics" -msgstr "Wyświetla tematy pomocy Menedżera zadań" +msgstr "Wyświetla tematy pomocy dotyczące zarządzania zadaniami" #: taskmgr.rc:212 msgid "Displays program information, version number, and copyright" @@ -12671,7 +12622,7 @@ #: taskmgr.rc:213 msgid "Exits the Task Manager application" -msgstr "Kończy pracę aplikacji Menedżer zadań" +msgstr "Kończy pracę aplikacji do zarządzania zadaniami" #: taskmgr.rc:215 msgid "Shows 16-bit tasks under the associated ntvdm.exe" @@ -12708,7 +12659,7 @@ #: taskmgr.rc:229 msgid "Restores the Task Manager from its hidden state" -msgstr "Przywraca Menedżera zadań ze stanu ukrycia" +msgstr "Przywraca zarządzanie zadaniami ze stanu ukrycia" #: taskmgr.rc:230 msgid "Removes the process from the system" @@ -12720,7 +12671,7 @@ #: taskmgr.rc:233 msgid "Attaches the debugger to this process" -msgstr "Dołącza debuggera do tego procesu" +msgstr "Dołącza program diagnostyczny do tego procesu" #: taskmgr.rc:235 msgid "Controls which processors the process will be allowed to run on" @@ -12752,7 +12703,7 @@ #: taskmgr.rc:247 msgid "Controls Debug Channels" -msgstr "Kontroluj kanały debugowania" +msgstr "Kontroluje kanałami diagnostycznymi" #: taskmgr.rc:264 msgid "Performance" @@ -12836,7 +12787,7 @@ #: taskmgr.rc:301 msgid "Task Manager Warning" -msgstr "Ostrzeżenie menadżera zadań" +msgstr "Ostrzeżenie zarządzania zadaniami" #: taskmgr.rc:304 msgid "" @@ -12875,12 +12826,12 @@ "WARNING: Debugging this process may result in loss of data.\n" "Are you sure you wish to attach the debugger?" msgstr "" -"OSTRZEŻENIE: Debugowanie tego procesu może spowodować utratę danych.\n" -"Czy na pewno chcesz uruchomić debuggera?" +"OSTRZEŻENIE: Diagnozowanie tego procesu może spowodować utratę danych.\n" +"Czy na pewno chcesz uruchomić program diagnostyczny?" #: taskmgr.rc:314 msgid "Unable to Debug Process" -msgstr "Nie można debugować procesu" +msgstr "Nie można zdiagnozować procesu" #: taskmgr.rc:315 msgid "The process must have affinity with at least one processor" @@ -12970,7 +12921,7 @@ #: wineboot.rc:46 msgid "The Wine configuration in %s is being updated, please wait..." -msgstr "Konfiguracja Wine w %s jest właśnie aktualizowana, proszę czekać..." +msgstr "Ustawienia Wine w %s są właśnie uaktualniane, proszę czekać..." #: winecfg.rc:135 msgid "" @@ -12980,7 +12931,7 @@ "option) any later version." msgstr "" "Ta biblioteka jest wolnym oprogramowaniem; możesz ją rozpowszechniać i/lub " -"modyfikować pod warunkami licencji GNU Lesser General Public License " +"zmieniać pod warunkami licencji GNU Lesser General Public License " "opublikowanej przez Free Software Foundation; licencji w wersji 2.1, lub " "(według własnego uznania) dowolnej późniejszej." @@ -13070,11 +13021,11 @@ #: winecfg.rc:188 msgid "&New override for library:" -msgstr "Nowa reguła dla biblioteki:" +msgstr "&Nowa reguła dla biblioteki:" #: winecfg.rc:190 wordpad.rc:247 msgid "&Add" -msgstr "&Dodaj" +msgstr "Dod&aj" #: winecfg.rc:191 msgid "Existing &overrides:" @@ -13113,22 +13064,20 @@ msgstr "Wybierz literę napędu" #: winecfg.rc:226 -#, fuzzy -#| msgid "Wine configuration" msgid "Drive configuration" -msgstr "Konfiguracje Wine" +msgstr "Ustawienia dysków" #: winecfg.rc:227 msgid "" "Failed to connect to the mount manager, the drive configuration cannot be " "edited." msgstr "" -"Nieudane połączenie z menedżerem montowania, konfiguracja napędu nie może " -"być zmodyfikowana." +"Nieudane połączenie z programem do zarządzania montowaniem, nie można " +"zmienić ustawień napędu." #: winecfg.rc:230 msgid "&Add..." -msgstr "&Dodaj..." +msgstr "Dod&aj..." #: winecfg.rc:232 msgid "Auto&detect" @@ -13140,7 +13089,7 @@ #: winecfg.rc:242 winecfg.rc:38 msgid "Show &Advanced" -msgstr "Opcje zaawansowane >>" +msgstr "Opcje z&aawansowane >>" #: winecfg.rc:243 msgid "De&vice:" @@ -13156,7 +13105,7 @@ #: winecfg.rc:249 msgid "S&erial:" -msgstr "&Numer seryjny:" +msgstr "Numer s&eryjny:" #: winecfg.rc:252 msgid "Show &dot files" @@ -13188,7 +13137,7 @@ #: winecfg.rc:270 msgid "&Test Sound" -msgstr "Test dźwięku" +msgstr "Próba dźwięku" #: winecfg.rc:277 msgid "Appearance" @@ -13196,19 +13145,19 @@ #: winecfg.rc:278 msgid "&Theme:" -msgstr "Motyw:" +msgstr "Wys&trój:" #: winecfg.rc:280 msgid "&Install theme..." -msgstr "Zainstaluj motyw..." +msgstr "Za&instaluj wystrój..." #: winecfg.rc:285 msgid "It&em:" -msgstr "Element:" +msgstr "El&ement:" #: winecfg.rc:287 msgid "C&olor:" -msgstr "Kolor:" +msgstr "K&olor:" #: winecfg.rc:293 msgid "Folders" @@ -13232,11 +13181,11 @@ #: winecfg.rc:37 msgid "Hide &Advanced" -msgstr "Ukryj zaawansowane <<" +msgstr "Ukryj z&aawansowane <<" #: winecfg.rc:39 msgid "(No Theme)" -msgstr "(brak motywu)" +msgstr "(brak wystroju)" #: winecfg.rc:40 msgid "Graphics" @@ -13256,15 +13205,15 @@ #: winecfg.rc:44 msgid "Wine configuration" -msgstr "Konfiguracje Wine" +msgstr "Ustawienia Wine" #: winecfg.rc:46 msgid "Theme files (*.msstyles; *.theme)" -msgstr "Pliki motywu (*.msstyles; *.theme)" +msgstr "Pliki wystrojów (*.msstyles; *.theme)" #: winecfg.rc:47 msgid "Select a theme file" -msgstr "Wybierz plik motywu" +msgstr "Wybierz plik wystroju" #: winecfg.rc:48 msgid "Folder" @@ -13276,7 +13225,7 @@ #: winecfg.rc:45 msgid "Wine configuration for %s" -msgstr "Konfiguracje Wine dla %s" +msgstr "Ustawienia Wine dla %s" #: winecfg.rc:84 msgid "Selected driver: %s" @@ -13288,7 +13237,7 @@ #: winecfg.rc:86 msgid "Audio test failed!" -msgstr "Nieudany test audio!" +msgstr "Nieudana próba dźwięku!" #: winecfg.rc:88 msgid "(System default)" @@ -13395,10 +13344,8 @@ msgstr "Litera" #: winecfg.rc:78 -#, fuzzy -#| msgid "New Folder" msgid "Target folder" -msgstr "Nowy Folder" +msgstr "Katalog docelowy" #: winecfg.rc:79 msgid "" @@ -13596,7 +13543,7 @@ #: wineconsole.rc:100 msgid "Configuration" -msgstr "Konfiguracja" +msgstr "Ustawienia" #: wineconsole.rc:103 msgid "Buffer zone" @@ -13676,7 +13623,7 @@ #: wineconsole.rc:41 msgid "Configuration error" -msgstr "Błąd konfiguracji" +msgstr "Błąd ustawiania" #: wineconsole.rc:42 msgid "Screen buffer size must be greater or equal to the window's one" @@ -13688,7 +13635,7 @@ #: wineconsole.rc:38 msgid "This is a test" -msgstr "To jest test" +msgstr "To jest próba" #: wineconsole.rc:44 msgid "wineconsole: Couldn't parse event id\n" @@ -13767,7 +13714,7 @@ "sorry for the inconvenience." msgstr "" "Program %s napotkał poważny problem i musi zakończyć działanie. Przepraszamy " -"za tą niedogodność." +"za tę niedogodność." #: winedbg.rc:58 msgid "" @@ -13897,7 +13844,7 @@ #: winefile.rc:84 msgid "&About Wine File Manager" -msgstr "Menadżer plików Wine - i&nformacje" +msgstr "Zarządzanie plikami Wine - i&nformacje" #: winefile.rc:125 msgid "Select destination" @@ -13941,7 +13888,7 @@ #: winefile.rc:167 msgid "Last Change:" -msgstr "&Ostatnio modyfikowany:" +msgstr "Ostatnio zmieniony:" #: winefile.rc:171 msgid "Cop&yright:" @@ -13986,7 +13933,7 @@ #: winefile.rc:96 msgid "Wine File Manager" -msgstr "Menadżer plików Wine" +msgstr "Zarządzanie plikami Wine" #: winefile.rc:98 msgid "root fs" @@ -14014,7 +13961,7 @@ #: winefile.rc:111 msgid "Modification date" -msgstr "Data modyfikacji" +msgstr "Data zmiany" #: winefile.rc:112 msgid "Index/Inode" @@ -14263,7 +14210,7 @@ #: wordpad.rc:58 msgid "&Modified" -msgstr "&Zmodyfikowany" +msgstr "Z&mieniony" #: wordpad.rc:60 msgid "E&xtras" @@ -14720,8 +14667,7 @@ "[/A] Kopiuje tylko pliki z atrybutem archiwalny.\n" "[/M] Kopiuje tylko pliki z atrybutem archiwalny\n" "\ti usuwa ten atrybut.\n" -"[/D | /D:m-d-y] Kopiuje tylko nowe pliki lub te zmodyfikowane po podanej " -"dacie.\n" +"[/D | /D:m-d-y] Kopiuje tylko nowe pliki lub te zmienione po podanej dacie.\n" "\t\tJeżeli nie podano żadnej daty, to kopiowane są pliki, które są\n" "\t\tnowsze niż w katalogu docelowym.\n" "\n" diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/precommit-hook.sh wine-compholio-1.7.33~ubuntu15.04.1/precommit-hook.sh --- wine-compholio-1.7.32~ubuntu15.04.1/precommit-hook.sh 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/precommit-hook.sh 2014-12-15 01:08:14.000000000 +0000 @@ -7,7 +7,6 @@ echo "*** UPDATING AUTOGENERATED FILES ***" echo "" debian/tools/patchupdate.py || exit 1 - git add patches/Makefile README.md || exit 1 break; fi done diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/programs/regsvr32/regsvr32.rc wine-compholio-1.7.33~ubuntu15.04.1/programs/regsvr32/regsvr32.rc --- wine-compholio-1.7.32~ubuntu15.04.1/programs/regsvr32/regsvr32.rc 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/programs/regsvr32/regsvr32.rc 2014-12-15 00:45:34.000000000 +0000 @@ -53,10 +53,10 @@ #define WINE_FILEDESCRIPTION_STR "Wine Register Server" #define WINE_FILENAME_STR "REGSVR32.EXE" #define WINE_FILETYPE VFT_APP -#define WINE_FILEVERSION 5,0,1586,1 -#define WINE_FILEVERSION_STR "5.0.1586.1" +#define WINE_FILEVERSION 5,1,2600,2180 +#define WINE_FILEVERSION_STR "5.1.2600.2180" -#define WINE_PRODUCTVERSION 5,0,1586,1 -#define WINE_PRODUCTVERSION_STR "5.0" +#define WINE_PRODUCTVERSION 5,1,2600,2180 +#define WINE_PRODUCTVERSION_STR "5.1" #include "wine/wine_common_ver.rc" diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/programs/winedbg/break.c wine-compholio-1.7.33~ubuntu15.04.1/programs/winedbg/break.c --- wine-compholio-1.7.32~ubuntu15.04.1/programs/winedbg/break.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/programs/winedbg/break.c 2014-12-15 00:45:34.000000000 +0000 @@ -492,14 +492,6 @@ bp[num].skipcount = 0; } -static inline BOOL module_is_container(const IMAGEHLP_MODULE* wmod_cntnr, - const IMAGEHLP_MODULE* wmod_child) -{ - return wmod_cntnr->BaseOfImage <= wmod_child->BaseOfImage && - wmod_cntnr->BaseOfImage + wmod_cntnr->ImageSize >= - wmod_child->BaseOfImage + wmod_child->ImageSize; -} - /****************************************************************** * break_delete_xpoints_from_module * diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/programs/winetest/main.c wine-compholio-1.7.33~ubuntu15.04.1/programs/winetest/main.c --- wine-compholio-1.7.32~ubuntu15.04.1/programs/winetest/main.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/programs/winetest/main.c 2014-12-15 00:45:34.000000000 +0000 @@ -308,6 +308,35 @@ return TRUE; } +/* + * Windows 8 has a concept of stub DLLs. When DLLMain is called the user is prompted + * to install that component. To bypass this check we need to look at the version resource. + */ +static BOOL is_stub_dll(const char *filename) +{ + DWORD size, ver; + BOOL isstub = FALSE; + char *p, *data; + + size = GetFileVersionInfoSizeA(filename, &ver); + if (!size) return FALSE; + + data = HeapAlloc(GetProcessHeap(), 0, size); + if (!data) return FALSE; + + if (GetFileVersionInfoA(filename, ver, size, data)) + { + char buf[256]; + + sprintf(buf, "\\StringFileInfo\\%04x%04x\\OriginalFilename", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), 1200); + if (VerQueryValueA(data, buf, (void**)&p, &size)) + isstub = !lstrcmpiA("wcodstub.dll", p); + } + HeapFree(GetProcessHeap(), 0, data); + + return isstub; +} + static void print_version (void) { #ifdef __i386__ @@ -907,6 +936,17 @@ if (actctx != INVALID_HANDLE_VALUE) { pDeactivateActCtx(0, cookie); + pReleaseActCtx(actctx); + } + return TRUE; + } + if(is_stub_dll(dllname)) + { + FreeLibrary(dll); + xprintf (" %s=dll is a stub\n", dllname); + if (actctx != INVALID_HANDLE_VALUE) + { + pDeactivateActCtx(0, cookie); pReleaseActCtx(actctx); } return TRUE; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/programs/wordpad/registry.c wine-compholio-1.7.33~ubuntu15.04.1/programs/wordpad/registry.c --- wine-compholio-1.7.32~ubuntu15.04.1/programs/wordpad/registry.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/programs/wordpad/registry.c 2014-12-15 00:45:34.000000000 +0000 @@ -293,7 +293,7 @@ if(lstrcmpiW(newFile, pFiles[0])) { - for(i = 0; pFiles[i] && i < FILELIST_ENTRIES; i++) + for(i = 0; i < FILELIST_ENTRIES && pFiles[i]; i++) { if(!lstrcmpiW(pFiles[i], newFile)) { diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/README.md wine-compholio-1.7.33~ubuntu15.04.1/README.md --- wine-compholio-1.7.32~ubuntu15.04.1/README.md 2014-11-30 16:18:16.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/README.md 2014-12-15 01:08:14.000000000 +0000 @@ -37,12 +37,13 @@ Included bug fixes and improvements =================================== -**Bugs fixed in Wine Staging 1.7.32 [108]:** +**Bugs fixed in Wine Staging 1.7.33 [119]:** * ATL IOCS data should not be stored in GWLP_USERDATA ([Wine Bug #21767](https://bugs.winehq.org/show_bug.cgi?id=21767)) * Add Dynamic DST exceptions for Israel Standard Time ([Wine Bug #36374](https://bugs.winehq.org/show_bug.cgi?id=36374)) * Add default ACLs for user shell folders * Add stub for NtSetLdtEntries/ZwSetLdtEntries ([Wine Bug #26268](https://bugs.winehq.org/show_bug.cgi?id=26268)) +* Add support for GetPropValue to PulseAudio backend * Adobe Reader needs ITextSelection_fnGetDuplicate implementation * Allow selection of audio device for PulseAudio backend * Allow special characters in pipe names ([Wine Bug #28995](https://bugs.winehq.org/show_bug.cgi?id=28995)) @@ -63,6 +64,7 @@ * FairplayKD.sys needs KeSetSystemAffinityThread ([Wine Bug #36822](https://bugs.winehq.org/show_bug.cgi?id=36822)) * Fix black screen on startup introduced by pixelformat changes. ([Wine Bug #35950](https://bugs.winehq.org/show_bug.cgi?id=35950)) * Fix comparison of punctuation characters in lstrcmp ([Wine Bug #10767](https://bugs.winehq.org/show_bug.cgi?id=10767)) +* Fix condition mask handling in RtlVerifyVersionInfo ([Wine Bug #36143](https://bugs.winehq.org/show_bug.cgi?id=36143)) * Fix crash of Trine Demo on start ([Wine Bug #19231](https://bugs.winehq.org/show_bug.cgi?id=19231)) * Fix crash of winedevice when relocation entry crosses page boundary ([Wine Bug #28254](https://bugs.winehq.org/show_bug.cgi?id=28254)) * Fix flickering introduced by pixelformat changes. ([Wine Bug #35718](https://bugs.winehq.org/show_bug.cgi?id=35718)) @@ -74,16 +76,18 @@ * Fix issues when driver dispatch routine returns different status codes ([Wine Bug #30155](https://bugs.winehq.org/show_bug.cgi?id=30155)) * Fix issues with dragging layers between images in Adobe Photoshop 7.0 ([Wine Bug #12007](https://bugs.winehq.org/show_bug.cgi?id=12007)) * Fix missing video introduced by pixelformat changes. ([Wine Bug #36900](https://bugs.winehq.org/show_bug.cgi?id=36900)) -* Fix ordering of IP addresses by metric if two addresses have the same metric. -* Fix passing of unicode environment from msvcrt to CreateProcessW. ([Wine Bug #37635](https://bugs.winehq.org/show_bug.cgi?id=37635)) +* Fix possible segfault in pulse_rd_loop of PulseAudio backend +* Fix return value of ScrollWindowEx for invisible windows ([Wine Bug #37706](https://bugs.winehq.org/show_bug.cgi?id=37706)) * Fix texture corruption in CSI: Fatal Conspiracy ([Wine Bug #33768](https://bugs.winehq.org/show_bug.cgi?id=33768)) * Fix unintentional leaks with ntdll internals * Fix wined3d performance drop introduced by pixelformat changes. ([Wine Bug #35655](https://bugs.winehq.org/show_bug.cgi?id=35655)) * Games For Windows Live 1.x expects a valid linker version in the PE header ([Wine Bug #28768](https://bugs.winehq.org/show_bug.cgi?id=28768)) * GetSecurityInfo returns NULL DACL for process object ([Wine Bug #15980](https://bugs.winehq.org/show_bug.cgi?id=15980)) +* Ignore unsupported flags for CoInternetSetFeatureEnabled ([Wine Bug #35197](https://bugs.winehq.org/show_bug.cgi?id=35197)) * Implement a Microsoft Yahei replacement font ([Wine Bug #13829](https://bugs.winehq.org/show_bug.cgi?id=13829)) * Implement an Arial replacement font ([Wine Bug #32323](https://bugs.winehq.org/show_bug.cgi?id=32323)) * Implement exclusive mode in PulseAudio backend ([Wine Bug #37042](https://bugs.winehq.org/show_bug.cgi?id=37042)) +* Implement stubs for mfplat.MFStartup and MFShutdown ([Wine Bug #37701](https://bugs.winehq.org/show_bug.cgi?id=37701)) * Improvement for heap allocation performance * Initialize irp.Tail.Overlay.OriginalFileObject with stub file object ([Wine Bug #37537](https://bugs.winehq.org/show_bug.cgi?id=37537)) * Lego Stunt Rally requires DXTn software de/encoding support ([Wine Bug #25486](https://bugs.winehq.org/show_bug.cgi?id=25486)) @@ -95,6 +99,8 @@ * Need for Speed 3 installer requires devices in HKEY_DYN_DATA ([Wine Bug #7115](https://bugs.winehq.org/show_bug.cgi?id=7115)) * Other Pipelight-specific enhancements * Prevent window managers from grouping all wine programs together ([Wine Bug #32699](https://bugs.winehq.org/show_bug.cgi?id=32699)) +* Provide named entry point shell32.SHILCreateFromPath for vista apps ([Wine Bug #37265](https://bugs.winehq.org/show_bug.cgi?id=37265)) +* Reallocate buffer when adding records to AVI files ([Wine Bug #5137](https://bugs.winehq.org/show_bug.cgi?id=5137)) * Reduced SetTimer minimum value from 10 ms to 5 ms (improves Silverlight framerates) * Return an error when trying to open a terminated process ([Wine Bug #37087](https://bugs.winehq.org/show_bug.cgi?id=37087)) * Return correct IMediaSeeking stream positions in quartz ([Wine Bug #23174](https://bugs.winehq.org/show_bug.cgi?id=23174)) @@ -102,8 +108,10 @@ * Return more context attributes in schan_InitializeSecurityContextW ([Wine Bug #37527](https://bugs.winehq.org/show_bug.cgi?id=37527)) * SO_CONNECT_TIME returns the appropriate time * Send WM_PAINT event during dialog creation ([Wine Bug #35652](https://bugs.winehq.org/show_bug.cgi?id=35652)) +* Set last error when GetRawInputDeviceList fails ([Wine Bug #37667](https://bugs.winehq.org/show_bug.cgi?id=37667)) * Support for AllocateAndGetTcpExTableFromStack ([Wine Bug #34372](https://bugs.winehq.org/show_bug.cgi?id=34372)) * Support for BindImageEx ([Wine Bug #3591](https://bugs.winehq.org/show_bug.cgi?id=3591)) +* Support for CSMT (command stream) to increase graphic performance ([Wine Bug #11674](https://bugs.winehq.org/show_bug.cgi?id=11674)) * Support for D3DXGetShaderInputSemantics ([Wine Bug #22682](https://bugs.winehq.org/show_bug.cgi?id=22682)) * Support for DOS hidden/system file attributes ([Wine Bug #9158](https://bugs.winehq.org/show_bug.cgi?id=9158)) * Support for Dynamic DST (daylight saving time) information in registry @@ -123,13 +131,16 @@ * Support for PulseAudio backend for audio ([Wine Bug #10495](https://bugs.winehq.org/show_bug.cgi?id=10495)) * Support for RtlDecompressBuffer ([Wine Bug #37449](https://bugs.winehq.org/show_bug.cgi?id=37449)) * Support for SHCreateSessionKey ([Wine Bug #35630](https://bugs.winehq.org/show_bug.cgi?id=35630)) +* Support for StrCatChainW * Support for TOOLTIPS_GetTipText edge cases ([Wine Bug #30648](https://bugs.winehq.org/show_bug.cgi?id=30648)) * Support for TransmitFile ([Wine Bug #5048](https://bugs.winehq.org/show_bug.cgi?id=5048)) * Support for UTF7 encoding/decoding ([Wine Bug #27388](https://bugs.winehq.org/show_bug.cgi?id=27388)) * Support for WTSEnumerateProcessesW ([Wine Bug #29903](https://bugs.winehq.org/show_bug.cgi?id=29903)) +* Support for combase HSTRING objects * Support for extra large and jumbo icon lists in shell32 ([Wine Bug #24721](https://bugs.winehq.org/show_bug.cgi?id=24721)) * Support for inherited file ACLs ([Wine Bug #34406](https://bugs.winehq.org/show_bug.cgi?id=34406)) * Support for interface change notifications ([Wine Bug #32328](https://bugs.winehq.org/show_bug.cgi?id=32328)) +* Support for loader dll redirections * Support for pasting HTML from Unix applications ([Wine Bug #7372](https://bugs.winehq.org/show_bug.cgi?id=7372)) * Support for process ACLs ([Wine Bug #22006](https://bugs.winehq.org/show_bug.cgi?id=22006)) * Support for setcap on wine-preloader ([Wine Bug #26256](https://bugs.winehq.org/show_bug.cgi?id=26256)) @@ -141,10 +152,10 @@ * Use manual relay for RunDLL_CallEntry16 in shell32 ([Wine Bug #23033](https://bugs.winehq.org/show_bug.cgi?id=23033)) * Voobly expects correct handling of WRITECOPY memory protection ([Wine Bug #29384](https://bugs.winehq.org/show_bug.cgi?id=29384)) * Wine ignores IDF_CHECKFIRST flag in SetupPromptForDisk ([Wine Bug #20465](https://bugs.winehq.org/show_bug.cgi?id=20465)) -* Wintrust doesn't reset data->pWintrustData->u.pFile->hFile after closing handle ([Wine Bug #36257](https://bugs.winehq.org/show_bug.cgi?id=36257)) * Workaround for shlwapi URLs with relative paths * XEMBED support for embedding Wine windows inside Linux applications * nVidia driver for high-end laptop cards does not list all supported resolutions * vSphere needs IoCsqInitialize ([Wine Bug #36777](https://bugs.winehq.org/show_bug.cgi?id=36777)) * wglDescribePixelFormat should return max index for NULL descriptor ([Wine Bug #6176](https://bugs.winehq.org/show_bug.cgi?id=6176)) +* wininet should allow Accept-Encoding header for HTTP/1.0 ([Wine Bug #37046](https://bugs.winehq.org/show_bug.cgi?id=37046)) diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/server/object.c wine-compholio-1.7.33~ubuntu15.04.1/server/object.c --- wine-compholio-1.7.32~ubuntu15.04.1/server/object.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/server/object.c 2014-12-15 00:45:34.000000000 +0000 @@ -451,6 +451,7 @@ owner = token_get_user( token ); new_sd.owner_len = security_sid_len( owner ); } + else new_sd.owner_len = 0; if (set_info & GROUP_SECURITY_INFORMATION && sd->group_len) { @@ -467,6 +468,7 @@ group = token_get_primary_group( token ); new_sd.group_len = security_sid_len( group ); } + else new_sd.group_len = 0; new_sd.control |= SE_SACL_PRESENT; sacl = sd_get_sacl( sd, &present ); @@ -479,9 +481,7 @@ if (obj->sd && present) new_sd.sacl_len = obj->sd->sacl_len; else - { new_sd.sacl_len = 0; - } } new_sd.control |= SE_DACL_PRESENT; @@ -499,6 +499,7 @@ dacl = token_get_default_dacl( token ); new_sd.dacl_len = dacl->AclSize; } + else new_sd.dacl_len = 0; } ptr = mem_alloc( sizeof(new_sd) + new_sd.owner_len + new_sd.group_len + diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/tools/make_specfiles wine-compholio-1.7.33~ubuntu15.04.1/tools/make_specfiles --- wine-compholio-1.7.32~ubuntu15.04.1/tools/make_specfiles 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/tools/make_specfiles 2014-12-15 00:45:34.000000000 +0000 @@ -46,6 +46,14 @@ "msvcp60", ], [ + "msvcr120", + "msvcr120_app", + ], + [ + "msvcp120", + "msvcp120_app", + ], + [ "d3dx9_36", "d3dx9_43", "d3dx9_42", @@ -156,11 +164,23 @@ "api-ms-win-core-psapi-l1-1-0", "api-ms-win-core-threadpool-legacy-l1-1-0", "api-ms-win-core-timezone-l1-1-0", + "api-ms-win-core-file-l2-1-1", + "api-ms-win-core-sysinfo-l1-2-1", + "api-ms-win-core-processthreads-l1-1-2", + "api-ms-win-core-fibers-l1-1-0", + "api-ms-win-core-fibers-l1-1-1", + "api-ms-win-core-file-l2-1-0", + "api-ms-win-core-localization-l1-2-1", + "api-ms-win-core-datetime-l1-1-0", + "api-ms-win-core-datetime-l1-1-1", + "api-ms-win-core-xstate-l2-1-0", + "api-ms-win-core-errorhandling-l1-1-2", ], [ "ole32", "api-ms-win-downlevel-ole32-l1-1-0", "api-ms-win-core-com-l1-1-0", + "combase", ], [ "shell32", @@ -192,6 +212,10 @@ "gdi32", "ext-ms-win-gdi-devcaps-l1-1-0", ], + [ + "combase", + "api-ms-win-core-winrt-l1-1-0", + ], ); my $update_flags = 0; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/tools/widl/proxy.c wine-compholio-1.7.33~ubuntu15.04.1/tools/widl/proxy.c --- wine-compholio-1.7.32~ubuntu15.04.1/tools/widl/proxy.c 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/tools/widl/proxy.c 2014-12-15 00:45:34.000000000 +0000 @@ -37,14 +37,6 @@ #include "typegen.h" #include "expr.h" -#define END_OF_LIST(list) \ - do { \ - if (list) { \ - while (NEXT_LINK(list)) \ - list = NEXT_LINK(list); \ - } \ - } while(0) - static FILE* proxy; static int indent = 0; diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/tools/wrc/wrctypes.h wine-compholio-1.7.33~ubuntu15.04.1/tools/wrc/wrctypes.h --- wine-compholio-1.7.32~ubuntu15.04.1/tools/wrc/wrctypes.h 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/tools/wrc/wrctypes.h 2014-12-15 00:45:34.000000000 +0000 @@ -97,7 +97,7 @@ unsigned int allocsize; /* Allocated datablock size */ unsigned int size; /* Actual size of data */ unsigned int dataidx; /* Tag behind the resource-header */ - char *data; + unsigned char *data; } res_t; /* Resource strings are slightly more complex because they include '\0' */ diff -Nru wine-compholio-1.7.32~ubuntu15.04.1/VERSION wine-compholio-1.7.33~ubuntu15.04.1/VERSION --- wine-compholio-1.7.32~ubuntu15.04.1/VERSION 2014-11-30 15:55:00.000000000 +0000 +++ wine-compholio-1.7.33~ubuntu15.04.1/VERSION 2014-12-15 00:45:34.000000000 +0000 @@ -1 +1 @@ -Wine version 1.7.32 +Wine version 1.7.33