From 40ffac72d9bc2a010b96f5de30a0f12186ca3a52 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Mon, 5 Sep 2022 04:57:31 +0200 Subject: [PATCH] [d3d11] Introduce methods for dirty region tracking for mapped images --- src/d3d11/d3d11_texture.h | 77 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/src/d3d11/d3d11_texture.h b/src/d3d11/d3d11_texture.h index c510ae952..b8324c81e 100644 --- a/src/d3d11/d3d11_texture.h +++ b/src/d3d11/d3d11_texture.h @@ -61,6 +61,15 @@ namespace dxvk { }; + /** + * \brief Region + */ + struct D3D11_COMMON_TEXTURE_REGION { + VkOffset3D Offset; + VkExtent3D Extent; + }; + + /** * \brief D3D11 common texture object * @@ -292,6 +301,72 @@ namespace dxvk { } } + /** + * \brief Adds a dirty region + * + * This region will be updated on Unmap. + * \param [in] Subresource Subresource index + * \param [in] Offset Region offset + * \param [in] Extent Region extent + */ + void AddDirtyRegion(UINT Subresource, VkOffset3D Offset, VkExtent3D Extent) { + D3D11_COMMON_TEXTURE_REGION region; + region.Offset = Offset; + region.Extent = Extent; + + if (Subresource < m_buffers.size()) + m_buffers[Subresource].dirtyRegions.push_back(region); + } + + /** + * \brief Clears dirty regions + * + * Removes all dirty regions from the given subresource. + * \param [in] Subresource Subresource index + */ + void ClearDirtyRegions(UINT Subresource) { + if (Subresource < m_buffers.size()) + m_buffers[Subresource].dirtyRegions.clear(); + } + + /** + * \brief Counts dirty regions + * + * \param [in] Subresource Subresource index + * \returns Dirty region count + */ + UINT GetDirtyRegionCount(UINT Subresource) { + return (Subresource < m_buffers.size()) + ? UINT(m_buffers[Subresource].dirtyRegions.size()) + : UINT(0); + } + + /** + * \brief Retrieves dirty regions + * + * \param [in] Subresource Subresource index + * \param [in] Region Region index + * \returns Dirty region + */ + D3D11_COMMON_TEXTURE_REGION GetDirtyRegionCount(UINT Subresource, UINT Region) { + return m_buffers[Subresource].dirtyRegions[Region]; + } + + /** + * \brief Checks whether or not to track dirty regions + * + * If this returns true, then any functions that update the + * mapped staging buffer must also track dirty regions while + * the image is mapped. Otherwise, the entire image is dirty. + * \returns \c true if dirty regions must be tracked + */ + bool NeedsDirtyRegionTracking() const { + // Only set this for images where Map can't return a pointer + return m_mapMode == D3D11_COMMON_TEXTURE_MAP_MODE_BUFFER + && m_desc.Usage == D3D11_USAGE_DEFAULT + && m_desc.TextureLayout == D3D11_TEXTURE_LAYOUT_UNDEFINED; + } + /** * \brief Computes pixel offset into mapped buffer * @@ -379,6 +454,8 @@ namespace dxvk { struct MappedBuffer { Rc buffer; DxvkBufferSliceHandle slice; + + std::vector dirtyRegions; }; struct MappedInfo {