Skip to content

Commit 75c2fab

Browse files
Sahir VellaniDawn LUCI CQ
authored andcommitted
Create SharedTextureMemory from D3D12 resource
Adds support for creating SharedTextureMemory from a D3D12Resource without the need for a shared handle - through a new SharedTextureMemoryD3D12ResourceDescriptor. Change-Id: Ib9ad171eb1e0892c11dbe1524d7dce792dfdc92c Bug: 425864542 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/268055 Reviewed-by: Rafael Cintron <[email protected]> Commit-Queue: Sahir Vellani <[email protected]> Reviewed-by: Kai Ninomiya <[email protected]>
1 parent 9ec9e3b commit 75c2fab

File tree

14 files changed

+589
-52
lines changed

14 files changed

+589
-52
lines changed

include/dawn/native/D3D12Backend.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,17 @@ struct DAWN_NATIVE_EXPORT SharedBufferMemoryD3D12SharedMemoryFileHandleDescripto
8686
constexpr static uint32_t kRequiredAlignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
8787
};
8888

89+
// May be chained on SharedTextureMemoryDescriptor.
90+
struct DAWN_NATIVE_EXPORT SharedTextureMemoryD3D12ResourceDescriptor : wgpu::ChainedStruct {
91+
SharedTextureMemoryD3D12ResourceDescriptor() {
92+
sType = static_cast<wgpu::SType>(WGPUSType_SharedTextureMemoryD3D12ResourceDescriptor);
93+
}
94+
95+
// This ID3D12Resource object must be created from the same ID3D12Device used in the
96+
// WGPUDevice.
97+
Microsoft::WRL::ComPtr<ID3D12Resource> resource;
98+
};
99+
89100
} // namespace dawn::native::d3d12
90101

91102
#endif // INCLUDE_DAWN_NATIVE_D3D12BACKEND_H_

src/dawn/dawn.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2453,7 +2453,8 @@
24532453
{"value": 57, "name": "dawn device allocator control", "tags": ["dawn"]},
24542454
{"value": 58, "name": "chromium experimental bindless", "tags": ["dawn"]},
24552455
{"value": 59, "name": "adapter properties WGPU", "tags": ["dawn"]},
2456-
{"value": 60, "name": "shared buffer memory D3D12 shared memory file mapping handle", "tags": ["dawn"]}
2456+
{"value": 60, "name": "shared buffer memory D3D12 shared memory file mapping handle", "tags": ["dawn"]},
2457+
{"value": 61, "name": "shared texture memory D3D12 resource", "tags": ["dawn", "native"]}
24572458
]
24582459
},
24592460
"filter mode": {
@@ -3973,7 +3974,9 @@
39733974
{"value": 77, "name": "texel buffer binding layout", "tags": ["dawn"]},
39743975
{"value": 78, "name": "shared texture memory metal end access state", "tags": ["dawn", "native"]},
39753976
{"value": 79, "name": "adapter properties WGPU", "tags": ["dawn"]},
3976-
{"value": 80, "name": "shared buffer memory D3D12 shared memory file mapping handle descriptor", "tags": ["dawn", "native"]}
3977+
{"value": 80, "name": "shared buffer memory D3D12 shared memory file mapping handle descriptor", "tags": ["dawn", "native"]},
3978+
{"value": 81, "name": "shared texture memory D3D12 resource descriptor", "tags": ["dawn", "native"]}
3979+
39773980
]
39783981
},
39793982
"texture": {

src/dawn/native/ChainUtilsImpl.inl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ struct SharedTextureMemoryD3D11Texture2DDescriptor;
4444
namespace d3d12 {
4545
struct SharedBufferMemoryD3D12ResourceDescriptor;
4646
struct SharedBufferMemoryD3D12SharedMemoryFileHandleDescriptor;
47+
struct SharedTextureMemoryD3D12ResourceDescriptor;
4748
}
4849

4950
namespace opengl {
@@ -88,10 +89,15 @@ template <>
8889
constexpr inline wgpu::SType STypeForImpl<d3d11::SharedTextureMemoryD3D11Texture2DDescriptor> =
8990
wgpu::SType(WGPUSType_SharedTextureMemoryD3D11Texture2DDescriptor);
9091

92+
template <>
93+
constexpr inline wgpu::SType STypeForImpl<d3d12::SharedTextureMemoryD3D12ResourceDescriptor> =
94+
wgpu::SType(WGPUSType_SharedTextureMemoryD3D12ResourceDescriptor);
95+
9196
template <>
9297
struct AdditionalExtensions<SharedTextureMemoryDescriptor> {
9398
using List =
94-
AdditionalExtensionsList<const d3d11::SharedTextureMemoryD3D11Texture2DDescriptor*>;
99+
AdditionalExtensionsList<const d3d11::SharedTextureMemoryD3D11Texture2DDescriptor*,
100+
const d3d12::SharedTextureMemoryD3D12ResourceDescriptor*>;
95101
};
96102

97103
template <>

src/dawn/native/Features.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,10 @@ static constexpr FeatureEnumAndInfo kFeatureInfo[] = {
442442
{Feature::SharedBufferMemoryD3D12SharedMemoryFileMappingHandle,
443443
{"Supports importing a shared memory file mapping handle as shared buffer memory.",
444444
"https://dawn.googlesource.com/dawn/+/refs/heads/main/docs/dawn/features/shared_buffer.md",
445+
FeatureInfo::FeatureState::Experimental}},
446+
{Feature::SharedTextureMemoryD3D12Resource,
447+
{"Support importing ID3D12Resource as shared texture memory.",
448+
"https://dawn.googlesource.com/dawn/+/refs/heads/main/docs/dawn/features/shared_texture.md",
445449
FeatureInfo::FeatureState::Experimental}}};
446450

447451
} // anonymous namespace

src/dawn/native/d3d12/DeviceD3D12.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,8 @@ ResultOrError<Ref<SharedTextureMemoryBase>> Device::ImportSharedTextureMemoryImp
491491

492492
wgpu::SType type;
493493
DAWN_TRY_ASSIGN(
494-
type, (unpacked.ValidateBranches<Branch<SharedTextureMemoryDXGISharedHandleDescriptor>>()));
494+
type, (unpacked.ValidateBranches<Branch<SharedTextureMemoryDXGISharedHandleDescriptor>,
495+
Branch<SharedTextureMemoryD3D12ResourceDescriptor>>()));
495496

