Skip to content

Commit ae92adc

Browse files
committed
Merged internal pull request !66 (Moved sampler feedback to core API to avoid D3D12-specific code blocks)
2 parents d843b8e + bef633f commit ae92adc

13 files changed

+166
-8
lines changed

include/nvrhi/d3d12.h

-6
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,6 @@ namespace nvrhi::d3d12
5656

5757
virtual void updateGraphicsVolatileBuffers() = 0;
5858
virtual void updateComputeVolatileBuffers() = 0;
59-
60-
virtual void clearSamplerFeedbackTexture(ISamplerFeedbackTexture* texture) = 0;
61-
virtual void decodeSamplerFeedbackTexture(IBuffer* buffer, ISamplerFeedbackTexture* texture, nvrhi::Format format) = 0;
62-
virtual void setSamplerFeedbackTextureState(ISamplerFeedbackTexture* texture, ResourceStates stateBits) = 0;
6359
};
6460

6561
typedef RefCountPtr<ICommandList> CommandListHandle;
@@ -104,8 +100,6 @@ namespace nvrhi::d3d12
104100
virtual GraphicsPipelineHandle createHandleForNativeGraphicsPipeline(IRootSignature* rootSignature, ID3D12PipelineState* pipelineState, const GraphicsPipelineDesc& desc, const FramebufferInfo& framebufferInfo) = 0;
105101
virtual MeshletPipelineHandle createHandleForNativeMeshletPipeline(IRootSignature* rootSignature, ID3D12PipelineState* pipelineState, const MeshletPipelineDesc& desc, const FramebufferInfo& framebufferInfo) = 0;
106102
[[nodiscard]] virtual IDescriptorHeap* getDescriptorHeap(DescriptorHeapType heapType) = 0;
107-
virtual SamplerFeedbackTextureHandle createSamplerFeedbackTexture(ITexture* pairedTexture, const SamplerFeedbackTextureDesc& desc) = 0;
108-
virtual SamplerFeedbackTextureHandle createSamplerFeedbackForNativeTexture(ObjectType objectType, Object texture, ITexture* pairedTexture) = 0;
109103
};
110104

111105
typedef RefCountPtr<IDevice> DeviceHandle;

include/nvrhi/nvrhi.h

+9-1
Original file line numberDiff line numberDiff line change
@@ -2773,7 +2773,8 @@ namespace nvrhi
27732773
ComputeQueue,
27742774
CopyQueue,
27752775
ConstantBufferRanges,
2776-
HeapDirectlyIndexed
2776+
HeapDirectlyIndexed,
2777+
SamplerFeedback
27772778
};
27782779

27792780
enum class MessageSeverity : uint8_t
@@ -2871,6 +2872,10 @@ namespace nvrhi
28712872
virtual void clearBufferUInt(IBuffer* b, uint32_t clearValue) = 0;
28722873
virtual void copyBuffer(IBuffer* dest, uint64_t destOffsetBytes, IBuffer* src, uint64_t srcOffsetBytes, uint64_t dataSizeBytes) = 0;
28732874

2875+
virtual void clearSamplerFeedbackTexture(ISamplerFeedbackTexture* texture) = 0;
2876+
virtual void decodeSamplerFeedbackTexture(IBuffer* buffer, ISamplerFeedbackTexture* texture, nvrhi::Format format) = 0;
2877+
virtual void setSamplerFeedbackTextureState(ISamplerFeedbackTexture* texture, ResourceStates stateBits) = 0;
2878+
28742879
// Sets the push constants block on the command list, aka "root constants" on DX12.
28752880
// Only valid after setGraphicsState or setComputeState etc.
28762881
virtual void setPushConstants(const void* data, size_t byteSize) = 0;
@@ -2981,6 +2986,9 @@ namespace nvrhi
29812986
virtual void getTextureTiling(ITexture* texture, uint32_t* numTiles, PackedMipDesc* desc, TileShape* tileShape, uint32_t* subresourceTilingsNum, SubresourceTiling* subresourceTilings) = 0;
29822987
virtual void updateTextureTileMappings(ITexture* texture, const TextureTilesMapping* tileMappings, uint32_t numTileMappings, CommandQueue executionQueue = CommandQueue::Graphics) = 0;
29832988

