mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
[d3d11] Implemented buffer creation
This commit is contained in:
parent
5bf4ae7048
commit
be7a70a307
@ -39,6 +39,18 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
UINT D3D11Buffer::GetEvictionPriority() {
|
||||||
|
UINT EvictionPriority = DXGI_RESOURCE_PRIORITY_NORMAL;
|
||||||
|
m_resource->GetEvictionPriority(&EvictionPriority);
|
||||||
|
return EvictionPriority;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void D3D11Buffer::SetEvictionPriority(UINT EvictionPriority) {
|
||||||
|
m_resource->SetEvictionPriority(EvictionPriority);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void D3D11Buffer::GetType(D3D11_RESOURCE_DIMENSION* pResourceDimension) {
|
void D3D11Buffer::GetType(D3D11_RESOURCE_DIMENSION* pResourceDimension) {
|
||||||
*pResourceDimension = D3D11_RESOURCE_DIMENSION_BUFFER;
|
*pResourceDimension = D3D11_RESOURCE_DIMENSION_BUFFER;
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,10 @@ namespace dxvk {
|
|||||||
void GetType(
|
void GetType(
|
||||||
D3D11_RESOURCE_DIMENSION *pResourceDimension) final;
|
D3D11_RESOURCE_DIMENSION *pResourceDimension) final;
|
||||||
|
|
||||||
|
UINT GetEvictionPriority() final;
|
||||||
|
|
||||||
|
void SetEvictionPriority(UINT EvictionPriority) final;
|
||||||
|
|
||||||
void GetDesc(
|
void GetDesc(
|
||||||
D3D11_BUFFER_DESC *pDesc) final;
|
D3D11_BUFFER_DESC *pDesc) final;
|
||||||
|
|
||||||
|
@ -62,6 +62,7 @@ namespace dxvk {
|
|||||||
const D3D11_BUFFER_DESC* pDesc,
|
const D3D11_BUFFER_DESC* pDesc,
|
||||||
const D3D11_SUBRESOURCE_DATA* pInitialData,
|
const D3D11_SUBRESOURCE_DATA* pInitialData,
|
||||||
ID3D11Buffer** ppBuffer) {
|
ID3D11Buffer** ppBuffer) {
|
||||||
|
|
||||||
// Gather usage information
|
// Gather usage information
|
||||||
DxvkBufferCreateInfo info;
|
DxvkBufferCreateInfo info;
|
||||||
info.size = pDesc->ByteWidth;
|
info.size = pDesc->ByteWidth;
|
||||||
@ -85,14 +86,14 @@ namespace dxvk {
|
|||||||
|
|
||||||
if (pDesc->BindFlags & D3D11_BIND_CONSTANT_BUFFER) {
|
if (pDesc->BindFlags & D3D11_BIND_CONSTANT_BUFFER) {
|
||||||
info.usage |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
|
info.usage |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
|
||||||
info.stages |= enabledShaderPipelineStages;
|
info.stages |= GetEnabledShaderStages();
|
||||||
info.access |= VK_ACCESS_SHADER_READ_BIT;
|
info.access |= VK_ACCESS_SHADER_READ_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pDesc->BindFlags & D3D11_BIND_SHADER_RESOURCE) {
|
if (pDesc->BindFlags & D3D11_BIND_SHADER_RESOURCE) {
|
||||||
info.usage |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT
|
info.usage |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT
|
||||||
| VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
|
| VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
|
||||||
info.stages |= enabledShaderPipelineStages;
|
info.stages |= GetEnabledShaderStages();
|
||||||
info.access |= VK_ACCESS_SHADER_READ_BIT;
|
info.access |= VK_ACCESS_SHADER_READ_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,18 +111,26 @@ namespace dxvk {
|
|||||||
| VK_ACCESS_SHADER_WRITE_BIT;
|
| VK_ACCESS_SHADER_WRITE_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info.MiscFlags & D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS) {
|
if (pDesc->MiscFlags & D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS) {
|
||||||
info.usage |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
|
info.usage |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
|
||||||
info.stages |= VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT;
|
info.stages |= VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT;
|
||||||
info.access |= VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
|
info.access |= VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the optimal memory type for the
|
// Create the buffer if the application requests it
|
||||||
// resource based on the usage pattern.
|
|
||||||
|
|
||||||
|
|
||||||
if (ppBuffer != nullptr) {
|
if (ppBuffer != nullptr) {
|
||||||
DXGICreateBufferResourcePrivate
|
Com<IDXGIBufferResourcePrivate> buffer;
|
||||||
|
|
||||||
|
HRESULT hr = DXGICreateBufferResourcePrivate(
|
||||||
|
m_dxgiDevice.ptr(), &info,
|
||||||
|
GetMemoryFlagsForUsage(pDesc->Usage), 0,
|
||||||
|
&buffer);
|
||||||
|
|
||||||
|
if (FAILED(hr))
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
*ppBuffer = ref(new D3D11Buffer(
|
||||||
|
this, buffer.ptr(), *pDesc));
|
||||||
}
|
}
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
@ -799,6 +808,24 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VkPipelineStageFlags D3D11Device::GetEnabledShaderStages() const {
|
||||||
|
VkPipelineStageFlags enabledShaderPipelineStages
|
||||||
|
= VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
|
||||||
|
| VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
|
||||||
|
| VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
|
||||||
|
|
||||||
|
if (m_dxvkDevice->features().geometryShader)
|
||||||
|
enabledShaderPipelineStages |= VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT;
|
||||||
|
|
||||||
|
if (m_dxvkDevice->features().tessellationShader) {
|
||||||
|
enabledShaderPipelineStages |= VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
|
||||||
|
| VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return enabledShaderPipelineStages;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
VkMemoryPropertyFlags D3D11Device::GetMemoryFlagsForUsage(D3D11_USAGE usage) const {
|
VkMemoryPropertyFlags D3D11Device::GetMemoryFlagsForUsage(D3D11_USAGE usage) const {
|
||||||
VkMemoryPropertyFlags memoryFlags = 0;
|
VkMemoryPropertyFlags memoryFlags = 0;
|
||||||
|
|
||||||
|
@ -252,6 +252,8 @@ namespace dxvk {
|
|||||||
size_t BytecodeLength,
|
size_t BytecodeLength,
|
||||||
ID3D11ClassLinkage* pClassLinkage);
|
ID3D11ClassLinkage* pClassLinkage);
|
||||||
|
|
||||||
|
VkPipelineStageFlags GetEnabledShaderStages() const;
|
||||||
|
|
||||||
VkMemoryPropertyFlags GetMemoryFlagsForUsage(
|
VkMemoryPropertyFlags GetMemoryFlagsForUsage(
|
||||||
D3D11_USAGE usage) const;
|
D3D11_USAGE usage) const;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user