mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
[d3d11] Fixed shader resource view creation for structured buffers
This commit is contained in:
parent
5df89fb657
commit
6283497bfa
@ -153,26 +153,40 @@ namespace dxvk {
|
|||||||
|
|
||||||
DxvkBufferViewCreateInfo viewInfo;
|
DxvkBufferViewCreateInfo viewInfo;
|
||||||
|
|
||||||
|
D3D11_BUFFEREX_SRV bufInfo;
|
||||||
|
|
||||||
if (desc.ViewDimension == D3D11_SRV_DIMENSION_BUFFEREX) {
|
if (desc.ViewDimension == D3D11_SRV_DIMENSION_BUFFEREX) {
|
||||||
// Raw or structured view. We'll represent this
|
bufInfo.FirstElement = desc.BufferEx.FirstElement;
|
||||||
// as a uniform texel buffer with UINT32 elements.
|
bufInfo.NumElements = desc.BufferEx.NumElements;
|
||||||
|
bufInfo.Flags = desc.BufferEx.Flags;
|
||||||
|
} else if (desc.ViewDimension == D3D11_SRV_DIMENSION_BUFFER) {
|
||||||
|
bufInfo.FirstElement = desc.Buffer.FirstElement;
|
||||||
|
bufInfo.NumElements = desc.Buffer.NumElements;
|
||||||
|
bufInfo.Flags = 0;
|
||||||
|
} else {
|
||||||
|
Logger::err("D3D11Device: Invalid buffer view dimension");
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bufInfo.Flags & D3D11_BUFFEREX_SRV_FLAG_RAW) {
|
||||||
|
// Raw buffer view. We'll represent this as a
|
||||||
|
// uniform texel buffer with UINT32 elements.
|
||||||
viewInfo.format = VK_FORMAT_R32_UINT;
|
viewInfo.format = VK_FORMAT_R32_UINT;
|
||||||
|
viewInfo.rangeOffset = sizeof(uint32_t) * bufInfo.FirstElement;
|
||||||
if (desc.BufferEx.Flags & D3D11_BUFFEREX_SRV_FLAG_RAW) {
|
viewInfo.rangeLength = sizeof(uint32_t) * bufInfo.NumElements;
|
||||||
viewInfo.rangeOffset = sizeof(uint32_t) * desc.BufferEx.FirstElement;
|
} else if (desc.Format == DXGI_FORMAT_UNKNOWN) {
|
||||||
viewInfo.rangeLength = sizeof(uint32_t) * desc.BufferEx.NumElements;
|
// Structured buffer view
|
||||||
} else {
|
viewInfo.format = VK_FORMAT_R32_UINT;
|
||||||
viewInfo.rangeOffset = resourceDesc.StructureByteStride * desc.BufferEx.FirstElement;
|
viewInfo.rangeOffset = resourceDesc.StructureByteStride * bufInfo.FirstElement;
|
||||||
viewInfo.rangeLength = resourceDesc.StructureByteStride * desc.BufferEx.NumElements;
|
viewInfo.rangeLength = resourceDesc.StructureByteStride * bufInfo.NumElements;
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// Typed buffer view - must use an uncompressed color format
|
// Typed buffer view - must use an uncompressed color format
|
||||||
viewInfo.format = m_dxgiAdapter->LookupFormat(
|
viewInfo.format = m_dxgiAdapter->LookupFormat(
|
||||||
desc.Format, DxgiFormatMode::Color).format;
|
desc.Format, DxgiFormatMode::Color).format;
|
||||||
|
|
||||||
const DxvkFormatInfo* formatInfo = imageFormatInfo(viewInfo.format);
|
const DxvkFormatInfo* formatInfo = imageFormatInfo(viewInfo.format);
|
||||||
viewInfo.rangeOffset = formatInfo->elementSize * desc.Buffer.FirstElement;
|
viewInfo.rangeOffset = formatInfo->elementSize * bufInfo.FirstElement;
|
||||||
viewInfo.rangeLength = formatInfo->elementSize * desc.Buffer.NumElements;
|
viewInfo.rangeLength = formatInfo->elementSize * bufInfo.NumElements;
|
||||||
|
|
||||||
if (formatInfo->flags.test(DxvkFormatFlag::BlockCompressed)) {
|
if (formatInfo->flags.test(DxvkFormatFlag::BlockCompressed)) {
|
||||||
Logger::err("D3D11Device: Compressed formats for buffer views not supported");
|
Logger::err("D3D11Device: Compressed formats for buffer views not supported");
|
||||||
@ -992,6 +1006,7 @@ namespace dxvk {
|
|||||||
HRESULT STDMETHODCALLTYPE D3D11Device::CheckFormatSupport(
|
HRESULT STDMETHODCALLTYPE D3D11Device::CheckFormatSupport(
|
||||||
DXGI_FORMAT Format,
|
DXGI_FORMAT Format,
|
||||||
UINT* pFormatSupport) {
|
UINT* pFormatSupport) {
|
||||||
|
TRACE(this, Format);
|
||||||
return GetFormatSupportFlags(Format, pFormatSupport);
|
return GetFormatSupportFlags(Format, pFormatSupport);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user