diff options
author | José Fonseca <[email protected]> | 2009-02-19 10:52:08 +0000 |
---|---|---|
committer | José Fonseca <[email protected]> | 2009-02-19 10:59:13 +0000 |
commit | d32ae764e930abb70ca2cc79ad18fdb32141ca0d (patch) | |
tree | 8292099dad415b6e28939e65f9397fc85b5f9751 /src/gallium/state_trackers/wgl/shared | |
parent | d98bc1e32470c7b78e8246f1cbcfb96d0fa6338c (diff) |
wgl: Share more code between icd and standalone driver.
Diffstat (limited to 'src/gallium/state_trackers/wgl/shared')
-rw-r--r-- | src/gallium/state_trackers/wgl/shared/stw_context.c | 204 | ||||
-rw-r--r-- | src/gallium/state_trackers/wgl/shared/stw_context.h | 11 | ||||
-rw-r--r-- | src/gallium/state_trackers/wgl/shared/stw_device.c | 38 | ||||
-rw-r--r-- | src/gallium/state_trackers/wgl/shared/stw_device.h | 21 | ||||
-rw-r--r-- | src/gallium/state_trackers/wgl/shared/stw_public.h | 27 |
5 files changed, 192 insertions, 109 deletions
diff --git a/src/gallium/state_trackers/wgl/shared/stw_context.c b/src/gallium/state_trackers/wgl/shared/stw_context.c index 2abf97b5adb..0b996d788f9 100644 --- a/src/gallium/state_trackers/wgl/shared/stw_context.c +++ b/src/gallium/state_trackers/wgl/shared/stw_context.c @@ -40,26 +40,38 @@ #include "stw_public.h" #include "stw_context.h" -static struct stw_context *ctx_head = NULL; - static HDC current_hdc = NULL; -static struct stw_context *current_hrc = NULL; +static UINT_PTR current_hglrc = 0; BOOL stw_copy_context( - struct stw_context *src, - struct stw_context *dst, + UINT_PTR hglrcSrc, + UINT_PTR hglrcDst, UINT mask ) { - (void) src; - (void) dst; - (void) mask; + struct stw_context *src; + struct stw_context *dst; + BOOL ret = FALSE; + + pipe_mutex_lock( stw_dev->mutex ); + + src = stw_lookup_context( hglrcSrc ); + dst = stw_lookup_context( hglrcDst ); + + if (src && dst) { + /* FIXME */ + (void) src; + (void) dst; + (void) mask; + } - return FALSE; + pipe_mutex_unlock( stw_dev->mutex ); + + return ret; } -struct stw_context * -stw_create_context( +UINT_PTR +stw_create_layer_context( HDC hdc, int iLayerPlane ) { @@ -68,19 +80,23 @@ stw_create_context( struct stw_context *ctx = NULL; GLvisual *visual = NULL; struct pipe_context *pipe = NULL; + UINT_PTR hglrc; + if(!stw_dev) + return 0; + if (iLayerPlane != 0) - return NULL; + return 0; pfi = stw_pixelformat_get( hdc ); if (pfi == 0) - return NULL; + return 0; pf = pixelformat_get_info( pfi - 1 ); ctx = CALLOC_STRUCT( stw_context ); if (ctx == NULL) - return NULL; + return 0; ctx->hdc = hdc; ctx->color_bits = GetDeviceCaps( ctx->hdc, BITSPIXEL ); @@ -119,10 +135,30 @@ stw_create_context( ctx->st->ctx->DriverCtx = ctx; - ctx->next = ctx_head; - ctx_head = ctx; + pipe_mutex_lock( stw_dev->mutex ); + { + UINT_PTR i; + + for (i = 0; i < STW_CONTEXT_MAX; i++) { + if (stw_dev->ctx_array[i].ctx == NULL) + break; + } + + /* No slot available, fail: + */ + if (i == STW_CONTEXT_MAX) + goto done; + + stw_dev->ctx_array[i].ctx = ctx; + + /* success: + */ + hglrc = i + 1; + } +done: + pipe_mutex_unlock( stw_dev->mutex ); - return ctx; + return hglrc; fail: if (visual) @@ -132,47 +168,80 @@ fail: pipe->destroy( pipe ); FREE( ctx ); - return NULL; + return 0; } - BOOL stw_delete_context( - struct stw_context *hglrc ) + UINT_PTR hglrc ) { - struct stw_context **link = &ctx_head; - struct stw_context *ctx = ctx_head; + struct stw_context *ctx ; + BOOL ret = FALSE; + + pipe_mutex_lock( stw_dev->mutex ); - while (ctx != NULL) { - if (ctx == hglrc) { - GLcontext *glctx = ctx->st->ctx; - GET_CURRENT_CONTEXT( glcurctx ); - struct stw_framebuffer *fb; + ctx = stw_lookup_context(hglrc); + if (ctx) { + GLcontext *glctx = ctx->st->ctx; + GET_CURRENT_CONTEXT( glcurctx ); + struct stw_framebuffer *fb; - /* Unbind current if deleting current context. - */ - if (glcurctx == glctx) - st_make_current( NULL, NULL, NULL ); + /* Unbind current if deleting current context. + */ + if (glcurctx == glctx) + st_make_current( NULL, NULL, NULL ); - fb = framebuffer_from_hdc( ctx->hdc ); - if (fb) - framebuffer_destroy( fb ); + fb = framebuffer_from_hdc( ctx->hdc ); + if (fb) + framebuffer_destroy( fb ); - if (WindowFromDC( ctx->hdc ) != NULL) - ReleaseDC( WindowFromDC( ctx->hdc ), ctx->hdc ); + if (WindowFromDC( ctx->hdc ) != NULL) + ReleaseDC( WindowFromDC( ctx->hdc ), ctx->hdc ); - st_destroy_context( ctx->st ); + st_destroy_context( ctx->st ); - *link = ctx->next; - FREE( ctx ); - return TRUE; - } + FREE( ctx ); + + stw_dev->ctx_array[hglrc - 1].ctx = NULL; + + ret = TRUE; + } + + pipe_mutex_unlock( stw_dev->mutex ); + + return ret; +} - link = &ctx->next; - ctx = ctx->next; +BOOL +stw_release_context( + UINT_PTR hglrc ) +{ + BOOL ret = FALSE; + + if (!stw_dev) + return ret; + + pipe_mutex_lock( stw_dev->mutex ); + { + struct stw_context *ctx; + + /* XXX: The expectation is that ctx is the same context which is + * current for this thread. We should check that and return False + * if not the case. + */ + ctx = stw_lookup_context( hglrc ); + if (ctx == NULL) + goto done; + + if (stw_make_current( NULL, 0 ) == FALSE) + goto done; + + ret = TRUE; } +done: + pipe_mutex_unlock( stw_dev->mutex ); - return FALSE; + return ret; } /* Find the width and height of the window named by hdc. @@ -193,10 +262,10 @@ get_window_size( HDC hdc, GLuint *width, GLuint *height ) } } -struct stw_context * +UINT_PTR stw_get_current_context( void ) { - return current_hrc; + return current_hglrc; } HDC @@ -208,30 +277,32 @@ stw_get_current_dc( void ) BOOL stw_make_current( HDC hdc, - struct stw_context *hglrc ) + UINT_PTR hglrc ) { - struct stw_context *ctx = ctx_head; + struct stw_context *ctx; GET_CURRENT_CONTEXT( glcurctx ); struct stw_framebuffer *fb; GLuint width = 0; GLuint height = 0; + if (!stw_dev) + return FALSE; + + pipe_mutex_lock( stw_dev->mutex ); + ctx = stw_lookup_context( hglrc ); + pipe_mutex_unlock( stw_dev->mutex ); + + if (ctx == NULL) + return FALSE; + current_hdc = hdc; - current_hrc = hglrc; + current_hglrc = hglrc; - if (hdc == NULL || hglrc == NULL) { + if (hdc == NULL || hglrc == 0) { st_make_current( NULL, NULL, NULL ); return TRUE; } - while (ctx != NULL) { - if (ctx == hglrc) - break; - ctx = ctx->next; - } - if (ctx == NULL) - return FALSE; - /* Return if already current. */ if (glcurctx != NULL) { @@ -273,20 +344,3 @@ stw_make_current( return TRUE; } - -struct stw_context * -stw_context_from_hdc( - HDC hdc ) -{ - struct stw_context *ctx = ctx_head; - - while (ctx != NULL) { - if (ctx->hdc == hdc) - return ctx; - ctx = ctx->next; - } - return NULL; -} - - - diff --git a/src/gallium/state_trackers/wgl/shared/stw_context.h b/src/gallium/state_trackers/wgl/shared/stw_context.h index 89a8f900d81..b2896152724 100644 --- a/src/gallium/state_trackers/wgl/shared/stw_context.h +++ b/src/gallium/state_trackers/wgl/shared/stw_context.h @@ -37,17 +37,6 @@ struct stw_context struct st_context *st; HDC hdc; DWORD color_bits; - struct stw_context *next; }; -struct stw_context * -stw_context_from_hdc(HDC hdc ); - - - - - - - - #endif /* STW_CONTEXT_H */ diff --git a/src/gallium/state_trackers/wgl/shared/stw_device.c b/src/gallium/state_trackers/wgl/shared/stw_device.c index 4b3cf51a537..d85cb45084f 100644 --- a/src/gallium/state_trackers/wgl/shared/stw_device.c +++ b/src/gallium/state_trackers/wgl/shared/stw_device.c @@ -34,7 +34,6 @@ #include "shared/stw_winsys.h" #include "shared/stw_pixelformat.h" #include "shared/stw_public.h" -#include "stw.h" struct stw_device *stw_dev = NULL; @@ -57,7 +56,7 @@ st_flush_frontbuffer(struct pipe_screen *screen, boolean -stw_shared_init(const struct stw_winsys *stw_winsys) +st_init(const struct stw_winsys *stw_winsys) { static struct stw_device stw_dev_storage; @@ -78,6 +77,8 @@ stw_shared_init(const struct stw_winsys *stw_winsys) stw_dev->screen->flush_frontbuffer = st_flush_frontbuffer; + pipe_mutex_init( stw_dev->mutex ); + pixelformat_init(); return TRUE; @@ -89,8 +90,24 @@ error1: void -stw_shared_cleanup(void) +st_cleanup(void) { + UINT_PTR i; + + if (!stw_dev) + return; + + pipe_mutex_lock( stw_dev->mutex ); + { + /* Ensure all contexts are destroyed */ + for (i = 0; i < STW_CONTEXT_MAX; i++) + if (stw_dev->ctx_array[i].ctx) + stw_delete_context( i + 1 ); + } + pipe_mutex_unlock( stw_dev->mutex ); + + pipe_mutex_destroy( stw_dev->mutex ); + if(stw_dev) { #ifdef DEBUG debug_memory_end(stw_dev->memdbg_no); @@ -99,3 +116,18 @@ stw_shared_cleanup(void) stw_dev = NULL; } + + +struct stw_context * +stw_lookup_context( UINT_PTR dhglrc ) +{ + if (dhglrc == 0 || + dhglrc >= STW_CONTEXT_MAX) + return NULL; + + if (stw_dev == NULL) + return NULL; + + return stw_dev->ctx_array[dhglrc - 1].ctx; +} + diff --git a/src/gallium/state_trackers/wgl/shared/stw_device.h b/src/gallium/state_trackers/wgl/shared/stw_device.h index c1e041212b7..80da14b84f4 100644 --- a/src/gallium/state_trackers/wgl/shared/stw_device.h +++ b/src/gallium/state_trackers/wgl/shared/stw_device.h @@ -25,8 +25,15 @@ * **************************************************************************/ -#ifndef ST_DEVICE_H_ -#define ST_DEVICE_H_ +#ifndef STW_DEVICE_H_ +#define STW_DEVICE_H_ + + +#include "pipe/p_compiler.h" +#include "pipe/p_thread.h" + + +#define STW_CONTEXT_MAX 32 struct pipe_screen; @@ -36,13 +43,21 @@ struct stw_device const struct stw_winsys *stw_winsys; struct pipe_screen *screen; + pipe_mutex mutex; + + struct { + struct stw_context *ctx; + } ctx_array[STW_CONTEXT_MAX]; + #ifdef DEBUG unsigned long memdbg_no; #endif }; +struct stw_context * +stw_lookup_context( UINT_PTR hglrc ); extern struct stw_device *stw_dev; -#endif /* ST_DEVICE_H_ */ +#endif /* STW_DEVICE_H_ */ diff --git a/src/gallium/state_trackers/wgl/shared/stw_public.h b/src/gallium/state_trackers/wgl/shared/stw_public.h index 75b504a50f6..39d377c16b5 100644 --- a/src/gallium/state_trackers/wgl/shared/stw_public.h +++ b/src/gallium/state_trackers/wgl/shared/stw_public.h @@ -29,31 +29,24 @@ #define STW_PUBLIC_H #include <windows.h> -#include "pipe/p_compiler.h" -struct stw_winsys; -struct stw_context; - -boolean -st_shared_init(const struct stw_winsys *stw_winsys); - -void -st_shared_cleanup(void); - - -BOOL stw_copy_context( struct stw_context *src, - struct stw_context *dst, +BOOL stw_copy_context( UINT_PTR hglrcSrc, + UINT_PTR hglrcDst, UINT mask ); -struct stw_context *stw_create_context( HDC hdc, int iLayerPlane ); +UINT_PTR stw_create_layer_context( HDC hdc, + int iLayerPlane ); + +BOOL stw_delete_context( UINT_PTR hglrc ); -BOOL stw_delete_context( struct stw_context *ctx ); +BOOL +stw_release_context( UINT_PTR dhglrc ); -struct stw_context *stw_get_current_context( void ); +UINT_PTR stw_get_current_context( void ); HDC stw_get_current_dc( void ); -BOOL stw_make_current( HDC hdc, struct stw_context *ctx ); +BOOL stw_make_current( HDC hdc, UINT_PTR hglrc ); BOOL stw_swap_buffers( HDC hdc ); |