Home | History | Annotate | Download | only in wgl
      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_FRAMEBUFFER_H
     29 #define STW_FRAMEBUFFER_H
     30 
     31 #include <windows.h>
     32 
     33 #include <GL/gl.h>
     34 #include <GL/wglext.h>
     35 
     36 #include "util/u_debug.h"
     37 #include "stw_st.h"
     38 
     39 
     40 struct pipe_resource;
     41 struct st_framebuffer_iface;
     42 struct stw_pixelformat_info;
     43 
     44 /**
     45  * Windows framebuffer.
     46  */
     47 struct stw_framebuffer
     48 {
     49    /**
     50     * This mutex has two purposes:
     51     * - protect the access to the mutable data members below
     52     * - prevent the framebuffer from being deleted while being accessed.
     53     *
     54     * Note: if both this mutex and the stw_device::fb_mutex need to be locked,
     55     * the stw_device::fb_mutex needs to be locked first.
     56     */
     57    CRITICAL_SECTION mutex;
     58 
     59    /*
     60     * Immutable members.
     61     *
     62     * Note that even access to immutable members implies acquiring the mutex
     63     * above, to prevent the framebuffer from being destroyed.
     64     */
     65 
     66    HWND hWnd;
     67 
     68    int iPixelFormat;
     69    const struct stw_pixelformat_info *pfi;
     70 
     71    /* A pixel format that can be used by GDI */
     72    int iDisplayablePixelFormat;
     73    boolean bPbuffer;
     74 
     75    struct st_framebuffer_iface *stfb;
     76 
     77    /*
     78     * Mutable members.
     79     */
     80 
     81    unsigned refcnt;
     82 
     83 
     84    /* FIXME: Make this work for multiple contexts bound to the same framebuffer */
     85    boolean must_resize;
     86 
     87    boolean minimized;  /**< Is the window currently minimized? */
     88 
     89    unsigned width;
     90    unsigned height;
     91 
     92    /** WGL_ARB_render_texture - set at Pbuffer creation time */
     93    unsigned textureFormat;  /**< WGL_NO_TEXTURE or WGL_TEXTURE_RGB[A]_ARB */
     94    unsigned textureTarget;  /**< WGL_NO_TEXTURE or WGL_TEXTURE_1D/2D/
     95                                  CUBE_MAP_ARB */
     96    boolean textureMipmap;   /**< TRUE/FALSE */
     97    /** WGL_ARB_render_texture - set with wglSetPbufferAttribARB() */
     98    unsigned textureLevel;
     99    unsigned textureFace;    /**< [0..6] */
    100 
    101    /**
    102     * Client area rectangle, relative to the window upper-left corner.
    103     *
    104     * @sa GLCBPRESENTBUFFERSDATA::rect.
    105     */
    106    RECT client_rect;
    107 
    108    HANDLE hSharedSurface;
    109    struct stw_shared_surface *shared_surface;
    110 
    111    /**
    112     * This is protected by stw_device::fb_mutex, not the mutex above.
    113     *
    114     * Deletions must be done by first acquiring stw_device::fb_mutex, and then
    115     * acquiring the stw_framebuffer::mutex of the framebuffer to be deleted.
    116     * This ensures that nobody else is reading/writing to the.
    117     *
    118     * It is not necessary to acquire the mutex above to navigate the linked list
    119     * given that deletions are done with stw_device::fb_mutex held, so no other
    120     * thread can delete.
    121     */
    122    struct stw_framebuffer *next;
    123 };
    124 
    125 
    126 /**
    127  * Create a new framebuffer object which will correspond to the given HDC.
    128  *
    129  * This function will acquire stw_framebuffer::mutex. stw_framebuffer_unlock
    130  * must be called when done
    131  */
    132 struct stw_framebuffer *
    133 stw_framebuffer_create(HDC hdc, int iPixelFormat);
    134 
    135 
    136 /**
    137  * Increase fb reference count.  The referenced framebuffer should be locked.
    138  *
    139  * It's not necessary to hold stw_dev::fb_mutex global lock.
    140  */
    141 static inline void
    142 stw_framebuffer_reference_locked(struct stw_framebuffer *fb)
    143 {
    144    if (fb) {
    145       assert(stw_own_mutex(&fb->mutex));
    146       fb->refcnt++;
    147    }
    148 }
    149 
    150 
    151 void
    152 stw_framebuffer_release_locked(struct stw_framebuffer *fb);
    153 
    154 /**
    155  * Search a framebuffer with a matching HWND.
    156  *
    157  * This function will acquire stw_framebuffer::mutex. stw_framebuffer_unlock
    158  * must be called when done
    159  */
    160 struct stw_framebuffer *
    161 stw_framebuffer_from_hwnd(HWND hwnd);
    162 
    163 /**
    164  * Search a framebuffer with a matching HDC.
    165  *
    166  * This function will acquire stw_framebuffer::mutex. stw_framebuffer_unlock
    167  * must be called when done
    168  */
    169 struct stw_framebuffer *
    170 stw_framebuffer_from_hdc(HDC hdc);
    171 
    172 BOOL
    173 stw_framebuffer_present_locked(HDC hdc,
    174                                struct stw_framebuffer *fb,
    175                                struct pipe_resource *res);
    176 
    177 void
    178 stw_framebuffer_update(struct stw_framebuffer *fb);
    179 
    180 
    181 static inline void
    182 stw_framebuffer_lock(struct stw_framebuffer *fb)
    183 {
    184    assert(fb);
    185    EnterCriticalSection(&fb->mutex);
    186 }
    187 
    188 
    189 /**
    190  * Release stw_framebuffer::mutex lock. This framebuffer must not be accessed
    191  * after calling this function, as it may have been deleted by another thread
    192  * in the meanwhile.
    193  */
    194 static inline void
    195 stw_framebuffer_unlock(struct stw_framebuffer *fb)
    196 {
    197    assert(fb);
    198    assert(stw_own_mutex(&fb->mutex));
    199    LeaveCriticalSection(&fb->mutex);
    200 }
    201 
    202 
    203 /**
    204  * Cleanup any existing framebuffers when exiting application.
    205  */
    206 void
    207 stw_framebuffer_cleanup(void);
    208 
    209 
    210 static inline struct stw_st_framebuffer *
    211 stw_st_framebuffer(struct st_framebuffer_iface *stfb)
    212 {
    213    return (struct stw_st_framebuffer *) stfb;
    214 }
    215 
    216 
    217 static inline struct stw_framebuffer *
    218 stw_framebuffer_from_HPBUFFERARB(HPBUFFERARB hPbuffer)
    219 {
    220    return (struct stw_framebuffer *) hPbuffer;
    221 }
    222 
    223 
    224 #endif /* STW_FRAMEBUFFER_H */
    225