Merge branch 'mesa_7_5_branch'

This commit is contained in:
Brian Paul
2009-06-01 15:01:33 -06:00
18 changed files with 385 additions and 251 deletions

View File

@@ -80,25 +80,26 @@ clean:
-rm -f *.o *~ -rm -f *.o *~
-rm -f extfuncs.h -rm -f extfuncs.h
-rm -f shaderutil.* -rm -f shaderutil.*
-rm -f readtex.*
##### Extra dependencies ##### Extra dependencies
extfuncs.h: extfuncs.h: $(TOP)/progs/util/extfuncs.h
cp $(TOP)/progs/util/extfuncs.h . cp $< .
readtex.c: readtex.c: $(TOP)/progs/util/readtex.c
cp $(TOP)/progs/util/readtex.c . cp $< .
readtex.h: readtex.h: $(TOP)/progs/util/readtex.h
cp $(TOP)/progs/util/readtex.h . cp $< .
shaderutil.c: shaderutil.c: $(TOP)/progs/util/shaderutil.c
cp $(TOP)/progs/util/shaderutil.c . cp $< .
shaderutil.h: shaderutil.h: $(TOP)/progs/util/shaderutil.h
cp $(TOP)/progs/util/shaderutil.h . cp $< .

View File

@@ -253,6 +253,7 @@ static void widepoint_flush( struct draw_stage *stage, unsigned flags )
{ {
stage->point = widepoint_first_point; stage->point = widepoint_first_point;
stage->next->flush( stage->next, flags ); stage->next->flush( stage->next, flags );
stage->draw->extra_vp_outputs.slot = 0;
} }

View File

@@ -54,7 +54,15 @@ DrvCreateLayerContext(
HDC hdc, HDC hdc,
INT iLayerPlane ) INT iLayerPlane )
{ {
return stw_create_layer_context( hdc, iLayerPlane ); DHGLRC r;
r = stw_create_layer_context( hdc, iLayerPlane );
if (DBG)
debug_printf( "%s( %p, %i ) = %u\n",
__FUNCTION__, hdc, iLayerPlane, r );
return r;
} }
DHGLRC APIENTRY DHGLRC APIENTRY
@@ -68,7 +76,15 @@ BOOL APIENTRY
DrvDeleteContext( DrvDeleteContext(
DHGLRC dhglrc ) DHGLRC dhglrc )
{ {
return stw_delete_context( dhglrc ); BOOL r;
r = stw_delete_context( dhglrc );
if (DBG)
debug_printf( "%s( %u ) = %u\n",
__FUNCTION__, dhglrc, r );
return r;
} }
BOOL APIENTRY BOOL APIENTRY
@@ -126,7 +142,7 @@ DrvGetProcAddress(
r = stw_get_proc_address( lpszProc ); r = stw_get_proc_address( lpszProc );
if (DBG) if (DBG)
debug_printf( "%s( \", __FUNCTION__%s\" ) = %p\n", lpszProc, r ); debug_printf( "%s( \"%s\" ) = %p\n", __FUNCTION__, lpszProc, r );
return r; return r;
} }
@@ -515,14 +531,16 @@ DrvSetContext(
DHGLRC dhglrc, DHGLRC dhglrc,
PFN_SETPROCTABLE pfnSetProcTable ) PFN_SETPROCTABLE pfnSetProcTable )
{ {
if (DBG) PGLCLTPROCTABLE r = (PGLCLTPROCTABLE)&cpt;
debug_printf( "%s( 0x%p, %u, 0x%p )\n",
__FUNCTION__, hdc, dhglrc, pfnSetProcTable );
if (!stw_make_current( hdc, dhglrc )) if (!stw_make_current( hdc, dhglrc ))
return NULL; r = NULL;
return (GLCLTPROCTABLE *)&cpt; if (DBG)
debug_printf( "%s( 0x%p, %u, 0x%p ) = %p\n",
__FUNCTION__, hdc, dhglrc, pfnSetProcTable, r );
return r;
} }
int APIENTRY int APIENTRY

View File

