mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-25 14:30:22 +01:00
Merge branch 'gallium-wgl-rework' into gallium-0.2
Conflicts: src/gallium/state_trackers/wgl/shared/stw_public.h
This commit is contained in:
commit
e4d1757f81
27 changed files with 693 additions and 454 deletions
|
|
@ -27,3 +27,6 @@ for driver in env['drivers']:
|
|||
SConscript(os.path.join('drivers', driver, 'SConscript'))
|
||||
|
||||
SConscript('state_trackers/python/SConscript')
|
||||
|
||||
if platform == 'windows':
|
||||
SConscript('state_trackers/wgl/SConscript')
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ if env['platform'] in ['windows']:
|
|||
|
||||
env.Append(CPPPATH = [
|
||||
'#src/mesa',
|
||||
'.',
|
||||
])
|
||||
|
||||
env.Append(CPPDEFINES = [
|
||||
|
|
@ -18,19 +19,20 @@ if env['platform'] in ['windows']:
|
|||
])
|
||||
|
||||
sources = [
|
||||
'stw_device.c',
|
||||
'stw_framebuffer.c',
|
||||
'stw_icd.c',
|
||||
'stw_pixelformat.c',
|
||||
'stw_quirks.c',
|
||||
'stw_wgl_arbextensionsstring.c',
|
||||
'stw_wgl_arbmultisample.c',
|
||||
'stw_wgl_arbpixelformat.c',
|
||||
#'stw_wgl.c',
|
||||
'stw_wgl_context.c',
|
||||
'stw_wgl_getprocaddress.c',
|
||||
'stw_wgl_pixelformat.c',
|
||||
'stw_wgl_swapbuffers.c',
|
||||
'stw.c',
|
||||
|
||||
'icd/stw_icd.c',
|
||||
|
||||
'wgl/stw_wgl.c',
|
||||
|
||||
'shared/stw_context.c',
|
||||
'shared/stw_device.c',
|
||||
'shared/stw_framebuffer.c',
|
||||
'shared/stw_pixelformat.c',
|
||||
'shared/stw_quirks.c',
|
||||
'shared/stw_arbextensionsstring.c',
|
||||
'shared/stw_getprocaddress.c',
|
||||
'shared/stw_arbpixelformat.c',
|
||||
]
|
||||
|
||||
wgl = env.ConvenienceLibrary(
|
||||
|
|
@ -32,17 +32,64 @@
|
|||
|
||||
#include "pipe/p_debug.h"
|
||||
|
||||
#include "stw_device.h"
|
||||
#include "stw_icd.h"
|
||||
#include "stw_wgl.h"
|
||||
#include "shared/stw_public.h"
|
||||
#include "icd/stw_icd.h"
|
||||
#include "stw.h"
|
||||
|
||||
|
||||
static HGLRC
|
||||
_drv_lookup_hglrc( DHGLRC dhglrc )
|
||||
#define DRV_CONTEXT_MAX 32
|
||||
|
||||
struct stw_icd
|
||||
{
|
||||
if (dhglrc == 0 || dhglrc >= DRV_CONTEXT_MAX)
|
||||
struct {
|
||||
struct stw_context *ctx;
|
||||
} ctx_array[DRV_CONTEXT_MAX];
|
||||
|
||||
DHGLRC ctx_current;
|
||||
};
|
||||
|
||||
|
||||
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);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
stw_icd_cleanup(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(!stw_icd)
|
||||
return;
|
||||
|
||||
/* 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 );
|
||||
|
||||
stw_icd = NULL;
|
||||
}
|
||||
|
||||
|
||||
static struct stw_context *
|
||||
lookup_context( DHGLRC dhglrc )
|
||||
{
|
||||
if (dhglrc == 0 ||
|
||||
dhglrc >= DRV_CONTEXT_MAX)
|
||||
return NULL;
|
||||
return stw_dev->ctx_array[dhglrc - 1].hglrc;
|
||||
|
||||
return stw_icd->ctx_array[dhglrc - 1].ctx;
|
||||
}
|
||||
|
||||
BOOL APIENTRY
|
||||
|
|
@ -51,9 +98,14 @@ DrvCopyContext(
|
|||
DHGLRC dhrcDest,
|
||||
UINT fuMask )
|
||||
{
|
||||
debug_printf( "%s\n", __FUNCTION__ );
|
||||
struct stw_context *src = lookup_context( dhrcSource );
|
||||
struct stw_context *dst = lookup_context( dhrcDest );
|
||||
|
||||
if (src == NULL ||
|
||||
dst == NULL)
|
||||
return FALSE;
|
||||
|
||||
return FALSE;
|
||||
return stw_copy_context( src, dst, fuMask );
|
||||
}
|
||||
|
||||
DHGLRC APIENTRY
|
||||
|
|
@ -61,26 +113,23 @@ DrvCreateLayerContext(
|
|||
HDC hdc,
|
||||
INT iLayerPlane )
|
||||
{
|
||||
DHGLRC dhglrc = 0;
|
||||
|
||||
if (iLayerPlane == 0) {
|
||||
DWORD i;
|
||||
|
||||
for (i = 0; i < DRV_CONTEXT_MAX; i++) {
|
||||
if (stw_dev->ctx_array[i].hglrc == NULL)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i < DRV_CONTEXT_MAX) {
|
||||
stw_dev->ctx_array[i].hglrc = wglCreateContext( hdc );
|
||||
if (stw_dev->ctx_array[i].hglrc != NULL)
|
||||
dhglrc = i + 1;
|
||||
}
|
||||
DWORD i;
|
||||
|
||||
for (i = 0; i < DRV_CONTEXT_MAX; i++) {
|
||||
if (stw_icd->ctx_array[i].ctx == NULL)
|
||||
goto found_slot;
|
||||
}
|
||||
|
||||
/* No slot available, fail:
|
||||
*/
|
||||
return 0;
|
||||
|
||||
debug_printf( "%s( 0x%p, %d ) = %u\n", __FUNCTION__, hdc, iLayerPlane, dhglrc );
|
||||
found_slot:
|
||||
stw_icd->ctx_array[i].ctx = stw_create_context( hdc, iLayerPlane );
|
||||
if (stw_icd->ctx_array[i].ctx == NULL)
|
||||
return 0;
|
||||
|
||||
return dhglrc;
|
||||
return (DHGLRC) i + 1;
|
||||
}
|
||||
|
||||
DHGLRC APIENTRY
|
||||
|
|
@ -94,18 +143,20 @@ BOOL APIENTRY
|
|||
DrvDeleteContext(
|
||||
DHGLRC dhglrc )
|
||||
{
|
||||
HGLRC hglrc = _drv_lookup_hglrc( dhglrc );
|
||||
BOOL success = FALSE;
|
||||
struct stw_context *ctx;
|
||||
|
||||
if (hglrc != NULL) {
|
||||
success = wglDeleteContext( hglrc );
|
||||
if (success)
|
||||
stw_dev->ctx_array[dhglrc - 1].hglrc = NULL;
|
||||
}
|
||||
ctx = lookup_context( dhglrc );
|
||||
if (ctx == NULL)
|
||||
goto fail;
|
||||
|
||||
debug_printf( "%s( %u ) = %s\n", __FUNCTION__, dhglrc, success ? "TRUE" : "FALSE" );
|
||||
if (stw_delete_context( ctx ) == FALSE)
|
||||
goto fail;
|
||||
|
||||
return success;
|
||||
stw_icd->ctx_array[dhglrc - 1].ctx = NULL;
|
||||
return TRUE;
|
||||
|
||||
fail:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL APIENTRY
|
||||
|
|
@ -130,9 +181,10 @@ DrvDescribePixelFormat(
|
|||
{
|
||||
LONG r;
|
||||
|
||||
r = wglDescribePixelFormat( hdc, iPixelFormat, cjpfd, ppfd );
|
||||
r = stw_pixelformat_describe( hdc, iPixelFormat, cjpfd, ppfd );
|
||||
|
||||
debug_printf( "%s( 0x%p, %d, %u, 0x%p ) = %d\n", __FUNCTION__, hdc, iPixelFormat, cjpfd, ppfd, r );
|
||||
debug_printf( "%s( 0x%p, %d, %u, 0x%p ) = %d\n",
|
||||
__FUNCTION__, hdc, iPixelFormat, cjpfd, ppfd, r );
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
@ -156,7 +208,7 @@ DrvGetProcAddress(
|
|||
{
|
||||
PROC r;
|
||||
|
||||
r = wglGetProcAddress( lpszProc );
|
||||
r = stw_get_proc_address( lpszProc );
|
||||
|
||||
debug_printf( "%s( \", __FUNCTION__%s\" ) = 0x%p\n", lpszProc, r );
|
||||
|
||||
|
|
@ -178,21 +230,23 @@ BOOL APIENTRY
|
|||
DrvReleaseContext(
|
||||
DHGLRC dhglrc )
|
||||
{
|
||||
BOOL success = FALSE;
|
||||
struct stw_context *ctx;
|
||||
|
||||
if (dhglrc == stw_dev->ctx_current) {
|
||||
HGLRC hglrc = _drv_lookup_hglrc( dhglrc );
|
||||
if (dhglrc != stw_icd->ctx_current)
|
||||
goto fail;
|
||||
|
||||
if (hglrc != NULL) {
|
||||
success = wglMakeCurrent( NULL, NULL );
|
||||
if (success)
|
||||
stw_dev->ctx_current = 0;
|
||||
}
|
||||
}
|
||||
ctx = lookup_context( dhglrc );
|
||||
if (ctx == NULL)
|
||||
goto fail;
|
||||
|
||||
debug_printf( "%s( %u ) = %s\n", __FUNCTION__, dhglrc, success ? "TRUE" : "FALSE" );
|
||||
if (stw_make_current( NULL, NULL ) == FALSE)
|
||||
goto fail;
|
||||
|
||||
return success;
|
||||
stw_icd->ctx_current = 0;
|
||||
return TRUE;
|
||||
|
||||
fail:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void APIENTRY
|
||||
|
|
@ -215,15 +269,16 @@ DrvSetContext(
|
|||
DHGLRC dhglrc,
|
||||
PFN_SETPROCTABLE pfnSetProcTable )
|
||||
{
|
||||
HGLRC hglrc = _drv_lookup_hglrc( dhglrc );
|
||||
struct stw_context *ctx;
|
||||
GLDISPATCHTABLE *disp = &cpt.glDispatchTable;
|
||||
|
||||
debug_printf( "%s( 0x%p, %u, 0x%p )\n", __FUNCTION__, hdc, dhglrc, pfnSetProcTable );
|
||||
|
||||
if (hglrc == NULL)
|
||||
ctx = lookup_context( dhglrc );
|
||||
if (ctx == NULL)
|
||||
return NULL;
|
||||
|
||||
if (!wglMakeCurrent( hdc, hglrc ))
|
||||
if (!stw_make_current( hdc, ctx ))
|
||||
return NULL;
|
||||
|
||||
memset( &cpt, 0, sizeof( cpt ) );
|
||||
|
|
@ -587,11 +642,9 @@ DrvSetPixelFormat(
|
|||
HDC hdc,
|
||||
LONG iPixelFormat )
|
||||
{
|
||||
PIXELFORMATDESCRIPTOR pfd;
|
||||
BOOL r;
|
||||
|
||||
wglDescribePixelFormat( hdc, iPixelFormat, sizeof( pfd ), &pfd );
|
||||
r = wglSetPixelFormat( hdc, iPixelFormat, &pfd );
|
||||
r = stw_pixelformat_set( hdc, iPixelFormat );
|
||||
|
||||
debug_printf( "%s( 0x%p, %d ) = %s\n", __FUNCTION__, hdc, iPixelFormat, r ? "TRUE" : "FALSE" );
|
||||
|
||||
|
|
@ -614,7 +667,7 @@ DrvSwapBuffers(
|
|||
{
|
||||
debug_printf( "%s( 0x%p )\n", __FUNCTION__, hdc );
|
||||
|
||||
return wglSwapBuffers( hdc );
|
||||
return stw_swap_buffers( hdc );
|
||||
}
|
||||
|
||||
BOOL APIENTRY
|
||||
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
#include <windows.h>
|
||||
|
||||
#include "stw_wgl_arbextensionsstring.h"
|
||||
#include "stw_arbextensionsstring.h"
|
||||
|
||||
WINGDIAPI const char * APIENTRY
|
||||
wglGetExtensionsStringARB(
|
||||
|
|
@ -29,9 +29,9 @@
|
|||
|
||||
#include "pipe/p_compiler.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "stw_public.h"
|
||||
#include "stw_pixelformat.h"
|
||||
#include "stw_wgl_arbmultisample.h"
|
||||
#include "stw_wgl_arbpixelformat.h"
|
||||
#include "stw_arbpixelformat.h"
|
||||
|
||||
#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
|
||||
#define WGL_DRAW_TO_WINDOW_ARB 0x2001
|
||||
|
|
@ -86,6 +86,12 @@
|
|||
#define WGL_TYPE_RGBA_ARB 0x202B
|
||||
#define WGL_TYPE_COLORINDEX_ARB 0x202C
|
||||
|
||||
/* From arb_multisample:
|
||||
*/
|
||||
#define WGL_SAMPLE_BUFFERS_ARB 0x2041
|
||||
#define WGL_SAMPLES_ARB 0x2042
|
||||
|
||||
|
||||
static boolean
|
||||
query_attrib(
|
||||
int iPixelFormat,
|
||||
|
|
@ -253,14 +259,14 @@ query_attrib(
|
|||
|
||||
case WGL_SAMPLE_BUFFERS_ARB:
|
||||
if (pf->flags & PF_FLAG_MULTISAMPLED)
|
||||
*pvalue = wgl_query_sample_buffers();
|
||||
*pvalue = stw_query_sample_buffers();
|
||||
else
|
||||
*pvalue = 0;
|
||||
break;
|
||||
|
||||
case WGL_SAMPLES_ARB:
|
||||
if (pf->flags & PF_FLAG_MULTISAMPLED)
|
||||
*pvalue = wgl_query_samples();
|
||||
*pvalue = stw_query_samples();
|
||||
else
|
||||
*pvalue = 0;
|
||||
break;
|
||||
|
|
@ -28,6 +28,9 @@
|
|||
#ifndef WGL_ARBPIXELFORMAT_H
|
||||
#define WGL_ARBPIXELFORMAT_H
|
||||
|
||||
|
||||
/* Extension functions for get_proc_address:
|
||||
*/
|
||||
WINGDIAPI BOOL APIENTRY
|
||||
wglChoosePixelFormatARB(
|
||||
HDC hdc,
|
||||
|
|
@ -33,49 +33,52 @@
|
|||
#include "pipe/p_context.h"
|
||||
#include "state_tracker/st_context.h"
|
||||
#include "state_tracker/st_public.h"
|
||||
#include "stw_device.h"
|
||||
#include "stw_winsys.h"
|
||||
#include "stw_framebuffer.h"
|
||||
#include "stw_pixelformat.h"
|
||||
#include "stw_wgl_arbmultisample.h"
|
||||
#include "stw_wgl_context.h"
|
||||
#include "stw_wgl.h"
|
||||
#include "shared/stw_device.h"
|
||||
#include "shared/stw_winsys.h"
|
||||
#include "shared/stw_framebuffer.h"
|
||||
#include "shared/stw_pixelformat.h"
|
||||
#include "stw_public.h"
|
||||
#include "stw_context.h"
|
||||
|
||||
static struct wgl_context *ctx_head = NULL;
|
||||
static struct stw_context *ctx_head = NULL;
|
||||
|
||||
static HDC current_hdc = NULL;
|
||||
static HGLRC current_hrc = NULL;
|
||||
static struct stw_context *current_hrc = NULL;
|
||||
|
||||
WINGDIAPI BOOL APIENTRY
|
||||
wglCopyContext(
|
||||
HGLRC hglrcSrc,
|
||||
HGLRC hglrcDst,
|
||||
BOOL
|
||||
stw_copy_context(
|
||||
struct stw_context *src,
|
||||
struct stw_context *dst,
|
||||
UINT mask )
|
||||
{
|
||||
(void) hglrcSrc;
|
||||
(void) hglrcDst;
|
||||
(void) src;
|
||||
(void) dst;
|
||||
(void) mask;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
WINGDIAPI HGLRC APIENTRY
|
||||
wglCreateContext(
|
||||
HDC hdc )
|
||||
struct stw_context *
|
||||
stw_create_context(
|
||||
HDC hdc,
|
||||
int iLayerPlane )
|
||||
{
|
||||
uint pfi;
|
||||
const struct pixelformat_info *pf;
|
||||
struct wgl_context *ctx;
|
||||
GLvisual *visual;
|
||||
struct pipe_context *pipe;
|
||||
const struct pixelformat_info *pf = NULL;
|
||||
struct stw_context *ctx = NULL;
|
||||
GLvisual *visual = NULL;
|
||||
struct pipe_context *pipe = NULL;
|
||||
|
||||
pfi = wglGetPixelFormat( hdc );
|
||||
if (iLayerPlane != 0)
|
||||
return NULL;
|
||||
|
||||
pfi = stw_pixelformat_get( hdc );
|
||||
if (pfi == 0)
|
||||
return NULL;
|
||||
|
||||
pf = pixelformat_get_info( pfi - 1 );
|
||||
|
||||
ctx = CALLOC_STRUCT( wgl_context );
|
||||
ctx = CALLOC_STRUCT( stw_context );
|
||||
if (ctx == NULL)
|
||||
return NULL;
|
||||
|
||||
|
|
@ -99,57 +102,49 @@ wglCreateContext(
|
|||
0,
|
||||
0,
|
||||
0,
|
||||
(pf->flags & PF_FLAG_MULTISAMPLED) ? wgl_query_samples() : 0 );
|
||||
if (visual == NULL) {
|
||||
FREE( ctx );
|
||||
return NULL;
|
||||
}
|
||||
(pf->flags & PF_FLAG_MULTISAMPLED) ? stw_query_samples() : 0 );
|
||||
if (visual == NULL)
|
||||
goto fail;
|
||||
|
||||
pipe = stw_dev->stw_winsys->create_context( stw_dev->screen );
|
||||
if (!pipe) {
|
||||
_mesa_destroy_visual( visual );
|
||||
FREE( ctx );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (pipe == NULL)
|
||||
goto fail;
|
||||
|
||||
assert(!pipe->priv);
|
||||
pipe->priv = hdc;
|
||||
|
||||
ctx->st = st_create_context( pipe, visual, NULL );
|
||||
if (ctx->st == NULL) {
|
||||
pipe->destroy( pipe );
|
||||
_mesa_destroy_visual( visual );
|
||||
FREE( ctx );
|
||||
return NULL;
|
||||
}
|
||||
if (ctx->st == NULL)
|
||||
goto fail;
|
||||
|
||||
ctx->st->ctx->DriverCtx = ctx;
|
||||
|
||||
ctx->next = ctx_head;
|
||||
ctx_head = ctx;
|
||||
|
||||
return (HGLRC) ctx;
|
||||
}
|
||||
|
||||
WINGDIAPI HGLRC APIENTRY
|
||||
wglCreateLayerContext(
|
||||
HDC hdc,
|
||||
int iLayerPlane )
|
||||
{
|
||||
(void) hdc;
|
||||
(void) iLayerPlane;
|
||||
return ctx;
|
||||
|
||||
fail:
|
||||
if (visual)
|
||||
_mesa_destroy_visual( visual );
|
||||
|
||||
if (pipe)
|
||||
pipe->destroy( pipe );
|
||||
|
||||
FREE( ctx );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
WINGDIAPI BOOL APIENTRY
|
||||
wglDeleteContext(
|
||||
HGLRC hglrc )
|
||||
|
||||
BOOL
|
||||
stw_delete_context(
|
||||
struct stw_context *hglrc )
|
||||
{
|
||||
struct wgl_context **link = &ctx_head;
|
||||
struct wgl_context *ctx = ctx_head;
|
||||
struct stw_context **link = &ctx_head;
|
||||
struct stw_context *ctx = ctx_head;
|
||||
|
||||
while (ctx != NULL) {
|
||||
if (ctx == (struct wgl_context *) hglrc) {
|
||||
if (ctx == hglrc) {
|
||||
GLcontext *glctx = ctx->st->ctx;
|
||||
GET_CURRENT_CONTEXT( glcurctx );
|
||||
struct stw_framebuffer *fb;
|
||||
|
|
@ -198,24 +193,24 @@ get_window_size( HDC hdc, GLuint *width, GLuint *height )
|
|||
}
|
||||
}
|
||||
|
||||
WINGDIAPI HGLRC APIENTRY
|
||||
wglGetCurrentContext( VOID )
|
||||
struct stw_context *
|
||||
stw_get_current_context( void )
|
||||
{
|
||||
return current_hrc;
|
||||
}
|
||||
|
||||
WINGDIAPI HDC APIENTRY
|
||||
wglGetCurrentDC( VOID )
|
||||
HDC
|
||||
stw_get_current_dc( void )
|
||||
{
|
||||
return current_hdc;
|
||||
}
|
||||
|
||||
WINGDIAPI BOOL APIENTRY
|
||||
wglMakeCurrent(
|
||||
BOOL
|
||||
stw_make_current(
|
||||
HDC hdc,
|
||||
HGLRC hglrc )
|
||||
struct stw_context *hglrc )
|
||||
{
|
||||
struct wgl_context *ctx = ctx_head;
|
||||
struct stw_context *ctx = ctx_head;
|
||||
GET_CURRENT_CONTEXT( glcurctx );
|
||||
struct stw_framebuffer *fb;
|
||||
GLuint width = 0;
|
||||
|
|
@ -230,7 +225,7 @@ wglMakeCurrent(
|
|||
}
|
||||
|
||||
while (ctx != NULL) {
|
||||
if (ctx == (struct wgl_context *) hglrc)
|
||||
if (ctx == hglrc)
|
||||
break;
|
||||
ctx = ctx->next;
|
||||
}
|
||||
|
|
@ -240,7 +235,7 @@ wglMakeCurrent(
|
|||
/* Return if already current.
|
||||
*/
|
||||
if (glcurctx != NULL) {
|
||||
struct wgl_context *curctx = (struct wgl_context *) glcurctx->DriverCtx;
|
||||
struct stw_context *curctx = (struct stw_context *) glcurctx->DriverCtx;
|
||||
|
||||
if (curctx != NULL && curctx == ctx && ctx->hdc == hdc)
|
||||
return TRUE;
|
||||
|
|
@ -279,11 +274,11 @@ wglMakeCurrent(
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
struct wgl_context *
|
||||
wgl_context_from_hdc(
|
||||
struct stw_context *
|
||||
stw_context_from_hdc(
|
||||
HDC hdc )
|
||||
{
|
||||
struct wgl_context *ctx = ctx_head;
|
||||
struct stw_context *ctx = ctx_head;
|
||||
|
||||
while (ctx != NULL) {
|
||||
if (ctx->hdc == hdc)
|
||||
|
|
@ -293,4 +288,5 @@ wgl_context_from_hdc(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
#include "stw_wgl.c"
|
||||
|
||||
|
||||
|
|
@ -25,22 +25,29 @@
|
|||
*
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef WGL_CONTEXT_H
|
||||
#define WGL_CONTEXT_H
|
||||
#ifndef STW_CONTEXT_H
|
||||
#define STW_CONTEXT_H
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
struct st_context;
|
||||
|
||||
struct wgl_context
|
||||
struct stw_context
|
||||
{
|
||||
struct st_context *st;
|
||||
HDC hdc;
|
||||
DWORD color_bits;
|
||||
struct wgl_context *next;
|
||||
struct stw_context *next;
|
||||
};
|
||||
|
||||
struct wgl_context *
|
||||
wgl_context_from_hdc(HDC hdc );
|
||||
struct stw_context *
|
||||
stw_context_from_hdc(HDC hdc );
|
||||
|
||||
#endif /* WGL_CONTEXT_H */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* STW_CONTEXT_H */
|
||||
|
|
@ -30,9 +30,11 @@
|
|||
#include "pipe/p_debug.h"
|
||||
#include "pipe/p_screen.h"
|
||||
|
||||
#include "stw_device.h"
|
||||
#include "stw_winsys.h"
|
||||
#include "stw_pixelformat.h"
|
||||
#include "shared/stw_device.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;
|
||||
|
|
@ -55,7 +57,7 @@ st_flush_frontbuffer(struct pipe_screen *screen,
|
|||
|
||||
|
||||
boolean
|
||||
st_init(const struct stw_winsys *stw_winsys)
|
||||
stw_shared_init(const struct stw_winsys *stw_winsys)
|
||||
{
|
||||
static struct stw_device stw_dev_storage;
|
||||
|
||||
|
|
@ -83,17 +85,7 @@ error1:
|
|||
|
||||
|
||||
void
|
||||
st_cleanup(void)
|
||||
stw_shared_cleanup(void)
|
||||
{
|
||||
DHGLRC dhglrc;
|
||||
|
||||
if(!stw_dev)
|
||||
return;
|
||||
|
||||
/* Ensure all contexts are destroyed */
|
||||
for (dhglrc = 1; dhglrc <= DRV_CONTEXT_MAX; dhglrc++)
|
||||
if (stw_dev->ctx_array[dhglrc - 1].hglrc)
|
||||
DrvDeleteContext( dhglrc );
|
||||
|
||||
stw_dev = NULL;
|
||||
}
|
||||
|
|
@ -29,28 +29,12 @@
|
|||
#define ST_DEVICE_H_
|
||||
|
||||
|
||||
#include "stw_icd.h"
|
||||
|
||||
struct pipe_screen;
|
||||
|
||||
|
||||
struct drv_context
|
||||
{
|
||||
HGLRC hglrc;
|
||||
};
|
||||
|
||||
#define DRV_CONTEXT_MAX 32
|
||||
|
||||
|
||||
struct stw_device
|
||||
{
|
||||
const struct stw_winsys *stw_winsys;
|
||||
|
||||
struct pipe_screen *screen;
|
||||
|
||||
struct drv_context ctx_array[DRV_CONTEXT_MAX];
|
||||
|
||||
DHGLRC ctx_current;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -29,9 +29,14 @@
|
|||
|
||||
#include "main/context.h"
|
||||
#include "pipe/p_format.h"
|
||||
#include "pipe/p_screen.h"
|
||||
#include "state_tracker/st_context.h"
|
||||
#include "state_tracker/st_public.h"
|
||||
#include "stw_framebuffer.h"
|
||||
#include "stw_device.h"
|
||||
#include "stw_public.h"
|
||||
#include "stw_winsys.h"
|
||||
|
||||
|
||||
void
|
||||
framebuffer_resize(
|
||||
|
|
@ -166,7 +171,7 @@ framebuffer_destroy(
|
|||
}
|
||||
}
|
||||
|
||||
/* Given an hdc, return the corresponding wgl_context.
|
||||
/* Given an hdc, return the corresponding stw_framebuffer.
|
||||
*/
|
||||
struct stw_framebuffer *
|
||||
framebuffer_from_hdc(
|
||||
|
|
@ -179,3 +184,29 @@ framebuffer_from_hdc(
|
|||
return fb;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
stw_swap_buffers(
|
||||
HDC hdc )
|
||||
{
|
||||
struct stw_framebuffer *fb;
|
||||
struct pipe_surface *surf;
|
||||
|
||||
fb = framebuffer_from_hdc( hdc );
|
||||
if (fb == NULL)
|
||||
return FALSE;
|
||||
|
||||
/* If we're swapping the buffer associated with the current context
|
||||
* we have to flush any pending rendering commands first.
|
||||
*/
|
||||
st_notify_swapbuffers( fb->stfb );
|
||||
|
||||
st_get_framebuffer_surface( fb->stfb, ST_SURFACE_BACK_LEFT, &surf );
|
||||
|
||||
stw_dev->stw_winsys->flush_frontbuffer(stw_dev->screen,
|
||||
surf,
|
||||
hdc );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -28,8 +28,9 @@
|
|||
#include <windows.h>
|
||||
|
||||
#include "glapi/glapi.h"
|
||||
#include "stw_wgl_arbextensionsstring.h"
|
||||
#include "stw_wgl_arbpixelformat.h"
|
||||
#include "stw_arbextensionsstring.h"
|
||||
#include "stw_arbpixelformat.h"
|
||||
#include "stw_public.h"
|
||||
|
||||
struct extension_entry
|
||||
{
|
||||
|
|
@ -52,8 +53,8 @@ static struct extension_entry extension_entries[] = {
|
|||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
WINGDIAPI PROC APIENTRY
|
||||
wglGetProcAddress(
|
||||
PROC
|
||||
stw_get_proc_address(
|
||||
LPCSTR lpszProc )
|
||||
{
|
||||
struct extension_entry *entry;
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
*
|
||||
* 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
|
||||
|
|
@ -10,11 +10,11 @@
|
|||
* 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.
|
||||
|
|
@ -22,87 +22,110 @@
|
|||
* 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 <windows.h>
|
||||
|
||||
#include "pipe/p_compiler.h"
|
||||
#include "pipe/p_debug.h"
|
||||
#include "stw_pixelformat.h"
|
||||
#include "stw_wgl.h"
|
||||
#include "stw_public.h"
|
||||
|
||||
#define MAX_PIXELFORMATS 16
|
||||
|
||||
static struct pixelformat_info pixelformats[MAX_PIXELFORMATS];
|
||||
static uint pixelformat_count = 0;
|
||||
static uint pixelformat_extended_count = 0;
|
||||
|
||||
static uint currentpixelformat = 0;
|
||||
|
||||
WINGDIAPI int APIENTRY
|
||||
wglChoosePixelFormat(
|
||||
HDC hdc,
|
||||
CONST PIXELFORMATDESCRIPTOR *ppfd )
|
||||
|
||||
static void
|
||||
add_standard_pixelformats(
|
||||
struct pixelformat_info **ppf,
|
||||
uint flags )
|
||||
{
|
||||
uint count;
|
||||
uint index;
|
||||
uint bestindex;
|
||||
uint bestdelta;
|
||||
struct pixelformat_info *pf = *ppf;
|
||||
struct pixelformat_color_info color24 = { 8, 0, 8, 8, 8, 16 };
|
||||
struct pixelformat_alpha_info alpha8 = { 8, 24 };
|
||||
struct pixelformat_alpha_info noalpha = { 0, 0 };
|
||||
struct pixelformat_depth_info depth24s8 = { 24, 8 };
|
||||
struct pixelformat_depth_info depth16 = { 16, 0 };
|
||||
|
||||
(void) hdc;
|
||||
pf->flags = PF_FLAG_DOUBLEBUFFER | flags;
|
||||
pf->color = color24;
|
||||
pf->alpha = alpha8;
|
||||
pf->depth = depth16;
|
||||
pf++;
|
||||
|
||||
count = pixelformat_get_count();
|
||||
bestindex = count;
|
||||
bestdelta = 0xffffffff;
|
||||
pf->flags = PF_FLAG_DOUBLEBUFFER | flags;
|
||||
pf->color = color24;
|
||||
pf->alpha = alpha8;
|
||||
pf->depth = depth24s8;
|
||||
pf++;
|
||||
|
||||
if (ppfd->nSize != sizeof( PIXELFORMATDESCRIPTOR ) || ppfd->nVersion != 1)
|
||||
return 0;
|
||||
if (ppfd->iPixelType != PFD_TYPE_RGBA)
|
||||
return 0;
|
||||
if (!(ppfd->dwFlags & PFD_DRAW_TO_WINDOW))
|
||||
return 0;
|
||||
if (!(ppfd->dwFlags & PFD_SUPPORT_OPENGL))
|
||||
return 0;
|
||||
if (ppfd->dwFlags & PFD_DRAW_TO_BITMAP)
|
||||
return 0;
|
||||
if (ppfd->dwFlags & PFD_SUPPORT_GDI)
|
||||
return 0;
|
||||
if (!(ppfd->dwFlags & PFD_STEREO_DONTCARE) && (ppfd->dwFlags & PFD_STEREO))
|
||||
return 0;
|
||||
pf->flags = PF_FLAG_DOUBLEBUFFER | flags;
|
||||
pf->color = color24;
|
||||
pf->alpha = noalpha;
|
||||
pf->depth = depth16;
|
||||
pf++;
|
||||
|
||||
for (index = 0; index < count; index++) {
|
||||
uint delta = 0;
|
||||
const struct pixelformat_info *pf = pixelformat_get_info( index );
|
||||
pf->flags = PF_FLAG_DOUBLEBUFFER | flags;
|
||||
pf->color = color24;
|
||||
pf->alpha = noalpha;
|
||||
pf->depth = depth24s8;
|
||||
pf++;
|
||||
|
||||
if (!(ppfd->dwFlags & PFD_DOUBLEBUFFER_DONTCARE)) {
|
||||
if ((ppfd->dwFlags & PFD_DOUBLEBUFFER) && !(pf->flags & PF_FLAG_DOUBLEBUFFER))
|
||||
continue;
|
||||
if (!(ppfd->dwFlags & PFD_DOUBLEBUFFER) && (pf->flags & PF_FLAG_DOUBLEBUFFER))
|
||||
continue;
|
||||
}
|
||||
pf->flags = flags;
|
||||
pf->color = color24;
|
||||
pf->alpha = noalpha;
|
||||
pf->depth = depth16;
|
||||
pf++;
|
||||
|
||||
if (ppfd->cColorBits != pf->color.redbits + pf->color.greenbits + pf->color.bluebits)
|
||||
delta += 8;
|
||||
pf->flags = flags;
|
||||
pf->color = color24;
|
||||
pf->alpha = noalpha;
|
||||
pf->depth = depth24s8;
|
||||
pf++;
|
||||
|
||||
if (ppfd->cDepthBits != pf->depth.depthbits)
|
||||
delta += 4;
|
||||
|
||||
if (ppfd->cStencilBits != pf->depth.stencilbits)
|
||||
delta += 2;
|
||||
|
||||
if (ppfd->cAlphaBits != pf->alpha.alphabits)
|
||||
delta++;
|
||||
|
||||
if (delta < bestdelta) {
|
||||
bestindex = index;
|
||||
bestdelta = delta;
|
||||
if (bestdelta == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (bestindex == count)
|
||||
return 0;
|
||||
return bestindex + 1;
|
||||
*ppf = pf;
|
||||
}
|
||||
|
||||
WINGDIAPI int APIENTRY
|
||||
wglDescribePixelFormat(
|
||||
void
|
||||
pixelformat_init( void )
|
||||
{
|
||||
struct pixelformat_info *pf = pixelformats;
|
||||
|
||||
add_standard_pixelformats( &pf, 0 );
|
||||
pixelformat_count = pf - pixelformats;
|
||||
|
||||
add_standard_pixelformats( &pf, PF_FLAG_MULTISAMPLED );
|
||||
pixelformat_extended_count = pf - pixelformats;
|
||||
|
||||
assert( pixelformat_extended_count <= MAX_PIXELFORMATS );
|
||||
}
|
||||
|
||||
uint
|
||||
pixelformat_get_count( void )
|
||||
{
|
||||
return pixelformat_count;
|
||||
}
|
||||
|
||||
uint
|
||||
pixelformat_get_extended_count( void )
|
||||
{
|
||||
return pixelformat_extended_count;
|
||||
}
|
||||
|
||||
const struct pixelformat_info *
|
||||
pixelformat_get_info( uint index )
|
||||
{
|
||||
assert( index < pixelformat_extended_count );
|
||||
|
||||
return &pixelformats[index];
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
stw_pixelformat_describe(
|
||||
HDC hdc,
|
||||
int iPixelFormat,
|
||||
UINT nBytes,
|
||||
|
|
@ -156,32 +179,100 @@ wglDescribePixelFormat(
|
|||
return count;
|
||||
}
|
||||
|
||||
WINGDIAPI int APIENTRY
|
||||
wglGetPixelFormat(
|
||||
HDC hdc )
|
||||
/* Only used by the wgl code, but have it here to avoid exporting the
|
||||
* pixelformat.h functionality.
|
||||
*/
|
||||
int stw_pixelformat_choose( HDC hdc,
|
||||
CONST PIXELFORMATDESCRIPTOR *ppfd )
|
||||
{
|
||||
uint count;
|
||||
uint index;
|
||||
uint bestindex;
|
||||
uint bestdelta;
|
||||
|
||||
(void) hdc;
|
||||
|
||||
count = pixelformat_get_count();
|
||||
bestindex = count;
|
||||
bestdelta = 0xffffffff;
|
||||
|
||||
for (index = 0; index < count; index++) {
|
||||
uint delta = 0;
|
||||
const struct pixelformat_info *pf = pixelformat_get_info( index );
|
||||
|
||||
if (!(ppfd->dwFlags & PFD_DOUBLEBUFFER_DONTCARE) &&
|
||||
!!(ppfd->dwFlags & PFD_DOUBLEBUFFER) !=
|
||||
!!(pf->flags & PF_FLAG_DOUBLEBUFFER))
|
||||
continue;
|
||||
|
||||
if (ppfd->cColorBits != pf->color.redbits + pf->color.greenbits + pf->color.bluebits)
|
||||
delta += 8;
|
||||
|
||||
if (ppfd->cDepthBits != pf->depth.depthbits)
|
||||
delta += 4;
|
||||
|
||||
if (ppfd->cStencilBits != pf->depth.stencilbits)
|
||||
delta += 2;
|
||||
|
||||
if (ppfd->cAlphaBits != pf->alpha.alphabits)
|
||||
delta++;
|
||||
|
||||
if (delta < bestdelta) {
|
||||
bestindex = index;
|
||||
bestdelta = delta;
|
||||
if (bestdelta == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (bestindex == count)
|
||||
return 0;
|
||||
|
||||
return bestindex + 1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
stw_pixelformat_get(
|
||||
HDC hdc )
|
||||
{
|
||||
return currentpixelformat;
|
||||
}
|
||||
|
||||
WINGDIAPI BOOL APIENTRY
|
||||
wglSetPixelFormat(
|
||||
|
||||
BOOL
|
||||
stw_pixelformat_set(
|
||||
HDC hdc,
|
||||
int iPixelFormat,
|
||||
const PIXELFORMATDESCRIPTOR *ppfd )
|
||||
int iPixelFormat )
|
||||
{
|
||||
uint count;
|
||||
uint index;
|
||||
|
||||
(void) hdc;
|
||||
|
||||
count = pixelformat_get_extended_count();
|
||||
index = (uint) iPixelFormat - 1;
|
||||
|
||||
if (index >= count || ppfd->nSize != sizeof( PIXELFORMATDESCRIPTOR ))
|
||||
count = pixelformat_get_extended_count();
|
||||
if (index >= count)
|
||||
return FALSE;
|
||||
|
||||
currentpixelformat = index + 1;
|
||||
currentpixelformat = iPixelFormat;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* XXX: this needs to be turned into queries on pipe_screen or
|
||||
* stw_winsys.
|
||||
*/
|
||||
int
|
||||
stw_query_sample_buffers( void )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
stw_query_samples( void )
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
|
||||
|
|
@ -28,6 +28,9 @@
|
|||
#ifndef PIXELFORMAT_H
|
||||
#define PIXELFORMAT_H
|
||||
|
||||
#include <windows.h>
|
||||
#include "pipe/p_compiler.h"
|
||||
|
||||
#define PF_FLAG_DOUBLEBUFFER 0x00000001
|
||||
#define PF_FLAG_MULTISAMPLED 0x00000002
|
||||
|
||||
|
|
@ -73,4 +76,8 @@ pixelformat_get_extended_count( void );
|
|||
const struct pixelformat_info *
|
||||
pixelformat_get_info( uint index );
|
||||
|
||||
int stw_query_sample_buffers( void );
|
||||
int stw_query_samples( void );
|
||||
|
||||
|
||||
#endif /* PIXELFORMAT_H */
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* Copyright 2009 VMware, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
|
|
@ -25,49 +25,51 @@
|
|||
*
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef STW_PUBLIC_H
|
||||
#define STW_PUBLIC_H
|
||||
|
||||
#include <windows.h>
|
||||
#include "pipe/p_compiler.h"
|
||||
|
||||
#include "pipe/p_screen.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "state_tracker/st_context.h"
|
||||
#include "state_tracker/st_public.h"
|
||||
#include "stw_winsys.h"
|
||||
#include "stw_device.h"
|
||||
#include "stw_framebuffer.h"
|
||||
#include "stw_wgl.h"
|
||||
struct stw_winsys;
|
||||
struct stw_context;
|
||||
|
||||
WINGDIAPI BOOL APIENTRY
|
||||
wglSwapBuffers(
|
||||
HDC hdc )
|
||||
{
|
||||
struct stw_framebuffer *fb;
|
||||
struct pipe_surface *surf;
|
||||
boolean
|
||||
st_shared_init(const struct stw_winsys *stw_winsys);
|
||||
|
||||
fb = framebuffer_from_hdc( hdc );
|
||||
if (fb == NULL)
|
||||
return FALSE;
|
||||
void
|
||||
st_shared_cleanup(void);
|
||||
|
||||
/* If we're swapping the buffer associated with the current context
|
||||
* we have to flush any pending rendering commands first.
|
||||
*/
|
||||
st_notify_swapbuffers( fb->stfb );
|
||||
|
||||
st_get_framebuffer_surface( fb->stfb, ST_SURFACE_BACK_LEFT, &surf );
|
||||
BOOL stw_copy_context( struct stw_context *src,
|
||||
struct stw_context *dst,
|
||||
UINT mask );
|
||||
|
||||
stw_dev->stw_winsys->flush_frontbuffer(stw_dev->screen,
|
||||
surf,
|
||||
hdc );
|
||||
struct stw_context *stw_create_context( HDC hdc, int iLayerPlane );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
BOOL stw_delete_context( struct stw_context *ctx );
|
||||
|
||||
WINGDIAPI BOOL APIENTRY
|
||||
wglSwapLayerBuffers(
|
||||
HDC hdc,
|
||||
UINT fuPlanes )
|
||||
{
|
||||
(void) hdc;
|
||||
(void) fuPlanes;
|
||||
struct stw_context *stw_get_current_context( void );
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
HDC stw_get_current_dc( void );
|
||||
|
||||
BOOL stw_make_current( HDC hdc, struct stw_context *ctx );
|
||||
|
||||
BOOL stw_swap_buffers( HDC hdc );
|
||||
|
||||
PROC stw_get_proc_address( LPCSTR lpszProc );
|
||||
|
||||
int stw_pixelformat_describe( HDC hdc,
|
||||
int iPixelFormat,
|
||||
UINT nBytes,
|
||||
LPPIXELFORMATDESCRIPTOR ppfd );
|
||||
|
||||
int stw_pixelformat_get( HDC hdc );
|
||||
|
||||
BOOL stw_pixelformat_set( HDC hdc,
|
||||
int iPixelFormat );
|
||||
|
||||
int stw_pixelformat_choose( HDC hdc,
|
||||
CONST PIXELFORMATDESCRIPTOR *ppfd );
|
||||
|
||||
#endif
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
*
|
||||
* 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
|
||||
|
|
@ -10,11 +10,11 @@
|
|||
* 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.
|
||||
|
|
@ -22,20 +22,36 @@
|
|||
* 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 <windows.h>
|
||||
#include "stw_wgl_arbmultisample.h"
|
||||
#include "stw.h"
|
||||
#include "shared/stw_winsys.h"
|
||||
|
||||
int
|
||||
wgl_query_sample_buffers( void )
|
||||
boolean
|
||||
st_init(const struct stw_winsys *stw_winsys)
|
||||
{
|
||||
return 1;
|
||||
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;
|
||||
}
|
||||
|
||||
int
|
||||
wgl_query_samples( void )
|
||||
|
||||
void
|
||||
st_cleanup(void)
|
||||
{
|
||||
return 4;
|
||||
stw_icd_cleanup();
|
||||
stw_shared_cleanup();
|
||||
stw_wgl_cleanup();
|
||||
}
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
*
|
||||
* 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
|
||||
|
|
@ -10,11 +10,11 @@
|
|||
* 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.
|
||||
|
|
@ -22,19 +22,32 @@
|
|||
* 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 WGL_ARBMULTISAMPLE_H
|
||||
#define WGL_ARBMULTISAMPLE_H
|
||||
#ifndef STW_H
|
||||
#define STW_H
|
||||
|
||||
#define WGL_SAMPLE_BUFFERS_ARB 0x2041
|
||||
#define WGL_SAMPLES_ARB 0x2042
|
||||
#include "pipe/p_compiler.h"
|
||||
|
||||
int
|
||||
wgl_query_sample_buffers( void );
|
||||
struct stw_winsys;
|
||||
|
||||
int
|
||||
wgl_query_samples( void );
|
||||
/* Public interface:
|
||||
*/
|
||||
boolean stw_init( const struct stw_winsys *stw_winsys );
|
||||
void stw_cleanup( void );
|
||||
|
||||
#endif /* WGL_ARBMULTISAMPLE_H */
|
||||
|
||||
|
||||
/* 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 */
|
||||
|
|
@ -28,6 +28,160 @@
|
|||
#include <windows.h>
|
||||
|
||||
#include "pipe/p_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
|
||||
wglCopyContext(
|
||||
HGLRC hglrcSrc,
|
||||
HGLRC hglrcDst,
|
||||
UINT mask )
|
||||
{
|
||||
return stw_copy_context( stw_context(hglrcSrc),
|
||||
stw_context(hglrcDst),
|
||||
mask );
|
||||
}
|
||||
|
||||
WINGDIAPI HGLRC APIENTRY
|
||||
wglCreateContext(
|
||||
HDC hdc )
|
||||
{
|
||||
return (HGLRC) stw_create_context( hdc, 0 );
|
||||
}
|
||||
|
||||
WINGDIAPI HGLRC APIENTRY
|
||||
wglCreateLayerContext(
|
||||
HDC hdc,
|
||||
int iLayerPlane )
|
||||
{
|
||||
return (HGLRC) stw_create_context( hdc, iLayerPlane );
|
||||
}
|
||||
|
||||
WINGDIAPI BOOL APIENTRY
|
||||
wglDeleteContext(
|
||||
HGLRC hglrc )
|
||||
{
|
||||
return stw_delete_context( stw_context(hglrc) );
|
||||
}
|
||||
|
||||
|
||||
WINGDIAPI HGLRC APIENTRY
|
||||
wglGetCurrentContext( VOID )
|
||||
{
|
||||
return (HGLRC) stw_get_current_context();
|
||||
}
|
||||
|
||||
WINGDIAPI HDC APIENTRY
|
||||
wglGetCurrentDC( VOID )
|
||||
{
|
||||
return stw_get_current_dc();
|
||||
}
|
||||
|
||||
WINGDIAPI BOOL APIENTRY
|
||||
wglMakeCurrent(
|
||||
HDC hdc,
|
||||
HGLRC hglrc )
|
||||
{
|
||||
return stw_make_current( hdc, stw_context(hglrc) );
|
||||
}
|
||||
|
||||
|
||||
WINGDIAPI BOOL APIENTRY
|
||||
wglSwapBuffers(
|
||||
HDC hdc )
|
||||
{
|
||||
return stw_swap_buffers( hdc );
|
||||
}
|
||||
|
||||
|
||||
WINGDIAPI BOOL APIENTRY
|
||||
wglSwapLayerBuffers(
|
||||
HDC hdc,
|
||||
UINT fuPlanes )
|
||||
{
|
||||
(void) hdc;
|
||||
(void) fuPlanes;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
WINGDIAPI PROC APIENTRY
|
||||
wglGetProcAddress(
|
||||
LPCSTR lpszProc )
|
||||
{
|
||||
return stw_get_proc_address( lpszProc );
|
||||
}
|
||||
|
||||
|
||||
WINGDIAPI int APIENTRY
|
||||
wglChoosePixelFormat(
|
||||
HDC hdc,
|
||||
CONST PIXELFORMATDESCRIPTOR *ppfd )
|
||||
{
|
||||
if (ppfd->nSize != sizeof( PIXELFORMATDESCRIPTOR ) || ppfd->nVersion != 1)
|
||||
return 0;
|
||||
if (ppfd->iPixelType != PFD_TYPE_RGBA)
|
||||
return 0;
|
||||
if (!(ppfd->dwFlags & PFD_DRAW_TO_WINDOW))
|
||||
return 0;
|
||||
if (!(ppfd->dwFlags & PFD_SUPPORT_OPENGL))
|
||||
return 0;
|
||||
if (ppfd->dwFlags & PFD_DRAW_TO_BITMAP)
|
||||
return 0;
|
||||
if (ppfd->dwFlags & PFD_SUPPORT_GDI)
|
||||
return 0;
|
||||
if (!(ppfd->dwFlags & PFD_STEREO_DONTCARE) && (ppfd->dwFlags & PFD_STEREO))
|
||||
return 0;
|
||||
|
||||
return stw_pixelformat_choose( hdc, ppfd );
|
||||
}
|
||||
|
||||
WINGDIAPI int APIENTRY
|
||||
wglDescribePixelFormat(
|
||||
HDC hdc,
|
||||
int iPixelFormat,
|
||||
UINT nBytes,
|
||||
LPPIXELFORMATDESCRIPTOR ppfd )
|
||||
{
|
||||
return stw_pixelformat_describe( hdc, iPixelFormat, nBytes, ppfd );
|
||||
}
|
||||
|
||||
WINGDIAPI int APIENTRY
|
||||
wglGetPixelFormat(
|
||||
HDC hdc )
|
||||
{
|
||||
return stw_pixelformat_get( hdc );
|
||||
}
|
||||
|
||||
WINGDIAPI BOOL APIENTRY
|
||||
wglSetPixelFormat(
|
||||
HDC hdc,
|
||||
int iPixelFormat,
|
||||
const PIXELFORMATDESCRIPTOR *ppfd )
|
||||
{
|
||||
if (ppfd->nSize != sizeof( PIXELFORMATDESCRIPTOR ))
|
||||
return FALSE;
|
||||
|
||||
return stw_pixelformat_set( hdc, iPixelFormat );
|
||||
}
|
||||
|
||||
|
||||
WINGDIAPI BOOL APIENTRY
|
||||
wglUseFontBitmapsA(
|
||||
|
|
@ -341,5 +341,3 @@ if env['platform'] != 'winddk':
|
|||
)
|
||||
Export('glapi')
|
||||
|
||||
if platform == 'windows':
|
||||
SConscript('state_tracker/wgl/SConscript')
|
||||
|
|
|
|||
|
|
@ -1,120 +0,0 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#include "pipe/p_debug.h"
|
||||
#include "stw_pixelformat.h"
|
||||
|
||||
#define MAX_PIXELFORMATS 16
|
||||
|
||||
static struct pixelformat_info pixelformats[MAX_PIXELFORMATS];
|
||||
static uint pixelformat_count = 0;
|
||||
static uint pixelformat_extended_count = 0;
|
||||
|
||||
static void
|
||||
add_standard_pixelformats(
|
||||
struct pixelformat_info **ppf,
|
||||
uint flags )
|
||||
{
|
||||
struct pixelformat_info *pf = *ppf;
|
||||
struct pixelformat_color_info color24 = { 8, 0, 8, 8, 8, 16 };
|
||||
struct pixelformat_alpha_info alpha8 = { 8, 24 };
|
||||
struct pixelformat_alpha_info noalpha = { 0, 0 };
|
||||
struct pixelformat_depth_info depth24s8 = { 24, 8 };
|
||||
struct pixelformat_depth_info depth16 = { 16, 0 };
|
||||
|
||||
pf->flags = PF_FLAG_DOUBLEBUFFER | flags;
|
||||
pf->color = color24;
|
||||
pf->alpha = alpha8;
|
||||
pf->depth = depth16;
|
||||
pf++;
|
||||
|
||||
pf->flags = PF_FLAG_DOUBLEBUFFER | flags;
|
||||
pf->color = color24;
|
||||
pf->alpha = alpha8;
|
||||
pf->depth = depth24s8;
|
||||
pf++;
|
||||
|
||||
pf->flags = PF_FLAG_DOUBLEBUFFER | flags;
|
||||
pf->color = color24;
|
||||
pf->alpha = noalpha;
|
||||
pf->depth = depth16;
|
||||
pf++;
|
||||
|
||||
pf->flags = PF_FLAG_DOUBLEBUFFER | flags;
|
||||
pf->color = color24;
|
||||
pf->alpha = noalpha;
|
||||
pf->depth = depth24s8;
|
||||
pf++;
|
||||
|
||||
pf->flags = flags;
|
||||
pf->color = color24;
|
||||
pf->alpha = noalpha;
|
||||
pf->depth = depth16;
|
||||
pf++;
|
||||
|
||||
pf->flags = flags;
|
||||
pf->color = color24;
|
||||
pf->alpha = noalpha;
|
||||
pf->depth = depth24s8;
|
||||
pf++;
|
||||
|
||||
*ppf = pf;
|
||||
}
|
||||
|
||||
void
|
||||
pixelformat_init( void )
|
||||
{
|
||||
struct pixelformat_info *pf = pixelformats;
|
||||
|
||||
add_standard_pixelformats( &pf, 0 );
|
||||
pixelformat_count = pf - pixelformats;
|
||||
|
||||
add_standard_pixelformats( &pf, PF_FLAG_MULTISAMPLED );
|
||||
pixelformat_extended_count = pf - pixelformats;
|
||||
|
||||
assert( pixelformat_extended_count <= MAX_PIXELFORMATS );
|
||||
}
|
||||
|
||||
uint
|
||||
pixelformat_get_count( void )
|
||||
{
|
||||
return pixelformat_count;
|
||||
}
|
||||
|
||||
uint
|
||||
pixelformat_get_extended_count( void )
|
||||
{
|
||||
return pixelformat_extended_count;
|
||||
}
|
||||
|
||||
const struct pixelformat_info *
|
||||
pixelformat_get_info( uint index )
|
||||
{
|
||||
assert( index < pixelformat_extended_count );
|
||||
|
||||
return &pixelformats[index];
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue