[D3D 40] Improvements of the Clear method
Lionel Ulmer
lionel.ulmer at free.fr
Mon Dec 23 12:26:18 CST 2002
Changelog:
- factorize Clear method between Viewport and Device
- some more rendering states handled
--
Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3ddevice/main.c 2002-12-23 18:33:13.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3ddevice/main.c 2002-12-23 18:32:36.000000000 +0100
@@ -191,8 +191,8 @@
DWORD dwStencil)
{
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
- FIXME("(%p/%p)->(%08lx,%p,%08lx,%08lx,%f,%08lx): stub!\n", This, iface, dwCount, lpRects, dwFlags, (DWORD) dwColor, dvZ, dwStencil);
- return DD_OK;
+ TRACE("(%p/%p)->(%08lx,%p,%08lx,%08lx,%f,%08lx)\n", This, iface, dwCount, lpRects, dwFlags, (DWORD) dwColor, dvZ, dwStencil);
+ return This->clear(This, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
}
HRESULT WINAPI
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3ddevice/mesa.c 2002-12-23 18:33:15.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3ddevice/mesa.c 2002-12-23 18:21:34.000000000 +0100
@@ -1575,6 +1575,83 @@
#undef XCAST
#endif
+static HRESULT d3ddevice_clear(IDirect3DDeviceImpl *This,
+ DWORD dwCount,
+ LPD3DRECT lpRects,
+ DWORD dwFlags,
+ DWORD dwColor,
+ D3DVALUE dvZ,
+ DWORD dwStencil)
+{
+ GLboolean ztest;
+ GLfloat old_z_clear_value;
+ GLbitfield bitfield = 0;
+ GLint old_stencil_clear_value;
+ GLfloat old_color_clear_value[4];
+
+ TRACE("(%p)->(%08lx,%p,%08lx,%08lx,%f,%08lx)\n", This, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
+ if (TRACE_ON(ddraw)) {
+ int i;
+ TRACE(" rectangles : \n");
+ for (i = 0; i < dwCount; i++) {
+ TRACE(" - %ld x %ld %ld x %ld\n", lpRects[i].u1.x1, lpRects[i].u2.y1, lpRects[i].u3.x2, lpRects[i].u4.y2);
+ }
+ }
+
+ if (dwCount != 1) {
+ WARN(" Warning, this function only for now clears the whole screen...\n");
+ }
+
+ /* Clears the screen */
+ ENTER_GL();
+ if (dwFlags & D3DCLEAR_ZBUFFER) {
+ bitfield |= GL_DEPTH_BUFFER_BIT;
+ glGetBooleanv(GL_DEPTH_WRITEMASK, &ztest);
+ glDepthMask(GL_TRUE); /* Enables Z writing to be sure to delete also the Z buffer */
+ glGetFloatv(GL_DEPTH_CLEAR_VALUE, &old_z_clear_value);
+ glClearDepth(dvZ);
+ TRACE(" depth value : %f\n", dvZ);
+ }
+ if (dwFlags & D3DCLEAR_STENCIL) {
+ bitfield |= GL_STENCIL_BUFFER_BIT;
+ glGetIntegerv(GL_STENCIL_CLEAR_VALUE, &old_stencil_clear_value);
+ glClearStencil(dwStencil);
+ TRACE(" stencil value : %ld\n", dwStencil);
+ }
+ if (dwFlags & D3DCLEAR_TARGET) {
+ bitfield |= GL_COLOR_BUFFER_BIT;
+ glGetFloatv(GL_COLOR_CLEAR_VALUE, old_color_clear_value);
+ glClearColor(((dwColor >> 16) & 0xFF) / 255.0,
+ ((dwColor >> 8) & 0xFF) / 255.0,
+ ((dwColor >> 0) & 0xFF) / 255.0,
+ ((dwColor >> 24) & 0xFF) / 255.0);
+ TRACE(" color value (ARGB) : %08lx\n", dwColor);
+ }
+
+ glClear(bitfield);
+
+ if (dwFlags & D3DCLEAR_ZBUFFER) {
+ glDepthMask(ztest);
+ glClearDepth(old_z_clear_value);
+ }
+ if (dwFlags & D3DCLEAR_STENCIL) {
+ bitfield |= GL_STENCIL_BUFFER_BIT;
+ glClearStencil(old_stencil_clear_value);
+ }
+ if (dwFlags & D3DCLEAR_TARGET) {
+ bitfield |= GL_COLOR_BUFFER_BIT;
+ glClearColor(old_color_clear_value[0],
+ old_color_clear_value[1],
+ old_color_clear_value[2],
+ old_color_clear_value[3]);
+ }
+
+ LEAVE_GL();
+
+ return DD_OK;
+}
+
+
/* TODO for both these functions :
- change / restore OpenGL parameters for pictures transfers in case they are ever modified
by other OpenGL code in D3D
@@ -1689,6 +1770,7 @@
object->d3d = d3d;
object->surface = surface;
object->set_context = set_context;
+ object->clear = d3ddevice_clear;
TRACE(" creating OpenGL device for surface = %p, d3d = %p\n", surface, d3d);
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3d_private.h 2002-12-23 18:33:17.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3d_private.h 2002-12-23 18:16:52.000000000 +0100
@@ -175,6 +175,13 @@
IDirectDrawSurfaceImpl *current_texture[MAX_TEXTURES];
void (*set_context)(IDirect3DDeviceImpl*);
+ HRESULT (*clear)(IDirect3DDeviceImpl *This,
+ DWORD dwCount,
+ LPD3DRECT lpRects,
+ DWORD dwFlags,
+ DWORD dwColor,
+ D3DVALUE dvZ,
+ DWORD dwStencil);
};
/*****************************************************************************
--- /home/ulmer/Wine/wine_base//dlls/ddraw/d3dviewport.c 2002-12-23 18:33:18.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/d3dviewport.c 2002-12-23 18:24:45.000000000 +0100
@@ -233,8 +233,12 @@
DWORD dwFlags)
{
ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
- FIXME("(%p/%p)->(%08lx,%p,%08lx): stub!\n", This, iface, dwCount, lpRects, dwFlags);
- return DD_OK;
+ TRACE("(%p/%p)->(%08lx,%p,%08lx)\n", This, iface, dwCount, lpRects, dwFlags);
+ if (This->active_device == NULL) {
+ ERR(" Trying to clear a viewport not attached to a device !\n");
+ return D3DERR_VIEWPORTHASNODEVICE;
+ }
+ return This->active_device->clear(This->active_device, dwCount, lpRects, dwFlags, 0x00000000, 0.0, 0x00000000);
}
HRESULT WINAPI
@@ -362,106 +366,12 @@
DWORD dwStencil)
{
ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
- FIXME("(%p/%p)->(%08lx,%p,%08lx,%08lx,%f,%08lx): stub!\n", This, iface, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
- return DD_OK;
-}
-
-HRESULT WINAPI
-GL_IDirect3DViewportImpl_3_2_1_Clear(LPDIRECT3DVIEWPORT3 iface,
- DWORD dwCount,
- LPD3DRECT lpRects,
- DWORD dwFlags)
-{
- ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
- GLboolean ztest;
-
- TRACE("(%p/%p)->(%08lx,%p,%08lx)\n", This, iface, dwCount, lpRects, dwFlags);
-
- if (dwCount != 1) {
- WARN(" Warning, this function only for now clears the whole screen...\n");
- }
-
- /* Clears the screen */
- ENTER_GL();
- glGetBooleanv(GL_DEPTH_WRITEMASK, &ztest);
- glDepthMask(GL_TRUE); /* Enables Z writing to be sure to delete also the Z buffer */
- glClear(((dwFlags & D3DCLEAR_TARGET) ? GL_COLOR_BUFFER_BIT : 0) |
- ((dwFlags & D3DCLEAR_ZBUFFER) ? GL_DEPTH_BUFFER_BIT : 0));
- glDepthMask(ztest);
- LEAVE_GL();
-
- return DD_OK;
-}
-
-HRESULT WINAPI
-GL_IDirect3DViewportImpl_3_Clear2(LPDIRECT3DVIEWPORT3 iface,
- DWORD dwCount,
- LPD3DRECT lpRects,
- DWORD dwFlags,
- DWORD dwColor,
- D3DVALUE dvZ,
- DWORD dwStencil)
-{
- ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
- GLboolean ztest;
- GLfloat old_z_clear_value;
- GLbitfield bitfield = 0;
- GLint old_stencil_clear_value;
- GLfloat old_color_clear_value[4];
-
TRACE("(%p/%p)->(%08lx,%p,%08lx,%08lx,%f,%08lx)\n", This, iface, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
-
- if (dwCount != 1) {
- WARN(" Warning, this function only for now clears the whole screen...\n");
+ if (This->active_device == NULL) {
+ ERR(" Trying to clear a viewport not attached to a device !\n");
+ return D3DERR_VIEWPORTHASNODEVICE;
}
-
- /* Clears the screen */
- ENTER_GL();
- if (dwFlags & D3DCLEAR_ZBUFFER) {
- glGetBooleanv(GL_DEPTH_WRITEMASK, &ztest);
- glDepthMask(GL_TRUE); /* Enables Z writing to be sure to delete also the Z buffer */
- glGetFloatv(GL_DEPTH_CLEAR_VALUE, &old_z_clear_value);
- glClearDepth(dvZ);
- TRACE(" Depth value : %f\n", dvZ);
- bitfield |= GL_DEPTH_BUFFER_BIT;
- }
- if (dwFlags & D3DCLEAR_STENCIL) {
- bitfield |= GL_STENCIL_BUFFER_BIT;
- glGetIntegerv(GL_STENCIL_CLEAR_VALUE, &old_stencil_clear_value);
- glClearStencil(dwStencil);
- TRACE(" Stencil value : %ld\n", dwStencil);
- }
- if (dwFlags & D3DCLEAR_TARGET) {
- bitfield |= GL_COLOR_BUFFER_BIT;
- glGetFloatv(GL_COLOR_CLEAR_VALUE, old_color_clear_value);
- glClearColor(((dwColor >> 16) & 0xFF) / 255.0,
- ((dwColor >> 8) & 0xFF) / 255.0,
- ((dwColor >> 0) & 0xFF) / 255.0,
- ((dwColor >> 24) & 0xFF) / 255.0);
- TRACE("Color value (ARGB) : %08lx\n", dwColor);
- }
-
- glClear(bitfield);
-
- if (dwFlags & D3DCLEAR_ZBUFFER) {
- glDepthMask(ztest);
- glClearDepth(old_z_clear_value);
- }
- if (dwFlags & D3DCLEAR_STENCIL) {
- bitfield |= GL_STENCIL_BUFFER_BIT;
- glClearStencil(old_stencil_clear_value);
- }
- if (dwFlags & D3DCLEAR_TARGET) {
- bitfield |= GL_COLOR_BUFFER_BIT;
- glClearColor(old_color_clear_value[0],
- old_color_clear_value[1],
- old_color_clear_value[2],
- old_color_clear_value[3]);
- }
-
- LEAVE_GL();
-
- return DD_OK;
+ return This->active_device->clear(This->active_device, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
}
#if !defined(__STRICT_ANSI__) && defined(__GNUC__)
@@ -485,7 +395,7 @@
XCAST(GetBackground) Main_IDirect3DViewportImpl_3_2_1_GetBackground,
XCAST(SetBackgroundDepth) Main_IDirect3DViewportImpl_3_2_1_SetBackgroundDepth,
XCAST(GetBackgroundDepth) Main_IDirect3DViewportImpl_3_2_1_GetBackgroundDepth,
- XCAST(Clear) GL_IDirect3DViewportImpl_3_2_1_Clear,
+ XCAST(Clear) Main_IDirect3DViewportImpl_3_2_1_Clear,
XCAST(AddLight) Main_IDirect3DViewportImpl_3_2_1_AddLight,
XCAST(DeleteLight) Main_IDirect3DViewportImpl_3_2_1_DeleteLight,
XCAST(NextLight) Main_IDirect3DViewportImpl_3_2_1_NextLight,
@@ -493,7 +403,7 @@
XCAST(SetViewport2) Main_IDirect3DViewportImpl_3_2_SetViewport2,
XCAST(SetBackgroundDepth2) Main_IDirect3DViewportImpl_3_SetBackgroundDepth2,
XCAST(GetBackgroundDepth2) Main_IDirect3DViewportImpl_3_GetBackgroundDepth2,
- XCAST(Clear2) GL_IDirect3DViewportImpl_3_Clear2,
+ XCAST(Clear2) Main_IDirect3DViewportImpl_3_Clear2,
};
#if !defined(__STRICT_ANSI__) && defined(__GNUC__)
--- /home/ulmer/Wine/wine_base//dlls/ddraw/mesa.c 2002-12-23 18:33:20.000000000 +0100
+++ /home/ulmer/Wine/wine_work//dlls/ddraw/mesa.c 2002-12-23 17:46:39.000000000 +0100
@@ -297,6 +297,11 @@
/* We do not support this anyway, so why protest :-) */
break;
+ case D3DRENDERSTATE_STIPPLEDALPHA: /* 33 */
+ if (dwRenderState)
+ ERR(" Stippled Alpha not supported yet.\n");
+ break;
+
case D3DRENDERSTATE_FOGCOLOR: { /* 34 */
GLint color[4];
color[0] = (dwRenderState >> 16) & 0xFF;
@@ -331,6 +336,15 @@
case D3DRENDERSTATE_FLUSHBATCH: /* 50 */
break;
+ case D3DRENDERSTATE_LIGHTING: /* 137 */
+ /* There will be more to do here once we really support D3D7 Lighting.
+ Should be enough for now to prevent warnings :-) */
+ if (dwRenderState)
+ glEnable(GL_LIGHTING);
+ else
+ glDisable(GL_LIGHTING);
+ break;
+
default:
ERR("Unhandled dwRenderStateType %s (%08x) !\n", _get_renderstate(dwRenderStateType), dwRenderStateType);
}
More information about the wine-patches
mailing list