@@ -90,7 +90,7 @@ stw_share_lists(
ctx2 = stw_lookup_context_locked( hglrc2 ); ctx2 = stw_lookup_context_locked( hglrc2 );
if (ctx1 && ctx2 && if (ctx1 && ctx2 &&
ctx1->pfi == ctx2->pfi) { ctx1->iPixelFormat == ctx2->iPixelFormat) {
ret = _mesa_share_state(ctx2->st->ctx, ctx1->st->ctx); ret = _mesa_share_state(ctx2->st->ctx, ctx1->st->ctx);
} }
@@ -104,52 +104,32 @@ stw_create_layer_context(
HDC hdc, HDC hdc,
int iLayerPlane ) int iLayerPlane )
{ {
uint pfi; int iPixelFormat;
const struct stw_pixelformat_info *pf = NULL; const struct stw_pixelformat_info *pfi;
GLvisual visual;
struct stw_context *ctx = NULL; struct stw_context *ctx = NULL;
GLvisual *visual = NULL;
struct pipe_screen *screen = NULL; struct pipe_screen *screen = NULL;
struct pipe_context *pipe = NULL; struct pipe_context *pipe = NULL;
if(!stw_dev) if(!stw_dev)
return 0; return 0;
if (iLayerPlane != 0) if (iLayerPlane != 0)
return 0; return 0;
pfi = stw_pixelformat_get( hdc ); iPixelFormat = GetPixelFormat(hdc);
if (pfi == 0) if(!iPixelFormat)
return 0; return 0;
pf = stw_pixelformat_get_info( pfi - 1 ); pfi = stw_pixelformat_get_info( iPixelFormat - 1 );
stw_pixelformat_visual(&visual, pfi);
ctx = CALLOC_STRUCT( stw_context ); ctx = CALLOC_STRUCT( stw_context );
if (ctx == NULL) if (ctx == NULL)
goto no_ctx; goto no_ctx;
ctx->hdc = hdc; ctx->hdc = hdc;
ctx->color_bits = GetDeviceCaps( ctx->hdc, BITSPIXEL ); ctx->iPixelFormat = iPixelFormat;
/* Create visual based on flags
*/
visual = _mesa_create_visual(
(pf->pfd.iPixelType == PFD_TYPE_RGBA) ? GL_TRUE : GL_FALSE,
(pf->pfd.dwFlags & PFD_DOUBLEBUFFER) ? GL_TRUE : GL_FALSE,
(pf->pfd.dwFlags & PFD_STEREO) ? GL_TRUE : GL_FALSE,
pf->pfd.cRedBits,
pf->pfd.cGreenBits,
pf->pfd.cBlueBits,
pf->pfd.cAlphaBits,
(pf->pfd.iPixelType == PFD_TYPE_COLORINDEX) ? pf->pfd.cColorBits : 0,
pf->pfd.cDepthBits,
pf->pfd.cStencilBits,
pf->pfd.cAccumRedBits,
pf->pfd.cAccumGreenBits,
pf->pfd.cAccumBlueBits,
pf->pfd.cAccumAlphaBits,
pf->numSamples );
if (visual == NULL)
goto no_visual;
screen = stw_dev->screen; screen = stw_dev->screen;
@@ -169,15 +149,15 @@ stw_create_layer_context(
pipe = trace_context_create(stw_dev->screen, pipe); pipe = trace_context_create(stw_dev->screen, pipe);
#endif #endif
/* pass to stw_flush_frontbuffer as context_private */
assert(!pipe->priv); assert(!pipe->priv);
pipe->priv = hdc; pipe->priv = hdc;
ctx->st = st_create_context( pipe, visual, NULL ); ctx->st = st_create_context( pipe, &visual, NULL );
if (ctx->st == NULL) if (ctx->st == NULL)
goto no_st_ctx; goto no_st_ctx;
ctx->st->ctx->DriverCtx = ctx; ctx->st->ctx->DriverCtx = ctx;
ctx->pfi = pf;
pipe_mutex_lock( stw_dev->mutex ); pipe_mutex_lock( stw_dev->mutex );
ctx->hglrc = handle_table_add(stw_dev->ctx_table, ctx); ctx->hglrc = handle_table_add(stw_dev->ctx_table, ctx);
@@ -193,9 +173,7 @@ no_hglrc:
no_st_ctx: no_st_ctx:
pipe->destroy( pipe ); pipe->destroy( pipe );
no_pipe: no_pipe:
_mesa_destroy_visual( visual ); FREE(ctx);
no_visual:
FREE( ctx );
no_ctx: no_ctx:
return 0; return 0;
} }
@@ -218,20 +196,11 @@ stw_delete_context(
if (ctx) { if (ctx) {
GLcontext *glctx = ctx->st->ctx; GLcontext *glctx = ctx->st->ctx;
GET_CURRENT_CONTEXT( glcurctx ); GET_CURRENT_CONTEXT( glcurctx );
struct stw_framebuffer *fb;
/* Unbind current if deleting current context. /* Unbind current if deleting current context. */
*/
if (glcurctx == glctx) if (glcurctx == glctx)
st_make_current( NULL, NULL, NULL ); st_make_current( NULL, NULL, NULL );
fb = stw_framebuffer_from_hdc( ctx->hdc );
if (fb)
stw_framebuffer_destroy( fb );
if (WindowFromDC( ctx->hdc ) != NULL)
ReleaseDC( WindowFromDC( ctx->hdc ), ctx->hdc );
st_destroy_context(ctx->st); st_destroy_context(ctx->st);
FREE(ctx); FREE(ctx);
@@ -275,34 +244,6 @@ stw_release_context(
return TRUE; return TRUE;
} }
/* Find the width and height of the window named by hdc.
*/
static void
stw_get_window_size( HDC hdc, GLuint *pwidth, GLuint *pheight )
{
GLuint width, height;
HWND hwnd;
hwnd = WindowFromDC( hdc );
if (hwnd) {
RECT rect;
GetClientRect( hwnd, &rect );
width = rect.right - rect.left;
height = rect.bottom - rect.top;
}
else {
width = GetDeviceCaps( hdc, HORZRES );
height = GetDeviceCaps( hdc, VERTRES );
}
if(width < 1)
width = 1;
if(height < 1)
height = 1;
*pwidth = width;
*pheight = height;
}
UINT_PTR UINT_PTR
stw_get_current_context( void ) stw_get_current_context( void )
@@ -346,64 +287,68 @@ stw_make_current(
struct stw_context *ctx; struct stw_context *ctx;
GET_CURRENT_CONTEXT( glcurctx ); GET_CURRENT_CONTEXT( glcurctx );
struct stw_framebuffer *fb; struct stw_framebuffer *fb;
GLuint width = 0;
GLuint height = 0;
struct stw_context *curctx = NULL;
if (!stw_dev) if (!stw_dev)
return FALSE; goto fail;
pipe_mutex_lock( stw_dev->mutex );
ctx = stw_lookup_context_locked( hglrc );
pipe_mutex_unlock( stw_dev->mutex );
if (glcurctx != NULL) { if (glcurctx != NULL) {
struct stw_context *curctx;
curctx = (struct stw_context *) glcurctx->DriverCtx; curctx = (struct stw_context *) glcurctx->DriverCtx;
if (curctx != ctx) if (curctx->hglrc != hglrc)
st_flush(glcurctx->st, PIPE_FLUSH_RENDER_CACHE, NULL); st_flush(glcurctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
}
/* Return if already current. */
if (hdc == NULL || hglrc == 0) { if (curctx->hglrc == hglrc && curctx->hdc == hdc)
st_make_current( NULL, NULL, NULL );
return TRUE;
}
/* Return if already current.
*/
if (glcurctx != NULL) {
if (curctx != NULL && curctx == ctx && ctx->hdc == hdc)
return TRUE; return TRUE;
} }
fb = stw_framebuffer_from_hdc( hdc ); if (hdc == NULL || hglrc == 0) {
return st_make_current( NULL, NULL, NULL );
if (hdc != NULL)
stw_get_window_size( hdc, &width, &height );
/* Lazy creation of stw_framebuffers.
*/
if (fb == NULL && ctx != NULL && hdc != NULL) {
GLvisual *visual = &ctx->st->ctx->Visual;
fb = stw_framebuffer_create( hdc, visual, ctx->pfi, width, height );
if (fb == NULL)
return FALSE;
} }
if (ctx && fb) { pipe_mutex_lock( stw_dev->mutex );
pipe_mutex_lock( fb->mutex );
st_make_current( ctx->st, fb->stfb, fb->stfb );
st_resize_framebuffer( fb->stfb, width, height );
pipe_mutex_unlock( fb->mutex );
ctx->hdc = hdc; ctx = stw_lookup_context_locked( hglrc );
ctx->st->pipe->priv = hdc; if(!ctx)
} goto fail;
else {
/* Detach */
st_make_current( NULL, NULL, NULL );
}
fb = stw_framebuffer_from_hdc_locked( hdc );
if(!fb) {
/* Applications should call SetPixelFormat before creating a context,
* but not all do, and the opengl32 runtime seems to use a default pixel
* format in some cases, so we must create a framebuffer for those here
*/
int iPixelFormat = GetPixelFormat(hdc);
if(iPixelFormat)
fb = stw_framebuffer_create_locked( hdc, iPixelFormat );
if(!fb)
goto fail;
}
pipe_mutex_unlock( stw_dev->mutex );
if(fb->iPixelFormat != ctx->iPixelFormat)
goto fail;
/* Lazy allocation of the frame buffer */
if(!stw_framebuffer_allocate(fb))
goto fail;
/* Bind the new framebuffer */
ctx->hdc = hdc;
/* pass to stw_flush_frontbuffer as context_private */
ctx->st->pipe->priv = hdc;
if(!st_make_current( ctx->st, fb->stfb, fb->stfb ))
goto fail;
stw_framebuffer_resize(fb);
return TRUE; return TRUE;
fail:
st_make_current( NULL, NULL, NULL );
return FALSE;
} }

View File

@@ -31,15 +31,13 @@
#include <windows.h> #include <windows.h>
struct st_context; struct st_context;
struct stw_pixelformat_info;
struct stw_context struct stw_context
{ {
struct st_context *st; struct st_context *st;
UINT_PTR hglrc; UINT_PTR hglrc;
int iPixelFormat;
HDC hdc; HDC hdc;
DWORD color_bits;
const struct stw_pixelformat_info *pfi;
}; };
#endif /* STW_CONTEXT_H */ #endif /* STW_CONTEXT_H */

View File

@@ -57,7 +57,7 @@ struct stw_device *stw_dev = NULL;
* stw_winsys::flush_front_buffer. * stw_winsys::flush_front_buffer.
*/ */
static void static void
st_flush_frontbuffer(struct pipe_screen *screen, stw_flush_frontbuffer(struct pipe_screen *screen,
struct pipe_surface *surface, struct pipe_surface *surface,
void *context_private ) void *context_private )
{ {
@@ -111,7 +111,7 @@ stw_init(const struct stw_winsys *stw_winsys)
stw_dev->screen = screen; stw_dev->screen = screen;
#endif #endif
stw_dev->screen->flush_frontbuffer = st_flush_frontbuffer; stw_dev->screen->flush_frontbuffer = &stw_flush_frontbuffer;
pipe_mutex_init( stw_dev->mutex ); pipe_mutex_init( stw_dev->mutex );
@@ -173,6 +173,8 @@ stw_cleanup(void)
} }
pipe_mutex_unlock( stw_dev->mutex ); pipe_mutex_unlock( stw_dev->mutex );
stw_framebuffer_cleanup();
pipe_mutex_destroy( stw_dev->mutex ); pipe_mutex_destroy( stw_dev->mutex );
stw_dev->screen->destroy(stw_dev->screen); stw_dev->screen->destroy(stw_dev->screen);

View File

@@ -94,81 +94,137 @@ stw_call_window_proc(
} }
/* Create a new framebuffer object which will correspond to the given HDC. /**
* Create a new framebuffer object which will correspond to the given HDC.
*/ */
struct stw_framebuffer * struct stw_framebuffer *
stw_framebuffer_create( stw_framebuffer_create_locked(
HDC hdc, HDC hdc,
GLvisual *visual, int iPixelFormat )
const struct stw_pixelformat_info *pfi,
GLuint width,
GLuint height )
{ {
enum pipe_format colorFormat, depthFormat, stencilFormat; HWND hWnd;
struct stw_framebuffer *fb; struct stw_framebuffer *fb;
const struct stw_pixelformat_info *pfi;
colorFormat = pfi->color_format; /* We only support drawing to a window. */
hWnd = WindowFromDC( hdc );
if(!hWnd)
return NULL;
assert(pf_layout( pfi->depth_stencil_format ) == PIPE_FORMAT_LAYOUT_RGBAZS );
if(pf_get_component_bits( pfi->depth_stencil_format, PIPE_FORMAT_COMP_Z ))
depthFormat = pfi->depth_stencil_format;
else
depthFormat = PIPE_FORMAT_NONE;
if(pf_get_component_bits( pfi->depth_stencil_format, PIPE_FORMAT_COMP_S ))
stencilFormat = pfi->depth_stencil_format;
else
stencilFormat = PIPE_FORMAT_NONE;
fb = CALLOC_STRUCT( stw_framebuffer ); fb = CALLOC_STRUCT( stw_framebuffer );
if (fb == NULL) if (fb == NULL)
return NULL; return NULL;
fb->hDC = hdc; fb->hDC = hdc;
fb->hWnd = WindowFromDC( hdc ); fb->hWnd = hWnd;
fb->iPixelFormat = iPixelFormat;
fb->pfi = pfi = stw_pixelformat_get_info( iPixelFormat - 1 );
stw_pixelformat_visual(&fb->visual, pfi);
pipe_mutex_init( fb->mutex ); pipe_mutex_init( fb->mutex );
fb->stfb = st_create_framebuffer(
visual,
colorFormat,
depthFormat,
stencilFormat,
width,
height,
(void *) fb );
if(!fb->stfb) {
FREE(fb);
return NULL;
}
pipe_mutex_lock( stw_dev->mutex );
fb->next = stw_dev->fb_head; fb->next = stw_dev->fb_head;
stw_dev->fb_head = fb; stw_dev->fb_head = fb;
pipe_mutex_unlock( stw_dev->mutex );
return fb; return fb;
} }
static void
stw_framebuffer_get_size( struct stw_framebuffer *fb, GLuint *pwidth, GLuint *pheight )
{
GLuint width, height;
if (fb->hWnd) {
RECT rect;
GetClientRect( fb->hWnd, &rect );
width = rect.right - rect.left;
height = rect.bottom - rect.top;
}
else {
width = GetDeviceCaps( fb->hDC, HORZRES );
height = GetDeviceCaps( fb->hDC, VERTRES );
}
if(width < 1)
width = 1;
if(height < 1)
height = 1;
*pwidth = width;
*pheight = height;
}
BOOL
stw_framebuffer_allocate(
struct stw_framebuffer *fb)
{
pipe_mutex_lock( fb->mutex );
if(!fb->stfb) {
const struct stw_pixelformat_info *pfi = fb->pfi;
enum pipe_format colorFormat, depthFormat, stencilFormat;
GLuint width, height;
colorFormat = pfi->color_format;
assert(pf_layout( pfi->depth_stencil_format ) == PIPE_FORMAT_LAYOUT_RGBAZS );
if(pf_get_component_bits( pfi->depth_stencil_format, PIPE_FORMAT_COMP_Z ))
depthFormat = pfi->depth_stencil_format;
else
depthFormat = PIPE_FORMAT_NONE;
if(pf_get_component_bits( pfi->depth_stencil_format, PIPE_FORMAT_COMP_S ))
stencilFormat = pfi->depth_stencil_format;
else
stencilFormat = PIPE_FORMAT_NONE;
stw_framebuffer_get_size(fb, &width, &height);
fb->stfb = st_create_framebuffer(
&fb->visual,
colorFormat,
depthFormat,
stencilFormat,
width,
height,
(void *) fb );
}
pipe_mutex_unlock( fb->mutex );
return fb->stfb ? TRUE : FALSE;
}
void void
stw_framebuffer_destroy( stw_framebuffer_resize(
struct stw_framebuffer *fb)
{
GLuint width, height;
assert(fb->stfb);
stw_framebuffer_get_size(fb, &width, &height);
st_resize_framebuffer(fb->stfb, width, height);
}
static INLINE void
stw_framebuffer_destroy_locked(
struct stw_framebuffer *fb ) struct stw_framebuffer *fb )
{ {
struct stw_framebuffer **link; struct stw_framebuffer **link;
pipe_mutex_lock( stw_dev->mutex );
link = &stw_dev->fb_head; link = &stw_dev->fb_head;
while (link && *link != fb) while (*link != fb)
link = &(*link)->next; link = &(*link)->next;
assert(*link); assert(*link);
if (link) *link = fb->next;
*link = fb->next;
fb->next = NULL; fb->next = NULL;
pipe_mutex_unlock( stw_dev->mutex );
st_unreference_framebuffer(fb->stfb); st_unreference_framebuffer(fb->stfb);
pipe_mutex_destroy( fb->mutex ); pipe_mutex_destroy( fb->mutex );
@@ -176,6 +232,44 @@ stw_framebuffer_destroy(
FREE( fb ); FREE( fb );
} }
void
stw_framebuffer_cleanup( void )
{
struct stw_framebuffer *fb;
struct stw_framebuffer *next;
pipe_mutex_lock( stw_dev->mutex );
fb = stw_dev->fb_head;
while (fb) {
next = fb->next;
stw_framebuffer_destroy_locked(fb);
fb = next;
}
stw_dev->fb_head = NULL;
pipe_mutex_unlock( stw_dev->mutex );
}
/**
* Given an hdc, return the corresponding stw_framebuffer.
*/
struct stw_framebuffer *
stw_framebuffer_from_hdc_locked(
HDC hdc )
{
struct stw_framebuffer *fb;
for (fb = stw_dev->fb_head; fb != NULL; fb = fb->next)
if (fb->hDC == hdc)
break;
return fb;
}
/** /**
* Given an hdc, return the corresponding stw_framebuffer. * Given an hdc, return the corresponding stw_framebuffer.
*/ */
@@ -186,15 +280,69 @@ stw_framebuffer_from_hdc(
struct stw_framebuffer *fb; struct stw_framebuffer *fb;
pipe_mutex_lock( stw_dev->mutex ); pipe_mutex_lock( stw_dev->mutex );
for (fb = stw_dev->fb_head; fb != NULL; fb = fb->next) fb = stw_framebuffer_from_hdc_locked(hdc);
if (fb->hDC == hdc)
break;
pipe_mutex_unlock( stw_dev->mutex ); pipe_mutex_unlock( stw_dev->mutex );
return fb; return fb;
} }
BOOL
stw_pixelformat_set(
HDC hdc,
int iPixelFormat )
{
uint count;
uint index;
struct stw_framebuffer *fb;
index = (uint) iPixelFormat - 1;
count = stw_pixelformat_get_extended_count();
if (index >= count)
return FALSE;
pipe_mutex_lock( stw_dev->mutex );
fb = stw_framebuffer_from_hdc_locked(hdc);
if(fb) {
/* SetPixelFormat must be called only once */
pipe_mutex_unlock( stw_dev->mutex );
return FALSE;
}
fb = stw_framebuffer_create_locked(hdc, iPixelFormat);
if(!fb) {
pipe_mutex_unlock( stw_dev->mutex );
return FALSE;
}
pipe_mutex_unlock( stw_dev->mutex );
/* Some applications mistakenly use the undocumented wglSetPixelFormat
* function instead of SetPixelFormat, so we call SetPixelFormat here to
* avoid opengl32.dll's wglCreateContext to fail */
if (GetPixelFormat(hdc) == 0) {
SetPixelFormat(hdc, iPixelFormat, NULL);
}
return TRUE;
}
int
stw_pixelformat_get(
HDC hdc )
{
struct stw_framebuffer *fb;
fb = stw_framebuffer_from_hdc(hdc);
if(!fb)
return 0;
return fb->iPixelFormat;
}
BOOL BOOL
stw_swap_buffers( stw_swap_buffers(
HDC hdc ) HDC hdc )

View File

@@ -44,6 +44,10 @@ struct stw_framebuffer
HDC hDC; HDC hDC;
HWND hWnd; HWND hWnd;
int iPixelFormat;
const struct stw_pixelformat_info *pfi;
GLvisual visual;
pipe_mutex mutex; pipe_mutex mutex;
struct st_framebuffer *stfb; struct st_framebuffer *stfb;
@@ -52,16 +56,24 @@ struct stw_framebuffer
}; };
struct stw_framebuffer * struct stw_framebuffer *
stw_framebuffer_create( stw_framebuffer_create_locked(
HDC hdc, HDC hdc,
GLvisual *visual, int iPixelFormat );
const struct stw_pixelformat_info *pfi,
GLuint width, BOOL
GLuint height ); stw_framebuffer_allocate(
struct stw_framebuffer *fb );
void void
stw_framebuffer_destroy( stw_framebuffer_resize(
struct stw_framebuffer *fb ); struct stw_framebuffer *fb);
void
stw_framebuffer_cleanup(void);
struct stw_framebuffer *
stw_framebuffer_from_hdc_locked(
HDC hdc );
struct stw_framebuffer * struct stw_framebuffer *
stw_framebuffer_from_hdc( stw_framebuffer_from_hdc(

View File

@@ -25,12 +25,14 @@
* *
**************************************************************************/ **************************************************************************/
#include "main/mtypes.h"
#include "main/context.h"
#include "pipe/p_format.h" #include "pipe/p_format.h"
#include "pipe/p_defines.h" #include "pipe/p_defines.h"
#include "pipe/p_screen.h" #include "pipe/p_screen.h"
#include "util/u_debug.h" #include "util/u_debug.h"
#include "util/u_memory.h"
#include "stw_device.h" #include "stw_device.h"
#include "stw_pixelformat.h" #include "stw_pixelformat.h"
@@ -261,6 +263,31 @@ stw_pixelformat_get_info( uint index )
} }
void
stw_pixelformat_visual(GLvisual *visual,
const struct stw_pixelformat_info *pfi )
{
memset(visual, 0, sizeof *visual);
_mesa_initialize_visual(
visual,
(pfi->pfd.iPixelType == PFD_TYPE_RGBA) ? GL_TRUE : GL_FALSE,
(pfi->pfd.dwFlags & PFD_DOUBLEBUFFER) ? GL_TRUE : GL_FALSE,
(pfi->pfd.dwFlags & PFD_STEREO) ? GL_TRUE : GL_FALSE,
pfi->pfd.cRedBits,
pfi->pfd.cGreenBits,
pfi->pfd.cBlueBits,
pfi->pfd.cAlphaBits,
(pfi->pfd.iPixelType == PFD_TYPE_COLORINDEX) ? pfi->pfd.cColorBits : 0,
pfi->pfd.cDepthBits,
pfi->pfd.cStencilBits,
pfi->pfd.cAccumRedBits,
pfi->pfd.cAccumGreenBits,
pfi->pfd.cAccumBlueBits,
pfi->pfd.cAccumAlphaBits,
pfi->numSamples );
}
int int
stw_pixelformat_describe( stw_pixelformat_describe(
HDC hdc, HDC hdc,
@@ -341,39 +368,3 @@ int stw_pixelformat_choose( HDC hdc,
return bestindex + 1; return bestindex + 1;
} }
int
stw_pixelformat_get(
HDC hdc )
{
return stw_tls_get_data()->currentPixelFormat;
}
BOOL
stw_pixelformat_set(
HDC hdc,
int iPixelFormat )
{
uint count;
uint index;
(void) hdc;
index = (uint) iPixelFormat - 1;
count = stw_pixelformat_get_extended_count();
if (index >= count)
return FALSE;
stw_tls_get_data()->currentPixelFormat = iPixelFormat;
/* Some applications mistakenly use the undocumented wglSetPixelFormat
* function instead of SetPixelFormat, so we call SetPixelFormat here to
* avoid opengl32.dll's wglCreateContext to fail */
if (GetPixelFormat(hdc) == 0) {
SetPixelFormat(hdc, iPixelFormat, NULL);
}
return TRUE;
}

View File

@@ -30,6 +30,8 @@
#include <windows.h> #include <windows.h>
#include "main/mtypes.h"
#include "pipe/p_compiler.h" #include "pipe/p_compiler.h"
#include "pipe/p_format.h" #include "pipe/p_format.h"
@@ -56,5 +58,8 @@ stw_pixelformat_get_extended_count( void );
const struct stw_pixelformat_info * const struct stw_pixelformat_info *
stw_pixelformat_get_info( uint index ); stw_pixelformat_get_info( uint index );
void
stw_pixelformat_visual(GLvisual *visual,
const struct stw_pixelformat_info *pfi );
#endif /* STW_PIXELFORMAT_H */ #endif /* STW_PIXELFORMAT_H */

View File

@@ -53,8 +53,6 @@ stw_tls_data_create()
if (!data) if (!data)
return NULL; return NULL;
data->currentPixelFormat = 0;
return data; return data;
} }

