summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/windows
diff options
context:
space:
mode:
authorKarl Schultz <kschultz@freedesktop.org>2006-03-30 21:53:23 +0000
committerKarl Schultz <kschultz@freedesktop.org>2006-03-30 21:53:23 +0000
commit174ce730c6c9739121c02c7d58e7d8be377d2231 (patch)
tree175149c973b221ffcdf27478b435f8436990462d /src/mesa/drivers/windows
parent48547ee12924789cb62b594f5812dd4dab3a2153 (diff)
Clean up data structures, finishing off some of the cleanup work suggested by Brian. Now also creating two renderbuffers, so apps can now switch with glDrawBuffer.
Diffstat (limited to 'src/mesa/drivers/windows')
-rw-r--r--src/mesa/drivers/windows/gdi/wmesa.c244
-rw-r--r--src/mesa/drivers/windows/gdi/wmesadef.h28
2 files changed, 139 insertions, 133 deletions
diff --git a/src/mesa/drivers/windows/gdi/wmesa.c b/src/mesa/drivers/windows/gdi/wmesa.c
index 08eee4d9dc..2129249424 100644
--- a/src/mesa/drivers/windows/gdi/wmesa.c
+++ b/src/mesa/drivers/windows/gdi/wmesa.c
@@ -34,7 +34,7 @@ wmesa_new_framebuffer(HDC hdc, GLvisual *visual)
= (WMesaFramebuffer) malloc(sizeof(struct wmesa_framebuffer));
if (pwfb) {
_mesa_initialize_framebuffer(&pwfb->Base, visual);
- pwfb->hdc = hdc;
+ pwfb->hDC = hdc;
/* insert at head of list */
pwfb->next = FirstFramebuffer;
FirstFramebuffer = pwfb;
@@ -42,6 +42,26 @@ wmesa_new_framebuffer(HDC hdc, GLvisual *visual)
return pwfb;
}
+/**
+ * Given an hdc, free the corresponding WMesaFramebuffer
+ */
+void
+wmesa_free_framebuffer(HDC hdc)
+{
+ WMesaFramebuffer pwfb, prev;
+ for (pwfb = FirstFramebuffer; pwfb; pwfb = pwfb->next) {
+ if (pwfb->hDC == hdc)
+ break;
+ prev = pwfb;
+ }
+ if (pwfb) {
+ if (pwfb == FirstFramebuffer)
+ FirstFramebuffer = pwfb->next;
+ else
+ prev->next = pwfb->next;
+ free(pwfb);
+ }
+}
/**
* Given an hdc, return the corresponding WMesaFramebuffer
@@ -51,7 +71,7 @@ wmesa_lookup_framebuffer(HDC hdc)
{
WMesaFramebuffer pwfb;
for (pwfb = FirstFramebuffer; pwfb; pwfb = pwfb->next) {
- if (pwfb->hdc == hdc)
+ if (pwfb->hDC == hdc)
return pwfb;
}
return NULL;
@@ -90,27 +110,27 @@ static const GLubyte *wmesa_get_string(GLcontext *ctx, GLenum name)
/*
* Determine the pixel format based on the pixel size.
*/
-static void wmSetPixelFormat(WMesaContext pwc, HDC hDC)
+static void wmSetPixelFormat(WMesaFramebuffer pwfb, HDC hDC)
{
- pwc->cColorBits = GetDeviceCaps(hDC, BITSPIXEL);
+ pwfb->cColorBits = GetDeviceCaps(hDC, BITSPIXEL);
// Only 16 and 32 bit targets are supported now
- assert(pwc->cColorBits == 0 ||
- pwc->cColorBits == 16 ||
- pwc->cColorBits == 32);
+ assert(pwfb->cColorBits == 0 ||
+ pwfb->cColorBits == 16 ||
+ pwfb->cColorBits == 32);
- switch(pwc->cColorBits){
+ switch(pwfb->cColorBits){
case 8:
- pwc->pixelformat = PF_INDEX8;
+ pwfb->pixelformat = PF_INDEX8;
break;
case 16:
- pwc->pixelformat = PF_5R6G5B;
+ pwfb->pixelformat = PF_5R6G5B;
break;
case 32:
- pwc->pixelformat = PF_8R8G8B;
+ pwfb->pixelformat = PF_8R8G8B;
break;
default:
- pwc->pixelformat = PF_BADFORMAT;
+ pwfb->pixelformat = PF_BADFORMAT;
}
}
@@ -119,22 +139,18 @@ static void wmSetPixelFormat(WMesaContext pwc, HDC hDC)
* Create DIB for back buffer.
* We write into this memory with the span routines and then blit it
* to the window on a buffer swap.
- *
- * XXX we should probably pass a WMesaFramebuffer ptr, not a WMesaContext!
*/
-BOOL wmCreateBackingStore(WMesaContext pwc, long lxSize, long lySize)
+BOOL wmCreateBackingStore(WMesaFramebuffer pwfb, long lxSize, long lySize)
{
- HDC hdc = pwc->hDC;
- LPBITMAPINFO pbmi = &(pwc->bmi);
+ HDC hdc = pwfb->hDC;
+ LPBITMAPINFO pbmi = &(pwfb->bmi);
HDC hic;
- assert(pwc->db_flag == GL_TRUE);
-
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = lxSize;
pbmi->bmiHeader.biHeight= -lySize;
pbmi->bmiHeader.biPlanes = 1;
- pbmi->bmiHeader.biBitCount = GetDeviceCaps(pwc->hDC, BITSPIXEL);
+ pbmi->bmiHeader.biBitCount = GetDeviceCaps(pwfb->hDC, BITSPIXEL);
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 0;
@@ -142,35 +158,33 @@ BOOL wmCreateBackingStore(WMesaContext pwc, long lxSize, long lySize)
pbmi->bmiHeader.biClrUsed = 0;
pbmi->bmiHeader.biClrImportant = 0;
- pwc->cColorBits = pbmi->bmiHeader.biBitCount;
- pwc->ScanWidth = (lxSize * (pwc->cColorBits / 8) + 3) & ~3;
+ pwfb->cColorBits = pbmi->bmiHeader.biBitCount;
+ pwfb->ScanWidth = (lxSize * (pwfb->cColorBits / 8) + 3) & ~3;
hic = CreateIC("display", NULL, NULL, NULL);
- pwc->dib.hDC = CreateCompatibleDC(hic);
+ pwfb->dib_hDC = CreateCompatibleDC(hic);
- pwc->hbmDIB = CreateDIBSection(hic,
- &pwc->bmi,
+ pwfb->hbmDIB = CreateDIBSection(hic,
+ &pwfb->bmi,
DIB_RGB_COLORS,
- (void **)&(pwc->pbPixels),
+ (void **)&(pwfb->pbPixels),
0,
0);
- pwc->hOldBitmap = SelectObject(pwc->dib.hDC, pwc->hbmDIB);
+ pwfb->hOldBitmap = SelectObject(pwfb->dib_hDC, pwfb->hbmDIB);
DeleteDC(hic);
- wmSetPixelFormat(pwc, pwc->hDC);
+ wmSetPixelFormat(pwfb, pwfb->hDC);
return TRUE;
}
-/* XXX pass WMesaFramebuffer, not WMesaContext.
- */
-static wmDeleteBackingStore(WMesaContext pwc)
+static wmDeleteBackingStore(WMesaFramebuffer pwfb)
{
- if (pwc->hbmDIB) {
- SelectObject(pwc->dib.hDC, pwc->hOldBitmap);
- DeleteDC(pwc->dib.hDC);
- DeleteObject(pwc->hbmDIB);
+ if (pwfb->hbmDIB) {
+ SelectObject(pwfb->dib_hDC, pwfb->hOldBitmap);
+ DeleteDC(pwfb->dib_hDC);
+ DeleteObject(pwfb->hbmDIB);
}
}
@@ -200,7 +214,7 @@ static void
wmesa_get_buffer_size(GLframebuffer *buffer, GLuint *width, GLuint *height)
{
WMesaFramebuffer pwfb = wmesa_framebuffer(buffer);
- get_window_size(pwfb->hdc, width, height);
+ get_window_size(pwfb->hDC, width, height);
}
@@ -209,13 +223,9 @@ static void wmesa_flush(GLcontext *ctx)
WMesaContext pwc = wmesa_context(ctx);
WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->WinSysDrawBuffer);
- /* XXX I guess we're _always_ double buffered and render to the back
- * buffer. So flushing involves copying the back color buffer to
- * the front.
- */
- if (pwc->db_flag) {
- BitBlt(pwc->hDC, 0, 0, pwfb->Base.Width, pwfb->Base.Height,
- pwc->dib.hDC, 0, 0, SRCCOPY);
+ if (ctx->Visual.doubleBufferMode == 1) {
+ BitBlt(pwfb->hDC, 0, 0, pwfb->Base.Width, pwfb->Base.Height,
+ pwfb->dib_hDC, 0, 0, SRCCOPY);
}
else {
/* Do nothing for single buffer */
@@ -247,8 +257,9 @@ static void clear_index(GLcontext *ctx, GLuint index)
static void clear_color(GLcontext *ctx, const GLfloat color[4])
{
WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
GLubyte col[3];
- UINT bytesPerPixel = pwc->cColorBits / 8;
+ UINT bytesPerPixel = pwfb->cColorBits / 8;
CLAMPED_FLOAT_TO_UBYTE(col[0], color[0]);
CLAMPED_FLOAT_TO_UBYTE(col[1], color[1]);
@@ -279,6 +290,7 @@ static void clear(GLcontext *ctx,
#define FLIP(Y) (ctx->DrawBuffer->Height - (Y) - 1)
WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
int done = 0;
/* Let swrast do all the work if the masks are not set to
@@ -295,7 +307,7 @@ static void clear(GLcontext *ctx,
if (mask & BUFFER_BIT_BACK_LEFT) {
int i, rowSize;
- UINT bytesPerPixel = pwc->cColorBits / 8;
+ UINT bytesPerPixel = pwfb->cColorBits / 8;
LPBYTE lpb, clearRow;
LPWORD lpw;
BYTE bColor;
@@ -313,8 +325,8 @@ static void clear(GLcontext *ctx,
bColor = BGR8(GetRValue(pwc->clearColorRef),
GetGValue(pwc->clearColorRef),
GetBValue(pwc->clearColorRef));
- memset(pwc->pbPixels, bColor,
- pwc->ScanWidth * height);
+ memset(pwfb->pbPixels, bColor,
+ pwfb->ScanWidth * height);
done = 1;
break;
case 2:
@@ -322,8 +334,8 @@ static void clear(GLcontext *ctx,
GetGValue(pwc->clearColorRef),
GetBValue(pwc->clearColorRef));
if (((wColor >> 8) & 0xff) == (wColor & 0xff)) {
- memset(pwc->pbPixels, wColor & 0xff,
- pwc->ScanWidth * height);
+ memset(pwfb->pbPixels, wColor & 0xff,
+ pwfb->ScanWidth * height);
done = 1;
}
break;
@@ -334,9 +346,9 @@ static void clear(GLcontext *ctx,
GetGValue(pwc->clearColorRef) &&
GetRValue(pwc->clearColorRef) ==
GetBValue(pwc->clearColorRef)) {
- memset(pwc->pbPixels,
+ memset(pwfb->pbPixels,
GetRValue(pwc->clearColorRef),
- pwc->ScanWidth * height);
+ pwfb->ScanWidth * height);
done = 1;
}
break;
@@ -349,8 +361,8 @@ static void clear(GLcontext *ctx,
/* Need to clear a row at a time. Begin by setting the first
* row in the area to be cleared to the clear color. */
- clearRow = pwc->pbPixels +
- pwc->ScanWidth * FLIP(y) +
+ clearRow = pwfb->pbPixels +
+ pwfb->ScanWidth * FLIP(y) +
bytesPerPixel * x;
switch (bytesPerPixel) {
case 1:
@@ -392,11 +404,11 @@ static void clear(GLcontext *ctx,
} /* switch */
/* copy cleared row to other rows in buffer */
- lpb = clearRow - pwc->ScanWidth;
+ lpb = clearRow - pwfb->ScanWidth;
rowSize = width * bytesPerPixel;
for (i=1; i<height; i++) {
memcpy(lpb, clearRow, rowSize);
- lpb -= pwc->ScanWidth;
+ lpb -= pwfb->ScanWidth;
}
} /* not done */
mask &= ~BUFFER_BIT_BACK_LEFT;
@@ -615,13 +627,14 @@ static void write_rgba_span_32(const GLcontext *ctx,
const GLubyte mask[] )
{
WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
GLuint i;
LPDWORD lpdw;
(void) ctx;
y=FLIP(y);
- lpdw = ((LPDWORD)(pwc->pbPixels + pwc->ScanWidth * y)) + x;
+ lpdw = ((LPDWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x;
if (mask) {
for (i=0; i<n; i++)
if (mask[i])
@@ -644,13 +657,14 @@ static void write_rgb_span_32(const GLcontext *ctx,
const GLubyte mask[] )
{
WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
GLuint i;
LPDWORD lpdw;
(void) ctx;
y=FLIP(y);
- lpdw = ((LPDWORD)(pwc->pbPixels + pwc->ScanWidth * y)) + x;
+ lpdw = ((LPDWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x;
if (mask) {
for (i=0; i<n; i++)
if (mask[i])
@@ -678,7 +692,8 @@ static void write_mono_rgba_span_32(const GLcontext *ctx,
DWORD pixel;
GLuint i;
WMesaContext pwc = wmesa_context(ctx);
- lpdw = ((LPDWORD)(pwc->pbPixels + pwc->ScanWidth * y)) + x;
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
+ lpdw = ((LPDWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x;
y=FLIP(y);
pixel = BGR32(color[RCOMP], color[GCOMP], color[BCOMP]);
if (mask) {
@@ -700,10 +715,11 @@ static void write_rgba_pixels_32(const GLcontext *ctx,
const GLubyte mask[])
{
GLuint i;
- WMesaContext pwc = wmesa_context(ctx);;
+ WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
for (i=0; i<n; i++)
if (mask[i])
- WMSETPIXEL32(pwc, FLIP(y[i]), x[i],
+ WMSETPIXEL32(pwfb, FLIP(y[i]), x[i],
rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
}
@@ -720,9 +736,10 @@ static void write_mono_rgba_pixels_32(const GLcontext *ctx,
{
GLuint i;
WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
for (i=0; i<n; i++)
if (mask[i])
- WMSETPIXEL32(pwc, FLIP(y[i]),x[i],color[RCOMP],
+ WMSETPIXEL32(pwfb, FLIP(y[i]),x[i],color[RCOMP],
color[GCOMP], color[BCOMP]);
}
@@ -736,9 +753,10 @@ static void read_rgba_span_32(const GLcontext *ctx,
DWORD pixel;
LPDWORD lpdw;
WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
y = FLIP(y);
- lpdw = ((LPDWORD)(pwc->pbPixels + pwc->ScanWidth * y)) + x;
+ lpdw = ((LPDWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x;
for (i=0; i<n; i++) {
pixel = lpdw[i];
rgba[i][RCOMP] = (pixel & 0x00ff0000) >> 16;
@@ -759,10 +777,11 @@ static void read_rgba_pixels_32(const GLcontext *ctx,
DWORD pixel;
LPDWORD lpdw;
WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
for (i=0; i<n; i++) {
GLint y2 = FLIP(y[i]);
- lpdw = ((LPDWORD)(pwc->pbPixels + pwc->ScanWidth * y2)) + x[i];
+ lpdw = ((LPDWORD)(pwfb->pbPixels + pwfb->ScanWidth * y2)) + x[i];
pixel = lpdw[i];
rgba[i][RCOMP] = (pixel & 0x00ff0000) >> 16;
rgba[i][GCOMP] = (pixel & 0x0000ff00) >> 8;
@@ -790,13 +809,14 @@ static void write_rgba_span_16(const GLcontext *ctx,
const GLubyte mask[] )
{
WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
GLuint i;
LPWORD lpw;
(void) ctx;
y=FLIP(y);
- lpw = ((LPWORD)(pwc->pbPixels + pwc->ScanWidth * y)) + x;
+ lpw = ((LPWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x;
if (mask) {
for (i=0; i<n; i++)
if (mask[i])
@@ -819,13 +839,14 @@ static void write_rgb_span_16(const GLcontext *ctx,
const GLubyte mask[] )
{
WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
GLuint i;
LPWORD lpw;
(void) ctx;
y=FLIP(y);
- lpw = ((LPWORD)(pwc->pbPixels + pwc->ScanWidth * y)) + x;
+ lpw = ((LPWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x;
if (mask) {
for (i=0; i<n; i++)
if (mask[i])
@@ -853,8 +874,9 @@ static void write_mono_rgba_span_16(const GLcontext *ctx,
WORD pixel;
GLuint i;
WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
(void) ctx;
- lpw = ((LPWORD)(pwc->pbPixels + pwc->ScanWidth * y)) + x;
+ lpw = ((LPWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x;
y=FLIP(y);
pixel = BGR16(color[RCOMP], color[GCOMP], color[BCOMP]);
if (mask) {
@@ -877,10 +899,11 @@ static void write_rgba_pixels_16(const GLcontext *ctx,
{
GLuint i;
WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
(void) ctx;
for (i=0; i<n; i++)
if (mask[i])
- WMSETPIXEL16(pwc, FLIP(y[i]), x[i],
+ WMSETPIXEL16(pwfb, FLIP(y[i]), x[i],
rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
}
@@ -897,10 +920,11 @@ static void write_mono_rgba_pixels_16(const GLcontext *ctx,
{
GLuint i;
WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
(void) ctx;
for (i=0; i<n; i++)
if (mask[i])
- WMSETPIXEL16(pwc, FLIP(y[i]),x[i],color[RCOMP],
+ WMSETPIXEL16(pwfb, FLIP(y[i]),x[i],color[RCOMP],
color[GCOMP], color[BCOMP]);
}
@@ -913,9 +937,10 @@ static void read_rgba_span_16(const GLcontext *ctx,
GLuint i, pixel;
LPWORD lpw;
WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
y = FLIP(y);
- lpw = ((LPWORD)(pwc->pbPixels + pwc->ScanWidth * y)) + x;
+ lpw = ((LPWORD)(pwfb->pbPixels + pwfb->ScanWidth * y)) + x;
for (i=0; i<n; i++) {
pixel = lpw[i];
/* Windows uses 5,5,5 for 16-bit */
@@ -936,10 +961,11 @@ static void read_rgba_pixels_16(const GLcontext *ctx,
GLuint i, pixel;
LPWORD lpw;
WMesaContext pwc = wmesa_context(ctx);
+ WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
for (i=0; i<n; i++) {
GLint y2 = FLIP(y[i]);
- lpw = ((LPWORD)(pwc->pbPixels + pwc->ScanWidth * y2)) + x[i];
+ lpw = ((LPWORD)(pwfb->pbPixels + pwfb->ScanWidth * y2)) + x[i];
pixel = lpw[i];
/* Windows uses 5,5,5 for 16-bit */
rgba[i][RCOMP] = (pixel & 0x7c00) >> 7;
@@ -1051,9 +1077,9 @@ wmesa_resize_buffers(GLcontext *ctx, GLframebuffer *buffer,
if (pwfb->Base.Width != width || pwfb->Base.Height != height) {
/* Realloc back buffer */
- if (pwc->db_flag) {
- wmDeleteBackingStore(pwc);
- wmCreateBackingStore(pwc, width, height);
+ if (ctx->Visual.doubleBufferMode == 1) {
+ wmDeleteBackingStore(pwfb);
+ wmCreateBackingStore(pwfb, width, height);
}
}
_mesa_resize_framebuffer(ctx, buffer, width, height);
@@ -1101,24 +1127,12 @@ static void wmesa_update_state(GLcontext *ctx, GLuint new_state)
_ac_InvalidateState(ctx, new_state);
_tnl_InvalidateState(ctx, new_state);
- /* TODO - need code to update the span functions in case the
- * renderer changes the target buffer (like a DB app writing to
- * the front buffer). */
+ /* TODO - This code is not complete yet because I
+ * don't know what to do for all state updates.
+ */
-#if 0
- { /* could check _NEW_BUFFERS bit flag here in new_state */
- /* In progress - Need to make the wmesa context inherit (by containment)
- the gl_context, so I can get access to the pixel format */
- struct gl_renderbuffer *rb;
- int pixelformat, double_buffer;
-
- rb = ctx->DrawBuffer->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
- pixelformat = PF_5R6G5B; // hard code for now - see note above
- double_buffer = ctx->DrawBuffer->ColorDrawBuffer[0] == GL_BACK ? 1 : 0;
- if (rb)
- wmesa_set_renderbuffer_funcs(rb, pixelformat, double_buffer);
+ if (new_state & _NEW_BUFFERS) {
}
-#endif
}
@@ -1165,11 +1179,6 @@ WMesaContext WMesaCreateContext(HDC hDC,
c->hDC = hDC;
#endif
- /* rememember DC and flag settings */
- c->rgb_flag = rgb_flag;
- c->db_flag = db_flag;
- c->alpha_flag = alpha_flag;
-
/* Get data for visual */
/* Dealing with this is actually a bit of overkill because Mesa will end
* up treating all color component size requests less than 8 by using
@@ -1249,6 +1258,7 @@ WMesaContext WMesaCreateContext(HDC hDC,
void WMesaDestroyContext( WMesaContext pwc )
{
GLcontext *ctx = &pwc->gl_ctx;
+ WMesaFramebuffer pwfb;
GET_CURRENT_CONTEXT(cur_ctx);
if (cur_ctx == ctx) {
@@ -1256,6 +1266,14 @@ void WMesaDestroyContext( WMesaContext pwc )
WMesaMakeCurrent(NULL, NULL);
}
+ /* clean up frame buffer resources */
+ pwfb = wmesa_lookup_framebuffer(pwc->hDC);
+ if (pwfb) {
+ if (ctx->Visual.doubleBufferMode == 1)
+ wmDeleteBackingStore(pwfb);
+ wmesa_free_framebuffer(pwc->hDC);
+ }
+
/* Release for device, not memory contexts */
if (WindowFromDC(pwc->hDC) != NULL)
{
@@ -1264,9 +1282,6 @@ void WMesaDestroyContext( WMesaContext pwc )
DeleteObject(pwc->clearPen);
DeleteObject(pwc->clearBrush);
- if (pwc->db_flag)
- wmDeleteBackingStore(pwc);
-
_swsetup_DestroyContext(ctx);
_tnl_DestroyContext(ctx);
_ac_DestroyContext(ctx);
@@ -1313,7 +1328,7 @@ void WMesaMakeCurrent(WMesaContext c, HDC hdc)
pwfb = wmesa_lookup_framebuffer(hdc);
/* Lazy creation of framebuffers */
- if (c && !pwfb) {
+ if (c && !pwfb && hdc) {
struct gl_renderbuffer *rb;
GLvisual *visual = &c->gl_ctx.Visual;
GLuint width, height;
@@ -1323,31 +1338,30 @@ void WMesaMakeCurrent(WMesaContext c, HDC hdc)
c->clearPen = CreatePen(PS_SOLID, 1, 0);
c->clearBrush = CreateSolidBrush(0);
+ pwfb = wmesa_new_framebuffer(hdc, visual);
+
/* Create back buffer if double buffered */
- if (c->db_flag) {
- wmCreateBackingStore(c, width, height);
+ if (visual->doubleBufferMode == 1) {
+ wmCreateBackingStore(pwfb, width, height);
}
- pwfb = wmesa_new_framebuffer(hdc, visual);
-
- /* need a color renderbuffer */
- /* XXX we need to make two renderbuffers if double-buffering,
- * one for front color buffer and one for the back.
- */
- rb = wmesa_new_renderbuffer();
- if (c->db_flag)
+ /* make render buffers */
+ if (visual->doubleBufferMode == 1) {
+ rb = wmesa_new_renderbuffer();
_mesa_add_renderbuffer(&pwfb->Base, BUFFER_BACK_LEFT, rb);
- else
- _mesa_add_renderbuffer(&pwfb->Base, BUFFER_FRONT_LEFT, rb);
- wmesa_set_renderbuffer_funcs(rb, c->pixelformat, c->db_flag);
+ wmesa_set_renderbuffer_funcs(rb, pwfb->pixelformat, 1);
+ }
+ rb = wmesa_new_renderbuffer();
+ _mesa_add_renderbuffer(&pwfb->Base, BUFFER_FRONT_LEFT, rb);
+ wmesa_set_renderbuffer_funcs(rb, pwfb->pixelformat, 0);
- /* Let Mesa own the Depth, Stencil, and Accum buffers */
+ /* Let Mesa own the Depth, Stencil, and Accum buffers */
_mesa_add_soft_renderbuffers(&pwfb->Base,
GL_FALSE, /* color */
visual->depthBits > 0,
visual->stencilBits > 0,
visual->accumRedBits > 0,
- c->alpha_flag,
+ visual->alphaBits >0,
GL_FALSE);
}
@@ -1375,8 +1389,8 @@ void WMesaSwapBuffers( HDC hdc )
if (pwc->hDC == hdc) {
_mesa_notifySwapBuffers(ctx);
- BitBlt(pwc->hDC, 0, 0, pwfb->Base.Width, pwfb->Base.Height,
- pwc->dib.hDC, 0, 0, SRCCOPY);
+ BitBlt(pwfb->hDC, 0, 0, pwfb->Base.Width, pwfb->Base.Height,
+ pwfb->dib_hDC, 0, 0, SRCCOPY);
}
else {
/* XXX for now only allow swapping current window */
diff --git a/src/mesa/drivers/windows/gdi/wmesadef.h b/src/mesa/drivers/windows/gdi/wmesadef.h
index 296000a12f..97b063a8ba 100644
--- a/src/mesa/drivers/windows/gdi/wmesadef.h
+++ b/src/mesa/drivers/windows/gdi/wmesadef.h
@@ -3,12 +3,6 @@
#include "context.h"
-typedef struct _dibSection {
- HDC hDC;
- HANDLE hFileMap;
- BOOL fFlushed;
- LPVOID base;
-} WMDIBSECTION, *PWMDIBSECTION;
/**
* The Windows Mesa rendering context, derived from GLcontext.
@@ -19,17 +13,6 @@ struct wmesa_context {
COLORREF clearColorRef;
HPEN clearPen;
HBRUSH clearBrush;
- GLuint ScanWidth; /* XXX move into wmesa_framebuffer */
- GLboolean rgb_flag; /* XXX remove - use gl_visual field */
- GLboolean db_flag; /* XXX remove - use gl_visual field */
- GLboolean alpha_flag; /* XXX remove - use gl_visual field */
- WMDIBSECTION dib;
- BITMAPINFO bmi;
- HBITMAP hbmDIB;
- HBITMAP hOldBitmap;
- PBYTE pbPixels;
- BYTE cColorBits;
- int pixelformat;
};
@@ -39,7 +22,16 @@ struct wmesa_context {
struct wmesa_framebuffer
{
struct gl_framebuffer Base;
- HDC hdc;
+ HDC hDC;
+ int pixelformat;
+ GLuint ScanWidth;
+ BYTE cColorBits;
+ /* back buffer DIB fields */
+ HDC dib_hDC;
+ BITMAPINFO bmi;
+ HBITMAP hbmDIB;
+ HBITMAP hOldBitmap;
+ PBYTE pbPixels;
struct wmesa_framebuffer *next;
};