- added some tracing in the fake ZBuffer methods

- added support for the DEPTH_FILL BLT
- set by defaut perspective correction to nicest.
- decrease the limit where 'w' is ignored
This commit is contained in:
Lionel Ulmer 2003-01-02 19:58:21 +00:00 committed by Alexandre Julliard
parent f0541aa544
commit bb9837d2a4
7 changed files with 53 additions and 15 deletions

View File

@ -59,6 +59,9 @@ struct IDirect3DImpl
/* Used as a callback for Devices to tell to the D3D object it's been created */ /* Used as a callback for Devices to tell to the D3D object it's been created */
HRESULT (*added_device)(IDirect3DImpl *d3d, IDirect3DDeviceImpl *device); HRESULT (*added_device)(IDirect3DImpl *d3d, IDirect3DDeviceImpl *device);
HRESULT (*removed_device)(IDirect3DImpl *d3d, IDirect3DDeviceImpl *device); HRESULT (*removed_device)(IDirect3DImpl *d3d, IDirect3DDeviceImpl *device);
/* This is needed for delayed texture creation and Z buffer blits */
IDirect3DDeviceImpl *current_device;
}; };
/***************************************************************************** /*****************************************************************************

View File

@ -924,7 +924,7 @@ inline static void handle_xyz(D3DVALUE *coords) {
glVertex3fv(coords); glVertex3fv(coords);
} }
inline static void handle_xyzrhw(D3DVALUE *coords) { inline static void handle_xyzrhw(D3DVALUE *coords) {
if (coords[3] < 0.00001) if (coords[3] < 1e-8)
glVertex3fv(coords); glVertex3fv(coords);
else { else {
GLfloat w = 1.0 / coords[3]; GLfloat w = 1.0 / coords[3];
@ -1977,6 +1977,7 @@ d3ddevice_create(IDirect3DDeviceImpl **obj, IDirect3DImpl *d3d, IDirectDrawSurfa
object->set_context(object); object->set_context(object);
ENTER_GL(); ENTER_GL();
TRACE(" current context set\n"); TRACE(" current context set\n");
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glClearColor(0.0, 0.0, 0.0, 0.0); glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glDrawBuffer(buffer); glDrawBuffer(buffer);

View File

@ -125,7 +125,7 @@ static void _dump_D3DEXECUTEBUFFERDESC(LPD3DEXECUTEBUFFERDESC lpDesc) {
((col >> 8) & 0xFF) / 255.0, \ ((col >> 8) & 0xFF) / 255.0, \
((col >> 0) & 0xFF) / 255.0); \ ((col >> 0) & 0xFF) / 255.0); \
glTexCoord2f(vx->u7.tu, vx->u8.tv); \ glTexCoord2f(vx->u7.tu, vx->u8.tv); \
if (vx->u4.rhw < 0.01) \ if (vx->u4.rhw < 1e-8) \
glVertex3f(vx->u1.sx, \ glVertex3f(vx->u1.sx, \
vx->u2.sy, \ vx->u2.sy, \
vx->u3.sz); \ vx->u3.sz); \

View File

@ -662,14 +662,12 @@ ICOM_VTABLE(IDirect3DTexture) VTABLE_IDirect3DTexture =
HRESULT d3dtexture_create(IDirect3DImpl *d3d, IDirectDrawSurfaceImpl *surf, BOOLEAN at_creation, HRESULT d3dtexture_create(IDirect3DImpl *d3d, IDirectDrawSurfaceImpl *surf, BOOLEAN at_creation,
IDirectDrawSurfaceImpl *main) IDirectDrawSurfaceImpl *main)
{ {
IDirect3DGLImpl *gl_d3d = (IDirect3DGLImpl *) d3d;
/* First, initialize the texture vtables... */ /* First, initialize the texture vtables... */
ICOM_INIT_INTERFACE(surf, IDirect3DTexture, VTABLE_IDirect3DTexture); ICOM_INIT_INTERFACE(surf, IDirect3DTexture, VTABLE_IDirect3DTexture);
ICOM_INIT_INTERFACE(surf, IDirect3DTexture2, VTABLE_IDirect3DTexture2); ICOM_INIT_INTERFACE(surf, IDirect3DTexture2, VTABLE_IDirect3DTexture2);
/* Only create all the private stuff if we actually have an OpenGL context.. */ /* Only create all the private stuff if we actually have an OpenGL context.. */
if (gl_d3d->current_device != NULL) { if (d3d->current_device != NULL) {
IDirect3DTextureGLImpl *private; IDirect3DTextureGLImpl *private;
private = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DTextureGLImpl)); private = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DTextureGLImpl));

View File

