xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/nine/swapchain9.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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