Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/frontends/wgl/stw_framebuffer.h
4561 views
1
/**************************************************************************
2
*
3
* Copyright 2008 VMware, Inc.
4
* All Rights Reserved.
5
*
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the
8
* "Software"), to deal in the Software without restriction, including
9
* without limitation the rights to use, copy, modify, merge, publish,
10
* distribute, sub license, and/or sell copies of the Software, and to
11
* permit persons to whom the Software is furnished to do so, subject to
12
* the following conditions:
13
*
14
* The above copyright notice and this permission notice (including the
15
* next paragraph) shall be included in all copies or substantial portions
16
* of the Software.
17
*
18
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21
* IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
*
26
**************************************************************************/
27
28
#ifndef STW_FRAMEBUFFER_H
29
#define STW_FRAMEBUFFER_H
30
31
#include <windows.h>
32
33
#include <GL/gl.h>
34
#include <GL/wglext.h>
35
36
#include "util/u_debug.h"
37
#include "stw_st.h"
38
39
40
struct pipe_resource;
41
struct st_framebuffer_iface;
42
struct stw_pixelformat_info;
43
44
/**
45
* Windows framebuffer.
46
*/
47
struct stw_framebuffer
48
{
49
/**
50
* This mutex has two purposes:
51
* - protect the access to the mutable data members below
52
* - prevent the framebuffer from being deleted while being accessed.
53
*
54
* Note: if both this mutex and the stw_device::fb_mutex need to be locked,
55
* the stw_device::fb_mutex needs to be locked first.
56
*/
57
CRITICAL_SECTION mutex;
58
59
/*
60
* Immutable members.
61
*
62
* Note that even access to immutable members implies acquiring the mutex
63
* above, to prevent the framebuffer from being destroyed.
64
*/
65
66
HWND hWnd;
67
68
int iPixelFormat;
69
const struct stw_pixelformat_info *pfi;
70
71
/* A pixel format that can be used by GDI */
72
int iDisplayablePixelFormat;
73
boolean bPbuffer;
74
75
struct st_framebuffer_iface *stfb;
76
77
/*
78
* Mutable members.
79
*/
80
81
unsigned refcnt;
82
83
84
/* FIXME: Make this work for multiple contexts bound to the same framebuffer */
85
boolean must_resize;
86
87
boolean minimized; /**< Is the window currently minimized? */
88
89
unsigned width;
90
unsigned height;
91
92
/** WGL_ARB_render_texture - set at Pbuffer creation time */
93
unsigned textureFormat; /**< WGL_NO_TEXTURE or WGL_TEXTURE_RGB[A]_ARB */
94
unsigned textureTarget; /**< WGL_NO_TEXTURE or WGL_TEXTURE_1D/2D/
95
CUBE_MAP_ARB */
96
boolean textureMipmap; /**< TRUE/FALSE */
97
/** WGL_ARB_render_texture - set with wglSetPbufferAttribARB() */
98
unsigned textureLevel;
99
unsigned textureFace; /**< [0..6] */
100
101
/**
102
* Client area rectangle, relative to the window upper-left corner.
103
*
104
* @sa GLCBPRESENTBUFFERSDATA::rect.
105
*/
106
RECT client_rect;
107
108
HANDLE hSharedSurface;
109
struct stw_shared_surface *shared_surface;
110
111
struct stw_winsys_framebuffer *winsys_framebuffer;
112
113
/* For WGL_EXT_swap_control */
114
int64_t prev_swap_time;
115
116
/**
117
* This is protected by stw_device::fb_mutex, not the mutex above.
118
*
119
* Deletions must be done by first acquiring stw_device::fb_mutex, and then
120
* acquiring the stw_framebuffer::mutex of the framebuffer to be deleted.
121
* This ensures that nobody else is reading/writing to the.
122
*
123
* It is not necessary to acquire the mutex above to navigate the linked list
124
* given that deletions are done with stw_device::fb_mutex held, so no other
125
* thread can delete.
126
*/
127
struct stw_framebuffer *next;
128
};
129
130
131
/**
132
* Create a new framebuffer object which will correspond to the given HDC.
133
*
134
* This function will acquire stw_framebuffer::mutex. stw_framebuffer_unlock
135
* must be called when done
136
*/
137
struct stw_framebuffer *
138
stw_framebuffer_create(HDC hdc, int iPixelFormat);
139
140
141
/**
142
* Increase fb reference count. The referenced framebuffer should be locked.
143
*
144
* It's not necessary to hold stw_dev::fb_mutex global lock.
145
*/
146
static inline void
147
stw_framebuffer_reference_locked(struct stw_framebuffer *fb)
148
{
149
if (fb) {
150
assert(stw_own_mutex(&fb->mutex));
151
fb->refcnt++;
152
}
153
}
154
155
156
void
157
stw_framebuffer_release_locked(struct stw_framebuffer *fb,
158
struct st_context_iface *stctx);
159
160
/**
161
* Search a framebuffer with a matching HWND.
162
*
163
* This function will acquire stw_framebuffer::mutex. stw_framebuffer_unlock
164
* must be called when done
165
*/
166
struct stw_framebuffer *
167
stw_framebuffer_from_hwnd(HWND hwnd);
168
169
/**
170
* Search a framebuffer with a matching HDC.
171
*
172
* This function will acquire stw_framebuffer::mutex. stw_framebuffer_unlock
173
* must be called when done
174
*/
175
struct stw_framebuffer *
176
stw_framebuffer_from_hdc(HDC hdc);
177
178
BOOL
179
stw_framebuffer_present_locked(HDC hdc,
180
struct stw_framebuffer *fb,
181
struct pipe_resource *res);
182
183
void
184
stw_framebuffer_update(struct stw_framebuffer *fb);
185
186
187
static inline void
188
stw_framebuffer_lock(struct stw_framebuffer *fb)
189
{
190
assert(fb);
191
EnterCriticalSection(&fb->mutex);
192
}
193
194
195
/**
196
* Release stw_framebuffer::mutex lock. This framebuffer must not be accessed
197
* after calling this function, as it may have been deleted by another thread
198
* in the meanwhile.
199
*/
200
static inline void
201
stw_framebuffer_unlock(struct stw_framebuffer *fb)
202
{
203
assert(fb);
204
assert(stw_own_mutex(&fb->mutex));
205
LeaveCriticalSection(&fb->mutex);
206
}
207
208
209
/**
210
* Cleanup any existing framebuffers when exiting application.
211
*/
212
void
213
stw_framebuffer_cleanup(void);
214
215
216
static inline struct stw_st_framebuffer *
217
stw_st_framebuffer(struct st_framebuffer_iface *stfb)
218
{
219
return (struct stw_st_framebuffer *) stfb;
220
}
221
222
223
static inline struct stw_framebuffer *
224
stw_framebuffer_from_HPBUFFERARB(HPBUFFERARB hPbuffer)
225
{
226
return (struct stw_framebuffer *) hPbuffer;
227
}
228
229
230
#endif /* STW_FRAMEBUFFER_H */
231
232