496497
switch (type) {
497498
case wgpu::SType::SharedTextureMemoryDXGISharedHandleDescriptor:
@@ -501,6 +502,13 @@ ResultOrError<Ref<SharedTextureMemoryBase>> Device::ImportSharedTextureMemoryImp
501502
return SharedTextureMemory::Create(
502503
this, descriptor->label,
503504
unpacked.Get<SharedTextureMemoryDXGISharedHandleDescriptor>());
505+
case wgpu::SType::SharedTextureMemoryD3D12ResourceDescriptor:
506+
DAWN_INVALID_IF(!HasFeature(Feature::SharedTextureMemoryD3D12Resource),
507+
"%s is not enabled.",
508+
wgpu::FeatureName::SharedTextureMemoryD3D12Resource);
509+
return SharedTextureMemory::Create(
510+
this, descriptor->label,
511+
unpacked.Get<SharedTextureMemoryD3D12ResourceDescriptor>());
504512
default:
505513
DAWN_UNREACHABLE();
506514
}

src/dawn/native/d3d12/PhysicalDeviceD3D12.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ void PhysicalDevice::InitializeSupportedFeaturesImpl() {
212212
}
213213

214214
EnableFeature(Feature::SharedTextureMemoryDXGISharedHandle);
215+
EnableFeature(Feature::SharedTextureMemoryD3D12Resource);
215216
EnableFeature(Feature::SharedFenceDXGISharedHandle);
216217

