diff options
Diffstat (limited to 'src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_buffer.h')
-rw-r--r-- | src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_buffer.h | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_buffer.h b/src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_buffer.h new file mode 100644 index 00000000..3ddd61a0 --- /dev/null +++ b/src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_buffer.h @@ -0,0 +1,162 @@ +#pragma once + +#include "../dxvk/dxvk_device.h" + +#include "../d3d10/d3d10_buffer.h" + +#include "d3d11_device_child.h" +#include "d3d11_interfaces.h" +#include "d3d11_resource.h" + +namespace dxvk { + + class D3D11Device; + class D3D11DeviceContext; + + + /** + * \brief Buffer map mode + */ + enum D3D11_COMMON_BUFFER_MAP_MODE { + D3D11_COMMON_BUFFER_MAP_MODE_NONE, + D3D11_COMMON_BUFFER_MAP_MODE_DIRECT, + }; + + + /** + * \brief Stream output buffer offset + * + * A byte offset into the buffer that + * stores the byte offset where new + * data will be written to. + */ + struct D3D11SOCounter { + uint32_t byteOffset; + }; + + + class D3D11Buffer : public D3D11DeviceChild<ID3D11Buffer> { + static constexpr VkDeviceSize BufferSliceAlignment = 64; + public: + + D3D11Buffer( + D3D11Device* pDevice, + const D3D11_BUFFER_DESC* pDesc); + ~D3D11Buffer(); + + HRESULT STDMETHODCALLTYPE QueryInterface( + REFIID riid, + void** ppvObject) final; + + void STDMETHODCALLTYPE GetType( + D3D11_RESOURCE_DIMENSION *pResourceDimension) final; + + UINT STDMETHODCALLTYPE GetEvictionPriority() final; + + void STDMETHODCALLTYPE SetEvictionPriority(UINT EvictionPriority) final; + + void STDMETHODCALLTYPE GetDesc( + D3D11_BUFFER_DESC *pDesc) final; + + bool CheckViewCompatibility( + UINT BindFlags, + DXGI_FORMAT Format) const; + + const D3D11_BUFFER_DESC* Desc() const { + return &m_desc; + } + + D3D11_COMMON_BUFFER_MAP_MODE GetMapMode() const { + return (m_buffer->memFlags() & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) + ? D3D11_COMMON_BUFFER_MAP_MODE_DIRECT + : D3D11_COMMON_BUFFER_MAP_MODE_NONE; + } + + Rc<DxvkBuffer> GetBuffer() const { + return m_buffer; + } + + DxvkBufferSlice GetBufferSlice() const { + return DxvkBufferSlice(m_buffer, 0, m_desc.ByteWidth); + } + + DxvkBufferSlice GetBufferSlice(VkDeviceSize offset) const { + VkDeviceSize size = m_desc.ByteWidth; + + return likely(offset < size) + ? DxvkBufferSlice(m_buffer, offset, size - offset) + : DxvkBufferSlice(); + } + + DxvkBufferSlice GetBufferSlice(VkDeviceSize offset, VkDeviceSize length) const { + VkDeviceSize size = m_desc.ByteWidth; + + return likely(offset < size) + ? DxvkBufferSlice(m_buffer, offset, std::min(length, size - offset)) + : DxvkBufferSlice(); + } + + DxvkBufferSlice GetSOCounter() { + return m_soCounter != nullptr + ? DxvkBufferSlice(m_soCounter) + : DxvkBufferSlice(); + } + + DxvkBufferSliceHandle AllocSlice() { + return m_buffer->allocSlice(); + } + + DxvkBufferSliceHandle DiscardSlice() { + m_mapped = m_buffer->allocSlice(); + return m_mapped; + } + + DxvkBufferSliceHandle GetMappedSlice() const { + return m_mapped; + } + + D3D10Buffer* GetD3D10Iface() { + return &m_d3d10; + } + + /** + * \brief Normalizes buffer description + * + * \param [in] pDesc Buffer description + * \returns \c S_OK if the parameters are valid + */ + static HRESULT NormalizeBufferProperties( + D3D11_BUFFER_DESC* pDesc); + + private: + + const D3D11_BUFFER_DESC m_desc; + + Rc<DxvkBuffer> m_buffer; + Rc<DxvkBuffer> m_soCounter; + DxvkBufferSliceHandle m_mapped; + + D3D11DXGIResource m_resource; + D3D10Buffer m_d3d10; + + BOOL CheckFormatFeatureSupport( + VkFormat Format, + VkFormatFeatureFlags Features) const; + + VkMemoryPropertyFlags GetMemoryFlags() const; + + Rc<DxvkBuffer> CreateSoCounterBuffer(); + + }; + + + /** + * \brief Retrieves buffer from resource pointer + * + * \param [in] pResource The resource to query + * \returns Pointer to buffer, or \c nullptr + */ + D3D11Buffer* GetCommonBuffer( + ID3D11Resource* pResource); + +} |