[D3D12] Use typed buffers for texture untiling, calculate guest address once per thread
This commit is contained in:
@@ -63,7 +63,7 @@ ID3D12PipelineState* CreateComputePipeline(
|
||||
return pipeline;
|
||||
}
|
||||
|
||||
void CreateRawBufferSRV(ID3D12Device* device,
|
||||
void CreateBufferRawSRV(ID3D12Device* device,
|
||||
D3D12_CPU_DESCRIPTOR_HANDLE handle,
|
||||
ID3D12Resource* buffer, uint32_t size,
|
||||
uint64_t offset) {
|
||||
@@ -80,7 +80,7 @@ void CreateRawBufferSRV(ID3D12Device* device,
|
||||
device->CreateShaderResourceView(buffer, &desc, handle);
|
||||
}
|
||||
|
||||
void CreateRawBufferUAV(ID3D12Device* device,
|
||||
void CreateBufferRawUAV(ID3D12Device* device,
|
||||
D3D12_CPU_DESCRIPTOR_HANDLE handle,
|
||||
ID3D12Resource* buffer, uint32_t size,
|
||||
uint64_t offset) {
|
||||
@@ -97,6 +97,36 @@ void CreateRawBufferUAV(ID3D12Device* device,
|
||||
device->CreateUnorderedAccessView(buffer, nullptr, &desc, handle);
|
||||
}
|
||||
|
||||
void CreateBufferTypedSRV(ID3D12Device* device,
|
||||
D3D12_CPU_DESCRIPTOR_HANDLE handle,
|
||||
ID3D12Resource* buffer, DXGI_FORMAT format,
|
||||
uint32_t num_elements, uint64_t first_element) {
|
||||
D3D12_SHADER_RESOURCE_VIEW_DESC desc;
|
||||
desc.Format = format;
|
||||
desc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
|
||||
desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
||||
desc.Buffer.FirstElement = first_element;
|
||||
desc.Buffer.NumElements = num_elements;
|
||||
desc.Buffer.StructureByteStride = 0;
|
||||
desc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE;
|
||||
device->CreateShaderResourceView(buffer, &desc, handle);
|
||||
}
|
||||
|
||||
void CreateBufferTypedUAV(ID3D12Device* device,
|
||||
D3D12_CPU_DESCRIPTOR_HANDLE handle,
|
||||
ID3D12Resource* buffer, DXGI_FORMAT format,
|
||||
uint32_t num_elements, uint64_t first_element) {
|
||||
D3D12_UNORDERED_ACCESS_VIEW_DESC desc;
|
||||
desc.Format = format;
|
||||
desc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER;
|
||||
desc.Buffer.FirstElement = first_element;
|
||||
desc.Buffer.NumElements = num_elements;
|
||||
desc.Buffer.StructureByteStride = 0;
|
||||
desc.Buffer.CounterOffsetInBytes = 0;
|
||||
desc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE;
|
||||
device->CreateUnorderedAccessView(buffer, nullptr, &desc, handle);
|
||||
}
|
||||
|
||||
} // namespace util
|
||||
} // namespace d3d12
|
||||
} // namespace ui
|
||||
|
||||
@@ -44,6 +44,23 @@ ID3D12PipelineState* CreateComputePipeline(ID3D12Device* device,
|
||||
size_t shader_size,
|
||||
ID3D12RootSignature* root_signature);
|
||||
|
||||
constexpr DXGI_FORMAT GetUintPow2DXGIFormat(uint32_t element_size_bytes_log2) {
|
||||
switch (element_size_bytes_log2) {
|
||||
case 0:
|
||||
return DXGI_FORMAT_R8_UINT;
|
||||
case 1:
|
||||
return DXGI_FORMAT_R16_UINT;
|
||||
case 2:
|
||||
return DXGI_FORMAT_R32_UINT;
|
||||
case 3:
|
||||
return DXGI_FORMAT_R32G32_UINT;
|
||||
case 4:
|
||||
return DXGI_FORMAT_R32G32B32A32_UINT;
|
||||
default:
|
||||
return DXGI_FORMAT_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
inline void FillBufferResourceDesc(D3D12_RESOURCE_DESC& desc, UINT64 size,
|
||||
D3D12_RESOURCE_FLAGS flags) {
|
||||
desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
|
||||
@@ -59,14 +76,22 @@ inline void FillBufferResourceDesc(D3D12_RESOURCE_DESC& desc, UINT64 size,
|
||||
desc.Flags = flags;
|
||||
}
|
||||
|
||||
void CreateRawBufferSRV(ID3D12Device* device,
|
||||
void CreateBufferRawSRV(ID3D12Device* device,
|
||||
D3D12_CPU_DESCRIPTOR_HANDLE handle,
|
||||
ID3D12Resource* buffer, uint32_t size,
|
||||
uint64_t offset = 0);
|
||||
void CreateRawBufferUAV(ID3D12Device* device,
|
||||
void CreateBufferRawUAV(ID3D12Device* device,
|
||||
D3D12_CPU_DESCRIPTOR_HANDLE handle,
|
||||
ID3D12Resource* buffer, uint32_t size,
|
||||
uint64_t offset = 0);
|
||||
void CreateBufferTypedSRV(ID3D12Device* device,
|
||||
D3D12_CPU_DESCRIPTOR_HANDLE handle,
|
||||
ID3D12Resource* buffer, DXGI_FORMAT format,
|
||||
uint32_t num_elements, uint64_t first_element = 0);
|
||||
void CreateBufferTypedUAV(ID3D12Device* device,
|
||||
D3D12_CPU_DESCRIPTOR_HANDLE handle,
|
||||
ID3D12Resource* buffer, DXGI_FORMAT format,
|
||||
uint32_t num_elements, uint64_t first_element = 0);
|
||||
|
||||
} // namespace util
|
||||
} // namespace d3d12
|
||||
|
||||
Reference in New Issue
Block a user