Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

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