mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-12 13:54:14 +01:00
[d3d8] Refactor D3D8Texture2D/3D/Cube implementation
This commit is contained in:
parent
8017607fe7
commit
7bb8819fbc
149
src/d3d8/d3d8_texture.cpp
Normal file
149
src/d3d8/d3d8_texture.cpp
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
#include "d3d8_texture.h"
|
||||||
|
|
||||||
|
#include "d3d8_d3d9_util.h"
|
||||||
|
|
||||||
|
namespace dxvk {
|
||||||
|
|
||||||
|
// D3D8Texture2D
|
||||||
|
|
||||||
|
D3D8Texture2D::D3D8Texture2D(
|
||||||
|
D3D8Device* pDevice,
|
||||||
|
Com<d3d9::IDirect3DTexture9>&& pTexture)
|
||||||
|
: D3D8Texture2DBase(pDevice, std::move(pTexture), pTexture->GetLevelCount()) {
|
||||||
|
}
|
||||||
|
|
||||||
|
D3DRESOURCETYPE STDMETHODCALLTYPE D3D8Texture2D::GetType() { return D3DRTYPE_TEXTURE; }
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8Texture2D::GetLevelDesc(UINT Level, D3DSURFACE_DESC* pDesc) {
|
||||||
|
if (unlikely(pDesc == nullptr))
|
||||||
|
return D3DERR_INVALIDCALL;
|
||||||
|
|
||||||
|
d3d9::D3DSURFACE_DESC surf;
|
||||||
|
HRESULT res = GetD3D9()->GetLevelDesc(Level, &surf);
|
||||||
|
|
||||||
|
if (likely(SUCCEEDED(res)))
|
||||||
|
ConvertSurfaceDesc8(&surf, pDesc);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8Texture2D::GetSurfaceLevel(UINT Level, IDirect3DSurface8** ppSurfaceLevel) {
|
||||||
|
return GetSubresource(Level, ppSurfaceLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8Texture2D::LockRect(
|
||||||
|
UINT Level,
|
||||||
|
D3DLOCKED_RECT* pLockedRect,
|
||||||
|
CONST RECT* pRect,
|
||||||
|
DWORD Flags) {
|
||||||
|
return GetD3D9()->LockRect(Level, reinterpret_cast<d3d9::D3DLOCKED_RECT*>(pLockedRect), pRect, Flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8Texture2D::UnlockRect(UINT Level) {
|
||||||
|
return GetD3D9()->UnlockRect(Level);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8Texture2D::AddDirtyRect(CONST RECT* pDirtyRect) {
|
||||||
|
return GetD3D9()->AddDirtyRect(pDirtyRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
// D3D8Texture3D
|
||||||
|
|
||||||
|
D3D8Texture3D::D3D8Texture3D(
|
||||||
|
D3D8Device* pDevice,
|
||||||
|
Com<d3d9::IDirect3DVolumeTexture9>&& pVolumeTexture)
|
||||||
|
: D3D8Texture3DBase(pDevice, std::move(pVolumeTexture), pVolumeTexture->GetLevelCount()) {}
|
||||||
|
|
||||||
|
D3DRESOURCETYPE STDMETHODCALLTYPE D3D8Texture3D::GetType() { return D3DRTYPE_VOLUMETEXTURE; }
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8Texture3D::GetLevelDesc(UINT Level, D3DVOLUME_DESC *pDesc) {
|
||||||
|
if (unlikely(pDesc == nullptr))
|
||||||
|
return D3DERR_INVALIDCALL;
|
||||||
|
|
||||||
|
d3d9::D3DVOLUME_DESC vol;
|
||||||
|
HRESULT res = GetD3D9()->GetLevelDesc(Level, &vol);
|
||||||
|
|
||||||
|
if (likely(SUCCEEDED(res)))
|
||||||
|
ConvertVolumeDesc8(&vol, pDesc);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8Texture3D::GetVolumeLevel(UINT Level, IDirect3DVolume8** ppVolumeLevel) {
|
||||||
|
return GetSubresource(Level, ppVolumeLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8Texture3D::LockBox(
|
||||||
|
UINT Level,
|
||||||
|
D3DLOCKED_BOX* pLockedBox,
|
||||||
|
CONST D3DBOX* pBox,
|
||||||
|
DWORD Flags) {
|
||||||
|
return GetD3D9()->LockBox(
|
||||||
|
Level,
|
||||||
|
reinterpret_cast<d3d9::D3DLOCKED_BOX*>(pLockedBox),
|
||||||
|
reinterpret_cast<const d3d9::D3DBOX*>(pBox),
|
||||||
|
Flags
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8Texture3D::UnlockBox(UINT Level) {
|
||||||
|
return GetD3D9()->UnlockBox(Level);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8Texture3D::AddDirtyBox(CONST D3DBOX* pDirtyBox) {
|
||||||
|
return GetD3D9()->AddDirtyBox(reinterpret_cast<const d3d9::D3DBOX*>(pDirtyBox));
|
||||||
|
}
|
||||||
|
|
||||||
|
// D3D8TextureCube
|
||||||
|
|
||||||
|
D3D8TextureCube::D3D8TextureCube(
|
||||||
|
D3D8Device* pDevice,
|
||||||
|
Com<d3d9::IDirect3DCubeTexture9>&& pTexture)
|
||||||
|
: D3D8TextureCubeBase(pDevice, std::move(pTexture), pTexture->GetLevelCount() * CUBE_FACES) {
|
||||||
|
}
|
||||||
|
|
||||||
|
D3DRESOURCETYPE STDMETHODCALLTYPE D3D8TextureCube::GetType() { return D3DRTYPE_CUBETEXTURE; }
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8TextureCube::GetLevelDesc(UINT Level, D3DSURFACE_DESC* pDesc) {
|
||||||
|
if (unlikely(pDesc == nullptr))
|
||||||
|
return D3DERR_INVALIDCALL;
|
||||||
|
|
||||||
|
d3d9::D3DSURFACE_DESC surf;
|
||||||
|
HRESULT res = GetD3D9()->GetLevelDesc(Level, &surf);
|
||||||
|
|
||||||
|
if (likely(SUCCEEDED(res)))
|
||||||
|
ConvertSurfaceDesc8(&surf, pDesc);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8TextureCube::GetCubeMapSurface(
|
||||||
|
D3DCUBEMAP_FACES Face,
|
||||||
|
UINT Level,
|
||||||
|
IDirect3DSurface8** ppSurfaceLevel) {
|
||||||
|
return GetSubresource((Level * CUBE_FACES) + Face, ppSurfaceLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8TextureCube::LockRect(
|
||||||
|
D3DCUBEMAP_FACES Face,
|
||||||
|
UINT Level,
|
||||||
|
D3DLOCKED_RECT* pLockedRect,
|
||||||
|
const RECT* pRect,
|
||||||
|
DWORD Flags) {
|
||||||
|
return GetD3D9()->LockRect(
|
||||||
|
d3d9::D3DCUBEMAP_FACES(Face),
|
||||||
|
Level,
|
||||||
|
reinterpret_cast<d3d9::D3DLOCKED_RECT*>(pLockedRect),
|
||||||
|
pRect,
|
||||||
|
Flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8TextureCube::UnlockRect(D3DCUBEMAP_FACES Face, UINT Level) {
|
||||||
|
return GetD3D9()->UnlockRect(d3d9::D3DCUBEMAP_FACES(Face), Level);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT STDMETHODCALLTYPE D3D8TextureCube::AddDirtyRect(D3DCUBEMAP_FACES Face, const RECT* pDirtyRect) {
|
||||||
|
return GetD3D9()->AddDirtyRect(d3d9::D3DCUBEMAP_FACES(Face), pDirtyRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,8 +4,6 @@
|
|||||||
#include "d3d8_surface.h"
|
#include "d3d8_surface.h"
|
||||||
#include "d3d8_volume.h"
|
#include "d3d8_volume.h"
|
||||||
|
|
||||||
#include "d3d8_d3d9_util.h"
|
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <new>
|
#include <new>
|
||||||
|
|
||||||
@ -114,40 +112,23 @@ namespace dxvk {
|
|||||||
|
|
||||||
D3D8Texture2D(
|
D3D8Texture2D(
|
||||||
D3D8Device* pDevice,
|
D3D8Device* pDevice,
|
||||||
Com<d3d9::IDirect3DTexture9>&& pTexture)
|
Com<d3d9::IDirect3DTexture9>&& pTexture);
|
||||||
: D3D8Texture2DBase(pDevice, std::move(pTexture), pTexture->GetLevelCount()) {
|
|
||||||
}
|
|
||||||
|
|
||||||
D3DRESOURCETYPE STDMETHODCALLTYPE GetType() final { return D3DRTYPE_TEXTURE; }
|
D3DRESOURCETYPE STDMETHODCALLTYPE GetType() final;
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE GetLevelDesc(UINT Level, D3DSURFACE_DESC* pDesc) {
|
HRESULT STDMETHODCALLTYPE GetLevelDesc(UINT Level, D3DSURFACE_DESC* pDesc);
|
||||||
if (unlikely(pDesc == nullptr))
|
|
||||||
return D3DERR_INVALIDCALL;
|
|
||||||
|
|
||||||
d3d9::D3DSURFACE_DESC surf;
|
HRESULT STDMETHODCALLTYPE GetSurfaceLevel(UINT Level, IDirect3DSurface8** ppSurfaceLevel);
|
||||||
HRESULT res = GetD3D9()->GetLevelDesc(Level, &surf);
|
|
||||||
|
|
||||||
if (likely(SUCCEEDED(res)))
|
HRESULT STDMETHODCALLTYPE LockRect(
|
||||||
ConvertSurfaceDesc8(&surf, pDesc);
|
UINT Level,
|
||||||
|
D3DLOCKED_RECT* pLockedRect,
|
||||||
|
CONST RECT* pRect,
|
||||||
|
DWORD Flags);
|
||||||
|
|
||||||
return res;
|
HRESULT STDMETHODCALLTYPE UnlockRect(UINT Level);
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE GetSurfaceLevel(UINT Level, IDirect3DSurface8** ppSurfaceLevel) {
|
HRESULT STDMETHODCALLTYPE AddDirtyRect(CONST RECT* pDirtyRect);
|
||||||
return GetSubresource(Level, ppSurfaceLevel);
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE LockRect(UINT Level, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) {
|
|
||||||
return GetD3D9()->LockRect(Level, reinterpret_cast<d3d9::D3DLOCKED_RECT*>(pLockedRect), pRect, Flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE UnlockRect(UINT Level) {
|
|
||||||
return GetD3D9()->UnlockRect(Level);
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE AddDirtyRect(CONST RECT* pDirtyRect) {
|
|
||||||
return GetD3D9()->AddDirtyRect(pDirtyRect);
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -158,44 +139,23 @@ namespace dxvk {
|
|||||||
|
|
||||||
D3D8Texture3D(
|
D3D8Texture3D(
|
||||||
D3D8Device* pDevice,
|
D3D8Device* pDevice,
|
||||||
Com<d3d9::IDirect3DVolumeTexture9>&& pVolumeTexture)
|
Com<d3d9::IDirect3DVolumeTexture9>&& pVolumeTexture);
|
||||||
: D3D8Texture3DBase(pDevice, std::move(pVolumeTexture), pVolumeTexture->GetLevelCount()) {}
|
|
||||||
|
|
||||||
D3DRESOURCETYPE STDMETHODCALLTYPE GetType() final { return D3DRTYPE_VOLUMETEXTURE; }
|
D3DRESOURCETYPE STDMETHODCALLTYPE GetType() final;
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE GetLevelDesc(UINT Level, D3DVOLUME_DESC *pDesc) {
|
HRESULT STDMETHODCALLTYPE GetLevelDesc(UINT Level, D3DVOLUME_DESC *pDesc);
|
||||||
if (unlikely(pDesc == nullptr))
|
|
||||||
return D3DERR_INVALIDCALL;
|
|
||||||
|
|
||||||
d3d9::D3DVOLUME_DESC vol;
|
HRESULT STDMETHODCALLTYPE GetVolumeLevel(UINT Level, IDirect3DVolume8** ppVolumeLevel);
|
||||||
HRESULT res = GetD3D9()->GetLevelDesc(Level, &vol);
|
|
||||||
|
|
||||||
if (likely(SUCCEEDED(res)))
|
HRESULT STDMETHODCALLTYPE LockBox(
|
||||||
ConvertVolumeDesc8(&vol, pDesc);
|
UINT Level,
|
||||||
|
D3DLOCKED_BOX* pLockedBox,
|
||||||
|
CONST D3DBOX* pBox,
|
||||||
|
DWORD Flags);
|
||||||
|
|
||||||
return res;
|
HRESULT STDMETHODCALLTYPE UnlockBox(UINT Level);
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE GetVolumeLevel(UINT Level, IDirect3DVolume8** ppVolumeLevel) {
|
HRESULT STDMETHODCALLTYPE AddDirtyBox(CONST D3DBOX* pDirtyBox);
|
||||||
return GetSubresource(Level, ppVolumeLevel);
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE LockBox(UINT Level, D3DLOCKED_BOX* pLockedBox, CONST D3DBOX* pBox, DWORD Flags) {
|
|
||||||
return GetD3D9()->LockBox(
|
|
||||||
Level,
|
|
||||||
reinterpret_cast<d3d9::D3DLOCKED_BOX*>(pLockedBox),
|
|
||||||
reinterpret_cast<const d3d9::D3DBOX*>(pBox),
|
|
||||||
Flags
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE UnlockBox(UINT Level) {
|
|
||||||
return GetD3D9()->UnlockBox(Level);
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE AddDirtyBox(CONST D3DBOX* pDirtyBox) {
|
|
||||||
return GetD3D9()->AddDirtyBox(reinterpret_cast<const d3d9::D3DBOX*>(pDirtyBox));
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -206,49 +166,28 @@ namespace dxvk {
|
|||||||
|
|
||||||
D3D8TextureCube(
|
D3D8TextureCube(
|
||||||
D3D8Device* pDevice,
|
D3D8Device* pDevice,
|
||||||
Com<d3d9::IDirect3DCubeTexture9>&& pTexture)
|
Com<d3d9::IDirect3DCubeTexture9>&& pTexture);
|
||||||
: D3D8TextureCubeBase(pDevice, std::move(pTexture), pTexture->GetLevelCount() * CUBE_FACES) {
|
|
||||||
}
|
|
||||||
|
|
||||||
D3DRESOURCETYPE STDMETHODCALLTYPE GetType() final { return D3DRTYPE_CUBETEXTURE; }
|
D3DRESOURCETYPE STDMETHODCALLTYPE GetType() final;
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE GetLevelDesc(UINT Level, D3DSURFACE_DESC* pDesc) {
|
HRESULT STDMETHODCALLTYPE GetLevelDesc(UINT Level, D3DSURFACE_DESC* pDesc);
|
||||||
if (unlikely(pDesc == nullptr))
|
|
||||||
return D3DERR_INVALIDCALL;
|
|
||||||
|
|
||||||
d3d9::D3DSURFACE_DESC surf;
|
HRESULT STDMETHODCALLTYPE GetCubeMapSurface(
|
||||||
HRESULT res = GetD3D9()->GetLevelDesc(Level, &surf);
|
D3DCUBEMAP_FACES Face,
|
||||||
|
UINT Level,
|
||||||
if (likely(SUCCEEDED(res)))
|
IDirect3DSurface8** ppSurfaceLevel);
|
||||||
ConvertSurfaceDesc8(&surf, pDesc);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE GetCubeMapSurface(D3DCUBEMAP_FACES Face, UINT Level, IDirect3DSurface8** ppSurfaceLevel) {
|
|
||||||
return GetSubresource((Level * CUBE_FACES) + Face, ppSurfaceLevel);
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE LockRect(
|
HRESULT STDMETHODCALLTYPE LockRect(
|
||||||
D3DCUBEMAP_FACES Face,
|
D3DCUBEMAP_FACES Face,
|
||||||
UINT Level,
|
UINT Level,
|
||||||
D3DLOCKED_RECT* pLockedRect,
|
D3DLOCKED_RECT* pLockedRect,
|
||||||
const RECT* pRect,
|
const RECT* pRect,
|
||||||
DWORD Flags) {
|
DWORD Flags);
|
||||||
return GetD3D9()->LockRect(
|
|
||||||
d3d9::D3DCUBEMAP_FACES(Face),
|
|
||||||
Level,
|
|
||||||
reinterpret_cast<d3d9::D3DLOCKED_RECT*>(pLockedRect),
|
|
||||||
pRect,
|
|
||||||
Flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE UnlockRect(D3DCUBEMAP_FACES Face, UINT Level) {
|
HRESULT STDMETHODCALLTYPE UnlockRect(D3DCUBEMAP_FACES Face, UINT Level);
|
||||||
return GetD3D9()->UnlockRect(d3d9::D3DCUBEMAP_FACES(Face), Level);
|
|
||||||
}
|
HRESULT STDMETHODCALLTYPE AddDirtyRect(D3DCUBEMAP_FACES Face, const RECT* pDirtyRect);
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE AddDirtyRect(D3DCUBEMAP_FACES Face, const RECT* pDirtyRect) {
|
|
||||||
return GetD3D9()->AddDirtyRect(d3d9::D3DCUBEMAP_FACES(Face), pDirtyRect);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
@ -9,7 +9,8 @@ d3d8_src = [
|
|||||||
'd3d8_shader.cpp',
|
'd3d8_shader.cpp',
|
||||||
'd3d8_state_block.cpp',
|
'd3d8_state_block.cpp',
|
||||||
'd3d8_surface.cpp',
|
'd3d8_surface.cpp',
|
||||||
'd3d8_swapchain.cpp'
|
'd3d8_swapchain.cpp',
|
||||||
|
'd3d8_texture.cpp'
|
||||||
]
|
]
|
||||||
|
|
||||||
d3d8_ld_args = []
|
d3d8_ld_args = []
|
||||||
|
Loading…
x
Reference in New Issue
Block a user