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 #ifndef STW_DEVICE_H_ 29 #define STW_DEVICE_H_ 30 31 32 #include "pipe/p_compiler.h" 33 #include "util/u_handle_table.h" 34 #include "stw_icd.h" 35 #include "stw_pixelformat.h" 36 37 38 #define STW_MAX_PIXELFORMATS 256 39 40 41 struct pipe_screen; 42 struct st_api; 43 struct st_manager; 44 struct stw_framebuffer; 45 46 struct stw_device 47 { 48 const struct stw_winsys *stw_winsys; 49 50 struct pipe_screen *screen; 51 52 /* Cache some PIPE_CAP_* */ 53 unsigned max_2d_levels; 54 unsigned max_2d_length; 55 56 struct st_api *stapi; 57 struct st_manager *smapi; 58 59 LUID AdapterLuid; 60 61 struct stw_pixelformat_info pixelformats[STW_MAX_PIXELFORMATS]; 62 unsigned pixelformat_count; 63 unsigned pixelformat_extended_count; 64 65 GLCALLBACKTABLE callbacks; 66 67 CRITICAL_SECTION ctx_mutex; 68 struct handle_table *ctx_table; 69 70 /* TODO: use an atomic counter to track the number of locked 71 * stw_framebuffer objects. Assert that the counter is zero when 72 * trying to lock this mutex. 73 */ 74 CRITICAL_SECTION fb_mutex; 75 struct stw_framebuffer *fb_head; 76 77 #ifdef DEBUG 78 unsigned long memdbg_no; 79 #endif 80 81 /** WGL_EXT_swap_control */ 82 int refresh_rate; 83 int swap_interval; 84 85 bool initialized; 86 }; 87 88 89 extern struct stw_device *stw_dev; 90 91 92 static inline struct stw_context * 93 stw_lookup_context_locked( DHGLRC dhglrc ) 94 { 95 if (dhglrc == 0 || stw_dev == NULL) 96 return NULL; 97 return (struct stw_context *) handle_table_get(stw_dev->ctx_table, dhglrc); 98 } 99 100 101 static inline void 102 stw_lock_contexts(struct stw_device *stw_dev) 103 { 104 EnterCriticalSection(&stw_dev->ctx_mutex); 105 } 106 107 108 static inline void 109 stw_unlock_contexts(struct stw_device *stw_dev) 110 { 111 LeaveCriticalSection(&stw_dev->ctx_mutex); 112 } 113 114 115 static inline void 116 stw_lock_framebuffers(struct stw_device *stw_dev) 117 { 118 EnterCriticalSection(&stw_dev->fb_mutex); 119 } 120 121 122 static inline void 123 stw_unlock_framebuffers(struct stw_device *stw_dev) 124 { 125 LeaveCriticalSection(&stw_dev->fb_mutex); 126 } 127 128 129 #endif /* STW_DEVICE_H_ */ 130