@ -379,9 +379,7 @@ ICOM_VTABLE(IDirect3D) VTABLE_IDirect3D =
static HRESULT d3d_add_device(IDirect3DImpl *This, IDirect3DDeviceImpl *device) static HRESULT d3d_add_device(IDirect3DImpl *This, IDirect3DDeviceImpl *device)
{ {
IDirect3DGLImpl *glThis = (IDirect3DGLImpl *) This; if (This->current_device == NULL) {
if (glThis->current_device == NULL) {
/* Create delayed textures now that we have an OpenGL context... /* Create delayed textures now that we have an OpenGL context...
For that, go through all surface attached to our DDraw object and create For that, go through all surface attached to our DDraw object and create
OpenGL textures for all textures.. */ OpenGL textures for all textures.. */
@ -396,16 +394,14 @@ static HRESULT d3d_add_device(IDirect3DImpl *This, IDirect3DDeviceImpl *device)
} }
} }
/* For the moment, only one device 'supported'... */ /* For the moment, only one device 'supported'... */
glThis->current_device = device; This->current_device = device;
return DD_OK; return DD_OK;
} }
static HRESULT d3d_remove_device(IDirect3DImpl *This, IDirect3DDeviceImpl *device) static HRESULT d3d_remove_device(IDirect3DImpl *This, IDirect3DDeviceImpl *device)
{ {
IDirect3DGLImpl *glThis = (IDirect3DGLImpl *) This; This->current_device = NULL;
glThis->current_device = NULL;
return DD_OK; return DD_OK;
} }

View File

@ -34,6 +34,7 @@
#include "ddcomimpl.h" #include "ddcomimpl.h"
#include "ddraw_private.h" #include "ddraw_private.h"
#include "d3d_private.h"
#include "dsurface/main.h" #include "dsurface/main.h"
#include "dsurface/fakezbuffer.h" #include "dsurface/fakezbuffer.h"
@ -114,6 +115,33 @@ FakeZBuffer_DirectDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rdst,
LPDIRECTDRAWSURFACE7 src, LPRECT rsrc, LPDIRECTDRAWSURFACE7 src, LPRECT rsrc,
DWORD dwFlags, LPDDBLTFX lpbltfx) DWORD dwFlags, LPDDBLTFX lpbltfx)
{ {
ICOM_THIS(IDirectDrawSurfaceImpl,iface);
if (TRACE_ON(ddraw)) {
TRACE("(%p)->(%p,%p,%p,%08lx,%p)\n", This,rdst,src,rsrc,dwFlags,lpbltfx);
if (rdst) TRACE("\tdestrect :%dx%d-%dx%d\n",rdst->left,rdst->top,rdst->right,rdst->bottom);
if (rsrc) TRACE("\tsrcrect :%dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom);
TRACE("\tflags: ");
DDRAW_dump_DDBLT(dwFlags);
if (dwFlags & DDBLT_DDFX) {
TRACE("\tblitfx: ");
DDRAW_dump_DDBLTFX(lpbltfx->dwDDFX);
}
}
/* We only support the BLT with DEPTH_FILL for now */
if (This->ddraw_owner->d3d != NULL) {
if (This->ddraw_owner->d3d->current_device != NULL) {
This->ddraw_owner->d3d->current_device->clear(This->ddraw_owner->d3d->current_device,
0, NULL, /* Clear the whole screen */
D3DCLEAR_ZBUFFER,
0x00000000,
((double) lpbltfx->u5.dwFillDepth) / 4294967295.0,
0x00000000);
return DD_OK;
}
}
return cant_do_that("blt to a"); return cant_do_that("blt to a");
} }
@ -122,6 +150,21 @@ FakeZBuffer_DirectDrawSurface_BltFast(LPDIRECTDRAWSURFACE7 iface, DWORD dstx,
DWORD dsty, LPDIRECTDRAWSURFACE7 src, DWORD dsty, LPDIRECTDRAWSURFACE7 src,
LPRECT rsrc, DWORD trans) LPRECT rsrc, DWORD trans)
{ {
ICOM_THIS(IDirectDrawSurfaceImpl,iface);
if (TRACE_ON(ddraw)) {
FIXME("(%p)->(%ld,%ld,%p,%p,%08lx)\n",
This,dstx,dsty,src,rsrc,trans
);
FIXME("\ttrans:");
if (FIXME_ON(ddraw))
DDRAW_dump_DDBLTFAST(trans);
if (rsrc)
FIXME("\tsrcrect: %dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom);
else
FIXME(" srcrect: NULL\n");
}
return cant_do_that("bltfast to a"); return cant_do_that("bltfast to a");
} }

View File

@ -82,9 +82,6 @@ typedef struct IDirect3DGLImpl
struct IDirect3DImpl parent; struct IDirect3DImpl parent;
int free_lights; int free_lights;
void (*light_released)(IDirect3DImpl *, GLenum light_num); void (*light_released)(IDirect3DImpl *, GLenum light_num);
/* This is needed for delayed texture creation */
struct IDirect3DDeviceImpl *current_device;
} IDirect3DGLImpl; } IDirect3DGLImpl;
typedef struct IDirect3DLightGLImpl typedef struct IDirect3DLightGLImpl