[PATCH 02/10] wined3d: Add a separate function for volume initialization.
Henri Verbeet
hverbeet at codeweavers.com
Wed Sep 16 01:37:16 CDT 2009
---
dlls/wined3d/device.c | 36 +++++++-----------------------------
dlls/wined3d/volume.c | 39 ++++++++++++++++++++++++++++++++++++++-
dlls/wined3d/wined3d_private.h | 4 ++--
3 files changed, 47 insertions(+), 32 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index a30a9b1..f73f32e 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1040,15 +1040,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolume(IWineD3DDevice *iface,
UINT Width, UINT Height, UINT Depth, DWORD Usage, WINED3DFORMAT Format,
WINED3DPOOL Pool, IWineD3DVolume **ppVolume, IUnknown *parent)
{
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- IWineD3DVolumeImpl *object; /** NOTE: impl ref allowed since this is a create function **/
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(Format, &GLINFO_LOCATION);
+ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ IWineD3DVolumeImpl *object;
HRESULT hr;
- if(!GL_SUPPORT(EXT_TEXTURE3D)) {
- WARN("(%p) : Volume cannot be created - no volume texture support\n", This);
- return WINED3DERR_INVALIDCALL;
- }
+ TRACE("(%p) : W(%d) H(%d) D(%d), Usage(%d), Fmt(%u,%s), Pool(%s)\n", This, Width, Height,
+ Depth, Usage, Format, debug_d3dformat(Format), debug_d3dpool(Pool));
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
if (!object)
@@ -1058,36 +1055,17 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolume(IWineD3DDevice *iface,
return WINED3DERR_OUTOFVIDEOMEMORY;
}
- object->lpVtbl = &IWineD3DVolume_Vtbl;
- hr = resource_init((IWineD3DResource *)object, WINED3DRTYPE_VOLUME, This,
- Width * Height * Depth * format_desc->byte_count, Usage, format_desc, Pool, parent);
+ hr = volume_init(object, This, Width, Height, Depth, Usage, Format, Pool, parent);
if (FAILED(hr))
{
- WARN("Failed to initialize resource, returning %#x\n", hr);
+ WARN("Failed to initialize volume, returning %#x.\n", hr);
HeapFree(GetProcessHeap(), 0, object);
- *ppVolume = NULL;
return hr;
}
- TRACE("(%p) : Created resource %p\n", This, object);
-
+ TRACE("(%p) : Created volume %p.\n", This, object);
*ppVolume = (IWineD3DVolume *)object;
- TRACE("(%p) : W(%d) H(%d) D(%d), Usage(%d), Fmt(%u,%s), Pool(%s)\n", This, Width, Height,
- Depth, Usage, Format, debug_d3dformat(Format), debug_d3dpool(Pool));
-
- object->currentDesc.Width = Width;
- object->currentDesc.Height = Height;
- object->currentDesc.Depth = Depth;
-
- /** Note: Volume textures cannot be dxtn, hence no need to check here **/
- object->lockable = TRUE;
- object->locked = FALSE;
- memset(&object->lockedBox, 0, sizeof(WINED3DBOX));
- object->dirty = TRUE;
-
- volume_add_dirty_box((IWineD3DVolume *)object, NULL);
-
return WINED3D_OK;
}
diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c
index 85e8f3a..d705f75 100644
--- a/dlls/wined3d/volume.c
+++ b/dlls/wined3d/volume.c
@@ -4,6 +4,7 @@
* Copyright 2002-2005 Jason Edmeades
* Copyright 2002-2005 Raphael Junqueira
* Copyright 2005 Oliver Stieber
+ * Copyright 2009 Henri Verbeet for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -346,7 +347,7 @@ static HRESULT WINAPI IWineD3DVolumeImpl_LoadTexture(IWineD3DVolume *iface, int
}
-const IWineD3DVolumeVtbl IWineD3DVolume_Vtbl =
+static const IWineD3DVolumeVtbl IWineD3DVolume_Vtbl =
{
/* IUnknown */
IWineD3DVolumeImpl_QueryInterface,
@@ -372,3 +373,39 @@ const IWineD3DVolumeVtbl IWineD3DVolume_Vtbl =
IWineD3DVolumeImpl_LoadTexture,
IWineD3DVolumeImpl_SetContainer
};
+
+HRESULT volume_init(IWineD3DVolumeImpl *volume, IWineD3DDeviceImpl *device, UINT width, UINT height,
+ UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent)
+{
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info);
+ HRESULT hr;
+
+ if (!gl_info->supported[EXT_TEXTURE3D])
+ {
+ WARN("Volume cannot be created - no volume texture support.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ volume->lpVtbl = &IWineD3DVolume_Vtbl;
+
+ hr = resource_init((IWineD3DResource *)volume, WINED3DRTYPE_VOLUME, device,
+ width * height * depth * format_desc->byte_count, usage, format_desc, pool, parent);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize resource, returning %#x.\n", hr);
+ return hr;
+ }
+
+ volume->currentDesc.Width = width;
+ volume->currentDesc.Height = height;
+ volume->currentDesc.Depth = depth;
+ volume->lockable = TRUE;
+ volume->locked = FALSE;
+ memset(&volume->lockedBox, 0, sizeof(volume->lockedBox));
+ volume->dirty = TRUE;
+
+ volume_add_dirty_box((IWineD3DVolume *)volume, NULL);
+
+ return WINED3D_OK;
+}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index cb6fa84..b5a6775 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1875,9 +1875,9 @@ typedef struct IWineD3DVolumeImpl
BOOL dirty;
} IWineD3DVolumeImpl;
-extern const IWineD3DVolumeVtbl IWineD3DVolume_Vtbl DECLSPEC_HIDDEN;
-
void volume_add_dirty_box(IWineD3DVolume *iface, const WINED3DBOX *dirty_box) DECLSPEC_HIDDEN;
+HRESULT volume_init(IWineD3DVolumeImpl *volume, IWineD3DDeviceImpl *device, UINT width, UINT height,
+ UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent) DECLSPEC_HIDDEN;
/*****************************************************************************
* IWineD3DVolumeTexture implementation structure (extends IWineD3DBaseTextureImpl)
--
1.6.0.6
More information about the wine-patches
mailing list