stw_device.c revision 31aeac5bf91f3b1daacb1aa27505bfb25215da87
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**************************************************************************
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * All Rights Reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copy of this software and associated documentation files (the
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "Software"), to deal in the Software without restriction, including
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * without limitation the rights to use, copy, modify, merge, publish,
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribute, sub license, and/or sell copies of the Software, and to
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * permit persons to whom the Software is furnished to do so, subject to
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the following conditions:
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * The above copyright notice and this permission notice (including the
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * next paragraph) shall be included in all copies or substantial portions
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * of the Software.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) *
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) **************************************************************************/
275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include <windows.h>
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "glapi/glapi.h"
31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "util/u_debug.h"
32e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "util/u_math.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "util/u_memory.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "pipe/p_screen.h"
35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
36a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "stw_device.h"
371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "stw_winsys.h"
38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "stw_pixelformat.h"
3909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "stw_icd.h"
407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "stw_tls.h"
417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "stw_framebuffer.h"
427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "stw_st.h"
4319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#ifdef WIN32_THREADS
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)extern _glthread_Mutex OneTimeLock;
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#endif
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)struct stw_device *stw_dev = NULL;
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static int
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)stw_get_param(struct st_manager *smapi,
535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)              enum st_manager_param param)
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)   return 0;
5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
57197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)boolean
5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)stw_init(const struct stw_winsys *stw_winsys)
6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)   static struct stw_device stw_dev_storage;
6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)   struct pipe_screen *screen;
6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
64c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)   debug_printf("%s\n", __FUNCTION__);
65591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
66a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)   assert(!stw_dev);
67a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)   stw_tls_init();
69bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
7007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch   stw_dev = &stw_dev_storage;
71a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)   memset(stw_dev, 0, sizeof(*stw_dev));
7202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
7302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#ifdef DEBUG
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   stw_dev->memdbg_no = debug_memory_begin();
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   stw_dev->stw_winsys = stw_winsys;
78c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef WIN32_THREADS
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   _glthread_INIT_MUTEX(OneTimeLock);
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   stw_dev->stapi = stw_st_create_api();
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   stw_dev->smapi = CALLOC_STRUCT(st_manager);
8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   if (!stw_dev->stapi || !stw_dev->smapi)
8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)      goto error1;
8709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   screen = stw_winsys->create_screen();
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   if(!screen)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      goto error1;
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   if(stw_winsys->get_adapter_luid)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      stw_winsys->get_adapter_luid(screen, &stw_dev->AdapterLuid);
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   stw_dev->smapi->screen = screen;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   stw_dev->smapi->get_param = stw_get_param;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   stw_dev->screen = screen;
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch   stw_dev->max_2d_levels =
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   stw_dev->max_2d_length = 1 << (stw_dev->max_2d_levels - 1);
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   pipe_mutex_init( stw_dev->ctx_mutex );
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   pipe_mutex_init( stw_dev->fb_mutex );
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   stw_dev->ctx_table = handle_table_create();
1071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)   if (!stw_dev->ctx_table) {
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      goto error1;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   }
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   stw_pixelformat_init();
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
113a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch   return TRUE;
114a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)error1:
1168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)   if (stw_dev->smapi)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      FREE(stw_dev->smapi);
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   if (stw_dev->stapi)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      stw_dev->stapi->destroy(stw_dev->stapi);
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   stw_dev = NULL;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   return FALSE;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)boolean
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)stw_init_thread(void)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   return stw_tls_init_thread();
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void
1341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)stw_cleanup_thread(void)
1351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
1361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)   stw_tls_cleanup_thread();
137a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
13851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
13951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)stw_cleanup(void)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   DHGLRC dhglrc;
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   debug_printf("%s\n", __FUNCTION__);
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   if (!stw_dev)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return;
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   /*
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    * Abort cleanup if there are still active contexts. In some situations
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    * this DLL may be unloaded before the DLL that is using GL contexts is.
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    */
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   pipe_mutex_lock( stw_dev->ctx_mutex );
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   dhglrc = handle_table_get_first_handle(stw_dev->ctx_table);
15609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   pipe_mutex_unlock( stw_dev->ctx_mutex );
157197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch   if (dhglrc) {
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      debug_printf("%s: contexts still active -- cleanup aborted\n", __FUNCTION__);
159197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch      stw_dev = NULL;
160197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch      return;
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   }
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
163e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)   handle_table_destroy(stw_dev->ctx_table);
164e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
165e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)   stw_framebuffer_cleanup();
166e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
167e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)   pipe_mutex_destroy( stw_dev->fb_mutex );
168e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)   pipe_mutex_destroy( stw_dev->ctx_mutex );
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   FREE(stw_dev->smapi);
171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   stw_dev->stapi->destroy(stw_dev->stapi);
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   stw_dev->screen->destroy(stw_dev->screen);
174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#ifdef WIN32_THREADS
176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   _glthread_DESTROY_MUTEX(OneTimeLock);
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   _glapi_destroy_multithread();
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#ifdef DEBUG
182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)   debug_memory_end(stw_dev->memdbg_no);
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   stw_tls_cleanup();
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
187a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)   stw_dev = NULL;
188a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
18909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
19009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
19109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)struct stw_context *
19209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)stw_lookup_context_locked( DHGLRC dhglrc )
19309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
194a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)   if (dhglrc == 0)
195a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)      return NULL;
196197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
197a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)   if (stw_dev == NULL)
198197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch      return NULL;
199a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
200a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)   return (struct stw_context *) handle_table_get(stw_dev->ctx_table, dhglrc);
201a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
20209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
20309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
20409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void APIENTRY
20509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)DrvSetCallbackProcs(
20609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   INT nProcs,
20709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   PROC *pProcs )
208c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
209c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)   size_t size;
21009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
21109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   if (stw_dev == NULL)
21209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)      return;
21309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
21409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   size = MIN2(nProcs * sizeof *pProcs, sizeof stw_dev->callbacks);
2156f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch   memcpy(&stw_dev->callbacks, pProcs, size);
2166f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
21709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)   return;
21809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
219e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)BOOL APIENTRY
222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)DrvValidateVersion(
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   ULONG ulVersion )
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   /* TODO: get the expected version from the winsys */
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)   return ulVersion == 1;
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)