wine/dlls/wined3d device.c
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Nov 4 06:39:17 CST 2005
ChangeSet ID: 21116
CVSROOT: /opt/cvs-commit
Module name: wine
Changes by: julliard at winehq.org 2005/11/04 06:39:17
Modified files:
dlls/wined3d : device.c
Log message:
Oliver Stieber <oliver_stieber at yahoo.co.uk>
Tidy up UpdateTexture and add support for updating cube textures.
Patch: http://cvs.winehq.org/patch.py?id=21116
Old revision New revision Changes Path
1.92 1.93 +110 -31 wine/dlls/wined3d/device.c
Index: wine/dlls/wined3d/device.c
diff -u -p wine/dlls/wined3d/device.c:1.92 wine/dlls/wined3d/device.c:1.93
--- wine/dlls/wined3d/device.c:1.92 4 Nov 2005 12:39:17 -0000
+++ wine/dlls/wined3d/device.c 4 Nov 2005 12:39:17 -0000
@@ -4803,50 +4803,129 @@ HRESULT WINAPI IWineD3DDeviceImpl_DrawIn
/* Yet another way to update a texture, some apps use this to load default textures instead of using surface/texture lock/unlock */
HRESULT WINAPI IWineD3DDeviceImpl_UpdateTexture (IWineD3DDevice *iface, IWineD3DBaseTexture *pSourceTexture, IWineD3DBaseTexture *pDestinationTexture){
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ HRESULT hr = D3D_OK;
D3DRESOURCETYPE sourceType;
D3DRESOURCETYPE destinationType;
- IWineD3DTextureImpl *pDestTexture = (IWineD3DTextureImpl *)pDestinationTexture;
- IWineD3DTextureImpl *pSrcTexture = (IWineD3DTextureImpl *)pSourceTexture;
- int i;
+ int i ,levels;
- sourceType = IWineD3DBaseTexture_GetType(pSourceTexture);
- destinationType = IWineD3DBaseTexture_GetType(pDestinationTexture);
- if(sourceType != D3DRTYPE_TEXTURE && destinationType != D3DRTYPE_TEXTURE){
- FIXME("(%p) Only D3DRTYPE_TEXTURE to D3DRTYPE_TEXTURE supported\n", This);
- return D3DERR_INVALIDCALL;
- }
- TRACE("(%p) Source %p Destination %p\n", This, pSourceTexture, pDestinationTexture);
+ /* TODO: think about moving the code into IWineD3DBaseTexture */
- /** TODO: Get rid of the casts to IWineD3DBaseTextureImpl
- repalce surfaces[x] with GetSurfaceLevel, or GetCubeMapSurface etc..
- think about moving the code into texture, and adding a member to base texture to occomplish this **/
+ TRACE("(%p) Source %p Destination %p\n", This, pSourceTexture, pDestinationTexture);
- /* Make sure that the destination texture is loaded */
- IWineD3DBaseTexture_PreLoad(pDestinationTexture);
- TRACE("Loading source texture\n");
+ /* verify that the source and destination textures arebn't NULL */
+ if (NULL == pSourceTexture || NULL == pDestinationTexture) {
+ WARN("(%p) : source (%p) and destination (%p) textures must not be NULL, returning D3DERR_INVALIDCALL\n",
+ This, pSourceTexture, pDestinationTexture);
+ hr = D3DERR_INVALIDCALL;
+ }
- if(pSrcTexture->surfaces[0] == NULL || pDestTexture->surfaces[0] == NULL){
- FIXME("(%p) Texture src %p or dest %p has not surface %p %p\n", This, pSrcTexture, pDestTexture,
- pSrcTexture->surfaces[0], pDestTexture->surfaces[0]);
+ if (pSourceTexture == pDestinationTexture) {
+ WARN("(%p) : source (%p) and destination (%p) textures must be different, returning D3DERR_INVALIDCALL\n",
+ This, pSourceTexture, pDestinationTexture);
+ hr = D3DERR_INVALIDCALL;
}
+ /* Verify that the source and destination textures are the same type */
+ sourceType = IWineD3DBaseTexture_GetType(pSourceTexture);
+ destinationType = IWineD3DBaseTexture_GetType(pDestinationTexture);
- if(((IWineD3DSurfaceImpl *)pSrcTexture->surfaces[0])->resource.pool != D3DPOOL_SYSTEMMEM ||
- ((IWineD3DSurfaceImpl *)pDestTexture->surfaces[0])->resource.pool != D3DPOOL_DEFAULT){
+ if (sourceType != destinationType) {
+ WARN("(%p) Sorce and destination types must match, returning D3DERR_INVALIDCALL\n",
+ This);
+ hr = D3DERR_INVALIDCALL;
+ }
- FIXME("(%p) source %p must be SYSTEMMEM and dest %p must be DEFAULT\n",This, pSrcTexture, pDestTexture);
- return D3DERR_INVALIDCALL;
+ /* check that both textures have the identical numbers of levels */
+ if (IWineD3DBaseTexture_GetLevelCount(pDestinationTexture) != IWineD3DBaseTexture_GetLevelCount(pSourceTexture)) {
+ WARN("(%p) : source (%p) and destination (%p) textures must have identicle numbers of levels, returning D3DERR_INVALIDCALL\n", This, pSourceTexture, pDestinationTexture);
+ hr = D3DERR_INVALIDCALL;
}
- /** TODO: check that both textures have the same number of levels **/
-#if 0
- if(IWineD3DBaseTexture_GetLevelCount(pDestinationTexture) !=IWineD3DBaseTexture_GetLevelCount(pSourceTexture))
- return D3DERR_INVALIDCALL;
+
+ if (D3D_OK == hr) {
+
+ /* Make sure that the destination texture is loaded */
+ IWineD3DBaseTexture_PreLoad(pDestinationTexture);
+
+ /* Update every surface level of the texture */
+ levels = IWineD3DBaseTexture_GetLevelCount(pDestinationTexture);
+
+ switch (sourceType) {
+ case D3DRTYPE_TEXTURE:
+ {
+ IWineD3DSurface *srcSurface;
+ IWineD3DSurface *destSurface;
+
+ for (i = 0 ; i < levels ; ++i) {
+ IWineD3DTexture_GetSurfaceLevel((IWineD3DTexture *)pSourceTexture, i, &srcSurface);
+ IWineD3DTexture_GetSurfaceLevel((IWineD3DTexture *)pDestinationTexture, i, &destSurface);
+ hr = IWineD3DDevice_UpdateSurface(iface, srcSurface, NULL, destSurface, NULL);
+ IWineD3DSurface_Release(srcSurface);
+ IWineD3DSurface_Release(destSurface);
+ if (D3D_OK != hr) {
+ WARN("(%p) : Call to update surface failed\n", This);
+ return hr;
+ }
+ }
+ }
+ break;
+ case D3DRTYPE_CUBETEXTURE:
+ {
+ IWineD3DSurface *srcSurface;
+ IWineD3DSurface *destSurface;
+ D3DCUBEMAP_FACES faceType;
+
+ for (i = 0 ; i < levels ; ++i) {
+ /* Update each cube face */
+ for (faceType = D3DCUBEMAP_FACE_POSITIVE_X; faceType <= D3DCUBEMAP_FACE_NEGATIVE_Z; ++faceType){
+ hr = IWineD3DCubeTexture_GetCubeMapSurface((IWineD3DCubeTexture *)pSourceTexture, faceType, i, &srcSurface);
+ if (D3D_OK != hr) {
+ FIXME("(%p) : Failed to get src cube surface facetype %d, level %d\n", This, faceType, i);
+ } else {
+ TRACE("Got srcSurface %p\n", srcSurface);
+ }
+ hr = IWineD3DCubeTexture_GetCubeMapSurface((IWineD3DCubeTexture *)pDestinationTexture, faceType, i, &destSurface);
+ if (D3D_OK != hr) {
+ FIXME("(%p) : Failed to get src cube surface facetype %d, level %d\n", This, faceType, i);
+ } else {
+ TRACE("Got desrSurface %p\n", destSurface);
+ }
+ hr = IWineD3DDevice_UpdateSurface(iface, srcSurface, NULL, destSurface, NULL);
+ IWineD3DSurface_Release(srcSurface);
+ IWineD3DSurface_Release(destSurface);
+ if (D3D_OK != hr) {
+ WARN("(%p) : Call to update surface failed\n", This);
+ return hr;
+ }
+ }
+ }
+ }
+ break;
+#if 0 /* TODO: Add support for volume textures */
+ case D3DRTYPE_VOLUMETEXTURE:
+ {
+ IWineD3DVolume srcVolume = NULL;
+ IWineD3DSurface destVolume = NULL;
+
+ for (i = 0 ; i < levels ; ++i) {
+ IWineD3DVolumeTexture_GetVolume((IWineD3DVolumeTexture *)pSourceTexture, i, &srcVolume);
+ IWineD3DVolumeTexture_GetVolume((IWineD3DVolumeTexture *)pDestinationTexture, i, &destVolume);
+ hr = IWineD3DFoo_UpdateVolume(iface, srcVolume, NULL, destVolume, NULL);
+ IWineD3DVolume_Release(srcSurface);
+ IWineD3DVolume_Release(destSurface);
+ if (D3D_OK != hr) {
+ WARN("(%p) : Call to update volume failed\n", This);
+ return hr;
+ }
+ }
+ }
+ break;
#endif
- /** TODO: move this code into baseTexture? device should never touch impl*'s **/
- for(i = 0 ; i < IWineD3DBaseTexture_GetLevelCount(pDestinationTexture) ; i++){
- IWineD3DDevice_UpdateSurface(iface, pSrcTexture->surfaces[i], NULL, pDestTexture->surfaces[i], NULL);
+ default:
+ FIXME("(%p) : Unsupported source and destination type\n", This);
+ hr = D3DERR_INVALIDCALL;
+ }
}
- return D3D_OK;
+ return hr;
}
HRESULT WINAPI IWineD3DDeviceImpl_StretchRect(IWineD3DDevice *iface, IWineD3DSurface *pSourceSurface,
More information about the wine-cvs
mailing list