2018-11-02 19:42:29 +01:00
|
|
|
#pragma once
|
|
|
|
|
2020-05-10 00:34:45 +02:00
|
|
|
#include "vulkan_loader.h"
|
2018-11-02 19:42:29 +01:00
|
|
|
|
|
|
|
namespace dxvk::vk {
|
|
|
|
|
|
|
|
inline VkImageSubresourceRange makeSubresourceRange(
|
|
|
|
const VkImageSubresourceLayers& layers) {
|
|
|
|
VkImageSubresourceRange range;
|
|
|
|
range.aspectMask = layers.aspectMask;
|
|
|
|
range.baseMipLevel = layers.mipLevel;
|
|
|
|
range.levelCount = 1;
|
|
|
|
range.baseArrayLayer = layers.baseArrayLayer;
|
|
|
|
range.layerCount = layers.layerCount;
|
|
|
|
return range;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline VkImageSubresourceRange makeSubresourceRange(
|
|
|
|
const VkImageSubresource& subres) {
|
|
|
|
VkImageSubresourceRange range;
|
|
|
|
range.aspectMask = subres.aspectMask;
|
|
|
|
range.baseMipLevel = subres.mipLevel;
|
|
|
|
range.levelCount = 1;
|
|
|
|
range.baseArrayLayer = subres.arrayLayer;
|
|
|
|
range.layerCount = 1;
|
|
|
|
return range;
|
|
|
|
}
|
|
|
|
|
2018-11-07 18:30:44 +01:00
|
|
|
inline VkImageSubresourceLayers makeSubresourceLayers(
|
|
|
|
const VkImageSubresource& subres) {
|
|
|
|
VkImageSubresourceLayers layers;
|
|
|
|
layers.aspectMask = subres.aspectMask;
|
|
|
|
layers.mipLevel = subres.mipLevel;
|
|
|
|
layers.baseArrayLayer = subres.arrayLayer;
|
|
|
|
layers.layerCount = 1;
|
|
|
|
return layers;
|
|
|
|
}
|
|
|
|
|
2018-11-02 19:42:29 +01:00
|
|
|
inline VkImageSubresourceLayers pickSubresourceLayers(
|
|
|
|
const VkImageSubresourceRange& range,
|
|
|
|
uint32_t level) {
|
|
|
|
VkImageSubresourceLayers layers;
|
|
|
|
layers.aspectMask = range.aspectMask;
|
|
|
|
layers.mipLevel = range.baseMipLevel + level;
|
|
|
|
layers.baseArrayLayer = range.baseArrayLayer;
|
|
|
|
layers.layerCount = range.layerCount;
|
|
|
|
return layers;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline VkImageSubresource pickSubresource(
|
|
|
|
const VkImageSubresourceRange& range,
|
|
|
|
uint32_t level,
|
|
|
|
uint32_t layer) {
|
|
|
|
VkImageSubresource subres;
|
|
|
|
subres.aspectMask = range.aspectMask;
|
|
|
|
subres.mipLevel = range.baseMipLevel + level;
|
|
|
|
subres.arrayLayer = range.baseArrayLayer + layer;
|
|
|
|
return subres;
|
|
|
|
}
|
|
|
|
|
2021-02-10 16:59:06 +01:00
|
|
|
inline bool checkSubresourceRangeOverlap(
|
|
|
|
const VkImageSubresourceRange& a,
|
|
|
|
const VkImageSubresourceRange& b) {
|
|
|
|
return a.baseMipLevel < b.baseMipLevel + b.levelCount
|
|
|
|
&& a.baseMipLevel + a.levelCount > b.baseMipLevel
|
|
|
|
&& a.baseArrayLayer < b.baseArrayLayer + b.layerCount
|
|
|
|
&& a.baseArrayLayer + a.layerCount > b.baseArrayLayer;
|
|
|
|
}
|
|
|
|
|
2021-03-06 02:33:39 +01:00
|
|
|
inline bool checkSubresourceRangeSuperset(
|
|
|
|
const VkImageSubresourceRange& a,
|
|
|
|
const VkImageSubresourceRange& b) {
|
|
|
|
return a.baseMipLevel <= b.baseMipLevel
|
|
|
|
&& a.baseMipLevel + a.levelCount >= b.baseMipLevel + b.levelCount
|
|
|
|
&& a.baseArrayLayer <= b.baseArrayLayer
|
|
|
|
&& a.baseArrayLayer + a.layerCount >= b.baseArrayLayer + b.layerCount;
|
|
|
|
}
|
|
|
|
|
2018-11-02 19:42:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
inline bool operator == (
|
|
|
|
const VkImageSubresourceRange& a,
|
|
|
|
const VkImageSubresourceRange& b) {
|
|
|
|
return a.aspectMask == b.aspectMask
|
|
|
|
&& a.baseMipLevel == b.baseMipLevel
|
|
|
|
&& a.levelCount == b.levelCount
|
|
|
|
&& a.baseArrayLayer == b.baseArrayLayer
|
|
|
|
&& a.layerCount == b.layerCount;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
inline bool operator != (
|
|
|
|
const VkImageSubresourceRange& a,
|
|
|
|
const VkImageSubresourceRange& b) {
|
|
|
|
return !operator == (a, b);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
inline bool operator == (
|
|
|
|
const VkImageSubresourceLayers& a,
|
|
|
|
const VkImageSubresourceLayers& b) {
|
|
|
|
return a.aspectMask == b.aspectMask
|
|
|
|
&& a.mipLevel == b.mipLevel
|
|
|
|
&& a.baseArrayLayer == b.baseArrayLayer
|
|
|
|
&& a.layerCount == b.layerCount;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
inline bool operator != (
|
|
|
|
const VkImageSubresourceLayers& a,
|
|
|
|
const VkImageSubresourceLayers& b) {
|
|
|
|
return !operator == (a, b);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
inline bool operator == (VkExtent3D a, VkExtent3D b) {
|
|
|
|
return a.width == b.width
|
|
|
|
&& a.height == b.height
|
|
|
|
&& a.depth == b.depth;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
inline bool operator != (VkExtent3D a, VkExtent3D b) {
|
|
|
|
return a.width != b.width
|
|
|
|
|| a.height != b.height
|
|
|
|
|| a.depth != b.depth;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
inline bool operator == (VkExtent2D a, VkExtent2D b) {
|
|
|
|
return a.width == b.width
|
|
|
|
&& a.height == b.height;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
inline bool operator != (VkExtent2D a, VkExtent2D b) {
|
|
|
|
return a.width != b.width
|
|
|
|
|| a.height != b.height;
|
|
|
|
}
|
2019-06-13 04:12:23 +02:00
|
|
|
|
|
|
|
|
|
|
|
inline bool operator == (VkOffset3D a, VkOffset3D b) {
|
|
|
|
return a.x == b.x
|
|
|
|
&& a.y == b.y
|
|
|
|
&& a.z == b.z;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
inline bool operator != (VkOffset3D a, VkOffset3D b) {
|
|
|
|
return a.x != b.x
|
|
|
|
|| a.y != b.y
|
|
|
|
|| a.z != b.z;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
inline bool operator == (VkOffset2D a, VkOffset2D b) {
|
|
|
|
return a.x == b.x
|
|
|
|
&& a.y == b.y;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
inline bool operator != (VkOffset2D a, VkOffset2D b) {
|
|
|
|
return a.x != b.x
|
|
|
|
|| a.y != b.y;
|
|
|
|
}
|