1 /*
2 * Copyright 2011 Joakim Sindholt <[email protected]>
3 * SPDX-License-Identifier: MIT
4 */
5
6 #ifndef _NINE_SWAPCHAIN9_H_
7 #define _NINE_SWAPCHAIN9_H_
8
9 #include "iunknown.h"
10 #include "adapter9.h"
11
12 #include "d3dadapter/d3dadapter9.h"
13
14 #include "threadpool.h"
15
16 struct NineDevice9;
17 struct NineSurface9;
18 struct nine_winsys_swapchain;
19 struct blit_state;
20
21 #define DRI_SWAP_FENCES_MAX 4
22 #define DRI_SWAP_FENCES_MASK 3
23
24 struct NineSwapChain9
25 {
26 struct NineUnknown base;
27
28 /* G3D stuff */
29 struct pipe_screen *screen;
30
31 /* presentation backend */
32 ID3DPresent *present;
33 D3DPRESENT_PARAMETERS params;
34 D3DDISPLAYMODEEX *mode;
35 struct d3dadapter9_context *actx;
36 BOOL implicit;
37 unsigned num_back_buffers;
38
39 /* buffer handles */
40 struct NineSurface9 *buffers[D3DPRESENT_BACK_BUFFERS_MAX_EX + 1]; /* 0 to BackBufferCount-1 : the back buffers. BackBufferCount : additional buffer */
41 struct pipe_resource *present_buffers[D3DPRESENT_BACK_BUFFERS_MAX_EX + 1];
42 D3DWindowBuffer *present_handles[D3DPRESENT_BACK_BUFFERS_MAX_EX + 1];
43 D3DWindowBuffer *present_handles_pending_release[D3DPRESENT_BACK_BUFFERS_MAX_EX + 1];
44
45 struct pipe_fence_handle *swap_fences[DRI_SWAP_FENCES_MAX];
46 unsigned int cur_fences;
47 unsigned int head;
48 unsigned int tail;
49 unsigned int desired_fences;
50
51 BOOL rendering_done;
52
53 struct NineSurface9 *zsbuf;
54
55 D3DGAMMARAMP gamma;
56
57 struct threadpool *pool;
58 struct threadpool_task *tasks[D3DPRESENT_BACK_BUFFERS_MAX_EX + 1];
59 BOOL *pending_presentation[D3DPRESENT_BACK_BUFFERS_MAX_EX + 1];
60 BOOL enable_threadpool;
61 };
62
63 static inline struct NineSwapChain9 *
NineSwapChain9(void * data)64 NineSwapChain9( void *data )
65 {
66 return (struct NineSwapChain9 *)data;
67 }
68
69 HRESULT
70 NineSwapChain9_new( struct NineDevice9 *pDevice,
71 BOOL implicit,
72 ID3DPresent *pPresent,
73 D3DPRESENT_PARAMETERS *pPresentationParameters,
74 struct d3dadapter9_context *pCTX,
75 HWND hFocusWindow,
76 struct NineSwapChain9 **ppOut );
77
78 HRESULT
79 NineSwapChain9_ctor( struct NineSwapChain9 *This,
80 struct NineUnknownParams *pParams,
81 BOOL implicit,
82 ID3DPresent *pPresent,
83 D3DPRESENT_PARAMETERS *pPresentationParameters,
84 struct d3dadapter9_context *pCTX,
85 HWND hFocusWindow,
86 D3DDISPLAYMODEEX *mode );
87
88 void
89 NineSwapChain9_dtor( struct NineSwapChain9 *This );
90
91 HRESULT
92 NineSwapChain9_Resize( struct NineSwapChain9 *This,
93 D3DPRESENT_PARAMETERS *pParams,
94 D3DDISPLAYMODEEX *mode );
95
96 HRESULT NINE_WINAPI
97 NineSwapChain9_Present( struct NineSwapChain9 *This,
98 const RECT *pSourceRect,
99 const RECT *pDestRect,
100 HWND hDestWindowOverride,
101 const RGNDATA *pDirtyRegion,
102 DWORD dwFlags );
103
104 HRESULT NINE_WINAPI
105 NineSwapChain9_GetFrontBufferData( struct NineSwapChain9 *This,
106 IDirect3DSurface9 *pDestSurface );
107
108 HRESULT NINE_WINAPI
109 NineSwapChain9_GetBackBuffer( struct NineSwapChain9 *This,
110 UINT iBackBuffer,
111 D3DBACKBUFFER_TYPE Type,
112 IDirect3DSurface9 **ppBackBuffer );
113
114 HRESULT NINE_WINAPI
115 NineSwapChain9_GetRasterStatus( struct NineSwapChain9 *This,
116 D3DRASTER_STATUS *pRasterStatus );
117
118 HRESULT NINE_WINAPI
119 NineSwapChain9_GetDisplayMode( struct NineSwapChain9 *This,
120 D3DDISPLAYMODE *pMode );
121
122 HRESULT NINE_WINAPI
123 NineSwapChain9_GetPresentParameters( struct NineSwapChain9 *This,
124 D3DPRESENT_PARAMETERS *pPresentationParameters );
125
126 BOOL
127 NineSwapChain9_GetOccluded( struct NineSwapChain9 *This );
128
129 BOOL
130 NineSwapChain9_ResolutionMismatch( struct NineSwapChain9 *This );
131
132 HANDLE
133 NineSwapChain9_CreateThread( struct NineSwapChain9 *This,
134 void *pFuncAddress,
135 void *pParam );
136
137 void
138 NineSwapChain9_WaitForThread( struct NineSwapChain9 *This,
139 HANDLE thread );
140
141 #endif /* _NINE_SWAPCHAIN9_H_ */
142