From d32ae764e930abb70ca2cc79ad18fdb32141ca0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Fonseca?= Date: Thu, 19 Feb 2009 10:52:08 +0000 Subject: wgl: Share more code between icd and standalone driver. --- .../state_trackers/wgl/shared/stw_context.c | 204 +++++++++++++-------- 1 file changed, 129 insertions(+), 75 deletions(-) (limited to 'src/gallium/state_trackers/wgl/shared/stw_context.c') diff --git a/src/gallium/state_trackers/wgl/shared/stw_context.c b/src/gallium/state_trackers/wgl/shared/stw_context.c index 2abf97b5ad..0b996d788f 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; -} - - - -- cgit v1.2.3