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)