2017-10-15 21:38:09 +02:00
|
|
|
#include "d3d11_buffer.h"
|
2022-08-03 21:37:30 +02:00
|
|
|
#include "d3d11_context.h"
|
2017-10-15 21:38:09 +02:00
|
|
|
#include "d3d11_device.h"
|
|
|
|
|
2017-12-13 17:49:08 +01:00
|
|
|
#include "../dxvk/dxvk_data.h"
|
|
|
|
|
2017-10-15 21:38:09 +02:00
|
|
|
namespace dxvk {
|
|
|
|
|
|
|
|
D3D11Buffer::D3D11Buffer(
|
2017-12-14 15:59:55 +01:00
|
|
|
D3D11Device* pDevice,
|
|
|
|
const D3D11_BUFFER_DESC* pDesc)
|
2021-01-07 20:08:55 +00:00
|
|
|
: D3D11DeviceChild<ID3D11Buffer>(pDevice),
|
2018-08-05 18:24:01 +02:00
|
|
|
m_desc (*pDesc),
|
2019-04-27 19:33:47 +02:00
|
|
|
m_resource (this),
|
2019-10-05 22:42:45 +01:00
|
|
|
m_d3d10 (this) {
|
2022-08-20 17:02:49 +02:00
|
|
|
DxvkBufferCreateInfo info;
|
|
|
|
info.flags = 0;
|
2017-12-14 15:59:55 +01:00
|
|
|
info.size = pDesc->ByteWidth;
|
2017-12-28 19:05:53 +01:00
|
|
|
info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT
|
2017-12-14 15:59:55 +01:00
|
|
|
| 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;
|
|
|
|
}
|
2017-11-26 14:01:41 +01:00
|
|
|
|
2017-12-14 15:59:55 +01:00
|
|
|
if (pDesc->BindFlags & D3D11_BIND_CONSTANT_BUFFER) {
|
2019-10-30 10:58:05 +01:00
|
|
|
info.usage |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
|
2021-01-07 20:08:55 +00:00
|
|
|
info.stages |= m_parent->GetEnabledShaderStages();
|
2017-12-14 15:59:55 +01:00
|
|
|
info.access |= VK_ACCESS_UNIFORM_READ_BIT;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pDesc->BindFlags & D3D11_BIND_SHADER_RESOURCE) {
|
2020-05-12 00:23:12 +02:00
|
|
|
info.usage |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT
|
|
|
|
| VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
|
2021-01-07 20:08:55 +00:00
|
|
|
info.stages |= m_parent->GetEnabledShaderStages();
|
2017-12-14 15:59:55 +01:00
|
|
|
info.access |= VK_ACCESS_SHADER_READ_BIT;
|
|
|
|
}
|
|
|
|
|
2018-02-14 07:35:39 +02:00
|
|
|
if (pDesc->BindFlags & D3D11_BIND_STREAM_OUTPUT) {
|
2018-07-24 15:16:59 +02:00
|
|
|
info.usage |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
|
|
|
|
info.stages |= VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT;
|
|
|
|
info.access |= VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT;
|
2018-02-14 07:35:39 +02:00
|
|
|
}
|
2017-12-14 15:59:55 +01:00
|
|
|
|
|
|
|
if (pDesc->BindFlags & D3D11_BIND_UNORDERED_ACCESS) {
|
2020-05-12 00:23:12 +02:00
|
|
|
info.usage |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT
|
|
|
|
| VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
|
2021-01-07 20:08:55 +00:00
|
|
|
info.stages |= m_parent->GetEnabledShaderStages();
|
2017-12-14 15:59:55 +01:00
|
|
|
info.access |= VK_ACCESS_SHADER_READ_BIT
|
|
|
|
| VK_ACCESS_SHADER_WRITE_BIT;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pDesc->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;
|
|
|
|
}
|
2018-12-13 14:00:40 +01:00
|
|
|
|
2022-08-20 17:02:49 +02:00
|
|
|
if (pDesc->MiscFlags & D3D11_RESOURCE_MISC_TILED) {
|
|
|
|
info.flags |= VK_BUFFER_CREATE_SPARSE_BINDING_BIT
|
|
|
|
| VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT
|
|
|
|
| VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
|
|
|
|
}
|
|
|
|
|
2022-09-08 19:01:27 +02:00
|
|
|
// Set host read bit as necessary. We may internally read staging
|
|
|
|
// buffer contents even if the buffer is not marked for reading.
|
|
|
|
if (pDesc->CPUAccessFlags && pDesc->Usage != D3D11_USAGE_DYNAMIC) {
|
|
|
|
info.stages |= VK_PIPELINE_STAGE_HOST_BIT;
|
|
|
|
info.access |= VK_ACCESS_HOST_READ_BIT;
|
|
|
|
|
|
|
|
if (pDesc->CPUAccessFlags & D3D11_CPU_ACCESS_WRITE)
|
|
|
|
info.access |= VK_ACCESS_HOST_WRITE_BIT;
|
|
|
|
}
|
|
|
|
|
2022-08-20 22:04:51 +02:00
|
|
|
if (!(pDesc->MiscFlags & D3D11_RESOURCE_MISC_TILE_POOL)) {
|
|
|
|
// Create the buffer and set the entire buffer slice as mapped,
|
|
|
|
// so that we only have to update it when invalidating the buffer
|
|
|
|
m_buffer = m_parent->GetDXVKDevice()->createBuffer(info, GetMemoryFlags());
|
|
|
|
m_mapped = m_buffer->getSliceHandle();
|
2018-08-30 15:56:51 +02:00
|
|
|
|
2022-08-20 22:04:51 +02:00
|
|
|
m_mapMode = DetermineMapMode();
|
2022-02-08 23:44:23 +01:00
|
|
|
|
2022-08-20 22:04:51 +02:00
|
|
|
// For Stream Output buffers we need a counter
|
|
|
|
if (pDesc->BindFlags & D3D11_BIND_STREAM_OUTPUT)
|
|
|
|
m_soCounter = CreateSoCounterBuffer();
|
|
|
|
} else {
|
|
|
|
m_sparseAllocator = m_parent->GetDXVKDevice()->createSparsePageAllocator();
|
|
|
|
m_sparseAllocator->setCapacity(info.size / SparseMemoryPageSize);
|
|
|
|
|
|
|
|
m_mapped = DxvkBufferSliceHandle();
|
|
|
|
m_mapMode = D3D11_COMMON_BUFFER_MAP_MODE_NONE;
|
|
|
|
}
|
2017-10-15 21:38:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
D3D11Buffer::~D3D11Buffer() {
|
2019-10-26 15:46:40 +02:00
|
|
|
|
2017-10-15 21:38:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-12-12 12:50:52 +01:00
|
|
|
HRESULT STDMETHODCALLTYPE D3D11Buffer::QueryInterface(REFIID riid, void** ppvObject) {
|
2019-02-10 07:01:01 +00:00
|
|
|
if (ppvObject == nullptr)
|
|
|
|
return E_POINTER;
|
|
|
|
|
2018-04-02 12:52:02 +02:00
|
|
|
*ppvObject = nullptr;
|
|
|
|
|
|
|
|
if (riid == __uuidof(IUnknown)
|
|
|
|
|| riid == __uuidof(ID3D11DeviceChild)
|
|
|
|
|| riid == __uuidof(ID3D11Resource)
|
|
|
|
|| riid == __uuidof(ID3D11Buffer)) {
|
|
|
|
*ppvObject = ref(this);
|
|
|
|
return S_OK;
|
|
|
|
}
|
2017-10-15 21:38:09 +02:00
|
|
|
|
2018-08-11 19:28:30 +02:00
|
|
|
if (riid == __uuidof(ID3D10DeviceChild)
|
|
|
|
|| riid == __uuidof(ID3D10Resource)
|
|
|
|
|| riid == __uuidof(ID3D10Buffer)) {
|
|
|
|
*ppvObject = ref(&m_d3d10);
|
|
|
|
return S_OK;
|
|
|
|
}
|
2019-04-27 19:33:47 +02:00
|
|
|
|
2019-05-01 01:50:50 +02:00
|
|
|
if (riid == __uuidof(IDXGIObject)
|
|
|
|
|| riid == __uuidof(IDXGIDeviceSubObject)
|
|
|
|
|| riid == __uuidof(IDXGIResource)
|
2019-04-27 19:33:47 +02:00
|
|
|
|| riid == __uuidof(IDXGIResource1)) {
|
|
|
|
*ppvObject = ref(&m_resource);
|
|
|
|
return S_OK;
|
|
|
|
}
|
2018-08-11 19:28:30 +02:00
|
|
|
|
2017-10-15 21:38:09 +02:00
|
|
|
Logger::warn("D3D11Buffer::QueryInterface: Unknown interface query");
|
2018-03-12 14:05:43 +03:00
|
|
|
Logger::warn(str::format(riid));
|
2017-10-15 21:38:09 +02:00
|
|
|
return E_NOINTERFACE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-12-12 12:50:52 +01:00
|
|
|
UINT STDMETHODCALLTYPE D3D11Buffer::GetEvictionPriority() {
|
2017-12-14 15:59:55 +01:00
|
|
|
return DXGI_RESOURCE_PRIORITY_NORMAL;
|
2017-12-07 13:31:32 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-12-12 12:50:52 +01:00
|
|
|
void STDMETHODCALLTYPE D3D11Buffer::SetEvictionPriority(UINT EvictionPriority) {
|
2019-01-12 15:22:34 +01:00
|
|
|
static bool s_errorShown = false;
|
|
|
|
|
|
|
|
if (!std::exchange(s_errorShown, true))
|
|
|
|
Logger::warn("D3D11Buffer::SetEvictionPriority: Stub");
|
2017-12-07 13:31:32 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-12-12 12:50:52 +01:00
|
|
|
void STDMETHODCALLTYPE D3D11Buffer::GetType(D3D11_RESOURCE_DIMENSION* pResourceDimension) {
|
2017-10-15 21:38:09 +02:00
|
|
|
*pResourceDimension = D3D11_RESOURCE_DIMENSION_BUFFER;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-12-12 12:50:52 +01:00
|
|
|
void STDMETHODCALLTYPE D3D11Buffer::GetDesc(D3D11_BUFFER_DESC* pDesc) {
|
2017-10-15 21:38:09 +02:00
|
|
|
*pDesc = m_desc;
|
|
|
|
}
|
|
|
|
|
2017-12-07 14:03:15 +01:00
|
|
|
|
2018-08-09 22:04:03 +02:00
|
|
|
bool D3D11Buffer::CheckViewCompatibility(
|
|
|
|
UINT BindFlags,
|
|
|
|
DXGI_FORMAT Format) const {
|
|
|
|
// Check whether the given bind flags are supported
|
2020-03-08 01:27:33 +01:00
|
|
|
if ((m_desc.BindFlags & BindFlags) != BindFlags)
|
2018-08-09 22:04:03 +02:00
|
|
|
return false;
|
|
|
|
|
2018-08-10 02:39:35 +02:00
|
|
|
// Structured buffer views use no format
|
|
|
|
if (Format == DXGI_FORMAT_UNKNOWN)
|
|
|
|
return (m_desc.MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED) != 0;
|
|
|
|
|
2018-08-09 23:37:41 +02:00
|
|
|
// Check whether the given combination of buffer view
|
|
|
|
// type and view format is supported by the device
|
2021-01-07 20:08:55 +00:00
|
|
|
DXGI_VK_FORMAT_INFO viewFormat = m_parent->LookupFormat(Format, DXGI_VK_FORMAT_MODE_ANY);
|
2022-08-17 14:09:50 +02:00
|
|
|
VkFormatFeatureFlags2 features = GetBufferFormatFeatures(BindFlags);
|
2018-08-09 23:37:41 +02:00
|
|
|
|
|
|
|
return CheckFormatFeatureSupport(viewFormat.Format, features);
|
2018-08-09 22:04:03 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-09-05 07:44:17 +02:00
|
|
|
HRESULT D3D11Buffer::NormalizeBufferProperties(D3D11_BUFFER_DESC* pDesc) {
|
2019-07-21 20:47:42 +02:00
|
|
|
// Zero-sized buffers are illegal
|
2022-08-20 17:02:49 +02:00
|
|
|
if (!pDesc->ByteWidth && !(pDesc->MiscFlags & D3D11_RESOURCE_MISC_TILE_POOL))
|
2019-07-21 20:47:42 +02:00
|
|
|
return E_INVALIDARG;
|
2019-09-15 18:40:57 +02:00
|
|
|
|
2019-10-11 17:24:25 +02:00
|
|
|
// Constant buffer size must be a multiple of 16
|
|
|
|
if ((pDesc->BindFlags & D3D11_BIND_CONSTANT_BUFFER)
|
|
|
|
&& (pDesc->ByteWidth & 0xF))
|
|
|
|
return E_INVALIDARG;
|
2019-07-21 20:47:42 +02:00
|
|
|
|
2019-06-13 03:06:11 +02:00
|
|
|
// Basic validation for structured buffers
|
|
|
|
if ((pDesc->MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED)
|
2019-10-11 17:24:25 +02:00
|
|
|
&& ((pDesc->MiscFlags & D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS)
|
|
|
|
|| (pDesc->StructureByteStride == 0)
|
2019-06-13 03:06:11 +02:00
|
|
|
|| (pDesc->StructureByteStride & 0x3)))
|
|
|
|
return E_INVALIDARG;
|
2019-10-11 17:24:25 +02:00
|
|
|
|
|
|
|
// Basic validation for raw buffers
|
|
|
|
if ((pDesc->MiscFlags & D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS)
|
|
|
|
&& (!(pDesc->BindFlags & (D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS))))
|
|
|
|
return E_INVALIDARG;
|
2019-06-13 03:06:11 +02:00
|
|
|
|
|
|
|
// Mip generation obviously doesn't work for buffers
|
|
|
|
if (pDesc->MiscFlags & D3D11_RESOURCE_MISC_GENERATE_MIPS)
|
|
|
|
return E_INVALIDARG;
|
2022-08-20 17:02:49 +02:00
|
|
|
|
|
|
|
// Basic validation for tiled buffers
|
|
|
|
if (pDesc->MiscFlags & D3D11_RESOURCE_MISC_TILED) {
|
|
|
|
if ((pDesc->MiscFlags & D3D11_RESOURCE_MISC_TILE_POOL)
|
|
|
|
|| (pDesc->Usage != D3D11_USAGE_DEFAULT)
|
2022-09-05 07:44:17 +02:00
|
|
|
|| (pDesc->CPUAccessFlags))
|
2022-08-20 17:02:49 +02:00
|
|
|
return E_INVALIDARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Basic validation for tile pools
|
|
|
|
if (pDesc->MiscFlags & D3D11_RESOURCE_MISC_TILE_POOL) {
|
|
|
|
if ((pDesc->MiscFlags & ~D3D11_RESOURCE_MISC_TILE_POOL)
|
|
|
|
|| (pDesc->ByteWidth % SparseMemoryPageSize)
|
|
|
|
|| (pDesc->Usage != D3D11_USAGE_DEFAULT)
|
|
|
|
|| (pDesc->BindFlags)
|
2022-09-05 07:44:17 +02:00
|
|
|
|| (pDesc->CPUAccessFlags))
|
2022-08-20 17:02:49 +02:00
|
|
|
return E_INVALIDARG;
|
|
|
|
}
|
|
|
|
|
2019-10-11 17:24:25 +02:00
|
|
|
if (!(pDesc->MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED))
|
|
|
|
pDesc->StructureByteStride = 0;
|
|
|
|
|
2019-06-13 03:06:11 +02:00
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-08-09 23:37:41 +02:00
|
|
|
BOOL D3D11Buffer::CheckFormatFeatureSupport(
|
|
|
|
VkFormat Format,
|
2022-08-17 14:09:50 +02:00
|
|
|
VkFormatFeatureFlags2 Features) const {
|
|
|
|
DxvkFormatFeatures support = m_parent->GetDXVKDevice()->getFormatFeatures(Format);
|
|
|
|
return (support.buffer & Features) == Features;
|
2018-08-09 23:37:41 +02:00
|
|
|
}
|
2019-09-17 17:21:10 +02:00
|
|
|
|
|
|
|
|
|
|
|
VkMemoryPropertyFlags D3D11Buffer::GetMemoryFlags() const {
|
|
|
|
VkMemoryPropertyFlags memoryFlags = 0;
|
2022-08-20 17:02:49 +02:00
|
|
|
|
|
|
|
if (m_desc.MiscFlags & (D3D11_RESOURCE_MISC_TILE_POOL | D3D11_RESOURCE_MISC_TILED))
|
|
|
|
return VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
|
|
|
|
|
2019-09-17 17:21:10 +02:00
|
|
|
switch (m_desc.Usage) {
|
|
|
|
case D3D11_USAGE_IMMUTABLE:
|
|
|
|
memoryFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case D3D11_USAGE_DEFAULT:
|
|
|
|
memoryFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
|
|
|
|
|
2019-09-17 17:25:09 +02:00
|
|
|
if ((m_desc.BindFlags & D3D11_BIND_CONSTANT_BUFFER) || m_desc.CPUAccessFlags) {
|
2019-09-17 17:21:10 +02:00
|
|
|
memoryFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
|
|
|
|
| VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
|
|
|
|
}
|
2019-09-17 17:25:09 +02:00
|
|
|
|
|
|
|
if (m_desc.CPUAccessFlags & D3D11_CPU_ACCESS_READ) {
|
|
|
|
memoryFlags |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
|
|
|
|
memoryFlags &= ~VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
|
|
|
|
}
|
2019-09-17 17:21:10 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case D3D11_USAGE_DYNAMIC:
|
|
|
|
memoryFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
|
|
|
|
| VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
|
|
|
|
|
|
|
|
if (m_desc.BindFlags)
|
|
|
|
memoryFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_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;
|
|
|
|
}
|
|
|
|
|
2022-02-28 22:44:10 +01:00
|
|
|
bool useCached = (m_parent->GetOptions()->cachedDynamicResources == ~0u)
|
|
|
|
|| (m_parent->GetOptions()->cachedDynamicResources & m_desc.BindFlags);
|
|
|
|
|
|
|
|
if ((memoryFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) && useCached) {
|
2019-10-26 22:56:47 +02:00
|
|
|
memoryFlags |= VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
|
|
|
|
| VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
|
|
|
|
}
|
|
|
|
|
2019-09-17 17:21:10 +02:00
|
|
|
return memoryFlags;
|
|
|
|
}
|
2019-10-26 15:46:40 +02:00
|
|
|
|
|
|
|
|
|
|
|
Rc<DxvkBuffer> D3D11Buffer::CreateSoCounterBuffer() {
|
2021-01-07 20:08:55 +00:00
|
|
|
Rc<DxvkDevice> device = m_parent->GetDXVKDevice();
|
2019-10-26 15:46:40 +02:00
|
|
|
|
|
|
|
DxvkBufferCreateInfo info;
|
|
|
|
info.size = sizeof(D3D11SOCounter);
|
|
|
|
info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT
|
|
|
|
| VK_BUFFER_USAGE_TRANSFER_SRC_BIT
|
|
|
|
| VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT
|
|
|
|
| VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
|
|
|
|
info.stages = VK_PIPELINE_STAGE_TRANSFER_BIT
|
|
|
|
| VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
|
|
|
|
| VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT;
|
|
|
|
info.access = VK_ACCESS_TRANSFER_READ_BIT
|
|
|
|
| VK_ACCESS_TRANSFER_WRITE_BIT
|
|
|
|
| VK_ACCESS_INDIRECT_COMMAND_READ_BIT
|
|
|
|
| VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT
|
|
|
|
| VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT;
|
|
|
|
return device->createBuffer(info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
|
|
|
}
|
2022-02-08 23:44:23 +01:00
|
|
|
|
|
|
|
|
|
|
|
D3D11_COMMON_BUFFER_MAP_MODE D3D11Buffer::DetermineMapMode() {
|
|
|
|
return (m_buffer->memFlags() & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
|
|
|
|
? D3D11_COMMON_BUFFER_MAP_MODE_DIRECT
|
|
|
|
: D3D11_COMMON_BUFFER_MAP_MODE_NONE;
|
|
|
|
}
|
2017-12-07 14:03:15 +01:00
|
|
|
|
2018-08-05 18:29:29 +02:00
|
|
|
|
|
|
|
D3D11Buffer* GetCommonBuffer(ID3D11Resource* pResource) {
|
|
|
|
D3D11_RESOURCE_DIMENSION dimension = D3D11_RESOURCE_DIMENSION_UNKNOWN;
|
|
|
|
pResource->GetType(&dimension);
|
|
|
|
|
|
|
|
return dimension == D3D11_RESOURCE_DIMENSION_BUFFER
|
|
|
|
? static_cast<D3D11Buffer*>(pResource)
|
|
|
|
: nullptr;
|
|
|
|
}
|
|
|
|
|
2017-10-15 21:38:09 +02:00
|
|
|
}
|