mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-01 19:29:16 +01:00
[d3d9] Use bitsets for bool subresource arrays
Also remove lockflag tracking and consolidate that to a bitset
This commit is contained in:
parent
960d2bd158
commit
6e9725a124
@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
#include "../dxvk/dxvk_device.h"
|
#include "../dxvk/dxvk_device.h"
|
||||||
|
|
||||||
|
#include "../util/util_bit.h"
|
||||||
|
|
||||||
namespace dxvk {
|
namespace dxvk {
|
||||||
|
|
||||||
class D3D9DeviceEx;
|
class D3D9DeviceEx;
|
||||||
@ -86,6 +88,8 @@ namespace dxvk {
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
using D3D9SubresourceArray = std::array<T, caps::MaxSubresources>;
|
using D3D9SubresourceArray = std::array<T, caps::MaxSubresources>;
|
||||||
|
|
||||||
|
using D3D9SubresourceBitset = bit::bitset<caps::MaxSubresources>;
|
||||||
|
|
||||||
class D3D9CommonTexture {
|
class D3D9CommonTexture {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -204,22 +208,6 @@ namespace dxvk {
|
|||||||
D3D9DeviceEx* pDevice,
|
D3D9DeviceEx* pDevice,
|
||||||
D3D9_COMMON_TEXTURE_DESC* pDesc);
|
D3D9_COMMON_TEXTURE_DESC* pDesc);
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Lock Flags
|
|
||||||
* Set the lock flags for a given subresource
|
|
||||||
*/
|
|
||||||
void SetLockFlags(UINT Subresource, DWORD Flags) {
|
|
||||||
m_lockFlags[Subresource] = Flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Lock Flags
|
|
||||||
* \returns The log flags for a given subresource
|
|
||||||
*/
|
|
||||||
DWORD GetLockFlags(UINT Subresource) const {
|
|
||||||
return m_lockFlags[Subresource];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Shadow
|
* \brief Shadow
|
||||||
* \returns Whether the texture is to be depth compared
|
* \returns Whether the texture is to be depth compared
|
||||||
@ -334,10 +322,15 @@ namespace dxvk {
|
|||||||
|
|
||||||
const D3D9_VK_FORMAT_MAPPING& GetMapping() { return m_mapping; }
|
const D3D9_VK_FORMAT_MAPPING& GetMapping() { return m_mapping; }
|
||||||
|
|
||||||
bool MarkLocked(UINT Subresource, bool value) { return std::exchange(m_locked[Subresource], value); }
|
bool MarkLocked(UINT Subresource, bool value) { return m_locked.exchange(Subresource, value); }
|
||||||
|
|
||||||
bool SetDirty(UINT Subresource, bool value) { return std::exchange(m_dirty[Subresource], value); }
|
bool SetDirty(UINT Subresource, bool value) { return m_dirty.exchange(Subresource, value); }
|
||||||
void MarkAllDirty() { for (uint32_t i = 0; i < m_dirty.size(); i++) m_dirty[i] = true; }
|
|
||||||
|
void MarkAllDirty() { m_dirty.setAll(); }
|
||||||
|
|
||||||
|
void SetReadOnlyLocked(UINT Subresource, bool readOnly) { return m_readOnly.set(Subresource, readOnly); }
|
||||||
|
|
||||||
|
bool GetReadOnlyLocked(UINT Subresource) { return m_readOnly.get(Subresource); }
|
||||||
|
|
||||||
const Rc<DxvkImageView>& GetSampleView(bool srgb) const {
|
const Rc<DxvkImageView>& GetSampleView(bool srgb) const {
|
||||||
return m_sampleView.Pick(srgb && IsSrgbCompatible());
|
return m_sampleView.Pick(srgb && IsSrgbCompatible());
|
||||||
@ -378,7 +371,6 @@ namespace dxvk {
|
|||||||
Rc<DxvkBuffer>> m_buffers;
|
Rc<DxvkBuffer>> m_buffers;
|
||||||
D3D9SubresourceArray<
|
D3D9SubresourceArray<
|
||||||
DxvkBufferSliceHandle> m_mappedSlices;
|
DxvkBufferSliceHandle> m_mappedSlices;
|
||||||
D3D9SubresourceArray<DWORD> m_lockFlags;
|
|
||||||
|
|
||||||
D3D9_VK_FORMAT_MAPPING m_mapping;
|
D3D9_VK_FORMAT_MAPPING m_mapping;
|
||||||
|
|
||||||
@ -394,11 +386,11 @@ namespace dxvk {
|
|||||||
|
|
||||||
D3D9ColorView m_sampleView;
|
D3D9ColorView m_sampleView;
|
||||||
|
|
||||||
D3D9SubresourceArray<
|
D3D9SubresourceBitset m_locked = { };
|
||||||
bool> m_locked = { };
|
|
||||||
|
|
||||||
D3D9SubresourceArray<
|
D3D9SubresourceBitset m_readOnly = { };
|
||||||
bool> m_dirty = { };
|
|
||||||
|
D3D9SubresourceBitset m_dirty = { };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Mip level
|
* \brief Mip level
|
||||||
|
@ -3868,7 +3868,7 @@ namespace dxvk {
|
|||||||
if (desc.Usage & D3DUSAGE_WRITEONLY)
|
if (desc.Usage & D3DUSAGE_WRITEONLY)
|
||||||
Flags &= ~D3DLOCK_READONLY;
|
Flags &= ~D3DLOCK_READONLY;
|
||||||
|
|
||||||
pResource->SetLockFlags(Subresource, Flags);
|
pResource->SetReadOnlyLocked(Subresource, Flags & D3DLOCK_READONLY);
|
||||||
|
|
||||||
bool renderable = desc.Usage & (D3DUSAGE_RENDERTARGET | D3DUSAGE_DEPTHSTENCIL);
|
bool renderable = desc.Usage & (D3DUSAGE_RENDERTARGET | D3DUSAGE_DEPTHSTENCIL);
|
||||||
|
|
||||||
@ -4034,7 +4034,7 @@ namespace dxvk {
|
|||||||
return D3DERR_INVALIDCALL;
|
return D3DERR_INVALIDCALL;
|
||||||
|
|
||||||
// Do we have a pending copy?
|
// Do we have a pending copy?
|
||||||
if (!(pResource->GetLockFlags(Subresource) & D3DLOCK_READONLY)) {
|
if (!pResource->GetReadOnlyLocked(Subresource)) {
|
||||||
// Only flush buffer -> image if we actually have an image
|
// Only flush buffer -> image if we actually have an image
|
||||||
if (pResource->GetMapMode() == D3D9_COMMON_TEXTURE_MAP_MODE_BACKED)
|
if (pResource->GetMapMode() == D3D9_COMMON_TEXTURE_MAP_MODE_BACKED)
|
||||||
this->FlushImage(pResource, Subresource);
|
this->FlushImage(pResource, Subresource);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user