Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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 <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.  
  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. }
  227.