View File

@@ -32,7 +32,6 @@
struct stw_tls_data struct stw_tls_data
{ {
uint currentPixelFormat;
HHOOK hCallWndProcHook; HHOOK hCallWndProcHook;
}; };

View File

@@ -1259,7 +1259,7 @@ initialize_framebuffer_size(GLcontext *ctx, GLframebuffer *fb)
* \param drawBuffer the drawing framebuffer * \param drawBuffer the drawing framebuffer
* \param readBuffer the reading framebuffer * \param readBuffer the reading framebuffer
*/ */
void GLboolean
_mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer, _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
GLframebuffer *readBuffer ) GLframebuffer *readBuffer )
{ {
@@ -1272,14 +1272,14 @@ _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
if (!check_compatible(newCtx, drawBuffer)) { if (!check_compatible(newCtx, drawBuffer)) {
_mesa_warning(newCtx, _mesa_warning(newCtx,
"MakeCurrent: incompatible visuals for context and drawbuffer"); "MakeCurrent: incompatible visuals for context and drawbuffer");
return; return GL_FALSE;
} }
} }
if (newCtx && readBuffer && newCtx->WinSysReadBuffer != readBuffer) { if (newCtx && readBuffer && newCtx->WinSysReadBuffer != readBuffer) {
if (!check_compatible(newCtx, readBuffer)) { if (!check_compatible(newCtx, readBuffer)) {
_mesa_warning(newCtx, _mesa_warning(newCtx,
"MakeCurrent: incompatible visuals for context and readbuffer"); "MakeCurrent: incompatible visuals for context and readbuffer");
return; return GL_FALSE;
} }
} }
@@ -1384,6 +1384,8 @@ _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
newCtx->FirstTimeCurrent = GL_FALSE; newCtx->FirstTimeCurrent = GL_FALSE;
} }
} }
return GL_TRUE;
} }

