Skip to content

Commit eba68b1

Browse files
azhirnovTheMostDiligent
authored andcommitted
Added memoryless textures
1 parent 3ca621c commit eba68b1

File tree

10 files changed

+128
-19
lines changed

10 files changed

+128
-19
lines changed

Graphics/GraphicsAccessories/src/GraphicsAccessories.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,7 @@ const Char* GetBindFlagString(Uint32 BindFlag)
848848
BIND_FLAG_STR_CASE(BIND_DEPTH_STENCIL)
849849
BIND_FLAG_STR_CASE(BIND_UNORDERED_ACCESS)
850850
BIND_FLAG_STR_CASE(BIND_INDIRECT_DRAW_ARGS)
851+
BIND_FLAG_STR_CASE(BIND_INPUT_ATTACHMENT)
851852
BIND_FLAG_STR_CASE(BIND_RAY_TRACING)
852853
#undef BIND_FLAG_STR_CASE
853854
default: UNEXPECTED("Unexpected bind flag ", BindFlag); return "";

Graphics/GraphicsEngine/include/DeviceContextBase.hpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -952,14 +952,15 @@ inline bool DeviceContextBase<ImplementationTraits>::SetRenderTargets(
952952
if (pRTView)
953953
{
954954
const auto& RTVDesc = pRTView->GetDesc();
955+
const auto& TexDesc = pRTView->GetTexture()->GetDesc();
955956
DEV_CHECK_ERR(RTVDesc.ViewType == TEXTURE_VIEW_RENDER_TARGET,
956957
"Texture view object named '", RTVDesc.Name ? RTVDesc.Name : "", "' has incorrect view type (", GetTexViewTypeLiteralName(RTVDesc.ViewType), "). Render target view is expected");
958+
DEV_CHECK_ERR(m_pBoundFramebuffer || (TexDesc.MiscFlags & MISC_TEXTURE_FLAG_MEMORYLESS) == 0,
959+
"Memoryless render target '", TexDesc.Name, "' must be used within a framebuffer");
957960

958961
// Use this RTV to set the render target size
959962
if (m_FramebufferWidth == 0)
960963
{
961-
auto* pTex = pRTView->GetTexture();
962-
const auto& TexDesc = pTex->GetDesc();
963964
m_FramebufferWidth = std::max(TexDesc.Width >> RTVDesc.MostDetailedMip, 1U);
964965
m_FramebufferHeight = std::max(TexDesc.Height >> RTVDesc.MostDetailedMip, 1U);
965966
m_FramebufferSlices = RTVDesc.NumArraySlices;
@@ -968,7 +969,6 @@ inline bool DeviceContextBase<ImplementationTraits>::SetRenderTargets(
968969
else
969970
{
970971
#ifdef DILIGENT_DEVELOPMENT
971-
const auto& TexDesc = pRTView->GetTexture()->GetDesc();
972972
DEV_CHECK_ERR(m_FramebufferWidth == std::max(TexDesc.Width >> RTVDesc.MostDetailedMip, 1U),
973973
"Render target width (", std::max(TexDesc.Width >> RTVDesc.MostDetailedMip, 1U), ") specified by RTV '", RTVDesc.Name, "' is inconsistent with the width of previously bound render targets (", m_FramebufferWidth, ")");
974974
DEV_CHECK_ERR(m_FramebufferHeight == std::max(TexDesc.Height >> RTVDesc.MostDetailedMip, 1U),
@@ -994,14 +994,15 @@ inline bool DeviceContextBase<ImplementationTraits>::SetRenderTargets(
994994
if (pDepthStencil != nullptr)
995995
{
996996
const auto& DSVDesc = pDepthStencil->GetDesc();
997+
const auto& TexDesc = pDepthStencil->GetTexture()->GetDesc();
997998
DEV_CHECK_ERR(DSVDesc.ViewType == TEXTURE_VIEW_DEPTH_STENCIL,
998999
"Texture view object named '", DSVDesc.Name ? DSVDesc.Name : "", "' has incorrect view type (", GetTexViewTypeLiteralName(DSVDesc.ViewType), "). Depth stencil view is expected");
1000+
DEV_CHECK_ERR(m_pBoundFramebuffer || (TexDesc.MiscFlags & MISC_TEXTURE_FLAG_MEMORYLESS) == 0,
1001+
"Memoryless depth buffer '", TexDesc.Name, "' must be used within a framebuffer");
9991002

10001003
// Use depth stencil size to set render target size
10011004
if (m_FramebufferWidth == 0)
10021005
{
1003-
auto* pTex = pDepthStencil->GetTexture();
1004-
const auto& TexDesc = pTex->GetDesc();
10051006
m_FramebufferWidth = std::max(TexDesc.Width >> DSVDesc.MostDetailedMip, 1U);
10061007
m_FramebufferHeight = std::max(TexDesc.Height >> DSVDesc.MostDetailedMip, 1U);
10071008
m_FramebufferSlices = DSVDesc.NumArraySlices;
@@ -1010,7 +1011,6 @@ inline bool DeviceContextBase<ImplementationTraits>::SetRenderTargets(
10101011
else
10111012
{
10121013
#ifdef DILIGENT_DEVELOPMENT
1013-
const auto& TexDesc = pDepthStencil->GetTexture()->GetDesc();
10141014
DEV_CHECK_ERR(m_FramebufferWidth == std::max(TexDesc.Width >> DSVDesc.MostDetailedMip, 1U),
10151015
"Depth-stencil target width (", std::max(TexDesc.Width >> DSVDesc.MostDetailedMip, 1U), ") specified by DSV '", DSVDesc.Name, "' is inconsistent with the width of previously bound render targets (", m_FramebufferWidth, ")");
10161016
DEV_CHECK_ERR(m_FramebufferHeight == std::max(TexDesc.Height >> DSVDesc.MostDetailedMip, 1U),
@@ -2136,6 +2136,7 @@ inline void DeviceContextBase<ImplementationTraits>::DvpVerifyRenderTargets() co
21362136
const auto& TilePipeline = m_pPipelineState->GetTilePipelineDesc();
21372137
NumPipelineRenderTargets = TilePipeline.NumRenderTargets;
21382138
PipelineRTVFormats = TilePipeline.RTVFormats;
2139+
PipelineDSVFormat = BoundDSVFormat; // to disable warning
21392140
}
21402141
else
21412142
{

Graphics/GraphicsEngine/include/TextureBase.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ namespace Diligent
4545
struct CopyTextureAttribs;
4646

4747
/// Validates texture description and throws an exception in case of an error.
48-
void ValidateTextureDesc(const TextureDesc& TexDesc) noexcept(false);
48+
void ValidateTextureDesc(const TextureDesc& TexDesc, const IRenderDevice* pDevice) noexcept(false);
4949

5050
/// Validates and corrects texture view description; throws an exception in case of an error.
5151
void ValidatedAndCorrectTextureViewDesc(const TextureDesc& TexDesc, TextureViewDesc& ViewDesc) noexcept(false);
@@ -137,11 +137,11 @@ class TextureBase : public DeviceObjectBase<typename EngineImplTraits::TextureIn
137137
") correspond to one of ", pDevice->GetCommandQueueCount(), " available software command queues");
138138
this->m_Desc.ImmediateContextMask &= DeviceQueuesMask;
139139

140+
// Validate correctness of texture description
141+
ValidateTextureDesc(this->m_Desc, this->m_pDevice);
142+
140143
if ((this->m_Desc.BindFlags & BIND_INPUT_ATTACHMENT) != 0)
141144
this->m_Desc.BindFlags |= BIND_SHADER_RESOURCE;
142-
143-
// Validate correctness of texture description
144-
ValidateTextureDesc(this->m_Desc);
145145
}
146146

147147
IMPLEMENT_QUERY_INTERFACE_IN_PLACE(IID_Texture, TDeviceObjectBase)

Graphics/GraphicsEngine/interface/GraphicsTypes.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -981,7 +981,13 @@ DILIGENT_TYPED_ENUM(MISC_TEXTURE_FLAGS, Uint8)
981981
/// Allow automatic mipmap generation with ITextureView::GenerateMips()
982982

983983
/// \note A texture must be created with BIND_RENDER_TARGET bind flag
984-
MISC_TEXTURE_FLAG_GENERATE_MIPS = 0x01
984+
MISC_TEXTURE_FLAG_GENERATE_MIPS = 0x01,
985+
986+
/// The texture will be used as a transient framebuffer attachment.
987+
988+
/// \note Memoryless textures must only be used within a render passes in a framebuffer,
989+
/// load operation must be CLEAR or DISCARD, store operation must be DISCARD.
990+
MISC_TEXTURE_FLAG_MEMORYLESS = 0x02,
985991
};
986992
DEFINE_FLAG_ENUM_OPERATORS(MISC_TEXTURE_FLAGS)
987993

@@ -2213,6 +2219,10 @@ struct AdapterMemoryInfo
22132219

22142220
/// Supported access types for the unified memory.
22152221
CPU_ACCESS_FLAGS UnifiedMemoryCPUAccess DEFAULT_INITIALIZER(CPU_ACCESS_NONE);
2222+
2223+
/// Indicates if device supports color and depth attachments in on-chip memory.
2224+
/// If supported, it will be combination of the following flags: BIND_RENDER_TARGET, BIND_DEPTH_STENCIL, BIND_INPUT_ATTACHMENT.
2225+
BIND_FLAGS MemorylessTextureBindFlags DEFAULT_INITIALIZER(BIND_NONE);
22162226
};
22172227
typedef struct AdapterMemoryInfo AdapterMemoryInfo;
22182228

Graphics/GraphicsEngine/src/FramebufferBase.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,22 @@ void ValidateFramebufferDesc(const FramebufferDesc& Desc) noexcept(false)
9999
" does not match the sample count (", Uint32{AttDesc.SampleCount},
100100
") defined by the render pass for the same attachment.");
101101
}
102+
103+
if ((TexDesc.MiscFlags & MISC_TEXTURE_FLAG_MEMORYLESS) != 0)
104+
{
105+
const bool HasStencilComponent = GetTextureFormatAttribs(AttDesc.Format).ComponentType == COMPONENT_TYPE_DEPTH_STENCIL;
106+
107+
if (AttDesc.LoadOp == ATTACHMENT_LOAD_OP_LOAD ||
108+
(HasStencilComponent && AttDesc.StencilLoadOp == ATTACHMENT_LOAD_OP_LOAD))
109+
{
110+
LOG_FRAMEBUFFER_ERROR_AND_THROW("memoryless attachment ", i, " is not compatible with ATTACHMENT_LOAD_OP_LOAD");
111+
}
112+
if (AttDesc.StoreOp == ATTACHMENT_STORE_OP_STORE ||
113+
(HasStencilComponent && AttDesc.StencilStoreOp == ATTACHMENT_STORE_OP_STORE))
114+
{
115+
LOG_FRAMEBUFFER_ERROR_AND_THROW("memoryless attachment ", i, " is not compatible with ATTACHMENT_STORE_OP_STORE");
116+
}
117+
}
102118
}
103119

104120
for (Uint32 i = 0; i < RPDesc.SubpassCount; ++i)

Graphics/GraphicsEngine/src/TextureBase.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,12 @@
3535
namespace Diligent
3636
{
3737

38-
void ValidateTextureDesc(const TextureDesc& Desc) noexcept(false)
38+
void ValidateTextureDesc(const TextureDesc& Desc, const IRenderDevice* pDevice) noexcept(false)
3939
{
4040
#define LOG_TEXTURE_ERROR_AND_THROW(...) LOG_ERROR_AND_THROW("Texture '", (Desc.Name ? Desc.Name : ""), "': ", ##__VA_ARGS__)
4141

4242
const auto& FmtAttribs = GetTextureFormatAttribs(Desc.Format);
43+
const auto& MemInfo = pDevice->GetAdapterInfo().Memory;
4344

4445
if (Desc.Type == RESOURCE_DIM_UNDEFINED)
4546
{
@@ -130,6 +131,24 @@ void ValidateTextureDesc(const TextureDesc& Desc) noexcept(false)
130131
"Use UNORM format instead.");
131132
}
132133

134+
if (Desc.MiscFlags & MISC_TEXTURE_FLAG_MEMORYLESS)
135+
{
136+
if (MemInfo.MemorylessTextureBindFlags == BIND_NONE)
137+
LOG_TEXTURE_ERROR_AND_THROW("Memoryless textures are not supported by device");
138+
139+
if ((Desc.BindFlags & MemInfo.MemorylessTextureBindFlags) != Desc.BindFlags)
140+
LOG_TEXTURE_ERROR_AND_THROW("BindFlags ", GetBindFlagsString(Desc.BindFlags & ~MemInfo.MemorylessTextureBindFlags), " are not supported for memoryless textures.");
141+
142+
if (Desc.Usage != USAGE_DEFAULT)
143+
LOG_TEXTURE_ERROR_AND_THROW("Memoryless attachment requires USAGE_DEFAULT.");
144+
145+
if (Desc.CPUAccessFlags != 0)
146+
LOG_TEXTURE_ERROR_AND_THROW("Memoryless attachment requires CPUAccessFlags to be NONE.");
147+
148+
if (Desc.MiscFlags & MISC_TEXTURE_FLAG_GENERATE_MIPS)
149+
LOG_TEXTURE_ERROR_AND_THROW("Memoryless attachment is not compatible with mipmap generation.");
150+
}
151+
133152
if (Desc.Usage == USAGE_STAGING)
134153
{
135154
if (Desc.BindFlags != 0)

Graphics/GraphicsEngineVulkan/src/EngineFactoryVk.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,11 @@ GraphicsAdapterInfo GetPhysicalDeviceGraphicsAdapterInfo(const VulkanUtilities::
287287
const auto& MemTypeInfo = MemoryProps.memoryTypes[type];
288288
constexpr auto UnifiedMemoryFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
289289

290-
if ((MemTypeInfo.propertyFlags & UnifiedMemoryFlags) == UnifiedMemoryFlags)
290+
if (MemTypeInfo.propertyFlags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)
291+
{
292+
Mem.MemorylessTextureBindFlags = BIND_RENDER_TARGET | BIND_DEPTH_STENCIL | BIND_INPUT_ATTACHMENT;
293+
}
294+
else if ((MemTypeInfo.propertyFlags & UnifiedMemoryFlags) == UnifiedMemoryFlags)
291295
{
292296
UnifiedHeap[MemTypeInfo.heapIndex] = true;
293297
if (MemTypeInfo.propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
@@ -303,6 +307,13 @@ GraphicsAdapterInfo GetPhysicalDeviceGraphicsAdapterInfo(const VulkanUtilities::
303307
{
304308
HostVisibleHeap[MemTypeInfo.heapIndex] = true;
305309
}
310+
311+
// In Metal, input attachment with memoryless texture must be used as an imageblock,
312+
// which is not supported in SPIRV to MSL translator.
313+
#if PLATFORM_MACOS || PLATFORM_IOS
314+
if (Mem.MemorylessTextureBindFlags != 0)
315+
Mem.MemorylessTextureBindFlags = BIND_RENDER_TARGET | BIND_DEPTH_STENCIL;
316+
#endif
306317
}
307318

308319
for (uint32_t heap = 0; heap < MemoryProps.memoryHeapCount; ++heap)

Graphics/GraphicsEngineVulkan/src/TextureVkImpl.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ TextureVkImpl::TextureVkImpl(IReferenceCounters* pRefCounters,
5656
if (m_Desc.Usage == USAGE_IMMUTABLE && (pInitData == nullptr || pInitData->pSubResources == nullptr))
5757
LOG_ERROR_AND_THROW("Immutable textures must be initialized with data at creation time: pInitData can't be null");
5858

59+
const auto IsMemoryless = (m_Desc.MiscFlags & MISC_TEXTURE_FLAG_MEMORYLESS) != 0;
60+
if (IsMemoryless && pInitData != nullptr && pInitData->pSubResources != nullptr)
61+
LOG_ERROR_AND_THROW("Memoryless textures can't be initialized");
62+
5963
const auto& FmtAttribs = GetTextureFormatAttribs(m_Desc.Format);
6064
const auto& LogicalDevice = pRenderDeviceVk->GetLogicalDevice();
6165

@@ -156,6 +160,7 @@ TextureVkImpl::TextureVkImpl(IReferenceCounters* pRefCounters,
156160

157161
if (m_Desc.MiscFlags & MISC_TEXTURE_FLAG_GENERATE_MIPS)
158162
{
163+
VERIFY_EXPR(!IsMemoryless);
159164
if (CheckCSBasedMipGenerationSupport(ImageCI.format) && ImageView2DSupported)
160165
{
161166
ImageCI.usage |= VK_IMAGE_USAGE_STORAGE_BIT;
@@ -199,11 +204,17 @@ TextureVkImpl::TextureVkImpl(IReferenceCounters* pRefCounters,
199204
// and the transition away from this layout is not guaranteed to preserve that data.
200205
ImageCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
201206

207+
if (IsMemoryless)
208+
{
209+
ImageCI.usage &= (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT);
210+
ImageCI.usage |= VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT;
211+
}
212+
202213
m_VulkanImage = LogicalDevice.CreateImage(ImageCI, m_Desc.Name);
203214

204215
VkMemoryRequirements MemReqs = LogicalDevice.GetImageMemoryRequirements(m_VulkanImage);
205216

206-
constexpr auto ImageMemoryFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
217+
const auto ImageMemoryFlags = IsMemoryless ? VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT : VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
207218
VERIFY(IsPowerOfTwo(MemReqs.alignment), "Alignment is not power of 2!");
208219
m_MemoryAllocation = pRenderDeviceVk->AllocateMemory(MemReqs, ImageMemoryFlags);
209220
auto AlignedOffset = AlignUp(m_MemoryAllocation.UnalignedOffset, MemReqs.alignment);

Graphics/GraphicsEngineVulkan/src/VulkanTypeConversions.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1968,6 +1968,14 @@ DeviceFeatures VkFeaturesToDeviceFeatures(uint32_t
19681968
INIT_FEATURE(TileShaders, false); // Not currently supported
19691969
#undef INIT_FEATURE
19701970

1971+
// Not supported in Vulkan on top of Metal.
1972+
#if PLATFORM_MACOS || PLATFORM_IOS
1973+
Features.BinaryOcclusionQueries = DEVICE_FEATURE_STATE_DISABLED;
1974+
Features.TimestampQueries = DEVICE_FEATURE_STATE_DISABLED;
1975+
Features.DurationQueries = DEVICE_FEATURE_STATE_DISABLED;
1976+
Features.OcclusionQueries = DEVICE_FEATURE_STATE_DISABLED;
1977+
#endif
1978+
19711979
#if defined(_MSC_VER) && defined(_WIN64)
19721980
static_assert(sizeof(DeviceFeatures) == 37, "Did you add a new feature to DeviceFeatures? Please handle its satus here (if necessary).");
19731981
#endif

Tests/DiligentCoreAPITest/src/RenderPassTest.cpp

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,8 @@ class RenderPassTest : public ::testing::Test
180180
pContext->EndRenderPass();
181181
}
182182

183-
static void TestInputAttachment(bool UseSignature);
183+
static void TestMSResolve(bool UseMemoryless);
184+
static void TestInputAttachment(bool UseSignature, bool UseMemoryless);
184185

185186
static void Present()
186187
{
@@ -551,7 +552,7 @@ TEST_F(RenderPassTest, Draw)
551552
Present();
552553
}
553554

554-
TEST_F(RenderPassTest, MSResolve)
555+
void RenderPassTest::TestMSResolve(bool UseMemoryless)
555556
{
556557
auto* pEnv = TestingEnvironment::GetInstance();
557558
auto* pDevice = pEnv->GetDevice();
@@ -638,6 +639,7 @@ TEST_F(RenderPassTest, MSResolve)
638639
TexDesc.MipLevels = 1;
639640
TexDesc.SampleCount = Attachments[0].SampleCount;
640641
TexDesc.Usage = USAGE_DEFAULT;
642+
TexDesc.MiscFlags = UseMemoryless ? MISC_TEXTURE_FLAG_MEMORYLESS : MISC_TEXTURE_FLAG_NONE;
641643

642644
pDevice->CreateTexture(TexDesc, nullptr, &pMSTex);
643645
ASSERT_NE(pMSTex, nullptr);
@@ -694,7 +696,24 @@ TEST_F(RenderPassTest, MSResolve)
694696
Present();
695697
}
696698

697-
void RenderPassTest::TestInputAttachment(bool UseSignature)
699+
TEST_F(RenderPassTest, MSResolve)
700+
{
701+
TestMSResolve(false);
702+
}
703+
704+
TEST_F(RenderPassTest, MemorylessMSResolve)
705+
{
706+
const auto RequiredBindFlags = BIND_RENDER_TARGET;
707+
const auto& MemoryInfo = TestingEnvironment::GetInstance()->GetDevice()->GetAdapterInfo().Memory;
708+
709+
if ((MemoryInfo.MemorylessTextureBindFlags & RequiredBindFlags) != RequiredBindFlags)
710+
{
711+
GTEST_SKIP() << "Memoryless attachment is not supported by device";
712+
}
713+
TestMSResolve(true);
714+
}
715+
716+
void RenderPassTest::TestInputAttachment(bool UseSignature, bool UseMemoryless)
698717
{
699718
auto* pEnv = TestingEnvironment::GetInstance();
700719
auto* pDevice = pEnv->GetDevice();
@@ -781,6 +800,7 @@ void RenderPassTest::TestInputAttachment(bool UseSignature)
781800
TexDesc.BindFlags = BIND_RENDER_TARGET | BIND_INPUT_ATTACHMENT;
782801
TexDesc.MipLevels = 1;
783802
TexDesc.Usage = USAGE_DEFAULT;
803+
TexDesc.MiscFlags = UseMemoryless ? MISC_TEXTURE_FLAG_MEMORYLESS : MISC_TEXTURE_FLAG_NONE;
784804

785805
pDevice->CreateTexture(TexDesc, nullptr, &pTex);
786806
ASSERT_NE(pTex, nullptr);
@@ -979,12 +999,24 @@ void RenderPassTest::TestInputAttachment(bool UseSignature)
979999

9801000
TEST_F(RenderPassTest, InputAttachment)
9811001
{
982-
TestInputAttachment(false);
1002+
TestInputAttachment(false, false);
9831003
}
9841004

9851005
TEST_F(RenderPassTest, InputAttachmentWithSignature)
9861006
{
987-
TestInputAttachment(true);
1007+
TestInputAttachment(true, false);
1008+
}
1009+
1010+
TEST_F(RenderPassTest, MemorylessInputAttachment)
1011+
{
1012+
const auto RequiredBindFlags = BIND_RENDER_TARGET | BIND_INPUT_ATTACHMENT;
1013+
const auto& MemoryInfo = TestingEnvironment::GetInstance()->GetDevice()->GetAdapterInfo().Memory;
1014+
1015+
if ((MemoryInfo.MemorylessTextureBindFlags & RequiredBindFlags) != RequiredBindFlags)
1016+
{
1017+
GTEST_SKIP() << "Memoryless attachment is not supported by device";
1018+
}
1019+
TestInputAttachment(false, true);
9881020
}
9891021

9901022

0 commit comments

Comments
 (0)