1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-13 07:08:50 +01:00
dxvk/src/d3d9/d3d9_volume.cpp
2020-05-26 13:14:58 +01:00

112 lines
2.7 KiB
C++

#include "d3d9_volume.h"
#include "d3d9_device.h"
#include "d3d9_texture.h"
namespace dxvk {
D3D9Volume::D3D9Volume(
D3D9DeviceEx* pDevice,
const D3D9_COMMON_TEXTURE_DESC* pDesc)
: D3D9VolumeBase(
pDevice,
new D3D9CommonTexture( pDevice, pDesc, D3DRTYPE_VOLUMETEXTURE ),
0, 0,
nullptr,
nullptr) { }
D3D9Volume::D3D9Volume(
D3D9DeviceEx* pDevice,
D3D9CommonTexture* pTexture,
UINT Face,
UINT MipLevel,
IDirect3DBaseTexture9* pContainer)
: D3D9VolumeBase(
pDevice,
pTexture,
Face, MipLevel,
pContainer,
pContainer) { }
void D3D9Volume::AddRefPrivate() {
// Can't have a swapchain container for a volume.
if (m_baseTexture != nullptr) {
static_cast<D3D9Texture3D*>(m_baseTexture)->AddRefPrivate();
return;
}
D3D9VolumeBase::AddRefPrivate();
}
void D3D9Volume::ReleasePrivate() {
// Can't have a swapchain container for a volume.
if (m_baseTexture != nullptr) {
static_cast<D3D9Texture3D*>(m_baseTexture)->ReleasePrivate();
return;
}
D3D9VolumeBase::ReleasePrivate();
}
HRESULT STDMETHODCALLTYPE D3D9Volume::QueryInterface(REFIID riid, void** ppvObject) {
if (ppvObject == nullptr)
return E_POINTER;
*ppvObject = nullptr;
if (riid == __uuidof(IUnknown)
|| riid == __uuidof(IDirect3DResource9)
|| riid == __uuidof(IDirect3DVolume9)) {
*ppvObject = ref(this);
return S_OK;
}
Logger::warn("D3D9Volume::QueryInterface: Unknown interface query");
Logger::warn(str::format(riid));
return E_NOINTERFACE;
}
HRESULT STDMETHODCALLTYPE D3D9Volume::GetDesc(D3DVOLUME_DESC *pDesc) {
if (pDesc == nullptr)
return D3DERR_INVALIDCALL;
auto& desc = *(m_texture->Desc());
pDesc->Format = static_cast<D3DFORMAT>(desc.Format);
pDesc->Type = D3DRTYPE_VOLUME;
pDesc->Usage = desc.Usage;
pDesc->Pool = desc.Pool;
pDesc->Width = std::max(1u, desc.Width >> m_mipLevel);
pDesc->Height = std::max(1u, desc.Height >> m_mipLevel);
pDesc->Depth = std::max(1u, desc.Depth >> m_mipLevel);
return D3D_OK;
}
HRESULT STDMETHODCALLTYPE D3D9Volume::LockBox(D3DLOCKED_BOX* pLockedBox, CONST D3DBOX* pBox, DWORD Flags) {
if (unlikely(pLockedBox == nullptr))
return D3DERR_INVALIDCALL;
return m_parent->LockImage(
m_texture,
m_face, m_mipLevel,
pLockedBox,
pBox,
Flags);
}
HRESULT STDMETHODCALLTYPE D3D9Volume::UnlockBox() {
return m_parent->UnlockImage(
m_texture,
m_face, m_mipLevel);
}
}