Enable the application to create first textures and then the D3D
device.
This commit is contained in:
parent
5a23a0012f
commit
8cd2609587
|
@ -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);
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
if (glThis != NULL) {
|
||||
/* 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.... */
|
||||
|
||||
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;
|
||||
IDirect3DGLImpl *gl_d3d = (IDirect3DGLImpl *) d3d;
|
||||
|
||||
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;
|
||||
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;
|
||||
|
||||
if ((at_creation == FALSE) &&
|
||||
((surf->surface_desc.ddsCaps.dwCaps & DDSCAPS_ALLOCONLOAD) == 0))
|
||||
{
|
||||
gltex_upload_texture(surf, TRUE);
|
||||
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);
|
||||
}
|
||||
LEAVE_GL();
|
||||
}
|
||||
LEAVE_GL();
|
||||
|
||||
return D3D_OK;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 )) {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue