Stefan Dösinger : wined3d: Implement environment bump mapping with GL_ATI_envmap_bumpmap.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 9 07:43:09 CDT 2007


Module: wine
Branch: master
Commit: 28170f04747a396a4ca419c1f646212dab923627
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=28170f04747a396a4ca419c1f646212dab923627

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Fri May  4 14:28:09 2007 +0200

wined3d: Implement environment bump mapping with GL_ATI_envmap_bumpmap.

---

 dlls/ddraw/device.c       |   37 +++++++++++++++++++++++++++++++++++++
 dlls/wined3d/directx.c    |   27 ++++++++++++++++++++++-----
 dlls/wined3d/state.c      |   13 +++++++++++++
 dlls/wined3d/utils.c      |   40 ++++++++++++++++++++++++++++++++++++++++
 include/wine/wined3d_gl.h |    8 ++++----
 5 files changed, 116 insertions(+), 9 deletions(-)

diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 63b06e8..de3c9db 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -1119,6 +1119,16 @@ IDirect3DDeviceImpl_7_EnumTextureFormats(IDirect3DDevice7 *iface,
         WINED3DFMT_DXT5,
     };
 
+    WINED3DFORMAT BumpFormatList[] = {
+        WINED3DFMT_V8U8,
+        WINED3DFMT_L6V5U5,
+        WINED3DFMT_X8L8V8U8,
+        WINED3DFMT_Q8W8V8U8,
+        WINED3DFMT_V16U16,
+        WINED3DFMT_W11V11U10,
+        WINED3DFMT_A2W10V10U10
+    };
+
     TRACE("(%p)->(%p,%p): Relay\n", This, Callback, Arg);
 
     if(!Callback)
@@ -1150,6 +1160,33 @@ IDirect3DDeviceImpl_7_EnumTextureFormats(IDirect3DDevice7 *iface,
             }
         }
     }
+
+    for(i = 0; i < sizeof(BumpFormatList) / sizeof(WINED3DFORMAT); i++)
+    {
+        hr = IWineD3D_CheckDeviceFormat(This->ddraw->wineD3D,
+                                        0 /* Adapter */,
+                                        0 /* DeviceType */,
+                                        0 /* AdapterFormat */,
+                                        WINED3DUSAGE_QUERY_LEGACYBUMPMAP,
+                                        0 /* ResourceType */,
+                                        BumpFormatList[i]);
+        if(hr == D3D_OK)
+        {
+            DDPIXELFORMAT pformat;
+
+            memset(&pformat, 0, sizeof(pformat));
+            pformat.dwSize = sizeof(pformat);
+            PixelFormat_WineD3DtoDD(&pformat, BumpFormatList[i]);
+
+            TRACE("Enumerating WineD3DFormat %d\n", BumpFormatList[i]);
+            hr = Callback(&pformat, Arg);
+            if(hr != DDENUMRET_OK)
+            {
+                TRACE("Format enumeration cancelled by application\n");
+                return D3D_OK;
+            }
+        }
+    }
     TRACE("End of enumeration\n");
     return D3D_OK;
 }
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 60e3694..ccca582 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1679,6 +1679,20 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt
                 TRACE_(d3d_caps)("[FAILED]\n");
                 return WINED3DERR_NOTAVAILABLE;
         }
+    } else if(Usage & WINED3DUSAGE_QUERY_LEGACYBUMPMAP) {
+        if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) {
+            switch (CheckFormat) {
+                case WINED3DFMT_V8U8:
+                    TRACE_(d3d_caps)("[OK]\n");
+                    return WINED3D_OK;
+                default:
+                    TRACE_(d3d_caps)("[FAILED]\n");
+                    return WINED3DERR_NOTAVAILABLE;
+            }
+            /* TODO: GL_NV_TEXTURE_SHADER */
+        }
+        TRACE_(d3d_caps)("[FAILED]\n");
+        return WINED3DERR_NOTAVAILABLE;
     }
 
     if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
@@ -2209,12 +2223,15 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
                                  WINED3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA;
     }
 
-
+    if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) {
+        *pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_BUMPENVMAP;
+    } else if(GL_SUPPORT(NV_TEXTURE_SHADER)) {
+        /* TODO: environment bump mapping support with GL_NV_texture_shader */
+    }
 #if 0
