xref: /aosp_15_r20/external/mesa3d/src/glx/windows/windows_drawable.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2014 Jon Turney
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include "windowsgl.h"
25*61046927SAndroid Build Coastguard Worker #include "windowsgl_internal.h"
26*61046927SAndroid Build Coastguard Worker #include "windowsdriconst.h"
27*61046927SAndroid Build Coastguard Worker #include "wgl.h"
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker #include <stdio.h>
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker /*
32*61046927SAndroid Build Coastguard Worker  * Window drawable
33*61046927SAndroid Build Coastguard Worker  */
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker static
window_getdc(windowsDrawable * d)36*61046927SAndroid Build Coastguard Worker HDC window_getdc(windowsDrawable *d)
37*61046927SAndroid Build Coastguard Worker {
38*61046927SAndroid Build Coastguard Worker    return GetDC(d->hWnd);
39*61046927SAndroid Build Coastguard Worker }
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker static
window_releasedc(windowsDrawable * d,HDC dc)42*61046927SAndroid Build Coastguard Worker void window_releasedc(windowsDrawable *d, HDC dc)
43*61046927SAndroid Build Coastguard Worker {
44*61046927SAndroid Build Coastguard Worker    ReleaseDC(d->hWnd, dc);
45*61046927SAndroid Build Coastguard Worker }
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker static struct windowsdrawable_callbacks window_callbacks = {
48*61046927SAndroid Build Coastguard Worker    .type = WindowsDRIDrawableWindow,
49*61046927SAndroid Build Coastguard Worker    .getdc = window_getdc,
50*61046927SAndroid Build Coastguard Worker    .releasedc = window_releasedc
51*61046927SAndroid Build Coastguard Worker };
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker /*
54*61046927SAndroid Build Coastguard Worker  * Pixmap drawable
55*61046927SAndroid Build Coastguard Worker  */
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker static
pixmap_getdc(windowsDrawable * d)58*61046927SAndroid Build Coastguard Worker HDC pixmap_getdc(windowsDrawable *d)
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker    return d->dibDC;
61*61046927SAndroid Build Coastguard Worker }
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker static
pixmap_releasedc(windowsDrawable * d,HDC dc)64*61046927SAndroid Build Coastguard Worker void pixmap_releasedc(windowsDrawable *d, HDC dc)
65*61046927SAndroid Build Coastguard Worker {
66*61046927SAndroid Build Coastguard Worker    GdiFlush();
67*61046927SAndroid Build Coastguard Worker }
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker static struct windowsdrawable_callbacks pixmap_callbacks = {
70*61046927SAndroid Build Coastguard Worker    .type = WindowsDRIDrawablePixmap,
71*61046927SAndroid Build Coastguard Worker    .getdc = pixmap_getdc,
72*61046927SAndroid Build Coastguard Worker    .releasedc = pixmap_releasedc
73*61046927SAndroid Build Coastguard Worker };
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker /*
76*61046927SAndroid Build Coastguard Worker  * Pbuffer drawable
77*61046927SAndroid Build Coastguard Worker  */
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker static
pbuffer_getdc(windowsDrawable * d)80*61046927SAndroid Build Coastguard Worker HDC pbuffer_getdc(windowsDrawable *d)
81*61046927SAndroid Build Coastguard Worker {
82*61046927SAndroid Build Coastguard Worker    return wglGetPbufferDCARB(d->hPbuffer);
83*61046927SAndroid Build Coastguard Worker }
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker static
pbuffer_releasedc(windowsDrawable * d,HDC dc)86*61046927SAndroid Build Coastguard Worker void pbuffer_releasedc(windowsDrawable *d, HDC dc)
87*61046927SAndroid Build Coastguard Worker {
88*61046927SAndroid Build Coastguard Worker    wglReleasePbufferDCARB(d->hPbuffer, dc);
89*61046927SAndroid Build Coastguard Worker }
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker static struct windowsdrawable_callbacks pbuffer_callbacks = {
92*61046927SAndroid Build Coastguard Worker    .type = WindowsDRIDrawablePbuffer,
93*61046927SAndroid Build Coastguard Worker    .getdc = pbuffer_getdc,
94*61046927SAndroid Build Coastguard Worker    .releasedc = pbuffer_releasedc
95*61046927SAndroid Build Coastguard Worker };
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker /*
98*61046927SAndroid Build Coastguard Worker  *
99*61046927SAndroid Build Coastguard Worker  */
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker windowsDrawable *
windows_create_drawable(int type,void * handle)102*61046927SAndroid Build Coastguard Worker windows_create_drawable(int type, void *handle)
103*61046927SAndroid Build Coastguard Worker {
104*61046927SAndroid Build Coastguard Worker    windowsDrawable *d;
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker    d = calloc(1, sizeof *d);
107*61046927SAndroid Build Coastguard Worker    if (d == NULL)
108*61046927SAndroid Build Coastguard Worker       return NULL;
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker    switch (type)
111*61046927SAndroid Build Coastguard Worker    {
112*61046927SAndroid Build Coastguard Worker    case WindowsDRIDrawableWindow:
113*61046927SAndroid Build Coastguard Worker       d->hWnd = handle;
114*61046927SAndroid Build Coastguard Worker       d->callbacks = &window_callbacks;
115*61046927SAndroid Build Coastguard Worker       break;
116*61046927SAndroid Build Coastguard Worker 
117*61046927SAndroid Build Coastguard Worker    case WindowsDRIDrawablePixmap:
118*61046927SAndroid Build Coastguard Worker    {
119*61046927SAndroid Build Coastguard Worker       BITMAPINFOHEADER *pBmpHeader;
120*61046927SAndroid Build Coastguard Worker       void *pBits;
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker       char name[MAX_PATH];
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker       d->callbacks = &pixmap_callbacks;
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker       // Access file mapping object by a name
127*61046927SAndroid Build Coastguard Worker       snprintf(name, sizeof(name), "Local\\CYGWINX_WINDOWSDRI_%08x", (unsigned int)(uintptr_t)handle);
128*61046927SAndroid Build Coastguard Worker       d->hSection = OpenFileMapping(FILE_MAP_ALL_ACCESS, false, name);
129*61046927SAndroid Build Coastguard Worker       if (!d->hSection)
130*61046927SAndroid Build Coastguard Worker          printf("OpenFileMapping failed %x\n", (int)GetLastError());
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker       // Create a screen-compatible DC
133*61046927SAndroid Build Coastguard Worker       d->dibDC = CreateCompatibleDC(NULL);
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker       // Map the shared memory section to access the BITMAPINFOHEADER
136*61046927SAndroid Build Coastguard Worker       pBmpHeader = (BITMAPINFOHEADER *)MapViewOfFile(d->hSection, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(BITMAPINFOHEADER));
137*61046927SAndroid Build Coastguard Worker       if (!pBmpHeader)
138*61046927SAndroid Build Coastguard Worker          printf("MapViewOfFile failed %x\n", (int)GetLastError());
139*61046927SAndroid Build Coastguard Worker 
140*61046927SAndroid Build Coastguard Worker       // Create a DIB using the file mapping
141*61046927SAndroid Build Coastguard Worker       d->hDIB = CreateDIBSection(d->dibDC, (BITMAPINFO *) pBmpHeader,
142*61046927SAndroid Build Coastguard Worker                                  DIB_RGB_COLORS, &pBits, d->hSection,
143*61046927SAndroid Build Coastguard Worker                                  sizeof(BITMAPINFOHEADER));
144*61046927SAndroid Build Coastguard Worker 
145*61046927SAndroid Build Coastguard Worker       // Done with the BITMAPINFOHEADER
146*61046927SAndroid Build Coastguard Worker       UnmapViewOfFile(pBmpHeader);
147*61046927SAndroid Build Coastguard Worker 
148*61046927SAndroid Build Coastguard Worker       // Select the DIB into the DC
149*61046927SAndroid Build Coastguard Worker       d->hOldDIB = SelectObject(d->dibDC, d->hDIB);
150*61046927SAndroid Build Coastguard Worker    }
151*61046927SAndroid Build Coastguard Worker    break;
152*61046927SAndroid Build Coastguard Worker 
153*61046927SAndroid Build Coastguard Worker    case WindowsDRIDrawablePbuffer:
154*61046927SAndroid Build Coastguard Worker       d->hPbuffer = handle;
155*61046927SAndroid Build Coastguard Worker       d->callbacks = &pbuffer_callbacks;
156*61046927SAndroid Build Coastguard Worker       break;
157*61046927SAndroid Build Coastguard Worker    }
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker    return d;
160*61046927SAndroid Build Coastguard Worker }
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker void
windows_destroy_drawable(windowsDrawable * drawable)163*61046927SAndroid Build Coastguard Worker windows_destroy_drawable(windowsDrawable *drawable)
164*61046927SAndroid Build Coastguard Worker {
165*61046927SAndroid Build Coastguard Worker    switch (drawable->callbacks->type)
166*61046927SAndroid Build Coastguard Worker    {
167*61046927SAndroid Build Coastguard Worker    case WindowsDRIDrawableWindow:
168*61046927SAndroid Build Coastguard Worker       break;
169*61046927SAndroid Build Coastguard Worker 
170*61046927SAndroid Build Coastguard Worker    case WindowsDRIDrawablePixmap:
171*61046927SAndroid Build Coastguard Worker    {
172*61046927SAndroid Build Coastguard Worker       // Select the default DIB into the DC
173*61046927SAndroid Build Coastguard Worker       SelectObject(drawable->dibDC, drawable->hOldDIB);
174*61046927SAndroid Build Coastguard Worker 
175*61046927SAndroid Build Coastguard Worker       // delete the screen-compatible DC
176*61046927SAndroid Build Coastguard Worker       DeleteDC(drawable->dibDC);
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker       // Delete the DIB
179*61046927SAndroid Build Coastguard Worker       DeleteObject(drawable->hDIB);
180*61046927SAndroid Build Coastguard Worker 
181*61046927SAndroid Build Coastguard Worker       // Close the file mapping object
182*61046927SAndroid Build Coastguard Worker       CloseHandle(drawable->hSection);
183*61046927SAndroid Build Coastguard Worker    }
184*61046927SAndroid Build Coastguard Worker    break;
185*61046927SAndroid Build Coastguard Worker 
186*61046927SAndroid Build Coastguard Worker    case WindowsDRIDrawablePbuffer:
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker       break;
189*61046927SAndroid Build Coastguard Worker    }
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker    free(drawable);
192*61046927SAndroid Build Coastguard Worker }
193