Fix devices creation broken code. Now, the display and the drawable
are retrieve through GDI escape sequences and stored in the private data. Add desallocation of the device private data.
This commit is contained in:
parent
2f958dd7ac
commit
427b333391
|
@ -32,6 +32,8 @@
|
||||||
|
|
||||||
#include "mesa_private.h"
|
#include "mesa_private.h"
|
||||||
|
|
||||||
|
#include "x11drv.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
|
WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
|
||||||
|
|
||||||
ICOM_VTABLE(IDirect3DDevice2) OpenGL_vtable;
|
ICOM_VTABLE(IDirect3DDevice2) OpenGL_vtable;
|
||||||
|
@ -59,6 +61,31 @@ static const float id_mat[16] = {
|
||||||
0.0, 0.0, 0.0, 1.0
|
0.0, 0.0, 0.0, 1.0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* retrieve the X display to use on a given DC */
|
||||||
|
inline static Display *get_display( HDC hdc )
|
||||||
|
{
|
||||||
|
Display *display;
|
||||||
|
enum x11drv_escape_codes escape = X11DRV_GET_DISPLAY;
|
||||||
|
|
||||||
|
if (!ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape), (LPCSTR)&escape,
|
||||||
|
sizeof(display), (LPSTR)&display )) display = NULL;
|
||||||
|
|
||||||
|
return display;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* retrieve the X drawable to use on a given DC */
|
||||||
|
inline static Drawable get_drawable( HDC hdc )
|
||||||
|
{
|
||||||
|
Drawable drawable;
|
||||||
|
enum x11drv_escape_codes escape = X11DRV_GET_DRAWABLE;
|
||||||
|
|
||||||
|
if (!ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape), (LPCSTR)&escape,
|
||||||
|
sizeof(drawable), (LPSTR)&drawable )) drawable = 0;
|
||||||
|
|
||||||
|
return drawable;
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* OpenGL static functions
|
* OpenGL static functions
|
||||||
*/
|
*/
|
||||||
|
@ -71,6 +98,15 @@ static void set_context(IDirect3DDevice2Impl* This) {
|
||||||
odev->ctx, ddpriv->drawable);
|
odev->ctx, ddpriv->drawable);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
D3DDPRIVATE(This);
|
||||||
|
|
||||||
|
ENTER_GL();
|
||||||
|
TRACE("glxMakeCurrent %p, %ld, %p\n",odev->gdi_display,odev->drawable, odev->ctx);
|
||||||
|
if (glXMakeCurrent(odev->gdi_display,odev->drawable, odev->ctx) == False) {
|
||||||
|
ERR("Error in setting current context (context %p drawable %ld)!\n",
|
||||||
|
odev->ctx, odev->drawable);
|
||||||
|
}
|
||||||
|
LEAVE_GL();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fill_opengl_primcaps(D3DPRIMCAPS *pc)
|
static void fill_opengl_primcaps(D3DPRIMCAPS *pc)
|
||||||
|
@ -167,7 +203,12 @@ is_OpenGL(
|
||||||
IDirect3DDevice2Impl** device, IDirect3D2Impl* d3d
|
IDirect3DDevice2Impl** device, IDirect3D2Impl* d3d
|
||||||
) {
|
) {
|
||||||
mesa_d3dd_private *odev = NULL;
|
mesa_d3dd_private *odev = NULL;
|
||||||
|
HDC device_context;
|
||||||
|
XVisualInfo *vis;
|
||||||
|
int num;
|
||||||
|
XVisualInfo template;
|
||||||
|
|
||||||
|
TRACE("rguid = %s, surface = %p, &device = %p, d3d = %p\n",debugstr_guid(rguid),surface,device,d3d);
|
||||||
if (/* Default device */
|
if (/* Default device */
|
||||||
(rguid == NULL) ||
|
(rguid == NULL) ||
|
||||||
/* HAL Device */
|
/* HAL Device */
|
||||||
|
@ -188,27 +229,31 @@ is_OpenGL(
|
||||||
|
|
||||||
TRACE("Creating OpenGL device for surface %p\n", surface);
|
TRACE("Creating OpenGL device for surface %p\n", surface);
|
||||||
/* Create the OpenGL context */
|
/* Create the OpenGL context */
|
||||||
#if COMPILABLE
|
|
||||||
/* First get the correct visual */
|
/* First get the correct visual */
|
||||||
ENTER_GL();
|
|
||||||
/* Create the context */
|
/* Create the context */
|
||||||
{
|
|
||||||
XVisualInfo *vis;
|
device_context = GetDC((*device)->surface->ddraw_owner->window);
|
||||||
int num;
|
odev->gdi_display = get_display(device_context);
|
||||||
XVisualInfo template;
|
odev->drawable = get_drawable(device_context);
|
||||||
|
ReleaseDC((*device)->surface->ddraw_owner->window,device_context);
|
||||||
|
ENTER_GL();
|
||||||
|
|
||||||
template.visualid = XVisualIDFromVisual(visual);
|
template.visualid = GetPropA( GetDesktopWindow(), "__wine_x11_visual_id" );
|
||||||
vis = XGetVisualInfo(gdi_display, VisualIDMask, &template, &num);
|
vis = XGetVisualInfo(odev->gdi_display, VisualIDMask, &template, &num);
|
||||||
|
if (vis == NULL)
|
||||||
|
ERR("No visual found !\n");
|
||||||
|
else
|
||||||
|
TRACE("Visual found\n");
|
||||||
|
|
||||||
odev->ctx = glXCreateContext(gdi_display, vis,
|
odev->ctx = glXCreateContext(odev->gdi_display, vis,
|
||||||
NULL, GL_TRUE);
|
NULL, GL_TRUE);
|
||||||
}
|
|
||||||
|
|
||||||
if (odev->ctx == NULL)
|
if (odev->ctx == NULL)
|
||||||
ERR("Error in context creation !\n");
|
ERR("Error in context creation !\n");
|
||||||
else
|
else
|
||||||
TRACE("Context created (%p)\n", odev->ctx);
|
TRACE("Context created (%p)\n", odev->ctx);
|
||||||
|
|
||||||
|
#if COMPILABLE
|
||||||
/* Now override the surface's Flip method (if in double buffering) */
|
/* Now override the surface's Flip method (if in double buffering) */
|
||||||
((x11_ds_private *) surface->private)->opengl_flip = TRUE;
|
((x11_ds_private *) surface->private)->opengl_flip = TRUE;
|
||||||
{
|
{
|
||||||
|
@ -237,7 +282,9 @@ is_OpenGL(
|
||||||
|
|
||||||
/* Initialisation */
|
/* Initialisation */
|
||||||
TRACE("Setting current context\n");
|
TRACE("Setting current context\n");
|
||||||
|
LEAVE_GL();
|
||||||
(*device)->set_context(*device);
|
(*device)->set_context(*device);
|
||||||
|
ENTER_GL();
|
||||||
TRACE("Current context set\n");
|
TRACE("Current context set\n");
|
||||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||||
glColor3f(1.0, 1.0, 1.0);
|
glColor3f(1.0, 1.0, 1.0);
|
||||||
|
@ -259,16 +306,15 @@ is_OpenGL(
|
||||||
static ULONG WINAPI MESA_IDirect3DDevice2Impl_Release(LPDIRECT3DDEVICE2 iface)
|
static ULONG WINAPI MESA_IDirect3DDevice2Impl_Release(LPDIRECT3DDEVICE2 iface)
|
||||||
{
|
{
|
||||||
ICOM_THIS(IDirect3DDevice2Impl,iface);
|
ICOM_THIS(IDirect3DDevice2Impl,iface);
|
||||||
FIXME("(%p)->() decrementing from %lu.\n", This, This->ref );
|
TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
|
||||||
|
|
||||||
if (!--(This->ref)) {
|
if (!--(This->ref)) {
|
||||||
#if 0 /* broken for now */
|
|
||||||
D3DDPRIVATE(This);
|
D3DDPRIVATE(This);
|
||||||
|
|
||||||
ENTER_GL();
|
ENTER_GL();
|
||||||
glXDestroyContext(gdi_display, odev->ctx);
|
glXDestroyContext(odev->gdi_display, odev->ctx);
|
||||||
LEAVE_GL();
|
LEAVE_GL();
|
||||||
#endif
|
HeapFree(GetProcessHeap(),0,This->private);
|
||||||
This->private = NULL;
|
|
||||||
HeapFree(GetProcessHeap(),0,This);
|
HeapFree(GetProcessHeap(),0,This);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -828,12 +874,12 @@ int d3d_OpenGL_dx3(LPD3DENUMDEVICESCALLBACK cb, LPVOID context) {
|
||||||
|
|
||||||
int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDeviceImpl** device)
|
int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDeviceImpl** device)
|
||||||
{
|
{
|
||||||
|
TRACE("rguid = %s, surface = %p, &device = %p\n",debugstr_guid(rguid),surface,device);
|
||||||
if (!memcmp(&IID_D3DDEVICE_OpenGL,rguid,sizeof(IID_D3DDEVICE_OpenGL))) {
|
if (!memcmp(&IID_D3DDEVICE_OpenGL,rguid,sizeof(IID_D3DDEVICE_OpenGL))) {
|
||||||
mesa_d3dd_private *odev;
|
mesa_d3dd_private *odev;
|
||||||
#if 0 /* See below */
|
HDC device_context;
|
||||||
int attributeList[]={ GLX_RGBA, GLX_DEPTH_SIZE, 16, GLX_DOUBLEBUFFER, None };
|
int attributeList[]={ GLX_RGBA, GLX_DEPTH_SIZE, 16, GLX_DOUBLEBUFFER, None };
|
||||||
XVisualInfo *xvis;
|
XVisualInfo *xvis;
|
||||||
#endif
|
|
||||||
|
|
||||||
*device = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DDeviceImpl));
|
*device = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirect3DDeviceImpl));
|
||||||
(*device)->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dd_private));
|
(*device)->private = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(mesa_d3dd_private));
|
||||||
|
@ -854,22 +900,26 @@ int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevi
|
||||||
/* First get the correct visual */
|
/* First get the correct visual */
|
||||||
/* if (surface->s.backbuffer == NULL)
|
/* if (surface->s.backbuffer == NULL)
|
||||||
attributeList[3] = None; */
|
attributeList[3] = None; */
|
||||||
#if 0 /* non working currently */
|
device_context = GetDC((*device)->surface->ddraw_owner->window);
|
||||||
|
odev->gdi_display = get_display(device_context);
|
||||||
|
odev->drawable = get_drawable(device_context);
|
||||||
|
ReleaseDC((*device)->surface->ddraw_owner->window,device_context);
|
||||||
ENTER_GL();
|
ENTER_GL();
|
||||||
xvis = glXChooseVisual(gdi_display,
|
xvis = glXChooseVisual(odev->gdi_display,
|
||||||
DefaultScreen(gdi_display),
|
DefaultScreen(odev->gdi_display),
|
||||||
attributeList);
|
attributeList);
|
||||||
if (xvis == NULL)
|
if (xvis == NULL)
|
||||||
ERR("No visual found !\n");
|
ERR("No visual found !\n");
|
||||||
else
|
else
|
||||||
TRACE("Visual found\n");
|
TRACE("Visual found\n");
|
||||||
|
|
||||||
/* Create the context */
|
/* Create the context */
|
||||||
odev->ctx = glXCreateContext(gdi_display,
|
odev->ctx = glXCreateContext(odev->gdi_display,
|
||||||
xvis,
|
xvis,
|
||||||
NULL,
|
NULL,
|
||||||
GL_TRUE);
|
GL_TRUE);
|
||||||
TRACE("Context created\n");
|
TRACE("Context created\n");
|
||||||
|
#if 0
|
||||||
/* Now override the surface's Flip method (if in double buffering) */
|
/* Now override the surface's Flip method (if in double buffering) */
|
||||||
surface->s.d3d_device = (void *) odev;
|
surface->s.d3d_device = (void *) odev;
|
||||||
{
|
{
|
||||||
|
@ -890,10 +940,12 @@ int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevi
|
||||||
odev->proj_mat = (LPD3DMATRIX) &id_mat;
|
odev->proj_mat = (LPD3DMATRIX) &id_mat;
|
||||||
|
|
||||||
/* Initialisation */
|
/* Initialisation */
|
||||||
|
LEAVE_GL();
|
||||||
(*device)->set_context(*device);
|
(*device)->set_context(*device);
|
||||||
|
ENTER_GL();
|
||||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||||
glColor3f(1.0, 1.0, 1.0);
|
glColor3f(1.0, 1.0, 1.0);
|
||||||
|
LEAVE_GL();
|
||||||
fill_device_capabilities((IDirectDrawImpl *) surface->ddraw_owner);
|
fill_device_capabilities((IDirectDrawImpl *) surface->ddraw_owner);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -906,16 +958,14 @@ int is_OpenGL_dx3(REFCLSID rguid, IDirectDrawSurfaceImpl* surface, IDirect3DDevi
|
||||||
static ULONG WINAPI MESA_IDirect3DDeviceImpl_Release(LPDIRECT3DDEVICE iface)
|
static ULONG WINAPI MESA_IDirect3DDeviceImpl_Release(LPDIRECT3DDEVICE iface)
|
||||||
{
|
{
|
||||||
ICOM_THIS(IDirect3DDeviceImpl,iface);
|
ICOM_THIS(IDirect3DDeviceImpl,iface);
|
||||||
FIXME("(%p)->() decrementing from %lu.\n", This, This->ref );
|
TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
|
||||||
|
|
||||||
if (!--(This->ref)) {
|
if (!--(This->ref)) {
|
||||||
#if 0 /* broken for now */
|
|
||||||
D3DDPRIVATE(This);
|
D3DDPRIVATE(This);
|
||||||
ENTER_GL();
|
ENTER_GL();
|
||||||
glXDestroyContext(gdi_display, odev->ctx);
|
glXDestroyContext(odev->gdi_display, odev->ctx);
|
||||||
LEAVE_GL();
|
LEAVE_GL();
|
||||||
#endif
|
HeapFree(GetProcessHeap(),0,This->private);
|
||||||
This->private = NULL;
|
|
||||||
HeapFree(GetProcessHeap(),0,This);
|
HeapFree(GetProcessHeap(),0,This);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,6 +133,9 @@ typedef struct mesa_d3dd_private {
|
||||||
D3DMATRIX *world_mat;
|
D3DMATRIX *world_mat;
|
||||||
D3DMATRIX *view_mat;
|
D3DMATRIX *view_mat;
|
||||||
D3DMATRIX *proj_mat;
|
D3DMATRIX *proj_mat;
|
||||||
|
|
||||||
|
Display *gdi_display;
|
||||||
|
Drawable drawable;
|
||||||
} mesa_d3dd_private;
|
} mesa_d3dd_private;
|
||||||
|
|
||||||
#define _dump_colorvalue(s,v) \
|
#define _dump_colorvalue(s,v) \
|
||||||
|
|
Loading…
Reference in New Issue