diff options
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r-- | src/gallium/state_trackers/dri/dri_drawable.c | 2 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri_screen.c | 9 | ||||
-rw-r--r-- | src/gallium/state_trackers/wgl/stw_context.c | 6 | ||||
-rw-r--r-- | src/gallium/state_trackers/wgl/stw_device.c | 22 | ||||
-rw-r--r-- | src/gallium/state_trackers/wgl/stw_framebuffer.c | 17 | ||||
-rw-r--r-- | src/gallium/state_trackers/wgl/stw_getprocaddress.c | 5 | ||||
-rw-r--r-- | src/gallium/state_trackers/wgl/stw_pixelformat.c | 3 | ||||
-rw-r--r-- | src/gallium/state_trackers/xorg/xorg_xv.c | 11 |
8 files changed, 58 insertions, 17 deletions
diff --git a/src/gallium/state_trackers/dri/dri_drawable.c b/src/gallium/state_trackers/dri/dri_drawable.c index f7ed6605bf..ff21f2f958 100644 --- a/src/gallium/state_trackers/dri/dri_drawable.c +++ b/src/gallium/state_trackers/dri/dri_drawable.c @@ -268,7 +268,7 @@ void dri2_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target, void dri2_set_tex_buffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv) { - dri2_set_tex_buffer2(pDRICtx, target, GLX_TEXTURE_FORMAT_RGBA_EXT, dPriv); + dri2_set_tex_buffer2(pDRICtx, target, __DRI_TEXTURE_FORMAT_RGBA, dPriv); } void diff --git a/src/gallium/state_trackers/dri/dri_screen.c b/src/gallium/state_trackers/dri/dri_screen.c index 2052867309..4064976b23 100644 --- a/src/gallium/state_trackers/dri/dri_screen.c +++ b/src/gallium/state_trackers/dri/dri_screen.c @@ -157,7 +157,8 @@ dri_fill_in_modes(struct dri_screen *screen, depth_bits_array, stencil_bits_array, depth_buffer_factor, back_buffer_modes, back_buffer_factor, - msaa_samples_array, msaa_samples_factor); + msaa_samples_array, msaa_samples_factor, + GL_TRUE); } else { __DRIconfig **configs_a8r8g8b8 = NULL; __DRIconfig **configs_x8r8g8b8 = NULL; @@ -170,7 +171,8 @@ dri_fill_in_modes(struct dri_screen *screen, back_buffer_modes, back_buffer_factor, msaa_samples_array, - msaa_samples_factor); + msaa_samples_factor, + GL_TRUE); if (pf_x8r8g8b8) configs_x8r8g8b8 = driCreateConfigs(GL_BGR, GL_UNSIGNED_INT_8_8_8_8_REV, depth_bits_array, @@ -179,7 +181,8 @@ dri_fill_in_modes(struct dri_screen *screen, back_buffer_modes, back_buffer_factor, msaa_samples_array, - msaa_samples_factor); + msaa_samples_factor, + GL_TRUE); if (configs_a8r8g8b8 && configs_x8r8g8b8) configs = driConcatConfigs(configs_x8r8g8b8, configs_a8r8g8b8); diff --git a/src/gallium/state_trackers/wgl/stw_context.c b/src/gallium/state_trackers/wgl/stw_context.c index 0785d2c6b8..c2f9c7550e 100644 --- a/src/gallium/state_trackers/wgl/stw_context.c +++ b/src/gallium/state_trackers/wgl/stw_context.c @@ -75,6 +75,9 @@ DrvCopyContext( struct stw_context *dst; BOOL ret = FALSE; + if (!stw_dev) + return FALSE; + pipe_mutex_lock( stw_dev->ctx_mutex ); src = stw_lookup_context_locked( dhrcSource ); @@ -102,6 +105,9 @@ DrvShareLists( struct stw_context *ctx2; BOOL ret = FALSE; + if (!stw_dev) + return FALSE; + pipe_mutex_lock( stw_dev->ctx_mutex ); ctx1 = stw_lookup_context_locked( dhglrc1 ); diff --git a/src/gallium/state_trackers/wgl/stw_device.c b/src/gallium/state_trackers/wgl/stw_device.c index 7785aba467..ce6fe5f4ef 100644 --- a/src/gallium/state_trackers/wgl/stw_device.c +++ b/src/gallium/state_trackers/wgl/stw_device.c @@ -152,24 +152,26 @@ stw_cleanup_thread(void) void stw_cleanup(void) { - unsigned i; + DHGLRC dhglrc; debug_printf("%s\n", __FUNCTION__); if (!stw_dev) return; + /* + * Abort cleanup if there are still active contexts. In some situations + * this DLL may be unloaded before the DLL that is using GL contexts is. + */ pipe_mutex_lock( stw_dev->ctx_mutex ); - { - /* Ensure all contexts are destroyed */ - i = handle_table_get_first_handle(stw_dev->ctx_table); - while (i) { - DrvDeleteContext(i); - i = handle_table_get_next_handle(stw_dev->ctx_table, i); - } - handle_table_destroy(stw_dev->ctx_table); - } + dhglrc = handle_table_get_first_handle(stw_dev->ctx_table); pipe_mutex_unlock( stw_dev->ctx_mutex ); + if (dhglrc) { + debug_printf("%s: contexts still active -- cleanup aborted\n", __FUNCTION__); + return; + } + + handle_table_destroy(stw_dev->ctx_table); stw_framebuffer_cleanup(); diff --git a/src/gallium/state_trackers/wgl/stw_framebuffer.c b/src/gallium/state_trackers/wgl/stw_framebuffer.c index 129a6298a7..02de21ccb2 100644 --- a/src/gallium/state_trackers/wgl/stw_framebuffer.c +++ b/src/gallium/state_trackers/wgl/stw_framebuffer.c @@ -179,7 +179,7 @@ stw_call_window_proc( if(!tls_data) return 0; - if (nCode < 0) + if (nCode < 0 || !stw_dev) return CallNextHookEx(tls_data->hCallWndProcHook, nCode, wParam, lParam); if (pParams->message == WM_WINDOWPOSCHANGED) { @@ -332,6 +332,9 @@ stw_framebuffer_cleanup( void ) struct stw_framebuffer *fb; struct stw_framebuffer *next; + if (!stw_dev) + return; + pipe_mutex_lock( stw_dev->fb_mutex ); fb = stw_dev->fb_head; @@ -387,6 +390,9 @@ stw_framebuffer_from_hdc( { struct stw_framebuffer *fb; + if (!stw_dev) + return NULL; + pipe_mutex_lock( stw_dev->fb_mutex ); fb = stw_framebuffer_from_hdc_locked(hdc); pipe_mutex_unlock( stw_dev->fb_mutex ); @@ -421,6 +427,9 @@ DrvSetPixelFormat( uint index; struct stw_framebuffer *fb; + if (!stw_dev) + return FALSE; + index = (uint) iPixelFormat - 1; count = stw_pixelformat_get_extended_count(); if (index >= count) @@ -475,6 +484,9 @@ DrvPresentBuffers(HDC hdc, PGLPRESENTBUFFERSDATA data) struct pipe_screen *screen; struct pipe_surface *surface; + if (!stw_dev) + return FALSE; + fb = stw_framebuffer_from_hdc( hdc ); if (fb == NULL) return FALSE; @@ -576,6 +588,9 @@ DrvSwapBuffers( struct stw_framebuffer *fb; struct pipe_surface *surface = NULL; + if (!stw_dev) + return FALSE; + fb = stw_framebuffer_from_hdc( hdc ); if (fb == NULL) return FALSE; diff --git a/src/gallium/state_trackers/wgl/stw_getprocaddress.c b/src/gallium/state_trackers/wgl/stw_getprocaddress.c index 8875dc22f3..d43a55fa9e 100644 --- a/src/gallium/state_trackers/wgl/stw_getprocaddress.c +++ b/src/gallium/state_trackers/wgl/stw_getprocaddress.c @@ -34,6 +34,8 @@ #include "glapi/glapi.h" #include "stw_ext_gallium.h" +#include "stw_device.h" +#include "stw_icd.h" struct stw_extension_entry { @@ -73,6 +75,9 @@ DrvGetProcAddress( { const struct stw_extension_entry *entry; + if (!stw_dev) + return NULL; + if (lpszProc[0] == 'w' && lpszProc[1] == 'g' && lpszProc[2] == 'l') for (entry = stw_extension_entries; entry->name; entry++) if (strcmp( lpszProc, entry->name ) == 0) diff --git a/src/gallium/state_trackers/wgl/stw_pixelformat.c b/src/gallium/state_trackers/wgl/stw_pixelformat.c index 7d4c2430b0..b750b03695 100644 --- a/src/gallium/state_trackers/wgl/stw_pixelformat.c +++ b/src/gallium/state_trackers/wgl/stw_pixelformat.c @@ -302,6 +302,9 @@ DrvDescribePixelFormat( (void) hdc; + if (!stw_dev) + return 0; + count = stw_pixelformat_get_extended_count(); index = (uint) iPixelFormat - 1; diff --git a/src/gallium/state_trackers/xorg/xorg_xv.c b/src/gallium/state_trackers/xorg/xorg_xv.c index 3dcef22c13..e37a1c3959 100644 --- a/src/gallium/state_trackers/xorg/xorg_xv.c +++ b/src/gallium/state_trackers/xorg/xorg_xv.c @@ -388,6 +388,9 @@ draw_yuv(struct xorg_xv_port_priv *port, { struct pipe_texture **textures = port->yuv[port->current_set]; + /*debug_printf(" draw_yuv([%d, %d, %d ,%d], [%d, %d, %d, %d])\n", + src_x, src_y, src_w, src_h, + dst_x, dst_y, dst_w, dst_h);*/ renderer_draw_yuv(port->r, src_x, src_y, src_w, src_h, dst_x, dst_y, dst_w, dst_h, @@ -489,6 +492,9 @@ display_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id, exaMoveInPixmap(pPixmap); dst = exaGetPixmapDriverPrivate(pPixmap); + /*debug_printf("display_video([%d, %d, %d, %d], [%d, %d, %d, %d])\n", + src_x, src_y, src_w, src_h, dstX, dstY, dst_w, dst_h);*/ + if (dst && !dst->tex) { xorg_exa_set_shared_usage(pPixmap); pScrn->pScreen->ModifyPixmapHeader(pPixmap, 0, 0, 0, 0, 0, NULL); @@ -539,8 +545,9 @@ display_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id, offset_w = dst_w - w; offset_h = dst_h - h; - draw_yuv(pPriv, src_x + offset_x*diff_x, src_y + offset_y*diff_y, - src_w - offset_w*diff_x, src_h - offset_h*diff_x, + draw_yuv(pPriv, + src_x + offset_x*diff_x, src_y + offset_y*diff_y, + src_w - offset_w*diff_x, src_h - offset_h*diff_y, x, y, w, h); pbox++; |