Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
5145b131
Commit
5145b131
authored
Apr 24, 2012
by
Henri Verbeet
Committed by
Alexandre Julliard
Apr 25, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
d3d9: Merge volumetexture.c into texture.c.
parent
fb5bc724
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
420 additions
and
456 deletions
+420
-456
Makefile.in
dlls/d3d9/Makefile.in
+1
-2
texture.c
dlls/d3d9/texture.c
+419
-0
volumetexture.c
dlls/d3d9/volumetexture.c
+0
-454
No files found.
dlls/d3d9/Makefile.in
View file @
5145b131
...
...
@@ -14,8 +14,7 @@ C_SRCS = \
swapchain.c
\
texture.c
\
vertexdeclaration.c
\
volume.c
\
volumetexture.c
volume.c
RC_SRCS
=
version.rc
...
...
dlls/d3d9/texture.c
View file @
5145b131
...
...
@@ -33,6 +33,11 @@ static inline struct d3d9_texture *impl_from_IDirect3DCubeTexture9(IDirect3DCube
return
CONTAINING_RECORD
(
iface
,
struct
d3d9_texture
,
IDirect3DBaseTexture9_iface
);
}
static
inline
struct
d3d9_texture
*
impl_from_IDirect3DVolumeTexture9
(
IDirect3DVolumeTexture9
*
iface
)
{
return
CONTAINING_RECORD
(
iface
,
struct
d3d9_texture
,
IDirect3DBaseTexture9_iface
);
}
static
HRESULT
WINAPI
d3d9_texture_2d_QueryInterface
(
IDirect3DTexture9
*
iface
,
REFIID
riid
,
void
**
out
)
{
TRACE
(
"iface %p, riid %s, out %p.
\n
"
,
iface
,
debugstr_guid
(
riid
),
out
);
...
...
@@ -849,6 +854,395 @@ static const IDirect3DCubeTexture9Vtbl d3d9_texture_cube_vtbl =
d3d9_texture_cube_AddDirtyRect
,
};
static
HRESULT
WINAPI
d3d9_texture_3d_QueryInterface
(
IDirect3DVolumeTexture9
*
iface
,
REFIID
riid
,
void
**
out
)
{
TRACE
(
"iface %p, riid %s, out %p.
\n
"
,
iface
,
debugstr_guid
(
riid
),
out
);
if
(
IsEqualGUID
(
riid
,
&
IID_IDirect3DVolumeTexture9
)
||
IsEqualGUID
(
riid
,
&
IID_IDirect3DBaseTexture9
)
||
IsEqualGUID
(
riid
,
&
IID_IDirect3DResource9
)
||
IsEqualGUID
(
riid
,
&
IID_IUnknown
))
{
IDirect3DVolumeTexture9_AddRef
(
iface
);
*
out
=
iface
;
return
S_OK
;
}
WARN
(
"%s not implemented, returning E_NOINTERFACE.
\n
"
,
debugstr_guid
(
riid
));
*
out
=
NULL
;
return
E_NOINTERFACE
;
}
static
ULONG
WINAPI
d3d9_texture_3d_AddRef
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
ULONG
ref
=
InterlockedIncrement
(
&
texture
->
refcount
);
TRACE
(
"%p increasing refcount to %u.
\n
"
,
iface
,
ref
);
if
(
ref
==
1
)
{
IDirect3DDevice9Ex_AddRef
(
texture
->
parent_device
);
wined3d_mutex_lock
();
wined3d_texture_incref
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
}
return
ref
;
}
static
ULONG
WINAPI
d3d9_texture_3d_Release
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
ULONG
ref
=
InterlockedDecrement
(
&
texture
->
refcount
);
TRACE
(
"%p decreasing refcount to %u.
\n
"
,
iface
,
ref
);
if
(
!
ref
)
{
IDirect3DDevice9Ex
*
parent_device
=
texture
->
parent_device
;
wined3d_mutex_lock
();
wined3d_texture_decref
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
/* Release the device last, as it may cause the device to be destroyed. */
IDirect3DDevice9Ex_Release
(
parent_device
);
}
return
ref
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_GetDevice
(
IDirect3DVolumeTexture9
*
iface
,
IDirect3DDevice9
**
device
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
TRACE
(
"iface %p, device %p.
\n
"
,
iface
,
device
);
*
device
=
(
IDirect3DDevice9
*
)
texture
->
parent_device
;
IDirect3DDevice9_AddRef
(
*
device
);
TRACE
(
"Returning device %p.
\n
"
,
*
device
);
return
D3D_OK
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_SetPrivateData
(
IDirect3DVolumeTexture9
*
iface
,
REFGUID
guid
,
const
void
*
data
,
DWORD
data_size
,
DWORD
flags
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
struct
wined3d_resource
*
resource
;
HRESULT
hr
;
TRACE
(
"iface %p, guid %s, data %p, data_size %u, flags %#x.
\n
"
,
iface
,
debugstr_guid
(
guid
),
data
,
data_size
,
flags
);
wined3d_mutex_lock
();
resource
=
wined3d_texture_get_resource
(
texture
->
wined3d_texture
);
hr
=
wined3d_resource_set_private_data
(
resource
,
guid
,
data
,
data_size
,
flags
);
wined3d_mutex_unlock
();
return
hr
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_GetPrivateData
(
IDirect3DVolumeTexture9
*
iface
,
REFGUID
guid
,
void
*
data
,
DWORD
*
data_size
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
struct
wined3d_resource
*
resource
;
HRESULT
hr
;
TRACE
(
"iface %p, guid %s, data %p, data_size %p.
\n
"
,
iface
,
debugstr_guid
(
guid
),
data
,
data_size
);
wined3d_mutex_lock
();
resource
=
wined3d_texture_get_resource
(
texture
->
wined3d_texture
);
hr
=
wined3d_resource_get_private_data
(
resource
,
guid
,
data
,
data_size
);
wined3d_mutex_unlock
();
return
hr
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_FreePrivateData
(
IDirect3DVolumeTexture9
*
iface
,
REFGUID
guid
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
struct
wined3d_resource
*
resource
;
HRESULT
hr
;
TRACE
(
"iface %p, guid %s.
\n
"
,
iface
,
debugstr_guid
(
guid
));
wined3d_mutex_lock
();
resource
=
wined3d_texture_get_resource
(
texture
->
wined3d_texture
);
hr
=
wined3d_resource_free_private_data
(
resource
,
guid
);
wined3d_mutex_unlock
();
return
hr
;
}
static
DWORD
WINAPI
d3d9_texture_3d_SetPriority
(
IDirect3DVolumeTexture9
*
iface
,
DWORD
priority
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
DWORD
ret
;
TRACE
(
"iface %p, priority %u.
\n
"
,
iface
,
priority
);
wined3d_mutex_lock
();
ret
=
wined3d_texture_set_priority
(
texture
->
wined3d_texture
,
priority
);
wined3d_mutex_unlock
();
return
ret
;
}
static
DWORD
WINAPI
d3d9_texture_3d_GetPriority
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
DWORD
ret
;
TRACE
(
"iface %p.
\n
"
,
iface
);
wined3d_mutex_lock
();
ret
=
wined3d_texture_get_priority
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
return
ret
;
}
static
void
WINAPI
d3d9_texture_3d_PreLoad
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
TRACE
(
"iface %p.
\n
"
,
iface
);
wined3d_mutex_lock
();
wined3d_texture_preload
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
}
static
D3DRESOURCETYPE
WINAPI
d3d9_texture_3d_GetType
(
IDirect3DVolumeTexture9
*
iface
)
{
TRACE
(
"iface %p.
\n
"
,
iface
);
return
D3DRTYPE_VOLUMETEXTURE
;
}
static
DWORD
WINAPI
d3d9_texture_3d_SetLOD
(
IDirect3DVolumeTexture9
*
iface
,
DWORD
lod
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
DWORD
ret
;
TRACE
(
"iface %p, lod %u.
\n
"
,
iface
,
lod
);
wined3d_mutex_lock
();
ret
=
wined3d_texture_set_lod
(
texture
->
wined3d_texture
,
lod
);
wined3d_mutex_unlock
();
return
ret
;
}
static
DWORD
WINAPI
d3d9_texture_3d_GetLOD
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
DWORD
ret
;
TRACE
(
"iface %p.
\n
"
,
iface
);
wined3d_mutex_lock
();
ret
=
wined3d_texture_get_lod
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
return
ret
;
}
static
DWORD
WINAPI
d3d9_texture_3d_GetLevelCount
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
DWORD
ret
;
TRACE
(
"iface %p.
\n
"
,
iface
);
wined3d_mutex_lock
();
ret
=
wined3d_texture_get_level_count
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
return
ret
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_SetAutoGenFilterType
(
IDirect3DVolumeTexture9
*
iface
,
D3DTEXTUREFILTERTYPE
filter_type
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
HRESULT
hr
;
TRACE
(
"iface %p, filter_type %#x.
\n
"
,
iface
,
filter_type
);
wined3d_mutex_lock
();
hr
=
wined3d_texture_set_autogen_filter_type
(
texture
->
wined3d_texture
,
(
enum
wined3d_texture_filter_type
)
filter_type
);
wined3d_mutex_unlock
();
return
hr
;
}
static
D3DTEXTUREFILTERTYPE
WINAPI
d3d9_texture_3d_GetAutoGenFilterType
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
D3DTEXTUREFILTERTYPE
filter_type
;
TRACE
(
"iface %p.
\n
"
,
iface
);
wined3d_mutex_lock
();
filter_type
=
(
D3DTEXTUREFILTERTYPE
)
wined3d_texture_get_autogen_filter_type
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
return
filter_type
;
}
static
void
WINAPI
d3d9_texture_3d_GenerateMipSubLevels
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
TRACE
(
"iface %p.
\n
"
,
iface
);
wined3d_mutex_lock
();
wined3d_texture_generate_mipmaps
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
}
static
HRESULT
WINAPI
d3d9_texture_3d_GetLevelDesc
(
IDirect3DVolumeTexture9
*
iface
,
UINT
level
,
D3DVOLUME_DESC
*
desc
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
struct
wined3d_resource
*
sub_resource
;
HRESULT
hr
=
D3D_OK
;
TRACE
(
"iface %p, level %u, desc %p.
\n
"
,
iface
,
level
,
desc
);
wined3d_mutex_lock
();
if
(
!
(
sub_resource
=
wined3d_texture_get_sub_resource
(
texture
->
wined3d_texture
,
level
)))
hr
=
D3DERR_INVALIDCALL
;
else
{
struct
wined3d_resource_desc
wined3d_desc
;
wined3d_resource_get_desc
(
sub_resource
,
&
wined3d_desc
);
desc
->
Format
=
d3dformat_from_wined3dformat
(
wined3d_desc
.
format
);
desc
->
Type
=
wined3d_desc
.
resource_type
;
desc
->
Usage
=
wined3d_desc
.
usage
&
WINED3DUSAGE_MASK
;
desc
->
Pool
=
wined3d_desc
.
pool
;
desc
->
Width
=
wined3d_desc
.
width
;
desc
->
Height
=
wined3d_desc
.
height
;
desc
->
Depth
=
wined3d_desc
.
depth
;
}
wined3d_mutex_unlock
();
return
hr
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_GetVolumeLevel
(
IDirect3DVolumeTexture9
*
iface
,
UINT
level
,
IDirect3DVolume9
**
volume
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
struct
wined3d_resource
*
sub_resource
;
TRACE
(
"iface %p, level %u, volume %p.
\n
"
,
iface
,
level
,
volume
);
wined3d_mutex_lock
();
if
(
!
(
sub_resource
=
wined3d_texture_get_sub_resource
(
texture
->
wined3d_texture
,
level
)))
{
wined3d_mutex_unlock
();
return
D3DERR_INVALIDCALL
;
}
*
volume
=
wined3d_resource_get_parent
(
sub_resource
);
IDirect3DVolume9_AddRef
(
*
volume
);
wined3d_mutex_unlock
();
return
D3D_OK
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_LockBox
(
IDirect3DVolumeTexture9
*
iface
,
UINT
level
,
D3DLOCKED_BOX
*
locked_box
,
const
D3DBOX
*
box
,
DWORD
flags
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
struct
wined3d_resource
*
sub_resource
;
HRESULT
hr
;
TRACE
(
"iface %p, level %u, locked_box %p, box %p, flags %#x.
\n
"
,
iface
,
level
,
locked_box
,
box
,
flags
);
wined3d_mutex_lock
();
if
(
!
(
sub_resource
=
wined3d_texture_get_sub_resource
(
texture
->
wined3d_texture
,
level
)))
hr
=
D3DERR_INVALIDCALL
;
else
hr
=
IDirect3DVolume9_LockBox
((
IDirect3DVolume9
*
)
wined3d_resource_get_parent
(
sub_resource
),
locked_box
,
box
,
flags
);
wined3d_mutex_unlock
();
return
hr
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_UnlockBox
(
IDirect3DVolumeTexture9
*
iface
,
UINT
level
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
struct
wined3d_resource
*
sub_resource
;
HRESULT
hr
;
TRACE
(
"iface %p, level %u.
\n
"
,
iface
,
level
);
wined3d_mutex_lock
();
if
(
!
(
sub_resource
=
wined3d_texture_get_sub_resource
(
texture
->
wined3d_texture
,
level
)))
hr
=
D3DERR_INVALIDCALL
;
else
hr
=
IDirect3DVolume9_UnlockBox
((
IDirect3DVolume9
*
)
wined3d_resource_get_parent
(
sub_resource
));
wined3d_mutex_unlock
();
return
hr
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_AddDirtyBox
(
IDirect3DVolumeTexture9
*
iface
,
const
D3DBOX
*
dirty_box
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
HRESULT
hr
;
TRACE
(
"iface %p, dirty_box %p.
\n
"
,
iface
,
dirty_box
);
wined3d_mutex_lock
();
hr
=
wined3d_texture_add_dirty_region
(
texture
->
wined3d_texture
,
0
,
(
const
struct
wined3d_box
*
)
dirty_box
);
wined3d_mutex_unlock
();
return
hr
;
}
static
const
IDirect3DVolumeTexture9Vtbl
d3d9_texture_3d_vtbl
=
{
/* IUnknown */
d3d9_texture_3d_QueryInterface
,
d3d9_texture_3d_AddRef
,
d3d9_texture_3d_Release
,
/* IDirect3DResource9 */
d3d9_texture_3d_GetDevice
,
d3d9_texture_3d_SetPrivateData
,
d3d9_texture_3d_GetPrivateData
,
d3d9_texture_3d_FreePrivateData
,
d3d9_texture_3d_SetPriority
,
d3d9_texture_3d_GetPriority
,
d3d9_texture_3d_PreLoad
,
d3d9_texture_3d_GetType
,
/* IDirect3DBaseTexture9 */
d3d9_texture_3d_SetLOD
,
d3d9_texture_3d_GetLOD
,
d3d9_texture_3d_GetLevelCount
,
d3d9_texture_3d_SetAutoGenFilterType
,
d3d9_texture_3d_GetAutoGenFilterType
,
d3d9_texture_3d_GenerateMipSubLevels
,
/* IDirect3DVolumeTexture9 */
d3d9_texture_3d_GetLevelDesc
,
d3d9_texture_3d_GetVolumeLevel
,
d3d9_texture_3d_LockBox
,
d3d9_texture_3d_UnlockBox
,
d3d9_texture_3d_AddDirtyBox
,
};
static
void
STDMETHODCALLTYPE
d3d9_texture_wined3d_object_destroyed
(
void
*
parent
)
{
HeapFree
(
GetProcessHeap
(),
0
,
parent
);
...
...
@@ -908,3 +1302,28 @@ HRESULT cubetexture_init(struct d3d9_texture *texture, IDirect3DDevice9Impl *dev
return
D3D_OK
;
}
HRESULT
volumetexture_init
(
struct
d3d9_texture
*
texture
,
IDirect3DDevice9Impl
*
device
,
UINT
width
,
UINT
height
,
UINT
depth
,
UINT
levels
,
DWORD
usage
,
D3DFORMAT
format
,
D3DPOOL
pool
)
{
HRESULT
hr
;
texture
->
IDirect3DBaseTexture9_iface
.
lpVtbl
=
(
const
IDirect3DBaseTexture9Vtbl
*
)
&
d3d9_texture_3d_vtbl
;
texture
->
refcount
=
1
;
wined3d_mutex_lock
();
hr
=
wined3d_texture_create_3d
(
device
->
wined3d_device
,
width
,
height
,
depth
,
levels
,
usage
&
WINED3DUSAGE_MASK
,
wined3dformat_from_d3dformat
(
format
),
pool
,
texture
,
&
d3d9_texture_wined3d_parent_ops
,
&
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
if
(
FAILED
(
hr
))
{
WARN
(
"Failed to create wined3d volume texture, hr %#x.
\n
"
,
hr
);
return
hr
;
}
texture
->
parent_device
=
&
device
->
IDirect3DDevice9Ex_iface
;
IDirect3DDevice9Ex_AddRef
(
texture
->
parent_device
);
return
D3D_OK
;
}
dlls/d3d9/volumetexture.c
deleted
100644 → 0
View file @
fb5bc724
/*
* IDirect3DVolumeTexture9 implementation
*
* Copyright 2002-2005 Jason Edmeades
* Raphael Junqueira
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "config.h"
#include "d3d9_private.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
d3d9
);
static
inline
struct
d3d9_texture
*
impl_from_IDirect3DVolumeTexture9
(
IDirect3DVolumeTexture9
*
iface
)
{
return
CONTAINING_RECORD
(
iface
,
struct
d3d9_texture
,
IDirect3DBaseTexture9_iface
);
}
static
HRESULT
WINAPI
d3d9_texture_3d_QueryInterface
(
IDirect3DVolumeTexture9
*
iface
,
REFIID
riid
,
void
**
out
)
{
TRACE
(
"iface %p, riid %s, out %p.
\n
"
,
iface
,
debugstr_guid
(
riid
),
out
);
if
(
IsEqualGUID
(
riid
,
&
IID_IDirect3DVolumeTexture9
)
||
IsEqualGUID
(
riid
,
&
IID_IDirect3DBaseTexture9
)
||
IsEqualGUID
(
riid
,
&
IID_IDirect3DResource9
)
||
IsEqualGUID
(
riid
,
&
IID_IUnknown
))
{
IDirect3DVolumeTexture9_AddRef
(
iface
);
*
out
=
iface
;
return
S_OK
;
}
WARN
(
"%s not implemented, returning E_NOINTERFACE.
\n
"
,
debugstr_guid
(
riid
));
*
out
=
NULL
;
return
E_NOINTERFACE
;
}
static
ULONG
WINAPI
d3d9_texture_3d_AddRef
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
ULONG
ref
=
InterlockedIncrement
(
&
texture
->
refcount
);
TRACE
(
"%p increasing refcount to %u.
\n
"
,
iface
,
ref
);
if
(
ref
==
1
)
{
IDirect3DDevice9Ex_AddRef
(
texture
->
parent_device
);
wined3d_mutex_lock
();
wined3d_texture_incref
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
}
return
ref
;
}
static
ULONG
WINAPI
d3d9_texture_3d_Release
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
ULONG
ref
=
InterlockedDecrement
(
&
texture
->
refcount
);
TRACE
(
"%p decreasing refcount to %u.
\n
"
,
iface
,
ref
);
if
(
!
ref
)
{
IDirect3DDevice9Ex
*
parent_device
=
texture
->
parent_device
;
wined3d_mutex_lock
();
wined3d_texture_decref
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
/* Release the device last, as it may cause the device to be destroyed. */
IDirect3DDevice9Ex_Release
(
parent_device
);
}
return
ref
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_GetDevice
(
IDirect3DVolumeTexture9
*
iface
,
IDirect3DDevice9
**
device
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
TRACE
(
"iface %p, device %p.
\n
"
,
iface
,
device
);
*
device
=
(
IDirect3DDevice9
*
)
texture
->
parent_device
;
IDirect3DDevice9_AddRef
(
*
device
);
TRACE
(
"Returning device %p.
\n
"
,
*
device
);
return
D3D_OK
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_SetPrivateData
(
IDirect3DVolumeTexture9
*
iface
,
REFGUID
guid
,
const
void
*
data
,
DWORD
data_size
,
DWORD
flags
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
struct
wined3d_resource
*
resource
;
HRESULT
hr
;
TRACE
(
"iface %p, guid %s, data %p, data_size %u, flags %#x.
\n
"
,
iface
,
debugstr_guid
(
guid
),
data
,
data_size
,
flags
);
wined3d_mutex_lock
();
resource
=
wined3d_texture_get_resource
(
texture
->
wined3d_texture
);
hr
=
wined3d_resource_set_private_data
(
resource
,
guid
,
data
,
data_size
,
flags
);
wined3d_mutex_unlock
();
return
hr
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_GetPrivateData
(
IDirect3DVolumeTexture9
*
iface
,
REFGUID
guid
,
void
*
data
,
DWORD
*
data_size
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
struct
wined3d_resource
*
resource
;
HRESULT
hr
;
TRACE
(
"iface %p, guid %s, data %p, data_size %p.
\n
"
,
iface
,
debugstr_guid
(
guid
),
data
,
data_size
);
wined3d_mutex_lock
();
resource
=
wined3d_texture_get_resource
(
texture
->
wined3d_texture
);
hr
=
wined3d_resource_get_private_data
(
resource
,
guid
,
data
,
data_size
);
wined3d_mutex_unlock
();
return
hr
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_FreePrivateData
(
IDirect3DVolumeTexture9
*
iface
,
REFGUID
guid
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
struct
wined3d_resource
*
resource
;
HRESULT
hr
;
TRACE
(
"iface %p, guid %s.
\n
"
,
iface
,
debugstr_guid
(
guid
));
wined3d_mutex_lock
();
resource
=
wined3d_texture_get_resource
(
texture
->
wined3d_texture
);
hr
=
wined3d_resource_free_private_data
(
resource
,
guid
);
wined3d_mutex_unlock
();
return
hr
;
}
static
DWORD
WINAPI
d3d9_texture_3d_SetPriority
(
IDirect3DVolumeTexture9
*
iface
,
DWORD
priority
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
DWORD
ret
;
TRACE
(
"iface %p, priority %u.
\n
"
,
iface
,
priority
);
wined3d_mutex_lock
();
ret
=
wined3d_texture_set_priority
(
texture
->
wined3d_texture
,
priority
);
wined3d_mutex_unlock
();
return
ret
;
}
static
DWORD
WINAPI
d3d9_texture_3d_GetPriority
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
DWORD
ret
;
TRACE
(
"iface %p.
\n
"
,
iface
);
wined3d_mutex_lock
();
ret
=
wined3d_texture_get_priority
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
return
ret
;
}
static
void
WINAPI
d3d9_texture_3d_PreLoad
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
TRACE
(
"iface %p.
\n
"
,
iface
);
wined3d_mutex_lock
();
wined3d_texture_preload
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
}
static
D3DRESOURCETYPE
WINAPI
d3d9_texture_3d_GetType
(
IDirect3DVolumeTexture9
*
iface
)
{
TRACE
(
"iface %p.
\n
"
,
iface
);
return
D3DRTYPE_VOLUMETEXTURE
;
}
static
DWORD
WINAPI
d3d9_texture_3d_SetLOD
(
IDirect3DVolumeTexture9
*
iface
,
DWORD
lod
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
DWORD
ret
;
TRACE
(
"iface %p, lod %u.
\n
"
,
iface
,
lod
);
wined3d_mutex_lock
();
ret
=
wined3d_texture_set_lod
(
texture
->
wined3d_texture
,
lod
);
wined3d_mutex_unlock
();
return
ret
;
}
static
DWORD
WINAPI
d3d9_texture_3d_GetLOD
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
DWORD
ret
;
TRACE
(
"iface %p.
\n
"
,
iface
);
wined3d_mutex_lock
();
ret
=
wined3d_texture_get_lod
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
return
ret
;
}
static
DWORD
WINAPI
d3d9_texture_3d_GetLevelCount
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
DWORD
ret
;
TRACE
(
"iface %p.
\n
"
,
iface
);
wined3d_mutex_lock
();
ret
=
wined3d_texture_get_level_count
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
return
ret
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_SetAutoGenFilterType
(
IDirect3DVolumeTexture9
*
iface
,
D3DTEXTUREFILTERTYPE
filter_type
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
HRESULT
hr
;
TRACE
(
"iface %p, filter_type %#x.
\n
"
,
iface
,
filter_type
);
wined3d_mutex_lock
();
hr
=
wined3d_texture_set_autogen_filter_type
(
texture
->
wined3d_texture
,
(
enum
wined3d_texture_filter_type
)
filter_type
);
wined3d_mutex_unlock
();
return
hr
;
}
static
D3DTEXTUREFILTERTYPE
WINAPI
d3d9_texture_3d_GetAutoGenFilterType
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
D3DTEXTUREFILTERTYPE
filter_type
;
TRACE
(
"iface %p.
\n
"
,
iface
);
wined3d_mutex_lock
();
filter_type
=
(
D3DTEXTUREFILTERTYPE
)
wined3d_texture_get_autogen_filter_type
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
return
filter_type
;
}
static
void
WINAPI
d3d9_texture_3d_GenerateMipSubLevels
(
IDirect3DVolumeTexture9
*
iface
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
TRACE
(
"iface %p.
\n
"
,
iface
);
wined3d_mutex_lock
();
wined3d_texture_generate_mipmaps
(
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
}
static
HRESULT
WINAPI
d3d9_texture_3d_GetLevelDesc
(
IDirect3DVolumeTexture9
*
iface
,
UINT
level
,
D3DVOLUME_DESC
*
desc
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
struct
wined3d_resource
*
sub_resource
;
HRESULT
hr
=
D3D_OK
;
TRACE
(
"iface %p, level %u, desc %p.
\n
"
,
iface
,
level
,
desc
);
wined3d_mutex_lock
();
if
(
!
(
sub_resource
=
wined3d_texture_get_sub_resource
(
texture
->
wined3d_texture
,
level
)))
hr
=
D3DERR_INVALIDCALL
;
else
{
struct
wined3d_resource_desc
wined3d_desc
;
wined3d_resource_get_desc
(
sub_resource
,
&
wined3d_desc
);
desc
->
Format
=
d3dformat_from_wined3dformat
(
wined3d_desc
.
format
);
desc
->
Type
=
wined3d_desc
.
resource_type
;
desc
->
Usage
=
wined3d_desc
.
usage
&
WINED3DUSAGE_MASK
;
desc
->
Pool
=
wined3d_desc
.
pool
;
desc
->
Width
=
wined3d_desc
.
width
;
desc
->
Height
=
wined3d_desc
.
height
;
desc
->
Depth
=
wined3d_desc
.
depth
;
}
wined3d_mutex_unlock
();
return
hr
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_GetVolumeLevel
(
IDirect3DVolumeTexture9
*
iface
,
UINT
level
,
IDirect3DVolume9
**
volume
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
struct
wined3d_resource
*
sub_resource
;
TRACE
(
"iface %p, level %u, volume %p.
\n
"
,
iface
,
level
,
volume
);
wined3d_mutex_lock
();
if
(
!
(
sub_resource
=
wined3d_texture_get_sub_resource
(
texture
->
wined3d_texture
,
level
)))
{
wined3d_mutex_unlock
();
return
D3DERR_INVALIDCALL
;
}
*
volume
=
wined3d_resource_get_parent
(
sub_resource
);
IDirect3DVolume9_AddRef
(
*
volume
);
wined3d_mutex_unlock
();
return
D3D_OK
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_LockBox
(
IDirect3DVolumeTexture9
*
iface
,
UINT
level
,
D3DLOCKED_BOX
*
locked_box
,
const
D3DBOX
*
box
,
DWORD
flags
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
struct
wined3d_resource
*
sub_resource
;
HRESULT
hr
;
TRACE
(
"iface %p, level %u, locked_box %p, box %p, flags %#x.
\n
"
,
iface
,
level
,
locked_box
,
box
,
flags
);
wined3d_mutex_lock
();
if
(
!
(
sub_resource
=
wined3d_texture_get_sub_resource
(
texture
->
wined3d_texture
,
level
)))
hr
=
D3DERR_INVALIDCALL
;
else
hr
=
IDirect3DVolume9_LockBox
((
IDirect3DVolume9
*
)
wined3d_resource_get_parent
(
sub_resource
),
locked_box
,
box
,
flags
);
wined3d_mutex_unlock
();
return
hr
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_UnlockBox
(
IDirect3DVolumeTexture9
*
iface
,
UINT
level
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
struct
wined3d_resource
*
sub_resource
;
HRESULT
hr
;
TRACE
(
"iface %p, level %u.
\n
"
,
iface
,
level
);
wined3d_mutex_lock
();
if
(
!
(
sub_resource
=
wined3d_texture_get_sub_resource
(
texture
->
wined3d_texture
,
level
)))
hr
=
D3DERR_INVALIDCALL
;
else
hr
=
IDirect3DVolume9_UnlockBox
((
IDirect3DVolume9
*
)
wined3d_resource_get_parent
(
sub_resource
));
wined3d_mutex_unlock
();
return
hr
;
}
static
HRESULT
WINAPI
d3d9_texture_3d_AddDirtyBox
(
IDirect3DVolumeTexture9
*
iface
,
const
D3DBOX
*
dirty_box
)
{
struct
d3d9_texture
*
texture
=
impl_from_IDirect3DVolumeTexture9
(
iface
);
HRESULT
hr
;
TRACE
(
"iface %p, dirty_box %p.
\n
"
,
iface
,
dirty_box
);
wined3d_mutex_lock
();
hr
=
wined3d_texture_add_dirty_region
(
texture
->
wined3d_texture
,
0
,
(
const
struct
wined3d_box
*
)
dirty_box
);
wined3d_mutex_unlock
();
return
hr
;
}
static
const
IDirect3DVolumeTexture9Vtbl
d3d9_texture_3d_vtbl
=
{
/* IUnknown */
d3d9_texture_3d_QueryInterface
,
d3d9_texture_3d_AddRef
,
d3d9_texture_3d_Release
,
/* IDirect3DResource9 */
d3d9_texture_3d_GetDevice
,
d3d9_texture_3d_SetPrivateData
,
d3d9_texture_3d_GetPrivateData
,
d3d9_texture_3d_FreePrivateData
,
d3d9_texture_3d_SetPriority
,
d3d9_texture_3d_GetPriority
,
d3d9_texture_3d_PreLoad
,
d3d9_texture_3d_GetType
,
/* IDirect3DBaseTexture9 */
d3d9_texture_3d_SetLOD
,
d3d9_texture_3d_GetLOD
,
d3d9_texture_3d_GetLevelCount
,
d3d9_texture_3d_SetAutoGenFilterType
,
d3d9_texture_3d_GetAutoGenFilterType
,
d3d9_texture_3d_GenerateMipSubLevels
,
/* IDirect3DVolumeTexture9 */
d3d9_texture_3d_GetLevelDesc
,
d3d9_texture_3d_GetVolumeLevel
,
d3d9_texture_3d_LockBox
,
d3d9_texture_3d_UnlockBox
,
d3d9_texture_3d_AddDirtyBox
,
};
static
void
STDMETHODCALLTYPE
volumetexture_wined3d_object_destroyed
(
void
*
parent
)
{
HeapFree
(
GetProcessHeap
(),
0
,
parent
);
}
static
const
struct
wined3d_parent_ops
d3d9_volumetexture_wined3d_parent_ops
=
{
volumetexture_wined3d_object_destroyed
,
};
HRESULT
volumetexture_init
(
struct
d3d9_texture
*
texture
,
IDirect3DDevice9Impl
*
device
,
UINT
width
,
UINT
height
,
UINT
depth
,
UINT
levels
,
DWORD
usage
,
D3DFORMAT
format
,
D3DPOOL
pool
)
{
HRESULT
hr
;
texture
->
IDirect3DBaseTexture9_iface
.
lpVtbl
=
(
const
IDirect3DBaseTexture9Vtbl
*
)
&
d3d9_texture_3d_vtbl
;
texture
->
refcount
=
1
;
wined3d_mutex_lock
();
hr
=
wined3d_texture_create_3d
(
device
->
wined3d_device
,
width
,
height
,
depth
,
levels
,
usage
&
WINED3DUSAGE_MASK
,
wined3dformat_from_d3dformat
(
format
),
pool
,
texture
,
&
d3d9_volumetexture_wined3d_parent_ops
,
&
texture
->
wined3d_texture
);
wined3d_mutex_unlock
();
if
(
FAILED
(
hr
))
{
WARN
(
"Failed to create wined3d volume texture, hr %#x.
\n
"
,
hr
);
return
hr
;
}
texture
->
parent_device
=
&
device
->
IDirect3DDevice9Ex_iface
;
IDirect3DDevice9Ex_AddRef
(
texture
->
parent_device
);
return
D3D_OK
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment