[D3D 15] Beginning of texturing support using D3D3 functions
Lionel Ulmer
lionel.ulmer at free.fr
Sat Nov 30 13:40:16 CST 2002
This patch adds support for texturing the D3D3 way (ie not via the
SetRenderState call but via SetTexture).
No idea if it actually works because I did not find a working app yet :-)
Changelog:
- implement the texturing the D3D3 way
- prepare for multi-texturing support
--
Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- ../wine_work_base/dlls/ddraw/d3d_private.h Sat Nov 30 17:30:51 2002
+++ dlls/ddraw/d3d_private.h Sat Nov 30 19:28:14 2002
@@ -167,6 +167,9 @@
/*****************************************************************************
* IDirect3DDevice implementation structure
*/
+
+#define MAX_TEXTURES 8
+
struct IDirect3DDeviceImpl
{
ICOM_VFIELD_MULTI(IDirect3DDevice7);
@@ -180,7 +183,7 @@
IDirect3DViewportImpl *viewport_list;
IDirect3DViewportImpl *current_viewport;
- IDirect3DTextureImpl *current_texture;
+ IDirect3DTextureImpl *current_texture[MAX_TEXTURES];
void (*set_context)(IDirect3DDeviceImpl*);
};
--- ../wine_work_base/dlls/ddraw/d3dtexture.c Wed Nov 27 23:01:56 2002
+++ dlls/ddraw/d3dtexture.c Sat Nov 30 20:28:45 2002
@@ -249,7 +249,7 @@
Main_IDirect3DTextureImpl_2_1T_AddRef(LPDIRECT3DTEXTURE2 iface)
{
ICOM_THIS_FROM(IDirect3DTextureImpl, IDirect3DTexture2, iface);
- FIXME("(%p/%p)->() incrementing from %lu.\n", This, iface, This->ref);
+ TRACE("(%p/%p)->() incrementing from %lu.\n", This, iface, This->ref);
return ++(This->ref);
}
@@ -337,8 +337,8 @@
/* And if this texture was the current one, remove it at the device level */
if (This->d3ddevice != NULL)
- if (This->d3ddevice->current_texture == This)
- This->d3ddevice->current_texture = NULL;
+ if (This->d3ddevice->current_texture[0] == This)
+ This->d3ddevice->current_texture[0] = NULL;
if (This->loaded) {
mem_used = This->surface->surface_desc.dwHeight *
@@ -378,10 +378,10 @@
/* Associate the texture with the device and perform the appropriate AddRef/Release */
/* FIXME: Is there only one or several textures associated with the device ? */
- if (lpDeviceImpl->current_texture != NULL)
- IDirect3DTexture2_Release(ICOM_INTERFACE(lpDeviceImpl->current_texture, IDirect3DTexture2));
+ if (lpDeviceImpl->current_texture[0] != NULL)
+ IDirect3DTexture2_Release(ICOM_INTERFACE(lpDeviceImpl->current_texture[0], IDirect3DTexture2));
IDirect3DTexture2_AddRef(ICOM_INTERFACE(This, IDirect3DTexture2));
- lpDeviceImpl->current_texture = This;
+ lpDeviceImpl->current_texture[0] = This;
TRACE("OpenGL texture handle is : %d\n", glThis->tex_name);
--- ../wine_work_base/dlls/ddraw/d3ddevice/main.c Thu Nov 28 23:25:58 2002
+++ dlls/ddraw/d3ddevice/main.c Sat Nov 30 19:34:18 2002
@@ -92,9 +92,12 @@
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
TRACE("(%p/%p)->() decrementing from %lu.\n", This, iface, This->ref);
if (!--(This->ref)) {
- /* Release texture associated with the device */
- if (This->current_texture != NULL)
- IDirect3DTexture2_Release(ICOM_INTERFACE(This->current_texture, IDirect3DTexture2));
+ int i;
+ /* Release texture associated with the device */
+ for (i = 0; i < MAX_TEXTURES; i++) {
+ if (This->current_texture[i] != NULL)
+ IDirect3DTexture2_Release(ICOM_INTERFACE(This->current_texture[i], IDirect3DTexture2));
+ }
HeapFree(GetProcessHeap(), 0, This);
return 0;
--- ../wine_work_base/dlls/ddraw/d3ddevice/mesa.c Sat Nov 30 17:30:51 2002
+++ dlls/ddraw/d3ddevice/mesa.c Sat Nov 30 20:33:38 2002
@@ -317,8 +317,8 @@
TRACE("(%p/%p)->() decrementing from %lu.\n", This, iface, This->ref);
if (!--(This->ref)) {
/* Release texture associated with the device */
- if (This->current_texture != NULL)
- IDirect3DTexture2_Release(ICOM_INTERFACE(This->current_texture, IDirect3DTexture2));
+ if (This->current_texture[0] != NULL)
+ IDirect3DTexture2_Release(ICOM_INTERFACE(This->current_texture[0], IDirect3DTexture2));
ENTER_GL();
glXDestroyContext(glThis->display, glThis->gl_context);
@@ -1059,6 +1059,135 @@
return DD_OK;
}
+HRESULT WINAPI
+GL_IDirect3DDeviceImpl_7_3T_SetTextureStageState(LPDIRECT3DDEVICE7 iface,
+ DWORD dwStage,
+ D3DTEXTURESTAGESTATETYPE d3dTexStageStateType,
+ DWORD dwState)
+{
+ ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+ IDirect3DDeviceGLImpl *glThis = (IDirect3DDeviceGLImpl *) This;
+ GLenum gl_state;
+
+ TRACE("(%p/%p)->(%08lx,%08x,%08lx)\n", This, iface, dwStage, d3dTexStageStateType, dwState);
+
+ if (TRACE_ON(ddraw)) {
+ TRACE(" Stage type is : ");
+ switch (d3dTexStageStateType) {
+#define GEN_CASE(a) case a: DPRINTF(#a " "); break
+ GEN_CASE(D3DTSS_COLOROP);
+ GEN_CASE(D3DTSS_COLORARG1);
+ GEN_CASE(D3DTSS_COLORARG2);
+ GEN_CASE(D3DTSS_ALPHAOP);
+ GEN_CASE(D3DTSS_ALPHAARG1);
+ GEN_CASE(D3DTSS_ALPHAARG2);
+ GEN_CASE(D3DTSS_BUMPENVMAT00);
+ GEN_CASE(D3DTSS_BUMPENVMAT01);
+ GEN_CASE(D3DTSS_BUMPENVMAT10);
+ GEN_CASE(D3DTSS_BUMPENVMAT11);
+ GEN_CASE(D3DTSS_TEXCOORDINDEX);
+ GEN_CASE(D3DTSS_ADDRESS);
+ GEN_CASE(D3DTSS_ADDRESSU);
+ GEN_CASE(D3DTSS_ADDRESSV);
+ GEN_CASE(D3DTSS_BORDERCOLOR);
+ GEN_CASE(D3DTSS_MAGFILTER);
+ GEN_CASE(D3DTSS_MINFILTER);
+ GEN_CASE(D3DTSS_MIPFILTER);
+ GEN_CASE(D3DTSS_MIPMAPLODBIAS);
+ GEN_CASE(D3DTSS_MAXMIPLEVEL);
+ GEN_CASE(D3DTSS_MAXANISOTROPY);
+ GEN_CASE(D3DTSS_BUMPENVLSCALE);
+ GEN_CASE(D3DTSS_BUMPENVLOFFSET);
+ GEN_CASE(D3DTSS_TEXTURETRANSFORMFLAGS);
+#undef GEN_CASE
+ default: DPRINTF("UNKNOWN !!!");
+ }
+ DPRINTF(" => ");
+ }
+
+ switch (d3dTexStageStateType) {
+ case D3DTSS_MINFILTER:
+ switch ((D3DTEXTUREMINFILTER) dwState) {
+ case D3DTFN_POINT:
+ if (TRACE_ON(ddraw)) DPRINTF("D3DTFN_POINT\n");
+ gl_state = GL_NEAREST;
+ break;
+ case D3DTFN_LINEAR:
+ if (TRACE_ON(ddraw)) DPRINTF("D3DTFN_LINEAR\n");
+ gl_state = GL_LINEAR;
+ break;
+ default:
+ if (TRACE_ON(ddraw)) DPRINTF(" state unhandled.\n");
+ gl_state = GL_LINEAR;
+ break;
+ }
+ glThis->render_state.min = gl_state;
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_state);
+ break;
+
+ case D3DTSS_MAGFILTER:
+ switch ((D3DTEXTUREMAGFILTER) dwState) {
+ case D3DTFG_POINT:
+ if (TRACE_ON(ddraw)) DPRINTF("D3DTFG_POINT\n");
+ gl_state = GL_NEAREST;
+ break;
+ case D3DTFG_LINEAR:
+ if (TRACE_ON(ddraw)) DPRINTF("D3DTFG_LINEAR\n");
+ gl_state = GL_LINEAR;
+ break;
+ default:
+ if (TRACE_ON(ddraw)) DPRINTF(" state unhandled.\n");
+ gl_state = GL_LINEAR;
+ break;
+ }
+ glThis->render_state.mag = gl_state;
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_state);
+ break;
+
+ default:
+ if (TRACE_ON(ddraw)) DPRINTF(" unhandled.\n");
+ }
+
+ return DD_OK;
+}
+
+HRESULT WINAPI
+GL_IDirect3DDeviceImpl_3_SetTexture(LPDIRECT3DDEVICE3 iface,
+ DWORD dwStage,
+ LPDIRECT3DTEXTURE2 lpTexture2)
+{
+ ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+
+ TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, dwStage, lpTexture2);
+
+ if (This->current_texture[dwStage] != NULL) {
+ /* Seems that this is not right... Need to test in real Windows
+ IDirect3DTexture2_Release(ICOM_INTERFACE(This->current_texture[dwStage], IDirect3DTexture2)); */
+ }
+
+ ENTER_GL();
+ if (lpTexture2 == NULL) {
+ TRACE(" disabling 2D texturing.\n");
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+ } else {
+ IDirect3DTextureImpl *tex_impl = ICOM_OBJECT(IDirect3DTextureImpl, IDirect3DTexture2, lpTexture2);
+ IDirect3DTextureGLImpl *tex_glimpl = (IDirect3DTextureGLImpl *) tex_impl;
+
+ This->current_texture[dwStage] = tex_impl;
+ IDirect3DTexture2_AddRef(lpTexture2);
+
+ TRACE(" activating OpenGL texture %d.\n", tex_glimpl->tex_name);
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, tex_glimpl->tex_name);
+ }
+ LEAVE_GL();
+
+ return DD_OK;
+}
+
+
#if !defined(__STRICT_ANSI__) && defined(__GNUC__)
# define XCAST(fun) (typeof(VTABLE_IDirect3DDevice7.fun))
#else
@@ -1105,7 +1234,7 @@
XCAST(GetTexture) Main_IDirect3DDeviceImpl_7_GetTexture,
XCAST(SetTexture) Main_IDirect3DDeviceImpl_7_SetTexture,
XCAST(GetTextureStageState) Main_IDirect3DDeviceImpl_7_3T_GetTextureStageState,
- XCAST(SetTextureStageState) Main_IDirect3DDeviceImpl_7_3T_SetTextureStageState,
+ XCAST(SetTextureStageState) GL_IDirect3DDeviceImpl_7_3T_SetTextureStageState,
XCAST(ValidateDevice) Main_IDirect3DDeviceImpl_7_3T_ValidateDevice,
XCAST(ApplyStateBlock) Main_IDirect3DDeviceImpl_7_ApplyStateBlock,
XCAST(CaptureStateBlock) Main_IDirect3DDeviceImpl_7_CaptureStateBlock,
@@ -1171,7 +1300,7 @@
XCAST(DrawIndexedPrimitiveVB) Main_IDirect3DDeviceImpl_3_DrawIndexedPrimitiveVB,
XCAST(ComputeSphereVisibility) Thunk_IDirect3DDeviceImpl_3_ComputeSphereVisibility,
XCAST(GetTexture) Main_IDirect3DDeviceImpl_3_GetTexture,
- XCAST(SetTexture) Main_IDirect3DDeviceImpl_3_SetTexture,
+ XCAST(SetTexture) GL_IDirect3DDeviceImpl_3_SetTexture,
XCAST(GetTextureStageState) Thunk_IDirect3DDeviceImpl_3_GetTextureStageState,
XCAST(SetTextureStageState) Thunk_IDirect3DDeviceImpl_3_SetTextureStageState,
XCAST(ValidateDevice) Thunk_IDirect3DDeviceImpl_3_ValidateDevice,
@@ -1382,9 +1511,6 @@
object->ref = 1;
object->d3d = d3d;
object->surface = surface;
- object->viewport_list = NULL;
- object->current_viewport = NULL;
- object->current_texture = NULL;
object->set_context = set_context;
TRACE(" creating OpenGL device for surface = %p, d3d = %p\n", surface, d3d);
More information about the wine-patches
mailing list