From 5bf4ae704819ecff4fbd7a228d9b609e093b2293 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 7 Dec 2017 13:17:16 +0100 Subject: [PATCH] [d3d11] Initial work on buffer creation --- src/d3d11/d3d11_buffer.cpp | 2 +- src/d3d11/d3d11_buffer.h | 4 +- src/d3d11/d3d11_device.cpp | 90 +++++++++++++++++++++++++++++++++++++- src/d3d11/d3d11_device.h | 3 ++ 4 files changed, 94 insertions(+), 5 deletions(-) diff --git a/src/d3d11/d3d11_buffer.cpp b/src/d3d11/d3d11_buffer.cpp index 6c6f8bf6..3037721d 100644 --- a/src/d3d11/d3d11_buffer.cpp +++ b/src/d3d11/d3d11_buffer.cpp @@ -5,7 +5,7 @@ namespace dxvk { D3D11Buffer::D3D11Buffer( D3D11Device* device, - IDXGIImageResourcePrivate* resource, + IDXGIBufferResourcePrivate* resource, const D3D11_BUFFER_DESC& desc) : m_device (device), m_resource(resource), diff --git a/src/d3d11/d3d11_buffer.h b/src/d3d11/d3d11_buffer.h index 18c713d2..eef869a3 100644 --- a/src/d3d11/d3d11_buffer.h +++ b/src/d3d11/d3d11_buffer.h @@ -16,7 +16,7 @@ namespace dxvk { D3D11Buffer( D3D11Device* device, - IDXGIImageResourcePrivate* resource, + IDXGIBufferResourcePrivate* resource, const D3D11_BUFFER_DESC& desc); ~D3D11Buffer(); @@ -36,7 +36,7 @@ namespace dxvk { private: D3D11Device* const m_device; - Com m_resource; + Com m_resource; D3D11_BUFFER_DESC m_desc; }; diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 68842cd3..4c7b811b 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -62,8 +62,69 @@ namespace dxvk { const D3D11_BUFFER_DESC* pDesc, const D3D11_SUBRESOURCE_DATA* pInitialData, ID3D11Buffer** ppBuffer) { - Logger::err("D3D11Device::CreateBuffer: Not implemented"); - return E_NOTIMPL; + // Gather usage information + DxvkBufferCreateInfo info; + info.size = pDesc->ByteWidth; + info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT + | VK_BUFFER_USAGE_TRANSFER_DST_BIT; + info.stages = VK_PIPELINE_STAGE_TRANSFER_BIT; + info.access = VK_ACCESS_TRANSFER_READ_BIT + | VK_ACCESS_TRANSFER_WRITE_BIT; + + if (pDesc->BindFlags & D3D11_BIND_VERTEX_BUFFER) { + info.usage |= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; + info.stages |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT; + info.access |= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT; + } + + if (pDesc->BindFlags & D3D11_BIND_INDEX_BUFFER) { + info.usage |= VK_BUFFER_USAGE_INDEX_BUFFER_BIT; + info.stages |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT; + info.access |= VK_ACCESS_INDEX_READ_BIT; + } + + if (pDesc->BindFlags & D3D11_BIND_CONSTANT_BUFFER) { + info.usage |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT; + info.stages |= enabledShaderPipelineStages; + info.access |= VK_ACCESS_SHADER_READ_BIT; + } + + if (pDesc->BindFlags & D3D11_BIND_SHADER_RESOURCE) { + info.usage |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT + | VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT; + info.stages |= enabledShaderPipelineStages; + info.access |= VK_ACCESS_SHADER_READ_BIT; + } + + if (pDesc->BindFlags & D3D11_BIND_STREAM_OUTPUT) { + Logger::err("D3D11Device::CreateBuffer: D3D11_BIND_STREAM_OUTPUT not supported"); + return E_INVALIDARG; + } + + if (pDesc->BindFlags & D3D11_BIND_UNORDERED_ACCESS) { + info.usage |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT + | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT; + info.stages |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT + | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; + info.access |= VK_ACCESS_SHADER_READ_BIT + | VK_ACCESS_SHADER_WRITE_BIT; + } + + if (info.MiscFlags & D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS) { + info.usage |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT; + info.stages |= VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT; + info.access |= VK_ACCESS_INDIRECT_COMMAND_READ_BIT; + } + + // Find the optimal memory type for the + // resource based on the usage pattern. + + + if (ppBuffer != nullptr) { + DXGICreateBufferResourcePrivate + } + + return S_OK; } @@ -737,4 +798,29 @@ namespace dxvk { } } + + VkMemoryPropertyFlags D3D11Device::GetMemoryFlagsForUsage(D3D11_USAGE usage) const { + VkMemoryPropertyFlags memoryFlags = 0; + + switch (usage) { + case D3D11_USAGE_DEFAULT: + case D3D11_USAGE_IMMUTABLE: + memoryFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; + break; + + case D3D11_USAGE_DYNAMIC: + memoryFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT + | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; + break; + + case D3D11_USAGE_STAGING: + memoryFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT + | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT + | VK_MEMORY_PROPERTY_HOST_CACHED_BIT; + break; + } + + return memoryFlags; + } + } diff --git a/src/d3d11/d3d11_device.h b/src/d3d11/d3d11_device.h index a37e9b59..d794a0fc 100644 --- a/src/d3d11/d3d11_device.h +++ b/src/d3d11/d3d11_device.h @@ -252,6 +252,9 @@ namespace dxvk { size_t BytecodeLength, ID3D11ClassLinkage* pClassLinkage); + VkMemoryPropertyFlags GetMemoryFlagsForUsage( + D3D11_USAGE usage) const; + }; }