View File

@@ -130,7 +130,7 @@ extern void
_mesa_copy_context(const GLcontext *src, GLcontext *dst, GLuint mask); _mesa_copy_context(const GLcontext *src, GLcontext *dst, GLuint mask);
extern void extern GLboolean
_mesa_make_current( GLcontext *ctx, GLframebuffer *drawBuffer, _mesa_make_current( GLcontext *ctx, GLframebuffer *drawBuffer,
GLframebuffer *readBuffer ); GLframebuffer *readBuffer );

View File

@@ -1008,6 +1008,16 @@ output_if_debug(const char *prefixString, const char *outputString,
fprintf(stderr, "%s: %s", prefixString, outputString); fprintf(stderr, "%s: %s", prefixString, outputString);
if (newline) if (newline)
fprintf(stderr, "\n"); fprintf(stderr, "\n");
#if defined(_WIN32) && !defined(_WIN32_WCE)
/* stderr from windows applications without console is not usually
* visible, so communicate with the debugger instead */
{
char buf[4096];
_mesa_snprintf(buf, sizeof(buf), "%s: %s%s", prefixString, outputString, newline ? "\n" : "");
OutputDebugStringA(buf);
}
#endif
} }
} }

View File

@@ -192,7 +192,8 @@ static void update_raster_state( struct st_context *st )
raster->point_sprite = ctx->Point.PointSprite; raster->point_sprite = ctx->Point.PointSprite;
for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) { for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
if (ctx->Point.CoordReplace[i]) { if (ctx->Point.CoordReplace[i]) {
if (ctx->Point.SpriteOrigin == GL_UPPER_LEFT) if ((ctx->Point.SpriteOrigin == GL_UPPER_LEFT) ^
(st_fb_orientation(ctx->DrawBuffer) == Y_0_BOTTOM))
raster->sprite_coord_mode[i] = PIPE_SPRITE_COORD_UPPER_LEFT; raster->sprite_coord_mode[i] = PIPE_SPRITE_COORD_UPPER_LEFT;
else else
raster->sprite_coord_mode[i] = PIPE_SPRITE_COORD_LOWER_LEFT; raster->sprite_coord_mode[i] = PIPE_SPRITE_COORD_LOWER_LEFT;

View File

@@ -263,9 +263,10 @@ void st_destroy_context( struct st_context *st )
} }
void st_make_current(struct st_context *st, GLboolean
struct st_framebuffer *draw, st_make_current(struct st_context *st,
struct st_framebuffer *read) struct st_framebuffer *draw,
struct st_framebuffer *read)
{ {
/* Call this periodically to detect when the user has begun using /* Call this periodically to detect when the user has begun using
* GL rendering from multiple threads. * GL rendering from multiple threads.
@@ -274,7 +275,8 @@ void st_make_current(struct st_context *st,
if (st) { if (st) {
GLboolean firstTime = st->ctx->FirstTimeCurrent; GLboolean firstTime = st->ctx->FirstTimeCurrent;
_mesa_make_current(st->ctx, &draw->Base, &read->Base); if(!_mesa_make_current(st->ctx, &draw->Base, &read->Base))
return GL_FALSE;
/* Need to initialize viewport here since draw->Base->Width/Height /* Need to initialize viewport here since draw->Base->Width/Height
* will still be zero at this point. * will still be zero at this point.
* This could be improved, but would require rather extensive work * This could be improved, but would require rather extensive work
@@ -286,9 +288,10 @@ void st_make_current(struct st_context *st,
_mesa_set_scissor(st->ctx, 0, 0, w, h); _mesa_set_scissor(st->ctx, 0, 0, w, h);
} }
return GL_TRUE;
} }
else { else {
_mesa_make_current(NULL, NULL, NULL); return _mesa_make_current(NULL, NULL, NULL);
} }
} }

View File

@@ -91,9 +91,9 @@ void *st_framebuffer_private( struct st_framebuffer *stfb );
void st_unreference_framebuffer( struct st_framebuffer *stfb ); void st_unreference_framebuffer( struct st_framebuffer *stfb );
void st_make_current(struct st_context *st, GLboolean st_make_current(struct st_context *st,
struct st_framebuffer *draw, struct st_framebuffer *draw,
struct st_framebuffer *read); struct st_framebuffer *read);
struct st_context *st_get_current(void); struct st_context *st_get_current(void);