217218
if (SupportsBufferMapExtendedUsages()) {

src/dawn/native/d3d12/SharedTextureMemoryD3D12.cpp

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <utility>
3131

3232
#include "dawn/native/ChainUtils.h"
33+
#include "dawn/native/D3D12Backend.h"
3334
#include "dawn/native/d3d/D3DError.h"
3435
#include "dawn/native/d3d/KeyedMutex.h"
3536
#include "dawn/native/d3d/UtilsD3D.h"
@@ -49,7 +50,35 @@ ResultOrError<Ref<SharedTextureMemory>> SharedTextureMemory::Create(
4950
Ref<d3d::KeyedMutex> keyedMutex;
5051
DAWN_TRY(device->ImportSharedHandleResource(descriptor->handle, descriptor->useKeyedMutex,
5152
d3d12Resource, keyedMutex));
53+
return CreateSharedTextureMemoryFromD3D12Resource(device, label, d3d12Resource, keyedMutex);
54+
}
55+
56+
// static
57+
ResultOrError<Ref<SharedTextureMemory>> SharedTextureMemory::Create(
58+
Device* device,
59+
StringView label,
60+
const SharedTextureMemoryD3D12ResourceDescriptor* descriptor) {
61+
DAWN_INVALID_IF(descriptor->resource == nullptr, "D3D12Resource is missing.");
62+
ComPtr<ID3D12Resource> d3d12Resource = descriptor->resource;
63+
return CreateSharedTextureMemoryFromD3D12Resource(device, label, d3d12Resource, nullptr);
64+
}
65+
66+
SharedTextureMemory::SharedTextureMemory(Device* device,
67+
StringView label,
68+
SharedTextureMemoryProperties properties,
69+
ComPtr<ID3D12Resource> resource,
70+
Ref<d3d::KeyedMutex> keyedMutex)
71+
: d3d::SharedTextureMemory(device, label, properties),
72+
mResource(std::move(resource)),
73+
mKeyedMutex(std::move(keyedMutex)) {}
5274

75+
// static
76+
ResultOrError<Ref<SharedTextureMemory>>
77+
SharedTextureMemory::CreateSharedTextureMemoryFromD3D12Resource(
78+
Device* device,
79+
StringView label,
80+
ComPtr<ID3D12Resource> d3d12Resource,
81+
Ref<d3d::KeyedMutex> keyedMutex) {
5382
D3D12_RESOURCE_DESC desc = d3d12Resource->GetDesc();
5483
DAWN_INVALID_IF(desc.Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE2D,
5584
"Resource dimension (%d) was not Texture2D", desc.Dimension);
@@ -98,15 +127,6 @@ ResultOrError<Ref<SharedTextureMemory>> SharedTextureMemory::Create(
98127
return result;
99128
}
100129

101-
SharedTextureMemory::SharedTextureMemory(Device* device,
102-
StringView label,
103-
SharedTextureMemoryProperties properties,
104-
ComPtr<ID3D12Resource> resource,
105-
Ref<d3d::KeyedMutex> keyedMutex)
106-
: d3d::SharedTextureMemory(device, label, properties),
107-
mResource(std::move(resource)),
108-
mKeyedMutex(std::move(keyedMutex)) {}
109-
110130
void SharedTextureMemory::DestroyImpl() {
111131
ToBackend(GetDevice())->ReferenceUntilUnused(std::move(mResource));
112132
mKeyedMutex = nullptr;

src/dawn/native/d3d12/SharedTextureMemoryD3D12.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class KeyedMutex;
3939

4040
namespace d3d12 {
4141
class Device;
42+
struct SharedTextureMemoryD3D12ResourceDescriptor;
4243

4344
class SharedTextureMemory final : public d3d::SharedTextureMemory {
4445
public:
@@ -47,6 +48,11 @@ class SharedTextureMemory final : public d3d::SharedTextureMemory {
4748
StringView label,
4849
const SharedTextureMemoryDXGISharedHandleDescriptor* descriptor);
4950

51+
static ResultOrError<Ref<SharedTextureMemory>> Create(
52+
Device* device,
53+
StringView label,
54+
const SharedTextureMemoryD3D12ResourceDescriptor* descriptor);
55+
5056
ID3D12Resource* GetD3DResource() const;
5157

5258
d3d::KeyedMutex* GetKeyedMutex() const;
@@ -58,6 +64,12 @@ class SharedTextureMemory final : public d3d::SharedTextureMemory {
5864
ComPtr<ID3D12Resource> resource,
5965
Ref<d3d::KeyedMutex> keyedMutex);
6066

67+
static ResultOrError<Ref<SharedTextureMemory>> CreateSharedTextureMemoryFromD3D12Resource(
68+
Device* device,
69+
StringView label,
70+
ComPtr<ID3D12Resource> d3d12Resource,
71+
Ref<d3d::KeyedMutex> keyedMutex);
72+
6173
void DestroyImpl() override;
6274

6375
ResultOrError<Ref<TextureBase>> CreateTextureImpl(

src/dawn/node/binding/Converter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1752,6 +1752,7 @@ bool Converter::Convert(interop::GPUFeatureName& out, wgpu::FeatureName in) {
17521752
case wgpu::FeatureName::ChromiumExperimentalBindless:
17531753
case wgpu::FeatureName::AdapterPropertiesWGPU:
17541754
case wgpu::FeatureName::SharedBufferMemoryD3D12SharedMemoryFileMappingHandle:
1755+
case wgpu::FeatureName::SharedTextureMemoryD3D12Resource:
17551756
return false;
17561757
}
17571758
return false;

src/dawn/tests/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -834,6 +834,7 @@ source_set("white_box_tests_sources") {
834834
sources += [
835835
"white_box/SharedBufferMemoryTests_win.cpp",
836836
"white_box/SharedTextureMemoryTests_win.cpp",
837+
"white_box/SharedTextureMemoryTests_win_d3d12.cpp",
837838
]
838839
}
839840

0 commit comments

Comments
 (0)