Stefan Dösinger : wined3d: Emulate tracking of multiple material properties.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jun 21 09:47:34 CDT 2007


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

Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date:   Wed Jun 20 14:36:32 2007 +0200

wined3d: Emulate tracking of multiple material properties.

---

 dlls/wined3d/drawprim.c        |   57 ++++++++++++++++++++++++++++++++++++++-
 dlls/wined3d/state.c           |   21 ++++++++++++++
 dlls/wined3d/wined3d_private.h |    2 +
 3 files changed, 78 insertions(+), 2 deletions(-)

diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 1cde3a9..115f3e3 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -510,6 +510,19 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData
 		    D3DCOLOR_B_G(diffuseColor),
 		    D3DCOLOR_B_B(diffuseColor),
 		    D3DCOLOR_B_A(diffuseColor)));
+
+            if(This->activeContext->num_untracked_materials) {
+                unsigned char i;
+                float color[4];
+                color[0] = D3DCOLOR_B_R(diffuseColor) / 255.0;
+                color[1] = D3DCOLOR_B_G(diffuseColor) / 255.0;
+                color[2] = D3DCOLOR_B_B(diffuseColor) / 255.0;
+                color[3] = D3DCOLOR_B_A(diffuseColor) / 255.0;
+
+                for(i = 0; i < This->activeContext->num_untracked_materials; i++) {
+                    glMaterialfv(GL_FRONT_AND_BACK, This->activeContext->untracked_materials[i], color);
+                }
+            }
         }
 
         /* Specular ------------------------------- */
@@ -1030,15 +1043,55 @@ void drawPrimitive(IWineD3DDevice *iface,
 
     {
         GLenum glPrimType;
+        BOOL emulation = FALSE;
+        WineDirect3DVertexStridedData *strided = &This->strided_streams;
+        WineDirect3DVertexStridedData stridedlcl;
         /* Ok, Work out which primitive is requested and how many vertexes that
            will be                                                              */
         UINT calculatedNumberOfindices = primitiveToGl(PrimitiveType, NumPrimitives, &glPrimType);
         if (numberOfVertices == 0 )
             numberOfVertices = calculatedNumberOfindices;
 
-        if (This->useDrawStridedSlow) {
+        if(!This->strided_streams.u.s.position_transformed && !use_vs(This)) {
+            if(This->activeContext->num_untracked_materials &&
+               This->stateBlock->renderState[WINED3DRS_LIGHTING]) {
+                IWineD3DVertexBufferImpl *vb;
+
+                FIXME("Using software emulation because not all material properties could be tracked\n");
+                emulation = TRUE;
+
+                strided = &stridedlcl;
+                memcpy(&stridedlcl, &This->strided_streams, sizeof(stridedlcl));
+
+#define FIXVBO(type) \
+if(stridedlcl.u.s.type.VBO) { \
+    vb = (IWineD3DVertexBufferImpl *) This->stateBlock->streamSource[stridedlcl.u.s.type.streamNo]; \
+    stridedlcl.u.s.type.VBO = 0; \
+    stridedlcl.u.s.type.lpData = (BYTE *) ((unsigned long) stridedlcl.u.s.type.lpData + (unsigned long) vb->resource.allocatedMemory); \
+}
+                FIXVBO(position);
+                FIXVBO(blendWeights);
+                FIXVBO(blendMatrixIndices);
+                FIXVBO(normal);
+                FIXVBO(pSize);
+                FIXVBO(diffuse);
+                FIXVBO(specular);
+                for(i = 0; i < WINED3DDP_MAXTEXCOORD; i++) FIXVBO(texCoords[i]);
+                FIXVBO(position2);
+                FIXVBO(normal2);
+                FIXVBO(tangent);
+                FIXVBO(binormal);
+                FIXVBO(tessFactor);
+                FIXVBO(fog);
+                FIXVBO(depth);
+                FIXVBO(sample);
+#undef FIXVBO
+            }
+        }
+
+        if (This->useDrawStridedSlow || emulation) {
             /* Immediate mode drawing */
-            drawStridedSlow(iface, &This->strided_streams, calculatedNumberOfindices,
+            drawStridedSlow(iface, strided, calculatedNumberOfindices,
                             glPrimType, idxData, idxSize, minIndex, StartIdx, StartVertexIndex);
         } else if(This->instancedDraw) {
             /* Instancing emulation with mixing immediate mode and arrays */
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 1c72785..3b7c5c9 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -980,6 +980,7 @@ static void state_colormat(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
 
     isDiffuseSupplied = diffuse->lpData || diffuse->VBO;
 
+    context->num_untracked_materials = 0;
     if (isDiffuseSupplied && stateblock->renderState[WINED3DRS_COLORVERTEX]) {
         TRACE("diff %d, amb %d, emis %d, spec %d\n",
               stateblock->renderState[WINED3DRS_DIFFUSEMATERIALSOURCE],
@@ -993,10 +994,30 @@ static void state_colormat(DWORD state, IWineD3DStateBlockImpl *stateblock, Wine
             } else {
                 Parm = GL_DIFFUSE;
             }
+            if(stateblock->renderState[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) {
+                context->untracked_materials[context->num_untracked_materials] = GL_EMISSION;
+                context->num_untracked_materials++;
+            }
+            if(stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) {
+                context->untracked_materials[context->num_untracked_materials] = GL_SPECULAR;
+                context->num_untracked_materials++;
+            }
         } else if (stateblock->renderState[WINED3DRS_AMBIENTMATERIALSOURCE] == WINED3DMCS_COLOR1) {
             Parm = GL_AMBIENT;
+            if(stateblock->renderState[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) {
+                context->untracked_materials[context->num_untracked_materials] = GL_EMISSION;
+                context->num_untracked_materials++;
+            }
+            if(stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) {
+                context->untracked_materials[context->num_untracked_materials] = GL_SPECULAR;
+                context->num_untracked_materials++;
+            }
         } else if (stateblock->renderState[WINED3DRS_EMISSIVEMATERIALSOURCE] == WINED3DMCS_COLOR1) {
             Parm = GL_EMISSION;
+            if(stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) {
+                context->untracked_materials[context->num_untracked_materials] = GL_SPECULAR;
+                context->num_untracked_materials++;
+            }
         } else if (stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE] == WINED3DMCS_COLOR1) {
             Parm = GL_SPECULAR;
         }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 1c35ea4..3c0dfee 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -507,6 +507,8 @@ struct WineD3DContext {
     BOOL                    namedArraysLoaded, numberedArraysLoaded;
     BOOL                    lastWasPow2Texture[MAX_TEXTURES];
     GLenum                  tracking_parm;     /* Which source is tracking current colour         */
+    unsigned char           num_untracked_materials;
+    GLenum                  untracked_materials[2];
     BOOL                    last_was_blit, last_was_ckey;
     char                    texShaderBumpMap;
 




More information about the wine-cvs mailing list