2 * Copyright 2011 Joakim Sindholt <opensource@zhasha.com>
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:
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
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. */
23 #ifndef _NINE_DEVICE9_H_
24 #define _NINE_DEVICE9_H_
26 #include "d3dadapter/d3dadapter9.h"
31 #include "nine_helpers.h"
32 #include "nine_state.h"
34 struct gen_mipmap_state
;
35 struct util_hash_table
;
43 struct NineSwapChain9
;
44 struct NineStateBlock9
;
46 #include "util/list.h"
50 struct NineUnknown base
;
55 struct pipe_screen
*screen
;
56 /* For first time upload. No Sync with rendering thread */
57 struct pipe_context
*pipe_secondary
;
58 struct pipe_screen
*screen_sw
;
59 struct pipe_context
*pipe_sw
;
60 struct cso_context
*cso_sw
;
63 struct csmt_context
*csmt_ctx
;
66 /* For DISCARD/NOOVERWRITE */
67 struct nine_buffer_upload
*buffer_upload
;
69 /* creation parameters */
71 D3DDEVICE_CREATION_PARAMETERS params
;
75 ID3DPresentGroup
*present
;
76 struct NineSwapChain9
**swapchains
;
79 struct NineStateBlock9
*record
;
80 struct nine_state
*update
; /* state to update (&state / &record->state) */
81 struct nine_state state
; /* device state */
82 struct nine_context context
;
83 struct nine_state_sw_internal state_sw_internal
;
85 struct list_head update_buffers
;
86 struct list_head update_textures
;
87 struct list_head managed_buffers
;
88 struct list_head managed_textures
;
93 uint16_t vs_const_size
;
94 uint16_t ps_const_size
;
95 uint16_t max_vs_const_f
;
96 uint16_t max_ps_const_f
;
98 struct pipe_resource
*dummy_texture
;
99 struct pipe_sampler_view
*dummy_sampler_view
;
100 struct pipe_sampler_state dummy_sampler_state
;
102 struct gen_mipmap_state
*gen_mipmap
;
105 struct util_hash_table
*ht_vs
;
106 struct util_hash_table
*ht_ps
;
107 struct NineVertexShader9
*vs
;
108 struct NinePixelShader9
*ps
;
114 struct util_hash_table
*ht_fvf
;
118 struct pipe_resource
*image
;
121 POINT hotspot
; /* -1, -1 if no cursor image set */
125 void *hw_upload_temp
;
132 boolean user_sw_vbufs
;
133 boolean user_sw_cbufs
;
134 boolean window_space_position_support
;
137 boolean offset_units_unscaled
;
141 boolean buggy_barycentrics
;
144 unsigned constbuf_alignment
;
146 struct nine_range_pool range_pool
;
148 struct hud_context
*hud
; /* NULL if hud is disabled */
150 /* dummy vbo (containing 0 0 0 0) to bind if vertex shader input
151 * is not bound to anything by the vertex declaration */
152 struct pipe_resource
*dummy_vbo
;
153 BOOL device_needs_reset
;
154 int minor_version_num
;
155 long long available_texture_mem
;
156 long long available_texture_limit
;
158 /* software vertex processing */
161 static inline struct NineDevice9
*
162 NineDevice9( void *data
)
164 return (struct NineDevice9
*)data
;
168 NineDevice9_new( struct pipe_screen
*pScreen
,
169 D3DDEVICE_CREATION_PARAMETERS
*pCreationParameters
,
171 D3DPRESENT_PARAMETERS
*pPresentationParameters
,
173 ID3DPresentGroup
*pPresentationGroup
,
174 struct d3dadapter9_context
*pCTX
,
176 D3DDISPLAYMODEEX
*pFullscreenDisplayMode
,
177 struct NineDevice9
**ppOut
,
178 int minorVersionNum
);
181 NineDevice9_ctor( struct NineDevice9
*This
,
182 struct NineUnknownParams
*pParams
,
183 struct pipe_screen
*pScreen
,
184 D3DDEVICE_CREATION_PARAMETERS
*pCreationParameters
,
186 D3DPRESENT_PARAMETERS
*pPresentationParameters
,
188 ID3DPresentGroup
*pPresentationGroup
,
189 struct d3dadapter9_context
*pCTX
,
191 D3DDISPLAYMODEEX
*pFullscreenDisplayMode
,
192 int minorVersionNum
);
195 NineDevice9_dtor( struct NineDevice9
*This
);
197 /*** Nine private ***/
199 NineDevice9_SetDefaultState( struct NineDevice9
*This
, boolean is_reset
);
202 NineDevice9_GetScreen( struct NineDevice9
*This
);
204 struct pipe_context
*
205 NineDevice9_GetPipe( struct NineDevice9
*This
);
208 NineDevice9_GetCaps( struct NineDevice9
*This
);
210 /*** Direct3D public ***/
213 NineDevice9_TestCooperativeLevel( struct NineDevice9
*This
);
216 NineDevice9_GetAvailableTextureMem( struct NineDevice9
*This
);
219 NineDevice9_EvictManagedResources( struct NineDevice9
*This
);
222 NineDevice9_GetDirect3D( struct NineDevice9
*This
,
223 IDirect3D9
**ppD3D9
);
226 NineDevice9_GetDeviceCaps( struct NineDevice9
*This
,
230 NineDevice9_GetDisplayMode( struct NineDevice9
*This
,
232 D3DDISPLAYMODE
*pMode
);
235 NineDevice9_GetCreationParameters( struct NineDevice9
*This
,
236 D3DDEVICE_CREATION_PARAMETERS
*pParameters
);
239 NineDevice9_SetCursorProperties( struct NineDevice9
*This
,
242 IDirect3DSurface9
*pCursorBitmap
);
245 NineDevice9_SetCursorPosition( struct NineDevice9
*This
,
251 NineDevice9_ShowCursor( struct NineDevice9
*This
,
255 NineDevice9_CreateAdditionalSwapChain( struct NineDevice9
*This
,
256 D3DPRESENT_PARAMETERS
*pPresentationParameters
,
257 IDirect3DSwapChain9
**pSwapChain
);
260 NineDevice9_GetSwapChain( struct NineDevice9
*This
,
262 IDirect3DSwapChain9
**pSwapChain
);
265 NineDevice9_GetNumberOfSwapChains( struct NineDevice9
*This
);
268 NineDevice9_Reset( struct NineDevice9
*This
,
269 D3DPRESENT_PARAMETERS
*pPresentationParameters
);
272 NineDevice9_Present( struct NineDevice9
*This
,
273 const RECT
*pSourceRect
,
274 const RECT
*pDestRect
,
275 HWND hDestWindowOverride
,
276 const RGNDATA
*pDirtyRegion
);
279 NineDevice9_GetBackBuffer( struct NineDevice9
*This
,
282 D3DBACKBUFFER_TYPE Type
,
283 IDirect3DSurface9
**ppBackBuffer
);
286 NineDevice9_GetRasterStatus( struct NineDevice9
*This
,
288 D3DRASTER_STATUS
*pRasterStatus
);
291 NineDevice9_SetDialogBoxMode( struct NineDevice9
*This
,
292 BOOL bEnableDialogs
);
295 NineDevice9_SetGammaRamp( struct NineDevice9
*This
,
298 const D3DGAMMARAMP
*pRamp
);
301 NineDevice9_GetGammaRamp( struct NineDevice9
*This
,
303 D3DGAMMARAMP
*pRamp
);
306 NineDevice9_CreateTexture( struct NineDevice9
*This
,
313 IDirect3DTexture9
**ppTexture
,
314 HANDLE
*pSharedHandle
);
317 NineDevice9_CreateVolumeTexture( struct NineDevice9
*This
,
325 IDirect3DVolumeTexture9
**ppVolumeTexture
,
326 HANDLE
*pSharedHandle
);
329 NineDevice9_CreateCubeTexture( struct NineDevice9
*This
,
335 IDirect3DCubeTexture9
**ppCubeTexture
,
336 HANDLE
*pSharedHandle
);
339 NineDevice9_CreateVertexBuffer( struct NineDevice9
*This
,
344 IDirect3DVertexBuffer9
**ppVertexBuffer
,
345 HANDLE
*pSharedHandle
);
348 NineDevice9_CreateIndexBuffer( struct NineDevice9
*This
,
353 IDirect3DIndexBuffer9
**ppIndexBuffer
,
354 HANDLE
*pSharedHandle
);
357 NineDevice9_CreateRenderTarget( struct NineDevice9
*This
,
361 D3DMULTISAMPLE_TYPE MultiSample
,
362 DWORD MultisampleQuality
,
364 IDirect3DSurface9
**ppSurface
,
365 HANDLE
*pSharedHandle
);
368 NineDevice9_CreateDepthStencilSurface( struct NineDevice9
*This
,
372 D3DMULTISAMPLE_TYPE MultiSample
,
373 DWORD MultisampleQuality
,
375 IDirect3DSurface9
**ppSurface
,
376 HANDLE
*pSharedHandle
);
379 NineDevice9_UpdateSurface( struct NineDevice9
*This
,
380 IDirect3DSurface9
*pSourceSurface
,
381 const RECT
*pSourceRect
,
382 IDirect3DSurface9
*pDestinationSurface
,
383 const POINT
*pDestPoint
);
386 NineDevice9_UpdateTexture( struct NineDevice9
*This
,
387 IDirect3DBaseTexture9
*pSourceTexture
,
388 IDirect3DBaseTexture9
*pDestinationTexture
);
391 NineDevice9_GetRenderTargetData( struct NineDevice9
*This
,
392 IDirect3DSurface9
*pRenderTarget
,
393 IDirect3DSurface9
*pDestSurface
);
396 NineDevice9_GetFrontBufferData( struct NineDevice9
*This
,
398 IDirect3DSurface9
*pDestSurface
);
401 NineDevice9_StretchRect( struct NineDevice9
*This
,
402 IDirect3DSurface9
*pSourceSurface
,
403 const RECT
*pSourceRect
,
404 IDirect3DSurface9
*pDestSurface
,
405 const RECT
*pDestRect
,
406 D3DTEXTUREFILTERTYPE Filter
);
409 NineDevice9_ColorFill( struct NineDevice9
*This
,
410 IDirect3DSurface9
*pSurface
,
415 NineDevice9_CreateOffscreenPlainSurface( struct NineDevice9
*This
,
420 IDirect3DSurface9
**ppSurface
,
421 HANDLE
*pSharedHandle
);
424 NineDevice9_SetRenderTarget( struct NineDevice9
*This
,
425 DWORD RenderTargetIndex
,
426 IDirect3DSurface9
*pRenderTarget
);
429 NineDevice9_GetRenderTarget( struct NineDevice9
*This
,
430 DWORD RenderTargetIndex
,
431 IDirect3DSurface9
**ppRenderTarget
);
434 NineDevice9_SetDepthStencilSurface( struct NineDevice9
*This
,
435 IDirect3DSurface9
*pNewZStencil
);
438 NineDevice9_GetDepthStencilSurface( struct NineDevice9
*This
,
439 IDirect3DSurface9
**ppZStencilSurface
);
442 NineDevice9_BeginScene( struct NineDevice9
*This
);
445 NineDevice9_EndScene( struct NineDevice9
*This
);
448 NineDevice9_Clear( struct NineDevice9
*This
,
450 const D3DRECT
*pRects
,
457 NineDevice9_SetTransform( struct NineDevice9
*This
,
458 D3DTRANSFORMSTATETYPE State
,
459 const D3DMATRIX
*pMatrix
);
462 NineDevice9_GetTransform( struct NineDevice9
*This
,
463 D3DTRANSFORMSTATETYPE State
,
464 D3DMATRIX
*pMatrix
);
467 NineDevice9_MultiplyTransform( struct NineDevice9
*This
,
468 D3DTRANSFORMSTATETYPE State
,
469 const D3DMATRIX
*pMatrix
);
472 NineDevice9_SetViewport( struct NineDevice9
*This
,
473 const D3DVIEWPORT9
*pViewport
);
476 NineDevice9_GetViewport( struct NineDevice9
*This
,
477 D3DVIEWPORT9
*pViewport
);
480 NineDevice9_SetMaterial( struct NineDevice9
*This
,
481 const D3DMATERIAL9
*pMaterial
);
484 NineDevice9_GetMaterial( struct NineDevice9
*This
,
485 D3DMATERIAL9
*pMaterial
);
488 NineDevice9_SetLight( struct NineDevice9
*This
,
490 const D3DLIGHT9
*pLight
);
493 NineDevice9_GetLight( struct NineDevice9
*This
,
498 NineDevice9_LightEnable( struct NineDevice9
*This
,
503 NineDevice9_GetLightEnable( struct NineDevice9
*This
,
508 NineDevice9_SetClipPlane( struct NineDevice9
*This
,
510 const float *pPlane
);
513 NineDevice9_GetClipPlane( struct NineDevice9
*This
,
518 NineDevice9_SetRenderState( struct NineDevice9
*This
,
519 D3DRENDERSTATETYPE State
,
523 NineDevice9_GetRenderState( struct NineDevice9
*This
,
524 D3DRENDERSTATETYPE State
,
528 NineDevice9_CreateStateBlock( struct NineDevice9
*This
,
529 D3DSTATEBLOCKTYPE Type
,
530 IDirect3DStateBlock9
**ppSB
);
533 NineDevice9_BeginStateBlock( struct NineDevice9
*This
);
536 NineDevice9_EndStateBlock( struct NineDevice9
*This
,
537 IDirect3DStateBlock9
**ppSB
);
540 NineDevice9_SetClipStatus( struct NineDevice9
*This
,
541 const D3DCLIPSTATUS9
*pClipStatus
);
544 NineDevice9_GetClipStatus( struct NineDevice9
*This
,
545 D3DCLIPSTATUS9
*pClipStatus
);
548 NineDevice9_GetTexture( struct NineDevice9
*This
,
550 IDirect3DBaseTexture9
**ppTexture
);
553 NineDevice9_SetTexture( struct NineDevice9
*This
,
555 IDirect3DBaseTexture9
*pTexture
);
558 NineDevice9_GetTextureStageState( struct NineDevice9
*This
,
560 D3DTEXTURESTAGESTATETYPE Type
,
564 NineDevice9_SetTextureStageState( struct NineDevice9
*This
,
566 D3DTEXTURESTAGESTATETYPE Type
,
570 NineDevice9_GetSamplerState( struct NineDevice9
*This
,
572 D3DSAMPLERSTATETYPE Type
,
576 NineDevice9_SetSamplerState( struct NineDevice9
*This
,
578 D3DSAMPLERSTATETYPE Type
,
582 NineDevice9_ValidateDevice( struct NineDevice9
*This
,
586 NineDevice9_SetPaletteEntries( struct NineDevice9
*This
,
588 const PALETTEENTRY
*pEntries
);
591 NineDevice9_GetPaletteEntries( struct NineDevice9
*This
,
593 PALETTEENTRY
*pEntries
);
596 NineDevice9_SetCurrentTexturePalette( struct NineDevice9
*This
,
597 UINT PaletteNumber
);
600 NineDevice9_GetCurrentTexturePalette( struct NineDevice9
*This
,
601 UINT
*PaletteNumber
);
604 NineDevice9_SetScissorRect( struct NineDevice9
*This
,
608 NineDevice9_GetScissorRect( struct NineDevice9
*This
,
612 NineDevice9_SetSoftwareVertexProcessing( struct NineDevice9
*This
,
616 NineDevice9_GetSoftwareVertexProcessing( struct NineDevice9
*This
);
619 NineDevice9_SetNPatchMode( struct NineDevice9
*This
,
623 NineDevice9_GetNPatchMode( struct NineDevice9
*This
);
626 NineDevice9_DrawPrimitive( struct NineDevice9
*This
,
627 D3DPRIMITIVETYPE PrimitiveType
,
629 UINT PrimitiveCount
);
632 NineDevice9_DrawIndexedPrimitive( struct NineDevice9
*This
,
633 D3DPRIMITIVETYPE PrimitiveType
,
641 NineDevice9_DrawPrimitiveUP( struct NineDevice9
*This
,
642 D3DPRIMITIVETYPE PrimitiveType
,
644 const void *pVertexStreamZeroData
,
645 UINT VertexStreamZeroStride
);
648 NineDevice9_DrawIndexedPrimitiveUP( struct NineDevice9
*This
,
649 D3DPRIMITIVETYPE PrimitiveType
,
653 const void *pIndexData
,
654 D3DFORMAT IndexDataFormat
,
655 const void *pVertexStreamZeroData
,
656 UINT VertexStreamZeroStride
);
659 NineDevice9_ProcessVertices( struct NineDevice9
*This
,
663 IDirect3DVertexBuffer9
*pDestBuffer
,
664 IDirect3DVertexDeclaration9
*pVertexDecl
,
668 NineDevice9_CreateVertexDeclaration( struct NineDevice9
*This
,
669 const D3DVERTEXELEMENT9
*pVertexElements
,
670 IDirect3DVertexDeclaration9
**ppDecl
);
673 NineDevice9_SetVertexDeclaration( struct NineDevice9
*This
,
674 IDirect3DVertexDeclaration9
*pDecl
);
677 NineDevice9_GetVertexDeclaration( struct NineDevice9
*This
,
678 IDirect3DVertexDeclaration9
**ppDecl
);
681 NineDevice9_SetFVF( struct NineDevice9
*This
,
685 NineDevice9_GetFVF( struct NineDevice9
*This
,
689 NineDevice9_CreateVertexShader( struct NineDevice9
*This
,
690 const DWORD
*pFunction
,
691 IDirect3DVertexShader9
**ppShader
);
694 NineDevice9_SetVertexShader( struct NineDevice9
*This
,
695 IDirect3DVertexShader9
*pShader
);
698 NineDevice9_GetVertexShader( struct NineDevice9
*This
,
699 IDirect3DVertexShader9
**ppShader
);
702 NineDevice9_SetVertexShaderConstantF( struct NineDevice9
*This
,
704 const float *pConstantData
,
705 UINT Vector4fCount
);
708 NineDevice9_GetVertexShaderConstantF( struct NineDevice9
*This
,
710 float *pConstantData
,
711 UINT Vector4fCount
);
714 NineDevice9_SetVertexShaderConstantI( struct NineDevice9
*This
,
716 const int *pConstantData
,
717 UINT Vector4iCount
);
720 NineDevice9_GetVertexShaderConstantI( struct NineDevice9
*This
,
723 UINT Vector4iCount
);
726 NineDevice9_SetVertexShaderConstantB( struct NineDevice9
*This
,
728 const BOOL
*pConstantData
,
732 NineDevice9_GetVertexShaderConstantB( struct NineDevice9
*This
,
738 NineDevice9_SetStreamSource( struct NineDevice9
*This
,
740 IDirect3DVertexBuffer9
*pStreamData
,
745 NineDevice9_GetStreamSource( struct NineDevice9
*This
,
747 IDirect3DVertexBuffer9
**ppStreamData
,
748 UINT
*pOffsetInBytes
,
752 NineDevice9_SetStreamSourceFreq( struct NineDevice9
*This
,
757 NineDevice9_GetStreamSourceFreq( struct NineDevice9
*This
,
762 NineDevice9_SetIndices( struct NineDevice9
*This
,
763 IDirect3DIndexBuffer9
*pIndexData
);
766 NineDevice9_GetIndices( struct NineDevice9
*This
,
767 IDirect3DIndexBuffer9
**ppIndexData
/*,
768 UINT *pBaseVertexIndex */ );
771 NineDevice9_CreatePixelShader( struct NineDevice9
*This
,
772 const DWORD
*pFunction
,
773 IDirect3DPixelShader9
**ppShader
);
776 NineDevice9_SetPixelShader( struct NineDevice9
*This
,
777 IDirect3DPixelShader9
*pShader
);
780 NineDevice9_GetPixelShader( struct NineDevice9
*This
,
781 IDirect3DPixelShader9
**ppShader
);
784 NineDevice9_SetPixelShaderConstantF( struct NineDevice9
*This
,
786 const float *pConstantData
,
787 UINT Vector4fCount
);
790 NineDevice9_GetPixelShaderConstantF( struct NineDevice9
*This
,
792 float *pConstantData
,
793 UINT Vector4fCount
);
796 NineDevice9_SetPixelShaderConstantI( struct NineDevice9
*This
,
798 const int *pConstantData
,
799 UINT Vector4iCount
);
802 NineDevice9_GetPixelShaderConstantI( struct NineDevice9
*This
,
805 UINT Vector4iCount
);
808 NineDevice9_SetPixelShaderConstantB( struct NineDevice9
*This
,
810 const BOOL
*pConstantData
,
814 NineDevice9_GetPixelShaderConstantB( struct NineDevice9
*This
,
820 NineDevice9_DrawRectPatch( struct NineDevice9
*This
,
822 const float *pNumSegs
,
823 const D3DRECTPATCH_INFO
*pRectPatchInfo
);
826 NineDevice9_DrawTriPatch( struct NineDevice9
*This
,
828 const float *pNumSegs
,
829 const D3DTRIPATCH_INFO
*pTriPatchInfo
);
832 NineDevice9_DeletePatch( struct NineDevice9
*This
,
836 NineDevice9_CreateQuery( struct NineDevice9
*This
,
838 IDirect3DQuery9
**ppQuery
);
840 #endif /* _NINE_DEVICE9_H_ */