stw_device.c revision 59e6e765426a5877db7446e1e34bb7edd3dc1f74
1/**************************************************************************
2 *
3 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
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 TUNGSTEN GRAPHICS 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#include <windows.h>
29
30#include "glapi/glapi.h"
31#include "util/u_debug.h"
32#include "util/u_math.h"
33#include "util/u_memory.h"
34#include "pipe/p_screen.h"
35
36#include "stw_device.h"
37#include "stw_winsys.h"
38#include "stw_pixelformat.h"
39#include "stw_icd.h"
40#include "stw_tls.h"
41#include "stw_framebuffer.h"
42#include "stw_st.h"
43
44#ifdef WIN32_THREADS
45extern _glthread_Mutex OneTimeLock;
46#endif
47
48
49struct stw_device *stw_dev = NULL;
50
51static int
52stw_get_param(struct st_manager *smapi,
53              enum st_manager_param param)
54{
55   return 0;
56}
57
58boolean
59stw_init(const struct stw_winsys *stw_winsys)
60{
61   static struct stw_device stw_dev_storage;
62   struct pipe_screen *screen;
63
64   debug_printf("%s\n", __FUNCTION__);
65
66   assert(!stw_dev);
67
68   stw_tls_init();
69
70   stw_dev = &stw_dev_storage;
71   memset(stw_dev, 0, sizeof(*stw_dev));
72
73#ifdef DEBUG
74   stw_dev->memdbg_no = debug_memory_begin();
75#endif
76
77   stw_dev->stw_winsys = stw_winsys;
78
79#ifdef WIN32_THREADS
80   _glthread_INIT_MUTEX(OneTimeLock);
81#endif
82
83   stw_dev->stapi = stw_st_create_api();
84   stw_dev->smapi = CALLOC_STRUCT(st_manager);
85   if (!stw_dev->stapi || !stw_dev->smapi)
86      goto error1;
87
88   screen = stw_winsys->create_screen();
89   if(!screen)
90      goto error1;
91
92   if(stw_winsys->get_adapter_luid)
93      stw_winsys->get_adapter_luid(screen, &stw_dev->AdapterLuid);
94
95   stw_dev->smapi->screen = screen;
96   stw_dev->smapi->get_param = stw_get_param;
97   stw_dev->screen = screen;
98
99   pipe_mutex_init( stw_dev->ctx_mutex );
100   pipe_mutex_init( stw_dev->fb_mutex );
101
102   stw_dev->ctx_table = handle_table_create();
103   if (!stw_dev->ctx_table) {
104      goto error1;
105   }
106
107   stw_pixelformat_init();
108
109   return TRUE;
110
111error1:
112   if (stw_dev->smapi)
113      FREE(stw_dev->smapi);
114   if (stw_dev->stapi)
115      stw_dev->stapi->destroy(stw_dev->stapi);
116
117   stw_dev = NULL;
118   return FALSE;
119}
120
121
122boolean
123stw_init_thread(void)
124{
125   return stw_tls_init_thread();
126}
127
128
129void
130stw_cleanup_thread(void)
131{
132   stw_tls_cleanup_thread();
133}
134
135
136void
137stw_cleanup(void)
138{
139   DHGLRC dhglrc;
140
141   debug_printf("%s\n", __FUNCTION__);
142
143   if (!stw_dev)
144      return;
145
146   /*
147    * Abort cleanup if there are still active contexts. In some situations
148    * this DLL may be unloaded before the DLL that is using GL contexts is.
149    */
150   pipe_mutex_lock( stw_dev->ctx_mutex );
151   dhglrc = handle_table_get_first_handle(stw_dev->ctx_table);
152   pipe_mutex_unlock( stw_dev->ctx_mutex );
153   if (dhglrc) {
154      debug_printf("%s: contexts still active -- cleanup aborted\n", __FUNCTION__);
155      stw_dev = NULL;
156      return;
157   }
158
159   handle_table_destroy(stw_dev->ctx_table);
160
161   stw_framebuffer_cleanup();
162
163   pipe_mutex_destroy( stw_dev->fb_mutex );
164   pipe_mutex_destroy( stw_dev->ctx_mutex );
165
166   FREE(stw_dev->smapi);
167   stw_dev->stapi->destroy(stw_dev->stapi);
168
169   stw_dev->screen->destroy(stw_dev->screen);
170
171#ifdef WIN32_THREADS
172   _glthread_DESTROY_MUTEX(OneTimeLock);
173
174   _glapi_destroy_multithread();
175#endif
176
177#ifdef DEBUG
178   debug_memory_end(stw_dev->memdbg_no);
179#endif
180
181   stw_tls_cleanup();
182
183   stw_dev = NULL;
184}
185
186
187struct stw_context *
188stw_lookup_context_locked( DHGLRC dhglrc )
189{
190   if (dhglrc == 0)
191      return NULL;
192
193   if (stw_dev == NULL)
194      return NULL;
195
196   return (struct stw_context *) handle_table_get(stw_dev->ctx_table, dhglrc);
197}
198
199
200void APIENTRY
201DrvSetCallbackProcs(
202   INT nProcs,
203   PROC *pProcs )
204{
205   size_t size;
206
207   if (stw_dev == NULL)
208      return;
209
210   size = MIN2(nProcs * sizeof *pProcs, sizeof stw_dev->callbacks);
211   memcpy(&stw_dev->callbacks, pProcs, size);
212
213   return;
214}
215
216
217BOOL APIENTRY
218DrvValidateVersion(
219   ULONG ulVersion )
220{
221   /* TODO: get the expected version from the winsys */
222   return ulVersion == 1;
223}
224