Home | History | Annotate | Download | only in nine
      1 /*
      2  * Copyright 2011 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 "device9.h"
     24 #include "device9ex.h"
     25 #include "nine_pipe.h"
     26 #include "swapchain9ex.h"
     27 
     28 #include "nine_helpers.h"
     29 
     30 #define DBG_CHANNEL DBG_DEVICE
     31 
     32 static HRESULT
     33 NineDevice9Ex_ctor( struct NineDevice9Ex *This,
     34                     struct NineUnknownParams *pParams,
     35                     struct pipe_screen *pScreen,
     36                     D3DDEVICE_CREATION_PARAMETERS *pCreationParameters,
     37                     D3DCAPS9 *pCaps,
     38                     D3DPRESENT_PARAMETERS *pPresentationParameters,
     39                     D3DDISPLAYMODEEX *pFullscreenDisplayMode,
     40                     IDirect3D9Ex *pD3D9Ex,
     41                     ID3DPresentGroup *pPresentationGroup,
     42                     struct d3dadapter9_context *pCTX,
     43                     int minorVersionNum )
     44 {
     45     DBG("This=%p pParams=%p pScreen=%p pCreationParameters=%p pCaps=%p "
     46         "pPresentationParameters=%p pFullscreenDisplayMode=%p "
     47         "pD3D9Ex=%p pPresentationGroup=%p pCTX=%p\n",
     48         This, pParams, pScreen, pCreationParameters, pCaps,
     49         pPresentationParameters, pFullscreenDisplayMode,
     50         pD3D9Ex, pPresentationGroup, pCTX);
     51 
     52     return NineDevice9_ctor(&This->base, pParams,
     53                             pScreen, pCreationParameters, pCaps,
     54                             pPresentationParameters,
     55                             (IDirect3D9 *)pD3D9Ex, pPresentationGroup, pCTX,
     56                             TRUE, pFullscreenDisplayMode, minorVersionNum);
     57 }
     58 
     59 static void
     60 NineDevice9Ex_dtor( struct NineDevice9Ex *This )
     61 {
     62     NineDevice9_dtor(&This->base);
     63 }
     64 
     65 HRESULT NINE_WINAPI
     66 NineDevice9Ex_SetConvolutionMonoKernel( struct NineDevice9Ex *This,
     67                                         UINT width,
     68                                         UINT height,
     69                                         float *rows,
     70                                         float *columns )
     71 {
     72     STUB(D3DERR_INVALIDCALL);
     73 }
     74 
     75 HRESULT NINE_WINAPI
     76 NineDevice9Ex_ComposeRects( struct NineDevice9Ex *This,
     77                             IDirect3DSurface9 *pSrc,
     78                             IDirect3DSurface9 *pDst,
     79                             IDirect3DVertexBuffer9 *pSrcRectDescs,
     80                             UINT NumRects,
     81                             IDirect3DVertexBuffer9 *pDstRectDescs,
     82                             D3DCOMPOSERECTSOP Operation,
     83                             int Xoffset,
     84                             int Yoffset )
     85 {
     86     STUB(D3DERR_INVALIDCALL);
     87 }
     88 
     89 HRESULT NINE_WINAPI
     90 NineDevice9Ex_PresentEx( struct NineDevice9Ex *This,
     91                          const RECT *pSourceRect,
     92                          const RECT *pDestRect,
     93                          HWND hDestWindowOverride,
     94                          const RGNDATA *pDirtyRegion,
     95                          DWORD dwFlags )
     96 {
     97     unsigned i;
     98     HRESULT hr;
     99 
    100     DBG("This=%p pSourceRect=%p pDestRect=%p hDestWindowOverride=%p "
    101         "pDirtyRegion=%p dwFlags=%d\n",
    102         This, pSourceRect, pDestRect, hDestWindowOverride,
    103         pDirtyRegion, dwFlags);
    104 
    105     for (i = 0; i < This->base.nswapchains; i++) {
    106         hr = NineSwapChain9_Present(This->base.swapchains[i], pSourceRect, pDestRect,
    107                                     hDestWindowOverride, pDirtyRegion, dwFlags);
    108         if (FAILED(hr)) { return hr; }
    109     }
    110 
    111     return D3D_OK;
    112 }
    113 
    114 HRESULT NINE_WINAPI
    115 NineDevice9Ex_GetGPUThreadPriority( struct NineDevice9Ex *This,
    116                                     INT *pPriority )
    117 {
    118     STUB(D3DERR_INVALIDCALL);
    119 }
    120 
    121 HRESULT NINE_WINAPI
    122 NineDevice9Ex_SetGPUThreadPriority( struct NineDevice9Ex *This,
    123                                     INT Priority )
    124 {
    125     STUB(D3DERR_INVALIDCALL);
    126 }
    127 
    128 HRESULT NINE_WINAPI
    129 NineDevice9Ex_WaitForVBlank( struct NineDevice9Ex *This,
    130                              UINT iSwapChain )
    131 {
    132     STUB(D3DERR_INVALIDCALL);
    133 }
    134 
    135 HRESULT NINE_WINAPI
    136 NineDevice9Ex_CheckResourceResidency( struct NineDevice9Ex *This,
    137                                       IDirect3DResource9 **pResourceArray,
    138                                       UINT32 NumResources )
    139 {
    140     STUB(D3DERR_INVALIDCALL);
    141 }
    142 
    143 HRESULT NINE_WINAPI
    144 NineDevice9Ex_SetMaximumFrameLatency( struct NineDevice9Ex *This,
    145                                       UINT MaxLatency )
    146 {
    147     STUB(D3DERR_INVALIDCALL);
    148 }
    149 
    150 HRESULT NINE_WINAPI
    151 NineDevice9Ex_GetMaximumFrameLatency( struct NineDevice9Ex *This,
    152                                       UINT *pMaxLatency )
    153 {
    154     STUB(D3DERR_INVALIDCALL);
    155 }
    156 
    157 HRESULT NINE_WINAPI
    158 NineDevice9Ex_CheckDeviceState( struct NineDevice9Ex *This,
    159                                 HWND hDestinationWindow )
    160 {
    161     DBG("This=%p hDestinationWindow=%p\n",
    162         This, hDestinationWindow);
    163 
    164     user_assert(!This->base.swapchains[0]->params.Windowed, D3D_OK);
    165 
    166     if (This->base.params.hFocusWindow == hDestinationWindow) {
    167         if (NineSwapChain9_GetOccluded(This->base.swapchains[0]))
    168             return S_PRESENT_OCCLUDED;
    169     } else if(!NineSwapChain9_GetOccluded(This->base.swapchains[0])) {
    170         return S_PRESENT_OCCLUDED;
    171     }
    172     /* TODO: handle the other return values */
    173     return D3D_OK;
    174 }
    175 
    176 HRESULT NINE_WINAPI
    177 NineDevice9Ex_CreateRenderTargetEx( struct NineDevice9Ex *This,
    178                                     UINT Width,
    179                                     UINT Height,
    180                                     D3DFORMAT Format,
    181                                     D3DMULTISAMPLE_TYPE MultiSample,
    182                                     DWORD MultisampleQuality,
    183                                     BOOL Lockable,
    184                                     IDirect3DSurface9 **ppSurface,
    185                                     HANDLE *pSharedHandle,
    186                                     DWORD Usage )
    187 {
    188     STUB(D3DERR_INVALIDCALL);
    189 }
    190 
    191 HRESULT NINE_WINAPI
    192 NineDevice9Ex_CreateOffscreenPlainSurfaceEx( struct NineDevice9Ex *This,
    193                                              UINT Width,
    194                                              UINT Height,
    195                                              D3DFORMAT Format,
    196                                              D3DPOOL Pool,
    197                                              IDirect3DSurface9 **ppSurface,
    198                                              HANDLE *pSharedHandle,
    199                                              DWORD Usage )
    200 {
    201     STUB(D3DERR_INVALIDCALL);
    202 }
    203 
    204 HRESULT NINE_WINAPI
    205 NineDevice9Ex_CreateDepthStencilSurfaceEx( struct NineDevice9Ex *This,
    206                                            UINT Width,
    207                                            UINT Height,
    208                                            D3DFORMAT Format,
    209                                            D3DMULTISAMPLE_TYPE MultiSample,
    210                                            DWORD MultisampleQuality,
    211                                            BOOL Discard,
    212                                            IDirect3DSurface9 **ppSurface,
    213                                            HANDLE *pSharedHandle,
    214                                            DWORD Usage )
    215 {
    216     STUB(D3DERR_INVALIDCALL);
    217 }
    218 
    219 HRESULT NINE_WINAPI
    220 NineDevice9Ex_ResetEx( struct NineDevice9Ex *This,
    221                        D3DPRESENT_PARAMETERS *pPresentationParameters,
    222                        D3DDISPLAYMODEEX *pFullscreenDisplayMode )
    223 {
    224     HRESULT hr = D3D_OK;
    225     unsigned i;
    226 
    227     DBG("This=%p pPresentationParameters=%p pFullscreenDisplayMode=%p\n", This, pPresentationParameters, pFullscreenDisplayMode);
    228 
    229     for (i = 0; i < This->base.nswapchains; ++i) {
    230         D3DDISPLAYMODEEX *mode = NULL;
    231         D3DPRESENT_PARAMETERS *params = &pPresentationParameters[i];
    232         if (pFullscreenDisplayMode) mode = &(pFullscreenDisplayMode[i]);
    233         hr = NineSwapChain9_Resize(This->base.swapchains[i], params, mode);
    234         if (FAILED(hr))
    235             break;
    236     }
    237 
    238     NineDevice9_SetRenderTarget(
    239         (struct NineDevice9 *)This, 0, (IDirect3DSurface9 *)This->base.swapchains[0]->buffers[0]);
    240 
    241     return hr;
    242 }
    243 
    244 HRESULT NINE_WINAPI
    245 NineDevice9Ex_Reset( struct NineDevice9Ex *This,
    246                      D3DPRESENT_PARAMETERS *pPresentationParameters )
    247 {
    248     HRESULT hr = D3D_OK;
    249     unsigned i;
    250 
    251     DBG("This=%p pPresentationParameters=%p\n", This, pPresentationParameters);
    252 
    253     for (i = 0; i < This->base.nswapchains; ++i) {
    254         D3DPRESENT_PARAMETERS *params = &pPresentationParameters[i];
    255         hr = NineSwapChain9_Resize(This->base.swapchains[i], params, NULL);
    256         if (FAILED(hr))
    257             break;
    258     }
    259 
    260     nine_csmt_process(&This->base);
    261     nine_state_clear(&This->base.state, TRUE);
    262     nine_context_clear(&This->base);
    263 
    264     NineDevice9_SetDefaultState((struct NineDevice9 *)This, TRUE);
    265     NineDevice9_SetRenderTarget(
    266         (struct NineDevice9 *)This, 0, (IDirect3DSurface9 *)This->base.swapchains[0]->buffers[0]);
    267 
    268     return hr;
    269 }
    270 
    271 HRESULT NINE_WINAPI
    272 NineDevice9Ex_GetDisplayModeEx( struct NineDevice9Ex *This,
    273                                 UINT iSwapChain,
    274                                 D3DDISPLAYMODEEX *pMode,
    275                                 D3DDISPLAYROTATION *pRotation )
    276 {
    277     struct NineSwapChain9Ex *swapchain;
    278 
    279     DBG("This=%p iSwapChain=%u pMode=%p pRotation=%p\n",
    280         This, iSwapChain, pMode, pRotation);
    281 
    282     user_assert(iSwapChain < This->base.nswapchains, D3DERR_INVALIDCALL);
    283 
    284     swapchain = NineSwapChain9Ex(This->base.swapchains[iSwapChain]);
    285     return NineSwapChain9Ex_GetDisplayModeEx(swapchain, pMode, pRotation);
    286 }
    287 
    288 HRESULT NINE_WINAPI
    289 NineDevice9Ex_TestCooperativeLevel( struct NineDevice9Ex *This )
    290 {
    291     return D3D_OK;
    292 }
    293 
    294 
    295 IDirect3DDevice9ExVtbl NineDevice9Ex_vtable = {
    296     (void *)NineUnknown_QueryInterface,
    297     (void *)NineUnknown_AddRef,
    298     (void *)NineUnknown_Release,
    299     (void *)NineDevice9Ex_TestCooperativeLevel,
    300     (void *)NineDevice9_GetAvailableTextureMem,
    301     (void *)NineDevice9_EvictManagedResources,
    302     (void *)NineDevice9_GetDirect3D,
    303     (void *)NineDevice9_GetDeviceCaps,
    304     (void *)NineDevice9_GetDisplayMode,
    305     (void *)NineDevice9_GetCreationParameters,
    306     (void *)NineDevice9_SetCursorProperties,
    307     (void *)NineDevice9_SetCursorPosition,
    308     (void *)NineDevice9_ShowCursor,
    309     (void *)NineDevice9_CreateAdditionalSwapChain,
    310     (void *)NineDevice9_GetSwapChain,
    311     (void *)NineDevice9_GetNumberOfSwapChains,
    312     (void *)NineDevice9Ex_Reset,
    313     (void *)NineDevice9_Present,
    314     (void *)NineDevice9_GetBackBuffer,
    315     (void *)NineDevice9_GetRasterStatus,
    316     (void *)NineDevice9_SetDialogBoxMode,
    317     (void *)NineDevice9_SetGammaRamp,
    318     (void *)NineDevice9_GetGammaRamp,
    319     (void *)NineDevice9_CreateTexture,
    320     (void *)NineDevice9_CreateVolumeTexture,
    321     (void *)NineDevice9_CreateCubeTexture,
    322     (void *)NineDevice9_CreateVertexBuffer,
    323     (void *)NineDevice9_CreateIndexBuffer,
    324     (void *)NineDevice9_CreateRenderTarget,
    325     (void *)NineDevice9_CreateDepthStencilSurface,
    326     (void *)NineDevice9_UpdateSurface,
    327     (void *)NineDevice9_UpdateTexture,
    328     (void *)NineDevice9_GetRenderTargetData,
    329     (void *)NineDevice9_GetFrontBufferData,
    330     (void *)NineDevice9_StretchRect,
    331     (void *)NineDevice9_ColorFill,
    332     (void *)NineDevice9_CreateOffscreenPlainSurface,
    333     (void *)NineDevice9_SetRenderTarget,
    334     (void *)NineDevice9_GetRenderTarget,
    335     (void *)NineDevice9_SetDepthStencilSurface,
    336     (void *)NineDevice9_GetDepthStencilSurface,
    337     (void *)NineDevice9_BeginScene,
    338     (void *)NineDevice9_EndScene,
    339     (void *)NineDevice9_Clear,
    340     (void *)NineDevice9_SetTransform,
    341     (void *)NineDevice9_GetTransform,
    342     (void *)NineDevice9_MultiplyTransform,
    343     (void *)NineDevice9_SetViewport,
    344     (void *)NineDevice9_GetViewport,
    345     (void *)NineDevice9_SetMaterial,
    346     (void *)NineDevice9_GetMaterial,
    347     (void *)NineDevice9_SetLight,
    348     (void *)NineDevice9_GetLight,
    349     (void *)NineDevice9_LightEnable,
    350     (void *)NineDevice9_GetLightEnable,
    351     (void *)NineDevice9_SetClipPlane,
    352     (void *)NineDevice9_GetClipPlane,
    353     (void *)NineDevice9_SetRenderState,
    354     (void *)NineDevice9_GetRenderState,
    355     (void *)NineDevice9_CreateStateBlock,
    356     (void *)NineDevice9_BeginStateBlock,
    357     (void *)NineDevice9_EndStateBlock,
    358     (void *)NineDevice9_SetClipStatus,
    359     (void *)NineDevice9_GetClipStatus,
    360     (void *)NineDevice9_GetTexture,
    361     (void *)NineDevice9_SetTexture,
    362     (void *)NineDevice9_GetTextureStageState,
    363     (void *)NineDevice9_SetTextureStageState,
    364     (void *)NineDevice9_GetSamplerState,
    365     (void *)NineDevice9_SetSamplerState,
    366     (void *)NineDevice9_ValidateDevice,
    367     (void *)NineDevice9_SetPaletteEntries,
    368     (void *)NineDevice9_GetPaletteEntries,
    369     (void *)NineDevice9_SetCurrentTexturePalette,
    370     (void *)NineDevice9_GetCurrentTexturePalette,
    371     (void *)NineDevice9_SetScissorRect,
    372     (void *)NineDevice9_GetScissorRect,
    373     (void *)NineDevice9_SetSoftwareVertexProcessing,
    374     (void *)NineDevice9_GetSoftwareVertexProcessing,
    375     (void *)NineDevice9_SetNPatchMode,
    376     (void *)NineDevice9_GetNPatchMode,
    377     (void *)NineDevice9_DrawPrimitive,
    378     (void *)NineDevice9_DrawIndexedPrimitive,
    379     (void *)NineDevice9_DrawPrimitiveUP,
    380     (void *)NineDevice9_DrawIndexedPrimitiveUP,
    381     (void *)NineDevice9_ProcessVertices,
    382     (void *)NineDevice9_CreateVertexDeclaration,
    383     (void *)NineDevice9_SetVertexDeclaration,
    384     (void *)NineDevice9_GetVertexDeclaration,
    385     (void *)NineDevice9_SetFVF,
    386     (void *)NineDevice9_GetFVF,
    387     (void *)NineDevice9_CreateVertexShader,
    388     (void *)NineDevice9_SetVertexShader,
    389     (void *)NineDevice9_GetVertexShader,
    390     (void *)NineDevice9_SetVertexShaderConstantF,
    391     (void *)NineDevice9_GetVertexShaderConstantF,
    392     (void *)NineDevice9_SetVertexShaderConstantI,
    393     (void *)NineDevice9_GetVertexShaderConstantI,
    394     (void *)NineDevice9_SetVertexShaderConstantB,
    395     (void *)NineDevice9_GetVertexShaderConstantB,
    396     (void *)NineDevice9_SetStreamSource,
    397     (void *)NineDevice9_GetStreamSource,
    398     (void *)NineDevice9_SetStreamSourceFreq,
    399     (void *)NineDevice9_GetStreamSourceFreq,
    400     (void *)NineDevice9_SetIndices,
    401     (void *)NineDevice9_GetIndices,
    402     (void *)NineDevice9_CreatePixelShader,
    403     (void *)NineDevice9_SetPixelShader,
    404     (void *)NineDevice9_GetPixelShader,
    405     (void *)NineDevice9_SetPixelShaderConstantF,
    406     (void *)NineDevice9_GetPixelShaderConstantF,
    407     (void *)NineDevice9_SetPixelShaderConstantI,
    408     (void *)NineDevice9_GetPixelShaderConstantI,
    409     (void *)NineDevice9_SetPixelShaderConstantB,
    410     (void *)NineDevice9_GetPixelShaderConstantB,
    411     (void *)NineDevice9_DrawRectPatch,
    412     (void *)NineDevice9_DrawTriPatch,
    413     (void *)NineDevice9_DeletePatch,
    414     (void *)NineDevice9_CreateQuery,
    415     (void *)NineDevice9Ex_SetConvolutionMonoKernel,
    416     (void *)NineDevice9Ex_ComposeRects,
    417     (void *)NineDevice9Ex_PresentEx,
    418     (void *)NineDevice9Ex_GetGPUThreadPriority,
    419     (void *)NineDevice9Ex_SetGPUThreadPriority,
    420     (void *)NineDevice9Ex_WaitForVBlank,
    421     (void *)NineDevice9Ex_CheckResourceResidency,
    422     (void *)NineDevice9Ex_SetMaximumFrameLatency,
    423     (void *)NineDevice9Ex_GetMaximumFrameLatency,
    424     (void *)NineDevice9Ex_CheckDeviceState,
    425     (void *)NineDevice9Ex_CreateRenderTargetEx,
    426     (void *)NineDevice9Ex_CreateOffscreenPlainSurfaceEx,
    427     (void *)NineDevice9Ex_CreateDepthStencilSurfaceEx,
    428     (void *)NineDevice9Ex_ResetEx,
    429     (void *)NineDevice9Ex_GetDisplayModeEx
    430 };
    431 
    432 static const GUID *NineDevice9Ex_IIDs[] = {
    433     &IID_IDirect3DDevice9Ex,
    434     &IID_IDirect3DDevice9,
    435     &IID_IUnknown,
    436     NULL
    437 };
    438 
    439 HRESULT
    440 NineDevice9Ex_new( struct pipe_screen *pScreen,
    441                    D3DDEVICE_CREATION_PARAMETERS *pCreationParameters,
    442                    D3DCAPS9 *pCaps,
    443                    D3DPRESENT_PARAMETERS *pPresentationParameters,
    444                    D3DDISPLAYMODEEX *pFullscreenDisplayMode,
    445                    IDirect3D9Ex *pD3D9Ex,
    446                    ID3DPresentGroup *pPresentationGroup,
    447                    struct d3dadapter9_context *pCTX,
    448                    struct NineDevice9Ex **ppOut,
    449                    int minorVersionNum )
    450 {
    451     BOOL lock;
    452     lock = !!(pCreationParameters->BehaviorFlags & D3DCREATE_MULTITHREADED);
    453 
    454     NINE_NEW(Device9Ex, ppOut, lock,
    455              pScreen, pCreationParameters, pCaps, pPresentationParameters,
    456              pFullscreenDisplayMode, pD3D9Ex, pPresentationGroup, pCTX, minorVersionNum );
    457 }
    458 
    459