2989+
virtual SamplerFeedbackTextureHandle createSamplerFeedbackTexture(ITexture* pairedTexture, const SamplerFeedbackTextureDesc& desc) = 0;
2990+
virtual SamplerFeedbackTextureHandle createSamplerFeedbackForNativeTexture(ObjectType objectType, Object texture, ITexture* pairedTexture) = 0;
2991+
29842992
virtual BufferHandle createBuffer(const BufferDesc& d) = 0;
29852993
virtual void* mapBuffer(IBuffer* buffer, CpuAccessMode cpuAccess) = 0;
29862994
virtual void unmapBuffer(IBuffer* buffer) = 0;

src/d3d11/d3d11-backend.h

+6
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,9 @@ namespace nvrhi::d3d11
302302
void clearTextureFloat(ITexture* t, TextureSubresourceSet subresources, const Color& clearColor) override;
303303
void clearDepthStencilTexture(ITexture* t, TextureSubresourceSet subresources, bool clearDepth, float depth, bool clearStencil, uint8_t stencil) override;
304304
void clearTextureUInt(ITexture* t, TextureSubresourceSet subresources, uint32_t clearColor) override;
305+
void clearSamplerFeedbackTexture(ISamplerFeedbackTexture* texture) override;
306+
void decodeSamplerFeedbackTexture(IBuffer* buffer, ISamplerFeedbackTexture* texture, Format format) override;
307+
void setSamplerFeedbackTextureState(ISamplerFeedbackTexture* texture, ResourceStates stateBits) override;
305308

306309
void copyTexture(ITexture* dest, const TextureSlice& destSlice, ITexture* src, const TextureSlice& srcSlice) override;
307310
void copyTexture(IStagingTexture* dest, const TextureSlice& destSlice, ITexture* src, const TextureSlice& srcSlice) override;
@@ -448,6 +451,9 @@ namespace nvrhi::d3d11
448451
void getTextureTiling(ITexture* texture, uint32_t* numTiles, PackedMipDesc* desc, TileShape* tileShape, uint32_t* subresourceTilingsNum, SubresourceTiling* subresourceTilings) override;
449452
void updateTextureTileMappings(ITexture* texture, const TextureTilesMapping* tileMappings, uint32_t numTileMappings, CommandQueue executionQueue = CommandQueue::Graphics) override;
450453

454+
SamplerFeedbackTextureHandle createSamplerFeedbackTexture(ITexture* pairedTexture, const SamplerFeedbackTextureDesc& desc) override;
455+
SamplerFeedbackTextureHandle createSamplerFeedbackForNativeTexture(ObjectType objectType, Object texture, ITexture* pairedTexture) override;
456+
451457
BufferHandle createBuffer(const BufferDesc& d) override;
452458
void *mapBuffer(IBuffer* b, CpuAccessMode mapFlags) override;
453459
void unmapBuffer(IBuffer* b) override;

src/d3d11/d3d11-device.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,27 @@ namespace nvrhi::d3d11
194194
utils::NotSupported();
195195
}
196196

197+
SamplerFeedbackTextureHandle Device::createSamplerFeedbackTexture(ITexture* pairedTexture, const SamplerFeedbackTextureDesc& desc)
198+
{
199+
(void)pairedTexture;
200+
(void)desc;
201+
202+
utils::NotSupported();
203+
204+
return nullptr;
205+
}
206+
207+
SamplerFeedbackTextureHandle Device::createSamplerFeedbackForNativeTexture(ObjectType objectType, Object texture, ITexture* pairedTexture)
208+
{
209+
(void)objectType;
210+
(void)texture;
211+
(void)pairedTexture;
212+
213+
utils::NotSupported();
214+
215+
return nullptr;
216+
}
217+
197218
bool Device::queryFeatureSupport(Feature feature, void* pInfo, size_t infoSize)
198219
{
199220
(void)pInfo;

src/d3d11/d3d11-texture.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,30 @@ namespace nvrhi::d3d11
372372
}
373373
}
374374

