1
0
mirror of https://github.com/EduApps-CDG/OpenDX synced 2024-12-30 09:45:37 +01:00

[d3d11] Pass image format family to the backend

This commit is contained in:
Philip Rebohle 2018-07-03 12:44:56 +02:00
parent 9b78738d2c
commit cbf4772973
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 45 additions and 24 deletions

View File

@ -1719,6 +1719,13 @@ namespace dxvk {
} }
DXGI_VK_FORMAT_FAMILY D3D11Device::LookupFamily(
DXGI_FORMAT Format,
DXGI_VK_FORMAT_MODE Mode) const {
return m_dxgiAdapter->LookupFormatFamily(Format, Mode);
}
DxvkBufferSlice D3D11Device::AllocateCounterSlice() { DxvkBufferSlice D3D11Device::AllocateCounterSlice() {
std::lock_guard<std::mutex> lock(m_counterMutex); std::lock_guard<std::mutex> lock(m_counterMutex);

View File

@ -327,6 +327,10 @@ namespace dxvk {
DXGI_FORMAT Format, DXGI_FORMAT Format,
DXGI_VK_FORMAT_MODE Mode) const; DXGI_VK_FORMAT_MODE Mode) const;
DXGI_VK_FORMAT_FAMILY LookupFamily(
DXGI_FORMAT Format,
DXGI_VK_FORMAT_MODE Mode) const;
bool TestOption(D3D11Option Option) const { bool TestOption(D3D11Option Option) const {
return m_d3d11Options.test(Option); return m_d3d11Options.test(Option);
} }

View File

@ -8,34 +8,44 @@ namespace dxvk {
const D3D11_COMMON_TEXTURE_DESC* pDesc, const D3D11_COMMON_TEXTURE_DESC* pDesc,
D3D11_RESOURCE_DIMENSION Dimension) D3D11_RESOURCE_DIMENSION Dimension)
: m_device(pDevice), m_desc(*pDesc) { : m_device(pDevice), m_desc(*pDesc) {
DXGI_VK_FORMAT_MODE formatMode = GetFormatMode(); DXGI_VK_FORMAT_MODE formatMode = GetFormatMode();
DXGI_VK_FORMAT_INFO formatInfo = m_device->LookupFormat(m_desc.Format, formatMode); DXGI_VK_FORMAT_INFO formatInfo = m_device->LookupFormat(m_desc.Format, formatMode);
DXGI_VK_FORMAT_FAMILY formatFamily = m_device->LookupFamily(m_desc.Format, formatMode);
DxvkImageCreateInfo imageInfo; DxvkImageCreateInfo imageInfo;
imageInfo.type = GetImageTypeFromResourceDim(Dimension); imageInfo.type = GetImageTypeFromResourceDim(Dimension);
imageInfo.format = formatInfo.Format; imageInfo.format = formatInfo.Format;
imageInfo.flags = 0; imageInfo.flags = 0;
imageInfo.sampleCount = VK_SAMPLE_COUNT_1_BIT; imageInfo.sampleCount = VK_SAMPLE_COUNT_1_BIT;
imageInfo.extent.width = m_desc.Width; imageInfo.extent.width = m_desc.Width;
imageInfo.extent.height = m_desc.Height; imageInfo.extent.height = m_desc.Height;
imageInfo.extent.depth = m_desc.Depth; imageInfo.extent.depth = m_desc.Depth;
imageInfo.numLayers = m_desc.ArraySize; imageInfo.numLayers = m_desc.ArraySize;
imageInfo.mipLevels = m_desc.MipLevels; imageInfo.mipLevels = m_desc.MipLevels;
imageInfo.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT imageInfo.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT
| VK_IMAGE_USAGE_TRANSFER_DST_BIT; | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
imageInfo.stages = VK_PIPELINE_STAGE_TRANSFER_BIT; imageInfo.stages = VK_PIPELINE_STAGE_TRANSFER_BIT;
imageInfo.access = VK_ACCESS_TRANSFER_READ_BIT imageInfo.access = VK_ACCESS_TRANSFER_READ_BIT
| VK_ACCESS_TRANSFER_WRITE_BIT; | VK_ACCESS_TRANSFER_WRITE_BIT;
imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL; imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
imageInfo.layout = VK_IMAGE_LAYOUT_GENERAL; imageInfo.layout = VK_IMAGE_LAYOUT_GENERAL;
imageInfo.viewFormatCount = formatFamily.FormatCount;
imageInfo.viewFormats = formatFamily.Formats;
DecodeSampleCount(m_desc.SampleDesc.Count, &imageInfo.sampleCount); DecodeSampleCount(m_desc.SampleDesc.Count, &imageInfo.sampleCount);
// Typeless formats need the MUTABLE_FORMAT_BIT to be set // The image must be marked as mutable if it can be
// since they can be reinterpreted. We'll always set this // reinterpreted by a view with a different format
// for UAV images for integer clear operations to work. bool mutableFormat = formatFamily.FormatCount > 1;
bool mutableFormat = (formatInfo.Aspect == 0)
|| (m_desc.BindFlags & D3D11_BIND_UNORDERED_ACCESS); // For UAVs, the format restrictions are more relaxed.
// FIXME for typed formats, we should just add the
// corresponding integer format to the format family
if (m_desc.BindFlags & D3D11_BIND_UNORDERED_ACCESS) {
imageInfo.viewFormatCount = 0;
imageInfo.viewFormats = nullptr;
mutableFormat = true;
}
// Depth-stencil formats are not compatible to each other. // Depth-stencil formats are not compatible to each other.
VkImageAspectFlags formatAspect = imageFormatInfo(formatInfo.Format)->aspectMask; VkImageAspectFlags formatAspect = imageFormatInfo(formatInfo.Format)->aspectMask;