}
+/**
+ * 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.
* but not all do, and the opengl32 runtime seems to use a default
* pixel format in some cases, so use that.
*/
- iPixelFormat = GetPixelFormat(hdc);
+ iPixelFormat = get_matching_pixel_format(hdc);
if (!iPixelFormat)
return 0;
}
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);
* pixel format in some cases, so we must create a framebuffer for
* those here.
*/
- int iPixelFormat = GetPixelFormat(hDrawDC);
+ int iPixelFormat = get_matching_pixel_format(hDrawDC);
if (iPixelFormat)
fb = stw_framebuffer_create( hDrawDC, iPixelFormat );
if (!fb)