375+
void CommandList::clearSamplerFeedbackTexture(ISamplerFeedbackTexture* texture)
376+
{
377+
(void)texture;
378+
379+
utils::NotSupported();
380+
}
381+
382+
void CommandList::decodeSamplerFeedbackTexture(IBuffer* buffer, ISamplerFeedbackTexture* texture, nvrhi::Format format)
383+
{
384+
(void)buffer;
385+
(void)texture;
386+
(void)format;
387+
388+
utils::NotSupported();
389+
}
390+
391+
void CommandList::setSamplerFeedbackTextureState(ISamplerFeedbackTexture* texture, ResourceStates stateBits)
392+
{
393+
(void)texture;
394+
(void)stateBits;
395+
396+
utils::NotSupported();
397+
}
398+
375399
void CommandList::copyTexture(ID3D11Resource *dst, const TextureDesc& dstDesc, const TextureSlice& dstSlice,
376400
ID3D11Resource *src, const TextureDesc& srcDesc, const TextureSlice& srcSlice)
377401
{

src/d3d12/d3d12-buffer.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ namespace nvrhi::d3d12
135135
heapProps.Type = D3D12_HEAP_TYPE_CUSTOM;
136136
heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_WRITE_BACK;
137137
heapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_L0;
138-
initialState = D3D12_RESOURCE_STATE_RESOLVE_DEST;
138+
initialState = D3D12_RESOURCE_STATE_COMMON;
139139
}
140140

141141
HRESULT res = m_Context.device->CreateCommittedResource(

src/d3d12/d3d12-device.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,8 @@ namespace nvrhi::d3d12
625625
return true;
626626
case Feature::HeapDirectlyIndexed:
627627
return m_HeapDirectlyIndexedEnabled;
628+
case Feature::SamplerFeedback:
629+
return m_SamplerFeedbackSupported;
628630
default:
629631
return false;
630632
}

src/validation/validation-backend.h

+7
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ namespace nvrhi::validation
164164
void clearBufferUInt(IBuffer* b, uint32_t clearValue) override;
165165
void copyBuffer(IBuffer* dest, uint64_t destOffsetBytes, IBuffer* src, uint64_t srcOffsetBytes, uint64_t dataSizeBytes) override;
166166

167+
void clearSamplerFeedbackTexture(ISamplerFeedbackTexture* texture) override;
168+
void decodeSamplerFeedbackTexture(IBuffer* buffer, ISamplerFeedbackTexture* texture, nvrhi::Format format) override;
169+
void setSamplerFeedbackTextureState(ISamplerFeedbackTexture* texture, ResourceStates stateBits) override;
170+
167171
void setPushConstants(const void* data, size_t byteSize) override;
168172

169173
void setGraphicsState(const GraphicsState& state) override;
@@ -265,6 +269,9 @@ namespace nvrhi::validation
265269
void getTextureTiling(ITexture* texture, uint32_t* numTiles, PackedMipDesc* desc, TileShape* tileShape, uint32_t* subresourceTilingsNum, SubresourceTiling* subresourceTilings) override;
266270
void updateTextureTileMappings(ITexture* texture, const TextureTilesMapping* tileMappings, uint32_t numTileMappings, CommandQueue executionQueue = CommandQueue::Graphics) override;
267271

272+
SamplerFeedbackTextureHandle createSamplerFeedbackTexture(ITexture* pairedTexture, const SamplerFeedbackTextureDesc& desc) override;
273+
SamplerFeedbackTextureHandle createSamplerFeedbackForNativeTexture(ObjectType objectType, Object texture, ITexture* pairedTexture) override;
274+
268275
BufferHandle createBuffer(const BufferDesc& d) override;
269276
void *mapBuffer(IBuffer* b, CpuAccessMode mapFlags) override;
270277
void unmapBuffer(IBuffer* b) override;

