Home | History | Annotate | Download | only in wgl
      1 /**************************************************************************
      2  *
      3  * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
      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 TUNGSTEN GRAPHICS 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_FRAMEBUFFER_H
     29 #define STW_FRAMEBUFFER_H
     30 
     31 #include <windows.h>
     32 
     33 #include "os/os_thread.h"
     34 
     35 struct pipe_resource;
     36 struct st_framebuffer_iface;
     37 struct stw_pixelformat_info;
     38 
     39 /**
     40  * Windows framebuffer.
     41  */
     42 struct stw_framebuffer
     43 {
     44    /**
     45     * This mutex has two purposes:
     46     * - protect the access to the mutable data members below
     47     * - prevent the framebuffer from being deleted while being accessed.
     48     *
     49     * It is OK to lock this mutex while holding the stw_device::fb_mutex lock,
     50     * but the opposite must never happen.
     51     */
     52    pipe_mutex mutex;
     53 
     54    /*
     55     * Immutable members.
     56     *
     57     * Note that even access to immutable members implies acquiring the mutex
     58     * above, to prevent the framebuffer from being destroyed.
     59     */
     60 
     61    HDC hDC;
     62    HWND hWnd;
     63 
     64    int iPixelFormat;
     65    const struct stw_pixelformat_info *pfi;
     66 
     67    /* A pixel format that can be used by GDI */
     68    int iDisplayablePixelFormat;
     69    boolean bPbuffer;
     70 
     71    struct st_framebuffer_iface *stfb;
     72 
     73    /*
     74     * Mutable members.
     75     */
     76 
     77    unsigned refcnt;
     78 
     79 
     80    /* FIXME: Make this work for multiple contexts bound to the same framebuffer */
     81    boolean must_resize;
     82 
     83    unsigned width;
     84    unsigned height;
     85 
     86    /**
     87     * Client area rectangle, relative to the window upper-left corner.
     88     *
     89     * @sa GLCBPRESENTBUFFERSDATA::rect.
     90     */
     91    RECT client_rect;
     92 
     93    HANDLE hSharedSurface;
     94    struct stw_shared_surface *shared_surface;
     95 
     96    /**
     97     * This is protected by stw_device::fb_mutex, not the mutex above.
     98     *
     99     * Deletions must be done by first acquiring stw_device::fb_mutex, and then
    100     * acquiring the stw_framebuffer::mutex of the framebuffer to be deleted.
    101     * This ensures that nobody else is reading/writing to the.
    102     *
    103     * It is not necessary to aquire the mutex above to navigate the linked list
    104     * given that deletions are done with stw_device::fb_mutex held, so no other
    105     * thread can delete.
    106     */
    107    struct stw_framebuffer *next;
    108 };
    109 
    110 
    111 /**
    112  * Create a new framebuffer object which will correspond to the given HDC.
    113  *
    114  * This function will acquire stw_framebuffer::mutex. stw_framebuffer_release
    115  * must be called when done
    116  */
    117 struct stw_framebuffer *
    118 stw_framebuffer_create(
    119    HDC hdc,
    120    int iPixelFormat );
    121 
    122 void
    123 stw_framebuffer_reference(
    124    struct stw_framebuffer **ptr,
    125    struct stw_framebuffer *fb);
    126 
    127 /**
    128  * Search a framebuffer with a matching HWND.
    129  *
    130  * This function will acquire stw_framebuffer::mutex. stw_framebuffer_release
    131  * must be called when done
    132  */
    133 struct stw_framebuffer *
    134 stw_framebuffer_from_hwnd(
    135    HWND hwnd );
    136 
    137 /**
    138  * Search a framebuffer with a matching HDC.
    139  *
    140  * This function will acquire stw_framebuffer::mutex. stw_framebuffer_release
    141  * must be called when done
    142  */
    143 struct stw_framebuffer *
    144 stw_framebuffer_from_hdc(
    145    HDC hdc );
    146 
    147 BOOL
    148 stw_framebuffer_present_locked(HDC hdc,
    149                                struct stw_framebuffer *fb,
    150                                struct pipe_resource *res);
    151 
    152 void
    153 stw_framebuffer_update(
    154    struct stw_framebuffer *fb);
    155 
    156 /**
    157  * Release stw_framebuffer::mutex lock. This framebuffer must not be accessed
    158  * after calling this function, as it may have been deleted by another thread
    159  * in the meanwhile.
    160  */
    161 void
    162 stw_framebuffer_release(
    163    struct stw_framebuffer *fb);
    164 
    165 /**
    166  * Cleanup any existing framebuffers when exiting application.
    167  */
    168 void
    169 stw_framebuffer_cleanup(void);
    170 
    171 #endif /* STW_FRAMEBUFFER_H */
    172