Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5564 serge 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
#include 
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
 
45
struct stw_device *stw_dev = NULL;
46
 
47
static int
48
stw_get_param(struct st_manager *smapi,
49
              enum st_manager_param param)
50
{
51
   switch (param) {
52
   case ST_MANAGER_BROKEN_INVALIDATE:
53
      /*
54
       * Force framebuffer validation on glViewport.
55
       *
56
       * Certain applications, like Rhinoceros 4, uses glReadPixels
57
       * exclusively (never uses SwapBuffers), so framebuffers never get
58
       * resized unless we check on glViewport.
59
       */
60
      return 1;
61
   default:
62
      return 0;
63
   }
64
}
65
 
66
boolean
67
stw_init(const struct stw_winsys *stw_winsys)
68
{
69
   static struct stw_device stw_dev_storage;
70
   struct pipe_screen *screen;
71
 
72
   debug_disable_error_message_boxes();
73
 
74
   debug_printf("%s\n", __FUNCTION__);
75
 
76
   assert(!stw_dev);
77
 
78
   stw_tls_init();
79
 
80
   stw_dev = &stw_dev_storage;
81
   memset(stw_dev, 0, sizeof(*stw_dev));
82
 
83
#ifdef DEBUG
84
   stw_dev->memdbg_no = debug_memory_begin();
85
#endif
86
 
87
   stw_dev->stw_winsys = stw_winsys;
88
 
89
   stw_dev->stapi = stw_st_create_api();
90
   stw_dev->smapi = CALLOC_STRUCT(st_manager);
91
   if (!stw_dev->stapi || !stw_dev->smapi)
92
      goto error1;
93
 
94
   screen = stw_winsys->create_screen();
95
   if(!screen)
96
      goto error1;
97
 
98
   if(stw_winsys->get_adapter_luid)
99
      stw_winsys->get_adapter_luid(screen, &stw_dev->AdapterLuid);
100
 
101
   stw_dev->smapi->screen = screen;
102
   stw_dev->smapi->get_param = stw_get_param;
103
   stw_dev->screen = screen;
104
 
105
   stw_dev->max_2d_levels =
106
         screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
107
   stw_dev->max_2d_length = 1 << (stw_dev->max_2d_levels - 1);
108
 
109
   pipe_mutex_init( stw_dev->ctx_mutex );
110
   pipe_mutex_init( stw_dev->fb_mutex );
111
 
112
   stw_dev->ctx_table = handle_table_create();
113
   if (!stw_dev->ctx_table) {
114
      goto error1;
115
   }
116
 
117
   stw_pixelformat_init();
118
 
119
   return TRUE;
120
 
121
error1:
122
   FREE(stw_dev->smapi);
123
   if (stw_dev->stapi)
124
      stw_dev->stapi->destroy(stw_dev->stapi);
125
 
126
   stw_dev = NULL;
127
   return FALSE;
128
}
129
 
130
 
131
boolean
132
stw_init_thread(void)
133
{
134
   return stw_tls_init_thread();
135
}
136
 
137
 
138
void
139
stw_cleanup_thread(void)
140
{
141
   stw_tls_cleanup_thread();
142
}
143
 
144
 
145
void
146
stw_cleanup(void)
147
{
148
   DHGLRC dhglrc;
149
 
150
   debug_printf("%s\n", __FUNCTION__);
151
 
152
   if (!stw_dev)
153
      return;
154
 
155
   /*
156
    * Abort cleanup if there are still active contexts. In some situations
157
    * this DLL may be unloaded before the DLL that is using GL contexts is.
158
    */
159
   pipe_mutex_lock( stw_dev->ctx_mutex );
160
   dhglrc = handle_table_get_first_handle(stw_dev->ctx_table);
161
   pipe_mutex_unlock( stw_dev->ctx_mutex );
162
   if (dhglrc) {
163
      debug_printf("%s: contexts still active -- cleanup aborted\n", __FUNCTION__);
164
      stw_dev = NULL;
165
      return;
166
   }
167
 
168
   handle_table_destroy(stw_dev->ctx_table);
169
 
170
   stw_framebuffer_cleanup();
171
 
172
   pipe_mutex_destroy( stw_dev->fb_mutex );
173
   pipe_mutex_destroy( stw_dev->ctx_mutex );
174
 
175
   FREE(stw_dev->smapi);
176
   stw_dev->stapi->destroy(stw_dev->stapi);
177
 
178
   stw_dev->screen->destroy(stw_dev->screen);
179
 
180
   /* glapi is statically linked: we can call the local destroy function. */
181
#ifdef _GLAPI_NO_EXPORTS
182
   _glapi_destroy_multithread();
183
#endif
184
 
185
#ifdef DEBUG
186
   debug_memory_end(stw_dev->memdbg_no);
187
#endif
188
 
189
   stw_tls_cleanup();
190
 
191
   stw_dev = NULL;
192
}
193
 
194
 
195
void APIENTRY
196
DrvSetCallbackProcs(
197
   INT nProcs,
198
   PROC *pProcs )
199
{
200
   size_t size;
201
 
202
   if (stw_dev == NULL)
203
      return;
204
 
205
   size = MIN2(nProcs * sizeof *pProcs, sizeof stw_dev->callbacks);
206
   memcpy(&stw_dev->callbacks, pProcs, size);
207
 
208
   return;
209
}
210
 
211
 
212
BOOL APIENTRY
213
DrvValidateVersion(
214
   ULONG ulVersion )
215
{
216
   /* ulVersion is the version reported by the KMD:
217
    * - via D3DKMTQueryAdapterInfo(KMTQAITYPE_UMOPENGLINFO) on WDDM,
218
    * - or ExtEscape on XPDM and can be used to ensure the KMD and OpenGL ICD
219
    *   versions match.
220
    *
221
    * We should get the expected version number from the winsys, but for now
222
    * ignore it.
223
    */
224
   (void)ulVersion;
225
   return TRUE;
226
}