src/validation/validation-commandlist.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,21 @@ namespace nvrhi::validation
467467
m_CommandList->copyBuffer(dest, destOffsetBytes, src, srcOffsetBytes, dataSizeBytes);
468468
}
469469

470+
void CommandListWrapper::clearSamplerFeedbackTexture(ISamplerFeedbackTexture* texture)
471+
{
472+
m_CommandList->clearSamplerFeedbackTexture(texture);
473+
}
474+
475+
void CommandListWrapper::decodeSamplerFeedbackTexture(IBuffer* buffer, ISamplerFeedbackTexture* texture, nvrhi::Format format)
476+
{
477+
m_CommandList->decodeSamplerFeedbackTexture(buffer, texture, format);
478+
}
479+
480+
void CommandListWrapper::setSamplerFeedbackTextureState(ISamplerFeedbackTexture* texture, ResourceStates stateBits)
481+
{
482+
m_CommandList->setSamplerFeedbackTextureState(texture, stateBits);
483+
}
484+
470485
bool CommandListWrapper::validateBindingSetsAgainstLayouts(const static_vector<BindingLayoutHandle, c_MaxBindingLayouts>& layouts, const static_vector<IBindingSet*, c_MaxBindingLayouts>& sets) const
471486
{
472487
if (layouts.size() != sets.size())

src/validation/validation-device.cpp

+30
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,36 @@ namespace nvrhi::validation
251251
m_Device->updateTextureTileMappings(texture, tileMappings, numTileMappings, executionQueue);
252252
}
253253

254+
SamplerFeedbackTextureHandle DeviceWrapper::createSamplerFeedbackTexture(ITexture* pairedTexture, const SamplerFeedbackTextureDesc& desc)
255+
{
256+
const GraphicsAPI graphicsApi = m_Device->getGraphicsAPI();
257+
if (graphicsApi != GraphicsAPI::D3D12)
258+
{
259+
std::stringstream ss;
260+
ss << "The current graphics API (" << utils::GraphicsAPIToString(m_Device->getGraphicsAPI()) << ") "
261+
"doesn't support createSamplerFeedbackTexture";
262+
error(ss.str());
263+
return nullptr;
264+
}
265+
266+
return m_Device->createSamplerFeedbackTexture(pairedTexture, desc);
267+
}
268+
269+
SamplerFeedbackTextureHandle DeviceWrapper::createSamplerFeedbackForNativeTexture(ObjectType objectType, Object texture, ITexture* pairedTexture)
270+
{
271+
const GraphicsAPI graphicsApi = m_Device->getGraphicsAPI();
272+
if (graphicsApi != GraphicsAPI::D3D12)
273+
{
274+
std::stringstream ss;
275+
ss << "The current graphics API (" << utils::GraphicsAPIToString(m_Device->getGraphicsAPI()) << ") "
276+
"doesn't support createSamplerFeedbackForNativeTexture";
277+
error(ss.str());
278+
return nullptr;
279+
}
280+
281+
return createSamplerFeedbackForNativeTexture(objectType, texture, pairedTexture);
282+
}
283+
254284
MemoryRequirements DeviceWrapper::getTextureMemoryRequirements(ITexture* texture)
255285
{
256286
if (texture == nullptr)

src/vulkan/vulkan-backend.h

+6
Original file line numberDiff line numberDiff line change
@@ -1087,6 +1087,9 @@ namespace nvrhi::vulkan
10871087
void getTextureTiling(ITexture* texture, uint32_t* numTiles, PackedMipDesc* desc, TileShape* tileShape, uint32_t* subresourceTilingsNum, SubresourceTiling* subresourceTilings) override;
10881088
void updateTextureTileMappings(ITexture* texture, const TextureTilesMapping* tileMappings, uint32_t numTileMappings, CommandQueue executionQueue = CommandQueue::Graphics) override;
10891089

1090+
SamplerFeedbackTextureHandle createSamplerFeedbackTexture(ITexture* pairedTexture, const SamplerFeedbackTextureDesc& desc) override;
1091+
SamplerFeedbackTextureHandle createSamplerFeedbackForNativeTexture(ObjectType objectType, Object texture, ITexture* pairedTexture) override;
1092+
10901093
BufferHandle createBuffer(const BufferDesc& d) override;
10911094
void *mapBuffer(IBuffer* b, CpuAccessMode mapFlags) override;
10921095
void unmapBuffer(IBuffer* b) override;
@@ -1203,6 +1206,9 @@ namespace nvrhi::vulkan
12031206
void clearTextureFloat(ITexture* texture, TextureSubresourceSet subresources, const Color& clearColor) override;
12041207
void clearDepthStencilTexture(ITexture* texture, TextureSubresourceSet subresources, bool clearDepth, float depth, bool clearStencil, uint8_t stencil) override;
12051208
void clearTextureUInt(ITexture* texture, TextureSubresourceSet subresources, uint32_t clearColor) override;
1209+
void clearSamplerFeedbackTexture(ISamplerFeedbackTexture* texture) override;
1210+
void decodeSamplerFeedbackTexture(IBuffer* buffer, ISamplerFeedbackTexture* texture, Format format) override;
1211+
void setSamplerFeedbackTextureState(ISamplerFeedbackTexture* texture, ResourceStates stateBits) override;
12061212

12071213
void copyTexture(ITexture* dest, const TextureSlice& destSlice, ITexture* src, const TextureSlice& srcSlice) override;
12081214
void copyTexture(IStagingTexture* dest, const TextureSlice& dstSlice, ITexture* src, const TextureSlice& srcSlice) override;

src/vulkan/vulkan-device.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,27 @@ namespace nvrhi::vulkan
533533
}
534534
}
535535

