env.Append(CPPDEFINES = [
'_GDI32_', # prevent wgl* being declared __declspec(dllimport)
'BUILD_GL32', # declare gl* as __declspec(dllexport) in Mesa headers
- '__GL_EXPORTS',
- '_GNU_H_WINDOWS32_DEFINES',
])
sources = [
- 'stw.c',
-
'icd/stw_icd.c',
'wgl/stw_wgl.c',
#include "shared/stw_public.h"
#include "icd/stw_icd.h"
-#include "stw.h"
-#define DRV_CONTEXT_MAX 32
+static GLCLTPROCTABLE cpt;
+static boolean cpt_initialized = FALSE;
-struct stw_icd
-{
- pipe_mutex mutex;
-
- GLCLTPROCTABLE cpt;
- boolean cpt_initialized;
-
- struct {
- struct stw_context *ctx;
- } ctx_array[DRV_CONTEXT_MAX];
-};
-
-
-static struct stw_icd *stw_icd = NULL;
-
-
-boolean
-stw_icd_init( void )
-{
- static struct stw_icd stw_icd_storage;
-
- assert(!stw_icd);
-
- stw_icd = &stw_icd_storage;
- memset(stw_icd, 0, sizeof *stw_icd);
-
- pipe_mutex_init( stw_icd->mutex );
-
- return TRUE;
-}
-
-void
-stw_icd_cleanup(void)
-{
- int i;
-
- if (!stw_icd)
- return;
-
- pipe_mutex_lock( stw_icd->mutex );
- {
- /* Ensure all contexts are destroyed */
- for (i = 0; i < DRV_CONTEXT_MAX; i++)
- if (stw_icd->ctx_array[i].ctx)
- stw_delete_context( stw_icd->ctx_array[i].ctx );
- }
- pipe_mutex_unlock( stw_icd->mutex );
-
- pipe_mutex_init( stw_icd->mutex );
- stw_icd = NULL;
-}
-
-
-static struct stw_context *
-lookup_context( struct stw_icd *icd,
- DHGLRC dhglrc )
-{
- if (dhglrc == 0 ||
- dhglrc >= DRV_CONTEXT_MAX)
- return NULL;
-
- if (icd == NULL)
- return NULL;
-
- return icd->ctx_array[dhglrc - 1].ctx;
-}
BOOL APIENTRY
DrvCopyContext(
DHGLRC dhrcDest,
UINT fuMask )
{
- BOOL ret = FALSE;
-
- if (!stw_icd)
- return FALSE;
-
- pipe_mutex_lock( stw_icd->mutex );
- {
- struct stw_context *src = lookup_context( stw_icd, dhrcSource );
- struct stw_context *dst = lookup_context( stw_icd, dhrcDest );
-
- if (src == NULL || dst == NULL)
- goto done;
-
- ret = stw_copy_context( src, dst, fuMask );
- }
-done:
- pipe_mutex_unlock( stw_icd->mutex );
-
- return ret;
+ return stw_copy_context(dhrcSource, dhrcDest, fuMask);
}
+
DHGLRC APIENTRY
DrvCreateLayerContext(
HDC hdc,
INT iLayerPlane )
{
- DHGLRC handle = 0;
-
- if (!stw_icd)
- return handle;
-
- pipe_mutex_lock( stw_icd->mutex );
- {
- int i;
-
- for (i = 0; i < DRV_CONTEXT_MAX; i++) {
- if (stw_icd->ctx_array[i].ctx == NULL)
- break;
- }
-
- /* No slot available, fail:
- */
- if (i == DRV_CONTEXT_MAX)
- goto done;
-
- stw_icd->ctx_array[i].ctx = stw_create_context( hdc, iLayerPlane );
- if (stw_icd->ctx_array[i].ctx == NULL)
- goto done;
-
- /* success:
- */
- handle = (DHGLRC) i + 1;
- }
-done:
- pipe_mutex_unlock( stw_icd->mutex );
-
- return handle;
+ return stw_create_layer_context( hdc, iLayerPlane );
}
DHGLRC APIENTRY
DrvDeleteContext(
DHGLRC dhglrc )
{
- BOOL ret = FALSE;
-
- if (!stw_icd)
- return ret;
-
- pipe_mutex_lock( stw_icd->mutex );
- {
- struct stw_context *ctx;
-
- ctx = lookup_context( stw_icd, dhglrc );
- if (ctx == NULL)
- goto done;
-
- if (stw_delete_context( ctx ) == FALSE)
- goto done;
-
- stw_icd->ctx_array[dhglrc - 1].ctx = NULL;
- ret = TRUE;
-
- }
-done:
- pipe_mutex_unlock( stw_icd->mutex );
-
- return ret;
+ return stw_delete_context( dhglrc );
}
BOOL APIENTRY
DrvReleaseContext(
DHGLRC dhglrc )
{
- BOOL ret = FALSE;
-
- if (!stw_icd)
- return ret;
-
- pipe_mutex_lock( stw_icd->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 = lookup_context( stw_icd, dhglrc );
- if (ctx == NULL)
- goto done;
-
- if (stw_make_current( NULL, NULL ) == FALSE)
- goto done;
-
- ret = TRUE;
- }
-done:
- pipe_mutex_unlock( stw_icd->mutex );
-
- return ret;
+ return stw_release_context(dhglrc);
}
void APIENTRY
DHGLRC dhglrc,
PFN_SETPROCTABLE pfnSetProcTable )
{
- PGLCLTPROCTABLE result = NULL;
-
- if (!stw_icd)
- return result;
-
- pipe_mutex_lock( stw_icd->mutex );
- {
- struct stw_context *ctx;
-
- debug_printf( "%s( 0x%p, %u, 0x%p )\n",
- __FUNCTION__, hdc, dhglrc, pfnSetProcTable );
-
- /* Although WGL allows different dispatch entrypoints per
- */
- if (!stw_icd->cpt_initialized) {
- init_proc_table( &stw_icd->cpt );
- stw_icd->cpt_initialized = TRUE;
- }
-
- ctx = lookup_context( stw_icd, dhglrc );
- if (ctx == NULL)
- goto done;
-
- if (!stw_make_current( hdc, ctx ))
- goto done;
-
- result = &stw_icd->cpt;
+ debug_printf( "%s( 0x%p, %u, 0x%p )\n",
+ __FUNCTION__, hdc, dhglrc, pfnSetProcTable );
+
+ /* Although WGL allows different dispatch entrypoints per
+ */
+ if (!cpt_initialized) {
+ init_proc_table( &cpt );
+ cpt_initialized = TRUE;
}
-done:
- pipe_mutex_unlock( stw_icd->mutex );
- return result;
+ if (!stw_make_current( hdc, dhglrc ))
+ return NULL;
+
+ return &cpt;
}
int APIENTRY
#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 )
{
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 );
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)
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.
}
}
-struct stw_context *
+UINT_PTR
stw_get_current_context( void )
{
- return current_hrc;
+ return current_hglrc;
}
HDC
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) {
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;
-}
-
-
-
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 */
#include "shared/stw_winsys.h"
#include "shared/stw_pixelformat.h"
#include "shared/stw_public.h"
-#include "stw.h"
struct stw_device *stw_dev = NULL;
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;
stw_dev->screen->flush_frontbuffer = st_flush_frontbuffer;
+ pipe_mutex_init( stw_dev->mutex );
+
pixelformat_init();
return TRUE;
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);
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;
+}
+
*
**************************************************************************/
-#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;
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_ */
#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 );
+++ /dev/null
-/**************************************************************************
- *
- * Copyright 2009, VMware, Inc.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#include "stw.h"
-#include "shared/stw_winsys.h"
-
-boolean
-st_init(const struct stw_winsys *stw_winsys)
-{
- if (!stw_shared_init( stw_winsys ))
- goto fail;
-
- if (!stw_icd_init())
- goto fail;
-
- if (!stw_wgl_init())
- goto fail;
-
- return TRUE;
-
-fail:
- st_cleanup();
- return FALSE;
-}
-
-
-void
-st_cleanup(void)
-{
- stw_icd_cleanup();
- stw_shared_cleanup();
- stw_wgl_cleanup();
-}
+++ /dev/null
-/**************************************************************************
- *
- * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- **************************************************************************/
-
-#ifndef STW_H
-#define STW_H
-
-#include "pipe/p_compiler.h"
-
-struct stw_winsys;
-
-/* Public interface:
- */
-boolean stw_init( const struct stw_winsys *stw_winsys );
-void stw_cleanup( void );
-
-
-
-/* Internal functions
- */
-boolean stw_shared_init( const struct stw_winsys *stw_winsys );
-boolean stw_icd_init( void );
-boolean stw_wgl_init( void );
-
-void stw_shared_cleanup( void );
-void stw_icd_cleanup( void );
-void stw_wgl_cleanup( void );
-
-
-#endif /* STW_H */
#include "util/u_debug.h"
#include "shared/stw_public.h"
#include "stw_wgl.h"
-#include "stw.h"
-
-boolean stw_wgl_init( void )
-{
- debug_printf("%s\n", __FUNCTION__);
- return TRUE;
-}
-
-void stw_wgl_cleanup( void )
-{
-}
-
-static INLINE struct stw_context *stw_context( HGLRC hglrc )
-{
- return (struct stw_context *)hglrc;
-}
WINGDIAPI BOOL APIENTRY
HGLRC hglrcDst,
UINT mask )
{
- return stw_copy_context( stw_context(hglrcSrc),
- stw_context(hglrcDst),
+ return stw_copy_context( (UINT_PTR)hglrcSrc,
+ (UINT_PTR)hglrcDst,
mask );
}
wglCreateContext(
HDC hdc )
{
- return (HGLRC) stw_create_context( hdc, 0 );
+ return wglCreateLayerContext(hdc, 0);
}
WINGDIAPI HGLRC APIENTRY
HDC hdc,
int iLayerPlane )
{
- return (HGLRC) stw_create_context( hdc, iLayerPlane );
+ return (HGLRC) stw_create_layer_context( hdc, iLayerPlane );
}
WINGDIAPI BOOL APIENTRY
wglDeleteContext(
HGLRC hglrc )
{
- return stw_delete_context( stw_context(hglrc) );
+ return stw_delete_context( (UINT_PTR)hglrc );
}
WINGDIAPI HGLRC APIENTRY
wglGetCurrentContext( VOID )
{
- return (HGLRC) stw_get_current_context();
+ return (HGLRC)stw_get_current_context();
}
WINGDIAPI HDC APIENTRY
HDC hdc,
HGLRC hglrc )
{
- return stw_make_current( hdc, stw_context(hglrc) );
+ return stw_make_current( hdc, (UINT_PTR)hglrc );
}
#include <windows.h>
-#include "GL/gl.h"
+#include <GL/gl.h>
/*