}
+/**
+ * Return the stw pixel format that most closely matches the pixel format
+ * on HDC.
+ * Used to get a pixel format when SetPixelFormat() hasn't been called before.
+ */
+static int
+get_matching_pixel_format(HDC hdc)
+{
+ int iPixelFormat = GetPixelFormat(hdc);
+ PIXELFORMATDESCRIPTOR pfd;
+
+ if (!iPixelFormat)
+ return 0;
+ if (!DescribePixelFormat(hdc, iPixelFormat, sizeof(pfd), &pfd))
+ return 0;
+ return stw_pixelformat_choose(hdc, &pfd);
+}
+
+
/**
* Called via DrvCreateContext(), DrvCreateLayerContext() and
* wglCreateContextAttribsARB() to actually create a rendering context.
iPixelFormat = fb->iPixelFormat;
stw_framebuffer_unlock(fb);
} else {
- return 0;
+ /* 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 use that.
+ */
+ iPixelFormat = get_matching_pixel_format(hdc);
+ if (!iPixelFormat)
+ return 0;
}
pfi = stw_pixelformat_get_info( iPixelFormat );
if (ctx == NULL)
goto no_ctx;
- ctx->hdc = hdc;
+ ctx->hDrawDC = hdc;
ctx->hReadDC = hdc;
ctx->iPixelFormat = iPixelFormat;
ctx->shared = shareCtx != NULL;
ctx->st->st_manager_private = (void *) ctx;
if (ctx->st->cso_context) {
- ctx->hud = hud_create(ctx->st->pipe, ctx->st->cso_context);
+ ctx->hud = hud_create(ctx->st->cso_context, NULL);
}
stw_lock_contexts(stw_dev);
if (old_ctx) {
/* free the old context data associated with this handle */
if (old_ctx->hud) {
- hud_destroy(old_ctx->hud);
+ hud_destroy(old_ctx->hud, NULL);
}
ctx->st->destroy(old_ctx->st);
FREE(old_ctx);
no_hglrc:
if (ctx->hud) {
- hud_destroy(ctx->hud);
+ hud_destroy(ctx->hud, NULL);
}
ctx->st->destroy(ctx->st);
no_st_ctx:
stw_dev->stapi->make_current(stw_dev->stapi, NULL, NULL, NULL);
if (ctx->hud) {
- hud_destroy(ctx->hud);
+ hud_destroy(ctx->hud, NULL);
}
ctx->st->destroy(ctx->st);
if (!ctx)
return NULL;
- return ctx->hdc;
+ return ctx->hDrawDC;
}
HDC
}
BOOL
-stw_make_current(HDC hdc, HDC hReadDC, DHGLRC dhglrc)
+stw_make_current(HDC hDrawDC, HDC hReadDC, DHGLRC dhglrc)
{
struct stw_context *old_ctx = NULL;
struct stw_context *ctx = NULL;
old_ctx = stw_current_context();
if (old_ctx != NULL) {
if (old_ctx->dhglrc == dhglrc) {
- if (old_ctx->hdc == hdc && old_ctx->hReadDC == hReadDC) {
+ if (old_ctx->hDrawDC == hDrawDC && old_ctx->hReadDC == hReadDC) {
/* Return if already current. */
return TRUE;
}
if (old_ctx->shared) {
struct pipe_fence_handle *fence = NULL;
old_ctx->st->flush(old_ctx->st,
- ST_FLUSH_FRONT | ST_FLUSH_WAIT, &fence);
+ ST_FLUSH_FRONT | ST_FLUSH_WAIT, &fence,
+ NULL, NULL);
}
else {
- old_ctx->st->flush(old_ctx->st, ST_FLUSH_FRONT, NULL);
+ old_ctx->st->flush(old_ctx->st, ST_FLUSH_FRONT, NULL, NULL, NULL);
}
}
}
}
/* This call locks fb's mutex */
- fb = stw_framebuffer_from_hdc( hdc );
+ fb = stw_framebuffer_from_hdc( hDrawDC );
if (fb) {
stw_framebuffer_update(fb);
}
* pixel format in some cases, so we must create a framebuffer for
* those here.
*/
- int iPixelFormat = GetPixelFormat(hdc);
+ int iPixelFormat = get_matching_pixel_format(hDrawDC);
if (iPixelFormat)
- fb = stw_framebuffer_create( hdc, iPixelFormat );
+ fb = stw_framebuffer_create( hDrawDC, iPixelFormat );
if (!fb)
goto fail;
}
}
/* Bind the new framebuffer */
- ctx->hdc = hdc;
+ ctx->hDrawDC = hDrawDC;
ctx->hReadDC = hReadDC;
struct stw_framebuffer *old_fb = ctx->current_framebuffer;