536+
SamplerFeedbackTextureHandle Device::createSamplerFeedbackTexture(ITexture* pairedTexture, const SamplerFeedbackTextureDesc& desc)
537+
{
538+
(void)pairedTexture;
539+
(void)desc;
540+
541+
utils::NotSupported();
542+
543+
return nullptr;
544+
}
545+
546+
SamplerFeedbackTextureHandle Device::createSamplerFeedbackForNativeTexture(ObjectType objectType, Object texture, ITexture* pairedTexture)
547+
{
548+
(void)objectType;
549+
(void)texture;
550+
(void)pairedTexture;
551+
552+
utils::NotSupported();
553+
554+
return nullptr;
555+
}
556+
536557
HeapHandle Device::createHeap(const HeapDesc& d)
537558
{
538559
vk::MemoryRequirements memoryRequirements;

src/vulkan/vulkan-texture.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,30 @@ namespace nvrhi::vulkan
669669
clearTexture(texture, subresources, clearValue);
670670
}
671671

672+
void CommandList::clearSamplerFeedbackTexture(ISamplerFeedbackTexture* texture)
673+
{
674+
(void)texture;
675+
676+
utils::NotSupported();
677+
}
678+
679+
void CommandList::decodeSamplerFeedbackTexture(IBuffer* buffer, ISamplerFeedbackTexture* texture, nvrhi::Format format)
680+
{
681+
(void)buffer;
682+
(void)texture;
683+
(void)format;
684+
685+
utils::NotSupported();
686+
}
687+
688+
void CommandList::setSamplerFeedbackTextureState(ISamplerFeedbackTexture* texture, ResourceStates stateBits)
689+
{
690+
(void)texture;
691+
(void)stateBits;
692+
693+
utils::NotSupported();
694+
}
695+
672696
Object Texture::getNativeObject(ObjectType objectType)
673697
{
674698
switch (objectType)

0 commit comments

Comments
 (0)