diff options
Diffstat (limited to 'src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_view.h')
-rw-r--r-- | src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_view.h | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_view.h b/src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_view.h new file mode 100644 index 00000000..50fcef10 --- /dev/null +++ b/src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_view.h @@ -0,0 +1,81 @@ +#pragma once + +#include "d3d11_include.h" + +namespace dxvk { + + /** + * \brief Buffer view info + * + * Stores the byte range covered + * by a buffer view. + */ + struct D3D11_VK_BUFFER_VIEW_INFO { + VkDeviceSize Offset; + VkDeviceSize Length; + }; + + /** + * \brief Image view info + * + * Stores the subresource range + * covered by an image view. + */ + struct D3D11_VK_IMAGE_VIEW_INFO { + VkImageAspectFlags Aspects; + uint32_t MinLevel; + uint32_t MinLayer; + uint32_t NumLevels; + uint32_t NumLayers; + }; + + /** + * \brief Common view info + * + * Stores a pointer to the resource as + * well as the type-specific range that + * is affected by the view. + */ + struct D3D11_VK_VIEW_INFO { + ID3D11Resource* pResource; + D3D11_RESOURCE_DIMENSION Dimension; + UINT BindFlags; + union { + D3D11_VK_BUFFER_VIEW_INFO Buffer; + D3D11_VK_IMAGE_VIEW_INFO Image; + }; + }; + + /** + * \brief Checks whether two views overlap + * + * Overlapping views may conflict in case + * one or both views are used for writing. + * \param [in] a First view to check + * \param [in] b Second view to check + * \returns \c true if the views overlap + */ + inline bool CheckViewOverlap(const D3D11_VK_VIEW_INFO& a, const D3D11_VK_VIEW_INFO b) { + if (likely(a.pResource != b.pResource)) + return false; + + if (a.Dimension == D3D11_RESOURCE_DIMENSION_BUFFER) { + // Just check whether the buffer ranges overlap + return (a.Buffer.Offset < b.Buffer.Offset + b.Buffer.Length) + && (a.Buffer.Offset + a.Buffer.Length > b.Buffer.Offset); + } else { + // Check whether the subresource ranges overlap + return (a.Image.Aspects & b.Image.Aspects) + && (a.Image.MinLevel < b.Image.MinLevel + b.Image.NumLevels) + && (a.Image.MinLayer < b.Image.MinLayer + b.Image.NumLayers) + && (a.Image.MinLevel + a.Image.NumLevels > b.Image.MinLevel) + && (a.Image.MinLayer + a.Image.NumLayers > b.Image.MinLayer); + } + } + + template<typename T1, typename T2> + bool CheckViewOverlap(const T1* a, const T2* b) { + return a && b && CheckViewOverlap(a->GetViewInfo(), b->GetViewInfo()); + } + +}
\ No newline at end of file |