Chris Robinson : d3d: GetStreamSource on a stream with NULL data isn' t an error.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Dec 26 06:49:30 CST 2006


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

Author: Chris Robinson <chris.kcat at gmail.com>
Date:   Sun Dec 24 01:00:05 2006 -0800

d3d: GetStreamSource on a stream with NULL data isn't an error.

---

 dlls/d3d8/device.c       |    4 +++-
 dlls/d3d8/tests/device.c |    9 +++++++++
 dlls/d3d9/device.c       |    4 +++-
 dlls/d3d9/tests/device.c |   10 ++++++++++
 dlls/wined3d/device.c    |   13 ++++++-------
 5 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 3faf807..b21eb6c 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -1498,7 +1498,9 @@ static HRESULT WINAPI IDirect3DDevice8Im
         IWineD3DVertexBuffer_GetParent(retStream, (IUnknown **)pStream);
         IWineD3DVertexBuffer_Release(retStream);
     }else{
-         FIXME("Call to GetStreamSource failed %p\n",  pStride);
+        if (rc != D3D_OK){
+            FIXME("Call to GetStreamSource failed %p\n",  pStride);
+        }
         *pStream = NULL;
     }
 
diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c
index a7f8d0c..0214117 100644
--- a/dlls/d3d8/tests/device.c
+++ b/dlls/d3d8/tests/device.c
@@ -407,13 +407,22 @@ static void test_refcount(void)
     CHECK_CALL( hr, "CreateVertexBuffer", pDevice, ++refcount );
     if(pVertexBuffer)
     {
+        IDirect3DVertexBuffer8 *pVBuf = (void*)~0;
+        UINT stride = ~0;
+
         tmp = get_refcount( (IUnknown *)pVertexBuffer );
 
         hr = IDirect3DDevice8_SetStreamSource(pDevice, 0, pVertexBuffer, 3 * sizeof(float));
         CHECK_CALL( hr, "SetStreamSource", pVertexBuffer, tmp);
         hr = IDirect3DDevice8_SetStreamSource(pDevice, 0, NULL, 0);
         CHECK_CALL( hr, "SetStreamSource", pVertexBuffer, tmp);
+
+        hr = IDirect3DDevice8_GetStreamSource(pDevice, 0, &pVBuf, &stride);
+        ok(SUCCEEDED(hr), "GetStreamSource did not succeed with NULL stream!\n");
+        ok(pVBuf==NULL, "pVBuf not NULL (%p)!\n", pVBuf);
+        ok(stride==3*sizeof(float), "stride not %u (got %u)!\n", 3*sizeof(float), stride);
     }
+
     /* Shaders */
     hr = IDirect3DDevice8_CreateVertexShader( pDevice, decl, simple_vs, &dVertexShader, 0 );
     CHECK_CALL( hr, "CreateVertexShader", pDevice, refcount );
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index 06534e7..0b49d2f 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -800,7 +800,9 @@ HRESULT  WINAPI  IDirect3DDevice9Impl_Ge
         IWineD3DVertexBuffer_GetParent(retStream, (IUnknown **)pStream);
         IWineD3DVertexBuffer_Release(retStream);
     }else{
-        FIXME("Call to GetStreamSource failed %p %p\n", OffsetInBytes, pStride);
+        if (rc != D3D_OK){
+            FIXME("Call to GetStreamSource failed %p %p\n", OffsetInBytes, pStride);
+        }
         *pStream = NULL;
     }
     return rc;
diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c
index 7198155..c82f65b 100644
--- a/dlls/d3d9/tests/device.c
+++ b/dlls/d3d9/tests/device.c
@@ -455,12 +455,22 @@ static void test_refcount(void)
     CHECK_CALL( hr, "CreateVertexBuffer", pDevice, ++refcount );
     if(pVertexBuffer)
     {
+        IDirect3DVertexBuffer9 *pVBuf = (void*)~0;
+        UINT offset = ~0;
+        UINT stride = ~0;
+
         tmp = get_refcount( (IUnknown *)pVertexBuffer );
 
         hr = IDirect3DDevice9_SetStreamSource(pDevice, 0, pVertexBuffer, 0, 3 * sizeof(float));
         CHECK_CALL( hr, "SetStreamSource", pVertexBuffer, tmp);
         hr = IDirect3DDevice9_SetStreamSource(pDevice, 0, NULL, 0, 0);
         CHECK_CALL( hr, "SetStreamSource", pVertexBuffer, tmp);
+
+        hr = IDirect3DDevice9_GetStreamSource(pDevice, 0, &pVBuf, &offset, &stride);
+        ok(SUCCEEDED(hr), "GetStreamSource did not succeed with NULL stream!\n");
+        ok(pVBuf==NULL, "pVBuf not NULL (%p)!\n", pVBuf);
+        ok(stride==3*sizeof(float), "stride not %u (got %u)!\n", 3*sizeof(float), stride);
+        ok(offset==0, "offset not 0 (got %u)!\n", offset);
     }
     /* Shaders */
     hr = IDirect3DDevice9_CreateVertexDeclaration( pDevice, decl, &pVertexDeclaration );
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 0ad4512..a858ba1 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -2421,9 +2421,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl
 
     This->updateStateBlock->changed.streamSource[StreamNumber] = TRUE;
     This->updateStateBlock->set.streamSource[StreamNumber]     = TRUE;
-    This->updateStateBlock->streamStride[StreamNumber]         = Stride;
     This->updateStateBlock->streamSource[StreamNumber]         = pStreamData;
-    This->updateStateBlock->streamOffset[StreamNumber]         = OffsetInBytes;
+    if (pStreamData) {
+        This->updateStateBlock->streamStride[StreamNumber]     = Stride;
+        This->updateStateBlock->streamOffset[StreamNumber]     = OffsetInBytes;
+    }
     This->updateStateBlock->streamFlags[StreamNumber]          = streamFlags;
 
     /* Handle recording of state blocks */
@@ -2487,12 +2489,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl
         *pOffset = This->stateBlock->streamOffset[StreamNumber];
     }
 
-     if (*pStream == NULL) {
-        FIXME("Attempting to get an empty stream %d, returning WINED3DERR_INVALIDCALL\n", StreamNumber);
-        return  WINED3DERR_INVALIDCALL;
+    if (*pStream != NULL) {
+        IWineD3DVertexBuffer_AddRef(*pStream); /* We have created a new reference to the VB */
     }
-
-    IWineD3DVertexBuffer_AddRef(*pStream); /* We have created a new reference to the VB */
     return WINED3D_OK;
 }
 




More information about the wine-cvs mailing list