xref: /reactos/dll/opengl/opengl32/opengl32.h (revision b5218987)
1 /*
2  * COPYRIGHT:            See COPYING in the top level directory
3  * PROJECT:              ReactOS kernel
4  * FILE:                 lib/opengl32/opengl.h
5  * PURPOSE:              OpenGL32 lib, general header
6  */
7 
8 #ifndef _OPENGL32_PCH_
9 #define _OPENGL32_PCH_
10 
11 #define WIN32_NO_STATUS
12 #include <stdarg.h>
13 #include <windef.h>
14 #include <winbase.h>
15 #include <winuser.h>
16 #include <wingdi.h>
17 #include <winddi.h>
18 #include <GL/gl.h>
19 
20 #ifndef OPENGL32_USE_TLS
21 #include <pstypes.h>
22 #endif
23 
24 #include <wine/debug.h>
25 
26 #include "icd.h"
27 
28 /* *$%$£^§! headers inclusion */
29 static __inline
30 BOOLEAN
31 RemoveEntryList(
32     _In_ PLIST_ENTRY Entry)
33 {
34     PLIST_ENTRY OldFlink;
35     PLIST_ENTRY OldBlink;
36 
37     OldFlink = Entry->Flink;
38     OldBlink = Entry->Blink;
39     OldFlink->Blink = OldBlink;
40     OldBlink->Flink = OldFlink;
41     return (OldFlink == OldBlink);
42 }
43 
44 static __inline
45 VOID
46 InsertTailList(
47     _In_ PLIST_ENTRY ListHead,
48     _In_ PLIST_ENTRY Entry
49 )
50 {
51     PLIST_ENTRY OldBlink;
52     OldBlink = ListHead->Blink;
53     Entry->Flink = ListHead;
54     Entry->Blink = OldBlink;
55     OldBlink->Flink = Entry;
56     ListHead->Blink = Entry;
57 }
58 
59 
60 static __inline
61 VOID
62 InitializeListHead(
63     _Inout_ PLIST_ENTRY ListHead
64 )
65 {
66     ListHead->Flink = ListHead->Blink = ListHead;
67 }
68 
69 extern LIST_ENTRY ContextListHead;
70 
71 struct wgl_context
72 {
73     DWORD magic;
74     volatile LONG lock;
75 
76     LIST_ENTRY ListEntry;
77 
78     DHGLRC dhglrc;
79     struct ICD_Data* icd_data;
80     INT pixelformat;
81     volatile LONG thread_id;
82 };
83 
84 #define WGL_DC_OBJ_DC 0x1
85 struct wgl_dc_data
86 {
87     /* Header */
88     union
89     {
90         HWND hwnd;
91         HDC hdc;
92         HANDLE u;
93     } owner;
94     ULONG flags;
95 
96     /* Pixel format */
97     INT pixelformat;
98 
99     /* ICD */
100     struct ICD_Data* icd_data;
101     INT nb_icd_formats;
102 
103     /* Software implementation */
104     INT nb_sw_formats;
105     void* sw_data;
106 
107     /* Linked list */
108     struct wgl_dc_data* next;
109 };
110 
111 /* Clean up functions */
112 void IntDeleteAllContexts(void);
113 void IntDeleteAllICDs(void);
114 
115 FORCEINLINE
116 const GLDISPATCHTABLE*
117 IntGetCurrentDispatchTable(void)
118 {
119     return (GLDISPATCHTABLE*)NtCurrentTeb()->glTable;
120 }
121 
122 FORCEINLINE
123 void
124 IntSetCurrentDispatchTable(const GLDISPATCHTABLE* table)
125 {
126     NtCurrentTeb()->glTable = (void*)table;
127 }
128 
129 FORCEINLINE
130 void
131 IntMakeCurrent(HGLRC hglrc, HDC hdc, struct wgl_dc_data* dc_data)
132 {
133     TEB* CurrentTeb = NtCurrentTeb();
134 
135     CurrentTeb->glCurrentRC = hglrc;
136     CurrentTeb->glReserved2 = hdc;
137     CurrentTeb->glSectionInfo = dc_data;
138 }
139 
140 FORCEINLINE
141 HGLRC
142 IntGetCurrentRC(void)
143 {
144     return NtCurrentTeb()->glCurrentRC;
145 }
146 
147 FORCEINLINE
148 HDC
149 IntGetCurrentDC(void)
150 {
151     return NtCurrentTeb()->glReserved2;
152 }
153 
154 static inline
155 struct wgl_dc_data*
156 IntGetCurrentDcData(void)
157 {
158     return NtCurrentTeb()->glSectionInfo;
159 }
160 
161 FORCEINLINE
162 void
163 IntSetCurrentICDPrivate(void* value)
164 {
165     NtCurrentTeb()->glContext = value;
166 }
167 
168 FORCEINLINE
169 void*
170 IntGetCurrentICDPrivate(void)
171 {
172     return (void*)NtCurrentTeb()->glContext;
173 }
174 
175 FORCEINLINE
176 DHGLRC
177 IntGetCurrentDHGLRC(void)
178 {
179     struct wgl_context* ctx = (struct wgl_context*)IntGetCurrentRC();
180     if(!ctx) return NULL;
181     return ctx->dhglrc;
182 }
183 
184 /* Software implementation functions */
185 INT sw_DescribePixelFormat(HDC hdc, INT format, UINT size, PIXELFORMATDESCRIPTOR* descr);
186 BOOL sw_SetPixelFormat(HDC hdc, struct wgl_dc_data*, INT format);
187 DHGLRC sw_CreateContext(struct wgl_dc_data*);
188 BOOL sw_DeleteContext(DHGLRC dhglrc);
189 BOOL sw_SetContext(struct wgl_dc_data* dc_data, DHGLRC dhglrc);
190 void sw_ReleaseContext(DHGLRC hglrc);
191 PROC sw_GetProcAddress(LPCSTR name);
192 BOOL sw_CopyContext(DHGLRC dhglrcSrc, DHGLRC dhglrcDst, UINT mask);
193 BOOL sw_ShareLists(DHGLRC dhglrcSrc, DHGLRC dhglrcDst);
194 BOOL sw_SwapBuffers(HDC hdc, struct wgl_dc_data* dc_data);
195 
196 #endif /* _OPENGL32_PCH_ */
197