Home | History | Annotate | Download | only in nine
      1 /*
      2  * Copyright 2013 Joakim Sindholt <opensource (at) zhasha.com>
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * on the rights to use, copy, modify, merge, publish, distribute, sub
      8  * license, and/or sell copies of the Software, and to permit persons to whom
      9  * the Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
     18  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
     19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
     20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     21  * USE OR OTHER DEALINGS IN THE SOFTWARE. */
     22 
     23 #include "authenticatedchannel9.h"
     24 #include "basetexture9.h"
     25 #include "cryptosession9.h"
     26 #include "cubetexture9.h"
     27 #include "device9.h"
     28 #include "device9ex.h"
     29 #include "device9video.h"
     30 #include "indexbuffer9.h"
     31 #include "pixelshader9.h"
     32 #include "query9.h"
     33 #include "resource9.h"
     34 #include "stateblock9.h"
     35 #include "surface9.h"
     36 #include "swapchain9.h"
     37 #include "swapchain9ex.h"
     38 #include "texture9.h"
     39 #include "vertexbuffer9.h"
     40 #include "vertexdeclaration9.h"
     41 #include "vertexshader9.h"
     42 #include "volume9.h"
     43 #include "volumetexture9.h"
     44 
     45 #include "d3d9.h"
     46 #include "nine_lock.h"
     47 
     48 #include "os/os_thread.h"
     49 
     50 /* Global mutex as described by MSDN */
     51 pipe_static_mutex(d3dlock_global);
     52 
     53 void
     54 NineLockGlobalMutex()
     55 {
     56     pipe_mutex_lock(d3dlock_global);
     57 }
     58 
     59 void
     60 NineUnlockGlobalMutex()
     61 {
     62     pipe_mutex_unlock(d3dlock_global);
     63 }
     64 
     65 static HRESULT NINE_WINAPI
     66 LockAuthenticatedChannel9_GetCertificateSize( struct NineAuthenticatedChannel9 *This,
     67                                               UINT *pCertificateSize )
     68 {
     69     HRESULT r;
     70     pipe_mutex_lock(d3dlock_global);
     71     r = NineAuthenticatedChannel9_GetCertificateSize(This, pCertificateSize);
     72     pipe_mutex_unlock(d3dlock_global);
     73     return r;
     74 }
     75 
     76 static HRESULT NINE_WINAPI
     77 LockAuthenticatedChannel9_GetCertificate( struct NineAuthenticatedChannel9 *This,
     78                                           UINT CertifacteSize,
     79                                           BYTE *ppCertificate )
     80 {
     81     HRESULT r;
     82     pipe_mutex_lock(d3dlock_global);
     83     r = NineAuthenticatedChannel9_GetCertificate(This, CertifacteSize, ppCertificate);
     84     pipe_mutex_unlock(d3dlock_global);
     85     return r;
     86 }
     87 
     88 static HRESULT NINE_WINAPI
     89 LockAuthenticatedChannel9_NegotiateKeyExchange( struct NineAuthenticatedChannel9 *This,
     90                                                 UINT DataSize,
     91                                                 void *pData )
     92 {
     93     HRESULT r;
     94     pipe_mutex_lock(d3dlock_global);
     95     r = NineAuthenticatedChannel9_NegotiateKeyExchange(This, DataSize, pData);
     96     pipe_mutex_unlock(d3dlock_global);
     97     return r;
     98 }
     99 
    100 static HRESULT NINE_WINAPI
    101 LockAuthenticatedChannel9_Query( struct NineAuthenticatedChannel9 *This,
    102                                  UINT InputSize,
    103                                  const void *pInput,
    104                                  UINT OutputSize,
    105                                  void *pOutput )
    106 {
    107     HRESULT r;
    108     pipe_mutex_lock(d3dlock_global);
    109     r = NineAuthenticatedChannel9_Query(This, InputSize, pInput, OutputSize, pOutput);
    110     pipe_mutex_unlock(d3dlock_global);
    111     return r;
    112 }
    113 
    114 static HRESULT NINE_WINAPI
    115 LockAuthenticatedChannel9_Configure( struct NineAuthenticatedChannel9 *This,
    116                                      UINT InputSize,
    117                                      const void *pInput,
    118                                      D3DAUTHENTICATEDCHANNEL_CONFIGURE_OUTPUT *pOutput )
    119 {
    120     HRESULT r;
    121     pipe_mutex_lock(d3dlock_global);
    122     r = NineAuthenticatedChannel9_Configure(This, InputSize, pInput, pOutput);
    123     pipe_mutex_unlock(d3dlock_global);
    124     return r;
    125 }
    126 
    127 IDirect3DAuthenticatedChannel9Vtbl LockAuthenticatedChannel9_vtable = {
    128     (void *)NineUnknown_QueryInterface,
    129     (void *)NineUnknown_AddRef,
    130     (void *)NineUnknown_ReleaseWithDtorLock,
    131     (void *)LockAuthenticatedChannel9_GetCertificateSize,
    132     (void *)LockAuthenticatedChannel9_GetCertificate,
    133     (void *)LockAuthenticatedChannel9_NegotiateKeyExchange,
    134     (void *)LockAuthenticatedChannel9_Query,
    135     (void *)LockAuthenticatedChannel9_Configure
    136 };
    137 
    138 static HRESULT NINE_WINAPI
    139 LockUnknown_SetPrivateData( struct NineUnknown *This,
    140                             REFGUID refguid,
    141                             const void *pData,
    142                             DWORD SizeOfData,
    143                             DWORD Flags )
    144 {
    145     HRESULT r;
    146     pipe_mutex_lock(d3dlock_global);
    147     r = NineUnknown_SetPrivateData(This, refguid, pData, SizeOfData, Flags);
    148     pipe_mutex_unlock(d3dlock_global);
    149     return r;
    150 }
    151 
    152 static HRESULT NINE_WINAPI
    153 LockUnknown_GetPrivateData( struct NineUnknown *This,
    154                             REFGUID refguid,
    155                             void *pData,
    156                             DWORD *pSizeOfData )
    157 {
    158     HRESULT r;
    159     pipe_mutex_lock(d3dlock_global);
    160     r = NineUnknown_GetPrivateData(This, refguid, pData, pSizeOfData);
    161     pipe_mutex_unlock(d3dlock_global);
    162     return r;
    163 }
    164 
    165 static HRESULT NINE_WINAPI
    166 LockUnknown_FreePrivateData( struct NineUnknown *This,
    167                              REFGUID refguid )
    168 {
    169     HRESULT r;
    170     pipe_mutex_lock(d3dlock_global);
    171     r = NineUnknown_FreePrivateData(This, refguid);
    172     pipe_mutex_unlock(d3dlock_global);
    173     return r;
    174 }
    175 
    176 #if 0
    177 static HRESULT NINE_WINAPI
    178 LockResource9_GetDevice( struct NineResource9 *This,
    179                          IDirect3DDevice9 **ppDevice )
    180 {
    181     HRESULT r;
    182     pipe_mutex_lock(d3dlock_global);
    183     r = NineUnknown_GetDevice(NineUnknown(This), ppDevice);
    184     pipe_mutex_unlock(d3dlock_global);
    185     return r;
    186 }
    187 #endif
    188 
    189 static DWORD NINE_WINAPI
    190 LockResource9_SetPriority( struct NineResource9 *This,
    191                            DWORD PriorityNew )
    192 {
    193     DWORD r;
    194     pipe_mutex_lock(d3dlock_global);
    195     r = NineResource9_SetPriority(This, PriorityNew);
    196     pipe_mutex_unlock(d3dlock_global);
    197     return r;
    198 }
    199 
    200 static DWORD NINE_WINAPI
    201 LockResource9_GetPriority( struct NineResource9 *This )
    202 {
    203     DWORD r;
    204     pipe_mutex_lock(d3dlock_global);
    205     r = NineResource9_GetPriority(This);
    206     pipe_mutex_unlock(d3dlock_global);
    207     return r;
    208 }
    209 
    210 #if 0
    211 static void NINE_WINAPI
    212 LockResource9_PreLoad( struct NineResource9 *This )
    213 {
    214     pipe_mutex_lock(d3dlock_global);
    215     NineResource9_PreLoad(This);
    216     pipe_mutex_unlock(d3dlock_global);
    217 }
    218 #endif
    219 
    220 #if 0
    221 static D3DRESOURCETYPE NINE_WINAPI
    222 LockResource9_GetType( struct NineResource9 *This )
    223 {
    224     D3DRESOURCETYPE r;
    225     pipe_mutex_lock(d3dlock_global);
    226     r = NineResource9_GetType(This);
    227     pipe_mutex_unlock(d3dlock_global);
    228     return r;
    229 }
    230 #endif
    231 
    232 static DWORD NINE_WINAPI
    233 LockBaseTexture9_SetLOD( struct NineBaseTexture9 *This,
    234                          DWORD LODNew )
    235 {
    236     DWORD r;
    237     pipe_mutex_lock(d3dlock_global);
    238     r = NineBaseTexture9_SetLOD(This, LODNew);
    239     pipe_mutex_unlock(d3dlock_global);
    240     return r;
    241 }
    242 
    243 static DWORD NINE_WINAPI
    244 LockBaseTexture9_GetLOD( struct NineBaseTexture9 *This )
    245 {
    246     DWORD r;
    247     pipe_mutex_lock(d3dlock_global);
    248     r = NineBaseTexture9_GetLOD(This);
    249     pipe_mutex_unlock(d3dlock_global);
    250     return r;
    251 }
    252 
    253 static DWORD NINE_WINAPI
    254 LockBaseTexture9_GetLevelCount( struct NineBaseTexture9 *This )
    255 {
    256     DWORD r;
    257     pipe_mutex_lock(d3dlock_global);
    258     r = NineBaseTexture9_GetLevelCount(This);
    259     pipe_mutex_unlock(d3dlock_global);
    260     return r;
    261 }
    262 
    263 static HRESULT NINE_WINAPI
    264 LockBaseTexture9_SetAutoGenFilterType( struct NineBaseTexture9 *This,
    265                                        D3DTEXTUREFILTERTYPE FilterType )
    266 {
    267     HRESULT r;
    268     pipe_mutex_lock(d3dlock_global);
    269     r = NineBaseTexture9_SetAutoGenFilterType(This, FilterType);
    270     pipe_mutex_unlock(d3dlock_global);
    271     return r;
    272 }
    273 
    274 static D3DTEXTUREFILTERTYPE NINE_WINAPI
    275 LockBaseTexture9_GetAutoGenFilterType( struct NineBaseTexture9 *This )
    276 {
    277     D3DTEXTUREFILTERTYPE r;
    278     pipe_mutex_lock(d3dlock_global);
    279     r = NineBaseTexture9_GetAutoGenFilterType(This);
    280     pipe_mutex_unlock(d3dlock_global);
    281     return r;
    282 }
    283 
    284 static void NINE_WINAPI
    285 LockBaseTexture9_PreLoad( struct NineBaseTexture9 *This )
    286 {
    287     pipe_mutex_lock(d3dlock_global);
    288     NineBaseTexture9_PreLoad(This);
    289     pipe_mutex_unlock(d3dlock_global);
    290 }
    291 
    292 static void NINE_WINAPI
    293 LockBaseTexture9_GenerateMipSubLevels( struct NineBaseTexture9 *This )
    294 {
    295     pipe_mutex_lock(d3dlock_global);
    296     NineBaseTexture9_GenerateMipSubLevels(This);
    297     pipe_mutex_unlock(d3dlock_global);
    298 }
    299 
    300 static HRESULT NINE_WINAPI
    301 LockCryptoSession9_GetCertificateSize( struct NineCryptoSession9 *This,
    302                                        UINT *pCertificateSize )
    303 {
    304     HRESULT r;
    305     pipe_mutex_lock(d3dlock_global);
    306     r = NineCryptoSession9_GetCertificateSize(This, pCertificateSize);
    307     pipe_mutex_unlock(d3dlock_global);
    308     return r;
    309 }
    310 
    311 static HRESULT NINE_WINAPI
    312 LockCryptoSession9_GetCertificate( struct NineCryptoSession9 *This,
    313                                    UINT CertifacteSize,
    314                                    BYTE *ppCertificate )
    315 {
    316     HRESULT r;
    317     pipe_mutex_lock(d3dlock_global);
    318     r = NineCryptoSession9_GetCertificate(This, CertifacteSize, ppCertificate);
    319     pipe_mutex_unlock(d3dlock_global);
    320     return r;
    321 }
    322 
    323 static HRESULT NINE_WINAPI
    324 LockCryptoSession9_NegotiateKeyExchange( struct NineCryptoSession9 *This,
    325                                          UINT DataSize,
    326                                          void *pData )
    327 {
    328     HRESULT r;
    329     pipe_mutex_lock(d3dlock_global);
    330     r = NineCryptoSession9_NegotiateKeyExchange(This, DataSize, pData);
    331     pipe_mutex_unlock(d3dlock_global);
    332     return r;
    333 }
    334 
    335 static HRESULT NINE_WINAPI
    336 LockCryptoSession9_EncryptionBlt( struct NineCryptoSession9 *This,
    337                                   IDirect3DSurface9 *pSrcSurface,
    338                                   IDirect3DSurface9 *pDstSurface,
    339                                   UINT DstSurfaceSize,
    340                                   void *pIV )
    341 {
    342     HRESULT r;
    343     pipe_mutex_lock(d3dlock_global);
    344     r = NineCryptoSession9_EncryptionBlt(This, pSrcSurface, pDstSurface, DstSurfaceSize, pIV);
    345     pipe_mutex_unlock(d3dlock_global);
    346     return r;
    347 }
    348 
    349 static HRESULT NINE_WINAPI
    350 LockCryptoSession9_DecryptionBlt( struct NineCryptoSession9 *This,
    351                                   IDirect3DSurface9 *pSrcSurface,
    352                                   IDirect3DSurface9 *pDstSurface,
    353                                   UINT SrcSurfaceSize,
    354                                   D3DENCRYPTED_BLOCK_INFO *pEncryptedBlockInfo,
    355                                   void *pContentKey,
    356                                   void *pIV )
    357 {
    358     HRESULT r;
    359     pipe_mutex_lock(d3dlock_global);
    360     r = NineCryptoSession9_DecryptionBlt(This, pSrcSurface, pDstSurface, SrcSurfaceSize, pEncryptedBlockInfo, pContentKey, pIV);
    361     pipe_mutex_unlock(d3dlock_global);
    362     return r;
    363 }
    364 
    365 static HRESULT NINE_WINAPI
    366 LockCryptoSession9_GetSurfacePitch( struct NineCryptoSession9 *This,
    367                                     IDirect3DSurface9 *pSrcSurface,
    368                                     UINT *pSurfacePitch )
    369 {
    370     HRESULT r;
    371     pipe_mutex_lock(d3dlock_global);
    372     r = NineCryptoSession9_GetSurfacePitch(This, pSrcSurface, pSurfacePitch);
    373     pipe_mutex_unlock(d3dlock_global);
    374     return r;
    375 }
    376 
    377 static HRESULT NINE_WINAPI
    378 LockCryptoSession9_StartSessionKeyRefresh( struct NineCryptoSession9 *This,
    379                                            void *pRandomNumber,
    380                                            UINT RandomNumberSize )
    381 {
    382     HRESULT r;
    383     pipe_mutex_lock(d3dlock_global);
    384     r = NineCryptoSession9_StartSessionKeyRefresh(This, pRandomNumber, RandomNumberSize);
    385     pipe_mutex_unlock(d3dlock_global);
    386     return r;
    387 }
    388 
    389 static HRESULT NINE_WINAPI
    390 LockCryptoSession9_FinishSessionKeyRefresh( struct NineCryptoSession9 *This )
    391 {
    392     HRESULT r;
    393     pipe_mutex_lock(d3dlock_global);
    394     r = NineCryptoSession9_FinishSessionKeyRefresh(This);
    395     pipe_mutex_unlock(d3dlock_global);
    396     return r;
    397 }
    398 
    399 static HRESULT NINE_WINAPI
    400 LockCryptoSession9_GetEncryptionBltKey( struct NineCryptoSession9 *This,
    401                                         void *pReadbackKey,
    402                                         UINT KeySize )
    403 {
    404     HRESULT r;
    405     pipe_mutex_lock(d3dlock_global);
    406     r = NineCryptoSession9_GetEncryptionBltKey(This, pReadbackKey, KeySize);
    407     pipe_mutex_unlock(d3dlock_global);
    408     return r;
    409 }
    410 
    411 IDirect3DCryptoSession9Vtbl LockCryptoSession9_vtable = {
    412     (void *)NineUnknown_QueryInterface,
    413     (void *)NineUnknown_AddRef,
    414     (void *)NineUnknown_ReleaseWithDtorLock,
    415     (void *)LockCryptoSession9_GetCertificateSize,
    416     (void *)LockCryptoSession9_GetCertificate,
    417     (void *)LockCryptoSession9_NegotiateKeyExchange,
    418     (void *)LockCryptoSession9_EncryptionBlt,
    419     (void *)LockCryptoSession9_DecryptionBlt,
    420     (void *)LockCryptoSession9_GetSurfacePitch,
    421     (void *)LockCryptoSession9_StartSessionKeyRefresh,
    422     (void *)LockCryptoSession9_FinishSessionKeyRefresh,
    423     (void *)LockCryptoSession9_GetEncryptionBltKey
    424 };
    425 
    426 #if 0
    427 static HRESULT NINE_WINAPI
    428 LockCubeTexture9_GetLevelDesc( struct NineCubeTexture9 *This,
    429                                UINT Level,
    430                                D3DSURFACE_DESC *pDesc )
    431 {
    432     HRESULT r;
    433     pipe_mutex_lock(d3dlock_global);
    434     r = NineCubeTexture9_GetLevelDesc(This, Level, pDesc);
    435     pipe_mutex_unlock(d3dlock_global);
    436     return r;
    437 }
    438 #endif
    439 
    440 #if 0
    441 static HRESULT NINE_WINAPI
    442 LockCubeTexture9_GetCubeMapSurface( struct NineCubeTexture9 *This,
    443                                     D3DCUBEMAP_FACES FaceType,
    444                                     UINT Level,
    445                                     IDirect3DSurface9 **ppCubeMapSurface )
    446 {
    447     HRESULT r;
    448     pipe_mutex_lock(d3dlock_global);
    449     r = NineCubeTexture9_GetCubeMapSurface(This, FaceType, Level, ppCubeMapSurface);
    450     pipe_mutex_unlock(d3dlock_global);
    451     return r;
    452 }
    453 #endif
    454 
    455 static HRESULT NINE_WINAPI
    456 LockCubeTexture9_LockRect( struct NineCubeTexture9 *This,
    457                            D3DCUBEMAP_FACES FaceType,
    458                            UINT Level,
    459                            D3DLOCKED_RECT *pLockedRect,
    460                            const RECT *pRect,
    461                            DWORD Flags )
    462 {
    463     HRESULT r;
    464     pipe_mutex_lock(d3dlock_global);
    465     r = NineCubeTexture9_LockRect(This, FaceType, Level, pLockedRect, pRect, Flags);
    466     pipe_mutex_unlock(d3dlock_global);
    467     return r;
    468 }
    469 
    470 static HRESULT NINE_WINAPI
    471 LockCubeTexture9_UnlockRect( struct NineCubeTexture9 *This,
    472                              D3DCUBEMAP_FACES FaceType,
    473                              UINT Level )
    474 {
    475     HRESULT r;
    476     pipe_mutex_lock(d3dlock_global);
    477     r = NineCubeTexture9_UnlockRect(This, FaceType, Level);
    478     pipe_mutex_unlock(d3dlock_global);
    479     return r;
    480 }
    481 
    482 static HRESULT NINE_WINAPI
    483 LockCubeTexture9_AddDirtyRect( struct NineCubeTexture9 *This,
    484                                D3DCUBEMAP_FACES FaceType,
    485                                const RECT *pDirtyRect )
    486 {
    487     HRESULT r;
    488     pipe_mutex_lock(d3dlock_global);
    489     r = NineCubeTexture9_AddDirtyRect(This, FaceType, pDirtyRect);
    490     pipe_mutex_unlock(d3dlock_global);
    491     return r;
    492 }
    493 
    494 IDirect3DCubeTexture9Vtbl LockCubeTexture9_vtable = {
    495     (void *)NineUnknown_QueryInterface,
    496     (void *)NineUnknown_AddRef,
    497     (void *)NineUnknown_ReleaseWithDtorLock,
    498     (void *)NineUnknown_GetDevice, /* actually part of Resource9 iface */
    499     (void *)LockUnknown_SetPrivateData,
    500     (void *)LockUnknown_GetPrivateData,
    501     (void *)LockUnknown_FreePrivateData,
    502     (void *)LockResource9_SetPriority,
    503     (void *)LockResource9_GetPriority,
    504     (void *)LockBaseTexture9_PreLoad,
    505     (void *)NineResource9_GetType, /* immutable */
    506     (void *)LockBaseTexture9_SetLOD,
    507     (void *)LockBaseTexture9_GetLOD,
    508     (void *)LockBaseTexture9_GetLevelCount,
    509     (void *)LockBaseTexture9_SetAutoGenFilterType,
    510     (void *)LockBaseTexture9_GetAutoGenFilterType,
    511     (void *)LockBaseTexture9_GenerateMipSubLevels,
    512     (void *)NineCubeTexture9_GetLevelDesc, /* immutable */
    513     (void *)NineCubeTexture9_GetCubeMapSurface, /* AddRef */
    514     (void *)LockCubeTexture9_LockRect,
    515     (void *)LockCubeTexture9_UnlockRect,
    516     (void *)LockCubeTexture9_AddDirtyRect
    517 };
    518 
    519 static HRESULT NINE_WINAPI
    520 LockDevice9_TestCooperativeLevel( struct NineDevice9 *This )
    521 {
    522     HRESULT r;
    523     pipe_mutex_lock(d3dlock_global);
    524     r = NineDevice9_TestCooperativeLevel(This);
    525     pipe_mutex_unlock(d3dlock_global);
    526     return r;
    527 }
    528 
    529 static UINT NINE_WINAPI
    530 LockDevice9_GetAvailableTextureMem( struct NineDevice9 *This )
    531 {
    532     UINT r;
    533     pipe_mutex_lock(d3dlock_global);
    534     r = NineDevice9_GetAvailableTextureMem(This);
    535     pipe_mutex_unlock(d3dlock_global);
    536     return r;
    537 }
    538 
    539 static HRESULT NINE_WINAPI
    540 LockDevice9_EvictManagedResources( struct NineDevice9 *This )
    541 {
    542     HRESULT r;
    543     pipe_mutex_lock(d3dlock_global);
    544     r = NineDevice9_EvictManagedResources(This);
    545     pipe_mutex_unlock(d3dlock_global);
    546     return r;
    547 }
    548 
    549 static HRESULT NINE_WINAPI
    550 LockDevice9_GetDirect3D( struct NineDevice9 *This,
    551                          IDirect3D9 **ppD3D9 )
    552 {
    553     HRESULT r;
    554     pipe_mutex_lock(d3dlock_global);
    555     r = NineDevice9_GetDirect3D(This, ppD3D9);
    556     pipe_mutex_unlock(d3dlock_global);
    557     return r;
    558 }
    559 
    560 #if 0
    561 static HRESULT NINE_WINAPI
    562 LockDevice9_GetDeviceCaps( struct NineDevice9 *This,
    563                            D3DCAPS9 *pCaps )
    564 {
    565     HRESULT r;
    566     pipe_mutex_lock(d3dlock_global);
    567     r = NineDevice9_GetDeviceCaps(This, pCaps);
    568     pipe_mutex_unlock(d3dlock_global);
    569     return r;
    570 }
    571 #endif
    572 
    573 static HRESULT NINE_WINAPI
    574 LockDevice9_GetDisplayMode( struct NineDevice9 *This,
    575                             UINT iSwapChain,
    576                             D3DDISPLAYMODE *pMode )
    577 {
    578     HRESULT r;
    579     pipe_mutex_lock(d3dlock_global);
    580     r = NineDevice9_GetDisplayMode(This, iSwapChain, pMode);
    581     pipe_mutex_unlock(d3dlock_global);
    582     return r;
    583 }
    584 
    585 #if 0
    586 static HRESULT NINE_WINAPI
    587 LockDevice9_GetCreationParameters( struct NineDevice9 *This,
    588                                    D3DDEVICE_CREATION_PARAMETERS *pParameters )
    589 {
    590     HRESULT r;
    591     pipe_mutex_lock(d3dlock_global);
    592     r = NineDevice9_GetCreationParameters(This, pParameters);
    593     pipe_mutex_unlock(d3dlock_global);
    594     return r;
    595 }
    596 #endif
    597 
    598 static HRESULT NINE_WINAPI
    599 LockDevice9_SetCursorProperties( struct NineDevice9 *This,
    600                                  UINT XHotSpot,
    601                                  UINT YHotSpot,
    602                                  IDirect3DSurface9 *pCursorBitmap )
    603 {
    604     HRESULT r;
    605     pipe_mutex_lock(d3dlock_global);
    606     r = NineDevice9_SetCursorProperties(This, XHotSpot, YHotSpot, pCursorBitmap);
    607     pipe_mutex_unlock(d3dlock_global);
    608     return r;
    609 }
    610 
    611 static void NINE_WINAPI
    612 LockDevice9_SetCursorPosition( struct NineDevice9 *This,
    613                                int X,
    614                                int Y,
    615                                DWORD Flags )
    616 {
    617     pipe_mutex_lock(d3dlock_global);
    618     NineDevice9_SetCursorPosition(This, X, Y, Flags);
    619     pipe_mutex_unlock(d3dlock_global);
    620 }
    621 
    622 static BOOL NINE_WINAPI
    623 LockDevice9_ShowCursor( struct NineDevice9 *This,
    624                         BOOL bShow )
    625 {
    626     BOOL r;
    627     pipe_mutex_lock(d3dlock_global);
    628     r = NineDevice9_ShowCursor(This, bShow);
    629     pipe_mutex_unlock(d3dlock_global);
    630     return r;
    631 }
    632 
    633 static HRESULT NINE_WINAPI
    634 LockDevice9_CreateAdditionalSwapChain( struct NineDevice9 *This,
    635                                        D3DPRESENT_PARAMETERS *pPresentationParameters,
    636                                        IDirect3DSwapChain9 **pSwapChain )
    637 {
    638     HRESULT r;
    639     pipe_mutex_lock(d3dlock_global);
    640     r = NineDevice9_CreateAdditionalSwapChain(This, pPresentationParameters, pSwapChain);
    641     pipe_mutex_unlock(d3dlock_global);
    642     return r;
    643 }
    644 
    645 static HRESULT NINE_WINAPI
    646 LockDevice9_GetSwapChain( struct NineDevice9 *This,
    647                           UINT iSwapChain,
    648                           IDirect3DSwapChain9 **pSwapChain )
    649 {
    650     HRESULT r;
    651     pipe_mutex_lock(d3dlock_global);
    652     r = NineDevice9_GetSwapChain(This, iSwapChain, pSwapChain);
    653     pipe_mutex_unlock(d3dlock_global);
    654     return r;
    655 }
    656 
    657 static UINT NINE_WINAPI
    658 LockDevice9_GetNumberOfSwapChains( struct NineDevice9 *This )
    659 {
    660     UINT r;
    661     pipe_mutex_lock(d3dlock_global);
    662     r = NineDevice9_GetNumberOfSwapChains(This);
    663     pipe_mutex_unlock(d3dlock_global);
    664     return r;
    665 }
    666 
    667 static HRESULT NINE_WINAPI
    668 LockDevice9_Reset( struct NineDevice9 *This,
    669                    D3DPRESENT_PARAMETERS *pPresentationParameters )
    670 {
    671     HRESULT r;
    672     pipe_mutex_lock(d3dlock_global);
    673     r = NineDevice9_Reset(This, pPresentationParameters);
    674     pipe_mutex_unlock(d3dlock_global);
    675     return r;
    676 }
    677 
    678 static HRESULT NINE_WINAPI
    679 LockDevice9_Present( struct NineDevice9 *This,
    680                      const RECT *pSourceRect,
    681                      const RECT *pDestRect,
    682                      HWND hDestWindowOverride,
    683                      const RGNDATA *pDirtyRegion )
    684 {
    685     HRESULT r;
    686     pipe_mutex_lock(d3dlock_global);
    687     r = NineDevice9_Present(This, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);
    688     pipe_mutex_unlock(d3dlock_global);
    689     return r;
    690 }
    691 
    692 static HRESULT NINE_WINAPI
    693 LockDevice9_GetBackBuffer( struct NineDevice9 *This,
    694                            UINT iSwapChain,
    695                            UINT iBackBuffer,
    696                            D3DBACKBUFFER_TYPE Type,
    697                            IDirect3DSurface9 **ppBackBuffer )
    698 {
    699     HRESULT r;
    700     pipe_mutex_lock(d3dlock_global);
    701     r = NineDevice9_GetBackBuffer(This, iSwapChain, iBackBuffer, Type, ppBackBuffer);
    702     pipe_mutex_unlock(d3dlock_global);
    703     return r;
    704 }
    705 
    706 static HRESULT NINE_WINAPI
    707 LockDevice9_GetRasterStatus( struct NineDevice9 *This,
    708                              UINT iSwapChain,
    709                              D3DRASTER_STATUS *pRasterStatus )
    710 {
    711     HRESULT r;
    712     pipe_mutex_lock(d3dlock_global);
    713     r = NineDevice9_GetRasterStatus(This, iSwapChain, pRasterStatus);
    714     pipe_mutex_unlock(d3dlock_global);
    715     return r;
    716 }
    717 
    718 static HRESULT NINE_WINAPI
    719 LockDevice9_SetDialogBoxMode( struct NineDevice9 *This,
    720                               BOOL bEnableDialogs )
    721 {
    722     HRESULT r;
    723     pipe_mutex_lock(d3dlock_global);
    724     r = NineDevice9_SetDialogBoxMode(This, bEnableDialogs);
    725     pipe_mutex_unlock(d3dlock_global);
    726     return r;
    727 }
    728 
    729 static void NINE_WINAPI
    730 LockDevice9_SetGammaRamp( struct NineDevice9 *This,
    731                           UINT iSwapChain,
    732                           DWORD Flags,
    733                           const D3DGAMMARAMP *pRamp )
    734 {
    735     pipe_mutex_lock(d3dlock_global);
    736     NineDevice9_SetGammaRamp(This, iSwapChain, Flags, pRamp);
    737     pipe_mutex_unlock(d3dlock_global);
    738 }
    739 
    740 static void NINE_WINAPI
    741 LockDevice9_GetGammaRamp( struct NineDevice9 *This,
    742                           UINT iSwapChain,
    743                           D3DGAMMARAMP *pRamp )
    744 {
    745     pipe_mutex_lock(d3dlock_global);
    746     NineDevice9_GetGammaRamp(This, iSwapChain, pRamp);
    747     pipe_mutex_unlock(d3dlock_global);
    748 }
    749 
    750 static HRESULT NINE_WINAPI
    751 LockDevice9_CreateTexture( struct NineDevice9 *This,
    752                            UINT Width,
    753                            UINT Height,
    754                            UINT Levels,
    755                            DWORD Usage,
    756                            D3DFORMAT Format,
    757                            D3DPOOL Pool,
    758                            IDirect3DTexture9 **ppTexture,
    759                            HANDLE *pSharedHandle )
    760 {
    761     HRESULT r;
    762     pipe_mutex_lock(d3dlock_global);
    763     r = NineDevice9_CreateTexture(This, Width, Height, Levels, Usage, Format, Pool, ppTexture, pSharedHandle);
    764     pipe_mutex_unlock(d3dlock_global);
    765     return r;
    766 }
    767 
    768 static HRESULT NINE_WINAPI
    769 LockDevice9_CreateVolumeTexture( struct NineDevice9 *This,
    770                                  UINT Width,
    771                                  UINT Height,
    772                                  UINT Depth,
    773                                  UINT Levels,
    774                                  DWORD Usage,
    775                                  D3DFORMAT Format,
    776                                  D3DPOOL Pool,
    777                                  IDirect3DVolumeTexture9 **ppVolumeTexture,
    778                                  HANDLE *pSharedHandle )
    779 {
    780     HRESULT r;
    781     pipe_mutex_lock(d3dlock_global);
    782     r = NineDevice9_CreateVolumeTexture(This, Width, Height, Depth, Levels, Usage, Format, Pool, ppVolumeTexture, pSharedHandle);
    783     pipe_mutex_unlock(d3dlock_global);
    784     return r;
    785 }
    786 
    787 static HRESULT NINE_WINAPI
    788 LockDevice9_CreateCubeTexture( struct NineDevice9 *This,
    789                                UINT EdgeLength,
    790                                UINT Levels,
    791                                DWORD Usage,
    792                                D3DFORMAT Format,
    793                                D3DPOOL Pool,
    794                                IDirect3DCubeTexture9 **ppCubeTexture,
    795                                HANDLE *pSharedHandle )
    796 {
    797     HRESULT r;
    798     pipe_mutex_lock(d3dlock_global);
    799     r = NineDevice9_CreateCubeTexture(This, EdgeLength, Levels, Usage, Format, Pool, ppCubeTexture, pSharedHandle);
    800     pipe_mutex_unlock(d3dlock_global);
    801     return r;
    802 }
    803 
    804 static HRESULT NINE_WINAPI
    805 LockDevice9_CreateVertexBuffer( struct NineDevice9 *This,
    806                                 UINT Length,
    807                                 DWORD Usage,
    808                                 DWORD FVF,
    809                                 D3DPOOL Pool,
    810                                 IDirect3DVertexBuffer9 **ppVertexBuffer,
    811                                 HANDLE *pSharedHandle )
    812 {
    813     HRESULT r;
    814     pipe_mutex_lock(d3dlock_global);
    815     r = NineDevice9_CreateVertexBuffer(This, Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle);
    816     pipe_mutex_unlock(d3dlock_global);
    817     return r;
    818 }
    819 
    820 static HRESULT NINE_WINAPI
    821 LockDevice9_CreateIndexBuffer( struct NineDevice9 *This,
    822                                UINT Length,
    823                                DWORD Usage,
    824                                D3DFORMAT Format,
    825                                D3DPOOL Pool,
    826                                IDirect3DIndexBuffer9 **ppIndexBuffer,
    827                                HANDLE *pSharedHandle )
    828 {
    829     HRESULT r;
    830     pipe_mutex_lock(d3dlock_global);
    831     r = NineDevice9_CreateIndexBuffer(This, Length, Usage, Format, Pool, ppIndexBuffer, pSharedHandle);
    832     pipe_mutex_unlock(d3dlock_global);
    833     return r;
    834 }
    835 
    836 static HRESULT NINE_WINAPI
    837 LockDevice9_CreateRenderTarget( struct NineDevice9 *This,
    838                                 UINT Width,
    839                                 UINT Height,
    840                                 D3DFORMAT Format,
    841                                 D3DMULTISAMPLE_TYPE MultiSample,
    842                                 DWORD MultisampleQuality,
    843                                 BOOL Lockable,
    844                                 IDirect3DSurface9 **ppSurface,
    845                                 HANDLE *pSharedHandle )
    846 {
    847     HRESULT r;
    848     pipe_mutex_lock(d3dlock_global);
    849     r = NineDevice9_CreateRenderTarget(This, Width, Height, Format, MultiSample, MultisampleQuality, Lockable, ppSurface, pSharedHandle);
    850     pipe_mutex_unlock(d3dlock_global);
    851     return r;
    852 }
    853 
    854 static HRESULT NINE_WINAPI
    855 LockDevice9_CreateDepthStencilSurface( struct NineDevice9 *This,
    856                                        UINT Width,
    857                                        UINT Height,
    858                                        D3DFORMAT Format,
    859                                        D3DMULTISAMPLE_TYPE MultiSample,
    860                                        DWORD MultisampleQuality,
    861                                        BOOL Discard,
    862                                        IDirect3DSurface9 **ppSurface,
    863                                        HANDLE *pSharedHandle )
    864 {
    865     HRESULT r;
    866     pipe_mutex_lock(d3dlock_global);
    867     r = NineDevice9_CreateDepthStencilSurface(This, Width, Height, Format, MultiSample, MultisampleQuality, Discard, ppSurface, pSharedHandle);
    868     pipe_mutex_unlock(d3dlock_global);
    869     return r;
    870 }
    871 
    872 static HRESULT NINE_WINAPI
    873 LockDevice9_UpdateSurface( struct NineDevice9 *This,
    874                            IDirect3DSurface9 *pSourceSurface,
    875                            const RECT *pSourceRect,
    876                            IDirect3DSurface9 *pDestinationSurface,
    877                            const POINT *pDestPoint )
    878 {
    879     HRESULT r;
    880     pipe_mutex_lock(d3dlock_global);
    881     r = NineDevice9_UpdateSurface(This, pSourceSurface, pSourceRect, pDestinationSurface, pDestPoint);
    882     pipe_mutex_unlock(d3dlock_global);
    883     return r;
    884 }
    885 
    886 static HRESULT NINE_WINAPI
    887 LockDevice9_UpdateTexture( struct NineDevice9 *This,
    888                            IDirect3DBaseTexture9 *pSourceTexture,
    889                            IDirect3DBaseTexture9 *pDestinationTexture )
    890 {
    891     HRESULT r;
    892     pipe_mutex_lock(d3dlock_global);
    893     r = NineDevice9_UpdateTexture(This, pSourceTexture, pDestinationTexture);
    894     pipe_mutex_unlock(d3dlock_global);
    895     return r;
    896 }
    897 
    898 static HRESULT NINE_WINAPI
    899 LockDevice9_GetRenderTargetData( struct NineDevice9 *This,
    900                                  IDirect3DSurface9 *pRenderTarget,
    901                                  IDirect3DSurface9 *pDestSurface )
    902 {
    903     HRESULT r;
    904     pipe_mutex_lock(d3dlock_global);
    905     r = NineDevice9_GetRenderTargetData(This, pRenderTarget, pDestSurface);
    906     pipe_mutex_unlock(d3dlock_global);
    907     return r;
    908 }
    909 
    910 static HRESULT NINE_WINAPI
    911 LockDevice9_GetFrontBufferData( struct NineDevice9 *This,
    912                                 UINT iSwapChain,
    913                                 IDirect3DSurface9 *pDestSurface )
    914 {
    915     HRESULT r;
    916     pipe_mutex_lock(d3dlock_global);
    917     r = NineDevice9_GetFrontBufferData(This, iSwapChain, pDestSurface);
    918     pipe_mutex_unlock(d3dlock_global);
    919     return r;
    920 }
    921 
    922 static HRESULT NINE_WINAPI
    923 LockDevice9_StretchRect( struct NineDevice9 *This,
    924                          IDirect3DSurface9 *pSourceSurface,
    925                          const RECT *pSourceRect,
    926                          IDirect3DSurface9 *pDestSurface,
    927                          const RECT *pDestRect,
    928                          D3DTEXTUREFILTERTYPE Filter )
    929 {
    930     HRESULT r;
    931     pipe_mutex_lock(d3dlock_global);
    932     r = NineDevice9_StretchRect(This, pSourceSurface, pSourceRect, pDestSurface, pDestRect, Filter);
    933     pipe_mutex_unlock(d3dlock_global);
    934     return r;
    935 }
    936 
    937 static HRESULT NINE_WINAPI
    938 LockDevice9_ColorFill( struct NineDevice9 *This,
    939                        IDirect3DSurface9 *pSurface,
    940                        const RECT *pRect,
    941                        D3DCOLOR color )
    942 {
    943     HRESULT r;
    944     pipe_mutex_lock(d3dlock_global);
    945     r = NineDevice9_ColorFill(This, pSurface, pRect, color);
    946     pipe_mutex_unlock(d3dlock_global);
    947     return r;
    948 }
    949 
    950 static HRESULT NINE_WINAPI
    951 LockDevice9_CreateOffscreenPlainSurface( struct NineDevice9 *This,
    952                                          UINT Width,
    953                                          UINT Height,
    954                                          D3DFORMAT Format,
    955                                          D3DPOOL Pool,
    956                                          IDirect3DSurface9 **ppSurface,
    957                                          HANDLE *pSharedHandle )
    958 {
    959     HRESULT r;
    960     pipe_mutex_lock(d3dlock_global);
    961     r = NineDevice9_CreateOffscreenPlainSurface(This, Width, Height, Format, Pool, ppSurface, pSharedHandle);
    962     pipe_mutex_unlock(d3dlock_global);
    963     return r;
    964 }
    965 
    966 static HRESULT NINE_WINAPI
    967 LockDevice9_SetRenderTarget( struct NineDevice9 *This,
    968                              DWORD RenderTargetIndex,
    969                              IDirect3DSurface9 *pRenderTarget )
    970 {
    971     HRESULT r;
    972     pipe_mutex_lock(d3dlock_global);
    973     r = NineDevice9_SetRenderTarget(This, RenderTargetIndex, pRenderTarget);
    974     pipe_mutex_unlock(d3dlock_global);
    975     return r;
    976 }
    977 
    978 static HRESULT NINE_WINAPI
    979 LockDevice9_GetRenderTarget( struct NineDevice9 *This,
    980                              DWORD RenderTargetIndex,
    981                              IDirect3DSurface9 **ppRenderTarget )
    982 {
    983     HRESULT r;
    984     pipe_mutex_lock(d3dlock_global);
    985     r = NineDevice9_GetRenderTarget(This, RenderTargetIndex, ppRenderTarget);
    986     pipe_mutex_unlock(d3dlock_global);
    987     return r;
    988 }
    989 
    990 static HRESULT NINE_WINAPI
    991 LockDevice9_SetDepthStencilSurface( struct NineDevice9 *This,
    992                                     IDirect3DSurface9 *pNewZStencil )
    993 {
    994     HRESULT r;
    995     pipe_mutex_lock(d3dlock_global);
    996     r = NineDevice9_SetDepthStencilSurface(This, pNewZStencil);
    997     pipe_mutex_unlock(d3dlock_global);
    998     return r;
    999 }
   1000 
   1001 static HRESULT NINE_WINAPI
   1002 LockDevice9_GetDepthStencilSurface( struct NineDevice9 *This,
   1003                                     IDirect3DSurface9 **ppZStencilSurface )
   1004 {
   1005     HRESULT r;
   1006     pipe_mutex_lock(d3dlock_global);
   1007     r = NineDevice9_GetDepthStencilSurface(This, ppZStencilSurface);
   1008     pipe_mutex_unlock(d3dlock_global);
   1009     return r;
   1010 }
   1011 
   1012 static HRESULT NINE_WINAPI
   1013 LockDevice9_BeginScene( struct NineDevice9 *This )
   1014 {
   1015     HRESULT r;
   1016     pipe_mutex_lock(d3dlock_global);
   1017     r = NineDevice9_BeginScene(This);
   1018     pipe_mutex_unlock(d3dlock_global);
   1019     return r;
   1020 }
   1021 
   1022 static HRESULT NINE_WINAPI
   1023 LockDevice9_EndScene( struct NineDevice9 *This )
   1024 {
   1025     HRESULT r;
   1026     pipe_mutex_lock(d3dlock_global);
   1027     r = NineDevice9_EndScene(This);
   1028     pipe_mutex_unlock(d3dlock_global);
   1029     return r;
   1030 }
   1031 
   1032 static HRESULT NINE_WINAPI
   1033 LockDevice9_Clear( struct NineDevice9 *This,
   1034                    DWORD Count,
   1035                    const D3DRECT *pRects,
   1036                    DWORD Flags,
   1037                    D3DCOLOR Color,
   1038                    float Z,
   1039                    DWORD Stencil )
   1040 {
   1041     HRESULT r;
   1042     pipe_mutex_lock(d3dlock_global);
   1043     r = NineDevice9_Clear(This, Count, pRects, Flags, Color, Z, Stencil);
   1044     pipe_mutex_unlock(d3dlock_global);
   1045     return r;
   1046 }
   1047 
   1048 static HRESULT NINE_WINAPI
   1049 LockDevice9_SetTransform( struct NineDevice9 *This,
   1050                           D3DTRANSFORMSTATETYPE State,
   1051                           const D3DMATRIX *pMatrix )
   1052 {
   1053     HRESULT r;
   1054     pipe_mutex_lock(d3dlock_global);
   1055     r = NineDevice9_SetTransform(This, State, pMatrix);
   1056     pipe_mutex_unlock(d3dlock_global);
   1057     return r;
   1058 }
   1059 
   1060 static HRESULT NINE_WINAPI
   1061 LockDevice9_GetTransform( struct NineDevice9 *This,
   1062                           D3DTRANSFORMSTATETYPE State,
   1063                           D3DMATRIX *pMatrix )
   1064 {
   1065     HRESULT r;
   1066     pipe_mutex_lock(d3dlock_global);
   1067     r = NineDevice9_GetTransform(This, State, pMatrix);
   1068     pipe_mutex_unlock(d3dlock_global);
   1069     return r;
   1070 }
   1071 
   1072 static HRESULT NINE_WINAPI
   1073 LockDevice9_MultiplyTransform( struct NineDevice9 *This,
   1074                                D3DTRANSFORMSTATETYPE State,
   1075                                const D3DMATRIX *pMatrix )
   1076 {
   1077     HRESULT r;
   1078     pipe_mutex_lock(d3dlock_global);
   1079     r = NineDevice9_MultiplyTransform(This, State, pMatrix);
   1080     pipe_mutex_unlock(d3dlock_global);
   1081     return r;
   1082 }
   1083 
   1084 static HRESULT NINE_WINAPI
   1085 LockDevice9_SetViewport( struct NineDevice9 *This,
   1086                          const D3DVIEWPORT9 *pViewport )
   1087 {
   1088     HRESULT r;
   1089     pipe_mutex_lock(d3dlock_global);
   1090     r = NineDevice9_SetViewport(This, pViewport);
   1091     pipe_mutex_unlock(d3dlock_global);
   1092     return r;
   1093 }
   1094 
   1095 static HRESULT NINE_WINAPI
   1096 LockDevice9_GetViewport( struct NineDevice9 *This,
   1097                          D3DVIEWPORT9 *pViewport )
   1098 {
   1099     HRESULT r;
   1100     pipe_mutex_lock(d3dlock_global);
   1101     r = NineDevice9_GetViewport(This, pViewport);
   1102     pipe_mutex_unlock(d3dlock_global);
   1103     return r;
   1104 }
   1105 
   1106 static HRESULT NINE_WINAPI
   1107 LockDevice9_SetMaterial( struct NineDevice9 *This,
   1108                          const D3DMATERIAL9 *pMaterial )
   1109 {
   1110     HRESULT r;
   1111     pipe_mutex_lock(d3dlock_global);
   1112     r = NineDevice9_SetMaterial(This, pMaterial);
   1113     pipe_mutex_unlock(d3dlock_global);
   1114     return r;
   1115 }
   1116 
   1117 static HRESULT NINE_WINAPI
   1118 LockDevice9_GetMaterial( struct NineDevice9 *This,
   1119                          D3DMATERIAL9 *pMaterial )
   1120 {
   1121     HRESULT r;
   1122     pipe_mutex_lock(d3dlock_global);
   1123     r = NineDevice9_GetMaterial(This, pMaterial);
   1124     pipe_mutex_unlock(d3dlock_global);
   1125     return r;
   1126 }
   1127 
   1128 static HRESULT NINE_WINAPI
   1129 LockDevice9_SetLight( struct NineDevice9 *This,
   1130                       DWORD Index,
   1131                       const D3DLIGHT9 *pLight )
   1132 {
   1133     HRESULT r;
   1134     pipe_mutex_lock(d3dlock_global);
   1135     r = NineDevice9_SetLight(This, Index, pLight);
   1136     pipe_mutex_unlock(d3dlock_global);
   1137     return r;
   1138 }
   1139 
   1140 static HRESULT NINE_WINAPI
   1141 LockDevice9_GetLight( struct NineDevice9 *This,
   1142                       DWORD Index,
   1143                       D3DLIGHT9 *pLight )
   1144 {
   1145     HRESULT r;
   1146     pipe_mutex_lock(d3dlock_global);
   1147     r = NineDevice9_GetLight(This, Index, pLight);
   1148     pipe_mutex_unlock(d3dlock_global);
   1149     return r;
   1150 }
   1151 
   1152 static HRESULT NINE_WINAPI
   1153 LockDevice9_LightEnable( struct NineDevice9 *This,
   1154                          DWORD Index,
   1155                          BOOL Enable )
   1156 {
   1157     HRESULT r;
   1158     pipe_mutex_lock(d3dlock_global);
   1159     r = NineDevice9_LightEnable(This, Index, Enable);
   1160     pipe_mutex_unlock(d3dlock_global);
   1161     return r;
   1162 }
   1163 
   1164 static HRESULT NINE_WINAPI
   1165 LockDevice9_GetLightEnable( struct NineDevice9 *This,
   1166                             DWORD Index,
   1167                             BOOL *pEnable )
   1168 {
   1169     HRESULT r;
   1170     pipe_mutex_lock(d3dlock_global);
   1171     r = NineDevice9_GetLightEnable(This, Index, pEnable);
   1172     pipe_mutex_unlock(d3dlock_global);
   1173     return r;
   1174 }
   1175 
   1176 static HRESULT NINE_WINAPI
   1177 LockDevice9_SetClipPlane( struct NineDevice9 *This,
   1178                           DWORD Index,
   1179                           const float *pPlane )
   1180 {
   1181     HRESULT r;
   1182     pipe_mutex_lock(d3dlock_global);
   1183     r = NineDevice9_SetClipPlane(This, Index, pPlane);
   1184     pipe_mutex_unlock(d3dlock_global);
   1185     return r;
   1186 }
   1187 
   1188 static HRESULT NINE_WINAPI
   1189 LockDevice9_GetClipPlane( struct NineDevice9 *This,
   1190                           DWORD Index,
   1191                           float *pPlane )
   1192 {
   1193     HRESULT r;
   1194     pipe_mutex_lock(d3dlock_global);
   1195     r = NineDevice9_GetClipPlane(This, Index, pPlane);
   1196     pipe_mutex_unlock(d3dlock_global);
   1197     return r;
   1198 }
   1199 
   1200 static HRESULT NINE_WINAPI
   1201 LockDevice9_SetRenderState( struct NineDevice9 *This,
   1202                             D3DRENDERSTATETYPE State,
   1203                             DWORD Value )
   1204 {
   1205     HRESULT r;
   1206     pipe_mutex_lock(d3dlock_global);
   1207     r = NineDevice9_SetRenderState(This, State, Value);
   1208     pipe_mutex_unlock(d3dlock_global);
   1209     return r;
   1210 }
   1211 
   1212 static HRESULT NINE_WINAPI
   1213 LockDevice9_GetRenderState( struct NineDevice9 *This,
   1214                             D3DRENDERSTATETYPE State,
   1215                             DWORD *pValue )
   1216 {
   1217     HRESULT r;
   1218     pipe_mutex_lock(d3dlock_global);
   1219     r = NineDevice9_GetRenderState(This, State, pValue);
   1220     pipe_mutex_unlock(d3dlock_global);
   1221     return r;
   1222 }
   1223 
   1224 static HRESULT NINE_WINAPI
   1225 LockDevice9_CreateStateBlock( struct NineDevice9 *This,
   1226                               D3DSTATEBLOCKTYPE Type,
   1227                               IDirect3DStateBlock9 **ppSB )
   1228 {
   1229     HRESULT r;
   1230     pipe_mutex_lock(d3dlock_global);
   1231     r = NineDevice9_CreateStateBlock(This, Type, ppSB);
   1232     pipe_mutex_unlock(d3dlock_global);
   1233     return r;
   1234 }
   1235 
   1236 static HRESULT NINE_WINAPI
   1237 LockDevice9_BeginStateBlock( struct NineDevice9 *This )
   1238 {
   1239     HRESULT r;
   1240     pipe_mutex_lock(d3dlock_global);
   1241     r = NineDevice9_BeginStateBlock(This);
   1242     pipe_mutex_unlock(d3dlock_global);
   1243     return r;
   1244 }
   1245 
   1246 static HRESULT NINE_WINAPI
   1247 LockDevice9_EndStateBlock( struct NineDevice9 *This,
   1248                            IDirect3DStateBlock9 **ppSB )
   1249 {
   1250     HRESULT r;
   1251     pipe_mutex_lock(d3dlock_global);
   1252     r = NineDevice9_EndStateBlock(This, ppSB);
   1253     pipe_mutex_unlock(d3dlock_global);
   1254     return r;
   1255 }
   1256 
   1257 static HRESULT NINE_WINAPI
   1258 LockDevice9_SetClipStatus( struct NineDevice9 *This,
   1259                            const D3DCLIPSTATUS9 *pClipStatus )
   1260 {
   1261     HRESULT r;
   1262     pipe_mutex_lock(d3dlock_global);
   1263     r = NineDevice9_SetClipStatus(This, pClipStatus);
   1264     pipe_mutex_unlock(d3dlock_global);
   1265     return r;
   1266 }
   1267 
   1268 static HRESULT NINE_WINAPI
   1269 LockDevice9_GetClipStatus( struct NineDevice9 *This,
   1270                            D3DCLIPSTATUS9 *pClipStatus )
   1271 {
   1272     HRESULT r;
   1273     pipe_mutex_lock(d3dlock_global);
   1274     r = NineDevice9_GetClipStatus(This, pClipStatus);
   1275     pipe_mutex_unlock(d3dlock_global);
   1276     return r;
   1277 }
   1278 
   1279 static HRESULT NINE_WINAPI
   1280 LockDevice9_GetTexture( struct NineDevice9 *This,
   1281                         DWORD Stage,
   1282                         IDirect3DBaseTexture9 **ppTexture )
   1283 {
   1284     HRESULT r;
   1285     pipe_mutex_lock(d3dlock_global);
   1286     r = NineDevice9_GetTexture(This, Stage, ppTexture);
   1287     pipe_mutex_unlock(d3dlock_global);
   1288     return r;
   1289 }
   1290 
   1291 static HRESULT NINE_WINAPI
   1292 LockDevice9_SetTexture( struct NineDevice9 *This,
   1293                         DWORD Stage,
   1294                         IDirect3DBaseTexture9 *pTexture )
   1295 {
   1296     HRESULT r;
   1297     pipe_mutex_lock(d3dlock_global);
   1298     r = NineDevice9_SetTexture(This, Stage, pTexture);
   1299     pipe_mutex_unlock(d3dlock_global);
   1300     return r;
   1301 }
   1302 
   1303 static HRESULT NINE_WINAPI
   1304 LockDevice9_GetTextureStageState( struct NineDevice9 *This,
   1305                                   DWORD Stage,
   1306                                   D3DTEXTURESTAGESTATETYPE Type,
   1307                                   DWORD *pValue )
   1308 {
   1309     HRESULT r;
   1310     pipe_mutex_lock(d3dlock_global);
   1311     r = NineDevice9_GetTextureStageState(This, Stage, Type, pValue);
   1312     pipe_mutex_unlock(d3dlock_global);
   1313     return r;
   1314 }
   1315 
   1316 static HRESULT NINE_WINAPI
   1317 LockDevice9_SetTextureStageState( struct NineDevice9 *This,
   1318                                   DWORD Stage,
   1319                                   D3DTEXTURESTAGESTATETYPE Type,
   1320                                   DWORD Value )
   1321 {
   1322     HRESULT r;
   1323     pipe_mutex_lock(d3dlock_global);
   1324     r = NineDevice9_SetTextureStageState(This, Stage, Type, Value);
   1325     pipe_mutex_unlock(d3dlock_global);
   1326     return r;
   1327 }
   1328 
   1329 static HRESULT NINE_WINAPI
   1330 LockDevice9_GetSamplerState( struct NineDevice9 *This,
   1331                              DWORD Sampler,
   1332                              D3DSAMPLERSTATETYPE Type,
   1333                              DWORD *pValue )
   1334 {
   1335     HRESULT r;
   1336     pipe_mutex_lock(d3dlock_global);
   1337     r = NineDevice9_GetSamplerState(This, Sampler, Type, pValue);
   1338     pipe_mutex_unlock(d3dlock_global);
   1339     return r;
   1340 }
   1341 
   1342 static HRESULT NINE_WINAPI
   1343 LockDevice9_SetSamplerState( struct NineDevice9 *This,
   1344                              DWORD Sampler,
   1345                              D3DSAMPLERSTATETYPE Type,
   1346                              DWORD Value )
   1347 {
   1348     HRESULT r;
   1349     pipe_mutex_lock(d3dlock_global);
   1350     r = NineDevice9_SetSamplerState(This, Sampler, Type, Value);
   1351     pipe_mutex_unlock(d3dlock_global);
   1352     return r;
   1353 }
   1354 
   1355 static HRESULT NINE_WINAPI
   1356 LockDevice9_ValidateDevice( struct NineDevice9 *This,
   1357                             DWORD *pNumPasses )
   1358 {
   1359     HRESULT r;
   1360     pipe_mutex_lock(d3dlock_global);
   1361     r = NineDevice9_ValidateDevice(This, pNumPasses);
   1362     pipe_mutex_unlock(d3dlock_global);
   1363     return r;
   1364 }
   1365 
   1366 static HRESULT NINE_WINAPI
   1367 LockDevice9_SetPaletteEntries( struct NineDevice9 *This,
   1368                                UINT PaletteNumber,
   1369                                const PALETTEENTRY *pEntries )
   1370 {
   1371     HRESULT r;
   1372     pipe_mutex_lock(d3dlock_global);
   1373     r = NineDevice9_SetPaletteEntries(This, PaletteNumber, pEntries);
   1374     pipe_mutex_unlock(d3dlock_global);
   1375     return r;
   1376 }
   1377 
   1378 static HRESULT NINE_WINAPI
   1379 LockDevice9_GetPaletteEntries( struct NineDevice9 *This,
   1380                                UINT PaletteNumber,
   1381                                PALETTEENTRY *pEntries )
   1382 {
   1383     HRESULT r;
   1384     pipe_mutex_lock(d3dlock_global);
   1385     r = NineDevice9_GetPaletteEntries(This, PaletteNumber, pEntries);
   1386     pipe_mutex_unlock(d3dlock_global);
   1387     return r;
   1388 }
   1389 
   1390 static HRESULT NINE_WINAPI
   1391 LockDevice9_SetCurrentTexturePalette( struct NineDevice9 *This,
   1392                                       UINT PaletteNumber )
   1393 {
   1394     HRESULT r;
   1395     pipe_mutex_lock(d3dlock_global);
   1396     r = NineDevice9_SetCurrentTexturePalette(This, PaletteNumber);
   1397     pipe_mutex_unlock(d3dlock_global);
   1398     return r;
   1399 }
   1400 
   1401 static HRESULT NINE_WINAPI
   1402 LockDevice9_GetCurrentTexturePalette( struct NineDevice9 *This,
   1403                                       UINT *PaletteNumber )
   1404 {
   1405     HRESULT r;
   1406     pipe_mutex_lock(d3dlock_global);
   1407     r = NineDevice9_GetCurrentTexturePalette(This, PaletteNumber);
   1408     pipe_mutex_unlock(d3dlock_global);
   1409     return r;
   1410 }
   1411 
   1412 static HRESULT NINE_WINAPI
   1413 LockDevice9_SetScissorRect( struct NineDevice9 *This,
   1414                             const RECT *pRect )
   1415 {
   1416     HRESULT r;
   1417     pipe_mutex_lock(d3dlock_global);
   1418     r = NineDevice9_SetScissorRect(This, pRect);
   1419     pipe_mutex_unlock(d3dlock_global);
   1420     return r;
   1421 }
   1422 
   1423 static HRESULT NINE_WINAPI
   1424 LockDevice9_GetScissorRect( struct NineDevice9 *This,
   1425                             RECT *pRect )
   1426 {
   1427     HRESULT r;
   1428     pipe_mutex_lock(d3dlock_global);
   1429     r = NineDevice9_GetScissorRect(This, pRect);
   1430     pipe_mutex_unlock(d3dlock_global);
   1431     return r;
   1432 }
   1433 
   1434 static HRESULT NINE_WINAPI
   1435 LockDevice9_SetSoftwareVertexProcessing( struct NineDevice9 *This,
   1436                                          BOOL bSoftware )
   1437 {
   1438     HRESULT r;
   1439     pipe_mutex_lock(d3dlock_global);
   1440     r = NineDevice9_SetSoftwareVertexProcessing(This, bSoftware);
   1441     pipe_mutex_unlock(d3dlock_global);
   1442     return r;
   1443 }
   1444 
   1445 static BOOL NINE_WINAPI
   1446 LockDevice9_GetSoftwareVertexProcessing( struct NineDevice9 *This )
   1447 {
   1448     BOOL r;
   1449     pipe_mutex_lock(d3dlock_global);
   1450     r = NineDevice9_GetSoftwareVertexProcessing(This);
   1451     pipe_mutex_unlock(d3dlock_global);
   1452     return r;
   1453 }
   1454 
   1455 static HRESULT NINE_WINAPI
   1456 LockDevice9_SetNPatchMode( struct NineDevice9 *This,
   1457                            float nSegments )
   1458 {
   1459     HRESULT r;
   1460     pipe_mutex_lock(d3dlock_global);
   1461     r = NineDevice9_SetNPatchMode(This, nSegments);
   1462     pipe_mutex_unlock(d3dlock_global);
   1463     return r;
   1464 }
   1465 
   1466 static float NINE_WINAPI
   1467 LockDevice9_GetNPatchMode( struct NineDevice9 *This )
   1468 {
   1469     float r;
   1470     pipe_mutex_lock(d3dlock_global);
   1471     r = NineDevice9_GetNPatchMode(This);
   1472     pipe_mutex_unlock(d3dlock_global);
   1473     return r;
   1474 }
   1475 
   1476 static HRESULT NINE_WINAPI
   1477 LockDevice9_DrawPrimitive( struct NineDevice9 *This,
   1478                            D3DPRIMITIVETYPE PrimitiveType,
   1479                            UINT StartVertex,
   1480                            UINT PrimitiveCount )
   1481 {
   1482     HRESULT r;
   1483     pipe_mutex_lock(d3dlock_global);
   1484     r = NineDevice9_DrawPrimitive(This, PrimitiveType, StartVertex, PrimitiveCount);
   1485     pipe_mutex_unlock(d3dlock_global);
   1486     return r;
   1487 }
   1488 
   1489 static HRESULT NINE_WINAPI
   1490 LockDevice9_DrawIndexedPrimitive( struct NineDevice9 *This,
   1491                                   D3DPRIMITIVETYPE PrimitiveType,
   1492                                   INT BaseVertexIndex,
   1493                                   UINT MinVertexIndex,
   1494                                   UINT NumVertices,
   1495                                   UINT startIndex,
   1496                                   UINT primCount )
   1497 {
   1498     HRESULT r;
   1499     pipe_mutex_lock(d3dlock_global);
   1500     r = NineDevice9_DrawIndexedPrimitive(This, PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);
   1501     pipe_mutex_unlock(d3dlock_global);
   1502     return r;
   1503 }
   1504 
   1505 static HRESULT NINE_WINAPI
   1506 LockDevice9_DrawPrimitiveUP( struct NineDevice9 *This,
   1507                              D3DPRIMITIVETYPE PrimitiveType,
   1508                              UINT PrimitiveCount,
   1509                              const void *pVertexStreamZeroData,
   1510                              UINT VertexStreamZeroStride )
   1511 {
   1512     HRESULT r;
   1513     pipe_mutex_lock(d3dlock_global);
   1514     r = NineDevice9_DrawPrimitiveUP(This, PrimitiveType, PrimitiveCount, pVertexStreamZeroData, VertexStreamZeroStride);
   1515     pipe_mutex_unlock(d3dlock_global);
   1516     return r;
   1517 }
   1518 
   1519 static HRESULT NINE_WINAPI
   1520 LockDevice9_DrawIndexedPrimitiveUP( struct NineDevice9 *This,
   1521                                     D3DPRIMITIVETYPE PrimitiveType,
   1522                                     UINT MinVertexIndex,
   1523                                     UINT NumVertices,
   1524                                     UINT PrimitiveCount,
   1525                                     const void *pIndexData,
   1526                                     D3DFORMAT IndexDataFormat,
   1527                                     const void *pVertexStreamZeroData,
   1528                                     UINT VertexStreamZeroStride )
   1529 {
   1530     HRESULT r;
   1531     pipe_mutex_lock(d3dlock_global);
   1532     r = NineDevice9_DrawIndexedPrimitiveUP(This, PrimitiveType, MinVertexIndex, NumVertices, PrimitiveCount, pIndexData, IndexDataFormat, pVertexStreamZeroData, VertexStreamZeroStride);
   1533     pipe_mutex_unlock(d3dlock_global);
   1534     return r;
   1535 }
   1536 
   1537 static HRESULT NINE_WINAPI
   1538 LockDevice9_ProcessVertices( struct NineDevice9 *This,
   1539                              UINT SrcStartIndex,
   1540                              UINT DestIndex,
   1541                              UINT VertexCount,
   1542                              IDirect3DVertexBuffer9 *pDestBuffer,
   1543                              IDirect3DVertexDeclaration9 *pVertexDecl,
   1544                              DWORD Flags )
   1545 {
   1546     HRESULT r;
   1547     pipe_mutex_lock(d3dlock_global);
   1548     r = NineDevice9_ProcessVertices(This, SrcStartIndex, DestIndex, VertexCount, pDestBuffer, pVertexDecl, Flags);
   1549     pipe_mutex_unlock(d3dlock_global);
   1550     return r;
   1551 }
   1552 
   1553 static HRESULT NINE_WINAPI
   1554 LockDevice9_CreateVertexDeclaration( struct NineDevice9 *This,
   1555                                      const D3DVERTEXELEMENT9 *pVertexElements,
   1556                                      IDirect3DVertexDeclaration9 **ppDecl )
   1557 {
   1558     HRESULT r;
   1559     pipe_mutex_lock(d3dlock_global);
   1560     r = NineDevice9_CreateVertexDeclaration(This, pVertexElements, ppDecl);
   1561     pipe_mutex_unlock(d3dlock_global);
   1562     return r;
   1563 }
   1564 
   1565 static HRESULT NINE_WINAPI
   1566 LockDevice9_SetVertexDeclaration( struct NineDevice9 *This,
   1567                                   IDirect3DVertexDeclaration9 *pDecl )
   1568 {
   1569     HRESULT r;
   1570     pipe_mutex_lock(d3dlock_global);
   1571     r = NineDevice9_SetVertexDeclaration(This, pDecl);
   1572     pipe_mutex_unlock(d3dlock_global);
   1573     return r;
   1574 }
   1575 
   1576 static HRESULT NINE_WINAPI
   1577 LockDevice9_GetVertexDeclaration( struct NineDevice9 *This,
   1578                                   IDirect3DVertexDeclaration9 **ppDecl )
   1579 {
   1580     HRESULT r;
   1581     pipe_mutex_lock(d3dlock_global);
   1582     r = NineDevice9_GetVertexDeclaration(This, ppDecl);
   1583     pipe_mutex_unlock(d3dlock_global);
   1584     return r;
   1585 }
   1586 
   1587 static HRESULT NINE_WINAPI
   1588 LockDevice9_SetFVF( struct NineDevice9 *This,
   1589                     DWORD FVF )
   1590 {
   1591     HRESULT r;
   1592     pipe_mutex_lock(d3dlock_global);
   1593     r = NineDevice9_SetFVF(This, FVF);
   1594     pipe_mutex_unlock(d3dlock_global);
   1595     return r;
   1596 }
   1597 
   1598 static HRESULT NINE_WINAPI
   1599 LockDevice9_GetFVF( struct NineDevice9 *This,
   1600                     DWORD *pFVF )
   1601 {
   1602     HRESULT r;
   1603     pipe_mutex_lock(d3dlock_global);
   1604     r = NineDevice9_GetFVF(This, pFVF);
   1605     pipe_mutex_unlock(d3dlock_global);
   1606     return r;
   1607 }
   1608 
   1609 static HRESULT NINE_WINAPI
   1610 LockDevice9_CreateVertexShader( struct NineDevice9 *This,
   1611                                 const DWORD *pFunction,
   1612                                 IDirect3DVertexShader9 **ppShader )
   1613 {
   1614     HRESULT r;
   1615     pipe_mutex_lock(d3dlock_global);
   1616     r = NineDevice9_CreateVertexShader(This, pFunction, ppShader);
   1617     pipe_mutex_unlock(d3dlock_global);
   1618     return r;
   1619 }
   1620 
   1621 static HRESULT NINE_WINAPI
   1622 LockDevice9_SetVertexShader( struct NineDevice9 *This,
   1623                              IDirect3DVertexShader9 *pShader )
   1624 {
   1625     HRESULT r;
   1626     pipe_mutex_lock(d3dlock_global);
   1627     r = NineDevice9_SetVertexShader(This, pShader);
   1628     pipe_mutex_unlock(d3dlock_global);
   1629     return r;
   1630 }
   1631 
   1632 static HRESULT NINE_WINAPI
   1633 LockDevice9_GetVertexShader( struct NineDevice9 *This,
   1634                              IDirect3DVertexShader9 **ppShader )
   1635 {
   1636     HRESULT r;
   1637     pipe_mutex_lock(d3dlock_global);
   1638     r = NineDevice9_GetVertexShader(This, ppShader);
   1639     pipe_mutex_unlock(d3dlock_global);
   1640     return r;
   1641 }
   1642 
   1643 static HRESULT NINE_WINAPI
   1644 LockDevice9_SetVertexShaderConstantF( struct NineDevice9 *This,
   1645                                       UINT StartRegister,
   1646                                       const float *pConstantData,
   1647                                       UINT Vector4fCount )
   1648 {
   1649     HRESULT r;
   1650     pipe_mutex_lock(d3dlock_global);
   1651     r = NineDevice9_SetVertexShaderConstantF(This, StartRegister, pConstantData, Vector4fCount);
   1652     pipe_mutex_unlock(d3dlock_global);
   1653     return r;
   1654 }
   1655 
   1656 static HRESULT NINE_WINAPI
   1657 LockDevice9_GetVertexShaderConstantF( struct NineDevice9 *This,
   1658                                       UINT StartRegister,
   1659                                       float *pConstantData,
   1660                                       UINT Vector4fCount )
   1661 {
   1662     HRESULT r;
   1663     pipe_mutex_lock(d3dlock_global);
   1664     r = NineDevice9_GetVertexShaderConstantF(This, StartRegister, pConstantData, Vector4fCount);
   1665     pipe_mutex_unlock(d3dlock_global);
   1666     return r;
   1667 }
   1668 
   1669 static HRESULT NINE_WINAPI
   1670 LockDevice9_SetVertexShaderConstantI( struct NineDevice9 *This,
   1671                                       UINT StartRegister,
   1672                                       const int *pConstantData,
   1673                                       UINT Vector4iCount )
   1674 {
   1675     HRESULT r;
   1676     pipe_mutex_lock(d3dlock_global);
   1677     r = NineDevice9_SetVertexShaderConstantI(This, StartRegister, pConstantData, Vector4iCount);
   1678     pipe_mutex_unlock(d3dlock_global);
   1679     return r;
   1680 }
   1681 
   1682 static HRESULT NINE_WINAPI
   1683 LockDevice9_GetVertexShaderConstantI( struct NineDevice9 *This,
   1684                                       UINT StartRegister,
   1685                                       int *pConstantData,
   1686                                       UINT Vector4iCount )
   1687 {
   1688     HRESULT r;
   1689     pipe_mutex_lock(d3dlock_global);
   1690     r = NineDevice9_GetVertexShaderConstantI(This, StartRegister, pConstantData, Vector4iCount);
   1691     pipe_mutex_unlock(d3dlock_global);
   1692     return r;
   1693 }
   1694 
   1695 static HRESULT NINE_WINAPI
   1696 LockDevice9_SetVertexShaderConstantB( struct NineDevice9 *This,
   1697                                       UINT StartRegister,
   1698                                       const BOOL *pConstantData,
   1699                                       UINT BoolCount )
   1700 {
   1701     HRESULT r;
   1702     pipe_mutex_lock(d3dlock_global);
   1703     r = NineDevice9_SetVertexShaderConstantB(This, StartRegister, pConstantData, BoolCount);
   1704     pipe_mutex_unlock(d3dlock_global);
   1705     return r;
   1706 }
   1707 
   1708 static HRESULT NINE_WINAPI
   1709 LockDevice9_GetVertexShaderConstantB( struct NineDevice9 *This,
   1710                                       UINT StartRegister,
   1711                                       BOOL *pConstantData,
   1712                                       UINT BoolCount )
   1713 {
   1714     HRESULT r;
   1715     pipe_mutex_lock(d3dlock_global);
   1716     r = NineDevice9_GetVertexShaderConstantB(This, StartRegister, pConstantData, BoolCount);
   1717     pipe_mutex_unlock(d3dlock_global);
   1718     return r;
   1719 }
   1720 
   1721 static HRESULT NINE_WINAPI
   1722 LockDevice9_SetStreamSource( struct NineDevice9 *This,
   1723                              UINT StreamNumber,
   1724                              IDirect3DVertexBuffer9 *pStreamData,
   1725                              UINT OffsetInBytes,
   1726                              UINT Stride )
   1727 {
   1728     HRESULT r;
   1729     pipe_mutex_lock(d3dlock_global);
   1730     r = NineDevice9_SetStreamSource(This, StreamNumber, pStreamData, OffsetInBytes, Stride);
   1731     pipe_mutex_unlock(d3dlock_global);
   1732     return r;
   1733 }
   1734 
   1735 static HRESULT NINE_WINAPI
   1736 LockDevice9_GetStreamSource( struct NineDevice9 *This,
   1737                              UINT StreamNumber,
   1738                              IDirect3DVertexBuffer9 **ppStreamData,
   1739                              UINT *pOffsetInBytes,
   1740                              UINT *pStride )
   1741 {
   1742     HRESULT r;
   1743     pipe_mutex_lock(d3dlock_global);
   1744     r = NineDevice9_GetStreamSource(This, StreamNumber, ppStreamData, pOffsetInBytes, pStride);
   1745     pipe_mutex_unlock(d3dlock_global);
   1746     return r;
   1747 }
   1748 
   1749 static HRESULT NINE_WINAPI
   1750 LockDevice9_SetStreamSourceFreq( struct NineDevice9 *This,
   1751                                  UINT StreamNumber,
   1752                                  UINT Setting )
   1753 {
   1754     HRESULT r;
   1755     pipe_mutex_lock(d3dlock_global);
   1756     r = NineDevice9_SetStreamSourceFreq(This, StreamNumber, Setting);
   1757     pipe_mutex_unlock(d3dlock_global);
   1758     return r;
   1759 }
   1760 
   1761 static HRESULT NINE_WINAPI
   1762 LockDevice9_GetStreamSourceFreq( struct NineDevice9 *This,
   1763                                  UINT StreamNumber,
   1764                                  UINT *pSetting )
   1765 {
   1766     HRESULT r;
   1767     pipe_mutex_lock(d3dlock_global);
   1768     r = NineDevice9_GetStreamSourceFreq(This, StreamNumber, pSetting);
   1769     pipe_mutex_unlock(d3dlock_global);
   1770     return r;
   1771 }
   1772 
   1773 static HRESULT NINE_WINAPI
   1774 LockDevice9_SetIndices( struct NineDevice9 *This,
   1775                         IDirect3DIndexBuffer9 *pIndexData )
   1776 {
   1777     HRESULT r;
   1778     pipe_mutex_lock(d3dlock_global);
   1779     r = NineDevice9_SetIndices(This, pIndexData);
   1780     pipe_mutex_unlock(d3dlock_global);
   1781     return r;
   1782 }
   1783 
   1784 static HRESULT NINE_WINAPI
   1785 LockDevice9_GetIndices( struct NineDevice9 *This,
   1786                         IDirect3DIndexBuffer9 **ppIndexData )
   1787 {
   1788     HRESULT r;
   1789     pipe_mutex_lock(d3dlock_global);
   1790     r = NineDevice9_GetIndices(This, ppIndexData);
   1791     pipe_mutex_unlock(d3dlock_global);
   1792     return r;
   1793 }
   1794 
   1795 static HRESULT NINE_WINAPI
   1796 LockDevice9_CreatePixelShader( struct NineDevice9 *This,
   1797                                const DWORD *pFunction,
   1798                                IDirect3DPixelShader9 **ppShader )
   1799 {
   1800     HRESULT r;
   1801     pipe_mutex_lock(d3dlock_global);
   1802     r = NineDevice9_CreatePixelShader(This, pFunction, ppShader);
   1803     pipe_mutex_unlock(d3dlock_global);
   1804     return r;
   1805 }
   1806 
   1807 static HRESULT NINE_WINAPI
   1808 LockDevice9_SetPixelShader( struct NineDevice9 *This,
   1809                             IDirect3DPixelShader9 *pShader )
   1810 {
   1811     HRESULT r;
   1812     pipe_mutex_lock(d3dlock_global);
   1813     r = NineDevice9_SetPixelShader(This, pShader);
   1814     pipe_mutex_unlock(d3dlock_global);
   1815     return r;
   1816 }
   1817 
   1818 static HRESULT NINE_WINAPI
   1819 LockDevice9_GetPixelShader( struct NineDevice9 *This,
   1820                             IDirect3DPixelShader9 **ppShader )
   1821 {
   1822     HRESULT r;
   1823     pipe_mutex_lock(d3dlock_global);
   1824     r = NineDevice9_GetPixelShader(This, ppShader);
   1825     pipe_mutex_unlock(d3dlock_global);
   1826     return r;
   1827 }
   1828 
   1829 static HRESULT NINE_WINAPI
   1830 LockDevice9_SetPixelShaderConstantF( struct NineDevice9 *This,
   1831                                      UINT StartRegister,
   1832                                      const float *pConstantData,
   1833                                      UINT Vector4fCount )
   1834 {
   1835     HRESULT r;
   1836     pipe_mutex_lock(d3dlock_global);
   1837     r = NineDevice9_SetPixelShaderConstantF(This, StartRegister, pConstantData, Vector4fCount);
   1838     pipe_mutex_unlock(d3dlock_global);
   1839     return r;
   1840 }
   1841 
   1842 static HRESULT NINE_WINAPI
   1843 LockDevice9_GetPixelShaderConstantF( struct NineDevice9 *This,
   1844                                      UINT StartRegister,
   1845                                      float *pConstantData,
   1846                                      UINT Vector4fCount )
   1847 {
   1848     HRESULT r;
   1849     pipe_mutex_lock(d3dlock_global);
   1850     r = NineDevice9_GetPixelShaderConstantF(This, StartRegister, pConstantData, Vector4fCount);
   1851     pipe_mutex_unlock(d3dlock_global);
   1852     return r;
   1853 }
   1854 
   1855 static HRESULT NINE_WINAPI
   1856 LockDevice9_SetPixelShaderConstantI( struct NineDevice9 *This,
   1857                                      UINT StartRegister,
   1858                                      const int *pConstantData,
   1859                                      UINT Vector4iCount )
   1860 {
   1861     HRESULT r;
   1862     pipe_mutex_lock(d3dlock_global);
   1863     r = NineDevice9_SetPixelShaderConstantI(This, StartRegister, pConstantData, Vector4iCount);
   1864     pipe_mutex_unlock(d3dlock_global);
   1865     return r;
   1866 }
   1867 
   1868 static HRESULT NINE_WINAPI
   1869 LockDevice9_GetPixelShaderConstantI( struct NineDevice9 *This,
   1870                                      UINT StartRegister,
   1871                                      int *pConstantData,
   1872                                      UINT Vector4iCount )
   1873 {
   1874     HRESULT r;
   1875     pipe_mutex_lock(d3dlock_global);
   1876     r = NineDevice9_GetPixelShaderConstantI(This, StartRegister, pConstantData, Vector4iCount);
   1877     pipe_mutex_unlock(d3dlock_global);
   1878     return r;
   1879 }
   1880 
   1881 static HRESULT NINE_WINAPI
   1882 LockDevice9_SetPixelShaderConstantB( struct NineDevice9 *This,
   1883                                      UINT StartRegister,
   1884                                      const BOOL *pConstantData,
   1885                                      UINT BoolCount )
   1886 {
   1887     HRESULT r;
   1888     pipe_mutex_lock(d3dlock_global);
   1889     r = NineDevice9_SetPixelShaderConstantB(This, StartRegister, pConstantData, BoolCount);
   1890     pipe_mutex_unlock(d3dlock_global);
   1891     return r;
   1892 }
   1893 
   1894 static HRESULT NINE_WINAPI
   1895 LockDevice9_GetPixelShaderConstantB( struct NineDevice9 *This,
   1896                                      UINT StartRegister,
   1897                                      BOOL *pConstantData,
   1898                                      UINT BoolCount )
   1899 {
   1900     HRESULT r;
   1901     pipe_mutex_lock(d3dlock_global);
   1902     r = NineDevice9_GetPixelShaderConstantB(This, StartRegister, pConstantData, BoolCount);
   1903     pipe_mutex_unlock(d3dlock_global);
   1904     return r;
   1905 }
   1906 
   1907 static HRESULT NINE_WINAPI
   1908 LockDevice9_DrawRectPatch( struct NineDevice9 *This,
   1909                            UINT Handle,
   1910                            const float *pNumSegs,
   1911                            const D3DRECTPATCH_INFO *pRectPatchInfo )
   1912 {
   1913     HRESULT r;
   1914     pipe_mutex_lock(d3dlock_global);
   1915     r = NineDevice9_DrawRectPatch(This, Handle, pNumSegs, pRectPatchInfo);
   1916     pipe_mutex_unlock(d3dlock_global);
   1917     return r;
   1918 }
   1919 
   1920 static HRESULT NINE_WINAPI
   1921 LockDevice9_DrawTriPatch( struct NineDevice9 *This,
   1922                           UINT Handle,
   1923                           const float *pNumSegs,
   1924                           const D3DTRIPATCH_INFO *pTriPatchInfo )
   1925 {
   1926     HRESULT r;
   1927     pipe_mutex_lock(d3dlock_global);
   1928     r = NineDevice9_DrawTriPatch(This, Handle, pNumSegs, pTriPatchInfo);
   1929     pipe_mutex_unlock(d3dlock_global);
   1930     return r;
   1931 }
   1932 
   1933 static HRESULT NINE_WINAPI
   1934 LockDevice9_DeletePatch( struct NineDevice9 *This,
   1935                          UINT Handle )
   1936 {
   1937     HRESULT r;
   1938     pipe_mutex_lock(d3dlock_global);
   1939     r = NineDevice9_DeletePatch(This, Handle);
   1940     pipe_mutex_unlock(d3dlock_global);
   1941     return r;
   1942 }
   1943 
   1944 static HRESULT NINE_WINAPI
   1945 LockDevice9_CreateQuery( struct NineDevice9 *This,
   1946                          D3DQUERYTYPE Type,
   1947                          IDirect3DQuery9 **ppQuery )
   1948 {
   1949     HRESULT r;
   1950     pipe_mutex_lock(d3dlock_global);
   1951     r = NineDevice9_CreateQuery(This, Type, ppQuery);
   1952     pipe_mutex_unlock(d3dlock_global);
   1953     return r;
   1954 }
   1955 
   1956 IDirect3DDevice9Vtbl LockDevice9_vtable = {
   1957     (void *)NineUnknown_QueryInterface,
   1958     (void *)NineUnknown_AddRef,
   1959     (void *)NineUnknown_ReleaseWithDtorLock,
   1960     (void *)LockDevice9_TestCooperativeLevel,
   1961     (void *)LockDevice9_GetAvailableTextureMem,
   1962     (void *)LockDevice9_EvictManagedResources,
   1963     (void *)LockDevice9_GetDirect3D,
   1964     (void *)NineDevice9_GetDeviceCaps, /* immutable */
   1965     (void *)LockDevice9_GetDisplayMode,
   1966     (void *)NineDevice9_GetCreationParameters, /* immutable */
   1967     (void *)LockDevice9_SetCursorProperties,
   1968     (void *)LockDevice9_SetCursorPosition,
   1969     (void *)LockDevice9_ShowCursor,
   1970     (void *)LockDevice9_CreateAdditionalSwapChain,
   1971     (void *)LockDevice9_GetSwapChain,
   1972     (void *)LockDevice9_GetNumberOfSwapChains,
   1973     (void *)LockDevice9_Reset,
   1974     (void *)LockDevice9_Present,
   1975     (void *)LockDevice9_GetBackBuffer,
   1976     (void *)LockDevice9_GetRasterStatus,
   1977     (void *)LockDevice9_SetDialogBoxMode,
   1978     (void *)LockDevice9_SetGammaRamp,
   1979     (void *)LockDevice9_GetGammaRamp,
   1980     (void *)LockDevice9_CreateTexture,
   1981     (void *)LockDevice9_CreateVolumeTexture,
   1982     (void *)LockDevice9_CreateCubeTexture,
   1983     (void *)LockDevice9_CreateVertexBuffer,
   1984     (void *)LockDevice9_CreateIndexBuffer,
   1985     (void *)LockDevice9_CreateRenderTarget,
   1986     (void *)LockDevice9_CreateDepthStencilSurface,
   1987     (void *)LockDevice9_UpdateSurface,
   1988     (void *)LockDevice9_UpdateTexture,
   1989     (void *)LockDevice9_GetRenderTargetData,
   1990     (void *)LockDevice9_GetFrontBufferData,
   1991     (void *)LockDevice9_StretchRect,
   1992     (void *)LockDevice9_ColorFill,
   1993     (void *)LockDevice9_CreateOffscreenPlainSurface,
   1994     (void *)LockDevice9_SetRenderTarget,
   1995     (void *)LockDevice9_GetRenderTarget,
   1996     (void *)LockDevice9_SetDepthStencilSurface,
   1997     (void *)LockDevice9_GetDepthStencilSurface,
   1998     (void *)LockDevice9_BeginScene,
   1999     (void *)LockDevice9_EndScene,
   2000     (void *)LockDevice9_Clear,
   2001     (void *)LockDevice9_SetTransform,
   2002     (void *)LockDevice9_GetTransform,
   2003     (void *)LockDevice9_MultiplyTransform,
   2004     (void *)LockDevice9_SetViewport,
   2005     (void *)LockDevice9_GetViewport,
   2006     (void *)LockDevice9_SetMaterial,
   2007     (void *)LockDevice9_GetMaterial,
   2008     (void *)LockDevice9_SetLight,
   2009     (void *)LockDevice9_GetLight,
   2010     (void *)LockDevice9_LightEnable,
   2011     (void *)LockDevice9_GetLightEnable,
   2012     (void *)LockDevice9_SetClipPlane,
   2013     (void *)LockDevice9_GetClipPlane,
   2014     (void *)LockDevice9_SetRenderState,
   2015     (void *)LockDevice9_GetRenderState,
   2016     (void *)LockDevice9_CreateStateBlock,
   2017     (void *)LockDevice9_BeginStateBlock,
   2018     (void *)LockDevice9_EndStateBlock,
   2019     (void *)LockDevice9_SetClipStatus,
   2020     (void *)LockDevice9_GetClipStatus,
   2021     (void *)LockDevice9_GetTexture,
   2022     (void *)LockDevice9_SetTexture,
   2023     (void *)LockDevice9_GetTextureStageState,
   2024     (void *)LockDevice9_SetTextureStageState,
   2025     (void *)LockDevice9_GetSamplerState,
   2026     (void *)LockDevice9_SetSamplerState,
   2027     (void *)LockDevice9_ValidateDevice,
   2028     (void *)LockDevice9_SetPaletteEntries,
   2029     (void *)LockDevice9_GetPaletteEntries,
   2030     (void *)LockDevice9_SetCurrentTexturePalette,
   2031     (void *)LockDevice9_GetCurrentTexturePalette,
   2032     (void *)LockDevice9_SetScissorRect,
   2033     (void *)LockDevice9_GetScissorRect,
   2034     (void *)LockDevice9_SetSoftwareVertexProcessing,
   2035     (void *)LockDevice9_GetSoftwareVertexProcessing,
   2036     (void *)LockDevice9_SetNPatchMode,
   2037     (void *)LockDevice9_GetNPatchMode,
   2038     (void *)LockDevice9_DrawPrimitive,
   2039     (void *)LockDevice9_DrawIndexedPrimitive,
   2040     (void *)LockDevice9_DrawPrimitiveUP,
   2041     (void *)LockDevice9_DrawIndexedPrimitiveUP,
   2042     (void *)LockDevice9_ProcessVertices,
   2043     (void *)LockDevice9_CreateVertexDeclaration,
   2044     (void *)LockDevice9_SetVertexDeclaration,
   2045     (void *)LockDevice9_GetVertexDeclaration,
   2046     (void *)LockDevice9_SetFVF,
   2047     (void *)LockDevice9_GetFVF,
   2048     (void *)LockDevice9_CreateVertexShader,
   2049     (void *)LockDevice9_SetVertexShader,
   2050     (void *)LockDevice9_GetVertexShader,
   2051     (void *)LockDevice9_SetVertexShaderConstantF,
   2052     (void *)LockDevice9_GetVertexShaderConstantF,
   2053     (void *)LockDevice9_SetVertexShaderConstantI,
   2054     (void *)LockDevice9_GetVertexShaderConstantI,
   2055     (void *)LockDevice9_SetVertexShaderConstantB,
   2056     (void *)LockDevice9_GetVertexShaderConstantB,
   2057     (void *)LockDevice9_SetStreamSource,
   2058     (void *)LockDevice9_GetStreamSource,
   2059     (void *)LockDevice9_SetStreamSourceFreq,
   2060     (void *)LockDevice9_GetStreamSourceFreq,
   2061     (void *)LockDevice9_SetIndices,
   2062     (void *)LockDevice9_GetIndices,
   2063     (void *)LockDevice9_CreatePixelShader,
   2064     (void *)LockDevice9_SetPixelShader,
   2065     (void *)LockDevice9_GetPixelShader,
   2066     (void *)LockDevice9_SetPixelShaderConstantF,
   2067     (void *)LockDevice9_GetPixelShaderConstantF,
   2068     (void *)LockDevice9_SetPixelShaderConstantI,
   2069     (void *)LockDevice9_GetPixelShaderConstantI,
   2070     (void *)LockDevice9_SetPixelShaderConstantB,
   2071     (void *)LockDevice9_GetPixelShaderConstantB,
   2072     (void *)LockDevice9_DrawRectPatch,
   2073     (void *)LockDevice9_DrawTriPatch,
   2074     (void *)LockDevice9_DeletePatch,
   2075     (void *)LockDevice9_CreateQuery
   2076 };
   2077 
   2078 static HRESULT NINE_WINAPI
   2079 LockDevice9Ex_SetConvolutionMonoKernel( struct NineDevice9Ex *This,
   2080                                         UINT width,
   2081                                         UINT height,
   2082                                         float *rows,
   2083                                         float *columns )
   2084 {
   2085     HRESULT r;
   2086     pipe_mutex_lock(d3dlock_global);
   2087     r = NineDevice9Ex_SetConvolutionMonoKernel(This, width, height, rows, columns);
   2088     pipe_mutex_unlock(d3dlock_global);
   2089     return r;
   2090 }
   2091 
   2092 static HRESULT NINE_WINAPI
   2093 LockDevice9Ex_ComposeRects( struct NineDevice9Ex *This,
   2094                             IDirect3DSurface9 *pSrc,
   2095                             IDirect3DSurface9 *pDst,
   2096                             IDirect3DVertexBuffer9 *pSrcRectDescs,
   2097                             UINT NumRects,
   2098                             IDirect3DVertexBuffer9 *pDstRectDescs,
   2099                             D3DCOMPOSERECTSOP Operation,
   2100                             int Xoffset,
   2101                             int Yoffset )
   2102 {
   2103     HRESULT r;
   2104     pipe_mutex_lock(d3dlock_global);
   2105     r = NineDevice9Ex_ComposeRects(This, pSrc, pDst, pSrcRectDescs, NumRects, pDstRectDescs, Operation, Xoffset, Yoffset);
   2106     pipe_mutex_unlock(d3dlock_global);
   2107     return r;
   2108 }
   2109 
   2110 static HRESULT NINE_WINAPI
   2111 LockDevice9Ex_PresentEx( struct NineDevice9Ex *This,
   2112                          const RECT *pSourceRect,
   2113                          const RECT *pDestRect,
   2114                          HWND hDestWindowOverride,
   2115                          const RGNDATA *pDirtyRegion,
   2116                          DWORD dwFlags )
   2117 {
   2118     HRESULT r;
   2119     pipe_mutex_lock(d3dlock_global);
   2120     r = NineDevice9Ex_PresentEx(This, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion, dwFlags);
   2121     pipe_mutex_unlock(d3dlock_global);
   2122     return r;
   2123 }
   2124 
   2125 static HRESULT NINE_WINAPI
   2126 LockDevice9Ex_GetGPUThreadPriority( struct NineDevice9Ex *This,
   2127                                     INT *pPriority )
   2128 {
   2129     HRESULT r;
   2130     pipe_mutex_lock(d3dlock_global);
   2131     r = NineDevice9Ex_GetGPUThreadPriority(This, pPriority);
   2132     pipe_mutex_unlock(d3dlock_global);
   2133     return r;
   2134 }
   2135 
   2136 static HRESULT NINE_WINAPI
   2137 LockDevice9Ex_SetGPUThreadPriority( struct NineDevice9Ex *This,
   2138                                     INT Priority )
   2139 {
   2140     HRESULT r;
   2141     pipe_mutex_lock(d3dlock_global);
   2142     r = NineDevice9Ex_SetGPUThreadPriority(This, Priority);
   2143     pipe_mutex_unlock(d3dlock_global);
   2144     return r;
   2145 }
   2146 
   2147 static HRESULT NINE_WINAPI
   2148 LockDevice9Ex_WaitForVBlank( struct NineDevice9Ex *This,
   2149                              UINT iSwapChain )
   2150 {
   2151     HRESULT r;
   2152     pipe_mutex_lock(d3dlock_global);
   2153     r = NineDevice9Ex_WaitForVBlank(This, iSwapChain);
   2154     pipe_mutex_unlock(d3dlock_global);
   2155     return r;
   2156 }
   2157 
   2158 static HRESULT NINE_WINAPI
   2159 LockDevice9Ex_CheckResourceResidency( struct NineDevice9Ex *This,
   2160                                       IDirect3DResource9 **pResourceArray,
   2161                                       UINT32 NumResources )
   2162 {
   2163     HRESULT r;
   2164     pipe_mutex_lock(d3dlock_global);
   2165     r = NineDevice9Ex_CheckResourceResidency(This, pResourceArray, NumResources);
   2166     pipe_mutex_unlock(d3dlock_global);
   2167     return r;
   2168 }
   2169 
   2170 static HRESULT NINE_WINAPI
   2171 LockDevice9Ex_SetMaximumFrameLatency( struct NineDevice9Ex *This,
   2172                                       UINT MaxLatency )
   2173 {
   2174     HRESULT r;
   2175     pipe_mutex_lock(d3dlock_global);
   2176     r = NineDevice9Ex_SetMaximumFrameLatency(This, MaxLatency);
   2177     pipe_mutex_unlock(d3dlock_global);
   2178     return r;
   2179 }
   2180 
   2181 static HRESULT NINE_WINAPI
   2182 LockDevice9Ex_GetMaximumFrameLatency( struct NineDevice9Ex *This,
   2183                                       UINT *pMaxLatency )
   2184 {
   2185     HRESULT r;
   2186     pipe_mutex_lock(d3dlock_global);
   2187     r = NineDevice9Ex_GetMaximumFrameLatency(This, pMaxLatency);
   2188     pipe_mutex_unlock(d3dlock_global);
   2189     return r;
   2190 }
   2191 
   2192 static HRESULT NINE_WINAPI
   2193 LockDevice9Ex_CheckDeviceState( struct NineDevice9Ex *This,
   2194                                 HWND hDestinationWindow )
   2195 {
   2196     HRESULT r;
   2197     pipe_mutex_lock(d3dlock_global);
   2198     r = NineDevice9Ex_CheckDeviceState(This, hDestinationWindow);
   2199     pipe_mutex_unlock(d3dlock_global);
   2200     return r;
   2201 }
   2202 
   2203 static HRESULT NINE_WINAPI
   2204 LockDevice9Ex_CreateRenderTargetEx( struct NineDevice9Ex *This,
   2205                                     UINT Width,
   2206                                     UINT Height,
   2207                                     D3DFORMAT Format,
   2208                                     D3DMULTISAMPLE_TYPE MultiSample,
   2209                                     DWORD MultisampleQuality,
   2210                                     BOOL Lockable,
   2211                                     IDirect3DSurface9 **ppSurface,
   2212                                     HANDLE *pSharedHandle,
   2213                                     DWORD Usage )
   2214 {
   2215     HRESULT r;
   2216     pipe_mutex_lock(d3dlock_global);
   2217     r = NineDevice9Ex_CreateRenderTargetEx(This, Width, Height, Format, MultiSample, MultisampleQuality, Lockable, ppSurface, pSharedHandle, Usage);
   2218     pipe_mutex_unlock(d3dlock_global);
   2219     return r;
   2220 }
   2221 
   2222 static HRESULT NINE_WINAPI
   2223 LockDevice9Ex_CreateOffscreenPlainSurfaceEx( struct NineDevice9Ex *This,
   2224                                              UINT Width,
   2225                                              UINT Height,
   2226                                              D3DFORMAT Format,
   2227                                              D3DPOOL Pool,
   2228                                              IDirect3DSurface9 **ppSurface,
   2229                                              HANDLE *pSharedHandle,
   2230                                              DWORD Usage )
   2231 {
   2232     HRESULT r;
   2233     pipe_mutex_lock(d3dlock_global);
   2234     r = NineDevice9Ex_CreateOffscreenPlainSurfaceEx(This, Width, Height, Format, Pool, ppSurface, pSharedHandle, Usage);
   2235     pipe_mutex_unlock(d3dlock_global);
   2236     return r;
   2237 }
   2238 
   2239 static HRESULT NINE_WINAPI
   2240 LockDevice9Ex_CreateDepthStencilSurfaceEx( struct NineDevice9Ex *This,
   2241                                            UINT Width,
   2242                                            UINT Height,
   2243                                            D3DFORMAT Format,
   2244                                            D3DMULTISAMPLE_TYPE MultiSample,
   2245                                            DWORD MultisampleQuality,
   2246                                            BOOL Discard,
   2247                                            IDirect3DSurface9 **ppSurface,
   2248                                            HANDLE *pSharedHandle,
   2249                                            DWORD Usage )
   2250 {
   2251     HRESULT r;
   2252     pipe_mutex_lock(d3dlock_global);
   2253     r = NineDevice9Ex_CreateDepthStencilSurfaceEx(This, Width, Height, Format, MultiSample, MultisampleQuality, Discard, ppSurface, pSharedHandle, Usage);
   2254     pipe_mutex_unlock(d3dlock_global);
   2255     return r;
   2256 }
   2257 
   2258 static HRESULT NINE_WINAPI
   2259 LockDevice9Ex_ResetEx( struct NineDevice9Ex *This,
   2260                        D3DPRESENT_PARAMETERS *pPresentationParameters,
   2261                        D3DDISPLAYMODEEX *pFullscreenDisplayMode )
   2262 {
   2263     HRESULT r;
   2264     pipe_mutex_lock(d3dlock_global);
   2265     r = NineDevice9Ex_ResetEx(This, pPresentationParameters, pFullscreenDisplayMode);
   2266     pipe_mutex_unlock(d3dlock_global);
   2267     return r;
   2268 }
   2269 
   2270 static HRESULT NINE_WINAPI
   2271 LockDevice9Ex_GetDisplayModeEx( struct NineDevice9Ex *This,
   2272                                 UINT iSwapChain,
   2273                                 D3DDISPLAYMODEEX *pMode,
   2274                                 D3DDISPLAYROTATION *pRotation )
   2275 {
   2276     HRESULT r;
   2277     pipe_mutex_lock(d3dlock_global);
   2278     r = NineDevice9Ex_GetDisplayModeEx(This, iSwapChain, pMode, pRotation);
   2279     pipe_mutex_unlock(d3dlock_global);
   2280     return r;
   2281 }
   2282 
   2283 IDirect3DDevice9ExVtbl LockDevice9Ex_vtable = {
   2284     (void *)NineUnknown_QueryInterface,
   2285     (void *)NineUnknown_AddRef,
   2286     (void *)NineUnknown_ReleaseWithDtorLock,
   2287     (void *)LockDevice9_TestCooperativeLevel,
   2288     (void *)LockDevice9_GetAvailableTextureMem,
   2289     (void *)LockDevice9_EvictManagedResources,
   2290     (void *)LockDevice9_GetDirect3D,
   2291     (void *)NineDevice9_GetDeviceCaps,
   2292     (void *)LockDevice9_GetDisplayMode,
   2293     (void *)NineDevice9_GetCreationParameters,
   2294     (void *)LockDevice9_SetCursorProperties,
   2295     (void *)LockDevice9_SetCursorPosition,
   2296     (void *)LockDevice9_ShowCursor,
   2297     (void *)LockDevice9_CreateAdditionalSwapChain,
   2298     (void *)LockDevice9_GetSwapChain,
   2299     (void *)LockDevice9_GetNumberOfSwapChains,
   2300     (void *)LockDevice9_Reset,
   2301     (void *)LockDevice9_Present,
   2302     (void *)LockDevice9_GetBackBuffer,
   2303     (void *)LockDevice9_GetRasterStatus,
   2304     (void *)LockDevice9_SetDialogBoxMode,
   2305     (void *)LockDevice9_SetGammaRamp,
   2306     (void *)LockDevice9_GetGammaRamp,
   2307     (void *)LockDevice9_CreateTexture,
   2308     (void *)LockDevice9_CreateVolumeTexture,
   2309     (void *)LockDevice9_CreateCubeTexture,
   2310     (void *)LockDevice9_CreateVertexBuffer,
   2311     (void *)LockDevice9_CreateIndexBuffer,
   2312     (void *)LockDevice9_CreateRenderTarget,
   2313     (void *)LockDevice9_CreateDepthStencilSurface,
   2314     (void *)LockDevice9_UpdateSurface,
   2315     (void *)LockDevice9_UpdateTexture,
   2316     (void *)LockDevice9_GetRenderTargetData,
   2317     (void *)LockDevice9_GetFrontBufferData,
   2318     (void *)LockDevice9_StretchRect,
   2319     (void *)LockDevice9_ColorFill,
   2320     (void *)LockDevice9_CreateOffscreenPlainSurface,
   2321     (void *)LockDevice9_SetRenderTarget,
   2322     (void *)LockDevice9_GetRenderTarget,
   2323     (void *)LockDevice9_SetDepthStencilSurface,
   2324     (void *)LockDevice9_GetDepthStencilSurface,
   2325     (void *)LockDevice9_BeginScene,
   2326     (void *)LockDevice9_EndScene,
   2327     (void *)LockDevice9_Clear,
   2328     (void *)LockDevice9_SetTransform,
   2329     (void *)LockDevice9_GetTransform,
   2330     (void *)LockDevice9_MultiplyTransform,
   2331     (void *)LockDevice9_SetViewport,
   2332     (void *)LockDevice9_GetViewport,
   2333     (void *)LockDevice9_SetMaterial,
   2334     (void *)LockDevice9_GetMaterial,
   2335     (void *)LockDevice9_SetLight,
   2336     (void *)LockDevice9_GetLight,
   2337     (void *)LockDevice9_LightEnable,
   2338     (void *)LockDevice9_GetLightEnable,
   2339     (void *)LockDevice9_SetClipPlane,
   2340     (void *)LockDevice9_GetClipPlane,
   2341     (void *)LockDevice9_SetRenderState,
   2342     (void *)LockDevice9_GetRenderState,
   2343     (void *)LockDevice9_CreateStateBlock,
   2344     (void *)LockDevice9_BeginStateBlock,
   2345     (void *)LockDevice9_EndStateBlock,
   2346     (void *)LockDevice9_SetClipStatus,
   2347     (void *)LockDevice9_GetClipStatus,
   2348     (void *)LockDevice9_GetTexture,
   2349     (void *)LockDevice9_SetTexture,
   2350     (void *)LockDevice9_GetTextureStageState,
   2351     (void *)LockDevice9_SetTextureStageState,
   2352     (void *)LockDevice9_GetSamplerState,
   2353     (void *)LockDevice9_SetSamplerState,
   2354     (void *)LockDevice9_ValidateDevice,
   2355     (void *)LockDevice9_SetPaletteEntries,
   2356     (void *)LockDevice9_GetPaletteEntries,
   2357     (void *)LockDevice9_SetCurrentTexturePalette,
   2358     (void *)LockDevice9_GetCurrentTexturePalette,
   2359     (void *)LockDevice9_SetScissorRect,
   2360     (void *)LockDevice9_GetScissorRect,
   2361     (void *)LockDevice9_SetSoftwareVertexProcessing,
   2362     (void *)LockDevice9_GetSoftwareVertexProcessing,
   2363     (void *)LockDevice9_SetNPatchMode,
   2364     (void *)LockDevice9_GetNPatchMode,
   2365     (void *)LockDevice9_DrawPrimitive,
   2366     (void *)LockDevice9_DrawIndexedPrimitive,
   2367     (void *)LockDevice9_DrawPrimitiveUP,
   2368     (void *)LockDevice9_DrawIndexedPrimitiveUP,
   2369     (void *)LockDevice9_ProcessVertices,
   2370     (void *)LockDevice9_CreateVertexDeclaration,
   2371     (void *)LockDevice9_SetVertexDeclaration,
   2372     (void *)LockDevice9_GetVertexDeclaration,
   2373     (void *)LockDevice9_SetFVF,
   2374     (void *)LockDevice9_GetFVF,
   2375     (void *)LockDevice9_CreateVertexShader,
   2376     (void *)LockDevice9_SetVertexShader,
   2377     (void *)LockDevice9_GetVertexShader,
   2378     (void *)LockDevice9_SetVertexShaderConstantF,
   2379     (void *)LockDevice9_GetVertexShaderConstantF,
   2380     (void *)LockDevice9_SetVertexShaderConstantI,
   2381     (void *)LockDevice9_GetVertexShaderConstantI,
   2382     (void *)LockDevice9_SetVertexShaderConstantB,
   2383     (void *)LockDevice9_GetVertexShaderConstantB,
   2384     (void *)LockDevice9_SetStreamSource,
   2385     (void *)LockDevice9_GetStreamSource,
   2386     (void *)LockDevice9_SetStreamSourceFreq,
   2387     (void *)LockDevice9_GetStreamSourceFreq,
   2388     (void *)LockDevice9_SetIndices,
   2389     (void *)LockDevice9_GetIndices,
   2390     (void *)LockDevice9_CreatePixelShader,
   2391     (void *)LockDevice9_SetPixelShader,
   2392     (void *)LockDevice9_GetPixelShader,
   2393     (void *)LockDevice9_SetPixelShaderConstantF,
   2394     (void *)LockDevice9_GetPixelShaderConstantF,
   2395     (void *)LockDevice9_SetPixelShaderConstantI,
   2396     (void *)LockDevice9_GetPixelShaderConstantI,
   2397     (void *)LockDevice9_SetPixelShaderConstantB,
   2398     (void *)LockDevice9_GetPixelShaderConstantB,
   2399     (void *)LockDevice9_DrawRectPatch,
   2400     (void *)LockDevice9_DrawTriPatch,
   2401     (void *)LockDevice9_DeletePatch,
   2402     (void *)LockDevice9_CreateQuery,
   2403     (void *)LockDevice9Ex_SetConvolutionMonoKernel,
   2404     (void *)LockDevice9Ex_ComposeRects,
   2405     (void *)LockDevice9Ex_PresentEx,
   2406     (void *)LockDevice9Ex_GetGPUThreadPriority,
   2407     (void *)LockDevice9Ex_SetGPUThreadPriority,
   2408     (void *)LockDevice9Ex_WaitForVBlank,
   2409     (void *)LockDevice9Ex_CheckResourceResidency,
   2410     (void *)LockDevice9Ex_SetMaximumFrameLatency,
   2411     (void *)LockDevice9Ex_GetMaximumFrameLatency,
   2412     (void *)LockDevice9Ex_CheckDeviceState,
   2413     (void *)LockDevice9Ex_CreateRenderTargetEx,
   2414     (void *)LockDevice9Ex_CreateOffscreenPlainSurfaceEx,
   2415     (void *)LockDevice9Ex_CreateDepthStencilSurfaceEx,
   2416     (void *)LockDevice9Ex_ResetEx,
   2417     (void *)LockDevice9Ex_GetDisplayModeEx
   2418 };
   2419 
   2420 static HRESULT NINE_WINAPI
   2421 LockDevice9Video_GetContentProtectionCaps( struct NineDevice9Video *This,
   2422                                            const GUID *pCryptoType,
   2423                                            const GUID *pDecodeProfile,
   2424                                            D3DCONTENTPROTECTIONCAPS *pCaps )
   2425 {
   2426     HRESULT r;
   2427     pipe_mutex_lock(d3dlock_global);
   2428     r = NineDevice9Video_GetContentProtectionCaps(This, pCryptoType, pDecodeProfile, pCaps);
   2429     pipe_mutex_unlock(d3dlock_global);
   2430     return r;
   2431 }
   2432 
   2433 static HRESULT NINE_WINAPI
   2434 LockDevice9Video_CreateAuthenticatedChannel( struct NineDevice9Video *This,
   2435                                              D3DAUTHENTICATEDCHANNELTYPE ChannelType,
   2436                                              IDirect3DAuthenticatedChannel9 **ppAuthenticatedChannel,
   2437                                              HANDLE *pChannelHandle )
   2438 {
   2439     HRESULT r;
   2440     pipe_mutex_lock(d3dlock_global);
   2441     r = NineDevice9Video_CreateAuthenticatedChannel(This, ChannelType, ppAuthenticatedChannel, pChannelHandle);
   2442     pipe_mutex_unlock(d3dlock_global);
   2443     return r;
   2444 }
   2445 
   2446 static HRESULT NINE_WINAPI
   2447 LockDevice9Video_CreateCryptoSession( struct NineDevice9Video *This,
   2448                                       const GUID *pCryptoType,
   2449                                       const GUID *pDecodeProfile,
   2450                                       IDirect3DCryptoSession9 **ppCryptoSession,
   2451                                       HANDLE *pCryptoHandle )
   2452 {
   2453     HRESULT r;
   2454     pipe_mutex_lock(d3dlock_global);
   2455     r = NineDevice9Video_CreateCryptoSession(This, pCryptoType, pDecodeProfile, ppCryptoSession, pCryptoHandle);
   2456     pipe_mutex_unlock(d3dlock_global);
   2457     return r;
   2458 }
   2459 
   2460 IDirect3DDevice9VideoVtbl LockDevice9Video_vtable = {
   2461     (void *)NineUnknown_QueryInterface,
   2462     (void *)NineUnknown_AddRef,
   2463     (void *)NineUnknown_ReleaseWithDtorLock,
   2464     (void *)LockDevice9Video_GetContentProtectionCaps,
   2465     (void *)LockDevice9Video_CreateAuthenticatedChannel,
   2466     (void *)LockDevice9Video_CreateCryptoSession
   2467 };
   2468 
   2469 static HRESULT NINE_WINAPI
   2470 LockIndexBuffer9_Lock( struct NineIndexBuffer9 *This,
   2471                        UINT OffsetToLock,
   2472                        UINT SizeToLock,
   2473                        void **ppbData,
   2474                        DWORD Flags )
   2475 {
   2476     HRESULT r;
   2477     pipe_mutex_lock(d3dlock_global);
   2478     r = NineIndexBuffer9_Lock(This, OffsetToLock, SizeToLock, ppbData, Flags);
   2479     pipe_mutex_unlock(d3dlock_global);
   2480     return r;
   2481 }
   2482 
   2483 static HRESULT NINE_WINAPI
   2484 LockIndexBuffer9_Unlock( struct NineIndexBuffer9 *This )
   2485 {
   2486     HRESULT r;
   2487     pipe_mutex_lock(d3dlock_global);
   2488     r = NineIndexBuffer9_Unlock(This);
   2489     pipe_mutex_unlock(d3dlock_global);
   2490     return r;
   2491 }
   2492 
   2493 #if 0
   2494 static HRESULT NINE_WINAPI
   2495 LockIndexBuffer9_GetDesc( struct NineIndexBuffer9 *This,
   2496                           D3DINDEXBUFFER_DESC *pDesc )
   2497 {
   2498     HRESULT r;
   2499     pipe_mutex_lock(d3dlock_global);
   2500     r = NineIndexBuffer9_GetDesc(This, pDesc);
   2501     pipe_mutex_unlock(d3dlock_global);
   2502     return r;
   2503 }
   2504 #endif
   2505 
   2506 IDirect3DIndexBuffer9Vtbl LockIndexBuffer9_vtable = {
   2507     (void *)NineUnknown_QueryInterface,
   2508     (void *)NineUnknown_AddRef,
   2509     (void *)NineUnknown_ReleaseWithDtorLock,
   2510     (void *)NineUnknown_GetDevice, /* actually part of Resource9 iface */
   2511     (void *)LockUnknown_SetPrivateData,
   2512     (void *)LockUnknown_GetPrivateData,
   2513     (void *)LockUnknown_FreePrivateData,
   2514     (void *)LockResource9_SetPriority,
   2515     (void *)LockResource9_GetPriority,
   2516     (void *)NineResource9_PreLoad, /* nop */
   2517     (void *)NineResource9_GetType, /* immutable */
   2518     (void *)LockIndexBuffer9_Lock,
   2519     (void *)LockIndexBuffer9_Unlock,
   2520     (void *)NineIndexBuffer9_GetDesc /* immutable */
   2521 };
   2522 
   2523 #if 0
   2524 static HRESULT NINE_WINAPI
   2525 LockPixelShader9_GetDevice( struct NinePixelShader9 *This,
   2526                             IDirect3DDevice9 **ppDevice )
   2527 {
   2528     HRESULT r;
   2529     pipe_mutex_lock(d3dlock_global);
   2530     r = NineUnknown_GetDevice(NineUnknown(This), ppDevice);
   2531     pipe_mutex_unlock(d3dlock_global);
   2532     return r;
   2533 }
   2534 #endif
   2535 
   2536 static HRESULT NINE_WINAPI
   2537 LockPixelShader9_GetFunction( struct NinePixelShader9 *This,
   2538                               void *pData,
   2539                               UINT *pSizeOfData )
   2540 {
   2541     HRESULT r;
   2542     pipe_mutex_lock(d3dlock_global);
   2543     r = NinePixelShader9_GetFunction(This, pData, pSizeOfData);
   2544     pipe_mutex_unlock(d3dlock_global);
   2545     return r;
   2546 }
   2547 
   2548 IDirect3DPixelShader9Vtbl LockPixelShader9_vtable = {
   2549     (void *)NineUnknown_QueryInterface,
   2550     (void *)NineUnknown_AddRef,
   2551     (void *)NineUnknown_ReleaseWithDtorLock,
   2552     (void *)NineUnknown_GetDevice,
   2553     (void *)LockPixelShader9_GetFunction
   2554 };
   2555 
   2556 #if 0
   2557 static HRESULT NINE_WINAPI
   2558 LockQuery9_GetDevice( struct NineQuery9 *This,
   2559                       IDirect3DDevice9 **ppDevice )
   2560 {
   2561     HRESULT r;
   2562     pipe_mutex_lock(d3dlock_global);
   2563     r = NineUnknown_GetDevice(NineUnknown(This), ppDevice);
   2564     pipe_mutex_unlock(d3dlock_global);
   2565     return r;
   2566 }
   2567 #endif
   2568 
   2569 #if 0
   2570 static D3DQUERYTYPE NINE_WINAPI
   2571 LockQuery9_GetType( struct NineQuery9 *This )
   2572 {
   2573     D3DQUERYTYPE r;
   2574     pipe_mutex_lock(d3dlock_global);
   2575     r = NineQuery9_GetType(This);
   2576     pipe_mutex_unlock(d3dlock_global);
   2577     return r;
   2578 }
   2579 #endif
   2580 
   2581 #if 0
   2582 static DWORD NINE_WINAPI
   2583 LockQuery9_GetDataSize( struct NineQuery9 *This )
   2584 {
   2585     DWORD r;
   2586     pipe_mutex_lock(d3dlock_global);
   2587     r = NineQuery9_GetDataSize(This);
   2588     pipe_mutex_unlock(d3dlock_global);
   2589     return r;
   2590 }
   2591 #endif
   2592 
   2593 static HRESULT NINE_WINAPI
   2594 LockQuery9_Issue( struct NineQuery9 *This,
   2595                   DWORD dwIssueFlags )
   2596 {
   2597     HRESULT r;
   2598     pipe_mutex_lock(d3dlock_global);
   2599     r = NineQuery9_Issue(This, dwIssueFlags);
   2600     pipe_mutex_unlock(d3dlock_global);
   2601     return r;
   2602 }
   2603 
   2604 static HRESULT NINE_WINAPI
   2605 LockQuery9_GetData( struct NineQuery9 *This,
   2606                     void *pData,
   2607                     DWORD dwSize,
   2608                     DWORD dwGetDataFlags )
   2609 {
   2610     HRESULT r;
   2611     pipe_mutex_lock(d3dlock_global);
   2612     r = NineQuery9_GetData(This, pData, dwSize, dwGetDataFlags);
   2613     pipe_mutex_unlock(d3dlock_global);
   2614     return r;
   2615 }
   2616 
   2617 IDirect3DQuery9Vtbl LockQuery9_vtable = {
   2618     (void *)NineUnknown_QueryInterface,
   2619     (void *)NineUnknown_AddRef,
   2620     (void *)NineUnknown_ReleaseWithDtorLock,
   2621     (void *)NineUnknown_GetDevice, /* actually part of Query9 iface */
   2622     (void *)NineQuery9_GetType, /* immutable */
   2623     (void *)NineQuery9_GetDataSize, /* immutable */
   2624     (void *)LockQuery9_Issue,
   2625     (void *)LockQuery9_GetData
   2626 };
   2627 
   2628 #if 0
   2629 static HRESULT NINE_WINAPI
   2630 LockStateBlock9_GetDevice( struct NineStateBlock9 *This,
   2631                            IDirect3DDevice9 **ppDevice )
   2632 {
   2633     HRESULT r;
   2634     pipe_mutex_lock(d3dlock_global);
   2635     r = NineUnknown_GetDevice(NineUnknown(This), ppDevice);
   2636     pipe_mutex_unlock(d3dlock_global);
   2637     return r;
   2638 }
   2639 #endif
   2640 
   2641 static HRESULT NINE_WINAPI
   2642 LockStateBlock9_Capture( struct NineStateBlock9 *This )
   2643 {
   2644     HRESULT r;
   2645     pipe_mutex_lock(d3dlock_global);
   2646     r = NineStateBlock9_Capture(This);
   2647     pipe_mutex_unlock(d3dlock_global);
   2648     return r;
   2649 }
   2650 
   2651 static HRESULT NINE_WINAPI
   2652 LockStateBlock9_Apply( struct NineStateBlock9 *This )
   2653 {
   2654     HRESULT r;
   2655     pipe_mutex_lock(d3dlock_global);
   2656     r = NineStateBlock9_Apply(This);
   2657     pipe_mutex_unlock(d3dlock_global);
   2658     return r;
   2659 }
   2660 
   2661 IDirect3DStateBlock9Vtbl LockStateBlock9_vtable = {
   2662     (void *)NineUnknown_QueryInterface,
   2663     (void *)NineUnknown_AddRef,
   2664     (void *)NineUnknown_ReleaseWithDtorLock,
   2665     (void *)NineUnknown_GetDevice, /* actually part of StateBlock9 iface */
   2666     (void *)LockStateBlock9_Capture,
   2667     (void *)LockStateBlock9_Apply
   2668 };
   2669 
   2670 static HRESULT NINE_WINAPI
   2671 LockSurface9_GetContainer( struct NineSurface9 *This,
   2672                            REFIID riid,
   2673                            void **ppContainer )
   2674 {
   2675     HRESULT r;
   2676     pipe_mutex_lock(d3dlock_global);
   2677     r = NineSurface9_GetContainer(This, riid, ppContainer);
   2678     pipe_mutex_unlock(d3dlock_global);
   2679     return r;
   2680 }
   2681 
   2682 #if 0
   2683 static HRESULT NINE_WINAPI
   2684 LockSurface9_GetDesc( struct NineSurface9 *This,
   2685                       D3DSURFACE_DESC *pDesc )
   2686 {
   2687     HRESULT r;
   2688     pipe_mutex_lock(d3dlock_global);
   2689     r = NineSurface9_GetDesc(This, pDesc);
   2690     pipe_mutex_unlock(d3dlock_global);
   2691     return r;
   2692 }
   2693 #endif
   2694 
   2695 static HRESULT NINE_WINAPI
   2696 LockSurface9_LockRect( struct NineSurface9 *This,
   2697                        D3DLOCKED_RECT *pLockedRect,
   2698                        const RECT *pRect,
   2699                        DWORD Flags )
   2700 {
   2701     HRESULT r;
   2702     pipe_mutex_lock(d3dlock_global);
   2703     r = NineSurface9_LockRect(This, pLockedRect, pRect, Flags);
   2704     pipe_mutex_unlock(d3dlock_global);
   2705     return r;
   2706 }
   2707 
   2708 static HRESULT NINE_WINAPI
   2709 LockSurface9_UnlockRect( struct NineSurface9 *This )
   2710 {
   2711     HRESULT r;
   2712     pipe_mutex_lock(d3dlock_global);
   2713     r = NineSurface9_UnlockRect(This);
   2714     pipe_mutex_unlock(d3dlock_global);
   2715     return r;
   2716 }
   2717 
   2718 static HRESULT NINE_WINAPI
   2719 LockSurface9_GetDC( struct NineSurface9 *This,
   2720                     HDC *phdc )
   2721 {
   2722     HRESULT r;
   2723     pipe_mutex_lock(d3dlock_global);
   2724     r = NineSurface9_GetDC(This, phdc);
   2725     pipe_mutex_unlock(d3dlock_global);
   2726     return r;
   2727 }
   2728 
   2729 static HRESULT NINE_WINAPI
   2730 LockSurface9_ReleaseDC( struct NineSurface9 *This,
   2731                         HDC hdc )
   2732 {
   2733     HRESULT r;
   2734     pipe_mutex_lock(d3dlock_global);
   2735     r = NineSurface9_ReleaseDC(This, hdc);
   2736     pipe_mutex_unlock(d3dlock_global);
   2737     return r;
   2738 }
   2739 
   2740 IDirect3DSurface9Vtbl LockSurface9_vtable = {
   2741     (void *)NineUnknown_QueryInterface,
   2742     (void *)NineUnknown_AddRef,
   2743     (void *)NineUnknown_ReleaseWithDtorLock,
   2744     (void *)NineUnknown_GetDevice, /* actually part of Resource9 iface */
   2745     (void *)LockUnknown_SetPrivateData,
   2746     (void *)LockUnknown_GetPrivateData,
   2747     (void *)LockUnknown_FreePrivateData,
   2748     (void *)LockResource9_SetPriority,
   2749     (void *)LockResource9_GetPriority,
   2750     (void *)NineResource9_PreLoad, /* nop */
   2751     (void *)NineResource9_GetType, /* immutable */
   2752     (void *)LockSurface9_GetContainer,
   2753     (void *)NineSurface9_GetDesc, /* immutable */
   2754     (void *)LockSurface9_LockRect,
   2755     (void *)LockSurface9_UnlockRect,
   2756     (void *)LockSurface9_GetDC,
   2757     (void *)LockSurface9_ReleaseDC
   2758 };
   2759 
   2760 static HRESULT NINE_WINAPI
   2761 LockSwapChain9_Present( struct NineSwapChain9 *This,
   2762                         const RECT *pSourceRect,
   2763                         const RECT *pDestRect,
   2764                         HWND hDestWindowOverride,
   2765                         const RGNDATA *pDirtyRegion,
   2766                         DWORD dwFlags )
   2767 {
   2768     HRESULT r;
   2769     pipe_mutex_lock(d3dlock_global);
   2770     r = NineSwapChain9_Present(This, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion, dwFlags);
   2771     pipe_mutex_unlock(d3dlock_global);
   2772     return r;
   2773 }
   2774 
   2775 static HRESULT NINE_WINAPI
   2776 LockSwapChain9_GetFrontBufferData( struct NineSwapChain9 *This,
   2777                                    IDirect3DSurface9 *pDestSurface )
   2778 {
   2779     HRESULT r;
   2780     pipe_mutex_lock(d3dlock_global);
   2781     r = NineSwapChain9_GetFrontBufferData(This, pDestSurface);
   2782     pipe_mutex_unlock(d3dlock_global);
   2783     return r;
   2784 }
   2785 
   2786 static HRESULT NINE_WINAPI
   2787 LockSwapChain9_GetBackBuffer( struct NineSwapChain9 *This,
   2788                               UINT iBackBuffer,
   2789                               D3DBACKBUFFER_TYPE Type,
   2790                               IDirect3DSurface9 **ppBackBuffer )
   2791 {
   2792     HRESULT r;
   2793     pipe_mutex_lock(d3dlock_global);
   2794     r = NineSwapChain9_GetBackBuffer(This, iBackBuffer, Type, ppBackBuffer);
   2795     pipe_mutex_unlock(d3dlock_global);
   2796     return r;
   2797 }
   2798 
   2799 static HRESULT NINE_WINAPI
   2800 LockSwapChain9_GetRasterStatus( struct NineSwapChain9 *This,
   2801                                 D3DRASTER_STATUS *pRasterStatus )
   2802 {
   2803     HRESULT r;
   2804     pipe_mutex_lock(d3dlock_global);
   2805     r = NineSwapChain9_GetRasterStatus(This, pRasterStatus);
   2806     pipe_mutex_unlock(d3dlock_global);
   2807     return r;
   2808 }
   2809 
   2810 static HRESULT NINE_WINAPI
   2811 LockSwapChain9_GetDisplayMode( struct NineSwapChain9 *This,
   2812                                D3DDISPLAYMODE *pMode )
   2813 {
   2814     HRESULT r;
   2815     pipe_mutex_lock(d3dlock_global);
   2816     r = NineSwapChain9_GetDisplayMode(This, pMode);
   2817     pipe_mutex_unlock(d3dlock_global);
   2818     return r;
   2819 }
   2820 
   2821 #if 0
   2822 static HRESULT NINE_WINAPI
   2823 LockSwapChain9_GetDevice( struct NineSwapChain9 *This,
   2824                           IDirect3DDevice9 **ppDevice )
   2825 {
   2826     HRESULT r;
   2827     pipe_mutex_lock(d3dlock_global);
   2828     r = NineUnknown_GetDevice(NineUnknown(This), ppDevice);
   2829     pipe_mutex_unlock(d3dlock_global);
   2830     return r;
   2831 }
   2832 #endif
   2833 
   2834 static HRESULT NINE_WINAPI
   2835 LockSwapChain9_GetPresentParameters( struct NineSwapChain9 *This,
   2836                                      D3DPRESENT_PARAMETERS *pPresentationParameters )
   2837 {
   2838     HRESULT r;
   2839     pipe_mutex_lock(d3dlock_global);
   2840     r = NineSwapChain9_GetPresentParameters(This, pPresentationParameters);
   2841     pipe_mutex_unlock(d3dlock_global);
   2842     return r;
   2843 }
   2844 
   2845 IDirect3DSwapChain9Vtbl LockSwapChain9_vtable = {
   2846     (void *)NineUnknown_QueryInterface,
   2847     (void *)NineUnknown_AddRef,
   2848     (void *)NineUnknown_ReleaseWithDtorLock,
   2849     (void *)LockSwapChain9_Present,
   2850     (void *)LockSwapChain9_GetFrontBufferData,
   2851     (void *)LockSwapChain9_GetBackBuffer,
   2852     (void *)LockSwapChain9_GetRasterStatus,
   2853     (void *)LockSwapChain9_GetDisplayMode,
   2854     (void *)NineUnknown_GetDevice, /* actually part of SwapChain9 iface */
   2855     (void *)LockSwapChain9_GetPresentParameters
   2856 };
   2857 
   2858 static HRESULT NINE_WINAPI
   2859 LockSwapChain9Ex_GetLastPresentCount( struct NineSwapChain9Ex *This,
   2860                                       UINT *pLastPresentCount )
   2861 {
   2862     HRESULT r;
   2863     pipe_mutex_lock(d3dlock_global);
   2864     r = NineSwapChain9Ex_GetLastPresentCount(This, pLastPresentCount);
   2865     pipe_mutex_unlock(d3dlock_global);
   2866     return r;
   2867 }
   2868 
   2869 static HRESULT NINE_WINAPI
   2870 LockSwapChain9Ex_GetPresentStats( struct NineSwapChain9Ex *This,
   2871                                   D3DPRESENTSTATS *pPresentationStatistics )
   2872 {
   2873     HRESULT r;
   2874     pipe_mutex_lock(d3dlock_global);
   2875     r = NineSwapChain9Ex_GetPresentStats(This, pPresentationStatistics);
   2876     pipe_mutex_unlock(d3dlock_global);
   2877     return r;
   2878 }
   2879 
   2880 static HRESULT NINE_WINAPI
   2881 LockSwapChain9Ex_GetDisplayModeEx( struct NineSwapChain9Ex *This,
   2882                                    D3DDISPLAYMODEEX *pMode,
   2883                                    D3DDISPLAYROTATION *pRotation )
   2884 {
   2885     HRESULT r;
   2886     pipe_mutex_lock(d3dlock_global);
   2887     r = NineSwapChain9Ex_GetDisplayModeEx(This, pMode, pRotation);
   2888     pipe_mutex_unlock(d3dlock_global);
   2889     return r;
   2890 }
   2891 
   2892 IDirect3DSwapChain9ExVtbl LockSwapChain9Ex_vtable = {
   2893     (void *)NineUnknown_QueryInterface,
   2894     (void *)NineUnknown_AddRef,
   2895     (void *)NineUnknown_ReleaseWithDtorLock,
   2896     (void *)LockSwapChain9_Present,
   2897     (void *)LockSwapChain9_GetFrontBufferData,
   2898     (void *)LockSwapChain9_GetBackBuffer,
   2899     (void *)LockSwapChain9_GetRasterStatus,
   2900     (void *)LockSwapChain9_GetDisplayMode,
   2901     (void *)NineUnknown_GetDevice, /* actually part of NineSwapChain9 iface */
   2902     (void *)LockSwapChain9_GetPresentParameters,
   2903     (void *)LockSwapChain9Ex_GetLastPresentCount,
   2904     (void *)LockSwapChain9Ex_GetPresentStats,
   2905     (void *)LockSwapChain9Ex_GetDisplayModeEx
   2906 };
   2907 
   2908 #if 0
   2909 static HRESULT NINE_WINAPI
   2910 LockTexture9_GetLevelDesc( struct NineTexture9 *This,
   2911                            UINT Level,
   2912                            D3DSURFACE_DESC *pDesc )
   2913 {
   2914     HRESULT r;
   2915     pipe_mutex_lock(d3dlock_global);
   2916     r = NineTexture9_GetLevelDesc(This, Level, pDesc);
   2917     pipe_mutex_unlock(d3dlock_global);
   2918     return r;
   2919 }
   2920 #endif
   2921 
   2922 #if 0
   2923 static HRESULT NINE_WINAPI
   2924 LockTexture9_GetSurfaceLevel( struct NineTexture9 *This,
   2925                               UINT Level,
   2926                               IDirect3DSurface9 **ppSurfaceLevel )
   2927 {
   2928     HRESULT r;
   2929     pipe_mutex_lock(d3dlock_global);
   2930     r = NineTexture9_GetSurfaceLevel(This, Level, ppSurfaceLevel);
   2931     pipe_mutex_unlock(d3dlock_global);
   2932     return r;
   2933 }
   2934 #endif
   2935 
   2936 static HRESULT NINE_WINAPI
   2937 LockTexture9_LockRect( struct NineTexture9 *This,
   2938                        UINT Level,
   2939                        D3DLOCKED_RECT *pLockedRect,
   2940                        const RECT *pRect,
   2941                        DWORD Flags )
   2942 {
   2943     HRESULT r;
   2944     pipe_mutex_lock(d3dlock_global);
   2945     r = NineTexture9_LockRect(This, Level, pLockedRect, pRect, Flags);
   2946     pipe_mutex_unlock(d3dlock_global);
   2947     return r;
   2948 }
   2949 
   2950 static HRESULT NINE_WINAPI
   2951 LockTexture9_UnlockRect( struct NineTexture9 *This,
   2952                          UINT Level )
   2953 {
   2954     HRESULT r;
   2955     pipe_mutex_lock(d3dlock_global);
   2956     r = NineTexture9_UnlockRect(This, Level);
   2957     pipe_mutex_unlock(d3dlock_global);
   2958     return r;
   2959 }
   2960 
   2961 static HRESULT NINE_WINAPI
   2962 LockTexture9_AddDirtyRect( struct NineTexture9 *This,
   2963                            const RECT *pDirtyRect )
   2964 {
   2965     HRESULT r;
   2966     pipe_mutex_lock(d3dlock_global);
   2967     r = NineTexture9_AddDirtyRect(This, pDirtyRect);
   2968     pipe_mutex_unlock(d3dlock_global);
   2969     return r;
   2970 }
   2971 
   2972 IDirect3DTexture9Vtbl LockTexture9_vtable = {
   2973     (void *)NineUnknown_QueryInterface,
   2974     (void *)NineUnknown_AddRef,
   2975     (void *)NineUnknown_ReleaseWithDtorLock,
   2976     (void *)NineUnknown_GetDevice, /* actually part of Resource9 iface */
   2977     (void *)LockUnknown_SetPrivateData,
   2978     (void *)LockUnknown_GetPrivateData,
   2979     (void *)LockUnknown_FreePrivateData,
   2980     (void *)LockResource9_SetPriority,
   2981     (void *)LockResource9_GetPriority,
   2982     (void *)LockBaseTexture9_PreLoad,
   2983     (void *)NineResource9_GetType, /* immutable */
   2984     (void *)LockBaseTexture9_SetLOD,
   2985     (void *)LockBaseTexture9_GetLOD,
   2986     (void *)LockBaseTexture9_GetLevelCount,
   2987     (void *)LockBaseTexture9_SetAutoGenFilterType,
   2988     (void *)LockBaseTexture9_GetAutoGenFilterType,
   2989     (void *)LockBaseTexture9_GenerateMipSubLevels,
   2990     (void *)NineTexture9_GetLevelDesc, /* immutable */
   2991     (void *)NineTexture9_GetSurfaceLevel, /* AddRef */
   2992     (void *)LockTexture9_LockRect,
   2993     (void *)LockTexture9_UnlockRect,
   2994     (void *)LockTexture9_AddDirtyRect
   2995 };
   2996 
   2997 static HRESULT NINE_WINAPI
   2998 LockVertexBuffer9_Lock( struct NineVertexBuffer9 *This,
   2999                         UINT OffsetToLock,
   3000                         UINT SizeToLock,
   3001                         void **ppbData,
   3002                         DWORD Flags )
   3003 {
   3004     HRESULT r;
   3005     pipe_mutex_lock(d3dlock_global);
   3006     r = NineVertexBuffer9_Lock(This, OffsetToLock, SizeToLock, ppbData, Flags);
   3007     pipe_mutex_unlock(d3dlock_global);
   3008     return r;
   3009 }
   3010 
   3011 static HRESULT NINE_WINAPI
   3012 LockVertexBuffer9_Unlock( struct NineVertexBuffer9 *This )
   3013 {
   3014     HRESULT r;
   3015     pipe_mutex_lock(d3dlock_global);
   3016     r = NineVertexBuffer9_Unlock(This);
   3017     pipe_mutex_unlock(d3dlock_global);
   3018     return r;
   3019 }
   3020 
   3021 #if 0
   3022 static HRESULT NINE_WINAPI
   3023 LockVertexBuffer9_GetDesc( struct NineVertexBuffer9 *This,
   3024                            D3DVERTEXBUFFER_DESC *pDesc )
   3025 {
   3026     HRESULT r;
   3027     pipe_mutex_lock(d3dlock_global);
   3028     r = NineVertexBuffer9_GetDesc(This, pDesc);
   3029     pipe_mutex_unlock(d3dlock_global);
   3030     return r;
   3031 }
   3032 #endif
   3033 
   3034 IDirect3DVertexBuffer9Vtbl LockVertexBuffer9_vtable = {
   3035     (void *)NineUnknown_QueryInterface,
   3036     (void *)NineUnknown_AddRef,
   3037     (void *)NineUnknown_ReleaseWithDtorLock,
   3038     (void *)NineUnknown_GetDevice, /* actually part of Resource9 iface */
   3039     (void *)LockUnknown_SetPrivateData,
   3040     (void *)LockUnknown_GetPrivateData,
   3041     (void *)LockUnknown_FreePrivateData,
   3042     (void *)LockResource9_SetPriority,
   3043     (void *)LockResource9_GetPriority,
   3044     (void *)NineResource9_PreLoad, /* nop */
   3045     (void *)NineResource9_GetType, /* immutable */
   3046     (void *)LockVertexBuffer9_Lock,
   3047     (void *)LockVertexBuffer9_Unlock,
   3048     (void *)NineVertexBuffer9_GetDesc /* immutable */
   3049 };
   3050 
   3051 #if 0
   3052 static HRESULT NINE_WINAPI
   3053 LockVertexDeclaration9_GetDevice( struct NineVertexDeclaration9 *This,
   3054                                   IDirect3DDevice9 **ppDevice )
   3055 {
   3056     HRESULT r;
   3057     pipe_mutex_lock(d3dlock_global);
   3058     r = NineUnknown_GetDevice(NineUnknown(This), ppDevice);
   3059     pipe_mutex_unlock(d3dlock_global);
   3060     return r;
   3061 }
   3062 #endif
   3063 
   3064 static HRESULT NINE_WINAPI
   3065 LockVertexDeclaration9_GetDeclaration( struct NineVertexDeclaration9 *This,
   3066                                        D3DVERTEXELEMENT9 *pElement,
   3067                                        UINT *pNumElements )
   3068 {
   3069     HRESULT r;
   3070     pipe_mutex_lock(d3dlock_global);
   3071     r = NineVertexDeclaration9_GetDeclaration(This, pElement, pNumElements);
   3072     pipe_mutex_unlock(d3dlock_global);
   3073     return r;
   3074 }
   3075 
   3076 IDirect3DVertexDeclaration9Vtbl LockVertexDeclaration9_vtable = {
   3077     (void *)NineUnknown_QueryInterface,
   3078     (void *)NineUnknown_AddRef,
   3079     (void *)NineUnknown_ReleaseWithDtorLock,
   3080     (void *)NineUnknown_GetDevice, /* actually part of VertexDecl9 iface */
   3081     (void *)LockVertexDeclaration9_GetDeclaration
   3082 };
   3083 
   3084 #if 0
   3085 static HRESULT NINE_WINAPI
   3086 LockVertexShader9_GetDevice( struct NineVertexShader9 *This,
   3087                              IDirect3DDevice9 **ppDevice )
   3088 {
   3089     HRESULT r;
   3090     pipe_mutex_lock(d3dlock_global);
   3091     r = NineUnknown_GetDevice(NineUnknown(This), ppDevice);
   3092     pipe_mutex_unlock(d3dlock_global);
   3093     return r;
   3094 }
   3095 #endif
   3096 
   3097 static HRESULT NINE_WINAPI
   3098 LockVertexShader9_GetFunction( struct NineVertexShader9 *This,
   3099                                void *pData,
   3100                                UINT *pSizeOfData )
   3101 {
   3102     HRESULT r;
   3103     pipe_mutex_lock(d3dlock_global);
   3104     r = NineVertexShader9_GetFunction(This, pData, pSizeOfData);
   3105     pipe_mutex_unlock(d3dlock_global);
   3106     return r;
   3107 }
   3108 
   3109 IDirect3DVertexShader9Vtbl LockVertexShader9_vtable = {
   3110     (void *)NineUnknown_QueryInterface,
   3111     (void *)NineUnknown_AddRef,
   3112     (void *)NineUnknown_ReleaseWithDtorLock,
   3113     (void *)NineUnknown_GetDevice,
   3114     (void *)LockVertexShader9_GetFunction
   3115 };
   3116 
   3117 #if 0
   3118 static HRESULT NINE_WINAPI
   3119 LockVolume9_GetDevice( struct NineVolume9 *This,
   3120                        IDirect3DDevice9 **ppDevice )
   3121 {
   3122     HRESULT r;
   3123     pipe_mutex_lock(d3dlock_global);
   3124     r = NineUnknown_GetDevice(NineUnknown(This), ppDevice);
   3125     pipe_mutex_unlock(d3dlock_global);
   3126     return r;
   3127 }
   3128 #endif
   3129 
   3130 static HRESULT NINE_WINAPI
   3131 LockVolume9_GetContainer( struct NineVolume9 *This,
   3132                           REFIID riid,
   3133                           void **ppContainer )
   3134 {
   3135     HRESULT r;
   3136     pipe_mutex_lock(d3dlock_global);
   3137     r = NineVolume9_GetContainer(This, riid, ppContainer);
   3138     pipe_mutex_unlock(d3dlock_global);
   3139     return r;
   3140 }
   3141 
   3142 #if 0
   3143 static HRESULT NINE_WINAPI
   3144 LockVolume9_GetDesc( struct NineVolume9 *This,
   3145                      D3DVOLUME_DESC *pDesc )
   3146 {
   3147     HRESULT r;
   3148     pipe_mutex_lock(d3dlock_global);
   3149     r = NineVolume9_GetDesc(This, pDesc);
   3150     pipe_mutex_unlock(d3dlock_global);
   3151     return r;
   3152 }
   3153 #endif
   3154 
   3155 static HRESULT NINE_WINAPI
   3156 LockVolume9_LockBox( struct NineVolume9 *This,
   3157                      D3DLOCKED_BOX *pLockedVolume,
   3158                      const D3DBOX *pBox,
   3159                      DWORD Flags )
   3160 {
   3161     HRESULT r;
   3162     pipe_mutex_lock(d3dlock_global);
   3163     r = NineVolume9_LockBox(This, pLockedVolume, pBox, Flags);
   3164     pipe_mutex_unlock(d3dlock_global);
   3165     return r;
   3166 }
   3167 
   3168 static HRESULT NINE_WINAPI
   3169 LockVolume9_UnlockBox( struct NineVolume9 *This )
   3170 {
   3171     HRESULT r;
   3172     pipe_mutex_lock(d3dlock_global);
   3173     r = NineVolume9_UnlockBox(This);
   3174     pipe_mutex_unlock(d3dlock_global);
   3175     return r;
   3176 }
   3177 
   3178 IDirect3DVolume9Vtbl LockVolume9_vtable = {
   3179     (void *)NineUnknown_QueryInterface,
   3180     (void *)NineUnknown_AddRef,
   3181     (void *)NineUnknown_ReleaseWithDtorLock,
   3182     (void *)NineUnknown_GetDevice, /* actually part of Volume9 iface */
   3183     (void *)NineUnknown_SetPrivateData,
   3184     (void *)NineUnknown_GetPrivateData,
   3185     (void *)NineUnknown_FreePrivateData,
   3186     (void *)LockVolume9_GetContainer,
   3187     (void *)NineVolume9_GetDesc, /* immutable */
   3188     (void *)LockVolume9_LockBox,
   3189     (void *)LockVolume9_UnlockBox
   3190 };
   3191 
   3192 #if 0
   3193 static HRESULT NINE_WINAPI
   3194 LockVolumeTexture9_GetLevelDesc( struct NineVolumeTexture9 *This,
   3195                                  UINT Level,
   3196                                  D3DVOLUME_DESC *pDesc )
   3197 {
   3198     HRESULT r;
   3199     pipe_mutex_lock(d3dlock_global);
   3200     r = NineVolumeTexture9_GetLevelDesc(This, Level, pDesc);
   3201     pipe_mutex_unlock(d3dlock_global);
   3202     return r;
   3203 }
   3204 #endif
   3205 
   3206 #if 0
   3207 static HRESULT NINE_WINAPI
   3208 LockVolumeTexture9_GetVolumeLevel( struct NineVolumeTexture9 *This,
   3209                                    UINT Level,
   3210                                    IDirect3DVolume9 **ppVolumeLevel )
   3211 {
   3212     HRESULT r;
   3213     pipe_mutex_lock(d3dlock_global);
   3214     r = NineVolumeTexture9_GetVolumeLevel(This, Level, ppVolumeLevel);
   3215     pipe_mutex_unlock(d3dlock_global);
   3216     return r;
   3217 }
   3218 #endif
   3219 
   3220 static HRESULT NINE_WINAPI
   3221 LockVolumeTexture9_LockBox( struct NineVolumeTexture9 *This,
   3222                             UINT Level,
   3223                             D3DLOCKED_BOX *pLockedVolume,
   3224                             const D3DBOX *pBox,
   3225                             DWORD Flags )
   3226 {
   3227     HRESULT r;
   3228     pipe_mutex_lock(d3dlock_global);
   3229     r = NineVolumeTexture9_LockBox(This, Level, pLockedVolume, pBox, Flags);
   3230     pipe_mutex_unlock(d3dlock_global);
   3231     return r;
   3232 }
   3233 
   3234 static HRESULT NINE_WINAPI
   3235 LockVolumeTexture9_UnlockBox( struct NineVolumeTexture9 *This,
   3236                               UINT Level )
   3237 {
   3238     HRESULT r;
   3239     pipe_mutex_lock(d3dlock_global);
   3240     r = NineVolumeTexture9_UnlockBox(This, Level);
   3241     pipe_mutex_unlock(d3dlock_global);
   3242     return r;
   3243 }
   3244 
   3245 static HRESULT NINE_WINAPI
   3246 LockVolumeTexture9_AddDirtyBox( struct NineVolumeTexture9 *This,
   3247                                 const D3DBOX *pDirtyBox )
   3248 {
   3249     HRESULT r;
   3250     pipe_mutex_lock(d3dlock_global);
   3251     r = NineVolumeTexture9_AddDirtyBox(This, pDirtyBox);
   3252     pipe_mutex_unlock(d3dlock_global);
   3253     return r;
   3254 }
   3255 
   3256 IDirect3DVolumeTexture9Vtbl LockVolumeTexture9_vtable = {
   3257     (void *)NineUnknown_QueryInterface,
   3258     (void *)NineUnknown_AddRef,
   3259     (void *)NineUnknown_ReleaseWithDtorLock,
   3260     (void *)NineUnknown_GetDevice, /* actually part of Resource9 iface */
   3261     (void *)LockUnknown_SetPrivateData,
   3262     (void *)LockUnknown_GetPrivateData,
   3263     (void *)LockUnknown_FreePrivateData,
   3264     (void *)LockResource9_SetPriority,
   3265     (void *)LockResource9_GetPriority,
   3266     (void *)LockBaseTexture9_PreLoad,
   3267     (void *)NineResource9_GetType, /* immutable */
   3268     (void *)LockBaseTexture9_SetLOD,
   3269     (void *)LockBaseTexture9_GetLOD,
   3270     (void *)LockBaseTexture9_GetLevelCount,
   3271     (void *)LockBaseTexture9_SetAutoGenFilterType,
   3272     (void *)LockBaseTexture9_GetAutoGenFilterType,
   3273     (void *)LockBaseTexture9_GenerateMipSubLevels,
   3274     (void *)NineVolumeTexture9_GetLevelDesc, /* immutable */
   3275     (void *)NineVolumeTexture9_GetVolumeLevel, /* AddRef */
   3276     (void *)LockVolumeTexture9_LockBox,
   3277     (void *)LockVolumeTexture9_UnlockBox,
   3278     (void *)LockVolumeTexture9_AddDirtyBox
   3279 };
   3280 
   3281 ID3DAdapter9Vtbl LockAdapter9_vtable = { /* not used */
   3282     (void *)NULL,
   3283     (void *)NULL,
   3284     (void *)NULL,
   3285     (void *)NULL,
   3286     (void *)NULL,
   3287     (void *)NULL,
   3288     (void *)NULL,
   3289     (void *)NULL,
   3290     (void *)NULL,
   3291     (void *)NULL,
   3292     (void *)NULL,
   3293     (void *)NULL
   3294 };
   3295