-    *pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_BUMPENVMAP;
-                            /* FIXME: Add
-                            WINED3DTEXOPCAPS_BUMPENVMAPLUMINANCE
-                            WINED3DTEXOPCAPS_PREMODULATE */
+    /* FIXME: Add
+    *pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_BUMPENVMAPLUMINANCE
+                             WINED3DTEXOPCAPS_PREMODULATE */
 #endif
 
     *pCaps->MaxTextureBlendStages   = GL_LIMITS(texture_stages);
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index e0c5fbf..1b5115c 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -2164,6 +2164,19 @@ static void tex_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
             shaderconstant(STATE_PIXELSHADERCONSTANT, stateblock, context);
         }
     }
+
+    if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) {
+        if(stage >= GL_LIMITS(texture_stages)) {
+            WARN("Bump env matrix of unsupported stage set\n");
+        } else if(GL_SUPPORT(ARB_MULTITEXTURE)) {
+            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + stage));
+            checkGLcall("GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + stage))");
+        }
+        GL_EXTCALL(glTexBumpParameterfvATI(GL_BUMP_ROT_MATRIX_ATI,
+                   (float *) &(stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT00])));
+        checkGLcall("glTexBumpParameterfvATI");
+    }
+    /* TODO: GL_NV_texture_shader */
 }
 
 static void transform_world(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 9ab4e76..e71b49b 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -2168,6 +2168,46 @@ void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, WINED3DTEXTUREOP
                 } else
                   Handled = FALSE;
                 break;
+        case WINED3DTOP_BUMPENVMAPLUMINANCE:
+                if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) {
+                    /* Some apps use BUMPENVMAPLUMINANCE instead of D3DTOP_BUMPENVMAP, although
+                     * they check for the non-luminance cap flag. Well, give them what they asked
+                     * for :-)
+                     */
+                    WARN("Application uses WINED3DTOP_BUMPENVMAPLUMINANCE\n");
+                } else {
+                    Handled = FALSE;
+                    break;
+                }
+                /* Fall through */
+        case WINED3DTOP_BUMPENVMAP:
+                if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) {
+                    TRACE("Using ati bumpmap on stage %d, target %d\n", Stage, Stage + 1);
+                    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_BUMP_ENVMAP_ATI);
+                    checkGLcall("glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_BUMP_ENVMAP_ATI)");
+                    glTexEnvi(GL_TEXTURE_ENV, GL_BUMP_TARGET_ATI, GL_TEXTURE0_ARB + Stage + 1);
+                    checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_BUMP_TARGET_ATI, GL_TEXTURE0_ARB + Stage + 1)");
+                    glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
+                    checkGLcall("GL_TEXTURE_ENV, src0_target, src3");
+                    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
+                    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr3");
+                    glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
+                    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
+                    glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
+                    checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
+                    glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
+                    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
+                    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
+                    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
+
+                    Handled = TRUE;
+                } else {
+                    /* If GL_NV_TEXTURE_SHADER is supported insted the GL_NV_register_combiner path
+                     * will be taken instead
+                     */
+                    Handled = FALSE;
+                }
+                break;
         default:
                 Handled = FALSE;
         }
diff --git a/include/wine/wined3d_gl.h b/include/wine/wined3d_gl.h
index c325539..b8a0715 100644
--- a/include/wine/wined3d_gl.h
+++ b/include/wine/wined3d_gl.h
@@ -1192,10 +1192,10 @@ typedef void (APIENTRY * PGLFNFINISHOBJECTAPPLEPROC) (GLenum, GLuint);
 #define GL_BUMP_ENVMAP_ATI                  0x877B
 #define GL_BUMP_TARGET_ATI                  0x877C
 #endif
-typedef void (APIENTRY * PGLFNTEXBUMPPARAMETERIVATIPROC) (GLenum, GLuint);
-typedef void (APIENTRY * PGLFNTEXBUMPPARAMETERFVATIPROC) (GLenum, GLuint);
-typedef void (APIENTRY * PGLFNGETTEXBUMPPARAMETERIVATIPROC) (GLenum, GLuint);
-typedef void (APIENTRY * PGLFNGETTEXBUMPPARAMETERFVATIPROC) (GLenum, GLuint);
+typedef void (APIENTRY * PGLFNTEXBUMPPARAMETERIVATIPROC) (GLenum, GLint *);
+typedef void (APIENTRY * PGLFNTEXBUMPPARAMETERFVATIPROC) (GLenum, GLfloat *);
+typedef void (APIENTRY * PGLFNGETTEXBUMPPARAMETERIVATIPROC) (GLenum, GLint *);
+typedef void (APIENTRY * PGLFNGETTEXBUMPPARAMETERFVATIPROC) (GLenum, GLfloat *);
 
 /* GL_VERSION_2_0 */
 #ifndef GL_VERSION_2_0




More information about the wine-cvs mailing list