From 8cd26095872434cb61cc65df951935d510b60b02 Mon Sep 17 00:00:00 2001 From: Lionel Ulmer Date: Thu, 2 Jan 2003 19:39:57 +0000 Subject: [PATCH] Enable the application to create first textures and then the D3D device. --- dlls/ddraw/d3d_private.h | 6 +- dlls/ddraw/d3ddevice/mesa.c | 6 ++ dlls/ddraw/d3dtexture.c | 161 +++++++++++++++++++++++--------------------- dlls/ddraw/ddraw/main.c | 13 +++- dlls/ddraw/ddraw_private.h | 3 + dlls/ddraw/direct3d/mesa.c | 36 +++++++++- dlls/ddraw/dsurface/main.c | 12 +--- dlls/ddraw/mesa_private.h | 6 +- 8 files changed, 151 insertions(+), 92 deletions(-) diff --git a/dlls/ddraw/d3d_private.h b/dlls/ddraw/d3d_private.h index e86e3d861ab..b87f4b0e794 100644 --- a/dlls/ddraw/d3d_private.h +++ b/dlls/ddraw/d3d_private.h @@ -54,7 +54,11 @@ struct IDirect3DImpl IDirectDrawImpl* ddraw; /* Used as a callback function to create a texture */ - HRESULT (*create_texture)(IDirect3DImpl *d3d, IDirectDrawSurfaceImpl *tex, BOOLEAN at_creation, IDirectDrawSurfaceImpl *main, DWORD mipmap_level); + HRESULT (*create_texture)(IDirect3DImpl *d3d, IDirectDrawSurfaceImpl *tex, BOOLEAN at_creation, IDirectDrawSurfaceImpl *main); + + /* Used as a callback for Devices to tell to the D3D object it's been created */ + HRESULT (*added_device)(IDirect3DImpl *d3d, IDirect3DDeviceImpl *device); + HRESULT (*removed_device)(IDirect3DImpl *d3d, IDirect3DDeviceImpl *device); }; /***************************************************************************** diff --git a/dlls/ddraw/d3ddevice/mesa.c b/dlls/ddraw/d3ddevice/mesa.c index b97481a7ded..2e2c36ab33f 100644 --- a/dlls/ddraw/d3ddevice/mesa.c +++ b/dlls/ddraw/d3ddevice/mesa.c @@ -302,6 +302,9 @@ GL_IDirect3DDeviceImpl_7_3T_2T_1T_Release(LPDIRECT3DDEVICE7 iface) if (This->current_texture[0] != NULL) IDirect3DTexture2_Release(ICOM_INTERFACE(This->current_texture[0], IDirect3DTexture2)); + /* And warn the D3D object that this device is no longer active... */ + This->d3d->removed_device(This->d3d, This); + ENTER_GL(); glXDestroyContext(glThis->display, glThis->gl_context); LEAVE_GL(); @@ -1880,6 +1883,9 @@ d3ddevice_create(IDirect3DDeviceImpl **obj, IDirect3DImpl *d3d, IDirectDrawSurfa *obj = object; TRACE(" creating implementation at %p.\n", *obj); + + /* And finally warn D3D that this device is now present */ + object->d3d->added_device(object->d3d, object); return DD_OK; } diff --git a/dlls/ddraw/d3dtexture.c b/dlls/ddraw/d3dtexture.c index 13dd7bff156..3c0630bdb07 100644 --- a/dlls/ddraw/d3dtexture.c +++ b/dlls/ddraw/d3dtexture.c @@ -105,7 +105,7 @@ HRESULT WINAPI gltex_setcolorkey_cb(IDirectDrawSurfaceImpl *texture, DWORD dwFla } glTexSubImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + texture->mipmap_level, 0, 0, tex_d->dwWidth, tex_d->dwHeight, GL_RGBA, @@ -200,7 +200,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { table); /* the color table */ glTexImage2D(GL_TEXTURE_2D, /* target */ - glThis->mipmap_level, /* level */ + This->mipmap_level, /* level */ GL_COLOR_INDEX8_EXT, /* internal format */ src_d->dwWidth, src_d->dwHeight, /* width, height */ 0, /* border */ @@ -222,7 +222,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { if (init_upload) glTexImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, GL_RGBA, src_d->dwWidth, src_d->dwHeight, 0, @@ -231,7 +231,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { surface); else glTexSubImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, 0, 0, src_d->dwWidth, src_d->dwHeight, GL_RGBA, @@ -250,7 +250,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { ********************** */ if (init_upload) glTexImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, GL_RGB, src_d->dwWidth, src_d->dwHeight, 0, @@ -259,7 +259,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { src_d->lpSurface); else glTexSubImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, 0, 0, src_d->dwWidth, src_d->dwHeight, GL_RGB, @@ -269,7 +269,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { if (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x00000000) { if (init_upload) glTexImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, GL_RGB, src_d->dwWidth, src_d->dwHeight, 0, @@ -278,7 +278,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { src_d->lpSurface); else glTexSubImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, 0, 0, src_d->dwWidth, src_d->dwHeight, GL_RGB, @@ -288,7 +288,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { } else if (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x00000001) { if (init_upload) glTexImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, GL_RGBA, src_d->dwWidth, src_d->dwHeight, 0, @@ -297,7 +297,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { src_d->lpSurface); else glTexSubImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, 0, 0, src_d->dwWidth, src_d->dwHeight, GL_RGBA, @@ -306,7 +306,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { } else if (src_d->ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x0000000F) { if (init_upload) glTexImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, GL_RGBA, src_d->dwWidth, src_d->dwHeight, 0, @@ -315,7 +315,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { src_d->lpSurface); else glTexSubImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, 0, 0, src_d->dwWidth, src_d->dwHeight, GL_RGBA, @@ -335,7 +335,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { if (init_upload) glTexImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, GL_RGBA, src_d->dwWidth, src_d->dwHeight, 0, @@ -344,7 +344,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { surface); else glTexSubImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, 0, 0, src_d->dwWidth, src_d->dwHeight, GL_RGBA, @@ -366,7 +366,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { if (init_upload) glTexImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, GL_RGBA, src_d->dwWidth, src_d->dwHeight, 0, @@ -375,7 +375,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { surface); else glTexSubImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, 0, 0, src_d->dwWidth, src_d->dwHeight, GL_RGBA, @@ -389,7 +389,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { } else if (src_d->ddpfPixelFormat.u1.dwRGBBitCount == 24) { if (init_upload) glTexImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, GL_RGB, src_d->dwWidth, src_d->dwHeight, 0, @@ -398,7 +398,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { src_d->lpSurface); else glTexSubImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, 0, 0, src_d->dwWidth, src_d->dwHeight, GL_RGB, @@ -407,7 +407,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { } else if (src_d->ddpfPixelFormat.u1.dwRGBBitCount == 32) { if (init_upload) glTexImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, GL_RGBA, src_d->dwWidth, src_d->dwHeight, 0, @@ -416,7 +416,7 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *This, BOOLEAN init_upload) { src_d->lpSurface); else glTexSubImage2D(GL_TEXTURE_2D, - glThis->mipmap_level, + This->mipmap_level, 0, 0, src_d->dwWidth, src_d->dwHeight, GL_RGBA, @@ -571,16 +571,18 @@ GL_IDirect3DTextureImpl_2_1T_Load(LPDIRECT3DTEXTURE2 iface, TRACE("(%p/%p)->(%p)\n", This, iface, lpD3DTexture2); - if (glThis->loaded == FALSE) { - /* Only check memory for not already loaded texture... */ - mem_used = This->surface_desc.dwHeight * - This->surface_desc.u1.lPitch; - if (This->ddraw_owner->allocate_memory(This->ddraw_owner, mem_used) < 0) { - TRACE(" out of virtual memory... Warning application.\n"); - return D3DERR_TEXTURE_LOAD_FAILED; + if (glThis != NULL) { + if (glThis->loaded == FALSE) { + /* Only check memory for not already loaded texture... */ + mem_used = This->surface_desc.dwHeight * + This->surface_desc.u1.lPitch; + if (This->ddraw_owner->allocate_memory(This->ddraw_owner, mem_used) < 0) { + TRACE(" out of virtual memory... Warning application.\n"); + return D3DERR_TEXTURE_LOAD_FAILED; + } } + glThis->loaded = TRUE; } - glThis->loaded = TRUE; TRACE("Copied surface %p to surface %p\n", lpD3DTextureImpl, This); @@ -616,18 +618,20 @@ GL_IDirect3DTextureImpl_2_1T_Load(LPDIRECT3DTEXTURE2 iface, texture object. */ memcpy(dst_d->lpSurface, src_d->lpSurface, src_d->u1.lPitch * src_d->dwHeight); - /* If the GetHandle was not done, it is an error... */ - if (glThis->tex_name == 0) ERR("Unbound GL texture !!!\n"); - - ENTER_GL(); - - /* Now, load the texture */ - /* d3dd->set_context(d3dd); We need to set the context somehow.... */ + if (glThis != NULL) { + /* If the GetHandle was not done, it is an error... */ + if (glThis->tex_name == 0) ERR("Unbound GL texture !!!\n"); - gltex_upload_texture(This, glThis->first_unlock); - glThis->first_unlock = FALSE; - - LEAVE_GL(); + ENTER_GL(); + + /* Now, load the texture */ + /* d3dd->set_context(d3dd); We need to set the context somehow.... */ + + gltex_upload_texture(This, glThis->first_unlock); + glThis->first_unlock = FALSE; + + LEAVE_GL(); + } } return D3D_OK; @@ -760,50 +764,55 @@ ICOM_VTABLE(IDirect3DTexture) VTABLE_IDirect3DTexture = #endif HRESULT d3dtexture_create(IDirect3DImpl *d3d, IDirectDrawSurfaceImpl *surf, BOOLEAN at_creation, - IDirectDrawSurfaceImpl *main, DWORD mipmap_level) + IDirectDrawSurfaceImpl *main) { - IDirect3DTextureGLImpl *private; - - private = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DTextureGLImpl)); - if (private == NULL) return DDERR_OUTOFMEMORY; + IDirect3DGLImpl *gl_d3d = (IDirect3DGLImpl *) d3d; - private->final_release = surf->final_release; - private->lock_update = surf->lock_update; - private->unlock_update = surf->unlock_update; - private->mipmap_level = mipmap_level; - - /* If at creation, we can optimize stuff and wait the first 'unlock' to upload a valid stuff to OpenGL. - Otherwise, it will be uploaded here (and may be invalid). */ - if (at_creation == TRUE) - private->first_unlock = TRUE; - else - private->first_unlock = FALSE; - surf->final_release = gltex_final_release; - surf->lock_update = gltex_lock_update; - surf->unlock_update = gltex_unlock_update; - surf->tex_private = private; - surf->SetColorKey_cb = gltex_setcolorkey_cb; - + /* First, initialize the texture vtables... */ ICOM_INIT_INTERFACE(surf, IDirect3DTexture, VTABLE_IDirect3DTexture); ICOM_INIT_INTERFACE(surf, IDirect3DTexture2, VTABLE_IDirect3DTexture2); + + /* Only create all the private stuff if we actually have an OpenGL context.. */ + if (gl_d3d->current_device != NULL) { + IDirect3DTextureGLImpl *private; - ENTER_GL(); - if (mipmap_level == 0) { - glGenTextures(1, &(private->tex_name)); - if (private->tex_name == 0) ERR("Error at creation of OpenGL texture ID !\n"); - TRACE(" GL texture created for surface %p (private data at %p and GL id %d).\n", surf, private, private->tex_name); - } else { - private->tex_name = ((IDirect3DTextureGLImpl *) (main->tex_private))->tex_name; - TRACE(" GL texture created for surface %p (private data at %p and GL id reusing id %d from surface %p (%p)).\n", - surf, private, private->tex_name, main, main->tex_private); - } + private = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DTextureGLImpl)); + if (private == NULL) return DDERR_OUTOFMEMORY; + + private->final_release = surf->final_release; + private->lock_update = surf->lock_update; + private->unlock_update = surf->unlock_update; + + /* If at creation, we can optimize stuff and wait the first 'unlock' to upload a valid stuff to OpenGL. + Otherwise, it will be uploaded here (and may be invalid). */ + if (at_creation == TRUE) + private->first_unlock = TRUE; + else + private->first_unlock = FALSE; + surf->final_release = gltex_final_release; + surf->lock_update = gltex_lock_update; + surf->unlock_update = gltex_unlock_update; + surf->tex_private = private; + surf->SetColorKey_cb = gltex_setcolorkey_cb; + + ENTER_GL(); + if (surf->mipmap_level == 0) { + glGenTextures(1, &(private->tex_name)); + if (private->tex_name == 0) ERR("Error at creation of OpenGL texture ID !\n"); + TRACE(" GL texture created for surface %p (private data at %p and GL id %d).\n", surf, private, private->tex_name); + } else { + private->tex_name = ((IDirect3DTextureGLImpl *) (main->tex_private))->tex_name; + TRACE(" GL texture created for surface %p (private data at %p and GL id reusing id %d from surface %p (%p)).\n", + surf, private, private->tex_name, main, main->tex_private); + } - if ((at_creation == FALSE) && - ((surf->surface_desc.ddsCaps.dwCaps & DDSCAPS_ALLOCONLOAD) == 0)) - { - gltex_upload_texture(surf, TRUE); + if ((at_creation == FALSE) && + ((surf->surface_desc.ddsCaps.dwCaps & DDSCAPS_ALLOCONLOAD) == 0)) + { + gltex_upload_texture(surf, TRUE); + } + LEAVE_GL(); } - LEAVE_GL(); return D3D_OK; } diff --git a/dlls/ddraw/ddraw/main.c b/dlls/ddraw/ddraw/main.c index 69e18817f6f..5eec3221683 100644 --- a/dlls/ddraw/ddraw/main.c +++ b/dlls/ddraw/ddraw/main.c @@ -359,7 +359,7 @@ create_texture(IDirectDrawImpl* This, const DDSURFACEDESC2 *pDDSD, if (FAILED(hr)) return hr; if (This->d3d) This->d3d->create_texture(This->d3d, ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, *ppSurf), TRUE, - ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, *ppSurf), mipmap_level); + ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, *ppSurf)); /* Create attached mipmaps if required. */ if (more_mipmaps(&ddsd)) @@ -375,8 +375,9 @@ create_texture(IDirectDrawImpl* This, const DDSURFACEDESC2 *pDDSD, while (more_mipmaps(&mipmap_surface_desc)) { + IDirectDrawSurfaceImpl *mipmap_impl; + mipmap_level++; - mipmap_surface_desc.u2.dwMipMapCount--; if (mipmap_surface_desc.dwWidth > 1) @@ -397,8 +398,14 @@ create_texture(IDirectDrawImpl* This, const DDSURFACEDESC2 *pDDSD, IDirectDrawSurface7_Release(*ppSurf); return hr; } + + /* This is needed for delayed mipmap creation */ + mipmap_impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, mipmap); + mipmap_impl->mip_main = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, *ppSurf); + mipmap_impl->mipmap_level = mipmap_level; + if (This->d3d) This->d3d->create_texture(This->d3d, ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, mipmap), TRUE, - ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, *ppSurf), mipmap_level); + ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, *ppSurf)); IDirectDrawSurface7_AddAttachedSurface(prev_mipmap, mipmap); IDirectDrawSurface7_Release(prev_mipmap); diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index 74cd10dcb18..1be6dc4db97 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -297,6 +297,9 @@ struct IDirectDrawSurfaceImpl HRESULT (WINAPI *SetColorKey_cb)(struct IDirectDrawSurfaceImpl *texture, DWORD dwFlags, LPDDCOLORKEY ckey ) ; /* This is to get the D3DDevice object associated to this surface */ struct IDirect3DDeviceImpl *d3ddevice; + /* This is for texture */ + IDirectDrawSurfaceImpl *mip_main; + int mipmap_level; LPVOID tex_private; }; diff --git a/dlls/ddraw/direct3d/mesa.c b/dlls/ddraw/direct3d/mesa.c index 0b70111195a..6583a31d72e 100644 --- a/dlls/ddraw/direct3d/mesa.c +++ b/dlls/ddraw/direct3d/mesa.c @@ -377,6 +377,38 @@ ICOM_VTABLE(IDirect3D) VTABLE_IDirect3D = #undef XCAST #endif +static HRESULT d3d_add_device(IDirect3DImpl *This, IDirect3DDeviceImpl *device) +{ + IDirect3DGLImpl *glThis = (IDirect3DGLImpl *) This; + + if (glThis->current_device == NULL) { + /* Create delayed textures now that we have an OpenGL context... + For that, go through all surface attached to our DDraw object and create + OpenGL textures for all textures.. */ + IDirectDrawSurfaceImpl *surf = This->ddraw->surfaces; + + while (surf != NULL) { + if (surf->surface_desc.ddsCaps.dwCaps & DDSCAPS_TEXTURE) { + /* Found a texture.. Now create the OpenGL part */ + d3dtexture_create(This, surf, FALSE, surf->mip_main); + } + surf = surf->next_ddraw; + } + } + /* For the moment, only one device 'supported'... */ + glThis->current_device = device; + + return DD_OK; +} + +static HRESULT d3d_remove_device(IDirect3DImpl *This, IDirect3DDeviceImpl *device) +{ + IDirect3DGLImpl *glThis = (IDirect3DGLImpl *) This; + + glThis->current_device = NULL; + return DD_OK; +} + HRESULT direct3d_create(IDirect3DImpl **obj, IDirectDrawImpl *ddraw) { IDirect3DImpl *object; @@ -388,7 +420,9 @@ HRESULT direct3d_create(IDirect3DImpl **obj, IDirectDrawImpl *ddraw) object->ref = 1; object->ddraw = ddraw; object->create_texture = d3dtexture_create; - + object->added_device = d3d_add_device; + object->removed_device = d3d_remove_device; + ICOM_INIT_INTERFACE(object, IDirect3D, VTABLE_IDirect3D); ICOM_INIT_INTERFACE(object, IDirect3D2, VTABLE_IDirect3D2); ICOM_INIT_INTERFACE(object, IDirect3D3, VTABLE_IDirect3D3); diff --git a/dlls/ddraw/dsurface/main.c b/dlls/ddraw/dsurface/main.c index cfaac3f4787..0f8e5f328b5 100644 --- a/dlls/ddraw/dsurface/main.c +++ b/dlls/ddraw/dsurface/main.c @@ -193,22 +193,16 @@ Main_DirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface, REFIID riid, { HRESULT ret_value = S_OK; - /* In case the texture surface was created before the D3D creation */ if ((This->surface_desc.ddsCaps.dwCaps & DDSCAPS_TEXTURE) == 0) return E_NOINTERFACE; - /* Create a 'delayed' private field only if it is not an offscreen texture... */ + + /* In case the texture surface was created before the D3D creation */ if (This->tex_private == NULL) { if (This->ddraw_owner->d3d == NULL) { ERR("Texture created with no D3D object yet.. Not supported !\n"); return E_NOINTERFACE; } - if (((This->surface_desc.dwFlags & DDSD_MIPMAPCOUNT) && - (This->surface_desc.u2.dwMipMapCount > 1)) || - (This->surface_desc.ddsCaps.dwCaps2 & DDSCAPS2_MIPMAPSUBLEVEL)) { - ERR(" need to fix mipmaping in this case !!\n"); - } - - ret_value = This->ddraw_owner->d3d->create_texture(This->ddraw_owner->d3d, This, FALSE, NULL, 0); + ret_value = This->ddraw_owner->d3d->create_texture(This->ddraw_owner->d3d, This, FALSE, This->mip_main); if (FAILED(ret_value)) return ret_value; } if (IsEqualGUID( &IID_IDirect3DTexture, riid )) { diff --git a/dlls/ddraw/mesa_private.h b/dlls/ddraw/mesa_private.h index 6f4ad311edf..5e461c28763 100644 --- a/dlls/ddraw/mesa_private.h +++ b/dlls/ddraw/mesa_private.h @@ -78,6 +78,9 @@ typedef struct IDirect3DGLImpl struct IDirect3DImpl parent; int free_lights; void (*light_released)(IDirect3DImpl *, GLenum light_num); + + /* This is needed for delayed texture creation */ + struct IDirect3DDeviceImpl *current_device; } IDirect3DGLImpl; typedef struct IDirect3DLightGLImpl @@ -92,7 +95,6 @@ typedef struct IDirect3DTextureGLImpl GLuint tex_name; BOOLEAN loaded; /* For the moment, this is here.. Should be part of surface management though */ BOOLEAN first_unlock; - DWORD mipmap_level; /* This is for now used to override 'standard' surface stuff to be as transparent as possible */ void (*final_release)(struct IDirectDrawSurfaceImpl *This); void (*lock_update)(IDirectDrawSurfaceImpl* This, LPCRECT pRect, DWORD dwFlags); @@ -123,7 +125,7 @@ typedef struct IDirect3DDeviceGLImpl /* All non-static functions 'exported' by various sub-objects */ extern HRESULT direct3d_create(IDirect3DImpl **obj, IDirectDrawImpl *ddraw); -extern HRESULT d3dtexture_create(IDirect3DImpl *d3d, IDirectDrawSurfaceImpl *surf, BOOLEAN at_creation, IDirectDrawSurfaceImpl *main_surf, DWORD mipmap_level); +extern HRESULT d3dtexture_create(IDirect3DImpl *d3d, IDirectDrawSurfaceImpl *surf, BOOLEAN at_creation, IDirectDrawSurfaceImpl *main_surf); extern HRESULT d3dlight_create(IDirect3DLightImpl **obj, IDirect3DImpl *d3d, GLenum light_num); extern HRESULT d3dexecutebuffer_create(IDirect3DExecuteBufferImpl **obj, IDirect3DImpl *d3d, IDirect3DDeviceImpl *d3ddev, LPD3DEXECUTEBUFFERDESC lpDesc); extern HRESULT d3dmaterial_create(IDirect3DMaterialImpl **obj, IDirect3DImpl *d3d); -- 2.11.4.GIT