0,0 → 1,413 |
/* |
* Copyright 2011 Joakim Sindholt <opensource@zhasha.com> |
* |
* Permission is hereby granted, free of charge, to any person obtaining a |
* copy of this software and associated documentation files (the "Software"), |
* to deal in the Software without restriction, including without limitation |
* on the rights to use, copy, modify, merge, publish, distribute, sub |
* license, and/or sell copies of the Software, and to permit persons to whom |
* the Software is furnished to do so, subject to the following conditions: |
* |
* The above copyright notice and this permission notice (including the next |
* paragraph) shall be included in all copies or substantial portions of the |
* Software. |
* |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL |
* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, |
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
* USE OR OTHER DEALINGS IN THE SOFTWARE. */ |
|
#include "device9ex.h" |
#include "swapchain9ex.h" |
|
#include "nine_helpers.h" |
|
#define DBG_CHANNEL DBG_DEVICE |
|
static HRESULT |
NineDevice9Ex_ctor( struct NineDevice9Ex *This, |
struct NineUnknownParams *pParams, |
struct pipe_screen *pScreen, |
D3DDEVICE_CREATION_PARAMETERS *pCreationParameters, |
D3DCAPS9 *pCaps, |
D3DPRESENT_PARAMETERS *pPresentationParameters, |
D3DDISPLAYMODEEX *pFullscreenDisplayMode, |
IDirect3D9Ex *pD3D9Ex, |
ID3DPresentGroup *pPresentationGroup, |
struct d3dadapter9_context *pCTX ) |
{ |
DBG("This=%p pParams=%p pScreen=%p pCreationParameters=%p pCaps=%p " |
"pPresentationParameters=%p pFullscreenDisplayMode=%p " |
"pD3D9Ex=%p pPresentationGroup=%p pCTX=%p\n", |
This, pParams, pScreen, pCreationParameters, pCaps, |
pPresentationParameters, pFullscreenDisplayMode, |
pD3D9Ex, pPresentationGroup, pCTX); |
|
return NineDevice9_ctor(&This->base, pParams, |
pScreen, pCreationParameters, pCaps, |
pPresentationParameters, |
(IDirect3D9 *)pD3D9Ex, pPresentationGroup, pCTX, |
TRUE, pFullscreenDisplayMode); |
} |
|
static void |
NineDevice9Ex_dtor( struct NineDevice9Ex *This ) |
{ |
NineDevice9_dtor(&This->base); |
} |
|
HRESULT WINAPI |
NineDevice9Ex_SetConvolutionMonoKernel( struct NineDevice9Ex *This, |
UINT width, |
UINT height, |
float *rows, |
float *columns ) |
{ |
STUB(D3DERR_INVALIDCALL); |
} |
|
HRESULT WINAPI |
NineDevice9Ex_ComposeRects( struct NineDevice9Ex *This, |
IDirect3DSurface9 *pSrc, |
IDirect3DSurface9 *pDst, |
IDirect3DVertexBuffer9 *pSrcRectDescs, |
UINT NumRects, |
IDirect3DVertexBuffer9 *pDstRectDescs, |
D3DCOMPOSERECTSOP Operation, |
int Xoffset, |
int Yoffset ) |
{ |
STUB(D3DERR_INVALIDCALL); |
} |
|
HRESULT WINAPI |
NineDevice9Ex_PresentEx( struct NineDevice9Ex *This, |
const RECT *pSourceRect, |
const RECT *pDestRect, |
HWND hDestWindowOverride, |
const RGNDATA *pDirtyRegion, |
DWORD dwFlags ) |
{ |
unsigned i; |
HRESULT hr; |
|
DBG("This=%p pSourceRect=%p pDestRect=%p hDestWindowOverride=%p " |
"pDirtyRegion=%p dwFlags=%d\n", |
This, pSourceRect, pDestRect, hDestWindowOverride, |
pDirtyRegion, dwFlags); |
|
for (i = 0; i < This->base.nswapchains; i++) { |
hr = NineSwapChain9_Present(This->base.swapchains[i], pSourceRect, pDestRect, |
hDestWindowOverride, pDirtyRegion, dwFlags); |
if (FAILED(hr)) { return hr; } |
} |
|
return D3D_OK; |
} |
|
HRESULT WINAPI |
NineDevice9Ex_GetGPUThreadPriority( struct NineDevice9Ex *This, |
INT *pPriority ) |
{ |
STUB(D3DERR_INVALIDCALL); |
} |
|
HRESULT WINAPI |
NineDevice9Ex_SetGPUThreadPriority( struct NineDevice9Ex *This, |
INT Priority ) |
{ |
STUB(D3DERR_INVALIDCALL); |
} |
|
HRESULT WINAPI |
NineDevice9Ex_WaitForVBlank( struct NineDevice9Ex *This, |
UINT iSwapChain ) |
{ |
STUB(D3DERR_INVALIDCALL); |
} |
|
HRESULT WINAPI |
NineDevice9Ex_CheckResourceResidency( struct NineDevice9Ex *This, |
IDirect3DResource9 **pResourceArray, |
UINT32 NumResources ) |
{ |
STUB(D3DERR_INVALIDCALL); |
} |
|
HRESULT WINAPI |
NineDevice9Ex_SetMaximumFrameLatency( struct NineDevice9Ex *This, |
UINT MaxLatency ) |
{ |
STUB(D3DERR_INVALIDCALL); |
} |
|
HRESULT WINAPI |
NineDevice9Ex_GetMaximumFrameLatency( struct NineDevice9Ex *This, |
UINT *pMaxLatency ) |
{ |
STUB(D3DERR_INVALIDCALL); |
} |
|
HRESULT WINAPI |
NineDevice9Ex_CheckDeviceState( struct NineDevice9Ex *This, |
HWND hDestinationWindow ) |
{ |
DBG("This=%p hDestinationWindow=%p\n", |
This, hDestinationWindow); |
|
/* TODO: handle the other return values */ |
return D3D_OK; |
} |
|
HRESULT WINAPI |
NineDevice9Ex_CreateRenderTargetEx( struct NineDevice9Ex *This, |
UINT Width, |
UINT Height, |
D3DFORMAT Format, |
D3DMULTISAMPLE_TYPE MultiSample, |
DWORD MultisampleQuality, |
BOOL Lockable, |
IDirect3DSurface9 **ppSurface, |
HANDLE *pSharedHandle, |
DWORD Usage ) |
{ |
STUB(D3DERR_INVALIDCALL); |
} |
|
HRESULT WINAPI |
NineDevice9Ex_CreateOffscreenPlainSurfaceEx( struct NineDevice9Ex *This, |
UINT Width, |
UINT Height, |
D3DFORMAT Format, |
D3DPOOL Pool, |
IDirect3DSurface9 **ppSurface, |
HANDLE *pSharedHandle, |
DWORD Usage ) |
{ |
STUB(D3DERR_INVALIDCALL); |
} |
|
HRESULT WINAPI |
NineDevice9Ex_CreateDepthStencilSurfaceEx( struct NineDevice9Ex *This, |
UINT Width, |
UINT Height, |
D3DFORMAT Format, |
D3DMULTISAMPLE_TYPE MultiSample, |
DWORD MultisampleQuality, |
BOOL Discard, |
IDirect3DSurface9 **ppSurface, |
HANDLE *pSharedHandle, |
DWORD Usage ) |
{ |
STUB(D3DERR_INVALIDCALL); |
} |
|
HRESULT WINAPI |
NineDevice9Ex_ResetEx( struct NineDevice9Ex *This, |
D3DPRESENT_PARAMETERS *pPresentationParameters, |
D3DDISPLAYMODEEX *pFullscreenDisplayMode ) |
{ |
HRESULT hr = D3D_OK; |
unsigned i; |
|
DBG("This=%p pPresentationParameters=%p pFullscreenDisplayMode=%p\n", This, pPresentationParameters, pFullscreenDisplayMode); |
|
for (i = 0; i < This->base.nswapchains; ++i) { |
D3DDISPLAYMODEEX *mode = NULL; |
D3DPRESENT_PARAMETERS *params = &pPresentationParameters[i]; |
if (pFullscreenDisplayMode) mode = &(pFullscreenDisplayMode[i]); |
hr = NineSwapChain9_Resize(This->base.swapchains[i], params, mode); |
if (FAILED(hr)) |
return (hr == D3DERR_OUTOFVIDEOMEMORY) ? hr : D3DERR_DEVICELOST; |
} |
|
NineDevice9_SetRenderTarget( |
(struct NineDevice9 *)This, 0, (IDirect3DSurface9 *)This->base.swapchains[0]->buffers[0]); |
|
|
return hr; |
} |
|
HRESULT WINAPI |
NineDevice9Ex_GetDisplayModeEx( struct NineDevice9Ex *This, |
UINT iSwapChain, |
D3DDISPLAYMODEEX *pMode, |
D3DDISPLAYROTATION *pRotation ) |
{ |
struct NineSwapChain9Ex *swapchain; |
|
DBG("This=%p iSwapChain=%u pMode=%p pRotation=%p\n", |
This, iSwapChain, pMode, pRotation); |
|
user_assert(iSwapChain < This->base.nswapchains, D3DERR_INVALIDCALL); |
|
swapchain = NineSwapChain9Ex(This->base.swapchains[iSwapChain]); |
return NineSwapChain9Ex_GetDisplayModeEx(swapchain, pMode, pRotation); |
} |
|
IDirect3DDevice9ExVtbl NineDevice9Ex_vtable = { |
(void *)NineUnknown_QueryInterface, |
(void *)NineUnknown_AddRef, |
(void *)NineUnknown_Release, |
(void *)NineDevice9_TestCooperativeLevel, |
(void *)NineDevice9_GetAvailableTextureMem, |
(void *)NineDevice9_EvictManagedResources, |
(void *)NineDevice9_GetDirect3D, |
(void *)NineDevice9_GetDeviceCaps, |
(void *)NineDevice9_GetDisplayMode, |
(void *)NineDevice9_GetCreationParameters, |
(void *)NineDevice9_SetCursorProperties, |
(void *)NineDevice9_SetCursorPosition, |
(void *)NineDevice9_ShowCursor, |
(void *)NineDevice9_CreateAdditionalSwapChain, |
(void *)NineDevice9_GetSwapChain, |
(void *)NineDevice9_GetNumberOfSwapChains, |
(void *)NineDevice9_Reset, |
(void *)NineDevice9_Present, |
(void *)NineDevice9_GetBackBuffer, |
(void *)NineDevice9_GetRasterStatus, |
(void *)NineDevice9_SetDialogBoxMode, |
(void *)NineDevice9_SetGammaRamp, |
(void *)NineDevice9_GetGammaRamp, |
(void *)NineDevice9_CreateTexture, |
(void *)NineDevice9_CreateVolumeTexture, |
(void *)NineDevice9_CreateCubeTexture, |
(void *)NineDevice9_CreateVertexBuffer, |
(void *)NineDevice9_CreateIndexBuffer, |
(void *)NineDevice9_CreateRenderTarget, |
(void *)NineDevice9_CreateDepthStencilSurface, |
(void *)NineDevice9_UpdateSurface, |
(void *)NineDevice9_UpdateTexture, |
(void *)NineDevice9_GetRenderTargetData, |
(void *)NineDevice9_GetFrontBufferData, |
(void *)NineDevice9_StretchRect, |
(void *)NineDevice9_ColorFill, |
(void *)NineDevice9_CreateOffscreenPlainSurface, |
(void *)NineDevice9_SetRenderTarget, |
(void *)NineDevice9_GetRenderTarget, |
(void *)NineDevice9_SetDepthStencilSurface, |
(void *)NineDevice9_GetDepthStencilSurface, |
(void *)NineDevice9_BeginScene, |
(void *)NineDevice9_EndScene, |
(void *)NineDevice9_Clear, |
(void *)NineDevice9_SetTransform, |
(void *)NineDevice9_GetTransform, |
(void *)NineDevice9_MultiplyTransform, |
(void *)NineDevice9_SetViewport, |
(void *)NineDevice9_GetViewport, |
(void *)NineDevice9_SetMaterial, |
(void *)NineDevice9_GetMaterial, |
(void *)NineDevice9_SetLight, |
(void *)NineDevice9_GetLight, |
(void *)NineDevice9_LightEnable, |
(void *)NineDevice9_GetLightEnable, |
(void *)NineDevice9_SetClipPlane, |
(void *)NineDevice9_GetClipPlane, |
(void *)NineDevice9_SetRenderState, |
(void *)NineDevice9_GetRenderState, |
(void *)NineDevice9_CreateStateBlock, |
(void *)NineDevice9_BeginStateBlock, |
(void *)NineDevice9_EndStateBlock, |
(void *)NineDevice9_SetClipStatus, |
(void *)NineDevice9_GetClipStatus, |
(void *)NineDevice9_GetTexture, |
(void *)NineDevice9_SetTexture, |
(void *)NineDevice9_GetTextureStageState, |
(void *)NineDevice9_SetTextureStageState, |
(void *)NineDevice9_GetSamplerState, |
(void *)NineDevice9_SetSamplerState, |
(void *)NineDevice9_ValidateDevice, |
(void *)NineDevice9_SetPaletteEntries, |
(void *)NineDevice9_GetPaletteEntries, |
(void *)NineDevice9_SetCurrentTexturePalette, |
(void *)NineDevice9_GetCurrentTexturePalette, |
(void *)NineDevice9_SetScissorRect, |
(void *)NineDevice9_GetScissorRect, |
(void *)NineDevice9_SetSoftwareVertexProcessing, |
(void *)NineDevice9_GetSoftwareVertexProcessing, |
(void *)NineDevice9_SetNPatchMode, |
(void *)NineDevice9_GetNPatchMode, |
(void *)NineDevice9_DrawPrimitive, |
(void *)NineDevice9_DrawIndexedPrimitive, |
(void *)NineDevice9_DrawPrimitiveUP, |
(void *)NineDevice9_DrawIndexedPrimitiveUP, |
(void *)NineDevice9_ProcessVertices, |
(void *)NineDevice9_CreateVertexDeclaration, |
(void *)NineDevice9_SetVertexDeclaration, |
(void *)NineDevice9_GetVertexDeclaration, |
(void *)NineDevice9_SetFVF, |
(void *)NineDevice9_GetFVF, |
(void *)NineDevice9_CreateVertexShader, |
(void *)NineDevice9_SetVertexShader, |
(void *)NineDevice9_GetVertexShader, |
(void *)NineDevice9_SetVertexShaderConstantF, |
(void *)NineDevice9_GetVertexShaderConstantF, |
(void *)NineDevice9_SetVertexShaderConstantI, |
(void *)NineDevice9_GetVertexShaderConstantI, |
(void *)NineDevice9_SetVertexShaderConstantB, |
(void *)NineDevice9_GetVertexShaderConstantB, |
(void *)NineDevice9_SetStreamSource, |
(void *)NineDevice9_GetStreamSource, |
(void *)NineDevice9_SetStreamSourceFreq, |
(void *)NineDevice9_GetStreamSourceFreq, |
(void *)NineDevice9_SetIndices, |
(void *)NineDevice9_GetIndices, |
(void *)NineDevice9_CreatePixelShader, |
(void *)NineDevice9_SetPixelShader, |
(void *)NineDevice9_GetPixelShader, |
(void *)NineDevice9_SetPixelShaderConstantF, |
(void *)NineDevice9_GetPixelShaderConstantF, |
(void *)NineDevice9_SetPixelShaderConstantI, |
(void *)NineDevice9_GetPixelShaderConstantI, |
(void *)NineDevice9_SetPixelShaderConstantB, |
(void *)NineDevice9_GetPixelShaderConstantB, |
(void *)NineDevice9_DrawRectPatch, |
(void *)NineDevice9_DrawTriPatch, |
(void *)NineDevice9_DeletePatch, |
(void *)NineDevice9_CreateQuery, |
(void *)NineDevice9Ex_SetConvolutionMonoKernel, |
(void *)NineDevice9Ex_ComposeRects, |
(void *)NineDevice9Ex_PresentEx, |
(void *)NineDevice9Ex_GetGPUThreadPriority, |
(void *)NineDevice9Ex_SetGPUThreadPriority, |
(void *)NineDevice9Ex_WaitForVBlank, |
(void *)NineDevice9Ex_CheckResourceResidency, |
(void *)NineDevice9Ex_SetMaximumFrameLatency, |
(void *)NineDevice9Ex_GetMaximumFrameLatency, |
(void *)NineDevice9Ex_CheckDeviceState, |
(void *)NineDevice9Ex_CreateRenderTargetEx, |
(void *)NineDevice9Ex_CreateOffscreenPlainSurfaceEx, |
(void *)NineDevice9Ex_CreateDepthStencilSurfaceEx, |
(void *)NineDevice9Ex_ResetEx, |
(void *)NineDevice9Ex_GetDisplayModeEx |
}; |
|
static const GUID *NineDevice9Ex_IIDs[] = { |
&IID_IDirect3DDevice9Ex, |
&IID_IDirect3DDevice9, |
&IID_IUnknown, |
NULL |
}; |
|
HRESULT |
NineDevice9Ex_new( struct pipe_screen *pScreen, |
D3DDEVICE_CREATION_PARAMETERS *pCreationParameters, |
D3DCAPS9 *pCaps, |
D3DPRESENT_PARAMETERS *pPresentationParameters, |
D3DDISPLAYMODEEX *pFullscreenDisplayMode, |
IDirect3D9Ex *pD3D9Ex, |
ID3DPresentGroup *pPresentationGroup, |
struct d3dadapter9_context *pCTX, |
struct NineDevice9Ex **ppOut ) |
{ |
BOOL lock; |
lock = !!(pCreationParameters->BehaviorFlags & D3DCREATE_MULTITHREADED); |
|
NINE_NEW(Device9Ex, ppOut, lock, |
pScreen, pCreationParameters, pCaps, pPresentationParameters, |
pFullscreenDisplayMode, pD3D9Ex, pPresentationGroup, pCTX); |
} |
|